<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn"><generator uri="https://gohugo.io/" version="0.147.7">Hugo</generator><title type="html">有呀</title><link href="https://nuoea.com/atom.xml" rel="self" type="application/rss+xml" title="atom"/><link href="https://nuoea.com/" rel="alternate" type="text/html" title="html"/><link href="https://nuoea.com/index.json" rel="alternate" type="application/json" title="json"/><updated>2026-07-07T04:03:54+00:00</updated><id>https://nuoea.com/atom.xml</id><entry><title type="html">骑士活塞G4：冠军之心的觉醒</title><link href="https://nuoea.com/cavaliers-pistons-g4-champions-heart/" rel="alternate" type="text/html"/><id>https://nuoea.com/cavaliers-pistons-g4-champions-heart/</id><published>2026-05-12T21:37:14+08:00</published><updated>2026-05-12T21:37:14+08:00</updated><content type="html"><![CDATA[<p>北京时间5月12日，克利夫兰骑士在主场以112-103力克底特律活塞，将系列赛总比分顽强扳成2-2平。这一战，骑士队展现出的不只是比分上的追赶，更是一支冠军级别球队在绝境中完成的气质蜕变。</p>
<h2 id="从悬崖边缘到天王山一场荡气回肠的逆转">从悬崖边缘到天王山：一场荡气回肠的逆转</h2>
<p>系列赛1-2落后，骑士被逼到了悬崖边上。速贷球馆的球迷憋着一口气，他们知道如果再输一场，赛点将拱手让给活塞。</p>
<p>比赛的进程跌宕起伏：开局阶段，哈登连续命中三记三分，率领球队轰出16-5的攻击波；然而首节中段，骑士突然哑火，活塞的勒维尔和哈里斯联手打出一波19-5，反超了比分。上半场结束时，米切尔8投1中仅得4分，整个克利夫兰的心都悬了起来。</p>
<p>但真正的转折发生在第三节。当活塞陷入得分荒时，骑士掀起了一波<strong>24-0的超级攻击波</strong>，米切尔在这一节独得21分，追平了骑士队史季后赛单节得分纪录。整个活塞替补席在长达一分半钟内鸦雀无声，没有人站起来。</p>
<p>米切尔全场轰下<strong>43分</strong>，其中下半场39分——这是队史季后赛半场得分纪录。当一个球员能在上半场8投1中后完成如此疯狂的自我救赎，这支球队的精神内核已经完全不同了。</p>
<h2 id="骑士的季后赛进化从单核到双核驱动">骑士的季后赛进化：从单核到双核驱动</h2>
<p>这支骑士队的季后赛进化，体现在三个层面：</p>
<p><strong>第一，战术体系的成熟。</strong>
本赛季最大的改变是确立了&quot;<strong>组织核心+终极攻坚</strong>&ldquo;的双保险模式。詹姆斯·哈登转型为全能组织核心，凭借顶级赛场视野与节奏掌控力，彻底解放了米切尔的进攻火力。当对手试图通过包夹米切尔来瓦解骑士进攻时，哈登总能及时出球，让对手顾此失彼。</p>
<p><strong>第二，内线双塔的统治力。</strong>
莫布里与阿伦这对内线组合，在G4中联手贡献了关键的护框和篮板保护。活塞在内线进攻效率大幅下降，18次失误中的许多都来自骑士内线的压迫性防守。抢七大战中阿伦轰下22分19篮板的表现，证明了这套双塔体系的硬度和持久性。</p>
<p><strong>第三，关键时刻的自我调整能力。</strong>
抢七上半场失误高达13次，下半场锐减到仅4次；G4从落后追到领先并扩大分差——这种**&ldquo;落后不放弃、关键战能调整&rdquo;**的特质，是一支冠军球队的标配。</p>
<h2 id="詹姆斯哈登36岁的冠军之心">詹姆斯·哈登：36岁的冠军之心</h2>
<p>说到骑士的进化，必须单独谈谈詹姆斯·哈登。</p>
<p>36岁的老将在这场G4中贡献了<strong>24分11助攻4抢断</strong>的完美表现，+11的正负值全场最高。他不仅在开局用三记三分点燃全队，更用精准的控场和关键时刻的决策，让骑士的进攻始终保持高效运转。</p>
<p>更令人震撼的是，哈登正式解锁了NBA季后赛**&ldquo;4000分+1000篮板+1000助攻&rdquo;**的历史级成就，与迈克尔·乔丹、科比·布莱恩特和勒布朗·詹姆斯并肩。这意味着他不仅是一位得分手，更是一位能够在季后赛舞台上用全面能力影响比赛的传奇。</p>
<p>在防守端，他的4次抢断让季后赛生涯总抢断数超越基德，升至<strong>历史第7位</strong>。36岁高龄仍在攻防两端统治比赛——这就是冠军之心。</p>
<h2 id="天王山前瞻">天王山前瞻</h2>
<p>2-2的比分让这轮系列赛彻底进入白热化阶段。活塞拥有常规赛东部第一的战绩和强大的阵容深度，坎宁安、哈里斯、勒维尔都能在关键时刻挺身而出。但骑士展现出的韧性、双核驱动的战术威力、以及哈登带来的冠军基因，让这轮系列赛充满悬念。</p>
<p>天王山之战，将是这两支球队真正实力的终极检验。</p>
<hr>
<p><em>骑士112-103活塞，系列赛2-2平。米切尔43分，哈登24分11助攻4抢断。双方将于北京时间5月14日移师活塞主场，展开天王山之战。</em></p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/nba" term="nba" label="NBA"/><category scheme="https://nuoea.com/tags/%E9%AA%91%E5%A3%AB" term="%E9%AA%91%E5%A3%AB" label="骑士"/><category scheme="https://nuoea.com/tags/%E5%AD%A3%E5%90%8E%E8%B5%9B" term="%E5%AD%A3%E5%90%8E%E8%B5%9B" label="季后赛"/></entry><entry><title type="html">最近入手的几台心头好</title><link href="https://nuoea.com/new-film-camera/" rel="alternate" type="text/html"/><id>https://nuoea.com/new-film-camera/</id><published>2024-12-21T17:50:49+08:00</published><updated>2024-12-21T17:50:49+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>自从上次青岛之旅使用了胶片相机，被老婆点名表扬之后，就一发不可收拾的进入了胶片这个文艺复兴的大坑。拍摄胶片带给我的直观感受就是：</p>
<blockquote>
<p>你无需理会参数，也不用去想后期。只管上卷按快门，剩下的交给胶片。</p></blockquote>
<p>这真的是一种非常神奇的拍摄体验。在数码化泛滥的今天，人们似乎又开始怀念那种带有温暖感觉的所谓胶片感。也开始从拍摄胶片中去寻找一种久违的轻松愉悦的拍摄体验。</p>
<p>下面就说说最近新入手的几台胶片相机。</p>
<h2 id="奥林巴斯-pen-eed">奥林巴斯 PEN-EED</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/21/20241221174937-2.jpg" alt="PEN-EED"  /></p>
<p>个人感觉是奥林巴斯整个PEN系列中，颜值最高的一台。这也是主要的入手理由。当然除了长得好看之外，个人最看重的就是：它是一台半格胶片机。</p>
<blockquote>
<p>所谓半格胶片机，就是可以将一张胶片一分为二，一卷36张的胶片，可以拍摄72张。</p></blockquote>
<p>在胶卷价格涨到飞起的当下，半格相机无疑是一个非常好的选择，省钱嘛，一卷就可以拍好久。但是这台PEN-EED有一个对于初学者不太友好的问题，就是它是一台估焦的相机。对于新手而言，它没有所谓对焦系统，因为配备了一颗32mm f1.7的定焦镜头，所以对焦这件事，只能交给拍摄者对于自己和被拍摄者之间距离的把控，简单来说，就是交给感觉。</p>
<p>而且这台相机的快门速度只有1/15秒，算是一台标准的阳光机。好在它足够好看，也足够轻便，就算不用来拍摄，作为一个拍摄中的道具，也可以算是物尽其用了。</p>
<h2 id="奥林巴斯-pen-f">奥林巴斯 PEN-F</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/21/20241221174937.jpg" alt="PEN-F"  /></p>
<p>在奥林巴斯的整个PEN系列中，PEN-F算是最最最经典的一台。由于它拥有完整的机械单反相机结构，又使用了半格的拍摄规格，所以它也因此有了半格之王的称号。个人感觉这台相机标志着奥林巴斯这个品牌，最杰出的制造工艺和水准了。</p>
<p>全金属的机身，哪怕是过去50多年，握在手里依然感觉非常精致。这台相机最了不起的一点就是，在那个年代奥林巴斯就已经将完整的单反结构塞进了这么小小的一个机器中，所以这台也算是整个相机史上一个里程碑一样的存在了。</p>
<h2 id="尼康-f2">尼康 F2</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/21/20241221174937-1.jpg" alt="F2"  /></p>
<p>尼康对于我来说，一直是白月光一样的存在。从最初的D90，到后来的D7200，再到后面的Z62，Zf。我的每一台尼康，都是我在当时最喜欢带出门的相机。只有用过别的品牌的相机，才知道尼康有多好。</p>
<p>许多人认为，尼康 Nikon F2 就是有史以来最好的纯机械相机，虽然可能它的技术并不是最先进的，但就综合工艺、质量、可靠性、耐用性上来说，他就是最好的。F2的机械相机王者地位难以动摇。相信没有一个男孩子可以抵抗这种纯机械的快乐。</p>
<p>入手它还有一个最吸引我的点，就是尼康为它搭配了非常丰富的配件世界。其中就有我非常心水的DW-1腰平取景器。</p>
<blockquote>
<p>没有拍过腰平的人，永远感受不到世界真真切切在你眼前定格的浪漫。</p></blockquote>
<p>腰平的快乐，我相信每一个拍摄胶片的人都体会过。虽然它的这腰平颗取景器没有其他中画幅、大画幅相机那么大，但是那么大的纯光学取景器，还是带给我深深的震撼，以及完全不同的拍摄体验。</p>
<h2 id="最后">最后</h2>
<p>胶片值得，虽然它又麻烦、又烧钱，但是拍摄胶片给了我完全不同的拍摄体验。不单单是迷人的色彩和机械的结构。我会用更多时间来思考我真正想记录的画面的真实模样。正如有人说：</p>
<blockquote>
<p>审美实际上是对过程的审视。</p></blockquote>
<p>当你每一次上卷、每一次过片，每一次按下快门，每一次经历漫长过程后拿到成片。每一次拍摄胶片的过程，都是一趟有趣的旅程。</p>
<p>所以，去拍胶片把。</p>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E8%83%B6%E7%89%87" term="%E8%83%B6%E7%89%87" label="胶片"/><category scheme="https://nuoea.com/tags/%E7%9B%B8%E6%9C%BA" term="%E7%9B%B8%E6%9C%BA" label="相机"/></entry><entry><title type="html">组了一台 QNAS Mini</title><link href="https://nuoea.com/hi-qnas-mini/" rel="alternate" type="text/html"/><id>https://nuoea.com/hi-qnas-mini/</id><published>2024-12-12T10:54:14+08:00</published><updated>2024-12-12T10:54:14+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>手里的极空间已经稳定的运行了非常久了，但是随着功能的丰富，越来越多的Docker容器，性能慢慢跟不上了。所以就想着自己组一个小的全闪的NAS，自己组的好处在于，一个是性能可以得到保障，再一个就是降低一些预算，毕竟成品的NAS价格居高不下，就算是主打性价比的产品，比自己组装还是要贵了不少。</p>
<h2 id="硬件">硬件</h2>
<p>得益于汪汪队射手大佬开源的 <code>QNAS MINI</code> 方案。完美的满足了我的全部需求：</p>
<ul>
<li>足够精致好看的设计；</li>
<li>足够多的解决方案；</li>
<li>八盘位的扩展性；</li>
<li>小巧静音；</li>
</ul>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/11/20241211225727.JPG" alt="QNAS MINI"  /></p>
<p>外壳是3D打印的，可以根据自己的审美，选择自己喜欢的配色方案，如果自己没有3D打印机，闲鱼上也有提供代打的服务，材质可以选择 <code>PETG</code> 或者 <code>ABS</code> 。这里更建议选择耐高温的 <code>ABS</code> 材质。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/12/20241212132858.jpg" alt=""  /></p>
<p>芯片部分，选择了 <code>畅网 P5</code> 的解决方案，也就是 <code>N100</code> 这颗处理器。当然针对这台机箱也有一些其他的方案，比如说：4105、5105等，可以根据自己的预算进行选择。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/12/20241212134920.jpg" alt=""  /></p>
<p>值得一提的是，不同的CPU需要对机箱的尺寸进行相应的调整，<code>QNAS MINI</code> 的原型机是针对<code>畅网P2</code> ，也就是4105这颗CPU设计发布的，而 <code>畅网 P5</code> 发布后，为了满足 <code>N100</code> 的散热需求，网友在原型机的基础上，增加了高度，已达到增加风扇，加强散热的效果。</p>
<p>以下就是完整的的配件清单：</p>
<table>
  <thead>
      <tr>
          <th>名称</th>
          <th>价格</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>QNAS MINI 机箱</td>
          <td>120</td>
      </tr>
      <tr>
          <td>QNAS MINI 机箱背板</td>
          <td>195</td>
      </tr>
      <tr>
          <td>畅网 P5 N100主板</td>
          <td>675</td>
      </tr>
      <tr>
          <td>DDR5 16G 内存条</td>
          <td>300</td>
      </tr>
      <tr>
          <td>NVME 转 6 SATA 扩展卡</td>
          <td>65</td>
      </tr>
      <tr>
          <td>1TB 2.5寸固态硬盘</td>
          <td>598</td>
      </tr>
      <tr>
          <td>机箱风扇 x 2</td>
          <td>30</td>
      </tr>
  </tbody>
</table>
<h2 id="软件">软件</h2>
<p>玩NAS的朋友都知道，一台NAS好不好用，其关键就在于软件部分。群晖的溢价那么高，还有那么多人买，其核心就是群晖的系统足够好用。除此之外，近年来，很多国产NAS的系统也取得了令人满意的成绩，比如：极空间、绿联等厂商。</p>
<p>但这些NAS系统都有一个弊端，那就是闭源。只有购买该厂商的硬件才能够使用，那有没有既好用，又开源的NAS操作系统呢。飞牛私有云给了我们一个答案。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/12/20241212132001.jpg" alt="fnos"  /></p>
<p>飞牛私有云是一群NAS骨灰级玩家团队倾心打造的NAS操作系统。除了上手简单，影视刮削、照片备份、多端应用等常用功能的完成度都非常高。而且团队目前还提供了免费的内网穿透服务，这对于没有公网IP的同学来说，真的太友好。</p>
<p>除此之外，飞牛私有云提供的Docker服务，是我在所有NAS操作系统中体验最好的。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2024/12/12/20241212123159.jpg" alt=""  /></p>
<p>整个界面非常直观，不单单是提供了 <code>Docker</code> 容器的管理，还提供了 <code>Docker Compose</code> 的管理界面。而且镜像仓库不需要任何设置就可以正常的拉取镜像，且速度极快。相信玩 <code>Docker</code> 的朋友都知道这里面水有多深。</p>
<p>截止到今天，整个飞牛私有云的功能还在不断地完善，上个版本才更新了文件外链分享等功能。而这才是一个上线不到半年的产品。相信随着时间，飞牛私有云会给所有玩家更加好的NAS体验。</p>
<h2 id="最后">最后</h2>
<p>都说中年男人有三宝，路由器、私有云（NAS）、充电宝。这虽然是网络上的一个梗，但NAS作为家庭数据存储以及家庭媒体中心，目前看，还是有着不可或缺的因素。如果你正好也想要自己组装一台NAS，希望这个方案能够帮助到你。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/qnas" term="qnas" label="QNAS"/><category scheme="https://nuoea.com/tags/%E9%A3%9E%E7%89%9B%E7%A7%81%E6%9C%89%E4%BA%91" term="%E9%A3%9E%E7%89%9B%E7%A7%81%E6%9C%89%E4%BA%91" label="飞牛私有云"/></entry><entry><title type="html">部署轻量友链朋友圈</title><link href="https://nuoea.com/friend-circle-lite/" rel="alternate" type="text/html"/><id>https://nuoea.com/friend-circle-lite/</id><published>2024-12-11T20:17:21+08:00</published><updated>2024-12-11T20:17:21+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>这两天突然发现，之前使用极简模式部署好的友链朋友圈没法获取到数据了。看了Github仓库才知道原项目已经停止支持了，取而代之的就是这个轻量友链朋友圈。</p>
<p>不知道是不是因为这个项目是为了 <code>hexo</code> 打造的原因，项目看了很久，愣是没看明白。直到把详细文档研究了一通，才大概明白了运行的原理。</p>
<p>其实严格来讲，该项目主要分为三个步骤：</p>
<ul>
<li>获取朋友圈JSON</li>
<li>配置 Github Action</li>
<li>拿到朋友圈文章列表JSON</li>
</ul>
<h2 id="获取朋友圈json">获取朋友圈JSON</h2>
<p>顾名思义，该步骤通过以下代码，将指定页面上的友链信息，直接转换成为一个 <code>friend.json</code> 。</p>
<p>原代码如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">YML</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;yamljs&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">fs</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;fs&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">friends</span> <span style="color:#f92672">=</span> [],
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">data_f</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">YML</span>.<span style="color:#a6e22e">parse</span>(<span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">readFileSync</span>(<span style="color:#e6db74">&#39;source/_data/link.yml&#39;</span>).<span style="color:#a6e22e">toString</span>().<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/(?&lt;=rss:)\s*\n/g</span>, <span style="color:#e6db74">&#39; &#34;&#34;\n&#39;</span>));
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">data_f</span>.<span style="color:#a6e22e">forEach</span>((<span style="color:#a6e22e">entry</span>, <span style="color:#a6e22e">index</span>) =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">lastIndex</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">index</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">lastIndex</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">filteredLinkList</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">entry</span>.<span style="color:#a6e22e">link_list</span>.<span style="color:#a6e22e">filter</span>(<span style="color:#a6e22e">linkItem</span> =&gt; <span style="color:#f92672">!</span><span style="color:#a6e22e">blacklist</span>.<span style="color:#a6e22e">includes</span>(<span style="color:#a6e22e">linkItem</span>.<span style="color:#a6e22e">name</span>));
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">friends</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">friends</span>.<span style="color:#a6e22e">concat</span>(<span style="color:#a6e22e">filteredLinkList</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 根据规定的格式构建 JSON 数据
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">friendData</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">friends</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">friends</span>.<span style="color:#a6e22e">map</span>(<span style="color:#a6e22e">item</span> =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> [<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">name</span>, <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">link</span>, <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">avatar</span>];
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 将 JSON 对象转换为字符串
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">friendJSON</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">friendData</span>, <span style="color:#66d9ef">null</span>, <span style="color:#ae81ff">2</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 写入 friend.json 文件
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">writeFileSync</span>(<span style="color:#e6db74">&#39;./source/friend.json&#39;</span>, <span style="color:#a6e22e">friendJSON</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;friend.json 文件已生成。&#39;</span>);
</span></span></code></pre></div><p>比较遗憾的是，该代码仅适用于 <code>HEXO</code> 博客程序，如果想要用在<code>HUGO</code>中，需要做如下修改：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JavaScript" data-lang="JavaScript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">cheerio</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;cheerio&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">fs</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;fs&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">path</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#39;path&#39;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 获取项目根目录的路径
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">projectRoot</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">process</span>.<span style="color:#a6e22e">cwd</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 读取 HTML 文件内容
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">htmlFilePath</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">join</span>(<span style="color:#a6e22e">projectRoot</span>, <span style="color:#e6db74">&#39;public&#39;</span>, <span style="color:#e6db74">&#39;links&#39;</span>, <span style="color:#e6db74">&#39;index.html&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">htmlContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">readFileSync</span>(<span style="color:#a6e22e">htmlFilePath</span>).<span style="color:#a6e22e">toString</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 使用 cheerio 解析 HTML
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">$</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">cheerio</span>.<span style="color:#a6e22e">load</span>(<span style="color:#a6e22e">htmlContent</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 创建一个空的 friends 数组
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">friends</span> <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 假设在 HTML 中每个好友信息存储在 &lt;div class=&#34;friend-item&#34;&gt; 中，
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 并且每个条目包含 &lt;a class=&#34;username&#34;&gt;、&lt;img class=&#34;avatar&#34;&gt; 和 &lt;a class=&#34;link&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;.friend-item&#39;</span>).<span style="color:#a6e22e">each</span>((<span style="color:#a6e22e">index</span>, <span style="color:#a6e22e">element</span>) =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">username</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">$</span>(<span style="color:#a6e22e">element</span>).<span style="color:#a6e22e">find</span>(<span style="color:#e6db74">&#39;.username&#39;</span>).<span style="color:#a6e22e">text</span>().<span style="color:#a6e22e">trim</span>();  <span style="color:#75715e">// 提取用户名
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">link</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">$</span>(<span style="color:#a6e22e">element</span>).<span style="color:#a6e22e">find</span>(<span style="color:#e6db74">&#39;.link&#39;</span>).<span style="color:#a6e22e">attr</span>(<span style="color:#e6db74">&#39;href&#39;</span>);  <span style="color:#75715e">// 提取链接
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">avatar</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">$</span>(<span style="color:#a6e22e">element</span>).<span style="color:#a6e22e">find</span>(<span style="color:#e6db74">&#39;.avatar&#39;</span>).<span style="color:#a6e22e">attr</span>(<span style="color:#e6db74">&#39;src&#39;</span>);  <span style="color:#75715e">// 提取头像
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// 如果都存在，添加到 friends 数组
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">username</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">link</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">avatar</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">friends</span>.<span style="color:#a6e22e">push</span>({
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">username</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">link</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">link</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">avatar</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">avatar</span>
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 根据规定的格式构建 JSON 数据
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">friendData</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">friends</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">friends</span>.<span style="color:#a6e22e">map</span>(<span style="color:#a6e22e">item</span> =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> [<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">name</span>, <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">link</span>, <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">avatar</span>];
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 将 JSON 对象转换为字符串
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">friendJSON</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">friendData</span>, <span style="color:#66d9ef">null</span>, <span style="color:#ae81ff">2</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 写入 friend.json 文件到根目录
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fs</span>.<span style="color:#a6e22e">writeFileSync</span>(<span style="color:#a6e22e">path</span>.<span style="color:#a6e22e">join</span>(<span style="color:#a6e22e">__dirname</span>, <span style="color:#e6db74">&#39;friend.json&#39;</span>), <span style="color:#a6e22e">friendJSON</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;friend.json 文件已生成。&#39;</span>);
</span></span></code></pre></div><p>将该代码文件保存在根目录Link.js文件中。运行：</p>
<pre tabindex="0"><code>node link.js
</code></pre><p>就可以得到 <code>friend.json</code> 文件。</p>
<p>需要注意的是，这里需要用到 <code>cheerio</code> 解析 HTML。所以在运行前，需要：</p>
<pre tabindex="0"><code>npm install cheerio
</code></pre><p>以下就是JSON格式文件示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JSON" data-lang="JSON"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;friends&#34;</span>: [
</span></span><span style="display:flex;"><span>    [
</span></span><span style="display:flex;"><span>	    <span style="color:#e6db74">&#34;林木木&#34;</span>,
</span></span><span style="display:flex;"><span>	    <span style="color:#e6db74">&#34;https://immmmm.com&#34;</span>,
</span></span><span style="display:flex;"><span>	    <span style="color:#e6db74">&#34;https://cravatar.cn/avatar/ba83fa02fc4b2ba621514941307e21be.jpeg?s=400&#34;</span>
</span></span><span style="display:flex;"><span>    ],
</span></span><span style="display:flex;"><span>    [
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;山卜方&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;https://novcu.com&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;https://cravatar.cn/avatar/6ebab96f3131621c51c08370d3c996f0.jpeg?s=400&#34;</span>
</span></span><span style="display:flex;"><span>    ],
</span></span><span style="display:flex;"><span>    [
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#34;大大的小蜗牛&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;https://eallion.com&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;https://cravatar.cn/avatar/171e4c30959e8c077a6c58b958624b31.jpeg?s=400&#34;</span>
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">}</span> 
</span></span></code></pre></div><h2 id="配置-github-action">配置 Github Action</h2>
<p>在 fork 了仓库：<a href="https://github.com/willow-god/Friend-Circle-Lite">Friend-Circle-Lite</a> 之后，只需要修改仓库中的 <code>config.yaml</code> 文件</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-YAML" data-lang="YAML"><span style="display:flex;"><span><span style="color:#f92672">spider_settings</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">enable</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">json_url</span>: <span style="color:#e6db74">&#34;https://&lt;你的地址&gt;/friend.json&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">article_count</span>: <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">merge_result</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">enable</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">merge_json_url</span>: <span style="color:#e6db74">&#34;&lt;你的地址&gt;&#34;</span>
</span></span></code></pre></div><p>如果需要邮件推送功能的，跟随官方文档完成相应配置即可。</p>
<h2 id="拿到朋友圈文章列表json">拿到朋友圈文章列表JSON</h2>
<p>在完成所有配置后，就可以手动或者自动的运行 <code>Github Action</code> ，该Action就会根据我们提供的 <code>friend.json</code> 拿到友链中所有朋友更新的文章啦。最后会在page分支中，生成一个 <code>all.json</code> ，通过调用这个文件，就可以做前端渲染了。</p>
<p>大功告成。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E6%9C%8B%E5%8F%8B%E5%9C%88" term="%E6%9C%8B%E5%8F%8B%E5%9C%88" label="朋友圈"/><category scheme="https://nuoea.com/tags/%E8%BF%9E%E6%8E%A5" term="%E8%BF%9E%E6%8E%A5" label="连接"/></entry><entry><title type="html">给Memos页面增加编辑、归档及删除功能</title><link href="https://nuoea.com/memos-add-edit-and-archive/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-add-edit-and-archive/</id><published>2023-07-19T14:44:15+08:00</published><updated>2023-07-19T14:44:15+08:00</updated><content type="html"><![CDATA[<h2 id="更新">更新</h2>
<ul>
<li>2023-07-19 新增删除功能；</li>
</ul>
<h2 id="前言">前言</h2>
<p>书接上回，继续完善<code>Memos</code>页面。这次给页面增加<code>编辑</code>和<code>归档</code>功能，让我们的<code>Memos</code>页面使用起来更加的方便。</p>
<h2 id="说明">说明</h2>
<p>值得一提的是，两个功能都需要Memos发布框的支持。还没有折腾的同学看这里：<a href="https://nuoea.com/add-memos-editor/"> Memos页面添加发布框 </a></p>
<h2 id="编辑">编辑</h2>
<ul>
<li>首先，给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;edit-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;editMemo(&#39;+JSON.stringify(data[i]).replace(/&#34;</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">g</span><span style="color:#960050;background-color:#1e0010">,</span> <span style="color:#960050;background-color:#1e0010">&#39;&amp;</span><span style="color:#a6e22e">quot</span><span style="color:#960050;background-color:#1e0010">;&#39;)+&#39;)&#34;</span>&gt;编辑&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">editMemo</span>(<span style="color:#a6e22e">e</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">content</span>,<span style="color:#a6e22e">memoId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">id</span>,<span style="color:#a6e22e">memoRelationList</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">relationList</span>,<span style="color:#a6e22e">memoResourceList</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">resourceList</span>,<span style="color:#a6e22e">memoVisibility</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">visibility</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>),
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;show&#34;</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>});
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">editMemoBtn</span>.<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#34;click&#34;</span>, <span style="color:#66d9ef">function</span> () {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoResourceList</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">parse</span>(window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-resource-list&#34;</span>)) <span style="color:#f92672">?</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">parse</span>(window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-resource-list&#34;</span>)) <span style="color:#f92672">:</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">resourceList</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoVisibility</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosVisibilitySelect</span>.<span style="color:#a6e22e">value</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">TAG_REG</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">/(?&lt;=#)([^#\s!.,;:?&#34;&#39;()]+)(?= )/g</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">memosTag</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>.<span style="color:#a6e22e">match</span>(<span style="color:#a6e22e">TAG_REG</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">hasContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">!==</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">hasContent</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoBody</span> <span style="color:#f92672">=</span> {<span style="color:#a6e22e">content</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoContent</span>,<span style="color:#a6e22e">id</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoId</span>,<span style="color:#a6e22e">relationList</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoRelationList</span>,<span style="color:#a6e22e">resourceList</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoResourceList</span>,<span style="color:#a6e22e">visibility</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoVisibility</span>}
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;PATCH&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">memoBody</span>),
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">memosTag</span> <span style="color:#f92672">!==</span> <span style="color:#66d9ef">null</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">memoTagUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/api/v1/tag?openId=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>            (<span style="color:#66d9ef">async</span> () =&gt; {
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">for</span> <span style="color:#66d9ef">await</span> (<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">i</span> <span style="color:#66d9ef">of</span> <span style="color:#a6e22e">memosTag</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">response</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoTagUrl</span>, {
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;POST&#39;</span>,
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>                  },
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>({
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">i</span>
</span></span><span style="display:flex;"><span>                  })
</span></span><span style="display:flex;"><span>                });
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>            })();
</span></span><span style="display:flex;"><span>          }
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">&#39;保存成功&#39;</span>,
</span></span><span style="display:flex;"><span>          ()=&gt;{
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>          })
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      })
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">cancelEditBtn</span>.<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#34;click&#34;</span>, <span style="color:#66d9ef">function</span> () {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">contains</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>)) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;inherit&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>})
</span></span></code></pre></div><h2 id="归档">归档</h2>
<ul>
<li>首先，还是给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;archive-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;archiveMemo(\&#39;&#39;+data[i].id+&#39;\&#39;)&#34;</span>&gt;归档&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">archiveMemo</span>(<span style="color:#a6e22e">memoId</span>) { <span style="color:#75715e">//获取Memos的ID值
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>); <span style="color:#75715e">//登录信息
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">memoId</span>){ <span style="color:#75715e">//判断是否登录以及获取到Memos的ID值
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoBody</span> <span style="color:#f92672">=</span> {<span style="color:#a6e22e">id</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoId</span>,<span style="color:#a6e22e">rowStatus</span><span style="color:#f92672">:</span><span style="color:#e6db74">&#34;ARCHIVED&#34;</span>};
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;PATCH&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">memoBody</span>),
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;归档成功&#39;</span>,
</span></span><span style="display:flex;"><span>        ()=&gt;{
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="删除">删除</h2>
<ul>
<li>首先，还是给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;delete-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;deleteMemo(\&#39;&#39;+data[i].id+&#39;\&#39;)&#34;</span>&gt;删除&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">deleteMemo</span>(<span style="color:#a6e22e">memoId</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">memoId</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;DELETE&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;删除成功&#39;</span>,
</span></span><span style="display:flex;"><span>        ()=&gt;{
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#66d9ef">catch</span>(<span style="color:#a6e22e">err</span> =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#39;出错了，再检查一下吧&#39;</span>)
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/></entry><entry><title type="html">开始连接，给Memos页面增加转发功能</title><link href="https://nuoea.com/memos-link-owner/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-link-owner/</id><published>2023-07-06T20:30:23+08:00</published><updated>2023-07-06T20:30:23+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>其实这个想法来自于 <a href="https://dongjunke.cn/">@小饿</a> 同学。在Memos页面拥有了发布框之后，我也一直在想，除了方便快捷之外，怎么可以让发布框更好用。转发功能的概念，让我眼前一亮。</p>
<blockquote>
<p>小饿： 转发功能，其实就是复制好友说说再评论，就更加接近微博了，信息连接效率会指数级提升。</p></blockquote>
<p>Memos诞生很长时间以来，很多人都是当个笔记应用，记录生活。后来因为[@林木木] 开始折腾。有了各种API，开始出现单独的Memos页面，也有了浏览器插件，各种手机APP。生态圈一下子就建立起来了。再到后来，木木兄为Memos开发了广场页面，尽可能多的将大家的信息聚合起来，自此，Memos开启了社交时代。</p>
<p>木木的<a href="https://immmmm.com/bbs/">「广场」</a>页面，其实已经非常趋近于微博。发布框加上后，功能已经非常完整了。所以当你拥有了一个Memos广场页面，并且加上了发布框。这个转发的功能，也可以折腾起来了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688646868.jpg" alt=""  /></p>
<h2 id="部署">部署</h2>
<ul>
<li>首先，给你的每一条Memos 增加一个转发按钮，并绑定一个点击事件。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;transPond(&#39;+JSON.stringify(memosForm)+&#39;)&#34;</span>&gt;&lt;/<span style="color:#f92672">a</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，定义转发的内容。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">memosForm</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">creatorName</span><span style="color:#f92672">:</span><span style="color:#a6e22e">creatorName</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">content</span><span style="color:#f92672">:</span><span style="color:#a6e22e">transData</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">url</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memosLink</span>
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><ul>
<li>再然后，需要找到你页面中的发布框以及当前登录信息。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-path&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosTextarea</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.memos-editor-textarea&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosVisibilitySelect</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.select-memos-value&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">submitMemoBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.submit-memos-btn&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">editMemoDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.edit-memos&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">editMemoBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.edit-memos-btn&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">cancelEditBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.cancel-edit-btn&#34;</span>);
</span></span></code></pre></div><ul>
<li>最后，给发布框中，添加转发内容。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">transRes</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;[@&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;](&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;) \n\n&gt; &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;: &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">transRes</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>})
</span></span></code></pre></div><p>完整点击事件代码如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#75715e">//转发
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">transPond</span>(<span style="color:#a6e22e">a</span>){
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosTextarea</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.memos-editor-textarea&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;show&#34;</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">transRes</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;[@&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;](&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;) \n\n&gt; &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;: &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">transRes</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>})
</span></span><span style="display:flex;"><span>  }<span style="color:#66d9ef">else</span>{
</span></span><span style="display:flex;"><span>    window.<span style="color:#a6e22e">open</span>(<span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span>);<span style="color:#75715e">//如果没登录，则不转发直接跳转。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="最后">最后</h2>
<p>效果如下：</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688649915.jpg" alt=""  /></p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688649318.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/></entry><entry><title type="html">给Memos页面添加发布框</title><link href="https://nuoea.com/add-memos-editor/" rel="alternate" type="text/html"/><id>https://nuoea.com/add-memos-editor/</id><published>2023-07-01T21:39:02+08:00</published><updated>2023-07-01T21:39:02+08:00</updated><content type="html"><![CDATA[<h2 id="起因">起因</h2>
<p>最开始是看到 <code>@林木木</code> 发的一条哔哔。说是想要在Memos页面内嵌入哔哔单页，从而可以实现在一个页面内发布哔哔以及浏览哔哔。寻思这样一来，体验确实是可以好很多，不需要切来切去，更有沉浸感。</p>
<h2 id="部署代码">部署代码</h2>
<ul>
<li>HTML</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;memos&#34;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><ul>
<li>CSS</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span>.<span style="color:#a6e22e">load-memos-editor</span>{<span style="color:#66d9ef">position</span>:<span style="color:#66d9ef">fixed</span>;<span style="color:#66d9ef">right</span>:<span style="color:#ae81ff">1</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">bottom</span>:<span style="color:#ae81ff">1</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#ae81ff">#ebeced</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-body</span>{<span style="color:#66d9ef">display</span>:<span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">border-radius</span>:<span style="color:#ae81ff">.33</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>light<span style="color:#f92672">-</span>background<span style="color:#f92672">-</span>secondary);<span style="color:#66d9ef">flex-direction</span>:<span style="color:#66d9ef">column</span>}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">dark</span> .<span style="color:#a6e22e">memos-editor-body</span> {<span style="color:#66d9ef">background-color</span>: <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>dark<span style="color:#f92672">-</span>background<span style="color:#f92672">-</span>secondary);}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-content</span><span style="color:#f92672">,</span>.<span style="color:#a6e22e">memos-editor-footer</span><span style="color:#f92672">,</span>.<span style="color:#a6e22e">memos-editor-option</span>{<span style="color:#66d9ef">display</span>: <span style="color:#66d9ef">flex</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-content</span> .<span style="color:#a6e22e">memos-editor-inputer</span>{<span style="color:#66d9ef">overflow-x</span>:<span style="color:#66d9ef">hidden</span>;<span style="color:#66d9ef">overflow-y</span>:<span style="color:#66d9ef">clip</span>;<span style="color:#66d9ef">padding</span>:<span style="color:#ae81ff">0</span>;<span style="color:#66d9ef">width</span>:<span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>;<span style="color:#66d9ef">max-height</span>:<span style="color:#ae81ff">160</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">outline</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">px</span> <span style="color:#66d9ef">solid</span> <span style="color:#66d9ef">transparent</span>;<span style="color:#66d9ef">outline-offset</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#66d9ef">transparent</span>;<span style="color:#66d9ef">white-space</span>:<span style="color:#66d9ef">pre-wrap</span>;<span style="color:#66d9ef">line-height</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">resize</span>:<span style="color:#66d9ef">none</span>;<span style="color:#66d9ef">overflow-wrap</span>:anywhere;<span style="color:#66d9ef">word-break</span>:<span style="color:#66d9ef">normal</span>}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span>{<span style="color:#66d9ef">display</span>: <span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">flex-direction</span>: <span style="color:#66d9ef">column</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">action-btn</span> {<span style="color:#66d9ef">padding</span>: <span style="color:#ae81ff">.25</span><span style="color:#66d9ef">rem</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag-list</span> {<span style="color:#66d9ef">display</span>:<span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">flex-wrap</span>:<span style="color:#66d9ef">wrap</span>;<span style="color:#66d9ef">align-items</span>:<span style="color:#66d9ef">center</span>;<span style="color:#66d9ef">line-height</span>:<span style="color:#ae81ff">2</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag</span> {<span style="color:#66d9ef">position</span>:<span style="color:#66d9ef">relative</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag</span> <span style="color:#f92672">a</span> {<span style="color:#66d9ef">flex</span>:<span style="color:#ae81ff">1</span>}
</span></span></code></pre></div><ul>
<li>JS</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#f92672">&lt;</span><span style="color:#a6e22e">script</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosData</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">dom</span><span style="color:#f92672">:</span><span style="color:#e6db74">&#39;#memos&#39;</span>,
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;</span><span style="color:#960050;background-color:#1e0010">/script&gt;</span>
</span></span></code></pre></div><ul>
<li>页面布局</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/css/grid.css">grid.css</a></p></blockquote>
<ul>
<li>字体图标</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/css/iconfont.css">iconfont.css</a></p></blockquote>
<ul>
<li>Javascript</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/js/memos-editor.js">memos-editor.js</a></p></blockquote>
<ul>
<li>消息提醒弹窗</li>
</ul>
<pre tabindex="0"><code>https://github.com/TheWindRises-2/coco-message
</code></pre><ul>
<li>Animate.css</li>
</ul>
<pre tabindex="0"><code>https://animate.style/
</code></pre><h2 id="使用说明">使用说明</h2>
<ul>
<li>填入 <code>Memos Open API</code> ，格式如下：</li>
</ul>
<pre tabindex="0"><code>https://memos.example.com/api/memo?openId=&lt;Memos Open API&gt;
</code></pre><ul>
<li>开始哔哔吧</li>
</ul>
<h2 id="在线围观">在线围观</h2>
<p>围观地址：https://nuoea.com/memos</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/06/30/1688138493.jpg" alt=""  /></p>
<h2 id="致谢">致谢</h2>
<ul>
<li><a href="https://immmmm.com/chrome-extensions-memos-bber/">Memos 单页及浏览器扩展：：木木木木木</a></li>
<li><a href="https://immmmm.com/memos-api-description/">Memos API 非官方不完全说明：：木木木木木</a></li>
</ul>
<h2 id="更新日志">更新日志</h2>
<ul>
<li><strong>2023-07-01</strong> 正式上线</li>
<li><strong>2023-07-02</strong> 新增：上传图片</li>
<li><strong>2023-07-02</strong> 修复：API地址多出<code>/</code>导致“Memos Open API 有误，请重新输入!”的问题</li>
<li><strong>2023-07-03</strong> 新增：随机回顾一条 Memos</li>
<li><strong>2023-07-04</strong> 新增：切换当前 Memos Open API</li>
<li><strong>2023-07-09</strong> 新增：光标自动定位（感谢 <a href="https://koobai.com/">@空白生活</a> ）</li>
<li><strong>2023-07-09</strong> 修复：随机Memos中最多只能显示1个标签的问题（感谢 <a href="https://koobai.com/">@空白生活</a> ）</li>
<li><strong>2023-07-18</strong> 新增：适配 <code>0.14.0</code> 版本API</li>
<li><strong>2023-07-19</strong> 新增：资源库图片删除</li>
<li><strong>2023-07-19</strong> 新增：编辑按钮</li>
<li><strong>2023-07-19</strong> 修复：无法新增TAG标签的问题</li>
</ul>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">所谓尼康战歌</title><link href="https://nuoea.com/nikon-battle-song/" rel="alternate" type="text/html"/><id>https://nuoea.com/nikon-battle-song/</id><published>2023-06-26T21:01:44+08:00</published><updated>2023-06-26T21:01:44+08:00</updated><content type="html"><![CDATA[<h2 id="尼康">尼康</h2>
<p>尼康（Nikon），是日本的一家著名相机制造商，成立于1917年，当时名为日本光学工业株式会社。1988年该公司依托其照相机品牌，更名为尼康株式会社。该品牌相机每年宣传片都会使用同一首歌作为背景音乐，而这首歌被尼康品牌粉丝们称为是尼康战歌，迅速形成一个梗爆红网络。</p>
<p>每次看Links的视频，每次当那首<code>Welcome Home, Son</code>的旋律响起，都会热血沸腾，随之想起使用尼康相机拍摄的那些瞬间。摄影是记录美好的事情，而音乐同样是。</p>
<h2 id="关于">关于</h2>
<p><code>Welcome Home, Son</code> 作为尼康101周年广告歌，自由的旋律加上吟唱的唱腔，配合上打击乐及和声，一下子就让人仿佛置身于广阔的世界中，去欣赏、记录这个世界的美好。所以每次听到这首歌，我都会想起Links说的那句：</p>
<blockquote>
<p>无论你手上用的是哪一台相机，我都由衷的建议你走出去，去看看这个美丽的世界，欣赏久未凝视过的日出和日落，还有城市里难能一见的满天星辰，灿烂星河，按下快门，去拍下你眼中看到的曼妙风景，去记录你所在乎的人和事。只有这样，相机的参数才被赋予了真正的意义。</p></blockquote>
<p>一起欣赏吧。</p>
<link rel="stylesheet" href="https://nuoea.com/css/aplay.css"><meting-js auto="https://music.163.com/song?id=1395957507" theme="#448aff"></meting-js><script type="text/javascript" src="https://nuoea.com/js/aplayer.min.js"></script>

<script type="text/javascript" src="https://nuoea.com/js/meting.min.js"></script>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E5%B0%BC%E5%BA%B7" term="%E5%B0%BC%E5%BA%B7" label="尼康"/><category scheme="https://nuoea.com/tags/%E9%9F%B3%E4%B9%90" term="%E9%9F%B3%E4%B9%90" label="音乐"/></entry><entry><title type="html">富士直出日系治愈色调</title><link href="https://nuoea.com/fujifilm-nc-hideaki-hamada/" rel="alternate" type="text/html"/><id>https://nuoea.com/fujifilm-nc-hideaki-hamada/</id><published>2023-06-22T13:35:51+08:00</published><updated>2023-06-22T13:35:51+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>一直很喜欢滨田英明的色调，之前用尼康的时候，后期也用<code>Lightroom</code>尝试着去调出滨田英明的照片中那种温暖治愈的感觉。但是每次出去旅行，回来后面对成百上千张照片做后期，光是想想就头大了。自从看到富士的机内直出效果之后，忽然就发现，这不就是我一直想要的相机么。</p>
<p>于是把尼康灭门，在XT5发售的时候，原价购入了XT5套机。玩了大半年，每次用到这套滤镜，都忍不住惊叹，这直出色彩也太赞了吧，于是想跟大伙分享一下这款滤镜。</p>
<h2 id="滤镜">滤镜</h2>
<p>这款滤镜主要模拟的是<code>Fuji NC（Natural Color）</code>胶片的色彩效果。NC胶片是富士胶片公司推出的一种自然色彩胶片，它的特点是色彩饱和度适中，色调自然，适合拍摄风景、人像等各种主题。NC滤镜模拟的胶片色彩效果，可以使得照片看起来更加真实，呈现出自然、柔和的色调。在使用这个滤镜的时候，需要注意以下几点：</p>
<ul>
<li>需要非常好的光线，如果室内光线不好，需要注意补光；</li>
<li>增加曝光1-2档；</li>
<li>尽量保证画面的干净；</li>
</ul>
<h2 id="参数">参数</h2>
<p>核心是白平衡，我选用色温<code>5200k</code>这个固定值，这样做的好处是，既可以如实表达各种色彩，也可以让天空的颜色统一。以下是详细参数：</p>
<table>
  <thead>
      <tr>
          <th>名称</th>
          <th>参数</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>胶片模拟</td>
          <td>classic negative</td>
      </tr>
      <tr>
          <td>颗粒效果</td>
          <td>关</td>
      </tr>
      <tr>
          <td>色彩效果</td>
          <td>强</td>
      </tr>
      <tr>
          <td>彩色FX蓝色</td>
          <td>强</td>
      </tr>
      <tr>
          <td>白平衡</td>
          <td>5200K</td>
      </tr>
      <tr>
          <td>白平衡偏移</td>
          <td>R：-5 B：3</td>
      </tr>
      <tr>
          <td>动态范围</td>
          <td>DR400</td>
      </tr>
      <tr>
          <td>色调曲线</td>
          <td>H：-1.5 S：+0.5</td>
      </tr>
      <tr>
          <td>色彩</td>
          <td>+1</td>
      </tr>
      <tr>
          <td>税度</td>
          <td>+1</td>
      </tr>
      <tr>
          <td>高ISO降噪</td>
          <td>0</td>
      </tr>
      <tr>
          <td>清晰度</td>
          <td>0</td>
      </tr>
  </tbody>
</table>
<h2 id="最后">最后</h2>
<p>真的是随手拍都很好看。</p>
<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/06/22/1687414834.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/06/22/1687414830.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/06/22/1687414827.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/06/22/1687414927.jpg" />
    </div>
  </div>
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E5%AF%8C%E5%A3%AB" term="%E5%AF%8C%E5%A3%AB" label="富士"/><category scheme="https://nuoea.com/tags/%E8%83%B6%E7%89%87" term="%E8%83%B6%E7%89%87" label="胶片"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">使用 Umami Api 实现点赞统计</title><link href="https://nuoea.com/use-umami-like/" rel="alternate" type="text/html"/><id>https://nuoea.com/use-umami-like/</id><published>2023-06-14T22:11:46+08:00</published><updated>2023-06-14T22:11:46+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>在写完上篇<a href="https://nuoea.com/use-umami-api">《使用 Umami Api 显示统计数据》</a>之后，越发的觉得Umami非常有意思。于是就继续看了看官方API，一番了解下来之后，发现通过 <code>Track events</code> 可以实现自定义的页面事件统计。灵光一闪，觉得可以用这玩意做个点赞统计。</p>
<h2 id="使用">使用</h2>
<p>使用起来非常简单，只需要在触发事件的元素中加上：</p>
<pre tabindex="0"><code>data-umami-event=&#34;{event-name}&#34;
</code></pre><p>例如：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Like-button&#34;</span> <span style="color:#a6e22e">data-umami-event</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Like button&#34;</span>&gt;点赞&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><p>当然，也可以使用 Javascript</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">button</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;Like-button&#39;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">button</span>.<span style="color:#a6e22e">onclick</span> <span style="color:#f92672">=</span> () =&gt; <span style="color:#a6e22e">umami</span>.<span style="color:#a6e22e">track</span>(<span style="color:#e6db74">&#39;Like button&#39;</span>);
</span></span></code></pre></div><p>如此一来，Umami就会统计到一个名为 <code>Like button</code> 的事件信息，并为触发次数进行统计。</p>
<h2 id="接口">接口</h2>
<p>已经有了统计的信息，下面只需要通过官方的API接口就能获取到统计的数据了。</p>
<pre tabindex="0"><code>GET /api/websites/{websiteId}/events
</code></pre><p>该接口需要5个参数，分别是：</p>
<ul>
<li>startAt: 起始时间.</li>
<li>endAt: 终止时间.</li>
<li>unit: 时间单位 (year | month | hour | day).</li>
<li>timezone: 时区 (ex. Asia/Shanghai).</li>
<li>url: 连接.</li>
</ul>
<p>请求代码如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">umiTime</span> <span style="color:#f92672">=</span> Date.<span style="color:#a6e22e">parse</span>(<span style="color:#66d9ef">new</span> Date()); <span style="color:#75715e">//获取当前时间戳
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">pathurl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">indow</span>.<span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">pathname</span>; <span style="color:#75715e">// 获取当前URL路径
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">umiUrl</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://umami.mydomain.com/api/websites/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">websiteId</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/events?startAt=0&amp;endAt=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">umiTime</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;&amp;unit=hour&amp;url=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">pathurl</span> <span style="color:#f92672">+</span><span style="color:#e6db74">&#34;&amp;timezone=Asia/Shanghai&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">umiUrl</span>,{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;GET&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">mode</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;cors&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">cache</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;default&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;Authorization&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Bearer &#39;</span> <span style="color:#f92672">+</span> <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">Token</span><span style="color:#f92672">&gt;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">json</span>()).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">resdata</span> =&gt; {});
</span></span></code></pre></div><p>请求成功后，获取到的数据如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>[
</span></span><span style="display:flex;"><span>  { <span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;Like button&#34;</span>, <span style="color:#f92672">&#34;t&#34;</span>: <span style="color:#e6db74">&#34;2023-04-12 22:00:00&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">1</span> },
</span></span><span style="display:flex;"><span>  { <span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;Like button&#34;</span>, <span style="color:#f92672">&#34;t&#34;</span>: <span style="color:#e6db74">&#34;2023-04-12 22:00:00&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">5</span> },
</span></span><span style="display:flex;"><span>  { <span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;Like button&#34;</span>, <span style="color:#f92672">&#34;t&#34;</span>: <span style="color:#e6db74">&#34;2023-04-12 23:00:00&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">4</span> },
</span></span><span style="display:flex;"><span>  { <span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;Like button&#34;</span>, <span style="color:#f92672">&#34;t&#34;</span>: <span style="color:#e6db74">&#34;2023-04-12 23:00:00&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">4</span> },
</span></span><span style="display:flex;"><span>  { <span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;Like button&#34;</span>, <span style="color:#f92672">&#34;t&#34;</span>: <span style="color:#e6db74">&#34;2023-04-13 00:00:00&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">1</span> }
</span></span><span style="display:flex;"><span>]
</span></span></code></pre></div><h2 id="最后">最后</h2>
<p>获取到的数据其实是请求的<code>Url</code>页面中，该事件以时间单位统计的一个数组，如果在参数中选择<code>unit</code>为<code>hour</code>,那么数据将会以小时为单位来分割，每小时的数据为一个对象，以此类推。而我们需要将所有的数据求和来得到我们最终的统计结果。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">groupBy</span>(<span style="color:#a6e22e">arr</span>, <span style="color:#a6e22e">by</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">arr</span>.<span style="color:#a6e22e">reduce</span>((<span style="color:#a6e22e">groups</span>, <span style="color:#a6e22e">item</span>) =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">// 获取 item 的分组的 key
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>      <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">by</span>(<span style="color:#a6e22e">item</span>);
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">// 看看这个组是不是已经存在
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">group</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">groups</span>.<span style="color:#a6e22e">find</span>(<span style="color:#a6e22e">g</span> =&gt; <span style="color:#a6e22e">g</span>.<span style="color:#a6e22e">key</span> <span style="color:#f92672">===</span> <span style="color:#a6e22e">key</span>);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span>(<span style="color:#f92672">!</span><span style="color:#a6e22e">group</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#75715e">// 不存在就创建一个新组
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>          <span style="color:#a6e22e">group</span> <span style="color:#f92672">=</span> {<span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">items</span><span style="color:#f92672">:</span> []};
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">groups</span>.<span style="color:#a6e22e">push</span>(<span style="color:#a6e22e">group</span>);
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">// item 放入组中
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>      <span style="color:#a6e22e">group</span>.<span style="color:#a6e22e">items</span>.<span style="color:#a6e22e">push</span>(<span style="color:#a6e22e">item</span>);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">groups</span>;
</span></span><span style="display:flex;"><span>  }, []);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">data</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">groupBy</span>(<span style="color:#a6e22e">res</span>, <span style="color:#a6e22e">item</span> =&gt; <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">x</span>)
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">map</span>(<span style="color:#a6e22e">g</span> =&gt; ({
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">x</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">g</span>.<span style="color:#a6e22e">key</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">t</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">g</span>.<span style="color:#a6e22e">items</span>.<span style="color:#a6e22e">map</span>(<span style="color:#a6e22e">item</span> =&gt; <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">t</span>),
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">y</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">g</span>.<span style="color:#a6e22e">items</span>.<span style="color:#a6e22e">reduce</span>((<span style="color:#a6e22e">sum</span>, <span style="color:#a6e22e">item</span>) =&gt; <span style="color:#a6e22e">sum</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">y</span>, <span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>  }));
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">data</span>);
</span></span></code></pre></div><p>以上。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/umami" term="umami" label="umami"/><category scheme="https://nuoea.com/tags/api" term="api" label="API"/></entry><entry><title type="html">极简模式部署友链朋友圈</title><link href="https://nuoea.com/hi-circle-of-friends/" rel="alternate" type="text/html"/><id>https://nuoea.com/hi-circle-of-friends/</id><published>2023-06-11T15:50:37+08:00</published><updated>2023-06-11T15:50:37+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>曾经我常常感觉到，每一个独立的博客都像是一座彼此独立的孤岛。所以现在，有了越来越多的工具，把大家连接起来，像Memos、Twikoo等等。而<code>友链朋友圈</code>也是如此。你可以随时获取朋友网站的更新内容，并了解朋友的活跃情况，以此来将大家紧密的连接起来。</p>
<h2 id="页面适配">页面适配</h2>
<p>首先，友链页的抓取是通过css选择器进行的，所以我们需要将友链页按照友链朋友圈提供的规则进行修改。如果与对应规则不匹配，可能会遇到获取文章为0、管理面板出现status code 500、start error等错误。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#ae81ff">/* 规则一（common1）：*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  avatar </span>: <span style="color:#e6db74">&#39;.cf-friends img::attr(src)&#39;</span>  <span style="color:#75715e">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  link </span>: <span style="color:#e6db74">&#39;.cf-friends a::attr(href)&#39;</span>  <span style="color:#75715e">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  name </span>: <span style="color:#e6db74">&#39;.cf-friends a::text&#39;</span>  <span style="color:#75715e">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">/* 规则二（common2）：*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  avatar </span>: <span style="color:#e6db74">&#39;img.cf-friends-avatar&#39;</span>  <span style="color:#75715e">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  link </span>: <span style="color:#e6db74">&#39;a.cf-friends-link&#39;</span>  <span style="color:#75715e">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/*  name </span>: <span style="color:#e6db74">&#39;.cf-friends-name&#39;</span>  <span style="color:#75715e">*/</span>
</span></span></code></pre></div><p>只要上述css选择器能够匹配到，就完成了适配。根据规则，你编写的友链页面的友链部分可以是这样：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span> &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;cf-friends&#34;</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt; <span style="color:#75715e">&lt;!-- 头像 --&gt;</span>
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span>&gt;xxxx的博客&lt;/<span style="color:#f92672">a</span>&gt; <span style="color:#75715e">&lt;!-- 链接 --&gt;</span>
</span></span><span style="display:flex;"><span>   &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span>&gt;xxxx的博客&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span>&gt;xxxx的博客&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt;
</span></span><span style="display:flex;"><span>     &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span>&gt;xxxx的博客&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>   &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span> &lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><p>也可以是：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>  &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;cf-friends-link&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;cf-friends-avatar&#34;</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.baidu.com&#34;</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">span</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;cf-friends-name&#34;</span>&gt; xxxx的博客&lt;/<span style="color:#f92672">span</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">a</span>&gt;
</span></span></code></pre></div><p>使用时，只需要在fc_settings.yaml配置文件中配置为common1或者common2即可。</p>
<h2 id="部署">部署</h2>
<p>友链朋友圈提供了非常多的部署方式，可以根据自己的习惯选择自己喜欢的方式部署，让我觉得十分的贴心。而我选择了极简模式。</p>
<blockquote>
<p>极简模式旨在最简程度运行程序，并输出最简化结果。</p></blockquote>
<p>在极简模式下，友链朋友圈会使用 Github Action 抓取友链页中的连接，并将连接RSS中的文章输出为一个Data.json文件存放在Github仓库中。而我们只需要调用这个文件，做前端渲染就行了。</p>
<blockquote>
<p><a href="https://hexo-circle-of-friends-doc.vercel.app/#/simplemode">极简模式部署</a></p></blockquote>
<p>如果担心 <code>data.json</code>  放在Github仓库访问不稳定，也可以通过 <code>up to aliyun oss</code> 等Github Action 将文件推送到国内的CDN上进行访问。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span>- <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Setup aliyun oss</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">manyuanrong/setup-ossutil@master</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">endpoint</span>: <span style="color:#ae81ff">oss-cn-hangzhou.aliyuncs.com</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">access-key-id</span>: <span style="color:#ae81ff">${{ secrets.ACCESS_KEY_ID }}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">access-key-secret</span>: <span style="color:#ae81ff">${{ secrets.ACCESS_KEY_SECRET }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">name</span>: <span style="color:#ae81ff">To aliyun</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">run</span>: <span style="color:#ae81ff">ossutil cp -rf data.json oss://${{ secrets.BUCKET }}/</span>
</span></span></code></pre></div><p>需要在仓库的setting&ndash;&gt;Secrets and variables&ndash;&gt;Actions&ndash;&gt;New repository secret</p>
<p>配置好Action所需要的变量。</p>
<h2 id="渲染">渲染</h2>
<p>部署成功后，应该就可以在你 <code>fork</code> 的仓库中看到 <code>data.json</code> 文件了。那么接下来，就是在前端渲染了。</p>
<p>直接上代码：</p>
<ul>
<li>HTML</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;links&#34;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><ul>
<li>JS</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">linksUrl</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;https://&lt;你的Github仓库地址&gt;/data.json&#39;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">linksDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#39;.links&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">linksDom</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">getLinks</span>()
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getLinks</span>() {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">linksUrl</span>).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">json</span>()).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">resdata</span> =&gt; {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">updateHtml</span>(<span style="color:#a6e22e">resdata</span>.<span style="color:#a6e22e">article_data</span>);
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">updateHtml</span>(<span style="color:#a6e22e">data</span>){
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">result</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">resultAll</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">author</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">author</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">avatar</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">avatar</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">title</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">title</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">link</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">link</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">floor</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">floor</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">created</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">created</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">result</span> <span style="color:#f92672">+=</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;&lt;div class=&#34;col-12 mt-3&#34;&gt;&lt;div class=&#34;item-body flex-fill p-3&#34;&gt;&lt;div class=&#34;item-header d-flex mb-3&#34;&gt;&lt;div class=&#34;item-avatar mr-3&#34; style=&#34;background-image:url(&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">avatar</span> <span style="color:#f92672">+</span><span style="color:#e6db74">&#39;)&#34;&gt;&lt;/div&gt;&lt;div class=&#34;item-sub&#34;&gt;&lt;div class=&#34;item-creator&#34;&gt;&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">author</span> <span style="color:#f92672">+</span><span style="color:#e6db74">&#39;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class =&#34;item-content d-flex flex-fill flex-column&#34;&gt;&lt;div class=&#34;item-inner flex-fill my-2&#34;&gt;&lt;a href=&#34;&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">link</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;&#34; target=&#34;_blank&#34;&gt;&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">title</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;item-footer d-flex mt-2&#34;&gt;&lt;div class=&#34;item-time item-tag d-flex align-items-center px-2 text-xs&#34;&gt;&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">created</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;&lt;/div&gt;&lt;div class=&#34;d-flex flex-fill justify-content-end&#34;&gt;&lt;div class=&#34;item d-flex align-items-center&#34;&gt;&lt;i class=&#34;iconfont iconthunderbolt&#34;&gt;&lt;/i&gt;&lt;span class=&#34;ml-1&#34;&gt;&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">floor</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#39;</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">resultAll</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">result</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">linksDom</span>.<span style="color:#a6e22e">insertAdjacentHTML</span>(<span style="color:#e6db74">&#39;beforeend&#39;</span>, <span style="color:#a6e22e">resultAll</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>其中<code>result</code> 内的HTML结构请根据主题自行修改。</p>
<p>搞定收工～</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E8%BF%9E%E6%8E%A5" term="%E8%BF%9E%E6%8E%A5" label="连接"/><category scheme="https://nuoea.com/tags/%E6%9C%8B%E5%8F%8B%E5%9C%88" term="%E6%9C%8B%E5%8F%8B%E5%9C%88" label="朋友圈"/></entry><entry><title type="html">使用 Umami Api 显示统计数据</title><link href="https://nuoea.com/use-umami-api/" rel="alternate" type="text/html"/><id>https://nuoea.com/use-umami-api/</id><published>2023-06-08T11:25:34+08:00</published><updated>2023-06-08T11:25:34+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>最近在大家的疯狂安利下，捣鼓上了这样一款可以部署在Docker上的前端统计应用。特别是木木老师，更是直接放出了<a href="https://immmmm.com/hi-umami-api/"> 《前端调用 Umami API 数据》 </a> 。不得不说，这个应用的可玩性成功的吸引了我的注意。</p>
<p>通过阅读官方的API文档，一番折腾下来，也是成功的在Memos页面中调用了umami统计的浏览数据。于是做个记录。</p>
<h2 id="认证">认证</h2>
<p>如果想要获取Umami的数据，首先需要身份鉴权。</p>
<pre tabindex="0"><code>POST https://umami.mydomain.com/api/auth/login
</code></pre><p>通过上述接口，请求到一个TOKEN。获取任何数据都需要在请求的头部带上这个TOKEN，完成身份的认证。</p>
<p>这一步我的建议是通过API在线请求调试工具去完成，像 <code>POSTMAN</code>、<code>hoppscotch</code></p>
<blockquote>
<p><a href="https://hoppscotch.io/">Hoppscotch</a></p></blockquote>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/06/08/1686197391.jpg" alt=""  /></p>
<p>如果请求成功，会返回一个JSON</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JSON" data-lang="JSON"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;token&#34;</span>: <span style="color:#e6db74">&#34;eyTMjU2IiwiY...4Q0JDLUhWxnIjoiUE_A&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;user&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;cd33a605-d785-42a1-9365-d6cad3b7befd&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;username&#34;</span>: <span style="color:#e6db74">&#34;your-username&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;createdAt&#34;</span>: <span style="color:#e6db74">&#34;2020-04-20 01:00:00&#34;</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>如此一来，就请求到了TOKEN，建议将TOKEN存入 HUGO 里面的 <code>config</code>中，方便后面调用。</p>
<pre tabindex="0"><code>[params.umami]
    url = &#39;https://umami.mydomain.com&#39;
    token = &#39;eyTMjU2IiwiY...4Q0JDLUhWxnIjoiUE_A&#39;
</code></pre><h2 id="浏览数据">浏览数据</h2>
<p>获取文章的阅读数据，可以使用下面的这个API：</p>
<pre tabindex="0"><code>GET https://umami.mydomain.com/api/websites/{websiteId}/metrics
</code></pre><p>参数如下：</p>
<ul>
<li>startAt: 起始时间</li>
<li>endAt: 终止时间</li>
<li>type: url</li>
</ul>
<p>请求代码如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">umiTime</span> <span style="color:#f92672">=</span> Date.<span style="color:#a6e22e">parse</span>(<span style="color:#66d9ef">new</span> Date()); <span style="color:#75715e">//获取当前时间戳
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">umiUrl</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://umami.mydomain.com/api/websites/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">bbMemo</span>.<span style="color:#a6e22e">umiId</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/metrics?startAt=0&amp;endAt=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">umiTime</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;&amp;type=url&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">umiUrl</span>,{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;GET&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">mode</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;cors&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">cache</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;default&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;Authorization&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Bearer &#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">umami</span>.<span style="color:#a6e22e">token</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">json</span>()).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">resdata</span> =&gt; {});
</span></span></code></pre></div><p>请求成功后，获取到的数据如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-JSON" data-lang="JSON"><span style="display:flex;"><span>[
</span></span><span style="display:flex;"><span>    {<span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;/&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">46</span>}
</span></span><span style="display:flex;"><span>    {<span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;/docs&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">17</span>}
</span></span><span style="display:flex;"><span>    {<span style="color:#f92672">&#34;x&#34;</span>: <span style="color:#e6db74">&#34;/download&#34;</span>, <span style="color:#f92672">&#34;y&#34;</span>: <span style="color:#ae81ff">14</span>}
</span></span><span style="display:flex;"><span>]
</span></span></code></pre></div><p>最后，通过遍历对比JSON中的地址与当前文章的URL地址，就可以获取到对应的浏览数据了。</p>
<h2 id="最后">最后</h2>
<p>官方的API文档里面还有非常多的接口，大家可以根据自己的需求，按照上面的方法去获取自己想要的统计数据，就酱。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/umami" term="umami" label="umami"/><category scheme="https://nuoea.com/tags/api" term="api" label="API"/></entry><entry><title type="html">Memos页面添加Twikoo评论系统</title><link href="https://nuoea.com/memos-twikoo/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-twikoo/</id><published>2023-06-05T21:56:31+08:00</published><updated>2023-06-05T21:56:31+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>如果没有木木老师的<a href="https://immmmm.com/memos-with-twikoo/">《Memos x Twikoo》</a>我是根本不会把这两个毫不相干的系统联系起来的，在给Memos添加了Twikoo评论系统之后，因为增加了社交属性，所以BB的时候，都更带劲了。</p>
<p>而美中不足的就是如果需要评论，需要跳转到Memos的页面内，这对于用户体验来说，还是略有不足的。而就在前不久，拾月老师的一篇<a href="https://www.skyue.com/23051422.html">《单页 Memos 添加 Artalk 评论，无限接近微博》</a>让评论系统嵌入Memos页面内，从而可以沉浸式边BB边吐槽，让Momos从一个记录工具成功变身微博、朋友圈，可玩性大增。只不过我看教程用的都是<code>Artalk</code>这个评论工具，作为用着<code>Twikoo</code>很顺手，并不想更换的我来说，只能自己根据大佬们提供的思路，自行折腾了。</p>
<h2 id="评论数量">评论数量</h2>
<p>关于Memos页面的搭建，直接用木木老师的就好。木木老师开发的版本，代码逻辑清晰，功能完善，开箱即用。Twikoo评论数量的实现在官网有相应API。</p>
<blockquote>
<p>批量获取文章评论数</p></blockquote>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">getCommentsCount</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;您的环境id&#39;</span>, <span style="color:#75715e">// 环境 ID
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">// region: &#39;ap-guangzhou&#39;, // 环境地域，默认为 ap-shanghai，如果您的环境地域不是上海，需传此参数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">urls</span><span style="color:#f92672">:</span> [ <span style="color:#75715e">// 不包含协议、域名、参数的文章路径列表，必传参数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#e6db74">&#39;/2020/10/post-1.html&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;/2020/11/post-2.html&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;/2020/12/post-3.html&#39;</span>
</span></span><span style="display:flex;"><span>  ],
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">includeReply</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span> <span style="color:#75715e">// 评论数是否包括回复，默认：false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">res</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">// 返回示例: [
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/10/post-1.html&#39;, count: 10 },
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/11/post-2.html&#39;, count: 0 },
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/12/post-3.html&#39;, count: 20 }
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">// ]
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}).<span style="color:#66d9ef">catch</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">err</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">// 发生错误
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#a6e22e">err</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>请求中，需要一个评论URL的数组，所以我的思路是先通过Api获取Memos的数据。在遍历获取到的数据之后，拿到我所希望的由URL组成的数组。</p>
<p>直接在 getFirstList（） 方法中增加一个方法 updateTiwkoo()，并传值。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getFirstList</span>() {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">bbUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memos</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;api/memo?creatorId=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">bbMemo</span>.<span style="color:#a6e22e">creatorId</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;&amp;rowStatus=NORMAL&amp;limit=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">limit</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">bbUrl</span>).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">json</span>()).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">resdata</span> =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateTiwkoo</span>(<span style="color:#a6e22e">resdata</span>.<span style="color:#a6e22e">data</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">nowLength</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">resdata</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">length</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">nowLength</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">limit</span>) { <span style="color:#75715e">//返回数据条数小于 limit 则直接移除“加载更多”按钮，中断预加载
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>      document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;button.button-load&#34;</span>).<span style="color:#a6e22e">remove</span>()
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">page</span><span style="color:#f92672">++</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">offset</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">limit</span> <span style="color:#f92672">*</span> (<span style="color:#a6e22e">page</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">getNextList</span>()
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">updateTiwkoo</span>(<span style="color:#a6e22e">data</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twiID</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>) =&gt; <span style="color:#a6e22e">memos</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;m/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">id</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">getCommentsCount</span>({
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">envId</span>, <span style="color:#75715e">// 环境 ID
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#a6e22e">urls</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">twiID</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">includeReply</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span> <span style="color:#75715e">// 评论数是否包括回复，默认：false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateCount</span>(<span style="color:#a6e22e">res</span>)
</span></span><span style="display:flex;"><span>  }).<span style="color:#66d9ef">catch</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">err</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#a6e22e">err</span>);
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">updateCount</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twiCount</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>) =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> Object.<span style="color:#a6e22e">assign</span>({},{<span style="color:#e6db74">&#39;count&#39;</span><span style="color:#f92672">:</span><span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">count</span>})
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">bbTwikoo</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>,<span style="color:#a6e22e">index</span>) =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> {...<span style="color:#a6e22e">item</span>, ...<span style="color:#a6e22e">twiCount</span>[<span style="color:#a6e22e">index</span>]};
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateHTMl</span>(<span style="color:#a6e22e">bbTwikoo</span>)
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>在获取到评论数的数据后，直接将两个数组合并。形成一个包含有评论数的新数组。</p>
<h2 id="评论内容">评论内容</h2>
<p>主要是在 <code>Memos</code> 页面内增加一个 供 <code>Twikoo</code> 初始化的容器。并通过一系列触发操作显示渲染。详细如下：</p>
<p>首先，我们需要在页面内增加一个按钮，通过点击来触发评论加载。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;loadTwikoo(memosId)&#39;</span>&gt;&lt;/<span style="color:#f92672">a</span>&gt;
</span></span></code></pre></div><p>其次，我们需要一个容纳 <code>Twikoo</code> 评论的容器，未触发时该容器隐藏。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;twikoo-body twikoo-memosId d-none&#39;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><p>最后，我们需要一个点击事件，将评论初始化。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">loadTwikoo</span>(<span style="color:#a6e22e">memosId</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twikooDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#39;.twikoo-memosId&#39;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twikooCon</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&lt;div id=&#39;twikoo&#39;&gt;&lt;/div&gt;&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">contains</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>)) {
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">querySelectorAll</span>(<span style="color:#e6db74">&#39;.twikoo-body&#39;</span>).<span style="color:#a6e22e">forEach</span>((<span style="color:#a6e22e">item</span>) =&gt; {<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);})
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span>(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>)){
</span></span><span style="display:flex;"><span>      document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>).<span style="color:#a6e22e">remove</span>() <span style="color:#75715e">//如果页面中已经有其他Twikoo初始化，则移除。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">insertAdjacentHTML</span>(<span style="color:#e6db74">&#39;beforeend&#39;</span>, <span style="color:#a6e22e">twikooCon</span>); 
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">init</span>({
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">envId</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">el</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;#twikoo&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/m/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">memosId</span> 
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>  }<span style="color:#66d9ef">else</span>{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>).<span style="color:#a6e22e">remove</span>()
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>值得一提的是，需要将该 <code>Twikoo</code> 的ID值传给触发的方法。</p>
<h2 id="最终效果">最终效果</h2>
<p>效果如下</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/06/05/1685976063.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/twikoo" term="twikoo" label="Twikoo"/></entry><entry><title type="html">使用Midjourney渲染游戏场景原画</title><link href="https://nuoea.com/hi-midjourney/" rel="alternate" type="text/html"/><id>https://nuoea.com/hi-midjourney/</id><published>2023-03-25T17:56:46+08:00</published><updated>2023-03-25T17:56:46+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>AI的快速发展，让很多的工作岗位受到了一定程度的冲击，既然技术注定要往前发展，无法改变的那就去拥抱吧。</p>
<h2 id="常用参数">常用参数</h2>
<p>关于MJ的参数可以大致分为4种类型：</p>
<ul>
<li>基本参数：控制生成图像的基础样式</li>
<li>模型参数：切换生成图像所使用的算法模型</li>
<li>升频参数：控制生成大图时的算法属性</li>
<li>其他参数：适用于早期特定模型的样式参数</li>
</ul>
<p>其中基本参数和模型参数是需要重点需要掌握的内容</p>
<h2 id="风格化">风格化</h2>
<table>
  <thead>
      <tr>
          <th>关键词</th>
          <th>译名</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Japanese animation</td>
          <td>日本动漫</td>
      </tr>
      <tr>
          <td>Makoto Shinkai</td>
          <td>新海诚风格</td>
      </tr>
      <tr>
          <td>Miyazaki Hayao style</td>
          <td>宫崎骏</td>
      </tr>
      <tr>
          <td>Ghibli Studio</td>
          <td>吉卜力风格</td>
      </tr>
      <tr>
          <td>Aesthetic</td>
          <td>唯美</td>
      </tr>
      <tr>
          <td>Tokyo Shinjuku</td>
          <td>东京新宿</td>
      </tr>
      <tr>
          <td>Exquisite</td>
          <td>精致</td>
      </tr>
      <tr>
          <td>smooth lines</td>
          <td>流畅线条</td>
      </tr>
      <tr>
          <td>simple and clean pictures</td>
          <td>简洁干净画面</td>
      </tr>
      <tr>
          <td>healing department</td>
          <td>治愈系</td>
      </tr>
      <tr>
          <td>Poster</td>
          <td>海报</td>
      </tr>
      <tr>
          <td>Beautiful light shadow and color</td>
          <td>美轮美奂</td>
      </tr>
      <tr>
          <td>Static scene</td>
          <td>静态场景</td>
      </tr>
      <tr>
          <td>Bright and dazzling</td>
          <td>明亮耀眼</td>
      </tr>
      <tr>
          <td>The picture of warm spread</td>
          <td>温暖蔓延</td>
      </tr>
      <tr>
          <td>A flattened character</td>
          <td>扁平化的人物</td>
      </tr>
  </tbody>
</table>
<h2 id="灯光">灯光</h2>
<table>
  <thead>
      <tr>
          <th>关键词</th>
          <th>译名</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>volumetric lighting</td>
          <td>体积照明</td>
      </tr>
      <tr>
          <td>cold light</td>
          <td>冷光</td>
      </tr>
      <tr>
          <td>mood lighting</td>
          <td>情绪照明</td>
      </tr>
      <tr>
          <td>bright</td>
          <td>明亮的</td>
      </tr>
      <tr>
          <td>front lighting</td>
          <td>前灯</td>
      </tr>
      <tr>
          <td>Back lighting</td>
          <td>背光照明</td>
      </tr>
      <tr>
          <td>clean background trending</td>
          <td>干净的背景趋势</td>
      </tr>
      <tr>
          <td>hard lighting</td>
          <td>强光</td>
      </tr>
      <tr>
          <td>Soft illuminaotion/ soft lights</td>
          <td>柔和的照明/柔光</td>
      </tr>
      <tr>
          <td>fluorescent lighting</td>
          <td>荧光灯</td>
      </tr>
      <tr>
          <td>rays of shimmering light/morning light</td>
          <td>微光/晨光</td>
      </tr>
      <tr>
          <td>Crepuscular Ray</td>
          <td>黄昏射线</td>
      </tr>
      <tr>
          <td>outer space view</td>
          <td>外太空观</td>
      </tr>
      <tr>
          <td>cinematic lighting/ Dramatic lighting</td>
          <td>电影灯光/戏剧灯光</td>
      </tr>
      <tr>
          <td>bisexual lighting</td>
          <td>双性照明</td>
      </tr>
      <tr>
          <td>Rembrandt Lighting</td>
          <td>伦勃朗照明</td>
      </tr>
      <tr>
          <td>Split Lighting</td>
          <td>分体照明</td>
      </tr>
      <tr>
          <td>rim lights</td>
          <td>边缘灯</td>
      </tr>
      <tr>
          <td>global illuminations</td>
          <td>全局照明</td>
      </tr>
      <tr>
          <td>neon cold lighting</td>
          <td>霓虹灯冷光</td>
      </tr>
      <tr>
          <td>Warm light</td>
          <td>暖光</td>
      </tr>
      <tr>
          <td>atmospheric lighting</td>
          <td>氛围感照明</td>
      </tr>
      <tr>
          <td>hard lighting</td>
          <td>强光</td>
      </tr>
      <tr>
          <td>neon lights</td>
          <td>霓虹灯，赛博朋克风格</td>
      </tr>
      <tr>
          <td>dramatic lighting</td>
          <td>舞台灯光</td>
      </tr>
      <tr>
          <td>natural lighting</td>
          <td>自然灯光</td>
      </tr>
  </tbody>
</table>
<h2 id="渲染">渲染</h2>
<table>
  <thead>
      <tr>
          <th>关键词</th>
          <th>译名</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>ASCII art</td>
          <td>字符风格</td>
      </tr>
      <tr>
          <td>collage art</td>
          <td>拼接艺术</td>
      </tr>
      <tr>
          <td>Opart</td>
          <td>欧普艺术</td>
      </tr>
      <tr>
          <td>Retrowave</td>
          <td>80年代风格</td>
      </tr>
      <tr>
          <td>Watercolor sketch</td>
          <td>水彩画风格</td>
      </tr>
      <tr>
          <td>Plasticine</td>
          <td>橡皮泥风格</td>
      </tr>
      <tr>
          <td>inspired</td>
          <td>引用灵感</td>
      </tr>
      <tr>
          <td>Anthropomorphize</td>
          <td>拟人化</td>
      </tr>
      <tr>
          <td>Cloisonnism</td>
          <td>景泰蓝</td>
      </tr>
      <tr>
          <td>Fairy Kei fashion</td>
          <td>仙女风</td>
      </tr>
  </tbody>
</table>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/midjourney" term="midjourney" label="Midjourney"/><category scheme="https://nuoea.com/tags/ai" term="ai" label="AI"/></entry><entry><title type="html">富士的胶片感太好看了吧</title><link href="https://nuoea.com/fuji-color/" rel="alternate" type="text/html"/><id>https://nuoea.com/fuji-color/</id><published>2023-03-15T23:08:43+08:00</published><updated>2023-03-15T23:08:43+08:00</updated><content type="html"><![CDATA[<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/03/15/202303152340907.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/03/15/202303152341202.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/03/15/202303152341209.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2023/03/15/202303152341278.jpg" />
    </div>
  </div>
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%AF%8C%E5%A3%AB" term="%E5%AF%8C%E5%A3%AB" label="富士"/><category scheme="https://nuoea.com/tags/%E8%83%B6%E7%89%87" term="%E8%83%B6%E7%89%87" label="胶片"/></entry><entry><title type="html">一组76人美图</title><link href="https://nuoea.com/76er-album/" rel="alternate" type="text/html"/><id>https://nuoea.com/76er-album/</id><published>2022-02-24T12:14:05+08:00</published><updated>2022-02-24T12:14:05+08:00</updated><content type="html"><![CDATA[<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310677.JPG"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310675.JPG" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310678.JPG" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310545.jpg" />
    </div>
  </div>
  
</div>


<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310547.JPG"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2022/202202232310548.JPG" />
    </div>
  </div>
  
  
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/></entry><entry><title type="html">制作Big Sur风格的 icon</title><link href="https://nuoea.com/big-sur-icns/" rel="alternate" type="text/html"/><id>https://nuoea.com/big-sur-icns/</id><published>2021-06-27T16:30:37+08:00</published><updated>2021-06-27T16:30:37+08:00</updated><content type="html"><![CDATA[<h2 id="什么是-icns">什么是 icns</h2>
<p>icns 是 Apple 的 macOS 操作系统的 App 图标文件的扩展名，你在 macOS 的「 Desktop 桌面」、「Finder 访达」、「Dock 程序坞」等看到应用程序的外观就是由一个内置在此 App 内部的扩展名为.icns的文件实现的。</p>
<p>你可以通过鼠标“右键”点击 App - “显示包内容” - 进入 “Contents” 目录 - 进入“Resources”目录，然后在目录下可以找到名为Appicon.icns或其他后缀为.icns的一个图标文件。</p>
<p>要创建一个.icns图标文件，需要准备以下 10 种不同大小的.png图片文件</p>
<table>
  <thead>
      <tr>
          <th>图片名称</th>
          <th>图片大小</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>icon_16x16.png</td>
          <td>16x16</td>
      </tr>
      <tr>
          <td><a href="mailto:icon_16x16@2x.png">icon_16x16@2x.png</a></td>
          <td>32x32</td>
      </tr>
      <tr>
          <td>icon_32x32.png</td>
          <td>32x32</td>
      </tr>
      <tr>
          <td><a href="mailto:icon_32x32@2x.png">icon_32x32@2x.png</a></td>
          <td>64x64</td>
      </tr>
      <tr>
          <td>icon_128x128.png</td>
          <td>128x128</td>
      </tr>
      <tr>
          <td><a href="mailto:icon_128x128@2x.png">icon_128x128@2x.png</a></td>
          <td>256x256</td>
      </tr>
      <tr>
          <td>icon_256x256.png</td>
          <td>256x256</td>
      </tr>
      <tr>
          <td><a href="mailto:icon_256x256@2x.png">icon_256x256@2x.png</a></td>
          <td>512x512</td>
      </tr>
      <tr>
          <td>icon_512x512.png</td>
          <td>512x512</td>
      </tr>
      <tr>
          <td><a href="mailto:icon_512x512@2x.png">icon_512x512@2x.png</a></td>
          <td>1024x1024</td>
      </tr>
  </tbody>
</table>
<h2 id="big-sur">Big Sur</h2>
<p>在发布会上，Craig提及了macOS全新的拟物化设计。类似IOS的图标风格，加速了苹果全终端融合的进程。</p>
<p>但是因为时间的关系，很多第三方的APP暂时还没有适配这种风格的图标。所以，作为一名深度强迫症患者。自己去制作相关的ICNS就是唯一的出路了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2021/20210627170052.jpg" alt=""  /></p>
<h2 id="制作过程">制作过程</h2>
<ul>
<li>准备最大尺寸 1024x1024 图片一张，重命名为icon.png，其他大小尺寸可以通过终端命令生成；</li>
</ul>
<p>最好是能根据Apple的设计规范，制作统一视觉效果的图标。如果会使用设计工具。如：PS、Sketch、Figma等。可以使用相关工具的模版自动生成。</p>
<blockquote>
<p><a href="https://github.com/elrumo/macOS_Big_Sur_icons_replacements/raw/master/design/Template-Icon-App.sketch">Sketch图标模版</a></p></blockquote>
<ul>
<li>通过鼠标右键或者命令，创建一个名为icons.iconset的文件夹；</li>
</ul>
<pre tabindex="0"><code> mkdir icons.iconset
</code></pre><ul>
<li>通过终端来快速创建各种不同尺寸要求的图片文件;</li>
</ul>
<pre tabindex="0"><code>sips -z 16 16 icon.png -o icons.iconset/icon_16x16.png
sips -z 32 32 icon.png -o icons.iconset/icon_16x16@2x.png
sips -z 32 32 icon.png -o icons.iconset/icon_32x32.png
sips -z 64 64 icon.png -o icons.iconset/icon_32x32@2x.png
sips -z 128 128 icon.png -o icons.iconset/icon_128x128.png
sips -z 256 256 icon.png -o icons.iconset/icon_128x128@2x.png
sips -z 256 256 icon.png -o icons.iconset/icon_256x256.png
sips -z 512 512 icon.png -o icons.iconset/icon_256x256@2x.png
sips -z 512 512 icon.png -o icons.iconset/icon_512x512.png
sips -z 1024 1024 icon.png -o icons.iconset/icon_512x512@2x.png
</code></pre><ul>
<li>最后，终端中运行下面的命令，就可以获得名为icon.icns的图标文件了;</li>
</ul>
<pre tabindex="0"><code>iconutil -c icns icons.iconset -o icon.icns
</code></pre><p><strong>注意 : icon.png图片文件和icons.iconset文件夹要保存在同一级目录下，终端启动后切换到该目录。</strong></p>
<div class="row">
  
  
  
  
</div>


]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/mac" term="mac" label="Mac"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">总有一些事，比总冠军更重要</title><link href="https://nuoea.com/more-inportant-things/" rel="alternate" type="text/html"/><id>https://nuoea.com/more-inportant-things/</id><published>2021-06-27T13:05:38+08:00</published><updated>2021-06-27T13:05:38+08:00</updated><content type="html"><![CDATA[<h2 id="淘汰">淘汰</h2>
<p>篮网淘汰，至今意难平。但是看了看剩下的四只球队。目前局面占优的太阳有布克，小鹿有垫脚哥。这两个人都是都一个特点，就是打球动作大。不管是有意无意，能被联盟球队把危险动作做成集锦的，这两个人都没得洗。</p>
<p>但如果，一旦太阳或者是雄鹿拿了总冠军。多年之后，这些细枝末节是不会背人关注的，人们只会记得今年的冠军是谁，而作为冠军球队的当家球星，人们也只会洗他们不是脏。只是
够强硬。</p>
<h2 id="联盟">联盟</h2>
<p>看了今年的季后赛，感觉目前的联盟就是没有了底线。为了多卖票就可以强行保留悬念。争议判罚层出不穷，裁判强行干扰比赛结果的走势。不管合理不合理。哪怕是伤人的动作。</p>
<p>其实，作为联盟，作为执法者，难道不应该对这种直接影响局势的盘外招零容忍么。如果竞技体育失去了竞技的本身。那这项运动，还有什么美感可言。如果靠着伤人，就能拿到总冠军，那这个冠军的含金量又有多少呢。</p>
<p>诚然，伤病是比赛的一部分。但那也是自然的伤病，而不是人为的伤病。</p>
<h2 id="篮网">篮网</h2>
<p>我们喜欢篮网。不就是这只球队无与伦比的进攻盛宴么。历史级别的进攻效率，水银泻地的流畅，三巨头不讲道理的个人能力。这是这支球队的魅力。</p>
<p>我觉得不管喜不喜欢篮网这只球队。都不可否认的是：</p>
<blockquote>
<p>目前的两场比赛，论观赏性都远远不及篮网的比赛。</p></blockquote>
<p>所以，作为一个球迷。我当然是希望篮网总冠军，哈登能够一冠圆梦。这是他自己一直追求的目标，也是他的个人荣誉。</p>
<p>但如果他拿不到。也不影响我继续喜欢看他们健康的打球。</p>
<p>毕竟，总有一些事情，比冠军更重要。</p>
<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210627153311.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210627153314.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210627153313.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210627153312.jpg" />
    </div>
  </div>
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/></entry><entry><title type="html">一组收藏的原神原画壁纸</title><link href="https://nuoea.com/genshin-impact-wallpaper/" rel="alternate" type="text/html"/><id>https://nuoea.com/genshin-impact-wallpaper/</id><published>2021-05-26T00:33:15+08:00</published><updated>2021-05-26T00:33:15+08:00</updated><content type="html"><![CDATA[<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002120.JPG"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002121.JPG" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002123.JPG" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002124.JPG" />
    </div>
  </div>
  
</div>


<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002905.PNG"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2021/20210526002122.JPG" />
    </div>
  </div>
  
  
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/><category scheme="https://nuoea.com/tags/%E5%A3%81%E7%BA%B8" term="%E5%A3%81%E7%BA%B8" label="壁纸"/></entry><entry><title type="html">Hi，Hugo</title><link href="https://nuoea.com/hi-hugo/" rel="alternate" type="text/html"/><id>https://nuoea.com/hi-hugo/</id><published>2020-07-18T16:39:16+08:00</published><updated>2020-07-18T16:39:16+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>一场突如其来的疫情，打乱了所有的计划和安排。可能是身处武汉的原因，可能焦虑的情绪会更多一些。</p>
<p>自四月八日武汉解封以来，武汉的一切似乎都在好转，但疫情之后的武汉又似乎和以往不那么一样。可能是更多的人不放心公共交通，选择自己开车，导致的交通大拥堵。让这个城市看起来，似乎恢复了往日的繁华和热闹。只是临街商铺萧索的生意告诉我们，这一场浩劫所带来的影响，还远远没有结束。只是我们，是时候继续往前走，向前看了。</p>
<h2 id="关于">关于</h2>
<p>生活重新回到正轨，新的工作也趋于稳定。到几个朋友的网站一看，发现好多都在折腾新的工具，就是这个 GO 语言编写的 Hugo 。</p>
<p>本着大家都推荐那就去看看的原则，就到 Hugo 的官方去看了下文档。看了之后吧，其实还是一脸懵逼，对于一个已经使用了 Gridea 很久，什么功能都使用的很贴心的懒人来说。文章主题等等需要重新折腾一遍，我的内心是拒绝的。而且部署的方式看起来也没有 Gridea 那么方便。所以看来看去。还是提不起对 Hugo 的兴趣。直到 木木 也开始搞这个东西。并推出了相当详细的折腾文档。才开始动心起来。</p>
<h2 id="折腾">折腾</h2>
<p>按照木木的教程一路走下来吧，其实还蛮有意思。折腾下来，就是没有找到比较好看的主题，当然收费的确实有喜欢的，只不过不想花这个冤枉钱。看来看去，觉得要用的话那还是自己弄吧。反正都是折腾，自然是怎么开心怎么来。</p>
<p>Go语言是一窍不通的。但是木木贴出了常用代码。所以改个主题的难度倒也能接受。慢慢的有了现在的样子，以后再慢慢完善吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/hugo" term="hugo" label="Hugo"/></entry><entry><title type="html">在疫情中心武汉的这两个月</title><link href="https://nuoea.com/wuhan-covid-19/" rel="alternate" type="text/html"/><id>https://nuoea.com/wuhan-covid-19/</id><published>2020-03-06T11:10:01+00:00</published><updated>2020-03-06T11:10:01+00:00</updated><content type="html"><![CDATA[<p>一直想写点什么，为这次疫情，为疫情中心的武汉。在家隔离了快两个月了。其实，从1月23日，武汉宣布封城那天起，就没有出过门了。虽然是因响应了国家的号召，但其中无助心酸可能只有身在其中的武汉人才能明白。</p>
<p>其实现在回过头来想，唯一后悔的事情，大概就是在1月23日凌晨2点，我第一时间刷到封城的新闻的时候，没有马上叫醒爸妈，开车带他们逃离这里。八个小时的时间，开车足够去到任何一个外省城市的医院进行隔离了，虽然不太厚道，但也不至于一度让全家陷入绝望的境地。</p>
<h2 id="疫情之前">疫情之前</h2>
<p>1月份的武汉还处在过年祥和的愉悦氛围中。年会、年终奖、团圆饭、对新年的展望、对未来的展望是我对1月23日之前，武汉的全部印象。</p>
<p>虽然手机朋友圈里也会刷到类似传染病这类的消息，但是因为官方的辟谣，几乎所有人都没有放在心上。但我在家里人的要求下，还是开始每天佩戴口罩出门上班。现在想想真的是万幸的事情。</p>
<h2 id="封城之后">封城之后</h2>
<p>可以说，封城之后的武汉人民陷入了巨大的绝望之中。一开始还不觉得，但是随着时间一天天的过去，每天看到的是各种各样的求助和无助，每天听到的是楼下救护车的鸣笛声不断的想起。所谓人间百态，无助的、嘲讽的、愤怒的、绝望的都在封城之后的武汉一一展现。</p>
<p>也许这世间真的不存在什么感同身受。任何事情，只要不是自己深陷其中是难以体会的。就像作家方方说的那样：</p>
<blockquote>
<p>武汉之外的隔离跟武汉之内的隔离是不一样的，武汉之外的恐慌跟武汉之内的恐慌也是不一样的。</p></blockquote>
<p>焦虑的心情每天都在增加，因为感染的案例就在身边，楼上楼下、邻居街坊真实的发生着。而自己就有可能是下一个。在这样忐忑的日子里，没人可以置身事外。</p>
<h2 id="最后">最后</h2>
<p>现在来看，疫情大体是控制住了。武汉的情况在慢慢的好转。在很多人眼里，我们之所以能挺到今天，是因为国家的统一的调度，自上而下的执行力。我不否认。但是我更希望我们可以记住今天的苦难，记住在一线默默付出的英雄们，因为我们本可以避免这场灾难。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/></entry><entry><title type="html">2020年流行设计风格探索</title><link href="https://nuoea.com/2020-design-neuomorphism/" rel="alternate" type="text/html"/><id>https://nuoea.com/2020-design-neuomorphism/</id><published>2020-01-10T17:31:25+00:00</published><updated>2020-01-10T17:31:25+00:00</updated><content type="html"><![CDATA[<p>其实界面的设计风格一直在随着时代的变化而变化。从最开始的拟物风格到后来的扁平化，其实都是随着人们对于交互理解的加深而产生的自然进化。</p>
<p>但是随着扁平化的流行，我们不难发现越来越多的APP看起来简直一摸一样了，这对于我们的使用体验来说确实很糟糕。2020年是时候来点不一样的视觉冲击了。</p>
<h2 id="关于">关于</h2>
<p>其实最近在Dribbble和Instagram上引起足够多关注的作品都采用了一种新的UI设计风格，有人把它称之为“Neuomorphism”也就是——新拟物风格。那么这种风格都有哪些特点呢。</p>
<blockquote>
<p>通过引入柔和、多彩的阴影和曲线，它创造了一种带有某种积极的视觉氛围的app风格。它从原质化设计大量借用了分层的方式，但它将纯扁平的元素和显得“突出”的重要元素混合在一起。这比原质化设计中乏味的卡片重叠更赏心悦目。</p></blockquote>
<h2 id="最后">最后</h2>
<p>其实在经历了扁平化的数字设计语言之后，这种干净的简洁现代的设计语言固然很符合数字化的概念，但是它太冰冷了。2019年下半年反复被提起的一个词叫做“情感化设计”，什么是情感化设计呢，应该是一种有更多温度、更多质感、 更让人觉得亲切的设计语言。但是传统的拟物设计又太笨重了，这个时候符合现代设计的新拟物风格的出现也就不奇怪了。</p>
<h2 id="作品">作品</h2>
<p>最后来欣赏一组新拟物风格的作品吧。</p>
<p><div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001847.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001848.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001849.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001850.jpg" />
    </div>
  </div>
  
</div>


<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001851.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001852.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001853.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001854.jpg" />
    </div>
  </div>
  
</div>


<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001855.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2020/20200320001856.jpg" />
    </div>
  </div>
  
  
  
</div>

</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/></entry><entry><title type="html">最近发现一个神器</title><link href="https://nuoea.com/recent-discovery-tool/" rel="alternate" type="text/html"/><id>https://nuoea.com/recent-discovery-tool/</id><published>2019-12-23T21:09:05+00:00</published><updated>2019-12-23T21:09:05+00:00</updated><content type="html"><![CDATA[<p>最近在网上找那个油猴脚本的时候，无意间发现一个还蛮好用的小工具 - 万能命令。使用了一会之后，就发现这个东西实在是太方便了。</p>
<h2 id="万能命令">万能命令</h2>
<p><a href="https://wn.run">我是传送门</a>，官方介绍是这么说的：</p>
<blockquote>
<p>wn万能命令是一个在线工具效率平台，将各种高质量的在线工具按应用站点聚合起来，让你以方便快捷好记的方式寻找和使用各类在线工具。</p></blockquote>
<h2 id="如何使用">如何使用</h2>
<p>在浏览任意网页的时候，在网址的 <code>https://</code> 前面加上命令：<code>wn.run/</code> ，就会展示出用于该网页的各种附加在线工具。比如网页翻译，网页长截图，会员资源下载，会员视频查看等。</p>
<h2 id="特点">特点</h2>
<ul>
<li>方便快捷，只需输入一个命令或点击一下书签。</li>
<li>无需下载、即用即走。</li>
<li>全端支持，不管是PC还是手机上都可使用。</li>
</ul>
<p>更多好玩的工具，一起来发现吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">入了多看电纸书</title><link href="https://nuoea.com/buy-mi-reader/" rel="alternate" type="text/html"/><id>https://nuoea.com/buy-mi-reader/</id><published>2019-12-19T14:35:04+00:00</published><updated>2019-12-19T14:35:04+00:00</updated><content type="html"><![CDATA[<p>上个月小米正式在自家商城上众筹了这款产品。作为一个多看阅读很多年的铁粉，等了这么多年，自然是不会错过，毫不犹豫的入手了。</p>
<h2 id="基本参数">基本参数</h2>
<table>
  <thead>
      <tr>
          <th>介绍</th>
          <th>详情</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>产品名称</td>
          <td>多看电纸书</td>
      </tr>
      <tr>
          <td>产品重量</td>
          <td>178g</td>
      </tr>
      <tr>
          <td>产品尺寸</td>
          <td>159.2 x 116.0 x 8.3mm</td>
      </tr>
      <tr>
          <td>显示屏幕</td>
          <td>E-ink 6英寸 212 PPI</td>
      </tr>
      <tr>
          <td>无线连接</td>
          <td>WIFI 2.4GHz 蓝牙 4.0</td>
      </tr>
      <tr>
          <td>输入电压</td>
          <td>5V 1.5A</td>
      </tr>
      <tr>
          <td>电池容量</td>
          <td>1800mAh</td>
      </tr>
      <tr>
          <td>操作系统</td>
          <td>Android 8.1</td>
      </tr>
  </tbody>
</table>
<p>这款产品的外形设计和kindle差不多，期待的窄边框那是没有的。配置方面，搭载了6英寸电子墨水屏，212 PPI，支持24级阅读灯，官方称亮度均匀性高达90%以上。此外，多看电纸书还配备了16GB储存空间和1GB内存，同时采用Allwinner 4核1.8GHz CPU，运行安卓8.1系统。续航方面，多看电纸书配备1800mAh电池，配备Type C充电口，官方称充电一次可待机数周。</p>
<h2 id="关于多看">关于多看</h2>
<p>其实这款产品的主要吸引我的地方就在于多看阅读的这个定制化系统。早在很多年之前，大家都在用kindle的时候，多看阅读就曾为kindle做过一个定制化的rom。那个时候 kindle 的中文排版一塌糊涂，东西虽然好，但是极度的难用。多亏了多看，才让更多的人体验到电纸书的乐趣。</p>
<p>诚然，我也一直坚信多看阅读是做中文排版最好的一个厂商。所以在当年就有传闻说多看要做自己的硬件产品，只不过后来多看被小米收购，各个平台的APP，包括自己的图书生态都做的不错，唯独就是硬件产品没有任何风声。这一等，就是这么多年。</p>
<h2 id="使用体验">使用体验</h2>
<p>机器到手一周，体验的时间也不算短了。说起来还有点波折。可能是前期工艺的问题，我到手的这台机器前面板有点瑕疵。没想到联系售后之后，二话不说直接发了一台全新的过来。还报销了寄回的邮费。给小米点赞。</p>
<p>说说产品。其实整体体验下来给我的感觉是相当好的。一句话来说：</p>
<blockquote>
<p>在这个价位，它足够有诚意。</p></blockquote>
<p>依托于多看阅读这套成熟的定制系统和硬件，不管是响应速度同步看书，都非常流畅。特别是同步方面真心比kindle便捷许多。支持wifi、蓝牙、ftp、百度云同步等多种方式。如果手机上也使用多看阅读APP看书的话，还可以实时同步阅读进度，可以说是相当贴心了。背光灯有24级，观感上乘。唯独有两个地方不甚满意：</p>
<ul>
<li>屏幕的PPI还是偏低，如果能有300PPI就完美了。</li>
<li>整机的续航能力还是不足。</li>
</ul>
<h2 id="最后">最后</h2>
<p>等了这么多年，这款产品给我的感受算是比较良心。在这个价位竞争力还是蛮强的。只是毕竟刚刚上市，总归还是有一些不足的地方。据论坛上的管理人员透露很多的需求都已经收到，在后期的版本升级中会带来更多定制化的功能以及优化。随着系统的升级，相信这款产品会更好用吧。</p>
<p>多看电纸书正式开售的时间是12月20日上午10点。喜欢的小伙伴不要错过啦。</p>
<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/12/19/2.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/12/19/3.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/12/19/4.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/12/19/5.jpg" />
    </div>
  </div>
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E5%A5%BD%E7%89%A9" term="%E5%A5%BD%E7%89%A9" label="好物"/><category scheme="https://nuoea.com/tags/%E8%AF%84%E6%B5%8B" term="%E8%AF%84%E6%B5%8B" label="评测"/></entry><entry><title type="html">换了新主题</title><link href="https://nuoea.com/change-theme-vant/" rel="alternate" type="text/html"/><id>https://nuoea.com/change-theme-vant/</id><published>2019-12-18T13:39:23+00:00</published><updated>2019-12-18T13:39:23+00:00</updated><content type="html"><![CDATA[<p>感觉自己还是一个视觉动物。看一个东西久了吧，总是会生出喜新厌旧的情绪。最近工作之余看之前的那套主题越看越觉得不够精致。于是就有想要换掉的冲动。直到最近两天才得了时间，可以落实这个事情。</p>
<h2 id="第一版">第一版</h2>
<p>关于这套主题，最开始设计的时候还是用的阿里的那套 <code>Ant design</code> 的视觉框架。只是在配色细节上根据略有调整。整体还是依托于那套成熟的视觉效果。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/12/18/1.jpg" alt=""  /></p>
<h2 id="第二版">第二版</h2>
<p>因为在使用的过程中可能觉得布局方面还是有些痛点，觉得侧边栏的左右布局不太合适，对于排版方面的可定制程度不够灵活。所以有了这个版本。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/12/18/2.png" alt=""  /></p>
<p>在这套主题里面采用了 swiper 控件，流式布局。看起来还是挺大气美观的。只是后来越发的觉得臃肿。毕竟不是做什么资讯站，访问速度也是问题。</p>
<h2 id="第三版">第三版</h2>
<p>感觉最近还蛮喜欢这种小而美的精致范儿。每个像素每个线条每个颜色都重做了。首页的样式也根据不同的文章类型做了定制区分。整体展示效果应该更好吧。交互方面对移动端的样式做了比较大的修改，增加了可触控的区域，体验方面比之前应该也会更好。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/12/18/3.png" alt=""  /></p>
<h2 id="最后">最后</h2>
<p>这段时间一直没怎么更新，感觉又快一个月了吧。因为毕竟年底了么。也在整理简历啊，工作啊乱七八糟一堆事情。
最开始的时候，是想用Gridea 做一个展示个人设计作品的站，方便换工作的时候用。最近整理简历，也就顺手把这个站给做了。话说 Gridea 支持上传到自己主机的新版快点上线吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/theme" term="theme" label="Theme"/></entry><entry><title type="html">折叠屏会是智能设备的下一个形态么</title><link href="https://nuoea.com/folding-screens-next-phone/" rel="alternate" type="text/html"/><id>https://nuoea.com/folding-screens-next-phone/</id><published>2019-11-23T16:19:56+00:00</published><updated>2019-11-23T16:19:56+00:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>在近日的显示技术与应用展上，国产厂商Visionox可以说是意气风发，风头无两。其在展会期间展出的下一代动态卷曲全模组AMOLED显示屏让人惊艳无比。维信诺表示，卷曲屏作为柔性AMOLED的“进化级”技术，将是折叠屏的下一阶形态，可在扩展显示面积的同时大幅减少终端产品体积。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/25/2.jpg" alt=""  /></p>
<center>Visionox 展出的折叠屏设备</center>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/25/3.gif" alt=""  /></p>
<center>Visionox 展出的折叠屏手机</center>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/25/4.gif" alt=""  /></p>
<center>Visionox 展出的卷曲屏设备</center>
<p>看到这个消息，我当然是很激动的。因为我们都知道，内容的形式是依托与硬件的边界的。当你的网速只有2G/3G的时候，微信就称为最常用的社交工具。但是当你的网速提升到了4G，或者说现在的5G的时候，那么抖音快手或者下一个某某某就出现了，对吧。屏幕也是如此。当你的屏幕只有4寸或者6寸的大小的时候。我们不得不为了如此小的屏幕去适配我们的内容，去优化我们的展现方式，去让阅览者有一个更好的阅读体验。但是屏幕变大了之后呢？我们可不可以拥有更多的交互模式？拥有更完美的阅读体验？从而产生更多的优质内容呢？我相信答案是肯定的。</p>
<h2 id="想法">想法</h2>
<p>其实从这几年智能设备的发展来看，我相信大家都会有一个共同的认知，就是ID设计越来越一致，屏幕越来越大。设备的集成度越来越高。但是给人整体感受却在倒退。厂商们也很为难，在如此狭小的空间内，放入更多的元器件，大家都想要更大的屏幕，更大的电池，更好的相机，更完整的体验，却只能在尺寸，在重量，在外观设计方面做妥协。所以不知道你们有没有发现：</p>
<blockquote>
<p>我们现在的设备，越来越不像我们最初赋予它的形态了。</p></blockquote>
<p>手机变得越来越像一块平板，又大又重，我们使用它需要双手操作，因为一个手根本把持不住。我们的手表慢慢的变成了手机。不仅可以追踪我们的一切数据、可以打电话、可以回复信息、可以听歌，也可以装APP。而我们的平板越来越像一个生产力工具。可以接键盘鼠标，可以码字修图轻办公，完全不像是一个泡面神器应该有的样子。我们熟悉的已经逐渐形成认知的这些设备，正在慢慢的一个又一个的变成我们陌生的样子。这真的是一件好事么？或者说，这种变化真的是我们需要的么？我们真的需要一个能打电话的手表么？我们真的需要一台重到我们自己都不想拿在手里的手机么？我们真的需要给我们的平板配上键盘和鼠标么？如果设备形态的升级不能带给我们体验的提升，反而一味的妥协，那真的是一种升级么？</p>
<h2 id="最后">最后</h2>
<p>但是折叠屏以及这次展出的卷曲屏让我看到了这种思路的转变。它代表着制造者已经开始看到这种需求以及与之产生的冲突。总归来说是一件好事吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E5%A5%BD%E7%89%A9" term="%E5%A5%BD%E7%89%A9" label="好物"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">Hackintosh 安装全攻略</title><link href="https://nuoea.com/hackintosh-install-strategy/" rel="alternate" type="text/html"/><id>https://nuoea.com/hackintosh-install-strategy/</id><published>2019-11-21T23:15:16+00:00</published><updated>2019-11-21T23:15:16+00:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>感觉现在已经离不开 macOS 了。因为手里的这台15款的Macbook Pro 什么都好，就是性能已经慢慢的跟不上我的要求，所以折腾了一台 Hackintosh ，配置之前也发出来了&ndash;<a href="https://nuoea.com/asrock-itx-hackintosh/">我的配置</a>。然后就有小伙伴要求写个教程。我就想整理一下，尽可能全面的从硬件的选购到整个装机点亮的过程都记录下来。希望可以给想折腾的小伙伴一点参考。</p>
<h2 id="硬件指南">硬件指南</h2>
<p>选对的合适的硬件，那么 <code>Hackintosh</code> 就已经成功了90%以上。选对硬件，意味着安装时可以少走弯路，新手也能很轻松的折腾，不仅可以节省大量的时间成本，而且在使用的过程中也可以获得更加完整、稳定的体验。升级起来，也不需要每次都费劲功夫的折腾驱动，非常省心。</p>
<p>就目前而言，能够比较稳定使用的配置是：</p>
<ul>
<li>Intel 1151针的 第八代、第九代酷睿处理器。<code>免驱</code></li>
<li>市面上主流的华硕、技嘉、华擎、微星主板。<code>缩水版除外</code></li>
<li>AMD 的Radeon VII系列、Vega系列、RX系列显卡。<code>免驱</code></li>
<li>主流 M.2接口支持NVME协议的固态硬盘。<code>免驱</code></li>
<li>4k分辨率、5k分辨率的显示器。<code>体验最好</code></li>
<li>苹果Mac拆机或者同款的蓝牙WiFi二合一无线网卡。<code>免驱</code></li>
<li>主流的DDR4内存条。<code>越大越好</code></li>
<li>电源机箱别贪便宜，特别是电源千万不能缩水。<code>功率要足</code></li>
</ul>
<p>基本上 Hackintosh 的配置就从上面的选购指南中挑选就行了，只要不买一些冷门小众的品牌，不会有太大的问题。当然也会有人说，我不喜欢AMD的显卡，我就想用英伟达的显卡做双系统可不可以。答案是可以。但是英伟达的显卡目前不支持升级到 <code>MacOS Mojave 10.14.0</code>以上。只能停留在 <code>10.13.6</code> 这个版本。所以不介意自己不能使用最新版的同学可以选择N卡。</p>
<h2 id="前期准备">前期准备</h2>
<ul>
<li>进入主板BIOS设置，将”安全启动”关闭,将”传统模式”打开。</li>
<li>一个空白的U盘，8G以上的容量。</li>
<li>一个已经制作好带CLover引导工具的安全镜像（.dmg格式）。这里提供一个10.14.6的镜像&ndash;<a href="https://pan.baidu.com/s/1yx7A_wlfepp6ybTCRcz4cg">下载提取码：qrwt</a></li>
<li>Win 平台需要镜像写入软件：TransMac。</li>
<li>Mac 平台需要镜像写入软件：Etcher。</li>
</ul>
<h2 id="写入镜像">写入镜像</h2>
<h3 id="win-平台">Win 平台</h3>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/2.jpg" alt=""  /></p>
<p>写入镜像</p>
<ul>
<li>打开 <code>TransMac</code> 软件，插入空白U盘。</li>
<li>右键单击U盘 选 <code>Format Disk For Mac</code> 格式化U盘。</li>
<li>然后再次右键单击U盘，选中 <code>Restore with Disk Image</code> ，然后选择下载好的安装镜像写入U盘。</li>
</ul>
<h3 id="mac-平台">Mac 平台</h3>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/3.png" alt=""  /></p>
<p>写入镜像</p>
<ul>
<li>打开 <code>Etcher</code> 软件。插入空白U盘。</li>
<li>在 <code>Etcher</code> 中选中自动识别出来的U盘，点击 <code>Flash</code> 即可。</li>
</ul>
<p>制作好了安装U盘之后，就可以开始正式安装了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/4.png" alt=""  /></p>
<p>clover 引导工具界面</p>
<ul>
<li>首先重启电脑。</li>
<li>插入已经写好镜像的U盘。开机选择从U盘启动。这个时候我们会进入到 <code>clover</code> 的引导界面。</li>
<li>移动光标到 <code>Boot OS X Install</code> 安装盘。然后敲击 <code>空格键</code> 。</li>
<li>用方向键与回车选中 <code>Verbose(-v)</code> 。</li>
<li>再用方向键和回车选择 <code>Boot macOS with selected options</code> 。</li>
<li>等待进入安装界面。</li>
</ul>
<h2 id="安装详细">安装详细</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/5.png" alt=""  /></p>
<p>语言选择</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/6.png" alt=""  /></p>
<p>出现macOS实用工具界面,选择磁盘工具</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/7.png" alt=""  /></p>
<p>选择 <code>SSD</code>,点击抹掉按钮,选择默认的 <code>Mac OS扩展(日志型)</code> ,将名称修改为 <code>Macintosh HD</code> ,点击 <code>抹掉</code> 按钮</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/8.png" alt=""  /></p>
<p>抹盘成功后,它会自动生成一个200MB的EFI分区，用来存放我们的引导文件</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/9.png" alt=""  /></p>
<p>到这里,磁盘工具的动作就已经结束了.退出磁盘工具进入安装界面,进行系统的安装了</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/10.png" alt=""  /></p>
<p>进入安装界面</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/11.png" alt=""  /></p>
<p>选择继续</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/12.png" alt=""  /></p>
<p>点击同意,选择Macintosh HD</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/13.png" alt=""  /></p>
<p>等它装完，期间会自动重启几次。在重启的时候还是要选择从U盘开机。选择继续安装。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/15.png" alt=""  /></p>
<p>大功告成！</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/14.png" alt=""  /></p>
<h2 id="性能优化">性能优化</h2>
<p>安装好了镜像，成功进入mac界面并不是结束。这个时候我们还需要替换适合自己硬件的EFI引导文件到系统的EFI分区，来驱动我们的硬件。</p>
<p>这里有一份 Hackintosh 长期维护的机型名单，可以在上面找到适合自己的 EFI 文件夹。</p>
<blockquote>
<p><a href="https://github.com/daliansky/Hackintosh">长期维护名单</a></p></blockquote>
<p>打开终端,输入命令: <code>diskutil list</code> ,它会显示类似的信息:</p>
<pre tabindex="0"><code class="language-code" data-lang="code">/dev/disk4 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +8.0 GB     disk4
   1:                        EFI EFI                     209.7 MB   disk4s1
   2:                  Apple_HFS XiaoMiPro 10131         7.7 GB     disk4s2

/dev/disk5 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +7.0 GB     disk5
   1:                        EFI EFI                     209.7 MB   disk5s1
   2:                  Apple_HFS XiaoMiPro 10131         6.7 GB     disk5s2
</code></pre><p>挂载EFI分区</p>
<p>我们使用diskutil命令挂载EFI分区，例如这里是：<code>sudo diskutil mount disk5s1</code></p>
<p>复制/替换EFI</p>
<p>将下载好的EFI复制到系统SSD的EFI分区下即可。</p>
<h2 id="最后">最后</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/21/16.jpg" alt=""  /></p>
<p>EFI目录的结构就是如此。主要的配置项都在 config.plist 文件中。kexts 目录存放的是驱动文件。如果按照给出的标准硬件去配置着台机器的话，其实绝大部分硬件都免驱了，我们只需要几个核心的驱动文件就可以了。</p>
<ul>
<li>Clover &ndash; 引导工具 <a href="https://github.com/Dids/clover-builder/releases">下载地址</a></li>
<li>Lilu &ndash; 核心驱动 <a href="https://github.com/acidanthera/Lilu">下载地址</a></li>
<li>WhateverGreen &ndash; 显卡相关 <a href="https://github.com/acidanthera/WhateverGreen">下载地址</a></li>
<li>AppleALC  &ndash; 声卡相关 <a href="https://github.com/acidanthera/AppleALC/tree/master/">下载地址</a></li>
<li>VirtualSMC  &ndash; 核心驱动 <a href="https://github.com/acidanthera/VirtualSMC/releases">下载地址</a></li>
</ul>
<p>当然，如果已经在上面的 <code>长期维护的机型名单</code>中，找到了自己的配置。那么就不需要自己再去折腾这些了， 直接下载下来替换就能起飞了。就写到这里吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/hackintosh" term="hackintosh" label="Hackintosh"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">平淡日子里的刺</title><link href="https://nuoea.com/days-of-thorns/" rel="alternate" type="text/html"/><id>https://nuoea.com/days-of-thorns/</id><published>2019-11-20T16:37:57+00:00</published><updated>2019-11-20T16:37:57+00:00</updated><content type="html"><![CDATA[<h2 id="关于">关于</h2>
<p>平淡日子里的刺，是电影《我想和你好好的》的主题曲，由韩寒填词，宋冬野谱曲并演唱。其曲调平缓流畅，但歌词却颇为扎心。算是宋冬野的佳作之一。</p>
<h2 id="吉他谱">吉他谱</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/20/1.jpg" alt=""  /></p>
<hr>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/20/2.jpg" alt=""  /></p>
]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%9F%B3%E4%B9%90" term="%E9%9F%B3%E4%B9%90" label="音乐"/></entry><entry><title type="html">Gridea主题：Mao</title><link href="https://nuoea.com/gridea-theme-mao/" rel="alternate" type="text/html"/><id>https://nuoea.com/gridea-theme-mao/</id><published>2019-11-18T13:04:49+00:00</published><updated>2019-11-18T13:04:49+00:00</updated><content type="html"><![CDATA[<h2 id="关于">关于</h2>
<p>这是给一个朋友定制的主题。朋友提了一些需求，做完原型和飞机稿，看到效果感觉还挺满意的吧。想到最近折腾的 <code>Gridea</code> 非常好用，就用它实现了。后期应该还会继续优化。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/6.jpg" alt=""  /></p>
<hr>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/5.jpg" alt=""  /></p>
<h2 id="设计">设计</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/4.jpg" alt=""  /></p>
<p>给的需求关键词是<code>活泼</code>。就用这组清新的水果绿做了整个视觉的搭配。整体的代入感让人可以有一种回到夏天的清爽感。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/1.png" alt=""  /></p>
<hr>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/2.png" alt=""  /></p>
<hr>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/18/3.png" alt=""  /></p>
<h2 id="使用">使用</h2>
<ul>
<li>首页展示图片可以自定义，在主题自定义配置中可以配置图片链接，以方便更换。</li>
<li>评论框使用的是 <code>valine</code> 。在主题的自定义配置项目中可以设置ID和KEY。特别感谢 <code>@林木木</code> 童鞋。</li>
<li>页脚置入社交链接。根据自己的需要可以在自定义配置项中定义。</li>
<li>less 所有颜色可自定义。</li>
<li>待完善</li>
</ul>
<h2 id="最后">最后</h2>
<p>希望 <code>Gridea</code> 越来越好～</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/theme" term="theme" label="Theme"/></entry><entry><title type="html">Hi，Gridea</title><link href="https://nuoea.com/hi-gridea/" rel="alternate" type="text/html"/><id>https://nuoea.com/hi-gridea/</id><published>2019-11-15T09:32:33+00:00</published><updated>2019-11-15T09:32:33+00:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>耗时两天，从 Bitcron 搬到了 Gridea。</p>
<h2 id="关于">关于</h2>
<p>Gridea 是一个船新的静态博客写作客户端，前两天看到 <code>@林木木</code> 在推荐。就好奇去喵了一下。结果却看越喜欢。发现这货简直神器，不但解决了很多静态博客前辈们的痛点，而且自身的特性一大堆：</p>
<ul>
<li>支持 MarkDown</li>
<li>自定义标签</li>
<li>跨设备</li>
<li>多平台</li>
<li>不断完善。。。</li>
</ul>
<h2 id="踩坑">踩坑</h2>
<p>在折腾 Gridea 的这两天，还是遇到了不少的问题：</p>
<ul>
<li>导入之前的文章似乎有 <code>BUG</code> 。导入不识别的文章，会导致整个客户端刷不出数据，呈崩溃状态。</li>
<li>设置了 cname 域名之后，客户端中的访问域名没有改，导致所有 JS 资源全部 403</li>
<li>似乎现在还不能通过 ejs 生成 单独的页面</li>
<li>官方的文档资源还可以更多一点</li>
</ul>
<h2 id="最后">最后</h2>
<p>其实作为一个才起步的程序，其完整程度已经做的很好，该有的基本都有了。而支持 Github 和 Coding 两个平台确实很友好，我在使用的过程中才发现 <code>Coing</code> 已经全部迁移到了腾讯云。好坏都有吧，好的是速度更快，也更稳定了，坏的可能就是国内的一大堆政策吧。希望以后支持更多的资源，持续看好！</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/theme" term="theme" label="Theme"/></entry><entry><title type="html">发一个 Office 365 家庭版的车</title><link href="https://nuoea.com/office-365/" rel="alternate" type="text/html"/><id>https://nuoea.com/office-365/</id><published>2019-11-11T10:47:00+00:00</published><updated>2019-11-11T10:47:00+00:00</updated><content type="html"><![CDATA[<h2 id="说明">说明</h2>
<p>发一个自用Office 365 家庭版的车，Office 365 是微软推出的办公软件订阅计划，包含了完整的 Office 应用程序（最新版 Word、Excel、PowerPoint、Outlook、Publisher、Access）以及 1TB 云存储空间的 OneDrive 服务。</p>
<p>家庭版的微软官方价格是498元/年。这次因为正好赶上活动，所以入手价格还是很划算的，最终价格是249 元/年（6人，每人5台设备，每人1T空间），平均1个人只需要 249 ÷ 6 = 41元</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/11/2.jpg" alt=""  /></p>
<h2 id="动态">动态</h2>
<ul>
<li>已经有一个小伙伴上车了。还有四个位置。</li>
</ul>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">奇葩说第六季了，可是依然好看到炸裂</title><link href="https://nuoea.com/you-can-u-bb/" rel="alternate" type="text/html"/><id>https://nuoea.com/you-can-u-bb/</id><published>2019-11-09T13:21:00+00:00</published><updated>2019-11-09T13:21:00+00:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>《奇葩说》第六季10月31日回归爱奇艺，节目第一期播出之后，豆瓣评分：8.6。这个分数其实在国综里面不算太高，但是当一档综艺办到第六季还能有这个分数，反正我是没见过。</p>
<p>看完第一期之后我才明白，也不得不感叹，这档节目之所以这么好看，这么受人喜欢，不是没有原因的啊。其原因可能正如毒Sir所说：</p>
<blockquote>
<p>这档综艺做了六季，它竟然还在成长。</p></blockquote>
<p>所以马东说想把奇葩说一季一季做下去，其信心来源，也正是这档综艺过硬的品质和内容吧。</p>
<h2 id="话题">话题</h2>
<p>其实前几季奇葩说让人印象深刻的，除了那几位BBKing以及燃到炸裂的辩论赛场之外，就是节目所流出的八卦种种，经常在微博热搜成为大家茶余饭后的谈资。</p>
<p>其实就我个人来看，很多的话题性其实是拉低了整个奇葩说的这个口碑的。比如说：</p>
<ul>
<li>第三季马薇薇在节目中高调宣告恋情，撕逼周玄毅前妻</li>
<li>第四季抱团老僵尸撕姜思达</li>
<li>第五季，董婧、傅首尔后台打架</li>
<li>第五季董婧表白邱晨被拒</li>
</ul>
<p>等等这些，让奇葩说似乎成为了一个提供各种新鲜八卦以及在没什么可说的无聊话题上找角度硬说的娱乐节目。但是我还是觉得输出想法和好的价值观才是这个节目应该做的，并且是这个节目最好看地方。而前面几季，为了炒热度，为了制造话题，牺牲了这些。</p>
<p>但是好在，第六季。我看到了这种改变。</p>
<h2 id="看点">看点</h2>
<p>陈铭、马薇薇缺席确实是一大遗憾。但是我发现这一季的选手整体水准都更强了。看点颇多:</p>
<ul>
<li>蔡康永、薛兆丰、罗振宇、李诞四位导师这一次要亲自带队打比赛</li>
<li>所有老奇葩的回炉重造，从1/2生存战开始打怪升级</li>
<li>更多有实力的新人、更残酷的赛制等</li>
</ul>
<h2 id="最后">最后</h2>
<p>其实追了这档综艺这么多年，感触最深的就是它会在不知不觉中影响自己。小到一档节目，大到这个社会，辩论与对抗当然是主体。但是在对抗之外的那些炙热的情感、那些分享和成长，大概就是人生最珍贵的东西吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/></entry><entry><title type="html">一组扁平风矢量插画设计</title><link href="https://nuoea.com/flat-illustration-design/" rel="alternate" type="text/html"/><id>https://nuoea.com/flat-illustration-design/</id><published>2019-11-08T20:00:00+00:00</published><updated>2019-11-08T20:00:00+00:00</updated><content type="html"><![CDATA[<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
</div>


<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/08/7.jpg" />
    </div>
  </div>
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/></entry><entry><title type="html">小米手表香的起来么？</title><link href="https://nuoea.com/about-xiaomi-watch/" rel="alternate" type="text/html"/><id>https://nuoea.com/about-xiaomi-watch/</id><published>2019-11-06T10:31:00+00:00</published><updated>2019-11-06T10:31:00+00:00</updated><content type="html"><![CDATA[<h2 id="发布">发布</h2>
<p>昨天下午14点整，小米正式发布了这款最近炒的火热的产品。整个发布会看下来，其实个人还是很赞同小米对智能手表的定义的，其有别于手环，它不应该仅仅只是一个用来看自己各项运动数据的配件，而应该是一个独立的，从某种程度上可以代替手机的这样一个东西。只是这个外观，真的是一言难尽。</p>
<h2 id="优势">优势</h2>
<table>
  <thead>
      <tr>
          <th>特点</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>独立eSIM虚拟卡</td>
          <td>能打电话，独立上网</td>
      </tr>
      <tr>
          <td>MIUI for Watch</td>
          <td>基于MIUI的手表生态系统</td>
      </tr>
      <tr>
          <td>十大运动模式</td>
          <td>FirstBeat 专业运动算法</td>
      </tr>
      <tr>
          <td>专业健康管理</td>
          <td>压力、睡眠、身体能量检测</td>
      </tr>
      <tr>
          <td>小爱同学智能助理</td>
          <td>100多种智能语音场景</td>
      </tr>
      <tr>
          <td>智能家居操控</td>
          <td>支持海量智能设备联动</td>
      </tr>
      <tr>
          <td>36H超长续航</td>
          <td>随时随地电量满满（感觉还是不够用）</td>
      </tr>
      <tr>
          <td>多功能NFC</td>
          <td>支持地铁公交、门禁卡</td>
      </tr>
  </tbody>
</table>
<h2 id="美图">美图</h2>
<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/06/4.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/10/3.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/06/3.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2019/11/06/2.jpg" />
    </div>
  </div>
  
</div>


<h2 id="后续">后续</h2>
<p>不过也有消息说：小米内部准备了一款小米手表Pro（原型表盘），预计跟小米MIX4 一起发布。真的喜欢这个产品的童鞋不妨再等等。</p>]]></content><category scheme="https://nuoea.com/categories/%E5%A5%BD%E7%89%A9" term="%E5%A5%BD%E7%89%A9" label="好物"/><category scheme="https://nuoea.com/tags/%E8%AF%84%E6%B5%8B" term="%E8%AF%84%E6%B5%8B" label="评测"/></entry><entry><title type="html">暴风播酷云黑群全攻略</title><link href="https://nuoea.com/baofeng-synology-note/" rel="alternate" type="text/html"/><id>https://nuoea.com/baofeng-synology-note/</id><published>2019-11-05T00:21:00+00:00</published><updated>2019-11-05T00:21:00+00:00</updated><content type="html"><![CDATA[<p>前段时间据说矿难，但具体有多惨我也不太清楚。只是闲鱼上多了很多所谓的矿机，真香的价格让我跟小伙伴们每人都入手了一台。</p>
<p>具体配置如下：</p>
<table>
  <thead>
      <tr>
          <th>名称</th>
          <th>品牌型号</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CPU&amp;主板</td>
          <td>ASROCK J3455-ITX</td>
      </tr>
      <tr>
          <td>内存</td>
          <td>DDR3 8G</td>
      </tr>
      <tr>
          <td>SSD</td>
          <td>威刚 64G</td>
      </tr>
      <tr>
          <td>HDD</td>
          <td>WD40EJRX 西数4T X 2</td>
      </tr>
      <tr>
          <td>网络接口</td>
          <td>千兆以太网卡</td>
      </tr>
      <tr>
          <td>功耗</td>
          <td>约25W</td>
      </tr>
  </tbody>
</table>
<p>这个配置还是非常不错的，和群晖918+一样的配置让其拿来做黑群是非常不错的选择。所以机器到了之后，就折腾了一番，几个月用下来，感觉真的超值。</p>
<h2 id="前期准备">前期准备</h2>
<ul>
<li>安装黑群晖的主机一台</li>
<li>SSD固态硬盘一块</li>
<li>WinPE U盘一枚</li>
<li>黑群晖二合一安装文件</li>
<li>Roadkil&rsquo;s DiskImage 工具（用于写入系统镜像到硬盘）</li>
<li>DiskGenius 硬盘分区工具</li>
</ul>
<h2 id="安装">安装</h2>
<ul>
<li>清除固态硬盘所有分区</li>
</ul>
<p>进入WinPE之后，使用硬盘工具DiskGenius将目标固态硬盘所有分区删除然后保存。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/04/11.jpg" alt=""  /></p>
<ul>
<li>写入黑群晖二合一安装文件到固态硬盘</li>
</ul>
<p>打开Roadkil&rsquo;s DiskImage软件。选择下载好的安装文件和选择好硬盘。这里要注意一定不要写错了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/04/10.jpg" alt=""  /></p>
<ul>
<li>使用</li>
</ul>
<p>接通电源开机，通过群晖助手或者浏览器输入http://find.synology.com查找群辉机器。就可以正常使用了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/04/12.jpg" alt=""  /></p>
<h2 id="资源">资源</h2>
<blockquote>
<p><a href="https://pan.baidu.com/s/16NNJkV2zn_bS_qC80KcHbA">点我下载 ( 提取码：3bix )</a></p></blockquote>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">组了一台 ITX 的黑苹果</title><link href="https://nuoea.com/asrock-itx-hackintosh/" rel="alternate" type="text/html"/><id>https://nuoea.com/asrock-itx-hackintosh/</id><published>2019-11-04T00:34:00+00:00</published><updated>2019-11-04T00:34:00+00:00</updated><content type="html"><![CDATA[<h2 id="hackintosh">Hackintosh</h2>
<p>其实攒这台机器的初心主要是手里的Macbook Pro 2015 性能越来越吃紧了。但是工作的需要，对于机器性能的需求却越来越多。看了下白果劝退的定价，果断还是选择 Hackintosh 了。</p>
<p>其实现在的 Hackintosh 早已不是以前的小众选择。正如知乎上的一位知友所说：</p>
<blockquote>
<p>如果你需要一台高性能的Mac，那么 Hackintosh 可能是现阶段最好的选择。</p></blockquote>
<p>对于从事开发和设计工作的人来说，Mac 流畅的体验和成熟的交互确实让人省心，作为长期使用Mac办公的人来说，这可能就是用了就回不去的一种体验。</p>
<h2 id="配置">配置</h2>
<table>
  <thead>
      <tr>
          <th>名称</th>
          <th>品牌型号</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CPU</td>
          <td>Intel i7 8700</td>
      </tr>
      <tr>
          <td>主板</td>
          <td>华擎 Z390 Phantom Gaming itx/ac</td>
      </tr>
      <tr>
          <td>散热</td>
          <td>猫头鹰（NOCTUA）NH-L9i</td>
      </tr>
      <tr>
          <td>内存</td>
          <td>金士顿骇客神条 8G x 2</td>
      </tr>
      <tr>
          <td>SSD</td>
          <td>西部数据 SN500 500G</td>
      </tr>
      <tr>
          <td>机箱</td>
          <td>追风者 MG210 ITX 侧透 RGB</td>
      </tr>
      <tr>
          <td>电源</td>
          <td>海盗船 SF600 SFX</td>
      </tr>
      <tr>
          <td>无线/蓝牙</td>
          <td>博通 BCM94360CS2</td>
      </tr>
      <tr>
          <td>显卡</td>
          <td>蓝宝石 RX580 超白金</td>
      </tr>
      <tr>
          <td>显示器</td>
          <td>LG 27UL600 4k HDR400 IPS</td>
      </tr>
  </tbody>
</table>
<h2 id="兼容情况">兼容情况</h2>
<blockquote>
<p>使用完美</p></blockquote>
<pre tabindex="0"><code>- macOS 版本
    - 10.14.4
    - 10.14.5
    - 10.14.6
- 显卡（DisplayPort 接显示器）
    - Intel UHD630 核显
    - AMD RX580
- 声卡(Realtek ALC1220)
    - 主板后置
    - 机箱前置
    - DisplayPort 声音输出
- 睡眠/唤醒
- 有线网卡
- 无线WI-FI
- 蓝牙
    - 耳机
    - Trackpad 2
    - Airdrop
    - Handoff
- 所有 USB 插口
</code></pre><blockquote>
<p>使用不完美</p></blockquote>
<pre tabindex="0"><code>- 雷电 3 接口
</code></pre><p><img class="lozad" data-src="https://i.nuoea.com/img/2019/11/04/7.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/hackintosh" term="hackintosh" label="Hackintosh"/></entry><entry><title type="html">关于免费通配符证书</title><link href="https://nuoea.com/lets-encrypt-ssl/" rel="alternate" type="text/html"/><id>https://nuoea.com/lets-encrypt-ssl/</id><published>2019-11-01T13:50:00+00:00</published><updated>2019-11-01T13:50:00+00:00</updated><content type="html"><![CDATA[<h2 id="说明">说明</h2>
<p>Let&rsquo;s Encrypt 是国外一个公共的免费SSL项目，由 Linux 基金会托管，它的来头不小，由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起，目的就是向网站自动签发和管理免费证书，以便加速互联网由 HTTP 过渡到 HTTPS，目前 Facebook 等大公司开始加入赞助行列。</p>
<p>Let&rsquo;s Encrypt 已经得了 IdenTrust 的交叉签名，这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任，用户只需要在 Web 服务器证书链中配置交叉签名，浏览器客户端会自动处理好其它的一切，Let&rsquo;s Encrypt 安装简单，使用非常方便。</p>
<h2 id="使用-certbot">使用 certbot</h2>
<ul>
<li>1、获取工具</li>
</ul>
<pre tabindex="0"><code>wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
</code></pre><ul>
<li>2、获取证书</li>
</ul>
<pre tabindex="0"><code>./certbot-auto certonly  -d 你的域名 -d *.你的域名 --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
</code></pre><ul>
<li>3、配置解析
Certbot 要求给域名配置一条 TXT 记录，在没有确认 TXT 记录生效之前不要回车执行。配置好之后就可以看到证书文件被生成。剩下的只需要通过SCP等方法下载就好了。</li>
<li>4、重要说明
上述有三个交互式的提示：</li>
</ul>
<blockquote>
<p>是否同意 Let&rsquo;s Encrypt 协议要求
询问是否对域名和机器（IP）进行绑定
输入邮箱，给你发送一封验证邮件
确认同意才能继续。</p></blockquote>
<ul>
<li>5、证书更新
证书有效期为三个月，到期之前需要更新证书，更新流程就是重新执行一遍上面的操作，新证书会在你申请证书的日期上加三个月。</li>
</ul>
<h2 id="使用-freessl">使用 <a href="https://freessl.cn/">Freessl</a></h2>
<p>Freessl 是一个申请免费证书的网站，如果觉得自己敲代码太麻烦，可以使用这个网站获取SSL证书。网站提供TrustAsia和Let&rsquo;s Encrypt两种证书选择。获取证书的操作也比较的简单，按照步骤一直下一步就可以了，没有什么学习成本。
值得一提的是，通过网站获取的通配符证书有效期也是三个月。如果到期之后，网站也提供了自动续期的功能，不过是需要收费的。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">整站图床更换</title><link href="https://nuoea.com/replace-image-space/" rel="alternate" type="text/html"/><id>https://nuoea.com/replace-image-space/</id><published>2018-11-23T17:09:00+00:00</published><updated>2018-11-23T17:09:00+00:00</updated><content type="html"><![CDATA[<p>认真算起来，好久没有码字了。其实最近也不算忙，有点时间吧就喜欢折腾。最近搞了几个便宜VPS，从 <code>OneIndex</code> 开始，把几乎所有自搭网盘的程序都玩了一遍。比如说还在开发的 <code>Cloudreve</code>、口碑比较好的 <code>Nextcloud</code> 以及 <code>Seafile</code> 。都装着体验了一把。发现体验最好的是 <code>Seafile</code> 。</p>
<h2 id="seafile">Seafile</h2>
<p>这个程序在百度一搜，推荐的人有大把。安装也很简单。官方Github上有个SNAP一键安装包。SSH连上主机代码贴上去几分钟就给你搞好了。说说这个程序的优点：</p>
<ul>
<li>稳定</li>
<li>安全</li>
<li>方便</li>
</ul>
<p>稳定就不多说了，毕竟运行了这么多年。安全方面，因为是加密存储，所以挂载的文件目录上是看不到任何文件列表的。有利有弊吧。就安全来说，绝对是挺值得推荐的。再说方便，丰富的客户端是必须的。而且还支持 <code>WebDAV</code> 协议，管理文件挺方便。</p>
<p>整个程序用下来，觉得体验真的蛮好的。因为便宜VPS容量一般都不大，挂载OSS等对象存储一个是需要专业版，在一个收费也不便宜。所以都有想在家里的linux主机上布一个本地的服务，然后通过内网穿透解析道外网域名访问。所以又跑去看内网穿透。</p>
<h2 id="frp">FRP</h2>
<p>FRP是一个开源的内网穿透服务，有个VPS就能架服务器，原理也蛮简单。VPS上放一个服务端。Linux主机上放一个客户端。通过端口映射来达到公网IP + 对应端口来访问内网地址。有兴趣的小伙伴可以研究。</p>
<blockquote>
<p><a href="https://github.com/fatedier/frp">FRP</a></p></blockquote>
<p>值得一提的是，如果路由器可以刷 <code>openwrt</code> 等固件的话，可以吧 <code>FRP</code> 客户端放在路由器上。体验就更好了。</p>
<h2 id="图床">图床</h2>
<p>不过 <code>Seafile</code> 这个程序用来做网盘存放文件确实是蛮好的。但是如果用来做图床还是不行。本来我的图床一直是用的七牛云，速度也挺快，免费空间也有个10G。用着一直挺好的。不过前两天看V站大佬们讨论。说是七牛云的CDN没有阀值设置，万一被恶意攻击，一晚上可能就要卖一套海景别墅。看的我是一身冷汗。有相应阀值设置的对象存储服务比如说良心云的OSS收费又太贵。</p>
<p>没办法最后想来想去，发现用<code>Oneindex</code> 来做图床效果还可以，流量用的是 onedrive ，容量也够大，还不收钱。暂时可以满足需求了。等过两天发现了更好的服务在分享给大家吧。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">跟小伙伴的青岛行</title><link href="https://nuoea.com/qingdao-with-friend/" rel="alternate" type="text/html"/><id>https://nuoea.com/qingdao-with-friend/</id><published>2018-11-04T00:00:00+00:00</published><updated>2018-11-04T00:00:00+00:00</updated><content type="html"><![CDATA[<p>因为公司所在行业的一个展会最近在青岛召开。所以跟着公司的小伙伴们一起去了一次青岛。第一次去到这个广受好评的城市，内心还是蛮激动的，在飞机上就在期待当地的美食以及有可能会发生的故事。</p>
<h2 id="展会">展会</h2>
<p>过去还是要干活的哈，前三天都在展会站台。一站一天，晚上回到酒店基本啥都不想，倒在床上就睡了，所以博客一直也就没有办法更新。不过开心的是，认识了一些新的小伙伴。有积极上进的志愿者，也有兄弟公司的小可爱。还有一些很暖很暖的约定，你们都可别忘了。</p>
<p>展会一直进展的很顺利。也得到了很多上镜的机会，相信还在看新闻联播的小伙伴应该都有看到过。</p>
<h2 id="住宿">住宿</h2>
<p>过去虽然是干活，但是攻略还是要做的哈。精挑细选了一条好评率最高的路线之后，住宿就是个比较头疼的问题了。最后想，既然难得来一次，不然就奢侈点住个好一点的民宿。就这么住下来了。</p>
<p>住的地方靠近海边，环境真的挺棒的。停车还免费。真心觉得这群小伙伴挺靠谱，跟着他们玩真省心。</p>
<h2 id="行程">行程</h2>
<p>因为展会占据了三天的时间。留给我们去欣赏这个城市的时间只剩下一天半，不过在我们浓缩版精华攻略的指导下，我们还是完成了栈桥到五四广场，台东小吃到青岛散啤的全方位体验。</p>
<p>最后上点图片吧。</p>
<div class="row">
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2018/11/04/58746122.jpg"  />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2018/11/04/52409635.jpg" />
    </div>
  </div>
  
  
  <div class="col-6 col-md-3 mb-3">
    <div class="feature shadow">
      <img class="feature-link lozad" src="/img/loading.svg" data-src="https://i.nuoea.com/img/2018/11/04/60222105.jpg" />
    </div>
  </div>
  
  
</div>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E6%97%A5%E5%B8%B8" term="%E6%97%A5%E5%B8%B8" label="日常"/><category scheme="https://nuoea.com/tags/%E6%97%85%E8%A1%8C" term="%E6%97%85%E8%A1%8C" label="旅行"/></entry><entry><title type="html">开启博客视觉系统升级计划</title><link href="https://nuoea.com/start-vision-plan/" rel="alternate" type="text/html"/><id>https://nuoea.com/start-vision-plan/</id><published>2018-10-29T12:16:03+00:00</published><updated>2018-10-29T12:16:03+00:00</updated><content type="html"><![CDATA[<p>搬到 Bitcron 来之后一切都很满意。全新的写作体验，真的可以让人找回一开始写博的那种状态。要说唯一的遗憾，可能就是 Bitcron 提供的主题模版太少了，不过也正如官方文档所说，现在折腾这种静态博客的人，大多数都是有一定动手能力的吧。所以当时就想，有时间就自己写一个吧，也不是什么大问题。恰好上个周末有空，就花了两天的时间，把这个设计落地了。</p>
<h2 id="初心">初心</h2>
<p>第一次尝试制作主题，是在16年的时候，那时使用的程序是Typecho。之后因为各种各样的问题，博客打理得少，更新的就更少了。所以博客的视觉系统就一直停留在那个时候。而这两年，出现了太多好的设计语言。所以在接触到 Bitcron 之后，就想要去尝试更好的视觉效果了。</p>
<p>所以，在熬过了最初的适应期之后，心思就开始活泛起来了。一点点的看官方的文档，同时一点点的开始画网页的原型。可能是因为工作的关系吧。最近因为公司的项目有了解到阿里的 <code>Ant Design</code> 这个项目。越是接触，这个项目就越是深得我心。觉得这套框架的交互做的实在是太棒了。以至于我常常在公司的时候都会想：</p>
<blockquote>
<p>如果这套框架拿来做个人主页，体验应该也很不错吧！</p></blockquote>
<p>当时只是灵光一闪。其实心里也明白这种类似后台 <code>Dashboard</code> 的框架拿来做前端展示，肯定有很多需要修改的结构。在画原型的过程中，也一度陷入僵局，多次打算放弃。所幸，还是坚持完成了。</p>
<h2 id="设计">设计</h2>
<p>我比较享受整个设计的过程。虽然水平有限，但还是乐在其中。虽然有着设计规范的约束，有着市场需求的压力。但是在天马行空的想象中，寻找到的最合适的设计，无不体现着设计师的智慧和关怀。这是我热爱它的原因。</p>
<h2 id="方案一">方案一</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/29/86761214.jpg" alt=""  /></p>
<hr>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/29/87559289.jpg" alt=""  /></p>
<blockquote>
<p>设计稿持续更新</p></blockquote>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/vi" term="vi" label="VI"/><category scheme="https://nuoea.com/tags/hugo" term="hugo" label="Hugo"/></entry><entry><title type="html">极路由B70刷老毛子Padavan固件全过程</title><link href="https://nuoea.com/hiwifi-b70-padavan/" rel="alternate" type="text/html"/><id>https://nuoea.com/hiwifi-b70-padavan/</id><published>2018-10-21T00:00:00+00:00</published><updated>2018-10-21T00:00:00+00:00</updated><content type="html"><![CDATA[<p>在折腾酸酸乳的时候，无意中看到的这个固件，说是可以用路由器直接挂载酸酸乳，比较感兴趣，就到恩山论坛注册了账号翻了翻帖子。因为手上在用的主路由是小米的PRO，偶尔会有不稳定，但也不是什么大事。比较不爽的是，总是会弹分享路由得金币乱七八糟的广告，所以寻思如果有固件，刷成第三方也蛮好的。只是比较遗憾的是，并没有找到这个路由器的固件，却看到荒野无灯出了极路由B70的padavan固件。想到正好有个B70在家吃灰。就翻出来折腾了。</p>
<p>整个折腾过程不算太难，搞过VPS的基本都能走下来。只是B70这个机器现在比较麻烦的是解锁的过程，很多的教程都失效了。我也是在不断的尝试中，找到了一个现在还能用的解锁方式。</p>
<h2 id="解锁">解锁</h2>
<p>现在官方最新的固件版本号是：1.4.8.20462s 。 这个版本是不能解锁SSH的。唯一的办法就是降级。现在降级的固件在网上也几乎找不到了。分享一下：</p>
<blockquote>
<p>下载 ：<a href="https://pan.nuoea.com/tools/padavan/b70/B70%E5%AE%98%E6%96%B9%E5%9B%BA%E4%BB%B6/2.142baf.zip">2.142baf</a></p></blockquote>
<p>降级过程：</p>
<ul>
<li>拔掉路由电源。</li>
<li>用网线将极路由 LAN 口与电脑网口相连，刷机路由器无需联网，有无线网卡的建议将电脑的无线禁用。</li>
<li>按住极路由 RESET 不放，然后插上电源。</li>
<li>5秒之后松开 RESET，等待本地连接自动获取IP，网关IP为变为192.168.2.1。</li>
<li>浏览器中输入 192.168.2.1 选择降级固件刷机。</li>
<li>刷机完成，网关变成192.168.199.1。</li>
</ul>
<p>到此降级成功。如果中途有地方卡住了，可以重新再来一次。<code>注意：刷机降级有风险，请谨慎操作！！！</code></p>
<h2 id="获取权限">获取权限</h2>
<p>这里需要用到的工具是 <code>WINSCP</code>。具体过程如下：</p>
<ul>
<li>在极路由官方云插件平台中，下载vsftpd插件， 并设置好。</li>
<li>WinSCP登录FTP, 密码为路由器后台密码。</li>
<li>把破解文件拖入上传。</li>
<li>在极路由官方云插件平台中，安装 定时重播 插件。当前已经下架, 可点击任意一个软件，然后在该软件的浏览器网址中找到sid号码，并把sid号码改成118284854安装。</li>
<li>在自定义规则中填入： *  * * * * sh /tmp/storage/2.sh ，并启动。</li>
<li>回到 WinSCP 软件，  过1分钟左右， 点击刷新按钮。</li>
<li>用putty或者xshell ssh登录。用户名：root ，密码：路由器后台密码，端口：22</li>
</ul>
<p>到此为止整个路由器的准备工作都完成了。剩下的就是刷固件了。</p>
<h2 id="备份固件">备份固件</h2>
<p>一定要记得备份，如果以后想要刷回官方固件，备份文件就特别重要了。关键的时候，还可以用来救砖。</p>
<pre tabindex="0"><code>root@Hiwifi:/tmp# cat /proc/mtd //命令说明：查看原固件分区信息
dev: size erasesize name
mtd0: 00080000 00020000 &#34;u-boot&#34;
mtd1: 00080000 00020000 &#34;debug&#34;
mtd2: 00040000 00020000 &#34;Factory&#34;
mtd3: 02000000 00020000&#34;firmware&#34;
mtd4: 00180000 00020000 &#34;kernel&#34;
mtd5: 01e80000 00020000 &#34;rootfs&#34;
mtd6: 00080000 00020000&#34;hw_panic&#34;
mtd7: 00080000 00020000 &#34;bdinfo&#34;
mtd8: 00080000 00020000 &#34;backup&#34;
mtd9: 01000000 00020000 &#34;overlay&#34;
mtd10: 02000000 00020000&#34;firmware_backup&#34;
mtd11: 00200000 00020000 &#34;oem&#34;
mtd12: 02ac0000 00020000 &#34;opt&#34;
root@Hiwifi:~# dd if=/dev/mtd0 of=/tmp/u-boot.bin //命令说明：备份打包mtd0为u-boot.bin文件到tmp目录下
1024+0 records in
1024+0 records out
root@Hiwifi:~# dd if=/dev/mtd2 of=/tmp/Factory.bin//命令说明：备份打包mtd2为Factory.bin文件到tmp目录下
512+0 records in
512+0 records out
root@Hiwifi:~# dd if=/dev/mtd3 of=/tmp/firmware.bin//命令说明：备份打包mtd3为firmware.bin文件到tmp目录下
65536+0 records in
65536+0 records out
root@Hiwifi:~#
</code></pre><p>其它mtd文件也可以全部备份到tmp目录下。使用winscp工具，scp连接路由器，192.168.199.1。用winscp工具把备份的/tmp/*.bin原厂固件下载到本地电脑备用。</p>
<h2 id="备份mac地址">备份MAC地址</h2>
<p>MAC地址规则及示例：</p>
<pre tabindex="0"><code>WAN MAC：在LAN的基础上最后一位加1，具体以固件内看到的为准。示例：D4:EE:07:32:84:23
LAN MAC：机器背面的MAC地址即LAN地址，也可以进官方固件查看。示例：D4:EE:07:32:84:22
2.4G MAC：同LAN MAC，也可以用WirelessMon软件查看。示例：D4:EE:07:32:84:22
5G MAC：可以用WirelessMon软件查看，与2.4GMAC区别是第二位不同。示例：D0:EE:07:32:84:22
</code></pre><h2 id="刷入-breed">刷入 breed</h2>
<p>breed 就类似于安卓手机上的 Recovery 。刷上了这个，之后路由器在想刷什么固件都不用担心变砖。</p>
<p>过程也是很简单。</p>
<ul>
<li>用 WINSCP 工具将 breed.bin 文件复制到路由tmp目录。</li>
<li>输入命令：root@Hiwifi:～# cd /tmp</li>
<li>输入命令：root@Hiwifi:/tmp# mtd breed.bin u-boot</li>
<li>输入命令：root@Hiwifi:/tmp#mtd erase firmware_backup</li>
<li>reboot</li>
</ul>
<h2 id="刷入-padavan">刷入 padavan</h2>
<p>最后就是刷固件了。</p>
<ul>
<li>路由器抜电源，长按复位键，不要松开。</li>
<li>插上电源，5秒后松开复位键，浏览器输入：192.168.1.1。</li>
<li>上传 padavan 固件，点恢复固件。</li>
</ul>
<h2 id="最后">最后</h2>
<p>刷好之后重启一次，就可以登录路由器了。登录之后别忘了还要双清一次。然后恢复MAC地址。之后就可以享受新固件带来的乐趣了。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">推荐一家免费的主机</title><link href="https://nuoea.com/recommend-free-host-youjiazhuji/" rel="alternate" type="text/html"/><id>https://nuoea.com/recommend-free-host-youjiazhuji/</id><published>2018-10-18T00:00:00+00:00</published><updated>2018-10-18T00:00:00+00:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>其实搬到 Bitcron 来之后。之前的 VPS 就没有怎么用了，来年也不准备再续费。但是还有一些项目是需要用到PHP环境，如果单独再去为此续费又觉得有点不划算。想到之前发现的一个免费的主机，好像有两年了吧，还是运行的很稳定。正好最近折腾 DISQUS ，需要用到一台境外的PHP主机，就翻出来用了一下，发现效果还蛮好，就推荐一下。</p>
<h2 id="有家主机">有家主机</h2>
<blockquote>
<p>从2009年开始，有家主机的前身优比特免费空间以为没有支付手段的学生站长提供建站空间为目标，为草根站长提供了一个实现创意的园地。今天，有家主机坚持通过稳定性与可靠性的拓展，将能够满足所有用户需求的高质量及高附加值服务向整个IDC行业普及。</p></blockquote>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/18/2.png" alt=""  /></p>
<p>大致的介绍都在上面了。</p>
<p>其实就实际的体验来说，确实超出预期。CP面板，该有的功能也都有。访问速度也可以接受。关键还很稳定，而且免费，还要啥自行车。</p>
<h2 id="最后">最后</h2>
<p>最后贴上地址：</p>
<blockquote>
<p><a href="https://www.youjiazhuji.com">有家主机</a></p></blockquote>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">Bitcron 科学使用 Disqus</title><link href="https://nuoea.com/bitcron-use-disqus/" rel="alternate" type="text/html"/><id>https://nuoea.com/bitcron-use-disqus/</id><published>2018-10-17T00:00:00+00:00</published><updated>2018-10-17T00:00:00+00:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>其实说到评论，老实讲 Bitcron 自带的评论还算好用，简单明了，该有的功能也都有。访问速度也没有问题。只是对于 Bitcron 来讲，所有的评论都是以一个个单独的 csv 文件的形式存在，然后存放在一个叫做 -comment 的文件夹里。从别的地方导入进来吧，很容易。但是想导出去好像我还没有找到办法。</p>
<p>于是，思来想去就想换了。但是现在能用的不多，好用的插件，要么就关闭服务了，要么就被挡住了。直到昨天，逛到朋友的站，讲到了可以科学的使用Disqus，利用 API 可以愉快的在圈内玩耍。立马就被种草了。</p>
<h2 id="过程">过程</h2>
<p>翻了教程，整个项目跑下来其实不难，制作这个项目的大神在 Github 里面其实已经说的很详细了。我就记录一下在 Bitcron 中使用这个项目的关键点。</p>
<ul>
<li>因为 Bitcron 是静态托管服务，所以如果想使用这个项目，你需要一台支持 PHP 的境外主机，国内的不行。</li>
<li>对于主机的PHP版本有要求，不能低于 5.6+</li>
<li>因为 Bitcron 默认是开启 SSL 服务的。所以存放项目文件的链接也要开启 SSL 服务，不然会有跨域的报错问题。</li>
<li>Bitcron 预留了 第三方评论的设置接口。直接在  Dashboard - 呈现 中 粘贴前端代码就可以。</li>
</ul>
<h2 id="最后">最后</h2>
<p>贴上大神的网址：</p>
<blockquote>
<p><a href="https://blog.fooleap.org/">fooleap</a></p></blockquote>
<p>以及项目的 Githu 地址：</p>
<blockquote>
<p><a href="https://github.com/fooleap/disqus-php-api">Disqus-php-api</a></p></blockquote>
<p>有兴趣的小伙伴可以折腾一下。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">这是一个值得期待的新赛季</title><link href="https://nuoea.com/rocket-new-season/" rel="alternate" type="text/html"/><id>https://nuoea.com/rocket-new-season/</id><published>2018-10-03T00:00:00+00:00</published><updated>2018-10-03T00:00:00+00:00</updated><content type="html"><![CDATA[<p>这个休赛期。火箭的操作还是很积极的。尽可能的去补强自己的弱点，针对上个赛季所暴露出来的问题，去改善自己的阵容。所以对于这个赛季，这套全新的阵容。大家都十分期待。熬过了漫长的长草期。日思夜盼，新赛季总算是开始了。虽然只是一场季前赛。但新赛季的这只火箭队还是让人眼前一亮。</p>
<h2 id="甜瓜">甜瓜</h2>
<p>甜瓜首秀打的相当高效，跟上赛季的感觉完全不同了，这么写似乎有开会的嫌疑。不过甜瓜打的是真的开心，50%的命中率也很能说明问题。不过看得出来甜瓜依然在努力的融入新的战术体系。今天的表现很惊艳。攻守都没问题。期待后期有更亮眼的发挥。</p>
<h2 id="恩尼斯">恩尼斯</h2>
<p>作为顶替铁瓜的新防守大闸。恩尼斯还是有两把刷子的。今天效率也不错。防守端的默契还有待加强。不过防守意识在这。配合鞋王相信可以让换防更具压迫感。</p>
<h2 id="麦卡威">麦卡威</h2>
<p>今天的表现真的亮眼，毕竟真人类首秀精华。练出投篮就更好了。不过现在的角色：稳定的持球点，突破点，和防守。已然是非常满意。不能要求更多。希望稳定提供火力。让炮可以多休息。</p>
<h2 id="巴西杜兰特">巴西杜兰特</h2>
<p>这个身体素质真的是爆表，应该是捡到宝了。恐怖的臂展在完全可以放在五小里面打五号位。希望这个赛季跟着灯泡好好练吧。看好可以打出来。</p>
<h2 id="eg">EG</h2>
<p>圆脸还是一如即往的稳。虽然说最近卷入交易风波，但丝毫没有收到影响。我一直以来也都觉得，圆脸是相较巴特勒更适合这个体系的存在。当然巴特勒的能力也是毋庸置疑。</p>
<h2 id="最后">最后</h2>
<p>其实通过这场球，还是看出来不少的东西。比如说，虽然走了防守教练，但无限换防依然稳定的运行，还有三分线外46次出手，命中21求。这都还是我们熟悉的那只火箭。</p>
<p>所以我们有理由相信。这只阵容深度更加强大，天赋更加恐怖的火箭队可以走的更远。给我们更多惊喜~</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/><category scheme="https://nuoea.com/tags/nba" term="nba" label="NBA"/><category scheme="https://nuoea.com/tags/%E7%81%AB%E7%AE%AD" term="%E7%81%AB%E7%AE%AD" label="火箭"/><category scheme="https://nuoea.com/tags/%E5%93%88%E7%99%BB" term="%E5%93%88%E7%99%BB" label="哈登"/></entry><entry><title type="html">写在RNG的S8前夕</title><link href="https://nuoea.com/before-the-rng-s8/" rel="alternate" type="text/html"/><id>https://nuoea.com/before-the-rng-s8/</id><published>2018-10-02T20:59:11+00:00</published><updated>2018-10-02T20:59:11+00:00</updated><content type="html"><![CDATA[<p>关注LOL赛事的朋友都知道，今年对于RNG对于UZI来说注定是不同寻常的一年，也是收获满满的一年。今年的RNG有多强势，看看他们拿的冠军数量就知道了，只剩下一个S8，RNG就可以在今年完成大满贯的传奇。这对于中国电竞产业，对于LPL都可以说是说意义重大吧，虽然我们已经在今年的亚运会上证明了我们的实力。只是S8，这座大山，对于RNG和UZI来说，意义格外不同吧。</p>
<h2 id="今年的rng">今年的RNG</h2>
<p>相比往常几年，今年的韩国人明显慌神了。SKT全员掉线，而RNG今年的强势发挥，似乎无法阻挡。Gen.G的主教练也在论坛上说：</p>
<blockquote>
<p>RNG是最难对付的对手，当我们遇到RNG，比赛从来没有按照我们的节奏去进行。主要的原因是RNG的下路真的很强，RNG将会是S8中最难以对付的对手。</p></blockquote>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/02/42706601.jpg" alt=""  /></p>
<p>而就在近期。据网友爆料，UZI在韩服训练的时候被各种演，也许正是因为这种恐慌情绪的蔓延，才会让韩国人这样失去理智吧。据说，就在昨天，UZI韩服训练再次被演，第一局被骂PIG，第二局被奶妈明演，他们的行为引起极度不适，而UZI这次并没有说什么，而是把ID成“rangquansjkkkr”，KR是韩国的简写，这句拼音翻译过来的意思就是让全世界看看韩国。</p>
<h2 id="uzi">UZI</h2>
<p>就像UZI在夏季赛夺冠的那个夜晚说的一样：</p>
<blockquote>
<p>既然今年这么顺。那S8的冠军是我们的！</p></blockquote>
<p>这么多年。对于UZI来说，无冕之王可能是最让人感到心疼的一个称号。公认的世界第一ADC，却没有任何一个冠军奖杯为其统治地位助力。反而是成为了很多人讽刺挖苦的依据。相信小狗心里远没有其脸上的表情看起来那么云淡风轻。今年的爆发，其实仔细想想也不奇怪，就像昨天看到火箭的德安东尼教练说的：</p>
<blockquote>
<p>那扇门会开的，你要一直扣响它。</p></blockquote>
<p>所以今年说是厚积薄发也好，说是命运使然也好。今年的RNG给了我们太多惊喜，那么。就在这个十月，好好加油吧。让这段传奇，继续下去！</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/02/86910825.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/></entry><entry><title type="html">聊聊黑莓的工业设计</title><link href="https://nuoea.com/best-design-blackberry/" rel="alternate" type="text/html"/><id>https://nuoea.com/best-design-blackberry/</id><published>2018-10-01T00:00:00+00:00</published><updated>2018-10-01T00:00:00+00:00</updated><content type="html"><![CDATA[<p>其实说到黑莓，不得不说那块全键盘的设计，这确实是这个品牌最好的象征。这快键盘可以说是见证了这家公司的成功和落寞。让人唏嘘不已。</p>
<h2 id="写在前面">写在前面</h2>
<p>黑莓的最辉煌的时代，总统站台，政商背书，可谓是意气风发，一时无两。只是这个行业的发展速度真的太快了。快到可能你都来不及去看看自己所制造的这一场狂欢，属于你的时代就过去了。 07年苹果的发布会是一场颠覆，对于整个世界都是，对于黑莓同样是。只不过那个时代的我们似乎都没有意识到人们对于手机的需求，会是一块越来越大的屏幕。所以黑莓的这块打磨的体验完美到极致的物理全键盘就成了鸡肋。</p>
<p>所以从辉煌到落寞。这些年黑莓的日子并不好过。不过好歹还是磕磕绊绊的过来了。人们好像也对千篇一律的手机设计感到了厌倦。从曲面屏设计到全面屏设计，再到刘海屏设计。其实从美感上来说，是一种倒退。但是<code>设计</code>本来就是千万种选择的一种妥协。受制于工艺、材料、成本方方面面的牵制。所以设计推动行业发展的这个理念我是比较赞同的。因为人对于美感的最求是一种本能。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2018/10/01/10064706.jpg" alt=""  /></p>
<h2 id="最后">最后</h2>
<p>于是我们看到，这个时候的黑莓。还是坚持着在我们看来反潮流的工业设计。却吸粉无数。大概是这么多年。大家都太需要一点不一样的新鲜感了吧。抛开主流的配置来说，这部KEY2各方面的体验都很完美。只是骁龙660的平台卖到3999的价格。确实让人有点薪尽自然凉的赶脚。不过就算我们不谈情怀，这部手机的颜值还是数一数二的。商务场合使用，性能也完全够用。毕竟这个看脸的时代。好看什么的最重要了。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/><category scheme="https://nuoea.com/tags/blackberry" term="blackberry" label="BlackBerry"/></entry><entry><title type="html">福特SYNC3系统升级记录</title><link href="https://nuoea.com/ford-sync-update/" rel="alternate" type="text/html"/><id>https://nuoea.com/ford-sync-update/</id><published>2018-09-30T00:00:00+00:00</published><updated>2018-09-30T00:00:00+00:00</updated><content type="html"><![CDATA[<p>这两年随着互联网的发展，我们能够看到的各块屏幕几乎都被占领了，车载导航的这块屏幕也不例外，各大互联网公司以及传统车企纷纷推出自己的车机系统，加强用户粘性。</p>
<p>当然这里面鱼龙混杂，有做的好的，也有用着扎心的，就不细说了。比较出名的其实说来说去也就两个产品。一个是苹果的<code>CarPlay</code>，还有一个就是谷歌推出的 <code>Andtoid auto</code>。</p>
<p>基于行业良好的口碑和对行业整体的掌控力，苹果在推广<code>CarPlay</code>方面可以说一直是顺风顺水。而跟IOS无缝对接的良好体验也是<code>CarPlay</code>非常迷人的地方。只是痛点一直都是第三方的APP支持的较少，可能也跟苹果早期开放的权限不足有关。好在IOS12之后，常用的APP都可以使用了。高德导航、网易云等等。</p>
<p>而 <code>Andtoid auto</code>的使用体验么，应该是不错的。只是因为大家都懂的原因，现在没法用，所以暂且不说。</p>
<p>除此之外，就是传统车企对自身旗下车型定制的车机系统了。这类产品多数都比较难用。只能说在产品设计之初，其设计初衷可能就背离了用户体验吧。</p>
<h2 id="说说-sync3">说说 SYNC3</h2>
<p>说到福特的这套<code>SYNC3</code>，其实还是觉得很神奇的。这套系统人性化的地方在于，好像是他们承认自己做的系统不好用，所以干脆就把市场上好的都集成到一起，然后统统塞给你一样。反正我是欣然接受了这种略微讨巧的做法。</p>
<p><code>SYNC3</code>集成了苹果的<code>CarPlay</code>和谷歌的<code>Android Auto</code> ，所以不管是处在什么生态圈，都可以拥有比较好的使用体验。最近也是听说，最新的系统支持了百度的<code>CarLife</code>。所以激起了升级的欲望。</p>
<h2 id="升级">升级</h2>
<p>升级过程还是略坑。有很多的细节在官方的升级文档中都没有注明。所以只能自己在无数次升级失败中摸索了。大致过程如下：</p>
<ul>
<li>
<p>福特官网找到相关的页面注册，邮箱收到链接，就可以直接下载。下载挺快，解压直接复制到U盘。</p>
</li>
<li>
<p>不用启动车，插到车里会提示系统正在升级，时间大概25分钟。之后提示第一阶段升级好，下次启动车辆第二段升级。（注意：不要拔下U盘，开门下车锁车，不然提示失败！）</p>
</li>
<li>
<p>再开门上车，启动车辆再次提示在升级中，耗时20分钟，建议跑短途时操作，耐心等待，提示拔掉U盘，下次启动时升级成功。</p>
</li>
</ul>
<p>然后就可以愉快的玩耍了。</p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">写在新赛季开始之前</title><link href="https://nuoea.com/before-start-season/" rel="alternate" type="text/html"/><id>https://nuoea.com/before-start-season/</id><published>2018-09-29T00:00:00+00:00</published><updated>2018-09-29T00:00:00+00:00</updated><content type="html"><![CDATA[<p>上个赛季对于火箭来说，无疑是成功的。新的阵容，新的队友，新的球队文化以及新的球队老板。一切都似乎朝着好的方向在走，也会让人联想到94-95赛季那支意气风发的火箭。虽然结果并没有如我们想象的那样完美。但别忘了，这只是他们的第一个赛季而已。</p>
<p>上个赛季的火箭似乎一直都在打破人们的固有印象以及自身的枷锁。从赛季初的不被看好，到连续的创造了两个连胜纪录。也许就像骚炮说的：</p>
<blockquote>
<p>我就是打球</p></blockquote>
<p>到最后，一路涨球，直到让保罗摸到日思夜想的西决地板，我相信那一刻所有的保罗的球迷都是心怀感动的，毕竟这个梗被大家拿出来调侃了这么多年，确实不应该被用来当作是质疑一个球员伟大的原因了。也许新赛季58分的那个梗也会翻篇，谁知道呢。</p>
<h2 id="新赛季">新赛季</h2>
<p>这个夏天，莫雨田在保留了球队完整换防体系的情况下，针对性的对阵容进行了补强，新赛季的火箭无疑更有竞争力了。而这支球队的赢球文化也会让新加入的小伙伴从中受益吧。从前两天甜瓜和恩尼斯的采访中不难看出来。当整个球队的所有人都开始讨论防守和赢球的时候。我觉得这支球队是很难被击败的。</p>
<p>唯一有所担忧的是布帅的退休。不过也许正是看到了球队在防守端的努力，觉得不用再去为了球队的防守操心，布帅才放心的做出了退休的决定吧。</p>
<h2 id="巴拿马">巴拿马</h2>
<p>这个休赛期，灯泡又组织了一次自发性质的球队合练，在去年他们就这么干了，巴拿马五小也因此得名。我觉得这也是球队成功的一部分，它保证了球队化学反应的良好运行。也让新的小伙伴更加的了解球队的体系和战术。觉得甜瓜去年之所以会不那么甜，就是因为一切的决定都太仓促了。但这个休赛期，从媒体的种种爆料来看，甜瓜还是非常渴望证明自己的。也许新赛季可以看到一个完全不同的甜瓜。拭目以待。</p>
<h2 id="最后">最后</h2>
<p>不管是姚麦时期的那支火箭，还是灯泡率领的这支火箭，其实觉得这么多年，火箭这支球队对于中国球迷来说，更多的是一种情怀。当然，抛开情怀来说，这支球队所建立起来的文化也同样迷人。相较于这个时代最伟大的球队之一勇士，也毫不想逊色。正如保罗所说：</p>
<blockquote>
<p>如果不是为了击败勇士，那我们究竟在做什么。</p></blockquote>
<p>Run as one ！</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E9%97%B2%E8%81%8A" term="%E9%97%B2%E8%81%8A" label="闲聊"/><category scheme="https://nuoea.com/tags/nba" term="nba" label="NBA"/><category scheme="https://nuoea.com/tags/%E7%81%AB%E7%AE%AD" term="%E7%81%AB%E7%AE%AD" label="火箭"/><category scheme="https://nuoea.com/tags/%E5%93%88%E7%99%BB" term="%E5%93%88%E7%99%BB" label="哈登"/></entry><entry><title type="html">图床的选择</title><link href="https://nuoea.com/blog-image-hosting/" rel="alternate" type="text/html"/><id>https://nuoea.com/blog-image-hosting/</id><published>2017-04-28T00:00:00+00:00</published><updated>2017-04-28T00:00:00+00:00</updated><content type="html"><![CDATA[<p>其实但凡是搭网站、写博客，或者是做设计案例的展示，都需要一个稳定靠谱的地方来存放我们的图片。随着互联网的发展，我们的选择也越来越多，那么如何挑选适合自己的图床就很关键了。</p>
<p>近几年虽然提供相关服务的网站越来越多，但因为各种各样的原因，收费模式以及网站的稳定性等等，其实大家选择的图床大多就那么几个吧。</p>
<h2 id="巴巴变">巴巴变</h2>
<p>这个是阿里早起提供的一个图床服务。其初衷应该是为了方便淘宝店主上传管理自己网店的图片，提供外链服务，但是需要收费。当时用过几个月的时间，其实速度各个方面都还不错，毕竟阿里爸爸的产品。只是后期阿里基于产品的考虑吧，把这个服务并入到淘宝卖家的图床服务中，不再单独对外开放。故放弃。</p>
<h2 id="又拍">又拍</h2>
<p>也是一个比较老牌的图床服务网站。在那个时候，算是最专业的那一类图床吧，毕竟除了这个就没有别的业务了。用过一段时间。没啥印象。貌似还行。</p>
<h2 id="七牛云">七牛云</h2>
<p>七牛最早出现的时候，就被写博客的小伙伴安利了。最吸引的地方应该是它的收费模式吧，在今天看来依然很良心。可以免费使用的巨大无比的存储空间，一下子就让我放弃了同类的其他产品。一直到今天依然在使用。只是七牛云好是好，就是一直以来都没有很方便的图形界面客户端，用来管理我们的图片素材。在官方的文档中只提供了API接口和终端命令行工具来同步图片，对于没有相关基础的童鞋来说，确实不太友好。不过聊胜于无吧，就这样一直坚持着用了下来。</p>
<h2 id="最优解">最优解</h2>
<p>七牛的大存储空间是个天然的优势，那么如何发挥这个优势，让它更有效率就成了最好的选择。无意间我发现了这个工具：</p>
<blockquote>
<p><a href="https://jiantuku.com"> 极简图床 </a></p></blockquote>
<p>它是一款上传非常方便的工具，他的作用就是一个桥梁，把你的图片和你要存储的位置绑定起来，优化整个流程，配合七牛云使用，简单粗暴，非常畅快。同时支持绑定的图床还有微博以及阿里云OSS。</p>
<p>除此之外，它还提供了有 <code>Chrome</code> 的插件，在浏览网站时发现了任何好的图片素材都可以一键保存到七牛云，及大的优化了整理素材的时间。</p>
<h2 id="写在最后">写在最后</h2>
<p>极简图床配合七牛云一起使用，应该可以满足大部分人对于图床的需求了。而且，极简图床还会根据自己的规则去对上传的图片进行重命名，方便管理。规则如下：</p>
<pre tabindex="0"><code>
&lt;img src=&#34;//url.com/当前日期/随机码.jpg&#34; alt=&#34;&#34; /&gt;
</code></pre><p>当然，如果后期可以自定义规则就更好了。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/></entry><entry><title type="html">三星 Galaxy Note7 的设计还有继续提升的空间么</title><link href="https://nuoea.com/galaxy-note-design/" rel="alternate" type="text/html"/><id>https://nuoea.com/galaxy-note-design/</id><published>2016-08-27T00:00:00+00:00</published><updated>2016-08-27T00:00:00+00:00</updated><content type="html">&lt;p>8月26日，也就是昨天。三星在大陆正式发布了下半年的安卓旗舰机型Galaxy Note7，性能怎么样就不说了，大家自己去翻参数。既然是一个设计驱动的网站，我们就谈谈这款手机的设计。&lt;/p>
&lt;p>今年的三星仿佛是开挂了一样。在上半年的旗舰S7 EDGE 把双曲面玻璃的设计玩的技惊四座的时候，可能很少有人能够想到三星可以在下半年的机型上，对于这种双曲面的设计又有了新的想法。吹的话就不多说了。网上各大媒体一搜一大把。只想说说缺点。指纹收集器这些很多人都在吐槽。其实我觉得最关键的还是易碎性的问题。虽然用上了康宁大猩猩第五代玻璃，据说是抗摔性能提升了多少多少。不想去管。即使再怎么样吹，也掩盖不了这块玻璃还是会碎的事实。诚然手机买来不是摔的。但是这样一款手机吧，外怪设计的这么惊艳。戴个手机保护壳吧，不好看。不戴吧，心里多少还是会有点虚。这里面的取舍还真是纠结。&lt;/p></content><category scheme="https://nuoea.com/categories/%E5%A5%BD%E7%89%A9" term="%E5%A5%BD%E7%89%A9" label="好物"/><category scheme="https://nuoea.com/tags/%E8%AF%84%E6%B5%8B" term="%E8%AF%84%E6%B5%8B" label="评测"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/></entry><entry><title type="html">浅谈今年最流行的扁平化设计的设计趋势</title><link href="https://nuoea.com/flat-design-trend/" rel="alternate" type="text/html"/><id>https://nuoea.com/flat-design-trend/</id><published>2016-08-23T00:00:00+00:00</published><updated>2016-08-23T00:00:00+00:00</updated><content type="html"><![CDATA[<p>作为科技界的大牛，苹果开创了扁平化设计美学，而谷歌在扁平化的设计美学上加入了自己的思考。而到了今年扁平化的设计趋势也在悄然发生变化。</p>
<h2 id="阴影">阴影</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2016/08/04/16.jpg" alt=""  /></p>
<p>我们知道，扁平化的代表之一就是去阴影化，而到了今年，投影无疑可以增加元素的深度，使其从背景中脱颖而出，引起用户的注意。但是在使用过程中，需要注意的是，在扁平化的设计美学里要让它保持柔和感和隐蔽性。</p>
<h2 id="渐变">渐变</h2>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2016/08/04/17.jpg" alt=""  /></p>
<p>不同于传统的实体按钮设计，现在的设计语言更简洁明了。透明的背景加上简单的边框便组成了全部。视觉上若有若无，既不会太突出显眼，也不会让你无视它的存在。</p>]]></content><category scheme="https://nuoea.com/categories/%E8%AE%B0%E5%BD%95" term="%E8%AE%B0%E5%BD%95" label="记录"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/></entry><entry><title type="html">设计师如何高效学习？</title><link href="https://nuoea.com/can-designers-learn/" rel="alternate" type="text/html"/><id>https://nuoea.com/can-designers-learn/</id><published>2016-07-11T00:00:00+00:00</published><updated>2016-07-11T00:00:00+00:00</updated><content type="html"><![CDATA[<p>我从2007年开始学习设计,自那以后发生了很多改变。现在我们可以接触到成千上万的社区,教程网站,有许多优秀的人分享他们的知识，作为一名设计师，我们有着许多学习和收获的机会。</p>
<h2 id="每天学习">每天学习</h2>
<p>养成学习的习惯是让你保持每天学习的关键,这可以进一步强化你的学习经历并使你投入的努力产生的结果最大化。</p>
<p>每天都分配出一些学习设计的时间，不管是一个月还是半年，你想要坚持学习多久就每天这么做。肖恩·麦凯布建议坚持每天学习两年时间来实现以下目标：</p>
<h2 id="赚钱">赚钱</h2>
<p>建立一个观众,解决你的大部分问题。形成在这个世界上生存发展所需的毅力，为了最大化学习的效果，把这些目标拆分开分配到你每天的日程中，这样你每天都能抽出专门学习的时间,一次不要学习太多,因为你的大脑需要休息一下来处理你输入的信息。</p>
<h2 id="1原则">1%原则</h2>
<p>让自己变得更好的方式就是每天练习。秘诀就是每天抽出一些时间真正投入到学习中,并且坚持每天这么做。简单地做一个数学计算,每天学习每天60分钟，一个月就是 60分钟x30天 = 1800分钟，也就是30个小时,这对于学习一些东西来说已经是很多的时间了。根据詹姆斯的理论,每天进步仅仅1%，只需一年就会产生巨大的进步。下面的图表可以帮助你更好地理解它的力量，你可以用这样的方法来强化你的学习。</p>
<p>利用微小的收益的优势试着学习些新的东西，而不是一遍又一遍地重复练习同样的东西。</p>
<h2 id="应用8020原则">应用80/20原则</h2>
<p>聪明的做法不是什么都要学习，而是学习那些有用的并能产生结果的东西。</p>
<p>帕累托原则(也被称为“80 – 20原则)表明,对于许多事情来说,大约80%的结果来源于20%的原因。在学习设计上也是如此,你可以学习跟踪、字距调整、字体结构、不同的计量单位,但这不会让你成为一名优秀的设计师而且这会花费很长的时间。总会有需要花费时间和精力去学习的东西,关键是要专注去学习那些真正对你有用和并且能最大化产出结果的东西。</p>
<p>考虑你最终的目标,如果你想成为一个移动端设计师,你要去了解手机行业,移动设计原则,人们的行为和习惯,而不是学习与设计有关的每个知识,有些并不一定适用于移动设计。</p>
<h2 id="采用的学习习惯">采用的学习习惯</h2>
<p>培养一个习惯需要一个触发的事物，一个持续的习惯和一些奖励。你可以在早晨喝一杯咖啡，开始学习第一件事情，这时咖啡可以成为触发你学习的开端。然后学习30分钟(打个比方)后给自己一个能让自己开心的奖励,例如最喜欢的电视节目或者一块蛋糕。选取让你感到开心和满意的奖励,这样整个过程将会更加愉快。</p>
<h2 id="参与一个挑战">参与一个挑战</h2>
<p>参与一个挑战，将其公之于众，并且在一段特定的时间内投入其中，每天学习。它可以是简单的30天写生挑战，也可以是复杂和困难的 365天365张照片的挑战。在2013年底我开始了“坚持30天在媒体上写作并发布”的挑战，在这个挑战中我每天写一些东西并发布，坚持了一个月。我看到了自己在自信心和阐述想法的能力上的巨大进步以及于意志力的管理能力的增强。</p>
<p>简单地思考下你想要学习什么,选择一段持续的时间和可交付成果,并且让每个人都知道你在做这件事。</p>
<h2 id="教">教</h2>
<p>真正学会一样东西最好的方法是把它教给别人。“但我没有准备好,我对它还不是很了解。“这句话也许是对的，但是了解一样东西并没有那么重要，你应该教给别人你的做法。通过教，你会专注于设计的本质，试着去理解并用最简单的方式去解释它。它可以提高你分析思考的能力，促使你将各种理论和个人经验结合起来。通过日志,日记或YouTube频道,开始记录并向他人分享你的学习方法吧。</p>
<h2 id="参与一个项目">参与一个项目</h2>
<p>拿出一些时间和激情去参与一个让你感到兴奋但又不会对你有太多限制的小项目,。小项目可以让你尝试做一些事情并且获得很多进步,因为你会很放松地去做并且很享受这个过程。我在2013年底开始和Paula Borowska合作并开始写移动端设计书，去年已经发表。这是一个真正深入研究移动端设计的有趣的方式，并且写书以及在写书过程中提升了大量的技能让我感到非常愉快。</p>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/design" term="design" label="design"/></entry><entry><title type="html">这可能是目前最好的国产机 - 一加三</title><link href="https://nuoea.com/best-phone-oneplus/" rel="alternate" type="text/html"/><id>https://nuoea.com/best-phone-oneplus/</id><published>2016-06-17T00:00:00+00:00</published><updated>2016-06-17T00:00:00+00:00</updated><content type="html"><![CDATA[<h2 id="关于一加">关于一加</h2>
<p>其实是一加的老粉丝了。从一代出来就开始关注这个品牌，而一加和刘作虎这些年的努力也确实如其所说，不将就的态度让这家公司的产品充满了竞争力，而今年一加三的火爆也是一个最好的答案吧。</p>
<p>与普通大众消费品不同，时至今日，智能手机的设计已绝非单纯的艺术意味和形式的相加，而是经由工业生产、消费领域进入到了一个牵涉数百项变量的维度：机身厚薄、天线走位、散热布局 … 环环相扣，牵一发动全身，当我们看着手中一部方块大小的手机，去思考「到底为何它会被设计成这样」时，事实上，不难发现，在数百项科技、参数堆叠的手机身上，其创造逻辑已相当接近于设计本源。</p>
<h2 id="关于设计">关于设计</h2>
<p>若拆解「设计」二字，不难发现，设计本质上是一种「解决方式」，是设计师和艺术家们通过智力与灵感，搭建出的一条的人类通向物质世界的朴素桥梁：在已知的变量和未知的变量中，如何通过适当的取舍，寻求出一个余地、一条小径，完美地将科技与使用者贯穿在一起，如何在此方寸间，求索到那个溢满光芒的小孔——这是对每个智能手机设计者的考验。</p>
<p>其实不管是一代的悬浮屏幕也好，还是所谓的黄金腰线也好，或者是三段式按键，我们可以看到一加在设计方面的用心和思考。在固有成熟的设计上做自己的设计，而这，正是一加厉害的地方。</p>
<h2 id="最后">最后</h2>
<blockquote>
<p>“为什么一定要做成这样？”</p></blockquote>
<p>是刘作虎一直挂在嘴边的一句话，而这种反思精神正是一加今天取得这些成就的关键。而这，也正是一加这个品牌吸引我的地方。</p>]]></content><category scheme="https://nuoea.com/categories/%E5%A5%BD%E7%89%A9" term="%E5%A5%BD%E7%89%A9" label="好物"/><category scheme="https://nuoea.com/tags/%E8%AF%84%E6%B5%8B" term="%E8%AF%84%E6%B5%8B" label="评测"/></entry><entry><title type="html">快速搭配Material Design配色工具</title><link href="https://nuoea.com/material-design/" rel="alternate" type="text/html"/><id>https://nuoea.com/material-design/</id><published>2016-04-15T00:00:00+00:00</published><updated>2016-04-15T00:00:00+00:00</updated><content type="html"><![CDATA[<p>在设计 Material Design 的过程中你会发现一个很大的问题，那就是如何大胆、灵活的使用色彩组合。</p>
<p>Material Design 里的调色板工具将色彩描述为“受大胆排列色块并结合柔和的环境、深阴影和亮高光而产生的灵感”。</p>
<p>这里我专门找了几个 Google Material Design 专用的配色工具，如果你需要材质设计调色板，这些web工具可以助你一臂之力。下面是 Material Design 配色方案的Web工具，喜欢的记得 Mark 起来！</p>
<h2 id="material-palette"><a href="http://www.materialpalette.com">Material Palette</a></h2>
<p>在这个工具中，你可以先选择主色和重点色。选完之后工具会自动生成即时预览图并提供多种下载的方式。</p>
<h2 id="material-ui"><a href="https://www.materialui.co/colors">Material UI</a></h2>
<p>这是一个漂亮的“小抄”，它把所有能提供给你的颜色汇聚在一个页面上供你选择。很不错哦！</p>]]></content><category scheme="https://nuoea.com/categories/%E5%88%86%E4%BA%AB" term="%E5%88%86%E4%BA%AB" label="分享"/><category scheme="https://nuoea.com/tags/%E5%B9%B2%E8%B4%A7" term="%E5%B9%B2%E8%B4%A7" label="干货"/><category scheme="https://nuoea.com/tags/%E8%AE%BE%E8%AE%A1" term="%E8%AE%BE%E8%AE%A1" label="设计"/></entry></feed>