<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>小霖的梦花园</title>
    <link>https://www.xiaolin.in/</link>
    
    <image>
      <url>https://www.xiaolin.in/dist/a7/2f785114baf7f051.png</url>
      <title>小霖的梦花园</title>
      <link>https://www.xiaolin.in/</link>
    </image>
    
    <atom:link href="/rss2.xml" rel="self" type="application/rss+xml"/>
    
    <description>风起时, 正翱翔</description>
    <pubDate>Mon, 16 Oct 2023 05:01:04 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>致我的20岁</title>
      <link>https://www.xiaolin.in/read/to-my-twenties.html</link>
      <guid>https://www.xiaolin.in/read/to-my-twenties.html</guid>
      <pubDate>Sun, 13 Aug 2023 12:38:45 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;看了眼时间，上次写博客已经是一年之前了。这一年里也是发生了很多很多很多事，说很忙好像也不算，但确实很难抽出一段时间坐定定在电脑前写一篇像样的东西。正好大二结束了，二十岁也到了，就趁这个机会随便写点什么吧，也算是给踏上奔三路的我一点交代吧。&lt;/p&gt;
&lt;p&gt;这篇文章从动笔到写完
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>看了眼时间，上次写博客已经是一年之前了。这一年里也是发生了很多很多很多事，说很忙好像也不算，但确实很难抽出一段时间坐定定在电脑前写一篇像样的东西。正好大二结束了，二十岁也到了，就趁这个机会随便写点什么吧，也算是给踏上奔三路的我一点交代吧。</p><p>这篇文章从动笔到写完也用了快一个月xs，每次都是写一半就被各种事情打断了，所以要是上下文有些不通顺还请见谅啦</p><h1 id="上"><a href="#上" class="headerlink" title="上"></a>上</h1><p>上大学之前我在互联网上应该能算是比较活跃的，虽然也仅限于几个小圈子里，认识了不少朋友，也学到了不少东西。当时确实比较单纯，加上父母属于比较开明的类型，没有硬性要求什么东西，所以我是纯粹的追寻自己的本心，喜欢什么就做什么，完全没有考虑什么有没有人喜欢有没有意义之类的问题。因为初中和高中都是住宿制的学校，而且不在本地，所以也只有周末从学校回家才能敲两下代码，看看信息高速公路上又发生了点什么，没有想过太远的事情，简简单单的把敲代码当成自己爱好。虽然到最后是有点技能在身，但是显而易见的就是学杂了，没有十八般武艺样样精通，而是梧鼠五技，泛而不专。要说成果吧也没弄出多少来，正经的没几个不正经的倒是不少，暑假里写的黄油收集器应该算是人生巅峰了，收割了2K多个⭐️。</p><p>同大多数人一样，我在初高中都没有遇到完全志同道合的朋友，但是一起整活的倒是遇到不少，比如当时发现校卡的余额是存在本地的，于是就把卡硬破了然后写了十张白卡挨个刷，爽了几个月，最后人家对账时候发现不对直接一举拿下🤣，但幸运的是也没处分也没入档案，所以到后面都变成了同学里的笑话。</p><p>都说到这了那高考好像也不得不说了。要我自己说上学的时候也没有多少时间是真正放在学习上的，不是看国家地理看天下什么的就是去机房打机，高三还数学课学Go英语课学日语。说考得不好有人说我凡，说考得好前头的人转身吐两口口水，只能说高不成低不就吧，但最后以高中三年最优成绩毕业也是没什么好后悔的。（翻相册发现高考的时候班里气氛还是这么好，突然怀念🥲）</p><p><img src="../images/2023-07-to-my-twenties/IMG_20210608_203711.jpg" alt="快乐高考"></p><p>哦忘说了，我校就是那个之前传的沙雕图的“牛校出牛子”的来源🤣 (图转群</p><p><img src="../images/2023-07-to-my-twenties/2bpraw8r40681.jpg" alt="牛校出牛子"></p><h1 id="中"><a href="#中" class="headerlink" title="中"></a>中</h1><p>都说填志愿的时候父母比孩子还焦虑，我这边也差不多，加上我的分数也挺尴尬的。但好在我还算有个确定的方向，加上父母不会太左右我的思想，所以自然是往计科这边靠了。然而往高的看挑不到计科，往后看的又不太够意思，左挑右挑也没个特别满意的。</p><p>当时在高中有老师专门介绍特殊类的招生，也是抱着试试看的心情去报的名，最后就华工进面了，而且面完好像分数也还行。众所周知高考改革把专业给整成了大类招生，而且如果不服从调剂那就直接跳档到下个阶段。比如说我报了xxx大学的计科大类，没选择服从调剂，那么如果你的分数没到这个专业的分数，那就直接到专科组去了；但是如果服从调剂的话，计科没上有可能就要去土木园林了。但是当时也没料到综合评价其实是提前批，就是在本科批次之前录取，就算不服从调剂也没问题，可以照常在本科组里匹，这下不赌白不赌了，于是欣然填了提前批。最后被华工给录了，还挺开心的，一查别的学校的线，好家伙，直接用中流985的分去了个末流985，这下赌和不赌确实是伯仲之间了。</p><p>我选的学院是叫未来技术学院，虽然听着很赛博，但其实是个换皮电信+计科。学院成立于2020，我们入学是2021，是这个学院招的第一批本科生，所以刚进来说整个学院一无所有也不夸张，老师没几个设备约等于零，但这些反倒变成了个优势，就是学院的所有资源都是给到我们头上来的，基本可以说是只要你敢伸手要，学院就敢给你整。</p><p>在大一，自由时间跟高中比起来实际上没多多少，公共基础课一堆，还不明所以得被拉去各种当苦力。但是和高中不同的是，志同道合的小伙伴多了很多，有共同语言的同学更是翻了几番，从此不再是一个人单打独斗了。而我也比较幸运，刚进学校就找到了一帮愿意陪我瞎搞的好朋友，在大一参加了不少比赛，搞了不少奇怪的东西。</p><p>本来到大学应该更有时间做些自己的东西的，但到最后的结果是弄了一堆胎死腹中的项目，比如下面的小灯板</p><p><img src="../images/2023-07-to-my-twenties/Snipaste_2023-07-03_21-33-34.jpg" alt="灯板"></p><p>原理是扫描，目的就是爆锤AWTRIX，嫌他傻大黑粗贵部署麻烦。当时跟朋友一块完成的基础部分，我画的板子，他写的框架，但是越往后做发现越没动力，可能是觉得不够有趣。所以做着做着就搁置了，到现在当时的那些板子还是放在某些盒子里吃着灰。(如果有人感兴趣我倒是挺想把这个东西做好的，后续看时间可以再写篇推文</p><p>刚进学校可能也是闲的无聊，实名把学校内网统统扫了一遍，顺便找了一堆弱口令主机进去玩了一圈，后果就是某天下午接到了院长的电话，然后从此变成安全会议上的xx同学和学校新发的一堆网络安全管理条例的导火索。但是好在学院包括学校和领导的领导老师都非常nice，让这个本来要出处分的事情变成了老师们嘴里的介绍词，同学们嘴里的玩笑。我也算是从野路子军变成了正规军，帮学院管理服务器和实验室这些，甚至还有了工资。有什么比干点自己感兴趣还有钱拿更美好的事呢(笑</p><p>大一一年总体来说还是在摸索和熟悉大学的整个体系吧，改变了很多以前认为理所应当的想法，比如什么老师就应该催着你学习🥲，还有啥跟老师打好关系对成绩提升真的很大xs，在摸索中也发现大多数时候老师已经不是主导了，打比赛做项目什么不会有老师告诉你应该这样或者那样，都是需要自己研究探索。但也不是说老师一点用没有，厉害的老师能一眼指出未来的大方向以及你的东西缺了什么，还是很令人敬佩的。</p><h1 id="下"><a href="#下" class="headerlink" title="下"></a>下</h1><p>因为平时比较多时间在学院的实验室，也就自然而然跟学院的老师们混熟了，后来跟院长软磨硬泡以“学生创新实验室”的名头要到了一个房间。虽然名义上是给全体本科生用的，而且院长的本意其实是想带人来参观的时候东西多点的，但是过了一年我这里还是乱七八糟的他好像也就打消了这个念头hhh（左图为刚要到的时候，右图为现在的样子）</p><p><img src="../images/2023-07-to-my-twenties/image-20230813140809974.png" alt="image-20230813140809974"></p><p>加上已经摸爬滚打一年了，当初在一起的几个小伙伴也都慢慢找到了属于自己的地方，有的创立社团服务大众，有的继续打比赛想把项目落地，还有跟老师做横向打工的，但我还是选择自雇。也不是因为没有机会，只是因为我也没什么太高远的理想，只是想干点能让自己满意的东西，为了干活而干活我实在是…不想勉强自己。</p><p>时间还是咕噜咕噜转，直到某天晚上一个挺熟的老师突然来了消息：</p><p><img src="../images/2023-07-to-my-twenties/IMG_5729.jpg" alt="IMG_5729"></p><p>简单说就是有钱了想花钱，让我帮他花</p><p>诶嘿，这不就落到我的优势区间里了嘛，从小到大正经的没学多少这种杂七杂八的倒是知道不少🤣</p><p>总而言之我就乐乎乎的当采购去了，干这种活的过程中还是学到了不少社会上为人处世的东西的，现在能基本应对供应商各种骚扰，也能从废话堆里挑最有用的东西，但我认为最重要的是现在终于可以从从容容的拒绝别人的请求和要求了，之前一直没法好好拒绝别人，都是稀里糊涂被坑了(什么波奇再世xs</p><p>打过这些杂也算是让我体验了一下设备的上限吧，也是让我拍出了不少梗图hhh。不知不觉间看老莱的视频的感受已经从“哇，羡慕”变成了“就这”或者“没活了可以咬个打火机”。以后估计买东西之前都会好好考虑买回来是不是真的有用了，只是追着喜欢买的话就会买一堆看着不错但是没用的东西回来。</p><p><img src="../images/2023-07-to-my-twenties/image-20230813164658947.png" alt="image-20230813164658947"></p><p>当甲方的时间确实过的挺舒服的，总是会给自己一种“就这样就好”的感觉（吐槽：两个月把前半辈子想买的东西都买了想玩的都玩了换谁谁不迷糊啊xs），但是我倒也还是知道一直这样下去肯定不行，毕竟我以后又不想去当采购或者销售。巧的是我导也不这么想，于是我也算是正式加入了实验室，跟着研究生师兄师姐们一起干活了。</p><h1 id="New-era"><a href="#New-era" class="headerlink" title="New era"></a>New era</h1><p>大概就是这么回事吧，依然是稀里糊涂的，开始了人生真正意义上的科研之路。能不能出成果没人能说的算，会做成能做成什么样也没人有个准，也许这就叫“科研”吧，就是为潜在的未来投资。虽然感觉跟理想有点区别，但是这个机会如果不好好抓住的话感觉自己都要被自己气死。</p><p>看着网上的各路大神，有本科毕业已经有5年实习经历的，有上大学就已经开始创业之路的，有打个响指就能变出块砖到处砸的，还是会觉得很焦虑。但其实自己想想之后也会发现没什么好焦虑的，现在自己有的一切都是自己亲手打下来的，比上不足比下有余，父母也好自己也好已经把能给我的都给了，剩下的就交给努力和时间吧。虽然现在还是不知道以后想干什么，要干什么，继续国内读还是润，创业进厂还是留校，都还没个准，但也无所谓，也许随着时间想法也会变，这种烧脑的事情就留给未来的自己吧😝</p><p>谨以本文，献给即将二十岁的自己，希望你能活成自己想象中的样子。也感谢我的父母、老师同学和愿意陪在我身边的朋友们，没有你们，这条路会比现在泥泞千倍万倍。</p><h1 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h1><p>说实话也不知道写这个的意义是什么，但还是一点一点给磨出来了，希望再过十年的我看到不会想尬到想紫砂。</p><p>谢谢你能看到这里，也提前祝我自己生日快乐，下次见~</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/to-my-twenties.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>升级到AVIF之咕咕咕</title>
      <link>https://www.xiaolin.in/read/upgrade-to-avif.html</link>
      <guid>https://www.xiaolin.in/read/upgrade-to-avif.html</guid>
      <pubDate>Thu, 19 May 2022 14:38:45 GMT</pubDate>
      <description>
      
        
        
          &lt;h1 id=&quot;开头瞎扯&quot;&gt;&lt;a href=&quot;#开头瞎扯&quot; class=&quot;headerlink&quot; title=&quot;开头瞎扯&quot;&gt;&lt;/a&gt;开头瞎扯&lt;/h1&gt;&lt;p&gt;好久不见，这里是鸽子王小霖。一转眼就过了两年，小霖也从辣鸡高中升到了辣鸡带学。高三在学校里的时候一直在想暑假要干嘛干嘛，结果
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h1 id="开头瞎扯"><a href="#开头瞎扯" class="headerlink" title="开头瞎扯"></a>开头瞎扯</h1><p>好久不见，这里是鸽子王小霖。一转眼就过了两年，小霖也从辣鸡高中升到了辣鸡带学。高三在学校里的时候一直在想暑假要干嘛干嘛，结果一到暑假就开始”一蹶不振”，一直摆到现在。</p><p>上次动这个博客是2020年10月，当时应该是更改了博客的主题并且稍稍优化了一下，但还留下了一些小细节没有修，于是最近忙里偷闲稍稍修了一下，顺便把图片换成了AVIF<del>，然后顺便来水篇文章</del>。（标题催更隔壁<a href="https://kn007.net/" rel="external nofollow noopener noreferrer" target="_blank">辰叔叔</a>，绝对不是懒得想</p><h1 id="AVIF"><a href="#AVIF" class="headerlink" title="AVIF"></a>AVIF</h1><p>AVIF是Netflix整出来的图片格式，它的初衷是为了寻找比 JPEG具有更好压缩率、更多功能特性的图片格式。下面是从<a href="https://youwu.today/skill/web/a-new-image-format-avif/" rel="external nofollow noopener noreferrer" target="_blank">这</a><em>借鉴</em>的表格。</p><table><thead><tr><th>格式</th><th>透明背景</th><th>动图</th><th>有损压缩的体积(同图景)</th><th>兼容性</th></tr></thead><tbody><tr><td>PNG</td><td>支持</td><td>有 aPNG 格式</td><td></td><td>广泛支持</td></tr><tr><td>JPEG</td><td>不支持</td><td>不支持</td><td>比 PNG 小</td><td>广泛支持</td></tr><tr><td>WebP</td><td>支持</td><td>支持</td><td>比 JPEG 小</td><td>Apple 很晚才支持，动图效果差</td></tr><tr><td>HEIC</td><td>支持</td><td>支持</td><td>比 WebP 小</td><td>Windows 上要另外安装 HEVC 视频编码解码器</td></tr><tr><td>AVIF</td><td>支持</td><td>支持</td><td>比 WebP, HEIC 小</td><td>太新，Apple 各平台还未支持，Windows 要安装 AV1视频编码解码器</td></tr></tbody></table><p>至于性能表现什么的这里就不说那么多了，毕竟网上一抓一大把，Netflix原始发布AVIF的地方在<a href="https://netflixtechblog.com/avif-for-next-generation-image-coding-b1d75675fe4" rel="external nofollow noopener noreferrer" target="_blank">这里</a>，如果有兴趣可以去读读</p><p>所以总而言之AVIF就是个各个方面吊锤PNG和WebP的文件格式啦，所以换成AVIF只能说是大势所趋了</p><p>但是当我们一打开<a href="https://caniuse.com/avif" rel="external nofollow noopener noreferrer" target="_blank">caniuse</a>，这一片红…实在是太红了…</p><p><img src="../images/2022-05-upgrade-to-avif/image-20220518205920502.png" alt="image-20220518205920502"></p><p>对比一下，下面这个是WebP的支持情况</p><p><img src="../images/2022-05-upgrade-to-avif/image-20220518163420891.png" alt="image-20220518163420891"></p><p>但是挖的坑总不能就这样不填了吧，活还是要继续整的</p><h1 id="检测可用性"><a href="#检测可用性" class="headerlink" title="检测可用性"></a>检测可用性</h1><p>检测WebP在浏览器是否可用的方法已经比较多了，主流就是通过创建一个空画布并且通过<code>toDataURL</code>方法来转换画布为base64编码的WebP图像，如果浏览器支持就会正常返回一个<code>data:image/webp;base64</code>开头的base64字符串，但是截止现在浏览器还不能返回<code>data:image/avif;base64</code>的字符串，所以我们就得另找办法了</p><p>当浏览器通过<code>&lt;img&gt;</code>标签加载到一张自己不知道格式的图片时，就会触发<code>error</code>事件，所以我们只要提供一个base64编码过的AVIF格式图像给浏览器加载，并且检查是否有错误的产生就可以了，所以代码就像下面这样</p><p><em>Update</em>：如评论中所说，<code>toDataURL</code>检测WebP的方法不是在所有浏览器都生效，因此全部都换成了加载图片的检测方法</p><pre class="line-numbers highlight language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">getImageCapbility</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">__data</span><span class="token punctuation">(</span><span class="token string">'imageType'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">return</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token function">__data</span><span class="token punctuation">(</span><span class="token string">'imageType'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span>  <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span>resolve<span class="token punctuation">,</span> reject<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> image <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Image</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    image<span class="token punctuation">.</span>onerror <span class="token operator">=</span> reject    image<span class="token punctuation">.</span>onload <span class="token operator">=</span> resolve    image<span class="token punctuation">.</span>src <span class="token operator">=</span>      <span class="token string">'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A='</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>    <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>      <span class="token function">__data</span><span class="token punctuation">(</span><span class="token string">'imageType'</span><span class="token punctuation">,</span> <span class="token string">'avif'</span><span class="token punctuation">)</span>      <span class="token keyword">return</span> <span class="token string">'avif'</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span>      <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span>resolve<span class="token punctuation">,</span> reject<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> image <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Image</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        image<span class="token punctuation">.</span>onerror <span class="token operator">=</span> reject        image<span class="token punctuation">.</span>onload <span class="token operator">=</span> resolve        image<span class="token punctuation">.</span>src <span class="token operator">=</span>          <span class="token string">'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA=='</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>        <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>          <span class="token function">__data</span><span class="token punctuation">(</span><span class="token string">'imageType'</span><span class="token punctuation">,</span> <span class="token string">'webp'</span><span class="token punctuation">)</span>          <span class="token keyword">return</span> <span class="token string">'webp'</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>          <span class="token function">__data</span><span class="token punctuation">(</span><span class="token string">'imageType'</span><span class="token punctuation">,</span> <span class="token string">'png'</span><span class="token punctuation">)</span>          <span class="token keyword">return</span> <span class="token string">'png'</span>        <span class="token punctuation">}</span>      <span class="token punctuation">)</span>  <span class="token punctuation">)</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>但是这样做的缺点也是很显而易见的，就是会在Network中多出一个丑丑的请求</p><p><img src="../images/2022-05-upgrade-to-avif/image-20220518212732998.png" alt="image-20220518212732998"></p><p>为了避免这玩意儿太污染我们的时间线，上面的代码就做了一个小小的缓存，缓存助手函数的代码如下</p><pre class="line-numbers highlight language-javascript"><code class="language-javascript"><span class="token keyword">const</span> __data <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">dataHelperHelper</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">let</span> data <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>localStorage <span class="token operator">&amp;&amp;</span> localStorage<span class="token punctuation">.</span><span class="token function">getItem</span><span class="token punctuation">(</span><span class="token string">'lyn_data'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      data <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>localStorage<span class="token punctuation">.</span><span class="token function">getItem</span><span class="token punctuation">(</span><span class="token string">'lyn_data'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token function">dataHelper</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token keyword">if</span> <span class="token punctuation">(</span>value <span class="token operator">===</span> undefined<span class="token punctuation">)</span> <span class="token keyword">return</span> data<span class="token punctuation">[</span>key<span class="token punctuation">]</span>      data<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> value      localStorage <span class="token operator">&amp;&amp;</span> localStorage<span class="token punctuation">.</span><span class="token function">setItem</span><span class="token punctuation">(</span><span class="token string">'lyn_data'</span><span class="token punctuation">,</span> JSON<span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="动态替换图片格式"><a href="#动态替换图片格式" class="headerlink" title="动态替换图片格式"></a>动态替换图片格式</h1><p>在一开始其实小霖有几种想法，第一种是通过阿里CDN的EdgeRoutine，一个和Cloudflare Workers很类似的东西，在CDN边缘节点进行动态替换，虽然小霖之前内测薅到了资格，但现在好像还是商业化了，而且按天计费，一天最少1块钱的样子，再加上还有一些万年BUG没有修，所以就扔一旁去了</p><p>其实除了钱还有另外一个问题，就是accept头的问题。在你通过脚本发起请求的时候，这个头浏览器是不会去自动填充的，也就是说只有通过<code>img</code> <code>script</code> <code>link</code>这类标签加载的资源浏览器才会将真实的符合上下文的accept头发送出去，也就是说如果通过pjax进行页面切换，服务器是拿不到用户真实的accept头的</p><p>其实还有几种怪方法，就全部写在下面了</p><ul><li>向一个不带后缀的图片地址发起请求，由边缘Worker决定返回哪种类型的图片<ul><li>但是阿里这东西不保流量证一定会经过Worker，也就是可能会出现Worker出问题了无法捕捉到流量的情况，而又使用类似<code>/dist/1.png</code>这样固定类型的后缀来返回动态类型的图片，所以🤷🏻‍♀️</li></ul></li><li>把<code>img</code>标签全部换成<code>picture</code>，用<code>source</code>来写明每一种类型图片的地址<ul><li>丑拒..</li></ul></li></ul><p>所以到最后我们可能只能够通过上面一节的内容在用户端动态更改图片链接了，哪怕这可能不太符合Best practice</p><p>因为首屏是由浏览器直接从HTML文件渲染的，而<code>img</code>标签又没有<code>beforeLoad</code>这种事件，所以我们只能<em>尽快</em>的替换掉<code>img</code>标签里的src属性，但是浏览器的玄学调度也不能保证我们的代码一定在图片加载前执行，所以也有可能会出现下面这种请求canceled的情况，如下图</p><p><img src="../images/2022-05-upgrade-to-avif/image-20220519164449134.png" alt="image-20220519164449134"></p><p>对于首屏来说，除了在服务端下手脚应该没有别的方法来解决了，但是对于第二次打开，我们还是有办法解决的，也就是通过ServiceWork直接更改浏览器获取到的HTML数据</p><p>现在小霖的博客应该是已经用上了这个小hack了，大家可以打开DevTool康康首屏的请求是不是变成AVIF了</p><h1 id="结尾胡扯"><a href="#结尾胡扯" class="headerlink" title="结尾胡扯"></a>结尾胡扯</h1><p>嘛这篇文章大概就这些内容了，上了大学又摆又忙，不过还是做了不少奇奇怪怪有趣的东西的，后面有空可以再来水水博文</p><p>就这样吧，大家晚安捏捏捏</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/upgrade-to-avif.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>WALKMAN 也要用网易云！- 教你优雅地在播放器上听歌</title>
      <link>https://www.xiaolin.in/read/cloudman.html</link>
      <guid>https://www.xiaolin.in/read/cloudman.html</guid>
      <pubDate>Tue, 07 Jul 2020 06:33:40 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;去年也不知道为啥买了台 WALKMAN ZX-300A，看了下主流的塞歌方案也就两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自己找无损资源往里塞&lt;/li&gt;
&lt;li&gt;从流媒体平台下下来再自己塞进去&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一种的话嫌麻烦，第二种的话也不简单，尤其是现在网易云还在整
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>去年也不知道为啥买了台 WALKMAN ZX-300A，看了下主流的塞歌方案也就两种：</p><ol><li>自己找无损资源往里塞</li><li>从流媒体平台下下来再自己塞进去</li></ol><p>第一种的话嫌麻烦，第二种的话也不简单，尤其是现在网易云还在整自己的加壳格式，更何况还没歌词(<a href="https://github.com/GameBelial/ZonyLrcToolsX" rel="external nofollow noopener noreferrer" target="_blank">ZonyLrcToolsX</a> 这玩意儿能用嘛)和封面，无奈只好自己写一个了</p><p>之前用 Python 写了一个还算稳定的版本，可以在<a href="https://github.com/isXiaoLin/CloudMan/tree/master" rel="external nofollow noopener noreferrer" target="_blank">这里</a>查看，最近正好有空就用 Node.js 又写了一遍，有一定的性能提升和新功能，本文讲的就是这个 Node 版本</p><p>虽然起名用的是 WALKMAN，不过理论来讲别的品牌的 MP3 也是可以使用的，欢迎回报可用的设备型号~</p><h1 id="Features"><a href="#Features" class="headerlink" title="Features"></a>Features</h1><ul><li><input checked disabled type="checkbox"> 下载用户歌单</li><li><input checked disabled type="checkbox"> 填充音乐元数据 (封面、标题、歌手、专辑、发行年份)</li><li><input checked disabled type="checkbox"> 下载并格式化歌词及翻译</li><li><input checked disabled type="checkbox"> 允许排除 / 附加歌单</li><li><input checked disabled type="checkbox"> 为本地文件夹生成列表</li><li><input checked disabled type="checkbox"> 登陆后下载无损格式音乐</li><li><input checked disabled type="checkbox"> 自定义下载质量 (默认最高[若未开通会员仅可下载少量无损歌曲])</li><li><input checked disabled type="checkbox"> 多线程处理</li><li><input checked disabled type="checkbox"> 下载错误自动重试</li><li><input checked disabled type="checkbox"> 处理云端歌单变动</li><li><input checked disabled type="checkbox"> 合并歌词原文与翻译</li><li><input checked disabled type="checkbox"> 下载专辑</li><li><input disabled type="checkbox"> 处理播放器端列表变动</li><li><input disabled type="checkbox"> 指定为某几个歌单生成组合列表</li></ul><h1 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h1><ul><li>Node.js 10+</li><li><a href="https://github.com/Binaryify/NeteaseCloudMusicApi" rel="external nofollow noopener noreferrer" target="_blank">NeteaseCloudMusicApi</a><ul><li>公开服务: <a href="https://cm.api.xiaolin.in" rel="external nofollow noopener noreferrer" target="_blank">https://cm.api.xiaolin.in</a> (不保证可用性，推荐自建)</li></ul></li></ul><h1 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h1><ol><li>打开终端，准备好 SD 卡并切换到其根目录下</li><li>输入 <code>git clone --depth=1 -b node https://github.com/isXiaoLin/CloudMan.git</code></li><li>输入 <code>cd CloudMan &amp;&amp; cp .env.example .env &amp;&amp; npm i</code></li><li>使用你最爱的编辑器打开 <code>.env</code> 文件并修改用户名和密码</li><li>输入 <code>npm start</code></li><li><del>漫长</del>超短的等待</li></ol><p>如果不想自行构建，可以在<a href="https://github.com/isXiaoLin/CloudMan/releases" rel="external nofollow noopener noreferrer" target="_blank">这里</a>下载预构建的版本，放置于 <code>.env</code> 文件的同一级目录下运行即可</p><h1 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h1><pre class="line-numbers highlight language-ini"><code class="language-ini"># 日志等级<span class="token constant">cm_logLevel</span> <span class="token attr-value"><span class="token punctuation">=</span> info</span># 是否为 /MUSIC 目录中的文件夹生成播放列表<span class="token constant">cm_generatePlaylistFile</span> <span class="token attr-value"><span class="token punctuation">=</span> true</span># NeteaseCloudMusicApi 服务地址# 若未自建则无需更改<span class="token constant">cm_api</span> <span class="token attr-value"><span class="token punctuation">=</span> https://cm.api.xiaolin.in</span># 网易云手机账号<span class="token constant">cm_phone</span> <span class="token attr-value"><span class="token punctuation">=</span> 13912345678</span># 网易云密码<span class="token constant">cm_password</span> <span class="token attr-value"><span class="token punctuation">=</span> 123456</span># 附加的歌单 (用,分割)<span class="token constant">cm_extraPlaylist</span> <span class="token attr-value"><span class="token punctuation">=</span> </span># 排除的歌单 (用,分割)<span class="token constant">cm_excludePlaylist</span> <span class="token attr-value"><span class="token punctuation">=</span> </span># 是否下载收藏的专辑<span class="token constant">cm_downloadSubAlbum</span> <span class="token attr-value"><span class="token punctuation">=</span> false</span># 附加的专辑 (用,分割)<span class="token constant">cm_extraAlbum</span> <span class="token attr-value"><span class="token punctuation">=</span> </span># 排除的专辑 (用,分割)<span class="token constant">cm_excludeAlbum</span> <span class="token attr-value"><span class="token punctuation">=</span> </span># 下载音质<span class="token constant">cm_bitRate</span> <span class="token attr-value"><span class="token punctuation">=</span> 999000</span># 是否将歌词与翻译合并为一行<span class="token constant">cm_mergeTranslation</span> <span class="token attr-value"><span class="token punctuation">=</span> false</span># 处理/下载歌曲的并发数<span class="token constant">cm_playlistConcurrency</span> <span class="token attr-value"><span class="token punctuation">=</span> 3</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="截图"><a href="#截图" class="headerlink" title="截图"></a>截图</h1><p><img src="../images/2020-07-cloudman/screenshot_20200707_132723419.png" alt="播放列表"></p><p><img src="../images/2020-07-cloudman/screenshot_20200707_132822391.png" alt="播放界面"></p><p><img src="../images/2020-07-cloudman/screenshot_20200707_162644719.png" alt="歌词界面"></p><h1 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h1><p>可能有些人会对工作原理有点好奇，这里简单写一下，也方便提 PR (小声</p><p>首先是生成要下载的所有歌曲列表，接下来生成两个队列：下载队列和处理/复制队列 (分开是为了防止 SD 卡爆炸)</p><p>下载方面没有用之前的多线程下载，因为感觉用处不大</p><p>至于处理的话使用到了 <code>node-id3</code> 和 <code>metaflac-js2</code> 这两个库，用于将歌曲信息和封面写进文件里，最后将处理好的文件从系统缓存文件夹复制进设备</p><h1 id="SensMe-及-Music-Center-for-PC"><a href="#SensMe-及-Music-Center-for-PC" class="headerlink" title="SensMe 及 Music Center for PC"></a>SensMe 及 Music Center for PC</h1><p>这几天试用了一下 Sony 官方的 Music Center for PC, 发现其实还算好用，尤其是元数据补充得非常齐并且准确率也很高 (这也太高了吧 (碎碎念</p><p>这个项目是用网易云得数据所以没法比得嘛 (自我安慰</p><p>但是依然是可以进行 SensMe 分析的！只用打开 Music Center for PC，在<code>文件-&gt;导入文件夹</code>中选择 WALKMAN-SD 中的<code>MUSIC/CloudMan</code>文件夹，然后全选右键点击<code>获取未知元素</code>就可以啦！</p><h1 id="碎碎念"><a href="#碎碎念" class="headerlink" title="碎碎念"></a>碎碎念</h1><p><del>感觉这玩意儿应该是用 MP3 的刚需才对呀但为啥没人写呢.webp</del></p><p>希望写这玩意儿能帮助到有设备的各位，因为是日常使用的程序所以应该会保持一直更新，有点子/有时间的时候可能会加一些新功能，如果有 Feature request 欢迎提 IS 或者 PR 哦</p><p>项目地址：<a href="https://github.com/isXiaoLin/CloudMan" rel="external nofollow noopener noreferrer" target="_blank">GitHub</a> (有帮助的话可以点颗小星星嘛</p><p>enjoy~</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/cloudman.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>猛男必看 — 小霖的宅家动漫清单</title>
      <link>https://www.xiaolin.in/read/anime-recommendation.html</link>
      <guid>https://www.xiaolin.in/read/anime-recommendation.html</guid>
      <pubDate>Sat, 09 May 2020 11:38:45 GMT</pubDate>
      <description>
      
        &lt;p&gt;因为疫情宅家了好几个月, 平时除了挂挂网课写写代码也就做做猛男, 感觉把能康的都康完了, 现在又又又闲的无聊就来水篇博文 (逃&lt;br&gt;这个清单包含的元素: 轻百合、日常、校园、萌系&lt;del&gt;、后宫、恋爱&lt;/del&gt; (简单说就是治愈系的啦)&lt;/p&gt;
&lt;p&gt;这个清单不包含的元素: 老虚&lt;/p&gt;
      
      </description>
      
      
      <content:encoded><![CDATA[<p>因为疫情宅家了好几个月, 平时除了挂挂网课写写代码也就做做猛男, 感觉把能康的都康完了, 现在又又又闲的无聊就来水篇博文 (逃<br>这个清单包含的元素: 轻百合、日常、校园、萌系<del>、后宫、恋爱</del> (简单说就是治愈系的啦)</p><p>这个清单不包含的元素: 老虚</p><a id="more"></a><h1 id="猛男必看系"><a href="#猛男必看系" class="headerlink" title="猛男必看系"></a>猛男必看系</h1><h2 id="轻音少女"><a href="#轻音少女" class="headerlink" title="轻音少女"></a>轻音少女</h2><p><del>轻音可以放心吹爆不解释</del></p><p>虽然说是个 2010 年的动漫, 不过感觉不管是情节安排还是画风感觉还是能吊打一大堆最近的番 (感觉单独拿出来还能再水一篇文章</p><p><del>不想猛男落泪的话第二季最后几集还有剧场版最后十几分钟可以酌情跳过 (Live Event! Come With Me!! 结尾也可以跳过</del></p><p>另外 <code>天使にふれたよ!</code> <code>Don&#39;t say &quot;lazy&quot;</code> <code>わたしの恋はホッチキス</code> 都可以放心吹爆</p><p>(顺便跟泥萌康康咱某宝淘来的大宝贝 (x</p><p><img src="../images/2020-05-anime-recommendation/IMG_20200509_193734.jpg" alt="不是挡住了，这叫完美复刻 (x"></p><p><img src="../images/2020-05-anime-recommendation/IMG_20200509_195243.jpg" alt="呆唯天下第一!"></p><p><img src="../images/2020-05-anime-recommendation/IMG_20200509_195311.jpg" alt="晒黑的阿梓喵"></p><p>Tags: 日常/校园/百合/音乐</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md28220978/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md28220984/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a> <a href="https://www.bilibili.com/bangumi/media/md28220988/" rel="external nofollow noopener noreferrer" target="_blank">剧场版</a></p><h2 id="摇曳百合"><a href="#摇曳百合" class="headerlink" title="摇曳百合"></a>摇曳百合</h2><p>跟轻音是差不多同期的动漫吧, 也可以放心吹爆！</p><p>Tags: 日常/百合(废话)</p><p>批站直达: 莫得版权</p><h2 id="请问您今天要来点兔子吗？"><a href="#请问您今天要来点兔子吗？" class="headerlink" title="请问您今天要来点兔子吗？"></a>请问您今天要来点兔子吗？</h2><p>点兔作为老牌<del>百合</del>日常也可以放心吹爆</p><p>剧本大概没被老虚动过所以可以放心食用</p><p>Tags: 日常/百合/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md191/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md2762/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a></p><h2 id="NEW-GAME"><a href="#NEW-GAME" class="headerlink" title="NEW GAME!"></a>NEW GAME!</h2><p>人活着就是为了日富美！</p><p>有一些起伏不过总体还是可以当日常看的</p><p>闲得无聊又看了下漫画，感觉整个作品基调都变了 (碎碎念</p><p>Tags: 职场/百合/日常/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5027/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md6330/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a> <a href="https://www.bilibili.com/bangumi/media/md6158/" rel="external nofollow noopener noreferrer" target="_blank">OVA</a></p><h2 id="干物妹-小埋"><a href="#干物妹-小埋" class="headerlink" title="干物妹! 小埋"></a>干物妹! 小埋</h2><p>纯日常, 窝也想<del>有个妹妹呀</del>变得跟哥哥一样优秀呀</p><p>Tags: 日常<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md2580/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md6446/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a> <a href="https://www.bilibili.com/bangumi/media/md3421/" rel="external nofollow noopener noreferrer" target="_blank">OVA</a></p><h2 id="天使降临到我身边"><a href="#天使降临到我身边" class="headerlink" title="天使降临到我身边"></a>天使降临到我身边</h2><p><del>这才是猛男该看的东西!</del></p><p>Tags: 日常/百合/萌系<del>/后宫</del></p><p>批站直达: <a href>第一季</a> <a href>第二季</a> <a href>OVA</a></p><h2 id="小霖小林家的龙女仆"><a href="#小霖小林家的龙女仆" class="headerlink" title="小霖小林家的龙女仆"></a><del>小霖</del>小林家的龙女仆</h2><p>Tags: 日常/百合</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5800/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="Comic-Girls"><a href="#Comic-Girls" class="headerlink" title="Comic Girls"></a>Comic Girls</h2><p><del>啊吧吧吧吧</del></p><p>Tags: 日常/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md77812/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="Slow-Start"><a href="#Slow-Start" class="headerlink" title="Slow Start"></a>Slow Start</h2><p>Tags: 日常/百合</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md9152/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="少女编号"><a href="#少女编号" class="headerlink" title="少女编号"></a>少女编号</h2><p>咸鱼翻身(否</p><p>Tags: 职场/日常/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5532/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="恋爱小行星"><a href="#恋爱小行星" class="headerlink" title="恋爱小行星"></a>恋爱小行星</h2><p>Tags: 日常/百合/校园</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md28224128/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="邻家索菲"><a href="#邻家索菲" class="headerlink" title="邻家索菲"></a>邻家索菲</h2><p>Tags: 日常/百合</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md139632/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="雏子的笔记"><a href="#雏子的笔记" class="headerlink" title="雏子的笔记"></a>雏子的笔记</h2><p>Tags: 日常/百合/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5993/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="属性咖啡厅"><a href="#属性咖啡厅" class="headerlink" title="属性咖啡厅"></a>属性咖啡厅</h2><p><del>可恶, 这番里竟然有男人</del></p><p>Tags: 日常/百合/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md6432/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="街角魔族"><a href="#街角魔族" class="headerlink" title="街角魔族"></a>街角魔族</h2><p>是马猴烧酒诶</p><p>Tags: 日常/百合</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md28221404/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="珈百璃的堕落"><a href="#珈百璃的堕落" class="headerlink" title="珈百璃的堕落"></a>珈百璃的堕落</h2><p>Tags: 日常/百合/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5793/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md6042/" rel="external nofollow noopener noreferrer" target="_blank">SP</a></p><h2 id="URARA迷路帖"><a href="#URARA迷路帖" class="headerlink" title="URARA迷路帖"></a>URARA迷路帖</h2><p>Tags: 日常/百合/萌系</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5776/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h1 id="看完变成现充系"><a href="#看完变成现充系" class="headerlink" title="看完变成现充系"></a>看完变成现充系</h1><h2 id="埃罗芒阿老师"><a href="#埃罗芒阿老师" class="headerlink" title="埃罗芒阿老师"></a>埃罗芒阿老师</h2><p><del>父母双亡, 有妹有房</del></p><p>Tags: 日常/后宫</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md5997/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="我的妹妹不可能那么可爱"><a href="#我的妹妹不可能那么可爱" class="headerlink" title="我的妹妹不可能那么可爱"></a>我的妹妹不可能那么可爱</h2><p><del>父母健在戏份还贼多</del></p><p>Tags: 日常/恋爱<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md2660/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md2661/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a></p><h2 id="我女友与青梅竹马的惨烈修罗场"><a href="#我女友与青梅竹马的惨烈修罗场" class="headerlink" title="我女友与青梅竹马的惨烈修罗场"></a>我女友与青梅竹马的惨烈修罗场</h2><p>Tags: 日常/恋爱<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md2667/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="我的青春恋爱物语果然有问题。"><a href="#我的青春恋爱物语果然有问题。" class="headerlink" title="我的青春恋爱物语果然有问题。"></a>我的青春恋爱物语果然有问题。</h2><p>Tags: 校园/恋爱</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md1539/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md3437/" rel="external nofollow noopener noreferrer" target="_blank">第一季 OVA</a> <a href="https://www.bilibili.com/bangumi/media/md1540/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a> <a href="https://www.bilibili.com/bangumi/media/md5622/" rel="external nofollow noopener noreferrer" target="_blank">第二季 OVA</a> <a href="https://www.bilibili.com/bangumi/media/md28228386" rel="external nofollow noopener noreferrer" target="_blank">第三季</a></p><h2 id="青春猪头少年不会梦到兔女郎学姐"><a href="#青春猪头少年不会梦到兔女郎学姐" class="headerlink" title="青春猪头少年不会梦到兔女郎学姐"></a>青春猪头少年不会梦到兔女郎学姐</h2><p><del>我也想患青春期症候群然后梦见兔女郎学姐 (不是</del></p><p>Tags: 校园/恋爱</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md134932/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md28223480/" rel="external nofollow noopener noreferrer" target="_blank">剧场版</a></p><h2 id="路人女主的养成方法"><a href="#路人女主的养成方法" class="headerlink" title="路人女主的养成方法"></a>路人女主的养成方法</h2><p>Tags: 校园/恋爱<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md1512/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md28228738/" rel="external nofollow noopener noreferrer" target="_blank">第二季</a></p><h2 id="五等分的新娘"><a href="#五等分的新娘" class="headerlink" title="五等分的新娘"></a>五等分的新娘</h2><p><del>我全都要</del></p><p>Tags: 日常/校园/恋爱<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md4316382/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h2 id="龙王的牢饭工作"><a href="#龙王的牢饭工作" class="headerlink" title="龙王的牢饭工作!"></a>龙王的<del>牢饭</del>工作!</h2><p><del>这是今日份的牢饭</del></p><p>Tags: 日常/职场<del>/后宫</del></p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md8932/" rel="external nofollow noopener noreferrer" target="_blank">第一季</a></p><h1 id="明知道前面是地狱还要看系"><a href="#明知道前面是地狱还要看系" class="headerlink" title="明知道前面是地狱还要看系"></a>明知道前面是地狱还要看系</h1><h2 id="Re：从零开始的异世界生活"><a href="#Re：从零开始的异世界生活" class="headerlink" title="Re：从零开始的异世界生活"></a>Re：从零开始的异世界生活</h2><p>应该算是看过完整看过的第一部日漫吧</p><p><del>明知道第二季是地狱还按下追番的是不是没救了 (快夸我快夸我 (x</del></p><p>Tags: 战斗/奇幻</p><p>批站直达: <a href="https://www.bilibili.com/bangumi/media/md3461" rel="external nofollow noopener noreferrer" target="_blank">第一季</a> <a href="https://www.bilibili.com/bangumi/media/md28224394" rel="external nofollow noopener noreferrer" target="_blank">第一季 新编版</a> <a href="https://www.bilibili.com/bangumi/media/md4026" rel="external nofollow noopener noreferrer" target="_blank">SP</a> <a href="https://www.bilibili.com/bangumi/media/md28226008" rel="external nofollow noopener noreferrer" target="_blank">OVA: 雪之回忆</a> <a href="https://www.bilibili.com/bangumi/media/md28226009" rel="external nofollow noopener noreferrer" target="_blank">OVA: 冰结之绊</a></p><p>清单大概就这样啦, 因为个人觉得看番是用来让心情变好的所以看的/推荐的基本都是萌系日常番, 上面说的 <code>胃痛</code> <code>跳过</code> 都是个人看法啦, 希望各位可以欣赏嘤 (<del>想想 NEW GAME! 都能看得难受的人能有什么出息嘛</del></p><p>(换了 Hexo 之后 sitemap 全没整现在咕果都不收录了, 写完文章还得修一下 (咕</p><p>酱 <del>(又水了一篇文章</del></p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/anime-recommendation.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>博客静态化全纪录</title>
      <link>https://www.xiaolin.in/read/blog-to-hexo.html</link>
      <guid>https://www.xiaolin.in/read/blog-to-hexo.html</guid>
      <pubDate>Wed, 26 Feb 2020 04:38:45 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;用过 WordPress 的小伙伴都知道 WP 是出了名的重，要是不上缓存的话 TTFB 大概很难进到 100ms 之内，正好最近打算开始尝试一下国内的 Serverless 服务，就开了这个巨坑&lt;/p&gt;
&lt;p&gt;从现有的 WordPress 转到 Hexo 主要需要干下面这
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>用过 WordPress 的小伙伴都知道 WP 是出了名的重，要是不上缓存的话 TTFB 大概很难进到 100ms 之内，正好最近打算开始尝试一下国内的 Serverless 服务，就开了这个巨坑</p><p>从现有的 WordPress 转到 Hexo 主要需要干下面这几件事：</p><ul><li>在 Hexo 找到自己喜欢的主题 / 移植现有主题</li><li>导入原文章</li><li>选择评论系统并导入评论</li><li>Hexo 主体优化</li></ul><p>那咱就一件一件说吧</p><h2 id="移植现有主题"><a href="#移植现有主题" class="headerlink" title="移植现有主题"></a>移植现有主题</h2><p>还是比较喜欢小影这个 WP 主题 C7V5 的，当时也是花了 99 买过来的，如果换个平台就换主题感觉有点小亏</p><p>移植后的主题主要将原来的 JS 全部重写了一遍，压缩后只用 10kb 左右，虽然相比起原版 4kb 还大了一些，但是现在代码就不要要任何的依赖 (jQuery) 都能运行了</p><p>CSS 目前还是完全照搬的原主题，但是看了下自动检测使用率也只有 60%出头，以后有空的话可能会考虑重写一遍 CSS 吧 (咕咕咕</p><p>(偷偷附上开发时候的 Twitter <a href="https://twitter.com/isXiaoLin/status/1213722533427499008" rel="external nofollow noopener noreferrer" target="_blank">#1</a> <a href="https://twitter.com/isXiaoLin/status/12188709155654082580" rel="external nofollow noopener noreferrer" target="_blank">#2</a></p><p>虽然不能开源但还是可以康康主题的结构哒:</p><p><img src="../images/2020-02-blog-to-hexo/image-20200225230243383.png" alt="主题结构"></p><p>用的是 Hexo 原生支持的 EJS 模板引擎，总的来说还是非常易用的 (偷偷吐槽一波 Hexo 的文档，很多东西都没有讲明白🤪</p><p>第一版测试的时候发现加上 AdSense 页面的 Load 时间会被大大延长，就算 script tag 上加 async 或者 defer 也没有用，所以就封装了一个骚函数来实现”全异步”加载统计及广告代码：</p><pre class="line-numbers highlight language-js"><code class="language-js"><span class="token keyword">const</span> loadScript <span class="token operator">=</span> <span class="token punctuation">(</span>url<span class="token punctuation">,</span> cb<span class="token punctuation">,</span> data <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token keyword">let</span> script <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'script'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    script<span class="token punctuation">.</span>src <span class="token operator">=</span> url<span class="token punctuation">;</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token keyword">in</span> data<span class="token punctuation">)</span> script<span class="token punctuation">.</span>dataset<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>cb<span class="token punctuation">)</span> script<span class="token punctuation">.</span>onload <span class="token operator">=</span> cb<span class="token punctuation">;</span>    script<span class="token punctuation">.</span><span class="token keyword">async</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>    <span class="token keyword">let</span> eles <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'html'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    eles<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>script<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>(虽然有点骚但是还是很有用的 (小声 (辩解</p><p>现在在<a href="https://cloud.tencent.com/act/cps/redirect?redirect=1020&cps_key=b3b47aa51a84134f27dbbfa1531e95fa&from=console" rel="external nofollow noopener noreferrer" target="_blank">疼讯 CDN</a> 的加持下已经可以可以做到首屏全部资源 200ms 左右了，还是非常满意的，这个后面再讲</p><h2 id="导入原文章"><a href="#导入原文章" class="headerlink" title="导入原文章"></a>导入原文章</h2><p>因为原来的文章本来就不是很多，再加上筛掉了一些质量捉急的文章，总共也就剩下十来篇文章，所以就用了全手动的方式来转换格式</p><p>在网上转了一圈发现提供的在线工具效果都不是很理想，而 Hexo 自带的迁移工具也感觉不是很好用，最后找到了个写作软件可以兼任这个工作，叫做 <a href="https://typora.io/" rel="external nofollow noopener noreferrer" target="_blank">Typora</a>，少数派有篇<a href="https://sspai.com/post/54912" rel="external nofollow noopener noreferrer" target="_blank">文章</a>详细地介绍了这个软件，咱就不过多赘述了</p><p>转换的过程也非常简单，直接在网页上选中原来的文章然后 Copy Paste 一梭子就可以了，图片的话如果在设置里开启了自动保存也会帮你保存到文章属于的目录下</p><p>非要说一个缺点出来的话就是文档库不能根据文章的 Front-Matter 来排序，所以咱现在文档的命名都是以日期开头的，如下图：</p><p><img src="../images/2020-02-blog-to-hexo/image-20200225232648232.png" alt="Typora 界面"></p><h2 id="选择评论系统并导入评论"><a href="#选择评论系统并导入评论" class="headerlink" title="选择评论系统并导入评论"></a>选择评论系统并导入评论</h2><p>既然是静态博客系统那肯定就不会有原生评论系统的嘛，本来准备就着苏卡卡的 DisqusJS 用 Disqus 来解决的，但一是考虑 Disqus 在国内被某神奇的东西拦住了，二是这玩意儿有点重，不上 Lazy Load 的话会灰常慢，然而最主要的原因是要登录 ((</p><p>咱期望的评论系统是像原生 WordPress 那种只用昵称、邮箱和内容就能留言的系统，但是转了一圈好像没看到类似的，于是就自己造轮子造了一个 <a href="https://github.com/LoliLin/Say-Anything" rel="external nofollow noopener noreferrer" target="_blank">Say-Anything</a>，纯 JSON 数据库无 UI 界面，附带支持 reCAPTCHA 和邮件提醒，后续有空应该会加上 Akismet Anti-Spam。至于现在泥萌看到的 UI 是附在主题里的，样式还是照抄的原主题，头像 API 用的是 V2 的 CDN，不用 static.xiaolin.in 的主要原因是 One 这玩意儿咱大概又双叒叕要重构了 (毕竟黎明在年度简报里下了<a href="https://blog.lim-light.com/archives/2019-annual-report-numerous-complicated.html" rel="external nofollow noopener noreferrer" target="_blank">战书</a>呢 (大雾</p><h2 id="Hexo-主体优化"><a href="#Hexo-主体优化" class="headerlink" title="Hexo 主体优化"></a>Hexo 主体优化</h2><p>最后就是 Hexo 本身的优化啦</p><p>在<a href="https://i-meto.com">萨摩</a>的提议下用了 GitHub Action 进行持续集成然后上传到疼讯 COS 上面</p><p>压缩的话小霖自己写了个小轮子来将博客的所有图片压缩成 WebP 及 PNG，默认显示的是 WebP，如果 JS 脚本觉得浏览器不支持的话就会自动替换成 PNG 格式，开源在 <a href="https://gist.github.com/LynMoe/167cf7cee15574f425465305edbfaf48" rel="external nofollow noopener noreferrer" target="_blank">Gist</a></p><p>然后就是记得加上 sitemap 插件，不然 Google 不收录就悲催了 (</p><p>(悄悄再来吐槽一波辣鸡疼讯云，都过了 9102 年了依然不能自动添加 Cache-Control 头，源站 COS 也不能自动加头，还得手动加</p><h2 id="总结-小声逼逼-大雾"><a href="#总结-小声逼逼-大雾" class="headerlink" title="总结 (小声逼逼 (大雾"></a>总结 (小声逼逼 (大雾</h2><p>嘛半年没写文章了手感还是掉了很多，既然转到了静态博客那以后可能就真成长草博客了 ((</p><p>等疫情过去了估计学业也会开始紧张起来，毕竟耽误了差不多一个月的课程，所以大概就咕咕咕咕咕咕咕了?</p><p>那就这样吧 (溜球</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/blog-to-hexo.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>RoboMaster 2019 夏令营 体验&amp;简评</title>
      <link>https://www.xiaolin.in/read/robomaster-2019.html</link>
      <guid>https://www.xiaolin.in/read/robomaster-2019.html</guid>
      <pubDate>Mon, 12 Aug 2019 00:38:45 GMT</pubDate>
      <description>
      
        
        
          &lt;h2 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;考虑了一下还是准备把这次夏令营的经过写出来吧，关键信息大概是不能透露的了，但还是会尽量保证文章的连续性的&lt;/p&gt;
&lt;p&gt;因为签署了保密协议，
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>考虑了一下还是准备把这次夏令营的经过写出来吧，关键信息大概是不能透露的了，但还是会尽量保证文章的连续性的</p><p>因为签署了保密协议，所以本文将最大限度地不公开受牵连的内容，如有侵权请邮件至 <a href="mailto:i@amxiaol.in" rel="external nofollow noopener noreferrer" target="_blank">i#amxiaol.in</a> (#-&gt;@)</p><p>之前在网上发现了 DJI 的 RoboMaster 暑期营项目，看了看还挺有意思的，于是就报了名，投了简历之后稀里糊涂就过了面试，所以就算进来了 2019 的夏令营了</p><p>简单介绍一下这个 DJI 教育生态项目吧</p><p>RM 暑期营有三个方向可以选择，分别是机械、算法和嵌入，后两者都属于需要真本♂事的方向，所以我这种菜鸡自然是选择了机械方向。RM 使用的建模软件是 SolidWorks，SW 算是比较好上手的软件了，官方也推荐了一个系列视频来学习 SW，个人觉得还是比较 OK 的 (咕咕咕</p><p>在去夏令营之前，我还一直担心会不会进去的都是 julao，每天都怂的瑟瑟 fa 抖抓紧看视频，怕进去发现自己啥都不会，然而发现完全没有必要担心，因为 -大家都一样菜- hhh (当然 julao 还是有很多的，营里新老营员对半分的亚子</p><h2 id="瞎扯"><a href="#瞎扯" class="headerlink" title="瞎扯"></a>瞎扯</h2><p>小霖坐标就在深圳隔壁，所以就一路坐市际高铁到深圳北，然后直接前往这次所住的公寓报道，报道完后的下午就可以进行自由活动了。</p><p>先是整理了一下 DJI 发的一大堆纪念品，然后就去和<a href="https://twitter.com/TyzuaL" rel="external nofollow noopener noreferrer" target="_blank">汤圆</a>小哥哥面基了</p><p><img src="../images/2019-08-robomaster/InkedIMG_20190724_124050_LI-min.png" alt="纪念品"></p><p>先是去吃了烧烤，然后去汤圆几千万的家转了一圈，还顺便撸了下芬达</p><p><img src="../images/2019-08-robomaster/InkedIMG_20190724_190328_LI-min.png" alt="烧烤"></p><p><img src="../images/2019-08-robomaster/IMG_20190724_212933-min.png" alt="芬达"></p><p>总结一下：有钱真好。</p><h1 id="体验"><a href="#体验" class="headerlink" title="体验"></a>体验</h1><p>大家可能没听过 RoboMaster 这玩意儿，但是可以看出来 DJI 正在很努力地宣传这玩意儿，而且看起来的确算是取得了小成功了 (</p><h2 id="设备"><a href="#设备" class="headerlink" title="设备"></a>设备</h2><p>RM 夏令营大概是 RM 大学生赛(顺便东北大学nb啊啊啊啊啊啊)的附属产品(?)，早就听说 DJI 很 #rich了，但实际体验下来发现 DJI 不但很 #rich 还非常的 nice，材料可以说是取之不尽用之不竭，在仓库里找不到的直接跟我们可爱的冠男老师说就可以了，至于加工的设备也差不多如此，3D 打印机、激光切割机、CNC 机床这里都有，作为一个机械来讲已经没有什么好吐槽的了</p><p><img src="../images/2019-08-robomaster/IMG_20190729_163736-min-1.png" alt="每小组的材料"></p><h2 id="活动"><a href="#活动" class="headerlink" title="活动"></a>活动</h2><p>除此之外夏令营还安排了很多很棒很厉害的活动，比如参观港科大和一大堆讲座</p><h3 id="港科大参观"><a href="#港科大参观" class="headerlink" title="港科大参观"></a>港科大参观</h3><p>按照每年的惯例，我们又前往参观了香港科技大学，相比之下差别还是比较大的，港科大的实验室非常大而且研究的都是些看不懂的玩意儿，因为害怕被罚 100万所以具体的东西就不发了</p><p><img src="../images/2019-08-robomaster/IMG_20190730_113301.png" alt="港科大"></p><p><img src="../images/2019-08-robomaster/IMG_20190730_131326.png" alt="港科大实验室"></p><h3 id="讲座"><a href="#讲座" class="headerlink" title="讲座"></a>讲座</h3><p>那么多讲座里我觉得最棒的一个就是 <a href="https://en.wikipedia.org/wiki/Takeo_Kanade" rel="external nofollow noopener noreferrer" target="_blank">Takeo Kanade</a> 教授给我们讲的机器人运动学和计算机视觉，讲得非常通俗易懂，感觉帮助还是很大的，从 NavLab 项目一路讲到类似 Openpose 的开源项目，最后还有个 Q&amp;A 环节</p><p><img src="../images/2019-08-robomaster/IMG_20190812_195659.png" alt="Takeo Kanade 讲座"></p><h3 id="生日会"><a href="#生日会" class="headerlink" title="生日会"></a>生日会</h3><p>据说每次夏令营都会给临近生日的同学过生日，但是这次8.15生日没排进生日会嘤</p><p><img src="../images/2019-08-robomaster/IMG_20190802_205839.png" alt="生日会"></p><h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><p>这次夏令营的研发基地从 DJI 总部移到了南方科技大学，住宿也是从酒店换到了公寓，感觉还是非常不错的。</p><h3 id="校园"><a href="#校园" class="headerlink" title="校园"></a>校园</h3><p>南科大的可以说是非常不错的了，有三个食堂，一个学生食堂、一个教工食堂还有一个西餐厅，刷卡都可以去吃。校园非常之大，有免费的校园穿梭巴，发车间隔也挺短的，还带空调，大赞。</p><p><img src="../images/2019-08-robomaster/IMG_20190811_134715.png" alt="体育场"></p><p><img src="../images/2019-08-robomaster/IMG_20190814_123317.png" alt="西餐厅"></p><h3 id="研发"><a href="#研发" class="headerlink" title="研发"></a>研发</h3><p>果然如 <a href="https://space.bilibili.com/946974/" rel="external nofollow noopener noreferrer" target="_blank">影视飓风</a> 的 Tim 所说，DJI 里都是一群年轻优秀又可爱的工程师，来到这里负责我们整个营期工作的老师都是很年轻的老师，其中有一些往届假期营的助教。</p><p>因为大部分都是同龄人，所以相互之间交流起来都非常的方便，老师和助教也经常玩梗开车，而且老师们都很愿意跟我们一起讨论一些大胆的脑洞，对我们平常设计开发帮助很大。</p><p><img src="../images/2019-08-robomaster/mmexport1565791416884__01.png" alt="老师&amp;助教"></p><p>在这里待上大半个月，就算平时没有刻意地去学去用，在结营的时候还是会学到很多新东西和新技巧的。</p><p>每个房间中的气氛也是非常好，大家都各司其职，就算有摸鱼的看着人家都在认真工作也会乖乖回去设计或者撸码，不过也有个别小组内矛盾很激烈 （</p><p>到比赛的前一晚大家也都是干劲十足，有一大批全身除了头全是肝的小伙伴直接通宵</p><p><img src="../images/2019-08-robomaster/IMG_20190812_012538.png" alt="摄于凌晨 1:30"></p><p><img src="../images/2019-08-robomaster/IMG_20190812_030901.png" alt="摄于凌晨 3:00"></p><h3 id="住宿"><a href="#住宿" class="headerlink" title="住宿"></a>住宿</h3><p>这次我们住在集悦城，都是 2 人间，房间不算大也不算小，住起来还是比较舒服的，但比较蛋疼的就是我们百来号人只有三台洗衣机能用 （</p><p><img src="../images/2019-08-robomaster/IMG_20190724_122518__01.png" alt="开营前住的集悦城单人间"></p><h2 id="任务"><a href="#任务" class="headerlink" title="任务"></a>任务</h2><p>说了那么久别的，来简单讲一下今年的夏令营任务规则吧。</p><p>今年要做的是一个占点任务，一块9×7的场地，有7个堡垒，分红蓝两放，每方各一边，大概长这样：</p><p><img src="../images/2019-08-robomaster/IMG_20190729_103925.png" alt="堡垒"></p><p>下面的平台是用来放球的，一个球一分，放在槽里才算得分；上面的平台是用来放杯子的，杯子中需要加球，一个含球的杯子六分</p><p>场地的地图如下图：</p><p><img src="../images/2019-08-robomaster/Snipaste_2019-08-13_14-32-02.png" alt="场地"></p><p>全红与全蓝的块为出生点，红蓝方可任意选择一点开始比赛</p><p>被占领堡垒旁的格子视为可占领道路，操控机器人在块上停留一秒即可占领道路，当道路连通三个已占领堡垒时，将已占领道路视为强占领区域，反之为弱占领区域，当机器人行走在敌方占领区域时，每格扣五分，弱占领区域可占领为机房区域，强占领则不行 (占领道路时道路旁必须有己方堡垒或道路)</p><p>分数为比赛结束后统一结算，存在一个堡垒加 50 分，一格弱占领区域加 15 分，一格强占领区域加 20 分</p><h3 id="方案"><a href="#方案" class="headerlink" title="方案"></a>方案</h3><p>我们组设计的具体方案和比赛结果就不说了，说出来都是泪 （直线轴承在第一场比赛前开始掉滚珠，开发板在第二场比赛前烧了，直接凉凉 （</p><p>(悄悄附一张开始的规划图</p><p><img src="../images/2019-08-robomaster/IMG_20190729_145420__01.png" alt="规划图"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>嘛说了那么多最后还是来总结一下吧。</p><p>个人来看这个夏令营还是非常值得来参加的，建议有条件的小伙伴都可以去试一下哒。</p><p>在夏令营里小霖凭着写过的那点码成功成为了个假全栈，也学了很多关于算法和嵌入的玩意儿，机械也是学了不少东西，至少现在画一些稍微复杂的零件和装配体是没啥问题了。</p><p>最后感谢一下 DJI 和 RoboMaster 为中国教育生态的投入，虽然这次收了钱，但不难看出来这点钱完全不够补贴我们的食宿和研发材料，相比起某些只说不做的公司，DJI 不知道高到哪里去了</p><p>所以…大半个暑假已经没了，剩下的时间该好好学习(才怪)了，顺便改一下睡眠习惯，补一下肝 （误</p><p>就这样吧嘤 （溜</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/robomaster-2019.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>Portainer 初体验</title>
      <link>https://www.xiaolin.in/read/portainer.html</link>
      <guid>https://www.xiaolin.in/read/portainer.html</guid>
      <pubDate>Sat, 13 Jul 2019 20:44:43 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;最近突然想尝试一下 Docker 现有的 GUI 界面 , 找了一下发现 Portainer 的 UI 比较出众, 于是咱就打算尝试体验一下&lt;/p&gt;
&lt;h1 id=&quot;准备工作&quot;&gt;&lt;a href=&quot;#准备工作&quot; class=&quot;headerlink&quot; title=&quot;准备工作&quot;&gt;
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>最近突然想尝试一下 Docker 现有的 GUI 界面 , 找了一下发现 Portainer 的 UI 比较出众, 于是咱就打算尝试体验一下</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><ul><li>装有 Ubuntu 操作系统的 Docker 的服务器</li><li>基本 Docker 及 Linux 知识</li><li>一个脑子</li></ul><h2 id="在服务器上安装-Portainer"><a href="#在服务器上安装-Portainer" class="headerlink" title="在服务器上安装 Portainer"></a>在服务器上安装 Portainer</h2><p>首先我们需要在服务器上安装 Portainer 服务以使用它的服务, 为了保证该服务不宕机, 小霖在 Azure 上开了一台最便宜的服务器当做 Portainer 的专用宿主机, 并在网页的外面套上了 Verizon CDN 服务以保证在国内外都有最好的访问效果</p><p>因为服务是要远程连接到我们的服务器上的, 所以宿主机到 Docker 服务器的延迟也应该要在一定范围内才行, Azure 这台新加坡的服务器到上海腾讯云和广州腾讯云的延迟都是 60ms 左右, 已经足够了</p><h2 id="安装-Docker"><a href="#安装-Docker" class="headerlink" title="安装 Docker"></a>安装 Docker</h2><p>小霖选用的是 Ubuntu 18.04 操作系统, 不过别的系统应该也差不多, 输入以下指令即可:</p><pre class="line-numbers highlight language-bash"><code class="language-bash">curl https://get.docker.com <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">bash</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>等待安装完成后可以按照提示将自己的用户加入 docker 用户组</p><h2 id="安装-Portainer"><a href="#安装-Portainer" class="headerlink" title="安装 Portainer"></a>安装 Portainer</h2><p>Portainer 有现成的 Docker 镜像, 所以咱就直接使用官方提供的镜像</p><p>这玩意儿关乎着所有 Docker 服务器的安危, 所以 SSL 是肯定要上的啦. 将证书存放在某个神奇的小目录下咱就可以开始安装了(请将以下代码中的 <code>${DIR}</code> 和 <code>${PORT}</code> 更换成自己需要的值):</p><pre class="line-numbers highlight language-bash"><code class="language-bash">docker run -d -p <span class="token variable">${PORT}</span>:9000 --name portainer --restart always -v <span class="token variable">${DIR}</span>:/certs -v portainer_data:/data portainer/portainer --ssl --sslcert /certs/cert.pem --sslkey /certs/key.pem<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>等命令执行完后打开 <code>https://IP</code> 就应该可以看到下面的界面了</p><p><img src="../images/2019-07-portainer/setup.png" alt="初始化界面"></p><p>在这个界面设置好登录信息后我们就可以进入下一个环节了</p><h1 id="开启安全的-Docker-Remote-API"><a href="#开启安全的-Docker-Remote-API" class="headerlink" title="开启安全的 Docker Remote API"></a>开启安全的 Docker Remote API</h1><p>开启 Docker Remote API 的方法非常简单, 只要在 <code>/etc/default/docker</code> 中添加如下代码即可:</p><pre class="line-numbers highlight language-ini"><code class="language-ini"><span class="token constant">OPTIONS</span><span class="token attr-value"><span class="token punctuation">=</span>'-H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>但是这样就相当于直接把你的服务器毫无保留地暴露出去了, 所以我们需要一些更安全的开启方式, 我们开始吧!</p><h2 id="生成服务器证书及建立-API-服务"><a href="#生成服务器证书及建立-API-服务" class="headerlink" title="生成服务器证书及建立 API 服务"></a>生成服务器证书及建立 API 服务</h2><p>我们将所有的证书都放置到 <code>/etc/docker/</code>目录下以便于管理</p><p>咱首先生成 CA 的公钥以及私钥:</p><pre class="line-numbers highlight language-bash"><code class="language-bash">openssl genrsa -aes256 -out ca-key.pem 4096 <span class="token comment" spellcheck="true"># 生成 CA 私钥</span>openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem <span class="token comment" spellcheck="true"># 生成 CA 公钥</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>接下来生成服务端证书、签名请求和密钥:</p><pre class="line-numbers highlight language-bash"><code class="language-bash">openssl genrsa -out server-key.pem 4096 <span class="token comment" spellcheck="true"># 生成证书私钥</span>openssl req -sha256 -new -key server-key.pem -out server.csr <span class="token comment" spellcheck="true"># 创建证书签名请求</span><span class="token comment" spellcheck="true"># 输入一系列相关信息，可省略部分直接输入.</span><span class="token comment" spellcheck="true"># 其中 Common Name 需要改成你连接服务器的地址, 比如 1.1.1.1 或 example.com</span>openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem <span class="token comment" spellcheck="true"># 生成服务器证书</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>到现在咱的服务器端证书就已经生成好了, 可以建立经过加密的 Docker Remote API 服务了</p><p>在 <code>/etc/default/docker</code> 添加如下代码:</p><pre class="line-numbers highlight language-ini"><code class="language-ini"><span class="token constant">OPTIONS</span><span class="token attr-value"><span class="token punctuation">=</span>'-H=tcp://0.0.0.0:2376 -H=unix:///var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>理论来说以上代码是可以正常运行的, 但是在小霖的服务器上貌似不起作用, 所以咱直接修改启动 Docker 的脚本参数: 打开 <code>/lib/systemd/system/docker.service</code> , 在 ExecStart 后添加以下内容:</p><pre class="line-numbers highlight language-bash"><code class="language-bash">-H<span class="token operator">=</span>tcp://0.0.0.0:2376 --tlsverify --tlscacert<span class="token operator">=</span>/etc/docker/ca.pem --tlscert<span class="token operator">=</span>/etc/docker/server-cert.pem --tlskey<span class="token operator">=</span>/etc/docker/server-key.pem<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>之后输入 <code>sudo systemctl daemon-reload</code> 重新载入 systemctl 配置文件后输入 <code>sudo systemctl restart docker</code> 重启 Docker 服务即可</p><h2 id="为客户端生成证书"><a href="#为客户端生成证书" class="headerlink" title="为客户端生成证书"></a>为客户端生成证书</h2><p>目前为止 API 服务已经被刚刚咱创建的证书所加密了, 接下来就要生成客户端证书以允许客户端连接上 API 服务, 代码如下</p><pre class="line-numbers highlight language-bash"><code class="language-bash">openssl genrsa -out key.pem 4096 <span class="token comment" spellcheck="true"># 生成证书私钥</span>openssl req -new -key key.pem -out client.csr <span class="token comment" spellcheck="true"># 创建证书签名请求</span><span class="token comment" spellcheck="true"># 输入一系列相关信息, 例外同上</span>openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem <span class="token comment" spellcheck="true"># 生成客户端证书</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>上面的代码运行完成后, 客户端的证书就生成完毕了, 我们需要将 <code>ca.pem</code> <code>cert.pem</code> 及 <code>key.pem</code> 复制到本地以便稍后在 Portainer 中添加节点</p><h1 id="在-Portainer-中添加节点"><a href="#在-Portainer-中添加节点" class="headerlink" title="在 Portainer 中添加节点"></a>在 Portainer 中添加节点</h1><p>完成了上面的步骤之后就可以在 Portainer 添加刚刚操作的 Docker 服务器了</p><p>在填写完账号信息后我们应该可以看到下面的界面:</p><p><img src="../images/2019-07-portainer/setup-remote.png" alt="添加节点"></p><p>在这个界面我们就可以添加需要的节点了</p><p>其中 <code>Name</code> 是名字, <code>Endpoint URL</code> 是服务器 IP 加上端口号, 在这里也就是上面设置的 <code>2376</code></p><p>除了填写这些我们还要上传刚刚复制回来的三个文件, <code>TLS CA certificate</code> 对应的是 <code>ca.pem</code>, <code>TLS certificate</code> 对应的是 <code>cert.pem</code>, <code>TLS key</code> 对应的是 <code>key.pem</code></p><p>填写完这些信息并连接成功后咱就可以进入到主页了, 如下图:</p><p><img src="../images/2019-07-portainer/homescreen.png" alt="首页"></p><h1 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h1><p>如果步骤没有缺漏的话到这里 Portainer 就应该已经安装完成了, 小霖体验了一下感觉还是很好用的, 不过有一些功能还是没有的, 比如增加端口或者挂载卷之类的, 希望以后会持续更新吧</p><p>那么, 就酱~ (滚去睡觉觉惹</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/portainer.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>手把手教你拿SSL Lab A+ – Docker LEMP 初体验</title>
      <link>https://www.xiaolin.in/read/docker-lemp.html</link>
      <guid>https://www.xiaolin.in/read/docker-lemp.html</guid>
      <pubDate>Thu, 04 Apr 2019 15:59:47 GMT</pubDate>
      <description>
      
        
        
          &lt;h2 id=&quot;瞎扯&quot;&gt;&lt;a href=&quot;#瞎扯&quot; class=&quot;headerlink&quot; title=&quot;瞎扯&quot;&gt;&lt;/a&gt;瞎扯&lt;/h2&gt;&lt;p&gt;Docker 经过这几年的发展已经成为了个很成熟的项目了，小霖也是眼馋了很久了，不过因为太菜了，之前一直都没搞。不过前不久看了下浙大出的「D
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h2 id="瞎扯"><a href="#瞎扯" class="headerlink" title="瞎扯"></a>瞎扯</h2><p>Docker 经过这几年的发展已经成为了个很成熟的项目了，小霖也是眼馋了很久了，不过因为太菜了，之前一直都没搞。不过前不久看了下浙大出的「Docker 容器与容器云」这本书，就决定折腾一下。</p><h2 id="开搞"><a href="#开搞" class="headerlink" title="开搞"></a>开搞</h2><p>本来是准备自己写一个编排的，但是跟萨摩聊了一下天发现萨摩也写了个编排，于是咱肯定是用dalao的嘛 （以下的安装过程修改于<a href="https://i-meto.com/docker-lemp/">萨摩博文</a></p><p>萨摩的编排可以支持 TLS 1.3 + QUIC，轻轻松松拿 SSL Lab A+ 嘤</p><p>最首先肯定是安装 docker-ce 和 docker-compose 啦</p><pre class="line-numbers highlight language-bash"><code class="language-bash">curl -fsSL https://get.docker.com -o get-docker.sh<span class="token function">sudo</span> sh get-docker.shcurl -L <span class="token string">"https://github.com/docker/compose/releases/download/1.23.2/docker-compose-<span class="token variable"><span class="token variable">$(</span><span class="token function">uname</span> -s<span class="token variable">)</span></span>-<span class="token variable"><span class="token variable">$(</span><span class="token function">uname</span> -m<span class="token variable">)</span></span>"</span> -o /usr/local/bin/docker-compose<span class="token function">sudo</span> <span class="token function">chmod</span> +x /usr/local/bin/docker-compose<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>然后就是拉取萨摩的编排模板</p><pre class="line-numbers highlight language-bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/metowolf/docker-lemp.git <span class="token operator">&amp;&amp;</span> <span class="token function">cd</span> docker-lemp<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>接下来我们就可以调整编排的配置了</p><pre class="line-numbers highlight language-bash"><code class="language-bash"><span class="token function">cp</span> .env.example .env <span class="token operator">&amp;&amp;</span> <span class="token function">cp</span> docker-compose.example.yml docker-compose.yml<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在 .env 文件中可以修改各种容器的版本还有 MySQL 的密码，在 docker-compose.yml 可以修改需要的容器</p><p>在这里我们一步到位，直接挂上 Nginx 的 brotli 模块</p><p>首先创建 nginx.conf 文件 (etc/nginx/nginx.conf)</p><pre class="line-numbers highlight language-nginx"><code class="language-nginx"><span class="token keyword">user</span>  nginx<span class="token punctuation">;</span><span class="token keyword">worker_processes</span>  auto<span class="token punctuation">;</span><span class="token keyword">error_log</span>  <span class="token operator">/</span>var<span class="token operator">/</span>log<span class="token operator">/</span>nginx<span class="token operator">/</span>error<span class="token punctuation">.</span>log warn<span class="token punctuation">;</span><span class="token keyword">pid</span>        <span class="token operator">/</span>var<span class="token operator">/</span>run<span class="token operator">/</span>nginx<span class="token punctuation">.</span><span class="token keyword">pid</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true"># 挂载 brotli 模块</span>load_module  modules<span class="token operator">/</span>ngx_http_brotli_filter_module<span class="token punctuation">.</span>so<span class="token punctuation">;</span>load_module  modules<span class="token operator">/</span>ngx_http_brotli_static_module<span class="token punctuation">.</span>so<span class="token punctuation">;</span><span class="token keyword">events</span> <span class="token punctuation">{</span>    <span class="token keyword">worker_connections</span>  <span class="token number">1024</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">http</span> <span class="token punctuation">{</span>    <span class="token keyword">include</span>       <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span>mime<span class="token punctuation">.</span><span class="token keyword">types</span><span class="token punctuation">;</span>    <span class="token keyword">default_type</span>  application<span class="token operator">/</span>octet<span class="token operator">-</span>stream<span class="token punctuation">;</span>    <span class="token keyword">log_format</span>  main  <span class="token string">'$remote_addr - $remote_user [$time_local] "$request" '</span>                      <span class="token string">'$status $body_bytes_sent "$http_referer" '</span>                      <span class="token string">'"$http_user_agent" "$http_x_forwarded_for"'</span><span class="token punctuation">;</span>    <span class="token keyword">access_log</span>  <span class="token operator">/</span>var<span class="token operator">/</span>log<span class="token operator">/</span>nginx<span class="token operator">/</span>access<span class="token punctuation">.</span>log  main<span class="token punctuation">;</span>    <span class="token keyword">sendfile</span>        on<span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">#tcp_nopush     on;</span>    <span class="token keyword">keepalive_timeout</span>  <span class="token number">65</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">#gzip  on;</span>    <span class="token keyword">include</span> <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span>conf<span class="token punctuation">.</span>d<span class="token operator">/</span><span class="token operator">*</span><span class="token punctuation">.</span>conf<span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>然后创建 brotli 的配置文件 (etc/nginx/config/brotli.conf)</p><pre class="line-numbers highlight language-nginx"><code class="language-nginx">brotli              on<span class="token punctuation">;</span>brotli_comp_level   <span class="token number">6</span><span class="token punctuation">;</span>brotli_types        application<span class="token operator">/</span>x<span class="token operator">-</span>httpd<span class="token operator">-</span>php application<span class="token operator">/</span>javascript application<span class="token operator">/</span>x<span class="token operator">-</span>javascript application<span class="token operator">/</span>xml application<span class="token operator">/</span>json text<span class="token operator">/</span>plain text<span class="token operator">/</span>javascript text<span class="token operator">/</span>css text<span class="token operator">/</span>xml image<span class="token operator">/</span>jpeg image<span class="token operator">/</span>gif image<span class="token operator">/</span>png image<span class="token operator">/</span>svg<span class="token operator">+</span>xml<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>接下来在 docker-compose.yml 里挂载上 nginx.conf 就可以惹</p><pre class="line-numbers highlight language-git"><code class="language-git"><span class="token deleted">--- docker-compose.yml</span><span class="token inserted">+++ docker-compose.yml</span><span class="token coord">@@ -11,6 +11,7 @@</span>       - php-fpm     volumes:       - ./log/nginx:/var/log/nginx:rw<span class="token inserted">+      - ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf:rw</span>       - ./etc/nginx/config:/etc/nginx/conf.d:rw       - ./etc/ssl:/etc/nginx/ssl:rw       - ./wwwroot:/var/www:rw<span class="token coord">@@ -65,6 +66,8 @@</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>brotli 弄好之后我们就开始弄网站配置了，下面是小霖博客用的 nginx 配置(伪静态是WordPress的)，其中第二个 add_header 是为了提醒浏览器尝试连接 443 udp 端口上的 Caddy 以使用 quic 服务，一会会写到的</p><pre class="line-numbers highlight language-nginx"><code class="language-nginx"><span class="token keyword">server</span> <span class="token punctuation">{</span>    <span class="token keyword">listen</span> <span class="token number">443</span> <span class="token keyword">ssl</span> http2<span class="token punctuation">;</span>    <span class="token keyword">server_name</span> xiaolin<span class="token punctuation">.</span>in<span class="token punctuation">;</span>    <span class="token keyword">set</span> <span class="token variable">$base</span> <span class="token operator">/</span>var<span class="token operator">/</span>www<span class="token operator">/</span>xiaolin<span class="token punctuation">.</span>in<span class="token punctuation">;</span>    <span class="token keyword">root</span> <span class="token variable">$base</span><span class="token punctuation">;</span>  <span class="token keyword">add_header</span> Strict<span class="token operator">-</span>Transport<span class="token operator">-</span>Security <span class="token string">"max-age=31536000; includeSubDomains; preload"</span> always<span class="token punctuation">;</span>      <span class="token keyword">add_header</span> alt<span class="token operator">-</span>svc <span class="token string">'quic=":443"; ma=2592000; v="44,43,39"'</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true"># SSL</span>    <span class="token keyword">ssl_certificate</span> <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span><span class="token keyword">ssl</span><span class="token operator">/</span>_<span class="token punctuation">.</span>xiaolin<span class="token punctuation">.</span>in<span class="token punctuation">.</span>crt<span class="token punctuation">;</span>    <span class="token keyword">ssl_certificate_key</span> <span class="token operator">/</span>etc<span class="token operator">/</span>nginx<span class="token operator">/</span><span class="token keyword">ssl</span><span class="token operator">/</span>_<span class="token punctuation">.</span>xiaolin<span class="token punctuation">.</span>in<span class="token punctuation">.</span>key<span class="token punctuation">;</span>    <span class="token comment" spellcheck="true"># index.php</span>    <span class="token keyword">index</span> <span class="token keyword">index</span><span class="token punctuation">.</span>php<span class="token punctuation">;</span>    <span class="token keyword">location</span> <span class="token operator">/</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true"># This is cool because no php is touched for static content.</span>          <span class="token comment" spellcheck="true"># include the "?$args" part so non-default permalinks doesn't break when using query string</span>          <span class="token keyword">try_files</span> <span class="token variable">$uri</span> <span class="token variable">$uri</span><span class="token operator">/</span> <span class="token operator">/</span><span class="token keyword">index</span><span class="token punctuation">.</span>php<span class="token operator">?</span><span class="token variable">$args</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>      <span class="token comment" spellcheck="true"># handle .php</span>    <span class="token keyword">location</span> <span class="token operator">~</span> \<span class="token punctuation">.</span>php$ <span class="token punctuation">{</span>          <span class="token keyword">fastcgi_split_path_info</span> <span class="token operator">^</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">+</span>\<span class="token punctuation">.</span>php<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token operator">/</span><span class="token punctuation">.</span><span class="token operator">+</span><span class="token punctuation">)</span>$<span class="token punctuation">;</span>          <span class="token keyword">fastcgi_pass</span> php<span class="token operator">-</span>fpm<span class="token punctuation">:</span><span class="token number">9000</span><span class="token punctuation">;</span>          <span class="token keyword">fastcgi_index</span> <span class="token keyword">index</span><span class="token punctuation">.</span>php<span class="token punctuation">;</span>          <span class="token keyword">include</span> fastcgi_params<span class="token punctuation">;</span>          <span class="token keyword">fastcgi_param</span> SCRIPT_FILENAME <span class="token variable">$document_root</span><span class="token variable">$fastcgi_script_name</span><span class="token punctuation">;</span>          <span class="token keyword">fastcgi_param</span> PATH_INFO <span class="token variable">$fastcgi_path_info</span><span class="token punctuation">;</span>      <span class="token punctuation">}</span>  <span class="token keyword">location</span> <span class="token operator">~</span> <span class="token punctuation">.</span><span class="token operator">*</span>\<span class="token punctuation">.</span><span class="token punctuation">(</span>gif<span class="token operator">|</span>jpg<span class="token operator">|</span>jpeg<span class="token operator">|</span>png<span class="token operator">|</span>bmp<span class="token operator">|</span>swf<span class="token operator">|</span><span class="token keyword">flv</span><span class="token operator">|</span><span class="token keyword">mp4</span><span class="token operator">|</span>ico<span class="token punctuation">)</span>$ <span class="token punctuation">{</span>        <span class="token keyword">expires</span> 30d<span class="token punctuation">;</span>        <span class="token keyword">access_log</span> off<span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">location</span> <span class="token operator">~</span> <span class="token punctuation">.</span><span class="token operator">*</span>\<span class="token punctuation">.</span><span class="token punctuation">(</span>js<span class="token operator">|</span>css<span class="token punctuation">)</span><span class="token operator">?</span>$ <span class="token punctuation">{</span>        <span class="token keyword">expires</span> 7d<span class="token punctuation">;</span>        <span class="token keyword">access_log</span> off<span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">location</span> <span class="token operator">~</span> <span class="token operator">/</span>\<span class="token punctuation">.</span>ht <span class="token punctuation">{</span>        <span class="token keyword">deny</span> all<span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">server</span> <span class="token punctuation">{</span>  <span class="token keyword">listen</span> <span class="token number">80</span><span class="token punctuation">;</span>  <span class="token keyword">listen</span> <span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">:</span><span class="token number">80</span><span class="token punctuation">;</span>  <span class="token keyword">server_name</span> xiaolin<span class="token punctuation">.</span>in<span class="token punctuation">;</span>  <span class="token keyword">return</span> <span class="token number">301</span> <span class="token keyword">https</span><span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>xiaolin<span class="token punctuation">.</span>in<span class="token variable">$request_uri</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>为了使用 quic 特性，我们需要用 Caddy 在 UDP 端口反代一下网站 (etc/nginx/caddy/Caddyfile)</p><pre class="line-numbers highlight language-caddy"><code class="language-caddy">https://xiaolin.in {    gzip    tls /ssl/_.xiaolin.in.crt /ssl/_.xiaolin.in.key    proxy / https://nginx {        insecure_skip_verify        transparent        websocket    }}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>最后在 wwwroot/你的网站名 下放好程序就可以输入以下命令开始部署了</p><pre class="line-numbers highlight language-bash"><code class="language-bash"><span class="token function">sudo</span> docker-compose up -d<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>启动成功后如果不出意料的话就可以看见熟悉的界面了</p><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><p>MySQL 的话可能在小机机上需要添加 SWAP 内存，不然可能会爆 InnoDB: mmap(137363456 bytes) failed; errno 12 这种玩意儿</p><p>至于更新的话，萨摩自己都说了自己是「追新族」了hhh，那就不用担心容器太旧的问题了，至于更新的话，执行下面第一行代码修改后再执行第二行代码就可以了</p><pre class="line-numbers highlight language-bash"><code class="language-bash"><span class="token function">git</span> pull <span class="token operator">&amp;&amp;</span> <span class="token function">cp</span> .env.example .env <span class="token operator">&amp;&amp;</span> <span class="token function">cp</span> docker-compose.example.yml docker-compose.yml<span class="token function">sudo</span> docker-compose up -d --no-deps --build<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>好啦又水了一篇文章 （逃</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/docker-lemp.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>智能卡改造工程(伪)</title>
      <link>https://www.xiaolin.in/read/smart-card-reconstruction-project.html</link>
      <guid>https://www.xiaolin.in/read/smart-card-reconstruction-project.html</guid>
      <pubDate>Sat, 16 Feb 2019 06:18:17 GMT</pubDate>
      <description>
      
        
        
          &lt;h1 id=&quot;废话&quot;&gt;&lt;a href=&quot;#废话&quot; class=&quot;headerlink&quot; title=&quot;废话&quot;&gt;&lt;/a&gt;废话&lt;/h1&gt;&lt;p&gt;前段时间在破站(?)看到了一个up主将公交卡芯片取出来然后塞到了自制的水晶滴胶戒指里，觉得挺有意思的，就决定自己试一下&lt;/p&gt;
&lt;p&gt;所需材
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h1 id="废话"><a href="#废话" class="headerlink" title="废话"></a>废话</h1><p>前段时间在破站(?)看到了一个up主将公交卡芯片取出来然后塞到了自制的水晶滴胶戒指里，觉得挺有意思的，就决定自己试一下</p><p>所需材料 / 工具: 一张你要改造的智能卡、线圈(铜线也可以，不过要自己绕)、新的卡壳(也可以用滴胶，不过小霖用3D打印惹 )、环氧树脂溶解剂(小霖用的<a href="https://item.taobao.com/item.htm?id=559852697888" rel="external nofollow noopener noreferrer" target="_blank">这个</a>)、电烙铁和各种配件、一个附件</p><h1 id="开始搞事"><a href="#开始搞事" class="headerlink" title="开始搞事"></a>开始搞事</h1><h2 id="找芯片"><a href="#找芯片" class="headerlink" title="找芯片"></a>找芯片</h2><p>先拿出你的卡片，然后用强光手电或者你手机的闪光灯找到芯片位置</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_024854.jpg" alt="找芯片"></p><p>然后用油性笔画出芯片位置方便剪开(当然你也可以硬核一些直接开剪)</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_105740.jpg" alt="画位置"></p><p>别急着进入下一步，趁这个卡还没坏赶紧用手机NFC读一下这卡的卡号看看一会对不对的上，不然坏了都不知道 (</p><h2 id="取芯片"><a href="#取芯片" class="headerlink" title="取芯片"></a>取芯片</h2><p>先用剪刀把刚才画出来的框框剪下来</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_114536.jpg" alt="芯片块"></p><p>然后准备一个小容器(能放得下这一块东西大小即可)，然后往里面加入溶解剂，将卡片扔到里面</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_115452.jpg" alt="溶解"></p><p>注意：该溶解剂有挥发性，建议在室外操作，若接触到皮肤请用大量清水冲洗 (因为我试过..)</p><p>等大概二十分钟就可以用镊子把芯片取出来了，放在清水下擦洗干净就可以用了</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_121853.jpg" alt="溶解完成"></p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_121918.jpg" alt="调出芯片"></p><h2 id="接线圈"><a href="#接线圈" class="headerlink" title="接线圈"></a>接线圈</h2><p>芯片上面的线理论上是不需要了，所以可以直接拿剪刀剪掉(?欢迎大佬指正)</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_122153.jpg" alt="芯片"></p><p>拿出之前买的线圈，把上面的芯片沿根剪掉(因为小霖<del>懒的用手绕</del>太菜了不会绕，所以就买了人家绕好的)</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_120714.jpg" alt="线圈"></p><p>然后就到了喜闻乐见的焊接时间，但是因为小霖太太太菜了，加上房间还没有装修好，把电烙铁拿出来很麻烦，所以就不焊了。但是有几个tips (因为小霖之前做坏了好几张卡</p><ul><li>不要把烙铁头放在芯片上太久，放太久的话芯片可能会爆炸(误)</li><li>焊锡不要弄太多了 (这个无所谓的啦</li><li>一定要焊上去再读卡，不然是读不出来的 (不知道为啥</li><li>然后如果焊上去了还读不出来那看看是不是线圈有问题，如果完全没问题的话那你就凉了hhh</li></ul><p>但是呢为了给大家良好的视觉体验，我决定………假装自己焊得很好</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_122915.jpg" alt="...沙雕玩意儿"></p><h2 id="做壳子"><a href="#做壳子" class="headerlink" title="做壳子"></a>做壳子</h2><p>emm壳子大概有两种吧，目前没发现市面上有卖可以打开的卡，所以都是DIY的。第一种是滴胶做的，但估计是小霖操作有问题放了两三周还是黏糊糊的，特别恶心，黏在手上还很难洗掉。而小霖又正好买了台3D打印机，所以就直接上3D打印的了</p><p><img src="../images/2019-02-smart-card-reconstruction-project/Snipaste-2019-02-16-13-13-22.png" alt="建模"></p><p>粗略的量了一下，这东西外径大概是27mm，内径22.5mm，我们打开win10自带的辣鸡3D Builder (因为太菜了只会用这个)</p><p>然后就弄了个这个鬼东西出来hhh (能用就行要什么自行车</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_134201.jpg" alt="装配"></p><p>也是正好塞下这个芯片呢，点上热熔胶，盖上盖子，串好绳子，一个<del>小巧</del>丑的要死的智能卡就做好了喵</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_134325.jpg" alt="成品"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>整个过程其实也不算难，但是最终的效果怎样就要靠你自己发挥了，本来想找个定制这种东西的厂商做一个壳子的，结果发现根本没有这种东西啊喂，然后就出现了这个<del>小巧</del>丑的要死的3D打印壳 (其实本来想在壳子上印一些可爱(划掉)的东西，奈何技术不精(就是穷)死活印不出来</p><p>顺便发一下自己的钥匙串吧hhh</p><p><img src="../images/2019-02-smart-card-reconstruction-project/IMG_20190216_134450.jpg" alt="钥匙串"></p><p>嗯最后提醒一下剪卡之前做好失败的心理准备，小霖可是借过同学两周饭卡的~</p><p>就酱 溜 (</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/smart-card-reconstruction-project.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>2018 年度简报</title>
      <link>https://www.xiaolin.in/read/2018-annual-briefing.html</link>
      <guid>https://www.xiaolin.in/read/2018-annual-briefing.html</guid>
      <pubDate>Sun, 30 Dec 2018 07:00:13 GMT</pubDate>
      <description>
      
        
        
          &lt;h1 id=&quot;导语&quot;&gt;&lt;a href=&quot;#导语&quot; class=&quot;headerlink&quot; title=&quot;导语&quot;&gt;&lt;/a&gt;导语&lt;/h1&gt;&lt;p&gt;博客之前好像也没有年度简报一类的东西，但是今天回访了下友链发现很多博主都写了年报，所以小霖也就跟下风咯hhh(误)&lt;/p&gt;
&lt;p&gt;这个破博客
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h1 id="导语"><a href="#导语" class="headerlink" title="导语"></a>导语</h1><p>博客之前好像也没有年度简报一类的东西，但是今天回访了下友链发现很多博主都写了年报，所以小霖也就跟下风咯hhh(误)</p><p>这个破博客从 2017 到现在已经两个年头啦，在此感谢所有访问者，无论你是出于什么目的</p><blockquote><p>白昼之光，岂知夜色之深</p><p>尼采</p></blockquote><h1 id="一些数据"><a href="#一些数据" class="headerlink" title="一些数据"></a>一些数据</h1><p>先看一些与隔壁的 dalao 站比起来惨不忍睹的数据</p><ul><li>用户: 6,450 与去年相比增长 308%</li><li>会话: 8,827 与去年相比增长 259.6%</li><li>新增有效文章 7 篇</li><li>新增有效评论 152 条</li></ul><h1 id="一些事"><a href="#一些事" class="headerlink" title="一些事"></a>一些事</h1><h2 id="大事"><a href="#大事" class="headerlink" title="大事"></a>大事</h2><ul><li>社交主要场所从 QQ 转向了 Telegram</li><li>升入省排名第十的高中</li><li>受邀加入学校信息学集训队 (是蒟蒻!)</li><li>获取一些省级和市级的小破奖</li><li>进入十五岁 (唉又老了一岁</li><li>房间的装修搞定惹</li><li>在学校机房里嫖到了台 64C 512G 的大鸡鸡</li></ul><h2 id="小事"><a href="#小事" class="headerlink" title="小事"></a>小事</h2><ul><li>买了一堆看起来很棒但又没啥用的东西</li><li>“XiaoLin’s APIs” API 集群基本完工 (咕咕咕</li><li>写了若干辣鸡<del>项目</del>Bug</li><li>入门 C艹 和算法</li><li>········</li></ul><h1 id="一些人"><a href="#一些人" class="headerlink" title="一些人"></a>一些人</h1><p>今年我主要活跃在 Telegram 上，主要原因还是因为 QQ 的辣鸡。在探索 Telegram 的新世界时交到了许多新朋友，比如优秀的库先生(Kugelblitz)、小羊驼(lwl12)、萨摩犬(METO)等 dalao，并且认识了许许多多的菊苣。</p><p>但与此同时，我发现 QQ 上有些曾经的小伙伴已经渐渐被我所淡忘了，所以 QQ2TG 这个项目就出现了。它开发周期前前后后加起来可能有近一个半月，现在回想起来觉得有点不可思议(毕竟那么点小破东西)。</p><p>我平常是一个不喜欢热闹的人，所以对在这里感谢那些陪伴我走过2018年的小伙伴们，明年也要多多关照呢!</p><h1 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h1><p>因为升入了高中，而且在保持文化课成绩的基础下还要用一年把别人学了八年的算法全部恶补回来，明年博客的更新可能会少掉些许，但是无论如何， 这个博客依然会活下去，还是”<a href="https://xiaolin.in/about-me" rel="external nofollow noopener noreferrer" target="_blank">关于</a>“中的那句话:</p><blockquote><p>写博客不为了什么东西，觉得在茫茫的互联网，有一个自己的小小地盘，闲下来写点东西（废话啊、流水账什么的），足矣。</p><p>Kay</p></blockquote><p>无论如何，感谢你能读到最后。新的一年，让我们继续加油吧！</p><p>借用小羊驼去年年度简报的一句话来收尾吧:</p><blockquote><p>凛风起，白云涌。小霖的梦花园，二周岁，生日快乐。</p></blockquote>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/2018-annual-briefing.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>QQ2TG – 轻量级QQ &lt;-&gt; Telegram互联程序</title>
      <link>https://www.xiaolin.in/read/qq2tg.html</link>
      <guid>https://www.xiaolin.in/read/qq2tg.html</guid>
      <pubDate>Thu, 12 Jul 2018 12:06:44 GMT</pubDate>
      <description>
      
        
        
          &lt;blockquote&gt;
&lt;p&gt;已弃坑，随缘重构&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;项目地址 : &lt;a href=&quot;https://github.com/LoliLin/QQ2TG&quot; rel=&quot;external nofollow noopener noreferrer&quot; 
        
      
      </description>
      
      
      <content:encoded><![CDATA[<blockquote><p>已弃坑，随缘重构</p></blockquote><p>项目地址 : <a href="https://github.com/LoliLin/QQ2TG" rel="external nofollow noopener noreferrer" target="_blank">GayHub</a></p><p>OnePlus 6 电池比较小, 耗电也比较快, 找了找原因, 发现是QQ这国产毒瘤的锅, 于是就想着写一个小程序, 让QQ终身呆在垃圾桶里, 就这样, 这个无底洞出现了 //滑稽</p><h2 id="适用对象"><a href="#适用对象" class="headerlink" title="适用对象"></a>适用对象</h2><p>目前仅适用于 <strong>轻度使用QQ</strong> 或 不<strong>想使用多个聊天客户端的</strong> TG<strong>重度</strong>使用者</p><p>毕竟还有些功能不能实现, 不装QQ暂不可能</p><h1 id="QQ2TG"><a href="#QQ2TG" class="headerlink" title="QQ2TG"></a>QQ2TG</h1><p>一个帮助 QQ 与 Telegram 互联的小程序 <img src="../images/2018-07-qq2tg/qq2tg.png" alt="qq2tg.png"></p><h2 id="演示"><a href="#演示" class="headerlink" title="演示"></a>演示</h2><p><img src="../images/2018-07-qq2tg/ezgif-6-033ebb86c97d.png" alt="聊天界面">)<img src="../images/2018-07-qq2tg/5b6be81161b02.png" alt="聊天记录界面"></p><h2 id="简述"><a href="#简述" class="headerlink" title="简述"></a>简述</h2><p>程序主体使用<code>PHP</code>编写, 依赖于拓展<code>swoole</code>, 配合酷Q的<a href="https://github.com/richardchien/coolq-http-api" rel="external nofollow noopener noreferrer" target="_blank">coolq-http-api</a>插件使用</p><p>目前还不是十分完善, 可能存在各种奇怪的问题, 还请各位 dalao 指点一二</p><h2 id="Feature"><a href="#Feature" class="headerlink" title="Feature"></a>Feature</h2><ul><li>使用 Swoole 的异步 HTTP Client 请求 Telegram Bot API 服务器</li><li>将QQ图片缓存为 Telegram File ID , 提高效率</li><li>拓展性较高, 可轻松支持一个新的 CQ 码或 Telegram 消息格式</li><li>支持双向发起私聊消息</li><li>支持 QQ 自带的 Emoji</li><li>支持 Telegram 端撤回 QQ 消息</li><li>支持私聊 QQ 黑名单</li><li>支持 Sticker 无损转发 (可以当 Sticker 转移机器人啦233</li><li>附带 Web 端消息查看</li><li>支持位置信息发送与接收</li><li>机器人在线时手机电脑可同时在线</li><li>采用世界上最好的语言编写 ((日常拉仇恨</li></ul><p>实在编不出来了… /滑稽</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><ol><li>将代码拖到本地 : <code>git clone https://github.com/XiaoLin0815/QQ2TG.git</code></li><li>将<code>config\.env.example</code>改名为<code>config\.env</code>并根据提示及示例填写完整</li><li>安装酷Q(若要发送图片则要求安装Pro版本)以及<a href="https://github.com/richardchien/coolq-http-api" rel="external nofollow noopener noreferrer" target="_blank">coolq-http-api</a>插件，并添加配置以下参数:</li></ol><ul><li><p>酷Q:</p><ul><li><p>更改登录模式为平板模式</p><pre class="line-numbers highlight language-ini"><code class="language-ini"><span class="token selector">[Debug]</span><span class="token constant">Platform</span><span class="token attr-value"><span class="token punctuation">=</span>2</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p>HTTP API:</p><ul><li><p>use_ws_reverse : 使用反向 WebSocket 通讯</p></li><li><p>ws_reverse_api_url/ws_reverse_event_url ： 反向WS服务器地址，对应操作2中配置的<code>websocket -&gt; host/port</code></p></li><li><p>host/port/use_http : HTTP服务器设置，对应操作2中配置的</p><pre><code>coolq -&gt; http_url</code></pre><pre class="line-numbers highlight language-json"><code class="language-json"><span class="token punctuation">{</span>    <span class="token property">"use_ws_reverse"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token property">"ws_reverse_api_url"</span><span class="token operator">:</span><span class="token string">"ws://192.168.31.120:9501"</span><span class="token punctuation">,</span>    <span class="token property">"ws_reverse_event_url"</span><span class="token operator">:</span><span class="token string">"ws://192.168.31.120:9501"</span><span class="token punctuation">,</span>    <span class="token property">"host"</span><span class="token operator">:</span><span class="token string">"0.0.0.0"</span><span class="token punctuation">,</span>    <span class="token property">"port"</span><span class="token operator">:</span><span class="token number">5700</span><span class="token punctuation">,</span>    <span class="token property">"use_http"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul></li></ul></li></ul><ol><li><p>确保您本地可访问 Telegram Bot API 服务器或填写好了<code>proxy -&gt; host/port</code>(若不需要请留空)</p></li><li><p>确保您的PHP已安装了<code>swoole</code>扩展</p></li><li><p>进入目录, 输入<code>composer update</code></p></li><li><p>在网站环境中设置 <code>public/</code> 为运行目录并确保其中的 <code>images</code> 目录可写</p></li><li><p>访问 <code>https://api.telegram.org/bot/setWebHook?url=https:///webhook.php</code> 设置WebHook, 若认为不安全, 可自行改变文件名</p></li><li><p>配置进程守护程序(</p><p>强烈建议</p><p>):</p><ul><li><p>Systemd</p><pre class="line-numbers highlight language-ini"><code class="language-ini"># /usr/lib/systemd/system/QQ2TG.service<span class="token selector">[Unit]</span><span class="token constant">Description</span><span class="token attr-value"><span class="token punctuation">=</span>QQ2TG</span><span class="token constant">Documentation</span><span class="token attr-value"><span class="token punctuation">=</span>https://github.com/XiaoLin0815/QQ2TG</span><span class="token constant">After</span><span class="token attr-value"><span class="token punctuation">=</span>network.target</span><span class="token selector">[Service]</span><span class="token constant">ExecStart</span><span class="token attr-value"><span class="token punctuation">=</span>/path/to/your/php /path/to/2018-07-qq2tg/run.php</span><span class="token constant">Restart</span><span class="token attr-value"><span class="token punctuation">=</span>always</span><span class="token selector">[Install]</span><span class="token constant">WantedBy</span><span class="token attr-value"><span class="token punctuation">=</span>multi-user.target</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul></li><li><p>终端输入 <code>service QQ2TG start</code></p></li><li><p>enjoy it</p></li></ol><ul><li>TG端发送消息:<ol><li>私聊机器人并发送 <code>/new_chat</code></li><li>选择要私聊的用户</li><li>回复机器人发出的消息开始私聊</li></ol></li><li>Web 消息查看:<ol><li>在 Config.php 中设置好 <code>program -&gt; password</code></li><li>打开 <code>http(s):///admin/message.html</code> 并将权限密钥填写完整</li><li>enjoy it</li></ol></li></ul><h2 id="配置安全-极为重要"><a href="#配置安全-极为重要" class="headerlink" title="配置安全 (极为重要!)"></a>配置安全 (<strong>极为重要!</strong>)</h2><ul><li><p>Nginx:</p><pre class="line-numbers highlight language-nginx"><code class="language-nginx"><span class="token keyword">location</span> <span class="token operator">~</span> <span class="token punctuation">(</span><span class="token operator">^</span>\<span class="token punctuation">.</span><span class="token operator">|</span><span class="token operator">/</span>\<span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token number">403</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li><li><p>Apache:</p><pre class="line-numbers highlight language-apache"><code class="language-apache">RewriteEngine OnRewriteRule (^\.|/\.) - [F]<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p>IIS:</p><pre class="line-numbers highlight language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>configuration</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>system.webServer</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rewrite</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rules</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rule</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Block access to dotfiles<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>match</span> <span class="token attr-name">url</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>(^\.|/\.)<span class="token punctuation">"</span></span> <span class="token attr-name">ignoreCase</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>action</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>CustomResponse<span class="token punctuation">"</span></span> <span class="token attr-name">statusCode</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>403<span class="token punctuation">"</span></span> <span class="token attr-name">statusReason</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Forbidden<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rule</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rules</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rewrite</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>system.webServer</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>configuration</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p><strong>本项目仅对 酷 Q Pro 版本提供支持, 对使用 Air 或 Lite 的用户不提供技术支持</strong></p><p>日志等级建议调至 2 或以上，否则可能会造成严重的消息延误</p><p>由于 Telegram 的特殊性，所有由 QQ 转发至 Telegram 的 GIF 图像都会以链接的方式发送，至于客户端能不能自动解析显示就要看运气了 /滑稽</p><p>若要在 Linux 上使用 酷Q , 可参考<a href="https://github.com/CoolQ/docker-wine-coolq" rel="external nofollow noopener noreferrer" target="_blank">这里</a></p><h2 id="TODO"><a href="#TODO" class="headerlink" title="TODO"></a>TODO</h2><ul><li><del>异步消息发送</del></li><li><del>图片信息缓存</del></li><li><del>用户群名片缓存</del></li><li><del>支持私聊消息</del></li><li><del>支持消息撤回</del></li><li>更新时自动更新配置</li><li>解决文档中提到的问题<ul><li><del>从 Telegram 端发起私聊</del></li></ul></li><li><del>更多CQ码兼容</del></li></ul><p>dalao 们如果有任何问题或者建议请在issue中提出或直接提交PR，感谢万分</p><h2 id="题外话"><a href="#题外话" class="headerlink" title="题外话"></a>题外话</h2><p>毕竟初中生, 就是头脑简单四肢发达, 思维算法一坨屎, 英语极差, 导致代码里很多奇怪或者重复的变量名, 还请多多包涵,有些地方代码质量不高、效率低下, 或者结构有问题的, 还请 dalao 们多多指点</p><p>或许真的要像<a href="https://lwl.moe/" rel="external nofollow noopener noreferrer" target="_blank">LWL</a>说的那样<code>变得更优秀</code>吧</p><h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><p>2018/08/11 完全重构配置调用方式</p><p>2018/08/10 支持位置信息发送与接收</p><p>2018/08/09 新增 Web 端消息查看</p><p>2018/08/08 新增 rich/sign CQ 码兼容</p><p>2018/07/27 新增日志记录</p><p>2018/07/26 支持 Sticker 本地处理转发</p><p>2018/07/22 支持 Telegram 端先发起私聊</p><p>2018/07/20 支持消息撤回</p><p>2018/07/18 回复消息提醒对方</p><p>2018/07/12 支持双向私聊消息</p><p>2018/07/11 更新名片获取机制, 添加伪消息回复支持</p><p>2018/07/05 添加图片信息缓存、消息异步发送、群名片缓存, 支持保存消息</p><p>2018/07/02 第一版，支持 QQ 与 Telegram 消息双向互通，支持图片、sticker 发送</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/qq2tg.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>OnePlus6 开箱&amp;使用小记</title>
      <link>https://www.xiaolin.in/read/oneplus6.html</link>
      <guid>https://www.xiaolin.in/read/oneplus6.html</guid>
      <pubDate>Fri, 06 Jul 2018 06:47:27 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;一开始是想买亮瓷黑的, 但看了看评价, 有的说太滑有的说太容易脏, 于是就买了墨岩黑&lt;br&gt;//本来想上京东的, 结果发现京东无货, 就直接去官网买了&lt;/p&gt;
&lt;h1 id=&quot;开箱&quot;&gt;&lt;a href=&quot;#开箱&quot; class=&quot;headerlink&quot; title=&quot;开箱&quot;&gt;&lt;
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>一开始是想买亮瓷黑的, 但看了看评价, 有的说太滑有的说太容易脏, 于是就买了墨岩黑<br>//本来想上京东的, 结果发现京东无货, 就直接去官网买了</p><h1 id="开箱"><a href="#开箱" class="headerlink" title="开箱"></a>开箱</h1><p>箱子里有手机, 磨砂壳还有全屏贴膜 （用的老爹的Mate 10 Pro）</p><p><img src="../images/2018-07-oneplus6/5b3f0550ea31e.jpg" alt="包装"></p><p><img src="../images/2018-07-oneplus6/5b3f055f02b8c.jpg" alt="打开"></p><p><img src="../images/2018-07-oneplus6/5b3f07311079e.jpg" alt="开盒"></p><p><img src="../images/2018-07-oneplus6/5b3f07e83e91f.jpg" alt="充电器"></p><p><img src="../images/2018-07-oneplus6/5b3f0802be945.jpg" alt="保护套"></p><p>在网上经常听到有人说OLED屏怎么怎么样, 其实个人感觉还好, 只要适应了就行</p><p><img src="../images/2018-07-oneplus6/5b3f082b338d3.jpg" alt="启动"></p><p><img src="../images/2018-07-oneplus6/5b3f08682ddf7-9444684.jpg" alt="人脸识别"></p><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>骁龙845的性能根本没的说, 十分顺畅, 比之前的过气旗舰Mate 9好多了<br>拍照还说得过去, 我是看不出什么东西 (渣渣日常</p><p><img src="../images/2018-07-oneplus6/5b3f0a13a6d15.jpg" alt="样照"></p><p>//刚刚发现一加的云服务用的套路云???</p><h1 id="折腾"><a href="#折腾" class="headerlink" title="折腾"></a>折腾</h1><p>作为<img src="../images/2018-07-oneplus6/5b3f0ae8771b4.png" alt="截图">手机, 应该还是很好折腾的</p><p><strong>以下内容仅适用于 Android 9-</strong></p><h2 id="TWRP"><a href="#TWRP" class="headerlink" title="TWRP"></a>TWRP</h2><p>根本不用管解锁码还是15天限制, 上来就 <code>fastboot oem unlock</code> 一梭子<br>去<a href="https://dl.twrp.me/enchilada/" rel="external nofollow noopener noreferrer" target="_blank">TWRP官网</a>下好TWRP, 输入<code>fastboot boot twrp.img</code>, 临时的TWRP就刷好了, 进到TWRP把放在手机根目录下的安装包给装上TWRP就刷好了</p><h2 id="Magisk"><a href="#Magisk" class="headerlink" title="Magisk"></a>Magisk</h2><p>去<a href="https://github.com/topjohnwu/Magisk/releases/" rel="external nofollow noopener noreferrer" target="_blank">GayHub</a>上把Magisk的Installer给下载好, 放在手机根目录下, 重启进入恢复模式, 安装刚刚下好的包, Magisk就装好了</p><h2 id="Xposed"><a href="#Xposed" class="headerlink" title="Xposed"></a>Xposed</h2><p>在手机的Magisk Manager中搜索Xposed, 安装API27的框架, 然后下载Systemless的Xposed Installer就可以成功激活了</p><p>这一块感谢<a href="https://blessing.studio/" rel="external nofollow noopener noreferrer" target="_blank">printempw</a> dalao的耐心帮助(从Twitter找到Telegram) //毕竟我就是个什么都不会只会Ctrl+C的死肥宅而已</p><h1 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h1><p>一加的Dash闪充也是非常快的, 给了我个非常大的惊喜<br>刘海屏用习惯了其实也还不错, 没有想象中的那么差劲<br>只有一个扬声器比较难受, 音质一般般 (只听个响<br>指纹传感器不知道为什么经常抽风, 我同一个手指得加两遍才好一些<br>OLED的屏幕一开始看着会胸闷, 但在设置里调成自适应模式就会好很多了</p><p>就酱 (逃</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/oneplus6.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>TicWatch S 简易小评 + 更换内置SIM卡</title>
      <link>https://www.xiaolin.in/read/ticwatch-s.html</link>
      <guid>https://www.xiaolin.in/read/ticwatch-s.html</guid>
      <pubDate>Tue, 26 Jun 2018 04:27:42 GMT</pubDate>
      <description>
      
        
        
          &lt;h2 id=&quot;缘由&quot;&gt;&lt;a href=&quot;#缘由&quot; class=&quot;headerlink&quot; title=&quot;缘由&quot;&gt;&lt;/a&gt;缘由&lt;/h2&gt;&lt;p&gt;前几周看到学校里有人带了华为watch 2，心血来潮也想买一个智能手表，正好把现役的小米手环2给换掉，在网上挑三拣四，也就只剩 Ticwat
        
      
      </description>
      
      
      <content:encoded><![CDATA[<h2 id="缘由"><a href="#缘由" class="headerlink" title="缘由"></a>缘由</h2><p>前几周看到学校里有人带了华为watch 2，心血来潮也想买一个智能手表，正好把现役的小米手环2给换掉，在网上挑三拣四，也就只剩 Ticwatch S&amp;E 看起来还不错</p><h2 id="开箱"><a href="#开箱" class="headerlink" title="开箱"></a>开箱</h2><p><img src="../images/2018-06-ticwatch-s/IMG_20180609_195744.jpg" alt="外包装"></p><p><img src="../images/2018-06-ticwatch-s/IMG_20180626_120059.jpg" alt="本体"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>手表是国内版本的，带3G服务，系统上用的Ticwear（基于Android5.0开发），带上一块OLED显示屏、512M RAM以及300mha的电池，基本可以做到一天一冲</p><p>然而手表的表带比较硬，不是想象中小米手环那样舒服，但适应一下还是可以习惯的</p><p>每天晚修的时候偷偷把手表塞到柜子里充电，大概一个小时就能充满，速度还能接受</p><p>出门问问功能太冗杂了，还好有个Ticwear可以凑合着用，里面有个AW(Android Wear)兼容模式，但连上以后发现没啥用</p><h2 id="吐槽"><a href="#吐槽" class="headerlink" title="吐槽"></a>吐槽</h2><ul><li><p>Android5.1 太老了，华为都更到了 Android7.1 (虽然要那么高版本不知道有什么用</p></li><li><p>国内版系统自带语音助手是出门问问，简直就是个渣，刷国外版系统 3G 模块还用不了 (十分后悔</p></li><li><p>系统不能装中文输入法，要打中文只能用问问的语音输入，简直了</p></li><li><p>问问应用市场里的东西简直少的可怜，要啥没啥，还好偶然连上电脑发现可以用 adb 手动安装APK</p></li><li><p>自带的SIM卡用的民生通讯(虚拟运营商)，但拆机以后把自己的卡插进去也可以用 (仅限联通</p></li></ul><h2 id="换卡"><a href="#换卡" class="headerlink" title="换卡"></a>换卡</h2><p>因为内置的SIM卡用的是什么鬼民生通讯，而且资费还贼鸡儿贵，就准备更换SIM卡</p><p>看了看网上都说可以拆来来看，我就作死尝试了一下：</p><p><img src="../images/2018-06-ticwatch-s/IMG_20180627_171007.jpg" alt="准备"></p><p>新卡用的是阿里小宝卡(联通，一个月19元，包含1G流量和100分钟通话)，昨晚定的今早就到了</p><p><img src="../images/2018-06-ticwatch-s/IMG_20180627_171640.jpg" alt="拆卸"></p><p>装上以后开机，当当当当！3G信号！</p><p><img src="../images/2018-06-ticwatch-s/IMG_20180627_171834.jpg" alt="界面"></p><p>赶紧打个电话试试，立马就开始震了，excellent！</p><p><img src="../images/2018-06-ticwatch-s/IMG_20180627_171925.jpg" alt="响铃"></p><p>弄完把盖子盖好，腕带装上，拧上螺丝，就可以正常使用了喵~ //吐槽: 有一个螺丝已经严重滑丝了，估计这次拧上就再也拧不下来了…</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>总体来说还是有点失望的，很多地方没有达到预期，如果有想要买的可以考虑一下海外版（无SIM卡），个人认为比国内版好不知道多少倍</p><p>就酱~</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/ticwatch-s.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>萝莉控的宣言</title>
      <link>https://www.xiaolin.in/read/loli.html</link>
      <guid>https://www.xiaolin.in/read/loli.html</guid>
      <pubDate>Wed, 04 Apr 2018 15:34:04 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;(这么会有这么hentai的宣言，不是博主发的)&lt;/p&gt;
&lt;p&gt;托尔斯泰：萝莉不是因为美丽才可爱，而是因为可爱才美丽。&lt;/p&gt;
&lt;p&gt;屠格涅夫：先相信自己，然后萝莉才会相信你。&lt;/p&gt;
&lt;p&gt;哥白尼：人的天职在于勇敢探索萝莉。&lt;/p&gt;
&lt;p&gt;爱迪生：萝莉控，就是99%的he
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>(这么会有这么hentai的宣言，不是博主发的)</p><p>托尔斯泰：萝莉不是因为美丽才可爱，而是因为可爱才美丽。</p><p>屠格涅夫：先相信自己，然后萝莉才会相信你。</p><p>哥白尼：人的天职在于勇敢探索萝莉。</p><p>爱迪生：萝莉控，就是99%的hentai，加上1%的真爱。</p><p>爱因斯坦：控萝莉比推倒萝莉更重要。推倒萝莉只是从生理上满足自私，而控萝莉则是需要审美和追求，这也标志着科学的真正进步。</p><p>托尔斯泰：萝莉控不是一种享乐，而是一种沉重的存在。</p><p>培根：萝莉就是力量。</p><p>钢铁是怎样炼成的：人最宝贵的东西是生命，生命对人来说只有一次。因此，人的一生应当这样度过:当一个人回首往事时,不因没追求御姐而悔恨,也不因喜欢幼女而羞愧;这样,在他临死的时候,能够说,我把整个生命和全部精力都献给了人生最宝贵的事业——为萝莉的解放而奋斗。</p><p>罗曼罗兰：萝莉最沉重的负担不是*部，而是双马尾。</p><p>牛顿：如果我比别人看得更远的话，那是因为我有萝莉。</p><p>雨果：萝莉，是人们必须的。什么也不控的人是不会幸福的。</p><p>爱因斯坦：一个萝莉控的价值，不应该看他得到了什么，而一个看他为萝莉贡献了什么。</p><p>谚语：一天一个萝莉，不用请医生。</p><p>达尔文：物竞天择，萝莉生存。</p><p>高尔基：萝莉是人类进步的阶梯。</p><p>海明威：人可以被消灭，不可以没萝莉！</p><p>孔子:三人行必有萝莉，择其萌者而控之。</p><p>老子：萌可萌，非常萌。</p><p>孙子：萝莉，国之大事，不可不察也。</p><p>孟子：正太不如御姐，御姐不如萝莉。</p><p>卡缪儿：要对生活的每个萝莉都充满感动。</p><p>汉光武帝：有萝莉，事竟成。</p><p>谚云：万般皆下品，唯有萝莉好。</p><p>居礼夫人：弱者等待萝莉，强者创造萝莉。</p><p>爱迪生：萝莉能增进快乐，减少痛苦。</p><p>颜之推：积财千万，不如萝莉在身。</p><p>西谚云：伟人的后面必定有一位伟大的萝莉。</p><p>元首:反对萝莉的,都是德意志的敌人!</p><p>李白：天生萝莉必有用，萝莉千金买不来。</p><p>杜甫：会当凌绝顶，一览众萝莉。</p><p>白居易：同是天涯萝莉控，相逢何必曾相识？</p><p>韩愈：世有幼女，然后有萝莉。幼女常有而萝莉不常有。</p><p>范仲淹：先萝莉之忧而忧，后萝莉之乐而乐。</p><p>欧阳修：萝莉控之心不在酒，在乎萝莉之间也，萝莉之萌，得之心而愚之酒也。</p><p>马致远：幼女易得，萝莉难求。</p><p>孙中山: 推倒萝莉尚未成功 萝莉控们仍需努力。</p><p>鲁迅：其实地上本没有萝莉控，喜欢的人多了，也便成了萝莉控。</p><blockquote><p>转自 <a href="https://wwww.lvmoo.com/685.love" rel="external nofollow noopener noreferrer" target="_blank">凯の秘密基地</a></p></blockquote>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/loli.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>AirPods使用小记</title>
      <link>https://www.xiaolin.in/read/airpods.html</link>
      <guid>https://www.xiaolin.in/read/airpods.html</guid>
      <pubDate>Sat, 28 Oct 2017 11:20:44 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;几周前帮别人写了个辣鸡东西，赚了点小钱，就下决心买个airpods玩玩&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.apple.com/airpods/&quot; rel=&quot;external nofollow noopener noreferr
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>几周前帮别人写了个辣鸡东西，赚了点小钱，就下决心买个airpods玩玩</p><blockquote><p><a href="https://www.apple.com/airpods/" rel="external nofollow noopener noreferrer" target="_blank">Apple官方介绍</a></p></blockquote><p>既然是Apple的东西肯定用Apple设备最好是吧，然而我除了一个吃灰的MacBook以外就只剩一个黑果了 （穷</p><p>然而这并改变不了什么，找了个淘宝口碑好的商家1100就入了（得夸一下顺丰从北京到广东一天就到了），先上图🌝</p><p><img src="../images/2017-10-airpods/IMG_20171021_171522.png" alt="开箱"></p><p><img src="../images/2017-10-airpods/IMG_20171021_171936.png" alt="说明书"></p><p><img src="../images/2017-10-airpods/IMG_20171021_172001.png" alt="配件"></p><p><img src="../images/2017-10-airpods/IMG_20171021_172430.png" alt="本体"></p><p>当时和卖家沟通的时候卖家称并不确定与Mac和Android的兼容性，也没发现什么有价值的评论，但还好这玩意儿并没有让我失望，和我的黑果和Mate9都兼容得很好</p><p><img src="../images/2017-10-airpods/Jietu20171028-204302@2x.png" alt="mac"></p><p><img src="../images/2017-10-airpods/Jietu20171028-204310@2x.png" alt="mac 配置"></p><p><img src="../images/2017-10-airpods/Screenshot_20171028-204552.png" alt="安卓连接"></p><p>说到底这东西还是很不错的</p><p>嘛，就这样（除草任务✓）</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/airpods.html#disqus_thread</comments>
    </item>
    
    <item>
      <title>小霖的便签板 · 又一个拿来练手的渣渣项目</title>
      <link>https://www.xiaolin.in/read/notepad.html</link>
      <guid>https://www.xiaolin.in/read/notepad.html</guid>
      <pubDate>Sun, 01 Oct 2017 18:50:38 GMT</pubDate>
      <description>
      
        
        
          &lt;p&gt;好久没写博客都快长草了，今天就来把草拔干净😂&lt;/p&gt;
&lt;h2 id=&quot;啥玩意啊？&quot;&gt;&lt;a href=&quot;#啥玩意啊？&quot; class=&quot;headerlink&quot; title=&quot;啥玩意啊？&quot;&gt;&lt;/a&gt;啥玩意啊？&lt;/h2&gt;&lt;p&gt;这个东西主要是拿来连我的前端的，毕竟只会后端也不行是吧
        
      
      </description>
      
      
      <content:encoded><![CDATA[<p>好久没写博客都快长草了，今天就来把草拔干净😂</p><h2 id="啥玩意啊？"><a href="#啥玩意啊？" class="headerlink" title="啥玩意啊？"></a>啥玩意啊？</h2><p>这个东西主要是拿来连我的前端的，毕竟只会后端也不行是吧</p><h2 id="有啥用啊？"><a href="#有啥用啊？" class="headerlink" title="有啥用啊？"></a>有啥用啊？</h2><p><del>项目地址:<a href="https://github.com/xiaolin0815/Lab" rel="external nofollow noopener noreferrer" target="_blank">GayHub</a> DEMO地址:<a href="https://lab.xiaolin.in" rel="external nofollow noopener noreferrer" target="_blank">Lab</a></del></p><p>这个东西的灵感主要还是来自现实生活中的，有时候我想在设备和设备之间传输一些东西，但是上面又没有类似QQ这样的东西，所以就想着做一个便签板来在各设备之间传输文字<del>，文件的话可以上传到我的<a href="https://xiaolin.in/goto/vnxz" rel="external nofollow noopener noreferrer" target="_blank">公共云</a>然后再把链接copy过去</del></p><h2 id="啥原理啊？"><a href="#啥原理啊？" class="headerlink" title="啥原理啊？"></a>啥原理啊？</h2><p>因为想到是拿来练前端的，所以JS肯定越多越好是吧233</p><p>目前就是登陆注册，获取、编辑、删除便签是通过ajax完成的，添加便签是ajax提交以后再刷新界面(其实是我<del>懒</del>不会)</p><p>具体的API扒一下应该都能看到，这里就不多说了</p><h2 id="怎么用啊？"><a href="#怎么用啊？" class="headerlink" title="怎么用啊？"></a>怎么用啊？</h2><p>本项目基于TP5.11编写，所以把gayhub上application里的东西copy进去就好了</p><p>数据库结构：</p><pre class="line-numbers highlight language-sql"><code class="language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token keyword">IF</span> <span class="token operator">NOT</span> <span class="token keyword">EXISTS</span> <span class="token punctuation">`</span>text_posts<span class="token punctuation">`</span> <span class="token punctuation">(</span>  <span class="token punctuation">`</span>id<span class="token punctuation">`</span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>uid<span class="token punctuation">`</span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span><span class="token keyword">text</span><span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>add_time<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>edit_time<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>other<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span><span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">1</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>utf8<span class="token punctuation">;</span><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token keyword">IF</span> <span class="token operator">NOT</span> <span class="token keyword">EXISTS</span> <span class="token punctuation">`</span>text_users<span class="token punctuation">`</span> <span class="token punctuation">(</span>  <span class="token punctuation">`</span>uid<span class="token punctuation">`</span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>nick_name<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>email<span class="token punctuation">`</span> <span class="token keyword">text</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>code<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>last_login<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">,</span>  <span class="token punctuation">`</span>reg_time<span class="token punctuation">`</span> <span class="token keyword">text</span><span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span><span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token operator">=</span><span class="token number">1</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span><span class="token operator">=</span>utf8<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>再送几条用户数据吧233</p><pre class="line-numbers highlight language-sql"><code class="language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token punctuation">`</span>text_posts<span class="token punctuation">`</span> <span class="token punctuation">(</span><span class="token punctuation">`</span>id<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>uid<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span><span class="token keyword">text</span><span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>add_time<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>edit_time<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>other<span class="token punctuation">`</span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token string">'大家好我是一条XSS便签/w\\&lt;script>mdui.snackbar({message: '</span><span class="token string">'大家好我是一条XSS便签/w\\'</span><span class="token string">'});&lt;/script>'</span><span class="token punctuation">,</span> <span class="token string">'1505649340'</span><span class="token punctuation">,</span> <span class="token string">'1505649340'</span><span class="token punctuation">,</span> <span class="token string">'{"type":"normal","display":"0"}'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token string">'大家好我是一条XSS便签/w\\&lt;script>mdui.alert('</span><span class="token string">'大家好我是一条XSS便签/w\\'</span><span class="token string">');&lt;/script>'</span><span class="token punctuation">,</span> <span class="token string">'1505649703'</span><span class="token punctuation">,</span> <span class="token string">'1505649703'</span><span class="token punctuation">,</span> <span class="token string">'{"type":"normal","display":"0"}'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>都说了语文不好啦文章写得不好别怪我哈😉</p><p>代码肯定有很多缺陷，希望各位大佬一一指出哦</p><p>对了，封面大图的✘是我用数位板画的233</p>]]></content:encoded>
      
      <comments>https://www.xiaolin.in/read/notepad.html#disqus_thread</comments>
    </item>
    
  </channel>
</rss>
