<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>xingo</title><description>大龄萌二 失踪人口</description><link>https://blog.xingoxu.com/</link><language>zh_cn</language><item><title>论垃圾佬的养成，一次 NAS 硬件升级与客厅电脑的升级的流水账</title><link>https://blog.xingoxu.com/2026/03/2025-nas-update/</link><guid isPermaLink="true">https://blog.xingoxu.com/2026/03/2025-nas-update/</guid><description>自 2020 年自组了 NAS 之后，2025 年 4 月份的某天下午，进行一个非常常规的寻找文件，双击文件准备打开某个 pdf 的时候，嗝愣一下，等了十几秒文件都没法打开，直到半分钟后，邮箱里传进来了几封报警邮件，一开发现掉盘了，而且仔细一看，好几封邮件，一掉还掉俩硬盘，心想我擦……这下坏事儿了。</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;自 2020 年自组了 NAS 之后，2025 年 4 月份的某天下午，进行一个非常常规的寻找文件，双击文件准备打开某个 pdf 的时候，嗝愣一下，等了十几秒文件都没法打开，直到半分钟后，邮箱里传进来了几封报警邮件，一开发现掉盘了，而且仔细一看，好几封邮件，一掉还掉俩硬盘，心想我擦……这下坏事儿了。&lt;/p&gt;
&lt;p&gt;情况可算是惨烈，自己组装的这台 NAS 用的是 xfs 的文件系统，在网上找恢复数据教程也啥都没出来，只有两个官方命令，先脱机然后挂载到 debian 下，然后 xfs_repair，这也就决定了要么硬盘全好，要么硬盘全毁。&lt;/p&gt;
&lt;p&gt;其中一块硬盘好像没什么问题只是引导区掉了貌似，几秒就正常了，另一块就没那么好运了，提示无法修复，于是强行恢复后把磁盘上那些个扫出来的文件全部都拉到了 lost+found，结果还得一个一个去看文件内容才能知道是什么，才能进行恢复。&lt;/p&gt;
&lt;h2&gt;背景以及第一代自组 NAS&lt;/h2&gt;
&lt;p&gt;技术选型的时候倒也没想那么多，2020 年也是一次事故导致的想自组 NAS 的念头。在 2020 年前都是用的群晖 916，四盘位+x86 架构，能跑 docker 能跑一点点虚拟机其实也已经很满足了，但也有很多问题吧，一个是 nas 方面只起到了一个下载和分享文件的作用，硬解可以用自带的 video station 和 ffmpeg，但除此之外全是 cpu 软解，相当的卡（可能可以，当然也是我之前不会用来着）,另一个是运算上，我有一些用 headless chrome 的爬虫脚本，可以正常跑，速度很慢，也算能用，但每次升级 chrome 就会是非常头疼的一件事，以及跑 PT，因为怕日本的家宽版权原因，不敢直接挂 PT，所以我通了一层 wireguard 去做种，然而如果不小心把 image 给删了，很有可能要对里边的内容进行重新编译。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/680439e5-f547-44df-ba32-42df7fbe27c2.jpg&quot; alt=&quot;旧DS916&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当然以上是不满的源头，导火索是我在新冠的时候买了一个 2.5G 的 USB 网卡，稍微整了一下驱动就在群晖上跑起来了，结果在两个月回国的期间，离回日本还有一个月的时间点上，手贱点了一下自带的网卡驱动升级…………于是，NAS 失联了…………在剩下的那一个月里疯狂去看各种自组 NAS 的代餐，&lt;/p&gt;
&lt;p&gt;也是第一台自组 NAS 的由来，那同样两三千块我可以买一台更好的配置干嘛还用群晖啊反正我也就用那几个功能，其他的现有的系统也是点点点就解决了的事情。&lt;/p&gt;
&lt;h3&gt;硬件方案&lt;/h3&gt;
&lt;p&gt;第一代 NAS 的硬件选型是当时 2020 年比较乞丐的，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU: QSRL（Intel 10100T）
主板: asrock B460M
PCIE1: hp 561 flr拆机10G网卡
PCIE2: IT卡HBA模式直通卡
机箱: 用的 TANK 的那个小洋房，自带散热解决方案
内存: pdd买的寨条16g ddr4 x 2 → 后换成 crucial 32g x 2
电源: 益恒 250W 小1u

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体价格可能记不太清了，除了那个机箱 850 前后以外，内存大概 400 一根？，益恒电源大概是 270，因为收的也都是二手，整套也就 3000 吧应该。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/7019a572-76e3-496a-a51a-cc89c65c5d82.jpg&quot; alt=&quot;第一代自组NAS成品图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当然组装第一台 NAS 中也有一些小插曲，比如闲鱼上收的便宜电源结果点不亮到电脑城帮忙调试一下确定是电源问题不是主板和 u 问题，收的第二台益恒电源发现线太短以及少 4pin 口子还是 sata 口子？（忘了）&lt;/p&gt;
&lt;p&gt;转接线到货时间会比较长于是索性直接买了一台全新的反正也就 300 不到，点亮无问题之后带到日本后又发现装系统定时死机。最后跑内存测试连续跑两遍才出内存问题之后在日本也没办法退随即在日本煤炉上倒出去了（论我干过的缺德事，只能说 windows 比较强大吧内存有问题也能正常跑，所以这种寨条到底是谁在买）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/0c21b411-cfc2-4340-a202-bb837de4ac0b.jpg&quot; alt=&quot;第一代NAS&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以中间也是有了很多的装机经验，比如内存不可以在拼多多买，就算买了也得连续跑两次内存压力测试。但也比较有意思的，在闲鱼上买的一个 SAS 8T 硬盘居然到现在还没挂，一直把他当垃圾处理所以放在下载池跑 PT 结果到现在也有 6 年了，之前就已经十万小时的通电时间了寿命也太长了……&lt;/p&gt;
&lt;p&gt;当然今天回过头来看这些其实交了不少学费，还是不够垃圾佬。&lt;/p&gt;
&lt;h3&gt;软件方案&lt;/h3&gt;
&lt;p&gt;也算是看哔哩哔哩的 up 主们的抄作业吧，试了之后发现确实这样做很好也很符合自身需求，就是底层装 pve，然后开虚拟机装 nas 系统加直通硬件，这样的话其他虚拟机的运算任务基本不会妨碍 nas 自身的问题，nas 自己的任务就放在自己的机器里运行。&lt;/p&gt;
&lt;p&gt;我并没有完全分离比如 nfs 或者 smb 拉出来然后在其他虚拟机上进行一个再加工这样，我还是会觉得有延时很怕文件会有 conflict，另一个是对性能上还是有一道心理过不去的坎，会觉得同一个主机上的文件我为什么要再走一遍网络层在那边加工的感觉好傻。&lt;/p&gt;
&lt;p&gt;当然也在 nas 自己上不能解决的事情还是会分开来这样，比如另一个录制电视的 mirakurun 我就单开虚拟机的，他那个 recdvb 的编译莫名其妙就是 ubuntu 下能过，好多 debian 的系统也过不了，因为 debian 默认没开某些参数编译。结果 nas 的系统还是有这样那样的限制，那也是现在多虚拟机方案的好处。&lt;/p&gt;
&lt;p&gt;nas 系统上选择的是 omv，起初一开始选择的是网红 NAS 系统 unraid，最终没有选择它的原因当然不是价格问题，当时才卖 99 人民币终生。当然定价问题是我对 unraid 这个东西将来发展的存疑之一，现在来看他已经回归正常定价还蛮 make sense，当时我对他的感受是诶有缓存池，有自动搬运缓存功能，然后文件是分散分布的，加上一个看起来挺合理的一个校验池，那么最后不采用 unraid 的理由还是那个采用的小众的 linux 版本，而不是用的人多的 debian 或者 fedora 系，又是闭源的，那如果驱动装不上，或者报错了，我又没办法知道是我的问题，还是驱动的问题，还是系统的问题。&lt;a href=&quot;https://forums.unraid.net/topic/129315-unraid-611-freeze-with-i915-gpu-passthrough-on-proxmox/&quot;&gt;事实上在 pve 下的 6.11+的 unraid 就没有办法使用 uhd 630 分出来的 vgpu&lt;/a&gt;，开机死机（之后有没有解决不是很清楚）。 那么我觉得最终结果就是还是会重蹈群辉的覆辙。&lt;/p&gt;
&lt;p&gt;omv 这个系统上手后其实也就是个带图形界面的 debian 吧，正好卡在我的好球区，我对 smb/nfs 共享，以及一些杂七杂八的小命令记得不是很熟，那 omv 正好把那些都帮我做了图形界面，而那些我自定义的脚本 docker 容器等等又能很方便的去自己使用命令行启动。&lt;/p&gt;
&lt;p&gt;最后最后采用的硬盘方案是 mergerfs，无校验。我当时自己觉得，我的重要文件都做了同步，每台电脑上都有一份不需要额外再进行备份，剩下的那些丢了可能也一辈子不会再 review 了吧，又能充分利用各种容量的硬盘挺好的。&lt;/p&gt;
&lt;h3&gt;对第一代 NAS 方案的反思&lt;/h3&gt;
&lt;p&gt;很多事情不试过不发生也是一辈子不知道，包括网上搜也不知道怎么搜出来。&lt;/p&gt;
&lt;p&gt;比如 pve 或者其他的一些直通硬盘，PCIe 可以单独通，但是直连主板的那几个 SATA 口子是一起直通（能读到 SMART 的那种直通，也就是SATA控制器）的而不是一个口子一个口子通的，所以在策划硬件的时候也要想好自己的 nas 定位和使用分配。&lt;/p&gt;
&lt;p&gt;又比如这次 xfs 文件系统挂了之后才觉得嗯，要找那些用的人多的，恢复数据教程或者就要做冗余的，至少要设想一下如果硬盘炸了是要一个怎样的操作方法去解决硬盘问题。以及也让我真正认识到了说辛辛苦苦收藏的那么多人类文明一旦某一天消失了，那也是找不回来的。
&lt;strong&gt;特别特别是 mergerfs 这个文件系统&lt;/strong&gt;，上手时你觉得感觉硬盘均匀用的恰到好处，可以混合使用不同大小的硬盘，结果炸了一个的时候没有备份就只能看空文件夹在那边哭，或者 1.jpg，3.jpg，4.jpg 而没有 2.jpg 的那种空虚感。&lt;/p&gt;
&lt;h3&gt;掉盘后续&lt;/h3&gt;
&lt;p&gt;你很关心盘掉了之后我是怎么处理的吧以及那个坏掉的盘到底是什么情况吧。&lt;/p&gt;
&lt;p&gt;怎么处理当然是一个文件一个文件看过去然后再把他们放回原来的位置 &amp;amp; 如果没有了就没有了咯。如果我知道哪些是没有了的，有些还能重新下的话就重新下了，最恐怖的是不知道什么文件掉了。那就，让他走吧。&lt;/p&gt;
&lt;p&gt;关于原因其实我自己也不是很清楚，后来把丢失文件复制到其他硬盘上后我就把盘拿下来全盘扫描了结果是全部绿块没有坏道，SMART 就更是完全没有问题&lt;/p&gt;
&lt;p&gt;唯一稍微有点可能性的是我的这套设备长时间（超过 5 个小时）运行后，就很有可能会发生无法关机的问题，无论是 pve 系统下还是 windows 下都有发生过，我开着 pve 的 log 查看后发现系统已经发出了 ACPI PowerOff 的指令但最后就卡在那边没有关机，另外在发出关机指令之前最后提示无法卸载/dev/的某个设备，给 chatGPT 分析了说是无伤大雅不会影响关机因为最后已经发出了 ACPI 关机指令了。&lt;/p&gt;
&lt;p&gt;这个无法关机的问题还没查明白，那边为啥硬盘会炸也不明白。可能是让磁头没有正常归位的原因导致引导区或者寻道的一些这样那样的问题？如果你知道原因欢迎跟我联系。&lt;/p&gt;
&lt;p&gt;不过反正不是 CPU 就是主板，就是直通卡或者 561flr 问题咯？（？都猜了个遍）另外这块炸了的硬盘格式化之后被我放到作为第二代 NAS 方案的冷备用了。&lt;/p&gt;
&lt;p&gt;但是经过这次掉盘之后，我想我是必须吸取教训了，数据必须要备份，无论是做RAID也好，还是说unraid的snapraid方案也好，又或者是最傻的手动多媒体多介质备份也好，其实都是必须的，而不是说我就做了同步，剩下的那些内容就跟着缘分走吧。其实是不行的，有些东西失去了才会知道价值，然而数据无价。&lt;/p&gt;
&lt;h2&gt;第二代 NAS 方案&lt;/h2&gt;
&lt;p&gt;然后就很巧的是硬盘坏了之后的几个月之后的某一天忘了哪个平台给我推了个 epyc 7d12 的帖子还是视频吧（也有可能是我手贱自己搜的）&lt;/p&gt;
&lt;p&gt;感觉很香啊服务器板 U 整套加起来也就 5000？正愁感觉原来的NAS拓展性比较差，这次性能拓展一次拉满。嗨没想到大船过海又过海，过完太平洋还得过日本海，于是说搞就搞。&lt;/p&gt;
&lt;h3&gt;硬件配置&lt;/h3&gt;
&lt;p&gt;硬件就直接抄的几个帖子的，我这边也贴一下自己的配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU: EPYC 7D12
主板：SuperMicro H11SSL-i
内存：三星 16G * 4 DDR4 REG ECC
散热：金钱豹SP3
电源：长城巨龙 1200W
机箱：追风者 614
显卡：NVIDIA P4

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然因为是要保证在数据迁移过程中原本的那些脚本也要持续运行（我也是要上班的），所以还是又买了一个直通卡 + 561flr 网卡。&lt;/p&gt;
&lt;p&gt;整套设备真的是可聊的太多了，首先大家可以去参阅一些我当时看的帖子 ↓&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.chiphell.com/thread-2509428-1-1.html&quot;&gt;12盘位NAS机箱和AMD EPYC大船靠岸之存储整合方案&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.azimiao.com/11448.html&quot;&gt;ALL IN ONE NAS 主机升级小记-2025&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.zhihu.com/tardis/bd/art/644202809&quot;&gt;EPYC7D12 8盘3.5寸机械+多盘nvme闪存 【25G高性能】 NAS搭建方案分享&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://lishuma.com/archives/5501&quot;&gt;数框框狂喜，AMD 霄龙 EPYC 7D12 捡垃圾&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://xinalin.com/65/homeserver-step-zero-to-one&quot;&gt;家庭服务器Step ZERO to ONE&lt;/a&gt; 这个是 7542，但为了了解 H11 这个主板也参照了这个&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先这套设备除了显卡和 PCIe 设备是找 js 买的整机，整套 4500 出头一点。之后替换成淘宝图。看了上边的几个帖子里说 7D12 因为是 OEM 的流出所以 H11 的某几个 BIOS rev 没法点亮什么的，那想着要是自己买没法确认点亮的情况下也没法退就比较麻烦了。那花点辛苦费让人帮忙装机 + 确认也不算贵了。&lt;/p&gt;
&lt;p&gt;托朋友旅游从国内托运带到日本来，然后我去机场接机带回家的。你问我为啥不在日本买，那日本人又没有流出这些东西的途径也不收垃圾啊……其次是淘宝过境的话过关是个大问题，我也不是很想拆盲盒，万一被退了或者收了高额关税那也不是我们垃圾乞丐的作风了。&lt;/p&gt;
&lt;p&gt;其次是店家装机确实点亮了，因为没有买硬盘所以店家进了BIOS拍了张图给我就当是点亮了。&lt;/p&gt;
&lt;p&gt;我一开箱发现 reset 键没法用，然后风扇有个没转，然后装了 windows 测机发现 64G 只点亮了 32G。&lt;/p&gt;
&lt;p&gt;嘛本身也是要加风扇和硬盘的，于是把线全理了才发现这神装机。&lt;/p&gt;
&lt;div&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/jCt8FQ2e&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/Ly1MNKto&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/6J8gzpEj&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/GlrE3oIk&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/crDzX6hM&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/9C7ZIdOG&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/urwB1jPr&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/YZ2F8DkZ&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/6WDGSg2O&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/SgCWd5Qu&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/8fVmj6pF&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/xDGtwGiZ&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;然后之最后，我又把所有的配置都换了一遍笑死。&lt;/p&gt;
&lt;p&gt;首先是内存点亮问题，几个帖子也说了 7D12 是特殊 U 只能点外边两个，然后 js 给我装的是里边两个，嗨 BIOS 里正常显示进了系统就直接只有一半了。骚操作还有把那个风扇集线器自己插上自己，倒是妹短路。也是服了。&lt;/p&gt;
&lt;p&gt;然后就是整套设备开起来，哇靠那&lt;s&gt;呻吟&lt;/s&gt;声音震耳欲聋，就最低转速已经身如机房，嗡嗡嗡的。
金钱豹这个暴力风扇，转速也太高了，我估计店家主卖那些二手组装服务器给那些实验室做流体运算的，结果我要求改个 7D12 也是不知道其实是个 100W 都不到的 U。&lt;/p&gt;
&lt;p&gt;开始只是想把这个风扇改成不那么静音的，也不知道有啥牌子的风扇是比较安静的，看那个形状还以为那个风扇是弯的好像换不了，直接找淘宝上卖 noctua 店家寻思问问啥大小的能换上去，店家直接给我推荐散热器了，店主真的很会做生意上来先说原价 500 多给我直接优惠 8 折，我网上一查发现啊确实比日本免税 and 其他淘宝店标价也要低，正好也有朋友要回一趟上海就一冲动直接买了。事实上后来我拆散热的时候就发现那风扇其实可以单独换，也就普通 12025 风扇。&lt;/p&gt;
&lt;p&gt;换完了暴力风扇，就是整 P4 的散热问题，淘宝上买的 3D 侧吹的模具不用附赠的暴力风扇就算是 noctua 满速也是压不了 P4 的满载，于是只好把盖板拆了拿了两个 6025 风扇在那吹，那这样单槽卡就变成了双槽的厚度了，也是为了静音要做出的牺牲。&lt;/p&gt;
&lt;p&gt;最后都整完了发现电源的声音比较大了，主要是空载室温 26 度时会有中频到高频的持续性的电流声，偶尔会伴有风扇刮到什么东西的摩擦声，而不开空调室温到 30 度以上时，电源的风扇就会很响，于是也又拖朋友正好换了个 1200W 的酷冷至尊解决。&lt;/p&gt;
&lt;p&gt;内存其实还算够用，但也属于是抠着在用了，这次因为上了可以用 ECC 的平台的话就决定把 NAS 系统的那部分变成 truenas，毕竟是在卖给企业卖系统的话稳定性什么的应该是不错的。而且也看到很多人都在吹 zfs 等等。那么现在 16T*4 的一个阵列的话官方推荐最好要配 64G 左右的系统内存，但我也有其他虚机需要用到，所以内存我先是分配的 48G 的。巧也是巧偶尔手贱在日拍上搜了一下 ECC 内存，发现有人在卖 32 *4 的 REG ECC 内存，叠上平台券价格和国内也差不多，而且国内问了几家闲鱼和淘宝还说缺货。那就拿下换上了，也是一次点亮。&lt;/p&gt;
&lt;p&gt;所以整个配置只有机箱主板和 CPU 是当初店家给我的，后来全是我又花了好多钱买风扇改散热改电源的，也是一身汗。&lt;/p&gt;
&lt;h3&gt;软件配置&lt;/h3&gt;
&lt;p&gt;pve → truenas zfs + 其他小鸡&lt;/p&gt;
&lt;p&gt;两个pool，data pool 6盘位 RAIDZ2，下载pool就raid0啦&lt;/p&gt;
&lt;h4&gt;smfc&lt;/h4&gt;
&lt;p&gt;整体上沿用第一代的思想是底层 pve 然后加 truenas 来管理 nas 的文件，H11SSL 是带 IPMI 的主板，主板设置里设置成 optimal 就是消费级的自动了，但是不能拉曲线是比较麻烦，因为 p4 的显卡的温度是不会被 IPMI 给监控到的，因此风扇也是被控制的。因此要有一些工具进行一个读取 gpu 核心的温度然后进行程序化控制，我最后找到的是 &lt;a href=&quot;https://github.com/petersulyok/smfc&quot;&gt;smfc&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;CPU Zone 是 FAN 数字，也就是FAN12345，GPU Zone 是 FAN 字母区，也就是AB。安装好 hwmon 和 nvidia-smi 和 ipmitool 的话配一下config就可以了。&lt;/p&gt;
&lt;p&gt;另外我这边发现 smfc 启动时因为温度没有读到导致全部风扇置零，IPMI触发error后风扇满转速的问题。&lt;code&gt;systemctl restart smfc.service&lt;/code&gt;重启一下就可以了，但是每次重启都会需要重启的话也是比较烦，可以添加一个服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable smfc
# 创建延时重启脚本
cat &amp;lt;&amp;lt; &apos;EOF&apos; &amp;gt; /usr/local/bin/restart-smfc.sh
#!/bin/bash
sleep 5
systemctl restart smfc.service
EOF

# 设置脚本执行权限
chmod +x /usr/local/bin/restart-smfc.sh

# 创建systemd服务单元文件
cat &amp;lt;&amp;lt; &apos;EOF&apos; &amp;gt; /etc/systemd/system/restart-smfc-once.service
[Unit]
Description=Restart smfc.service once after boot
After=smfc.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/restart-smfc.sh
RemainAfterExit=yes
EOF

# 创建systemd timer单元文件
cat &amp;lt;&amp;lt; &apos;EOF&apos; &amp;gt; /etc/systemd/system/restart-smfc-once.timer
[Unit]
Description=Timer to restart smfc.service 15s after boot
Requires=restart-smfc-once.service

[Timer]
OnBootSec=15s
Unit=restart-smfc-once.service

[Install]
WantedBy=timers.target
EOF


# 重载systemd配置并启用timer
systemctl daemon-reload
systemctl enable restart-smfc-once.timer
systemctl start restart-smfc-once.timer

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他的话就是要注意一下内核的一些参数，zfs安装的proxmox已经使用&lt;code&gt;/etc/kernel/cmdline&lt;/code&gt;，更新启动参数也是用 &lt;code&gt;proxmox-boot-tool refresh&lt;/code&gt;，需要注意一下网上的其他教程。&lt;/p&gt;
&lt;p&gt;P4 的使用教程可以看&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://fairysen.com/844.html&quot;&gt;在Proxmox VE下开启vGPU - Tesla P4为例&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://xinalin.com/159/vgpu-configuration-on-pve&quot;&gt;vGPU在Proxmox VE下的配置与使用&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;证书自动更新&lt;/h4&gt;
&lt;p&gt;truenas下的证书自动更新本来想写个脚本，发现已经有人写了，就拿过来用了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/danb35/deploy-freenas&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;直通&lt;/h4&gt;
&lt;p&gt;根据主板手册架构图，H11SSL的SATA口是可以进行分区直通的，果然是服务器主板，所以SATA口上接了系统盘，也同时SATA口是可以接数据盘的，注意位置即可。
直通时可以使用以下命令查看在那个PCIe通道的控制器上。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;udevadm info --query=all --name=/dev/sdg

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第 2.5 代 NAS 方案&lt;/h2&gt;
&lt;p&gt;所以之前掉盘原因其实应该是没有办法究明了，因为 B460M 主板被我卖了，系统我也装成了 windows，开机一个月也没有不能关机的问题。
不过我留意到主板上有个针脚有点歪了，也许是那个问题？&lt;/p&gt;
&lt;h3&gt;p4 → dg1&lt;/h3&gt;
&lt;p&gt;整体装好后，系统是没什么大问题，但是pve在2025.09推出9.0之后开始升级linux内核，也就是nvidia 16系的驱动会被deprecated，vgpu的方案很有可能之后是行不通的，不过我知道这个事情后才发现原来英伟达很早就计划废弃pascal架构的vgpu了。&lt;/p&gt;
&lt;p&gt;well，暂时我只需要vgpu用来解码喂给chromecast，本来是想玩玩大模型和生图什么的，但是这样的话就存算分离比较合理，因为pve的系统和里边的truenas我毕竟是想要一直升级下去的。&lt;/p&gt;
&lt;p&gt;于是我就各种狂搜，发现解码最好还是intel的卡，又低功耗，又便宜，就算不能sriov，直通进去总可以了吧，于是发现最强丐卡dg1，从此折腾没停过。&lt;/p&gt;
&lt;p&gt;dg1是目前Intel独显之中应该说解码最好的，能打很多网游，加上支持硬解新款的AV1，对于NAS垃圾佬的话是极品了。&lt;/p&gt;
&lt;p&gt;在买之前我就搜了很多，发现dg1是可以在pve下进行直通的，于是我也没有多看教程内容，dg1也便宜，直接闲鱼下单了三块。各版本都来一块。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/Bi1Ci7gW&quot; alt=&quot;dg1全家福&quot; /&gt;&lt;/p&gt;
&lt;p&gt;两块是80eu，厂家不同，但是一块被动散热，一块是主动散热，其实发热并不会很厉害。96eu是俗称“满血版”dg1。其实dg1是英特尔Arc系列刚开始出显卡给厂商试试的版本，从驱动到点亮上都有着不少问题。&lt;/p&gt;
&lt;p&gt;长话短说，经过插插拔拔各种折腾，三个版本都可以点亮和直通，但是稳定直通的条件是使用别人定制过的内核，但是怎么定制的没有公开。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kkk.rs/archives/28&quot;&gt;PVE直通DG1/DG2并使用群晖SA6400驱动DG1/DG2教程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于我来说，没有公开方法的内核比较危险，另一个pve在不停的更新，内核也会不停的更新，暴露在公网的服务，如果没有及时的update的话，也是很危险的。我在线上跑了两个月后，最后还是决定放弃了dg1而去升级我的系统。&lt;/p&gt;
&lt;p&gt;其次，96eu版本非常不稳定，直通进truenas之后，确实是可以跑jellyfin的，但是24-48小时后，就没有办法再启动了。而且，重启truenas是没有用的，需要将整体的物理机关机断电，然后再开机才能够重新把96eu的这块卡给启动起来。&lt;/p&gt;
&lt;p&gt;所以dg1这块卡如果用在windows的机器上，或者是不做虚拟化的话，还是不错的，但是谁不虚拟化去用这块卡的话，主板上不就浪费宝贵的一根PCI的槽吗。消费级主板本来通道就少，如果是服务器主板的话，不做虚拟化又太浪费了。整体系统构成也很容易翻车。&lt;/p&gt;
&lt;p&gt;可惜了，我都把96eu的壳子给拆了然后去准备放进机箱的，谁知道翻车那么厉害。装回去然后又溢价卖给了日本人（缺德x2&lt;/p&gt;
&lt;h3&gt;dg1 → A380&lt;/h3&gt;
&lt;p&gt;A380是相比于dg1之后的第二便宜的卡，相比dg1，价格x2，可是驱动和做工的话都是正式版本。A380一般是双槽卡，蓝戟和先锋各出了一款单槽半高卡，在闲鱼上会比双槽略贵小几十。&lt;/p&gt;
&lt;p&gt;插上后点亮直通都没有问题。暂时只买了一块，之后如果有需要的话我个人还是会考虑可以购入的。不过也有一点小期待，手里还剩两块dg1，万一pve后期适配了呢。&lt;/p&gt;
&lt;p&gt;最终整体配置如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU：EPYC 7D12
主板：SuperMicro H11SSL-i
内存：三星 32G * 8 DDR4 REG ECC
散热：猫头鹰 NH-U14S TR4-SP3
电源：酷冷至尊 1250W
机箱：追风者 614
显卡：Intel A380

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不得不说整体装完后，这一整套的空载就是100W，我的天，日本一个月的电费就是下不了1w日元了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/6CbdQiW2&quot; alt=&quot;简易式机架终于撑不住了&quot; /&gt;
对咯也上了UPS，那段时间有很多的消费活动，就全都买好买满啦。
&lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/8WY98Zo2&quot; alt=&quot;最终构成&quot; /&gt;
&lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/UxYJBFhk&quot; alt=&quot;TrueNAS 硬盘部分&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;附赠 算力机方案&lt;/h2&gt;
&lt;p&gt;有了新机器之后旧机器该怎么处理是一个比较头疼的事情，原来是一台9代+2080Ti的itx小机器，但是机箱灯条有问题，也有点嫌弃了，想把淘汰下来的机器两台合并成一台。&lt;/p&gt;
&lt;p&gt;正好乔思伯出了N5这个新机箱，就打算做冷备的同时还能当成算力机。9代卖了，新淘了一张二手的z490，哐哐就装上了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU：10400T ES QSRL
主板：ROG Z490
内存：crucial 32g x 2 + 以前机器上淘汰下来的8g x 2 ddr4
散热：以前9代机器上淘汰下来的下压式猫头鹰
电源：银欣HELA 1200W
机箱：乔思伯 N5
显卡：dg1 + ASUS 2080Ti + NVIDIA P4

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;300不到的板子，收到手之后打算装机，掀开nvme装甲一看，哇靠一块500G的三星970 EVO？开盖有奖了啊哈哈哈哈哈哈哈哈😂直接回本。&lt;/p&gt;
&lt;p&gt;而且ROG的这块板子就是好啊，有5条PCIe的插槽，SAS卡，10Gbe网卡，加三张显卡，一整个满满当当，Wifi模块还被我用来转接了NVMe。太酷啦。&lt;/p&gt;
&lt;div&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/AryrMRE8&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/6xsOVEW3&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;使用dg1启动旧pve的时候有可能会报PCIe的总线错误，可以参考一下 Claude 是怎么解决这个问题的，我很奇怪我的大号机就没有这个问题。&lt;/p&gt;
&lt;div&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/gjFLpkzE&quot; /&gt;
  &lt;img src=&quot;https://staticimg-v2.xingoxu.com/i/Rou2MZ1J&quot; /&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;https://claude.ai/share/675ea345-7acd-478f-b69b-8fcd779c65b0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在系统选择上，一开始是想用PVE+直通进行一个鱼和熊掌兼得的想法，然而腾讯等各种反作弊系统是不答应啊。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.uuz.moe/2024/07/proxmox-ve-all-in-one-pass-easy-anti-cheat/&quot;&gt;打造 All in One 主机之让虚拟机也能通过 EAC 检测&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;PVE使用Windows的话，鼠标和键盘如果直通给Windows，使用一会儿休眠就没反应的话，记得去硬件里边把休眠给关上，节能设置里也要关掉。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那么想想算了，这种都是道高一尺魔高一丈的猫捉老鼠游戏，于是考虑WinServer为底层，用Hyper-V去开omv。
但是我都已经研究到了怎么直通HyperV的过程了，发现有个蓝牙的手柄驱动怎么都安装不上。趁还没完全开始装其他软件，重装到了Win11看，发现，没这个驱动装不上的问题。这可又让我心凉了一大截，好吧还是老实Win11 Pro梭哈到底了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.vlinyu.com/archives/windows-hyper-v-discrete-device-assignment-dda&quot;&gt;【Windows使用】之--Hyper-V网卡、显卡直通等PCIe硬件直通&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://qiita.com/key_1996/items/8fbce2e2a9ffdb101710&quot;&gt;Windows Server 2022でもGPU-Pしたい！&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Hyper-V启动OMV的时候记得要用传统BIOS，以及Windows 11下是不支持硬件直通的，所以每个硬盘要单独挂载。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后提一嘴，因为有多个硬盘，也不是做raid，希望我的冷备机的数据管理和原来omv下的mergerfs类似，但我不可能开着那样的HyperV虚拟机进行拷贝数据，以及打游戏的话肯定是不能开着HyperV的。于是我搜索发现了MergerFS在Windows下的Alternative - &lt;a href=&quot;https://stablebit.com/&quot;&gt;StableBit DrivePool&lt;/a&gt;。软件不贵，是买断制的，也可以试用30天，还不错。&lt;/p&gt;
&lt;h2&gt;后记&lt;/h2&gt;
&lt;p&gt;其实10月后就已经把整个构成完成了，但是买的三星NVMe 990Pro 2T带Heatsink的，经常有不断电就会掉盘的情况。不应该说掉盘，东西还在，但是如果不断电，主控就没有了反应，关机重启之后就又回复了正常。一开始还以为是买的PCIe转NVMe的板子有问题，后来更换了位置还是发现这块盘每过28天就无法读取SMART而掉盘。拆下来本来打算送修，后来网上一搜发现原来固件更新，日志写的也是相关问题，于是再插到算力机上进行更新这样。无语，我算力机的插槽也是满的啊，又是一顿折腾，还错把算力机的系统盘给拆下来格式化了。这么长时间没有更新呢，也是因为想要看这套装置稳定性如何，不过前前后后也有大半年了，也经过了好几次我忍不在家的情况，似乎没有什么太大问题了，感觉是可以公开给大家看和参考了。&lt;/p&gt;
&lt;p&gt;这么一算我手上其实有7条NVMe的SSD了，谁知道2026开局居然PC配件大涨，内存涨SSD涨机械也跟着涨，不知道是该庆幸自己买得早幸运呢，还是该说奸商无德呢。&lt;/p&gt;
&lt;p&gt;本文尽量去模仿&lt;a href=&quot;https://lishuma.com/&quot;&gt;梨数码&lt;/a&gt;的文风，希望阅读的你能够像看小说看笑话一样的阅读完本文，轻松又有干货。&lt;/p&gt;
&lt;p&gt;这篇时长纵贯整个2025年的 nas 升级，前前后后折腾了不少，花了钱买了不少的配件，也花了自己很多的精力，尤其是在边减脂边打比赛的同时还去绞尽脑汁抽出时间在工作闲暇空隙去完成所有的事情，本以为应该也是非常值得骄傲的事情，但现在回头来看机器装好了，也懂得了很多知识，踩过了很多坑，然后呢，这些内容似乎对我的将来好像也没有什么重复利用的价值了。唉，感慨一下吧，以后就知道了，时间应该有更重要的事情去使用。&lt;/p&gt;
&lt;h2&gt;一些实用小链接&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cpubenchmark.net/CPU_mega_page.html&quot;&gt;CPU Benchmarks&lt;/a&gt; 用来查 CPU 评分 TDP等&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>2026-02-05 随笔</title><link>https://blog.xingoxu.com/2026/02/2026-02-05/</link><guid isPermaLink="true">https://blog.xingoxu.com/2026/02/2026-02-05/</guid><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>
&lt;p&gt;感情它一阵一阵来，也不知道他什么时候来，一涌上心头，我便难以集中注意力&lt;/p&gt;
&lt;p&gt;昨天我开了某个交友软件的付费会员，这是我人生中第三个付费的软件。第一个是滴答清单，第二个是管理饮食的MyFitnessPal。
其实目的还是蛮简单的，我今年30，那我觉得27-34这个范围应该是聊得来可能性最大的人群，于是去定向查看那些人的话，应该可以更有效率找到和自己类似经历，类似爱好，类似想法，并且“看得过去”的朋友吧。我承认不是好人，我也是看脸看身材下菜的人。&lt;/p&gt;
&lt;p&gt;我对感情这件事情觉醒的很晚，怎么说呢，我在高一高二时喜欢过同班男同学一次，不过分班后也没有办法继续，只好自己被窝里大哭一场，也就过去了。在来日本之后的第一年的后半年，认识了一个二次元的朋友，前期我也看出来对方对我是有好感的，然后因为太喜欢了，讲了很多不切实际的内容，可能就把对方吓跑了，直接被绝交了。我总是善于把那些大顺风局打成逆风局，我把上天馈赠与我的礼物扔在一边，暴殄天物，把人际关系搞得一团烂，这一次也不例外。&lt;/p&gt;
&lt;p&gt;当我开完会员，我意识到软件上我喜欢的人应该不会喜欢我，而喜欢我的人我也完全看不上了，我又开始后悔开始绝望。&lt;/p&gt;
&lt;p&gt;我是个罪人，我去翻看我们的聊天记录，当他对我善意提醒我却恶语相向，当他发出求救信号我却含糊其辞。软件上的其他人问我，是不是回避型依恋，我根本没有说我们之间的任何事情，我问他是怎么知道的，他说他也是这样的。我懂了，原来我不是焦虑，我是依恋，我不是焦虑型，我是回避型。当他对我告白的时候，我总是想着怎么往后拖，怎么维持我们朋友的关系又不伤害他喜欢我的那颗心，但我只是在回避我自己对他的那份真正的情感。当时我认为我的生活只需要朋友和炮友，炮友负责解决性上的问题，朋友负责解决情感上，交心共情，以及日常娱乐的部分。我当然知道朋友的感情很重要，但我开始把一切当成理所应当，天平自然也就一方倾斜。&lt;/p&gt;
&lt;p&gt;其实他在跟我告白的时候我也预知到我们这段关系可能走不远了，我自以为我的处理方式应该比较妥当，我自以为我也投入了很多感情，然而我还是犯下了一个又一个的错，他给了我挽回的机会，我却主动拒绝了，而去追一个身材好却毫无生活交集的小朋友，然而见面当天我就决心不再继续喜欢那个人了。我是不是贱呢？&lt;/p&gt;
&lt;p&gt;后来有朋友当着我们俩的面问我，为什么他没有来看我的健身比赛，我说观众也要付费所以他没来，朋友说没事xingo会出钱的。我当时就呆住了，我，我确实应该这么做啊，我在这段感情里确实不知不觉索取了太多，但我好像很少主动想到要为别人做点什么。其实也是想的，但总是觉得以自我为中心，自己不要的东西去送给人家，自己要的东西根本没有想过分享过。&lt;/p&gt;
&lt;p&gt;断联的那几个月，我又是招待爸妈，又是工作调动，又是薅尽羊毛，也有去试图给其他软件上勾搭我的人一些见面机会，闲暇时间也会去偷偷视奸对方推特主页看看风吹草动，我总是把自己的生活排的满满当当，让别人无从插缝，却又让别人以为有机可图。我真是有罪，我罪该万死。&lt;/p&gt;
&lt;p&gt;这一个多月来我还是没有恢复到之前的状态，我早晨起来我还是会毫无目的地刷各种社交软件，小红书，推特，instagram，6点醒的我刷到7/8点，4点醒的我也刷到8点，我好像觉得自己心口堵，也想说点什么，AI跟我说让我写下来，那种状态我怎么静下心来去组织语言，去把我的话给想清楚写明白，还是不要给我添乱了AI。起床后到晚上坐在电脑前之后好很多，虽然工作没法像之前那样效率那么高，工作时间中也是到处看SNS，情绪上总体是稳定的。我以为我已经开始好起来了，然而看到他发动态我也还是有点欲言又止，看到另一个人的头像，我会心头一紧。他是答应了还是当朋友关系，但，还有更多的事情，应该是为了避嫌，可是这已经不是我心中的那个要好朋友的等级了，也总有一天互相不再会假装是对方的朋友了吧。&lt;/p&gt;
&lt;p&gt;可能是被日本动漫毒害的比较严重，我一直认为的人际关系会有几个阶段，陌生人，认识的人，普通朋友，要好朋友。而普通的网友，你一句我一句的，我可能会把他放在认识的人或者普通朋友的关系里，普通朋友的这个阶段，可能是我会找到我们的共同话题，而我只会分享那些内容到这些朋友上，其他的我的内心话题都不会说，当然我本身也不是那种会展露出自己内心的人。毕竟我在日本6年多我独来独往，没有在这里上过学，生活两点一线，上班的日本人界限分明，当然也就不会有任何社交机会。因此要好朋友自然是0人。而我没有想到2024年的11月初老天却让我认识了一个从生活成长经历，到工作经历，到喜欢做的事情，到性癖都出奇一致的人，自然是互相吸引，关系发展迅速也是不出为奇。对我来说，我们有很多共同点，而他身上也有太多让我欣赏的点，我有时会嫉妒，而他也很包容。他以真心待过我，只是我理解得太晚。每个人对朋友这个词语的理解不同，在其他人眼里那样的要好朋友可能已经是亲密关系，但我也只能打碎牙往自己肚子里吞，当然就算是我的要好朋友的定义来说，我也付出还不够。&lt;/p&gt;
&lt;p&gt;最终还是错过了，当时想要的朋友关系，现在求仁得仁。我现在的懊悔感，失落感，无力感，是理所应当的惩罚。我不会怨天尤人，理智知道自己应该回归正常生活节奏，这样才有机会遇见下一个更好的，而在早晨和晚上，那些开头的后悔与绝望又占上心头，让我的脑中充满了负面的想法与行为。软件上的人有些脸好，或是身材好，却与我似乎风格格格不入，又或是完全没有话题可聊，再也没有共同爱好，又或是一开口就满嘴哈哈，想要掩盖那些没有共同点的尴尬。我很怕自己成为《被嫌弃的松子的一生》的主角一般，最后死在堆满垃圾的自己家里而久久无人发现。我怕自己像是《野良神》里的无名神，被人遗忘之后再也无法重新复活。我痛恨那些以前让我没有好好与他相伴的破事，我开始讨厌做一些浪费时间不感兴趣却又只带来一点蝇头小利的案件，我甚至听到某些地名，某些事情，看到某些照片，也会让我起鸡皮疙瘩，产生生理性的厌恶。我在日本的家附近看了心疗内科兼神经科，医生听我说了一堆，然后问的是，我什么感受，想开什么药，我不知道该回什么。一开始我有过反抗，叽里呱啦给他发了一堆，他也很好没有对我任何过激词语，只是一次又一次之后我觉得他应该也是累了，我也开始学着把自己的情绪如何再像之前那样藏起来。&lt;/p&gt;
&lt;p&gt;我们仍然还可能会见面，但我不知道哪一次会是最后一次，我把每一次都当成最后一次见面，我还是希望把我最好的那面展现给他看，只是那天独处没有说出口的话，也再无价值。&lt;/p&gt;
&lt;p&gt;我把我instagram链接到threads上的链接给隐藏了，反向也是，我知道可以通过搜人名看见，也知道threads自己会推荐，本身贴文也会被推荐到别人的首页，只是想要避免一些认识我，但还没足够了解我的人，让他们以为我是个疯子。&lt;/p&gt;
&lt;p&gt;一切都已经过去了，我不知道还有多久才能回归自己，但是再不快点我的工作可能很有危险。&lt;/p&gt;
&lt;p&gt;谨以此文纪念我不成熟的30岁与一份逝去的至高友情。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文在2026年02月05日晚发布在我的 Threads 上，略有修改&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>升级 Jellyfin 到 10.9</title><link>https://blog.xingoxu.com/2024/08/2024-jellyfin-109-update/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/08/2024-jellyfin-109-update/</guid><description>前两天刚谈到用 [nyanmisaka/jellyfin](https://hub.docker.com/r/nyanmisaka/jellyfin/) 的镜像做的 Jellyfin，但是 Jellyfin 的 Android TV 版本升级到最新之后只支持 10.9+ 以上版本的服务端，虽然也能把 Android TV 版本的 Jellyfin 降级到 10.8 兼容版本，但 Jellyfin 更新勤快，降级 TV 版本只是最后保底之策，将来如果有其他新特性，那么长痛不如短痛赶快升级到最新版本才是上策。

</description><pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前两天刚谈到用 &lt;a href=&quot;https://hub.docker.com/r/nyanmisaka/jellyfin/&quot;&gt;nyanmisaka/jellyfin&lt;/a&gt; 的镜像做的 Jellyfin，但是 Jellyfin 的 Android TV 版本升级到最新之后只支持 10.9+ 以上版本的服务端，虽然也能把 Android TV 版本的 Jellyfin 降级到 10.8 兼容版本，但 Jellyfin 更新勤快，降级 TV 版本只是最后保底之策，将来如果有其他新特性，那么长痛不如短痛赶快升级到最新版本才是上策。&lt;/p&gt;

&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;从零重新根据向导起环境 + 设置库才能获得最正常的体验&lt;/p&gt;
&lt;h2&gt;尝试直接升级到 &lt;a href=&quot;https://hub.docker.com/r/jellyfin/jellyfin&quot;&gt;jellyfin/jellyfin&lt;/a&gt; 镜像&lt;/h2&gt;
&lt;p&gt;nyanmisaka 镜像是在官方镜像上进行的修改因此数据目录和官方镜像一致，可以直接升级，docker-compose 修改 image 值，compose up 一下就完成了。&lt;/p&gt;
&lt;p&gt;但是发生了以下问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;播放时不调用 GPU 加速，CPU 100%&lt;/li&gt;
&lt;li&gt;只有 Android TV 客户端在播放时中文字幕乱码，表现为 口口口&lt;/li&gt;
&lt;li&gt;部分番剧的 Extra 消失，或者上层文件夹并不是 Season X 的标准文件夹也会被吸收进正片一个文件夹并被刮削成标准集&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;播放时不调用 GPU 加速，CPU 100%&lt;/h3&gt;
&lt;p&gt;我的 CPU 是 10代 UHD 630，在查看 &lt;a href=&quot;https://www.intel.com/content/www/us/en/docs/onevpl/developer-reference-media-intel-hardware/1-1/overview.html#CODECS-ENCODE-SUPPORT-FOR-10TH-GENERATION-INTEL-CORE&quot;&gt;Intel 支持&lt;/a&gt; 后发现并不支持 AV1 的解码和编码，因此要将硬件加速部分的 AV1 的解码和编码部分的对钩去掉。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1i7rpw5hxs0j21bu1hm12k.jpg&quot; alt=&quot;硬件加速设置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;客户端再次播放时服务端调用了GPU，CPU的占用也得到了改善&lt;/p&gt;
&lt;h3&gt;中文字幕乱码&lt;/h3&gt;
&lt;p&gt;在 &lt;a href=&quot;https://hub.docker.com/r/nyanmisaka/jellyfin/&quot;&gt;nyanmisaka/jellyfin&lt;/a&gt; 的镜像的&lt;a href=&quot;https://www.chiphell.com/thread-2375777-1-1.html&quot;&gt;说明&lt;/a&gt;中，已经添加了中文支持，而且我也为了部分字幕的效果有设置了备用字体。&lt;/p&gt;
&lt;p&gt;但在原版镜像下，即使我启用了备用字体，字幕还是乱码。&lt;/p&gt;
&lt;p&gt;然而在网页端和在官方 Android App 以及第三方 Findroid 播放时没有乱码。&lt;/p&gt;
&lt;p&gt;反复查看&lt;a href=&quot;https://jellyfin.org/docs/general/administration/troubleshooting/#text-not-rendering-properly&quot;&gt;官方文档&lt;/a&gt;也表示，字幕依赖客户端字体，乱码在开启备用字体后就能解决。&lt;/p&gt;
&lt;p&gt;最后抱着尝试性的心态在容器内安装了 CJK 系统字体，重新启动 jellyfin 服务端后，Android TV 客户端已可正常渲染字幕。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install fonts-noto-cjk-extra
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Extra 文件夹不显示&lt;/h3&gt;
&lt;p&gt;没找到解决方案，没有人提 Issue 也很奇怪&lt;/p&gt;
&lt;h2&gt;更换为 &lt;a href=&quot;https://hub.docker.com/r/linuxserver/jellyfin&quot;&gt;linuxserver/jellyfin&lt;/a&gt; 镜像&lt;/h2&gt;
&lt;p&gt;因为用户权限问题，最后还是更换为了 linuxserver 的镜像&lt;/p&gt;
&lt;p&gt;但是数据文件夹结构不同，首先参照&lt;a href=&quot;https://github.com/jellyfin/jellyfin/issues/3717&quot;&gt;此 issue&lt;/a&gt; 手动调整目录结构&lt;/p&gt;
&lt;p&gt;然后修改 &lt;code&gt;docker-compose.yml&lt;/code&gt;，添加安装字体包&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;正常启动后发现无法修改库的任何配置，最后删除了数据文件夹重新扫描重建了库（寄）&lt;/p&gt;
</content:encoded></item><item><title>2023 你的名字 飛騨高山 圣地巡礼</title><link>https://blog.xingoxu.com/2024/08/2023-kiminonawa-hida-seichijunrei/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/08/2023-kiminonawa-hida-seichijunrei/</guid><description>一直很想把君名的山里的部分也巡礼一下，总算在2023年8月和朋友一起去了飛騨，把照片都拍了，住了一晚但第一天坐的夜巴所以实际上走了玩了两天。

年初的时候已经在微博上整理了几张，今天把对比都都好好整理一下。



&lt;div&gt;

![飛騨古川駅后边的天桥上](https://staticimg-v2.xingoxu.com/image/9ebbee47-b69e-4d32-a052-bb032c0b10f7.png)&lt;/div&gt;&lt;div&gt;

![飛騨古川駅后边的天桥上](https://staticimg-v2.xingoxu.com/image/ccd726b7-4916-4df2-9308-9d958d3fe379.jpg)&lt;/div&gt;

&lt;div&gt;

[飛騨古川駅后边的天桥上](https://maps.app.goo.gl/V4TgZDVrpVq67Qij8)

&lt;/div&gt;

</description><pubDate>Sun, 18 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直很想把君名的山里的部分也巡礼一下，总算在2023年8月和朋友一起去了飛騨，把照片都拍了，住了一晚但第一天坐的夜巴所以实际上走了玩了两天。&lt;/p&gt;
&lt;p&gt;年初的时候已经在微博上整理了几张，今天把对比都都好好整理一下。&lt;/p&gt;

&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/9ebbee47-b69e-4d32-a052-bb032c0b10f7.png&quot; alt=&quot;飛騨古川駅后边的天桥上&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/ccd726b7-4916-4df2-9308-9d958d3fe379.jpg&quot; alt=&quot;飛騨古川駅后边的天桥上&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/V4TgZDVrpVq67Qij8&quot;&gt;飛騨古川駅后边的天桥上&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;放一张沉浸式的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegklw48jj21zy12akjm.jpg&quot; alt=&quot;飛騨古川駅&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后是立花泷出车站&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/def142ac-5991-4a90-91fc-559da3da92aa.png&quot; alt=&quot;飛騨古川駅内&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/daf073c9-4a31-4186-8df8-1881bb104eb6.jpg&quot; alt=&quot;飛騨古川駅内&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegkmvge4j23402c07wj.jpg&quot; alt=&quot;飛騨古川駅内&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/V4TgZDVrpVq67Qij8&quot;&gt;飛騨古川駅内&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;车站前&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/68a8b540-a1f1-4ee1-a791-79f23e4f81cb.png&quot; alt=&quot;飛騨古川駅前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/80cb5c79-90ce-4e6e-8502-315fdf24beb0.jpg&quot; alt=&quot;飛騨古川駅前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegklxyyij220011ub2a.jpg&quot; alt=&quot;飛騨古川駅前&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/V4TgZDVrpVq67Qij8&quot;&gt;飛騨古川駅前&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/e4cf18b9-9648-4778-9370-df5e64a45f7a.png&quot; alt=&quot;巴士站内&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/4d984d65-f13c-41fa-b829-8fa1d5efe2ce.jpg&quot; alt=&quot;巴士站内&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegkpshlmj23402c0hdx.jpg&quot; alt=&quot;巴士站内&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/5qwHx3kiwgq5Dr6E7&quot;&gt;落合巴士站&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/d48679bd-5402-4cc1-a9f7-92b9a9dfb58e.png&quot; alt=&quot;问路的后边场景的台阶&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/4c92e232-cb10-4f46-86f5-ff018096ea8d.jpg&quot; alt=&quot;问路的后边场景的台阶&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/Tvsg8jTrDWXjtATM8&quot;&gt;気多若宮神社&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;剧中的图书馆其实是飛騨市图书馆&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/4419fd7f-f98c-404e-8b49-dafc9dd42a86.png&quot; alt=&quot;图书馆外部&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/61ef89d9-384a-4a44-84f1-89231c14d890.jpg&quot; alt=&quot;图书馆外部&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/hZwhRjVS3R3PwVPa7&quot;&gt;飛騨市図書館&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/7819f1be-c982-43d2-aa26-b34864955d33.png&quot; alt=&quot;图书馆内&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/0df21aab-6c8b-4a94-9bde-bc1d2f071717.jpg&quot; alt=&quot;图书馆内&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegknx0mjj23402c0qv7.jpg&quot; alt=&quot;图书馆内&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/hZwhRjVS3R3PwVPa7&quot;&gt;飛騨市図書館&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;电影一开始的宮水的部分&lt;/p&gt;
&lt;p&gt;这边最开始镇上回家的聊天，道口这边不能进铁路线拍，所以应该差不多是横过去看的感觉，可能也不一定是这个道口。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/d5652ce2-772d-4038-b148-304e79d8eee1.png&quot; alt=&quot;最开始开头的镇上散步&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/6e8a199e-60a3-4243-bb72-7208f02eb008.jpg&quot; alt=&quot;最开始开头的镇上散步&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/MREQC79gj51Sqtqf8&quot;&gt;飛騨古川駅隣&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/a9e3e68d-6c10-4cf9-9547-86543e76599c.png&quot; alt=&quot;飛驒市立古川西小学校&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/b52ac678-7d57-48fa-808a-21633d2a5b44.jpg&quot; alt=&quot;飛驒市立古川西小学校&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1hlegkmxksqj22ci1rex6r.jpg&quot; alt=&quot;飛驒市立古川西小学校&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;https://maps.app.goo.gl/Vt3dHyz1HJjzxk9G6&quot;&gt;飛驒市立古川西小学校&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;巡礼的时候电影已经上映了快10年，但去到偏远乡下的圣地当地还是张贴了当年的海报，以及很欢迎别人来参观和打卡，&lt;a href=&quot;https://weibo.com/1804320382/NdlEK6u6f&quot;&gt;还特地放了留言本等等&lt;/a&gt;，还是很有意思的一次巡礼。&lt;/p&gt;
</content:encoded></item><item><title>2024 年如何中间人 Android 网络请求</title><link>https://blog.xingoxu.com/2024/07/2024-android-debugging-ssl/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/07/2024-android-debugging-ssl/</guid><description>不像 iOS，在 Android 下，设置完了代理并安装与信任了自签证书后并不能让 Apps 信任被中间人了的网络请求。这篇文章是记录了 2023 ~ 2024 年我是如何中间人 Android 的网络请求的。

</description><pubDate>Tue, 09 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不像 iOS，在 Android 下，设置完了代理并安装与信任了自签证书后并不能让 Apps 信任被中间人了的网络请求。这篇文章是记录了 2023 ~ 2024 年我是如何中间人 Android 的网络请求的。&lt;/p&gt;

&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;Android 从6版本开始，系统就会默认所有 Apps 的 https 网络请求都变成了只信任系统区证书，而不相信用户自己安装的证书。这提升了 Android 设备的安全性，但也让我们无法再简单的窥探 Apps 的请求内容。&lt;/p&gt;
&lt;p&gt;以前我会使用 Xposed Framework，但 Xposed 好久不更新，后继的 LSPosed 等等也是风波不停，只是为了中间人 app 的请求，是否有更优雅的方式。&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://github.com/shroudedcode/apk-mitm&quot;&gt;apk-mitm&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;这是唯一非 root 也能使用的工具，原理是反向apk后植入hook并动态信任 https 请求。&lt;/p&gt;
&lt;p&gt;好处&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不需要 root&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;坏处&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;webview 的内容无法被中间人&lt;/li&gt;
&lt;li&gt;App 可能并不会按预期的工作&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href=&quot;https://frida.re/docs/android/&quot;&gt;Frida&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;专为反向而生的 Frida 在运行时hook内存并强行信任证书。&lt;/p&gt;
&lt;h1&gt;手机端准备工作&lt;/h1&gt;
&lt;p&gt;下载对应的 binary 推送到手机&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 16.1.8 改成对应版本
adb push ./frida-server-16.1.8-android-arm64 /data/local/tmp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;切到 root 权限进入 adb shell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb root &amp;amp;&amp;amp; adb shell &quot;chmod 755 /data/local/tmp/frida-server*&quot; &amp;amp;&amp;amp; adb shell &quot;/data/local/tmp/frida-server-16.1.8-android-arm64 &amp;amp;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要注意 Pixel 等手机有时可能在 adb root 时报错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adbd cannot run as root in production builds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 su -c 或者一行一行手动敲命令↓&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb shell
# 进入 Android shell后切换超级用户模式
su
# 付与 frida server 执行权限
chmod 755 /data/local/tmp/frida-server*
# 启动 frida server
/data/local/tmp/frida-server-16.1.8-android-arm64 &amp;amp;

# 按 Control + C退出
# 敲两次 exit 退出 shell
exit
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此手机端的准备工作就完成了&lt;/p&gt;
&lt;h1&gt;电脑端准备工作&lt;/h1&gt;
&lt;p&gt;电脑端也要安装命令行，首先安装 Python 3后，执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install frida-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结束&lt;/p&gt;
&lt;h1&gt;启动脚本&lt;/h1&gt;
&lt;p&gt;Frida 服务器只是监听内存并劫持，在启动时也需要指定动作，
我搜到的一个比较全的脚本是 &lt;a href=&quot;https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/&quot;&gt;frida-multiple-unpinning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;启动命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# apk.packagename是包名
frida -U -f apk.packagename --codeshare akabe1/frida-multiple-unpinning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时，Frida 也支持 Work Profile或多用户，添加&lt;code&gt;--aux=&quot;uid=(int)10&quot;&lt;/code&gt;参数来启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;frida -U --aux=&quot;uid=(int)10&quot; -f apk.packagename --codeshare akabe1/frida-multiple-unpinning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;10 代表 Work Profile，多用户的情况下可以查看用户 uid 后打开即可。&lt;/p&gt;
&lt;p&gt;执行命令后应用自动启动，此时 SSL 已经被绕过并可以使用 Charles 等分析请求内容。&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://kishorbalan.medium.com/its-all-about-android-ssl-pinning-bypass-and-intercepting-proxy-unaware-applications-91689c0763d8&quot;&gt;It&apos;s all about Bypassing Android SSL Pinning and Intercepting Proxy Unaware applications.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://frida.re/docs/android/&quot;&gt;Android | Frida&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>聊聊管理番剧动画片这件事</title><link>https://blog.xingoxu.com/2024/07/2024-managing-anime-series/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/07/2024-managing-anime-series/</guid><description>我刚开始看动画的时候也是B站或者优酷这些流媒体看的，最开始从国外录电视，翻译添加字幕重新压制再上传各个视频网站然后被我们所观看到。之后就各种政策变化，以及有了一些版权意识之后，一些没有引入版权，又或是动画本身有一些镜头并不符合国内情势被剪辑的事情发生之后，我看动画的方式就从在线变成了找资源下载看了。而后又对DVD，高清，蓝光等事情产生了兴趣，以及喜欢的动画如果想再回去看看的话又不想每次再翻回去看这一点之后开始研究 PT 等等的事情。

与此同时也购入了人生第一台 NAS ，群晖ds215j之后，到我卖掉我的DS916这期间，找番看番离不开动漫花园和幼儿园等网站，但也只停留在下载，使用 PotPlayer / IINA 播放阶段，即使之后一个人生活也是在客厅里放了一台电脑接上电视机观看。

搬新家之后买了很多新的家用电器，攒了很多家电积分后没有想买的东西了，于是去买了个原价率最高的「Chromecast with Google TV」来玩，但接上后发现完全就是一个播放流媒体的工具，然而下载党 &amp;amp; 抠逼并不愿意为流媒体多付一分钱的情况下研究播放下载了的番剧，但群晖自己的 Video Station 会预转码占用硬盘空间，加上也没有系统性的整合剧集非常不好用，以前对转码的认知也停留在很肤浅的阶段，认为转了码画质就低下了，所以大多数情况下也还是继续打开电脑来播放下载的动画。

又过了两三年左右我自己使用 OMV 为底组装了自己的 NAS，一方面想着如何盘活客厅里的 Chromecast ，另一方面从开电脑到打开共享文件夹从乱七八糟的PT的文件夹名找到自己要看的番剧到找字幕解压再看其实步骤很多，对心理负担很大，会容易让自己不太想看电视了。因此能否使用简单操作快速播放 NAS 中的番剧文件，并且还要能实时转码推流，并保持做种是做这件事情的目的与动力。

以上就是这篇文章的背景，那么开始动手。

</description><pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我刚开始看动画的时候也是B站或者优酷这些流媒体看的，最开始从国外录电视，翻译添加字幕重新压制再上传各个视频网站然后被我们所观看到。之后就各种政策变化，以及有了一些版权意识之后，一些没有引入版权，又或是动画本身有一些镜头并不符合国内情势被剪辑的事情发生之后，我看动画的方式就从在线变成了找资源下载看了。而后又对DVD，高清，蓝光等事情产生了兴趣，以及喜欢的动画如果想再回去看看的话又不想每次再翻回去看这一点之后开始研究 PT 等等的事情。&lt;/p&gt;
&lt;p&gt;与此同时也购入了人生第一台 NAS ，群晖ds215j之后，到我卖掉我的DS916这期间，找番看番离不开动漫花园和幼儿园等网站，但也只停留在下载，使用 PotPlayer / IINA 播放阶段，即使之后一个人生活也是在客厅里放了一台电脑接上电视机观看。&lt;/p&gt;
&lt;p&gt;搬新家之后买了很多新的家用电器，攒了很多家电积分后没有想买的东西了，于是去买了个原价率最高的「Chromecast with Google TV」来玩，但接上后发现完全就是一个播放流媒体的工具，然而下载党 &amp;amp; 抠逼并不愿意为流媒体多付一分钱的情况下研究播放下载了的番剧，但群晖自己的 Video Station 会预转码占用硬盘空间，加上也没有系统性的整合剧集非常不好用，以前对转码的认知也停留在很肤浅的阶段，认为转了码画质就低下了，所以大多数情况下也还是继续打开电脑来播放下载的动画。&lt;/p&gt;
&lt;p&gt;又过了两三年左右我自己使用 OMV 为底组装了自己的 NAS，一方面想着如何盘活客厅里的 Chromecast ，另一方面从开电脑到打开共享文件夹从乱七八糟的PT的文件夹名找到自己要看的番剧到找字幕解压再看其实步骤很多，对心理负担很大，会容易让自己不太想看电视了。因此能否使用简单操作快速播放 NAS 中的番剧文件，并且还要能实时转码推流，并保持做种是做这件事情的目的与动力。&lt;/p&gt;
&lt;p&gt;以上就是这篇文章的背景，那么开始动手。&lt;/p&gt;

&lt;h1&gt;jellyfin&lt;/h1&gt;
&lt;p&gt;大数据果然没有让人失望，在组装 NAS 的时候就给我推送了很多有关这方面的文章，而我让我了解到了 jellyfin 这样东西。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1i7rpyfixgij22i61jenpi.jpg&quot; alt=&quot;jellyfin 海报墙&quot; /&gt;&lt;/p&gt;
&lt;p&gt;关于 jellyfin 是什么，大家 Google 一搜就能搜出来了，他对我的好处无非就是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实时推流&lt;/li&gt;
&lt;li&gt;支持外挂字幕&lt;/li&gt;
&lt;li&gt;喂影片数据简单&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;jellyfin 如何搭建这个应该没有什么问题吧，最简单的 docker compose 一起就好了，唯一要注意的是硬解的话 docker 内驱动要装好
我现在用的是 &lt;a href=&quot;https://hub.docker.com/r/nyanmisaka/jellyfin/&quot;&gt;nyanmisaka/jellyfin&lt;/a&gt; 的镜像，已经带了 Intel QSV 驱动，但是最近 jellyfin 升级到了10.9+，而他的镜像还没更新，也许之后再不更新的话我可能就会换回 linuxserver 镜像了。&lt;/p&gt;
&lt;h2&gt;插件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kookxiang/jellyfin-plugin-bangumi&quot;&gt;Bangumi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个插件可以让jellyfin自己搜索到 bgm.tv 上的数据下载展示，而不需要手动去喂数据制作 nfo 文件了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kodi Sync Queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个插件是用来同步 Kodi 和 jellyfin 的内容，在 kodi 中也能看 jellyfin 的内容，具体在后边也会说&lt;/p&gt;
&lt;h1&gt;硬链&lt;/h1&gt;
&lt;p&gt;那么 jellyfin 有了之后我们不能让 jellyfin 在原来的文件夹里大做文章，首先问题是很有可能无法识别，如果下载下来的视频文件名太过奇葩，jellyfin其实有可能无法识别集数。
但最要命的，其实是那些个PT文件夹名，那种真的是jellyfin完全查不到的话也就不会jellyfin中显示，或者乱显示了。同时源文件夹也会乱乱的，整理起来也会更乱。
还有一些什么蓝光带的无字幕OPED特典啊，访谈啊什么的也会被jellyfin抓取，但又识别不出来的话或者被乱识别的话也没有办法在jellyfin自己的系统中好好显示。&lt;/p&gt;
&lt;p&gt;那么最妥当的办法是，硬链一个出来之后把那些不要的文件删除，只留下推流的东西就可以了，如果识别不出来再把文件名改一改就可以了。&lt;/p&gt;
&lt;p&gt;首先是硬链，我现在用的工具是 &lt;a href=&quot;https://github.com/likun7981/hlink&quot;&gt;hlink&lt;/a&gt;，配置好源文件夹和目标文件夹后点一下启动几秒钟就做好了几千几万个文件的硬链，同时默认配置已经是符合jellyfin的那些文件了，其次这个工具可以配置缓存，硬链过一次之后，源文件不改的情况下，下次启动任务后都不会再硬链过去，也就是不会把你整理过了的文件再让他们重头多来一次。&lt;/p&gt;
&lt;h1&gt;重命名&lt;/h1&gt;
&lt;p&gt;大多数情况下，jellyfin 已经可以识别季数集数，但日本的动画其实很不系统，有的时候算季，有的时候一开始就说要做多久的动画所以就没有季，有的时候呢换个名字出续集，bgm.tv 的数据和老外的AniDB的数据也有时并不一致。季的问题还算好，总集篇的问题可真让人头大，有时算 0.5 集，有时算中间集，有时不算集。各个字幕组或者是压制在做的时候也是各做各的。&lt;/p&gt;
&lt;p&gt;因此有这样那样问题的存在也就导致了并没有办法可以全自动的去对这个动画重命名，但能够用脚本去做的事情还是自动化掉，这样看剧才能看得舒服。&lt;/p&gt;
&lt;h2&gt;收拾 Extra&lt;/h2&gt;
&lt;p&gt;首先要收拾的就是那些OPED啊，送的特典视频啊，什么访谈啊，什么CM啊，新建一个Extra文件夹扔进去就行了（不看的话删了也可以）（我相信没什么人会看的）。&lt;/p&gt;
&lt;h2&gt;Episode-ReName&lt;/h2&gt;
&lt;p&gt;一般来讲粗看一下如果集数和bgm.tv的一致的话把字幕文件和视频放在一起，文件名保持一致也就不需要重命名了，但有的时候首先视频的集数要是和bgm不一样，或者季不一样，又或者字幕文件和视频文件不是一个文件名的话，那我推荐这个一键脚本，做的算比较好的，把要重命名的视频文件和字幕文件放在s1或者season 1类似于这样的文件夹下，然后执行脚本就行了。这个脚本的效果就是会把 &lt;code&gt;ajfkdjkfjdlajf 01 jfkdajfkd.mkv&lt;/code&gt; 重命名成 &lt;code&gt;S01E01.mkv&lt;/code&gt;，字幕的话，&lt;code&gt;jlkf23jinvnsvpsa 01 fjdklajfkl.chs.srt&lt;/code&gt; 重命名成 &lt;code&gt;S01E01.chs.srt&lt;/code&gt;，保留语言并且和视频一致而且可以让 jellyfin 识别。&lt;/p&gt;
&lt;p&gt;我一般是用 python 容器做这样的事情&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/Nriver/Episode-ReName.git


docker run --rm -it \
-v /srv/mergerfs/all_disk_pool/jellyfin:/jellyfin \
-v /path/to/anime:/path/to/anime \
-v $(pwd):/rename \
--workdir=&quot;/rename&quot; \
python:3-alpine \
sh -c &quot;python3 -m pip install -r requirements.txt --user &amp;amp;&amp;amp; pip3 install py-rename &amp;amp;&amp;amp; sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;py-rename&lt;/code&gt; 这个包我之后再提，但这边你应该注意到我用的是 mergerfs，而硬链在 mergerfs 上跨硬盘也能创建。&lt;/p&gt;
&lt;p&gt;然后对准要重命名的文件夹&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 EpisodeReName.py --overwrite 0 --path &quot;/jellyfin/.../s1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这边 &lt;code&gt;overwrite&lt;/code&gt; 参数指定之后，如果有两个文件都被重命名成了相同集数，也就是识别错误了的话，会取消重命名操作。&lt;/p&gt;
&lt;p&gt;另外他还支持偏移集数，比如刚才说到其实是第二季分开的，但是字幕组在做的时候连续编号了，又或者反过来，又或者总集篇没算进集数等等，可以参考&lt;a href=&quot;https://github.com/Nriver/Episode-ReName?tab=readme-ov-file#-%E5%A4%9A%E5%AD%A3%E7%95%AA%E5%89%A7tmdb%E9%9B%86%E6%95%B0%E9%80%82%E9%85%8D&quot;&gt;这里&lt;/a&gt;，写个all.txt单独批量增加集数重命名一下。&lt;/p&gt;
&lt;h2&gt;py-rename&lt;/h2&gt;
&lt;p&gt;然后是 &lt;code&gt;py-rename&lt;/code&gt; 这个包，其实是单纯的正则匹配重命名，专治👆🏻这个匹配不出来或者匹配错的，手动写规则去重命名。&lt;/p&gt;
&lt;p&gt;cd 到要修改文件名的文件夹底下，首先预览&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;py-rename -n rename &apos;(.+)第(\d{2})話([^.]+)\.([\w\.]+).ass&apos; &apos;S01E\2.\4.ass&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后去除 &lt;code&gt;-n&lt;/code&gt; 参数就会重命名了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;py-rename rename &apos;(.+)第(\d{2})話([^.]+)\.([\w\.]+).ass&apos; &apos;S01E\2.\4.ass&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还是比较安心的👍🏻&lt;/p&gt;
&lt;h1&gt;Kodi&lt;/h1&gt;
&lt;p&gt;到这边 jellyfin 自己的配置就可以了，这个时候在任何设备打开 Chrome 就已经可以看了，但我的最终目的还是要在 Chromecast 上串流。&lt;/p&gt;
&lt;p&gt;在 Android TV 上有几个选择，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=org.jellyfin.androidtv&quot;&gt;Jellyfin for Android TV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kodi + Jellyfin&lt;/li&gt;
&lt;li&gt;Jellyfin 在安卓上的客户端去强行安装到 Android TV 上（例如 &lt;a href=&quot;https://github.com/jarnedemeulemeester/findroid&quot;&gt;Findroid&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Jellyfin for Android TV&lt;/h2&gt;
&lt;p&gt;官方客户端其实还可以的，我试了一下到目前为止没什么问题，属于保底手段吧。但感觉好多不需要转码的流也转了码，或者字幕效果其实不是很好可定制型比较差，主打一个能看。&lt;/p&gt;
&lt;h2&gt;Jellyfin for Kodi&lt;/h2&gt;
&lt;p&gt;Kodi 的话本身播放器属于就很强大，可以配置源&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://kodi.jellyfin.org/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;加入源之后再从 zip 安装扩展 Kodi Jellyfin Addons / Jellyfin for Kodi&lt;/p&gt;
&lt;p&gt;另外官方推荐在服务器上安装 &lt;code&gt;Kodi Sync Queue&lt;/code&gt; 这个插件（在刚才安装bgm.tv插件的地方），可以保持库的同步。&lt;/p&gt;
&lt;p&gt;Kodi 20 + 10.8.3 的时候我配置好看了，也没什么问题， 但最近 Kodi 升级成了 21 之后，官方插件可能也升级了吧，有些动画没有了声音，在界面里开启强制转码也不行，我怀疑是音频部分并没有写进判断语句导致音频流不转码。。。所以暂时这个作罢。&lt;/p&gt;
&lt;h2&gt;Findroid&lt;/h2&gt;
&lt;p&gt;是最近新出的 Android 第三方 jellyfin 客户端，尝试了一下使用 Native 的播放器的话，画质给转的好多马赛克，开启了 mpv 播放器之后，画质是有了但卡的不行，卡帧。那只好冷藏起来咯。&lt;/p&gt;
&lt;p&gt;另外要注意如果下载 apk 推送到 Chromecast With Google TV 的话，要下载 &lt;code&gt;armeabi-v7a&lt;/code&gt; 架构的。&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;p&gt;本文鸣谢如下先辈提供情报&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kaaass.net/archives/1607&quot;&gt;理想影音库构建之路（二）：关于老番管理这件事&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://post.smzdm.com/p/a99vlpmp/#cl_3&quot;&gt;安卓TV端Kodi部署Jellyfin，使用Jellyfin打造最强媒体中心（篇二）&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/jinalharia/py_rename&quot;&gt;py-rename&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/Nriver/Episode-ReName&quot;&gt;Episode-ReName&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>解决在 Ubuntu 24 中用 Docker 安装服务器端 Wireguard 的一个问题</title><link>https://blog.xingoxu.com/2024/06/kimsufi-docker-wireguard/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/06/kimsufi-docker-wireguard/</guid><description># 背景

[前文](/2024/01/transmission-under-vpn/)提到了客户端使用 Wireguard 在 Docker 中连接 VPN 后将整个做种使用服务器网络的过程。但很不幸，这台 Kimsufi 的杜甫在上上个礼拜莫名其妙的失联了。期初我以为是网络问题或者可能死机了暂时性无法访问，一开始还能 ping 通于是在面板上操作了重启，重启过后无论是在中国大陆这边去 ping 还是在日本这边去 ping 都没有办法通，而且没有任何可 ping 通的迹象，遂重装。

</description><pubDate>Thu, 27 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/2024/01/transmission-under-vpn/&quot;&gt;前文&lt;/a&gt;提到了客户端使用 Wireguard 在 Docker 中连接 VPN 后将整个做种使用服务器网络的过程。但很不幸，这台 Kimsufi 的杜甫在上上个礼拜莫名其妙的失联了。期初我以为是网络问题或者可能死机了暂时性无法访问，一开始还能 ping 通于是在面板上操作了重启，重启过后无论是在中国大陆这边去 ping 还是在日本这边去 ping 都没有办法通，而且没有任何可 ping 通的迹象，遂重装。&lt;/p&gt;

&lt;h1&gt;问题1 ip6tables 报错&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;services:
  wireguard:
    image: linuxserver/wireguard:1.0.20210914
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      # - SYS_MODULE
    environment:
      - TZ=Asia/Tokyo
      - SERVERPORT= #optional
      - PEERS= #optional
      - SERVERURL= #Wireguard VPN server address
      - ALLOWEDIPS=
    volumes:
      - ./wireguard-server/config:/config
      - /etc/localtime:/etc/localtime:ro
      - /usr/src:/usr/src # location of kernel headers
      # - /lib/modules:/lib/modules
    network_mode: &quot;host&quot;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为之前就已经容器化过了，所以直接敲&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d &amp;amp;&amp;amp; docker-compose logs -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果启动后出现如下报错，而且宿主机的 IPv4 还没办法从外面 ping 通了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip6tables v1.8.7 (legacy): can&apos;t initialize ip6tables table `filter&apos;: Table does not exist (do you need to insmod?)
Perhaps ip6tables or your kernel needs to be upgraded.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很明显是 ip6tables 的有点问题，搜了一些文档进行自查后有可能是 ip6_tables 模块没有载入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;modprobe ip6_tables
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开机载入后启动容器便能成功启动&lt;/p&gt;
&lt;h1&gt;问题2 客户端只能访问 IPv6 地址但无法访问 IPv4&lt;/h1&gt;
&lt;p&gt;客户端没有办法访问公网 IPv4 地址，但是能 ping 通并访问宿主机的服务，真是让人头大，怎么会有这么奇怪的问题。&lt;/p&gt;
&lt;p&gt;能够 ping 通宿主机说明客户端和宿主机的连接成功建立， Wireguard 端应该是没有问题，那么问题应该是出在宿主机的内部包转发上，宿主机的 &lt;code&gt;wg0.conf&lt;/code&gt; 一动也没动过，网卡名也设置成通用的，怎么会不通也是很不明白。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Interface]
...
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eno+ -j MASQUERADE
PostUp = ip6tables -A FORWARD -i eno+ -o %i -j ACCEPT; ip6tables -A FORWARD -i %i -j ACCEPT;
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eno+ -j MASQUERADE
PostDown = ip6tables -D FORWARD -i eno+ -o %i -j ACCEPT; ip6tables -D FORWARD -i %i -j ACCEPT;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一句是允许 wg0（建立的nic）上进出包，后面那句是开启NAT转发，一切看起来都没有什么问题，在互联网上搜搜索索也没搜出来什么结果，于是问了新出的 Claude 3.5，也是来回问了好几回，最后给了的几个方案中有了这个解决方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iptables -I DOCKER-USER -i eno0 -o wg0 -j ACCEPT
iptables -I DOCKER-USER -i wg0 -o eno0 -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在宿主机的 bash 中敲入后客户端就马上能 ping 通 v4 地址了，于是上网搜索后发现 &lt;a href=&quot;https://www.reddit.com/r/WireGuard/comments/g7puj0/why_i_could_not_connect_via_wireguard_to_internet/&quot;&gt;reddit 的这个帖子&lt;/a&gt; 并稍微瞄了一眼 Docker 官方文档，看来是某个升级后导入的措施，可能是容器中建立的网卡怕影响到宿主机的网络所做的改动吧。&lt;/p&gt;
&lt;h1&gt;太长不看&lt;/h1&gt;
&lt;p&gt;首先第一个问题感觉不太像是 Ubuntu 会有的问题，因此怀疑是不是 kimsufi 修改的镜像问题（因为网络部分确实是有被修改），上述两个问题合在一起，有了以下解决方案。&lt;/p&gt;
&lt;p&gt;首先编写 iptables.rules&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*filter

-I DOCKER-USER -o wg0 -j ACCEPT
-I DOCKER-USER -i wg0 -j ACCEPT

COMMIT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其次编写启动脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

modprobe ip6_tables
iptables-restore -v -n /root/iptables/iptables.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后给这个脚本上个服务保证开机启动 &amp;amp; 出错再运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=My Startup Script
Before=network-online.target
Wants=network.target

[Service]
Type=oneshot
ExecStart=/root/startup.sh
ExecReload=/root/startup.sh
RemainAfterExit=yes
Restart=on-failure
RestartSec=3s

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ip6_tables&lt;/code&gt; 模块需要在 docker 容器启动前便加载因此选择在&lt;code&gt;network-online.target&lt;/code&gt; 前这个时间点运行脚本，但此时 docker 服务本身并不一定已经启动，因此如果才还原 iptables 的时候如果报错则让脚本自动再运行&lt;/p&gt;
&lt;p&gt;Ubuntu 24 默认内核允许 10s 内运行 5 次因此注意 &lt;code&gt;RestartSec&lt;/code&gt; 不要小于 2s 。&lt;/p&gt;
&lt;p&gt;最后让服务开机启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable myscript.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;余谈&lt;/h1&gt;
&lt;p&gt;这台机器第一次重装过后刚安装好 docker 和 zsh，还在操作 ssh 呢，结果唐突失联，再次面板操作重装后又被告知硬件出现了问题。待 kimsufi 那边检查过后重新安装完成后发现 500G 的硬盘变成了 1.8T 真是受宠若惊，本以为是主机坏了给我开了台新的但 CPU 和内存大小也没变 &lt;s&gt;不管反正给了就要用满&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;另外每次重装机器，虽然已经做了容器化，但还要配 ssh 和安装 docker 这件事让我很是心烦，即使弄好也会出现像上面的奇怪问题 &lt;s&gt;也怪自己从 Ubuntu 22 改成了 24&lt;/s&gt;，不知道有没有什么解决方案适合自己&lt;/p&gt;
</content:encoded></item><item><title>工作第7年，我从日本微信辞职了</title><link>https://blog.xingoxu.com/2024/06/good-bye-line-corporation/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/06/good-bye-line-corporation/</guid><description>转眼之间我在LINE已经工作了6年整，期间经历了大大小小，风格不同的产品和项目。5/17号我提了辞职申请，上星期，我走完了离职流程。今天这篇除了想写我和LINE的一些故事，也想留下一些自己对日本和将来的看法，更是为了自己将来的职业生涯中不要犯下同样的错误和正面去思考将来自己需要掌握的技能。

</description><pubDate>Sun, 09 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;转眼之间我在LINE已经工作了6年整，期间经历了大大小小，风格不同的产品和项目。5/17号我提了辞职申请，上星期，我走完了离职流程。今天这篇除了想写我和LINE的一些故事，也想留下一些自己对日本和将来的看法，更是为了自己将来的职业生涯中不要犯下同样的错误和正面去思考将来自己需要掌握的技能。&lt;/p&gt;

&lt;h1&gt;7年之前我感觉自己中了头菜&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/4ea76f73-f560-498a-bdf3-fdc9ae534f58.png&quot; alt=&quot;7年前我收到的 LINE 的 Offer&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我和LINE的结缘是在7年之前日语N2出成绩的下午，当时我拿到成绩单知道自己合格之后，兴奋之余也幻想着能不能去日本工作，于是投了LINE和square enix，最初，投完简历后的第三天LINE让我再发一遍简历的pdf，我以为是程序的自动回复，毕竟那时我还国内刚毕业，怎么会有人要刚毕业的，于是没有回复，一周后又是一封邮件让我再发一次正式简历，我发过去之后，便是一次笔试加上三次面试，最终神差鬼使的拿到了offer，我至今仍然不知道当时的面试官们究竟是看上了我哪点才招我进去的。&lt;/p&gt;
&lt;p&gt;至于square enix，第二周我就收到了拒信。&lt;/p&gt;
&lt;h1&gt;跳槽&lt;/h1&gt;
&lt;h2&gt;为什么干了6年都没有跳槽&lt;/h2&gt;
&lt;p&gt;我其实不是没有想过，2020年的时候有跳过，那时投了メルカリ，smartnews，和百度日本，最后是拿到了百度日本的offer，但金额只能说是非常不如人意，于是最后没有去。
在三年前的这次跳槽活动中，其实也给我留下了不小的心理阴影。
メルカリ让我用web做一个他们app的首页，我手工撸了一个双向绑定，得到的反馈是“虽然自行实现了类似框架，但没有实现app的abcdefg功能，因此不予采用”
SmartNews问了“你有没有看过Chrome源码？” “你对使用Rust重写前端工具是什么看法？”这样的问题，我不知道怎么回答，也确实没有看过，怕他问我更细节的问题，于是回答没有看过，以及没有接触过用Rust重写的工具链，于是挂了。
然而我准备过的算法问题和前端问题一个也没被问到过（笑）
Google、Indeed、微软这三家，投了简历却始终没有被回复过。
我当然知道自己实力不行，同时也因为新冠有看了一些YouTuber和b站up主的成功故事，也同时自己平时的一些个人开发积累（bot等）给自己一直有在产出不少的被动收入，在LINE的生活属于平稳安宁不忙的情况下，那么在那时认为其实不跳槽耗到拿到永住后其实也没问题。等拿到永住后，副业去找单子做也好，去当YouTuber就算没有收入也是有吆喝的。&lt;/p&gt;
&lt;h2&gt;那么为什么现在又打算跳槽了&lt;/h2&gt;
&lt;p&gt;跳槽这件事从产生想法到付诸行动是有一定的门槛的，特别是公司各方面都相对其他公司比较安稳的情况下，并且如果和新职业的某些方面不是有巨大的差距下更是拿到offer也不会想去的。&lt;/p&gt;
&lt;p&gt;三年前的那次跳槽，当时目的还是说能否有更好的挑战更高的薪水，在那时大家还是觉得互联网大厂福利好工资高技术氛围很棒。时至今日这些大家也知道其实是因为背后有足够的钱在支撑，今非昔比，开源节流是各大厂现在的主要目标，自然也会感受到寒冬。另外对于技术氛围的解读，三年前和现在我对这个的整体感受也是不一样的。&lt;/p&gt;
&lt;p&gt;2023年6月，我工作的产品LINE证券决定关停，我对这个结果毫不意外。9月份我被调到出前馆这个产品（类似于饿了么），我很疑惑为什么没有被调回原来的大前端部，而是把我外派到子公司去。&lt;/p&gt;
&lt;p&gt;起初的三个月，我依然按照以往自己的工作风格，适时造成开发任务但并不在空闲时间主动去索求开发案件。但没过多久上司就找我谈话，要求工作时间内积极响应。&lt;/p&gt;
&lt;p&gt;上司对我盯的很紧，包括Slack的在线状态也心心念念，这让我觉得工作中时刻有人在监督我让我很是不自在并且透不过气。但与这相反，在出前馆，所有的一切贯彻日本人的三大优秀传统ほうれん草，即报告联络相谈，所有的事情都需要进行确认，否则你的同事就会给你下马威，包括又不仅限于PR里的骨头挑刺。&lt;/p&gt;
&lt;p&gt;PR需要两个同意才能被合并，但一个大组中谁又了解你手里的功能性案件？然后就被要求去向同事整体说明你的设计你的想法，但这时如果对PR的修改意见不是你的写法有问题，而是对你案件整体功能的设计持有意见的话，那我想说关我屁事啊！？为什么在我已经做完功能的情况下要把这一切推翻从头来过？案件评审的时候你又不出席，老大都说可以了你为什么现在要跳出来拖人后腿？&lt;/p&gt;
&lt;p&gt;而这一切甚至发生的更过，我总觉得同事的工作是在敷衍，感觉他是在为了表现他在工作所以才在工作的。我一周前就已经做完了案件的大部分，每天都在大群里喊，早会喊希望大家积极 review 但直到最后一周甚至最后一两天前同事才会给我做评审。我很理解大家手里都很忙，但如果你给了评审意见需要我修改，那我修改之后你还得再评审一次，我等到猴年马月？我急得像热锅上的蚂蚁，同事提的意见是“我觉得 if / else if / else不太好，能不能改成switch，能不能抽出一个函数提前return？”。 我觉得你如果早个几周说我也不会那么生气，为什么要在马上要QA的这个节骨眼上提一些可有可无的意见？我观察了很多次，让我开始猜测你是否真的是在推动整个产品向前。&lt;/p&gt;
&lt;p&gt;当然不止包括你的评审同事，整个PM也是追求KPI数字，做一些我认为可有可无的功能，类似于短信认证改成电话认证等，而且途中还没做完PM自己也跳槽了，那这让我觉得你的动机不纯，你也只是逢场作戏，并不是真正想让这个产品变得更好。&lt;/p&gt;
&lt;p&gt;短期来看也许可以直接跟他们说去让他们不要这样做，但长期来看这一切都非常符合内耗这两个字，而我只能说对不起，耗不起。&lt;/p&gt;
&lt;p&gt;包括也有12薪改成了15薪，很多福利被取消或者改差，办公室也变得很远等等硬性条件，但多少还能忍受，只是实在是让我觉得调到这个新的出前馆这边，完全看不到前途。&lt;/p&gt;
&lt;p&gt;值得一提的是，我在2023/10的时候因为合并，HR系统完全并入雅虎的系统，然而雅虎用的软银的人事系统非常旧，字符还是JIS的第一版，我的名字因为字符集原因没法导入因此全部被录入成了片假名，虽然之后通过申请把能够显示的字符改了回来，但我当时在递申请的时候就觉得“啊，我估计呆不长这家公司了”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/800585c9-b4c0-4f63-8c2d-2dd03ed684e7.jpg&quot; alt=&quot;合并后的公司Logo&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;LINE的这6年与我的这6年&lt;/h1&gt;
&lt;p&gt;我回顾我自己这6年，前三年我可能还稍有技术长进，也确实回顾自己各种留下的笔记博客以及留下的各种脚本等，前三年也确实是很积极的对内为自己留下将来很多的积累，对外输出自己的各种知识形象价值观。但后三年几乎没有任何输出，正面上的输出只有给自己不停地写脚本去自动化生活中的各种系统。&lt;/p&gt;
&lt;p&gt;回过头想怎么会变成这样的结果，我自己觉得原因可能是：&lt;strong&gt;我为公司提出的贡献很少得到正反馈&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这个正反馈包括工资，评价，以及人给我的语言上的反馈。在前三年为公司的各种项目上提出了很多想法，很多改进，但却因为各种原因迟迟不能落地，有因为测试范围太大，测试时间不够，也有在PR评审阶段被人怼回去的。&lt;/p&gt;
&lt;p&gt;其实现在去想，如果双方都能做一步后退，比如我去跟进了瓶颈，思考如何去解决瓶颈，比如，范围太大那我能否仅对某个地方做改动，测试排期久的话那先约定时间，之后记着去盯紧。&lt;/p&gt;
&lt;p&gt;这个原因应该是最大的，我经历过的一件事是我发现了架构上的某个问题，然后我打了PR之后 Leader 说，你这个写法我没看过啊，你一动动了整个系统该怎么测试，我说这个写法只是你们不知道，现在小范围能跑就说明整体也没有问题。&lt;/p&gt;
&lt;p&gt;最后PR过了，然后还因为改了这个架构上的问题 leader 还录了个 podcast 说是自己发现的问题。我当然是很生气一连好几条日文推特，被组里的其他人看到了然后负责人来向我道歉最后删推结束。我自己也申请换到了其他组去了。&lt;/p&gt;
&lt;p&gt;那么在碰到过这样的事情之后我就开始变得比较“惰性”，你叫我做什么案件我就做什么案件，你指出我的代码有什么意见需要修改，我就完全按照你的意见去修改，首先这样很省时间我也没那么多心理上的负担，其次我主动去提出任何的想法，主动去改进项目中存在的问题和麻烦，对我的评价和工资没有任何反应，那我为什么要花那么多时间和精力去思考。我不如多学点新技术，多打会儿游戏，多写点自动化脚本。&lt;/p&gt;
&lt;p&gt;同时我对升职加薪也有过期待，但总是事与愿违，我并没有能碰上类似的空缺机会，在一开始以为表现够好就会有机会但其实也是一个萝卜一个坑。&lt;/p&gt;
&lt;p&gt;经历了三年前的那次面试失败后其实心里是有一些不平衡的，凭什么他们能够进我没能进的公司，他们的PR或者代码其实也就那回事，跟我差不多或者甚至还没我会写。但是这次我面试了近30家大中小公司，最后只拿到了2家公司的 offer，给的反馈也大多与沟通，或者没法推进整个面试的话题更进一步。这样的结果现在来看其实是和这么一连的情况是有因果关系的，因为我从来不会对同事和上司有任何的意见，永远都是好好先生，他们说什么我都是是是的，那么最终其实在沟通技能上也是毫无成长的。&lt;/p&gt;
&lt;p&gt;那么反过来，很少给员工正反馈的公司做得如何呢？&lt;/p&gt;
&lt;p&gt;2018年在刚进公司的时候股价平均也有4500点左右，而到合并前也只有4000点，一度跌下过3000点都不到，LINE的问题在我看来是只有流量但没有内容留住顾客，因此多元化的策略非常必须，但至于为什么明明做了这样那样的事情，却还是没能做起来最后还是不温不火的就不是我能分析的了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/2e68b22b-2a2c-4dec-a5dc-46c73569d36b.png&quot; alt=&quot;LINE在下市前的股价&quot; /&gt;&lt;/p&gt;
&lt;p&gt;LINE曾经是一家好公司，感觉产品推动很快，感觉自己做每件事情都很有意义，而且在2018年，我觉得在日本，没有一家企业可以称得上是真正意义上的互联网公司，比如乐天，比如mixi，比如メルカリ，这些企业的文化我觉得都无法和LINE相提并论，他们并不是一个频道上的。但近3年合并，总觉得写代码以外的事务性工作变得多了很多，做完的功能也推翻一次又一次，还有莫名其妙多出很多可有可无的一道步骤。其实是变得越来越像传统日本企业，而且这样的问题应该不只是LINE有，其他公司肯定也会有，所以如果今天我呆的不是出前馆这个组，也许我还会继续干下去。
但这并不意味着出前馆这个组不行，如果其他的硬性条件没有发生变化，那我也不会萌生跳槽的想法。就和7年前一样，为什么来日本？我的回答也不会只有一个答案。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/fca2196b-773c-4d55-a93b-63da8221eccf.jpg&quot; alt=&quot;2018年的时候还组织韩国和日本的开发团建&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;将来的打算&lt;/h1&gt;
&lt;p&gt;和国内的朋友聊天，大家一直在说卷卷卷的，我自己是认为合适的卷是有必要并且对公司行业和自我发展都是有益的。卷这个词可能有点用烂了，”合适的卷“应该被称之为适当的走出舒适圈以及抱有一颗对任何事情的上进心。国内有好多人为了不愿意强制加班跳槽到了其他国家，但未必不是另一个围墙。&lt;/p&gt;
&lt;p&gt;三年前我对“技术氛围”的认知是大家是否积极会对新技术抱有开放的心态，积极采用，是否能够以技术再去推动产品发展等等，当我现在谈到“技术氛围”这四个字的认知的时候，我觉得应该解读为，你的同事是否是真的用心在工作了，他们是否真的在乎你写的代码，他们的技术水平是否达到了一定程度，能够看懂你写的代码。在我看来最后这个屎坑用什么框架用什么代码砌成的可能没有什么关系，重要的是你的同事是否对他有一颗积极向前推动发展的心。这跟日本的终生雇佣制，安稳的劳动法可能有关，有可能是他们觉得这样做其实风险最小，最能保住自己的工作，最不会节外生枝。（这样的思想我觉得在日本的很多地方都看得到）&lt;/p&gt;
&lt;p&gt;那么在这样的环境下国内的朋友跳槽来日本的话，是否会感觉真的舒适就仁者见仁了。一方面下班手机关机是日本人的常态，大家会觉得这点很好，但自己的技术价值职业生涯能否得到提升，也许大环境可能还不如国内，需要你强于常人几倍的沟通和推动能力才能实现自己想要达成的目标。而我甚至会想如果毕业后没有来日本，在国内会不会有更好的发展？但没有办法考究，毕竟我不能同时活两个人的人生。&lt;/p&gt;
&lt;p&gt;这篇文章可能是我自己的借口，包括同事对工作不上心那我也是不上心，包括为什么自己没有在工作中意识到去学习沟通技巧去多推动事情发展，那么换个工作环境，希望能成为自己重新向前的动力吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://staticimg-v2.xingoxu.com/image/f1b1d7f8-c914-43d8-bc19-7b57c8f27613.jpg&quot; alt=&quot;我和布朗熊&quot; /&gt;&lt;/p&gt;
&lt;p&gt;技术面上是深耕某个领域还是广泛熟知整体技术上的领域，我至今也没有想好，但我觉得工作之后，重要的不是去想方向，而是只要是自己喜欢的事情，找准一个去花时间和精力参与，参与是最重要的。&lt;/p&gt;
</content:encoded></item><item><title>用 Astro 翻新我的博客</title><link>https://blog.xingoxu.com/2024/06/2024-astro-blog/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/06/2024-astro-blog/</guid><description>好久没有写博客了，忙是比较大的一个因素以外，事实上这几年也感觉确实没有什么积累，一方面前端虽然还是变化很快，但翻来覆去其实就那几个花样，我会觉得这也要写一篇文章水吗？另一方面博客本身也是各种长草，另外把想法组织成语言很难是因为当写成文章时就必须要归纳和整理，提升了整个难度。今天这篇文章主打一个想到哪里写哪里，希望能够降下自己写文章的门槛，聊一聊 2024 我用 Astro 翻新了我的博客。

</description><pubDate>Tue, 04 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;好久没有写博客了，忙是比较大的一个因素以外，事实上这几年也感觉确实没有什么积累，一方面前端虽然还是变化很快，但翻来覆去其实就那几个花样，我会觉得这也要写一篇文章水吗？另一方面博客本身也是各种长草，另外把想法组织成语言很难是因为当写成文章时就必须要归纳和整理，提升了整个难度。今天这篇文章主打一个想到哪里写哪里，希望能够降下自己写文章的门槛，聊一聊 2024 我用 Astro 翻新了我的博客。&lt;/p&gt;

&lt;h1&gt;为什么要写博客&lt;/h1&gt;
&lt;p&gt;在我刚开始工作的时候我觉得写博客只是一件很酷的事情，“哦你/他在写博客”，在我内心的想法中是为了记录所以才记录的感觉。然而最近我在写自己的项目的时候，当我思考如何解耦的时候我翻到了之前写的 &lt;a href=&quot;/2020/06/cls/&quot;&gt;CLS&lt;/a&gt;，最后成功的解决了问题，收获很大。我才意识到其实写博客是一个知识整理的过程，把工作时出现的问题能够记录下来在脑袋里消化最后用语言总结成文章，其实对自己应该是有所帮助的。&lt;/p&gt;
&lt;h1&gt;为啥很久没有写博客了&lt;/h1&gt;
&lt;p&gt;文章开头简单说了一下理由，首先前端本身在我个人的观测下其实整体架构趋于稳定，每件事情都有着固定的解决方案了，就算是Next.js，也只是整合整合再整合的感觉。
其次是写博客本身的心里难度，很多事情一旦有了条条杠杠，做起来就会觉得有了难度，比如一旦动起笔来就会想我这篇文章标题起什么，小标题起几个怎么分段等。而其实我们每个人有想法的时候经常是一段一段的，并不太会事先规划好。而且事实上我在写离职的那篇文章的时候，就是先在TickTick中把自己想到什么就写下来，最后再一起搬到记事本里调整顺序和归纳。因此从个人的习惯，到支撑整个博客的系统上需要能够支持这样的碎片化的想法。&lt;/p&gt;
&lt;h1&gt;Hexo 的问题&lt;/h1&gt;
&lt;p&gt;直到2024年的年初为止，我都还是使用Hexo在书写博客。Hexo 之前的静态网站生成是 jekyll，jekyll 我没用过但 hexo 的命令行整体一看就是专为博客而生，再加上当时国内大学生之间都很流行，于是就用了。没想到这一用直接用了近10年，还蛮意外的。&lt;/p&gt;
&lt;p&gt;Hexo 在我的观测下是内容和主题做到了分离，而且主题可以使用ejs等模板引擎进行一个不错的根据内容的区分进行生成。也正是这样简单的架构让我一直用到了现在，也催生了许许多多的主题的产生。几年以来我对我的博客主题修修补补，经历了多说倒闭到自己的评论系统的迁移等等。&lt;/p&gt;
&lt;p&gt;早期 Hexo 的包依赖有 node-gyp 等，我不是很清楚为什么会有这样的依赖，导致 CI 有时掉线，换个平台就炸了生成不了，每次执行 npm i 总是心惊肉跳的，近年 Node 生态渐渐稳定，也有了锁定版本等等，但旧版本的 Hexo 在新 Node.js 版本上好像没法运行，再去官网看的时候发现更新了很多大版本。结果最近的大版本好像把很多设置项给取消掉了，主题也没法调用了。就觉得 Hexo 也开始显得老态龙钟了。&lt;/p&gt;
&lt;p&gt;当然这只是一个导火索，长期以来前端环境不断发展，打包系统从 Gulp 到 Gulp 到 webpack 到 rollup 到 vite 等等等等，都是在补齐原生浏览器的包系统的不足和网络资源的最优化。然而 Hexo 对这些构建系统完全是没有支持的，那么在调试过程中就比较麻烦了，需要自己搭建构建系统后再开一个预览，但是 Hexo 的 markdown 就不是实时更新了。而且 Hexo 的 build 命令也不会帮助你去构建你的那些资源，也就其实相当于完全是两套。整体来说会变得相对麻烦，虽然理清楚了也还好。我也一直很想引入打包系统对整体的代码进行一个重构和前端代码压缩等等。但其实一想到要自己再搭个脚手架就完全没有了动力。&lt;/p&gt;
&lt;p&gt;当然我对整体设计其实也不是很满意的，反而到了现在这个年龄我更会在乎内容，如果内容吸引人，那么自然会去找作者的信息，而不需要主动去展示自己的信息。之前的那个主题还是有点过于 fancy 和二次元了。&lt;/p&gt;
&lt;p&gt;那么正好年初开始 Astro 开始流行了，于是便看了起来。&lt;/p&gt;
&lt;h1&gt;Astro&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; 也是一个静态网站生成器，但他与其说静态网站，其实也在服务器上运行，并有处理类似 cookie 这种和 db 交互的能力（SSR模式）。具体就不介绍了 &lt;s&gt;（我自己也会去摸透）&lt;/s&gt; 。&lt;/p&gt;
&lt;p&gt;谈一下 Astro 的优点，首先是卖点全新 Markdown 格式 MDX，Markdown里可以插组件，导入包等等。大概挺好用的吧，&lt;s&gt;我暂时没这个需求让我怎么评价&lt;/s&gt;，这个格式暂时观望吧，因为如果有其他框架，其他 CMS 支持的话，那我也许会使用，但我更倾向于在 layout 也就是主题上做文章，我觉得对张鑫旭这些写 sample 教学文章的大佬可能会有用，同样一个 component 可以直接展示出来。&lt;/p&gt;
&lt;p&gt;其次是框架混用，Astro 自己的 layout 里边可以使用你喜欢的框架比如 svelte，Vue，React等等，但内容本身都是在静态生成命令执行的时候产生的，所以传统的 onMount、useEffect 等等都不会如你所想的在客户端进行绑定事件监听。需要在调用框架组件的时候加入以 &lt;code&gt;client:&lt;/code&gt; 为首的 directive。但无论加入哪个指令，script中的内容将会完整的被打包系统吐出来最后写进脚本里，因此做多语言的时候你的语言 Map 有可能会被单独打包成一个chunk，有人可能会在乎，有人可能不会，而对于我来说，HTML中既然已经存在了这样的语言，是不是就不应该再写一遍进 JavaScript，那么我就会用 props 传进去之后，调用直接渲染模板，就不会被打包了。但这样进而会导致写法冗长，不利于代码的可读性，不过这也是仁者见仁，或者说是全看写代码的人如何协调了。&lt;/p&gt;
&lt;p&gt;以及还有一些小问题吧，比如我需要format时间，Astro 经过 parse 后给到我的时间是一个 UTC 时间，我理解 Astro 支持多时区，文章的DateTime可以有时区信息，但现有的文章全都是没有时区的，因此我必须把 Node.js 的时区也得默认改成 UTC，然而官方的推荐做法是根目录添加&lt;code&gt;.env&lt;/code&gt;使用 &lt;code&gt;import.meta.env&lt;/code&gt;，进而避免对 &lt;code&gt;process.env&lt;/code&gt; 的污染？但现有的框架比如 date-fns 都没有使用 import.meta.env 就导致了我还得手动去想在哪里安排设置这个环境变量。&lt;/p&gt;
&lt;p&gt;另外每个“框架组件”都会生成一个 chunk，即使我在 vite 中配置成合并一个，但仍然产生了 1kb 的 import chunk，这我就觉得很奇怪了，但也不知道该怎么去搜和提 issue。以及在 src 下的图片引入一定经过 processor，就算把 astro-compress 的图片选项关掉，也还是被进行了一次转换。我就觉得很不能忍受。&lt;/p&gt;
&lt;p&gt;我很有理由怀疑这些个问题我不但不会去找解决方案，可能直接就下次换新框架了🌚&lt;/p&gt;
&lt;p&gt;至于为啥不用 Hugo，兄弟，前端你必须得用最新的啊，不然这堆翔你都赶不上热的啊&lt;/p&gt;
&lt;h1&gt;Waline&lt;/h1&gt;
&lt;p&gt;评论的问题之前自己撸了一个实现，但打工人，没有什么时间去维护这些事情，而且当时没有加入包括验证码等防止刷评论的实现，以及把 home server 换掉之后，构建完成的前端 dist 我忘记移动到新的 server 了，又懒得去再从源代码上重新构建一下，于是那就找个现有的实现吧。&lt;/p&gt;
&lt;p&gt;现在 2024/05 的时间点上，self-hosted 的评论系统有 waline 、 twikoo 、 artalk 这三个，另外还有个利用 github 的 giscus，
首先我对评论借 github 这个行为不是很喜欢，总觉得有种错误使用方式的感觉因此排除，而且我曾经在数据库里的评论数据感觉也不是很好导入（花时间肯定可以）排除。几家的实现功能和实现方式和我当时构想的都差不多，那么剩下三个就是比较一下星星数和开发状态，issue 状态，有没有踩到自己不能忍受的雷点等等。&lt;/p&gt;
&lt;p&gt;最后还是选择了星星数和开发状态最活跃的 Waline。数据库用的 PostgreSQL，改了一下mySQL导出的语句三下五除二就复原了原来的数据并现在展示了出来。&lt;/p&gt;
&lt;h1&gt;余留课题&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Google Analytics &amp;amp; Google AD &lt;strong&gt;&lt;em&gt;能恰的话还是想恰口饭的嘛（谁不想呢）&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[x] photoswiper → fancybox &lt;strong&gt;&lt;em&gt;我靠 2024 年的 photoswiper 居然可定制化程度还没2014年的高？&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[ ] 分类显示不同语言的post &lt;strong&gt;&lt;em&gt;自己给自己挖了个大坑吧，routing 搞的自己头都大。。。&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[x] 代码片段支持复制 &lt;strong&gt;&lt;em&gt;真的很需要，但好像得写插件 / 纯 JS 添加&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[ ] waline 后台 post 重定向到各个博文正确的地址 &lt;strong&gt;&lt;em&gt;后台看评论但没法直接点到哪篇post的感觉很不爽&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shikijs/shiki/issues/3&quot;&gt;Astro &amp;amp; Shiki line number issue&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://stackoverflow.com/questions/74489844/astro-js-deployment-media-files-not-rendering&quot;&gt;.nojekyll&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>wireguard + v6 双栈环境下构建 Transmission PT 做种客户端</title><link>https://blog.xingoxu.com/2024/01/transmission-under-vpn/</link><guid isPermaLink="true">https://blog.xingoxu.com/2024/01/transmission-under-vpn/</guid><description># 背景

寻找技术上既能规避自家网络使用 BT 协议又能利用本地环境的大硬盘的解决方案

# 采用方案

Wireguard + Transmission

</description><pubDate>Sun, 21 Jan 2024 10:07:32 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;寻找技术上既能规避自家网络使用 BT 协议又能利用本地环境的大硬盘的解决方案&lt;/p&gt;
&lt;h1&gt;采用方案&lt;/h1&gt;
&lt;p&gt;Wireguard + Transmission&lt;/p&gt;

&lt;h2&gt;原因&lt;/h2&gt;
&lt;p&gt;以前一直使用 &lt;a href=&quot;https://github.com/haugene/docker-transmission-openvpn&quot;&gt;docker-transmission-openvpn&lt;/a&gt; 这个 repo 的 OpenVPN&lt;/p&gt;
&lt;p&gt;但是因为如下原因&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wireguard 配置简单、现代化&lt;/li&gt;
&lt;li&gt;想上 IPv6&lt;/li&gt;
&lt;li&gt;可以自己控制 Transmission 的自由化
决定更换方案&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;在 Docker 中安装 Transmission&lt;/h1&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://hub.docker.com/r/linuxserver/wireguard&quot;&gt;&lt;code&gt;linuxserver/wireguard&lt;/code&gt;&lt;/a&gt; 镜像启动 wireguard 并在镜像内安装 transmission&lt;/p&gt;
&lt;p&gt;注意查看 Docker 中配 IPv6 的方式，直接指定公网IPv6地址即可，如果外网无法 PING 通，宿主机上可以尝试安装 ndppd&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;2.4&apos;
services:
  transmission-wireguard:
    image: linuxserver/wireguard:1.0.20210914
    container_name: transmission-wireguard
    cap_add:
      - NET_ADMIN
    environment:
      - DOCKER_MODS=linuxserver/mods:universal-package-install
      - INSTALL_PACKAGES=dnsutils|traceroute|transmission|transmission-daemon|transmission-cli
      - USER=
      - PASS=
    volumes:
      - ./wireguard-config:/config
      - ./custom-cont-init.d:/custom-cont-init.d
    networks:
      - transmission
    ports:
      - 127.0.0.1:9091:9091

networks:
  transmission:
    enable_ipv6: true
    ipam:
      config:
        - subnet: 240f:10c:bcfb:1:4:1::/96
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;wg0.conf&lt;/code&gt; 中添加 PostUp / PreDown 脚本启动 Transmission&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Interface]
PrivateKey = PrivateKeyPrivateKeyPrivateKey
ListenPort = 54321
Address = 10.13.13.2/32, 2001:ipv6:public:address:1::2/128
# Cloudflare 1.1.1.1 DNS
DNS = 2606:4700:4700::1111, 1.1.1.1
PostUp = start.sh
PreDown = stop.sh

# server here
[Peer]
PublicKey = /pX3pc/Lwxc94O93sjKaAG/v0VJM5wkqr3HZxX6GD0Q=
PresharedKey = 5bQ18jyDGwtNyX37Iv6AiI9TDPo02oDzwMaIJM/SKgE=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = [2001:ipv6:public:address:1::1]:54321
PersistentKeepalive = 20
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;s6-setuidgid abc transmission-daemon -f &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Stopping transmission...&quot;
pid=$(pidof transmission-daemon)
if [ ! -z &quot;$USER&quot; ] &amp;amp;&amp;amp; [ ! -z &quot;$PASS&quot; ]; then
  transmission-remote -n &quot;$USER&quot;:&quot;$PASS&quot; --exit
else
  transmission-remote --exit
fi
# terminate when the transmission-daemon process dies
tail --pid=${pid} -f /dev/null
echo &quot;Transmission exited.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;问题 - 发现 PT 显示只有 IPv6 权限&lt;/h1&gt;
&lt;p&gt;启动做种之后在各大 PT 站发现自己只有 IPv6 权限，然而在容器内可以 ping 通 IPv4 地址（从延迟上来看也确实走了 VPN）&lt;/p&gt;
&lt;h1&gt;解决&lt;/h1&gt;
&lt;h2&gt;调整优先级让 IPv4 优先 IPv6&lt;/h2&gt;
&lt;p&gt;Google 中搜索过后大多数的解决方案是添加一行 &lt;code&gt;precedence ::ffff:0:0/96 100&lt;/code&gt; 到 &lt;code&gt;/etc/gai.conf&lt;/code&gt; 文件中&lt;/p&gt;
&lt;p&gt;这个方案我之前在宿主服务器上试过是有效果的，但在容器中尝试之后并没有起到有效作用，原因有可能是因为容器的网络顺序很有可能并不遵从文件，于是尝试在 &lt;code&gt;wg0.conf&lt;/code&gt; 中不分配 IPv6 地址后发现站点显示拥有 IPv4 权限，一度尝试放弃准备起两个容器一个走 v4 一个走 v6&lt;/p&gt;
&lt;h2&gt;屏蔽做种服务器的 IPv6 DNS 响应&lt;/h2&gt;
&lt;p&gt;再次更换搜索词为 “双栈 transmission” 后，出现了一些结果，发现写到&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;需要通过更改 host 或者调整系统前缀策略让 BT 客户端通过 v4 连接 tracker&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;设置双栈做种时，先在本机网络适配器中关闭IPV6协议，然后ping一下tracker服务器，得到一个IPV4地址，将这个IPV4地址和tracker服务器域名写进系统的hosts文件，再开启IPV6协议即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这才醒悟到根本原因很有可能是 transmission 汇报的ip地址为网卡地址，种子服务器接收后不认可私网IPv4地址，于是开始屏蔽汇报服务器的AAAA地址&lt;/p&gt;
&lt;p&gt;&lt;code&gt;custom-cont-init.d&lt;/code&gt; 下新建安装启动 bind9 脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

DEBIAN_FRONTEND=&quot;noninteractive&quot;
apt-get update
apt-get -o DPkg::Options::=--force-confdef install -y --no-install-recommends bind9 bind9-libs bind9-utils

named -c /etc/bind/named.conf
echo &quot;nameserver 127.0.0.1&quot; &amp;gt; /etc/resolv.conf

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;named.conf&lt;/code&gt; 挂载进容器喂给 bind9&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugin query &quot;/usr/lib/x86_64-linux-gnu/bind/filter-aaaa.so&quot; {
  filter-aaaa-on-v4 yes;
  filter-aaaa-on-v6 yes;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;容器挂载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ...前略
  volumes:
    - named.conf:/etc/bind/named.conf:ro
# ... 后略
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后正常拥有双栈权限&lt;/p&gt;
&lt;h1&gt;问题 - IPv6的传入链接有问题&lt;/h1&gt;
&lt;p&gt;发现交换客户端中永远没有 IPv6 地址后，遂尝试 ping IPv6地址，无果，traceroute 之后发现停留在 VPN 服务器上不到达 container&lt;/p&gt;
&lt;h1&gt;解决 VPN服务器上安装NDP发现服务&lt;/h1&gt;
&lt;p&gt;Ubuntu 上 &lt;code&gt;apt -y install ndppd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;创建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# eno0 is your NIC name like eth0 etc...
proxy eno0 {
  rule 2001:public:ipv6:address::/64 {
    static
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行 &lt;code&gt;service ndppd restart&lt;/code&gt; 就可以了。&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.lfalive.top/2021/06/17/PT/#%E5%8F%8C%E6%A0%88%E5%81%9A%E7%A7%8D&quot;&gt;双栈做种&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.v2ex.com/t/497336&quot;&gt;双栈环境挂 PT 需注意&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.nodeseek.com/post-9473-1&quot;&gt;关于IPv6的常识科普，以及VPS通过ndppd向母鸡广播小鸡内网IPv6邻居的方法教程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;回顾&lt;/h1&gt;
&lt;p&gt;其实搭建这个东西是 2021 年做的事情了，当时这个东西还挂在群晖上还解决了 wireguard 代理 IPv6 路由表的奇怪问题，但现在回想整个过程，其实是对网络部分，与操作系统这边的实现细节并不清楚才会走了很多弯路，回想发生过有很多类似的事情，不刨根问底就会有“感觉上对这个东西应该很熟悉每天都在打交道”但为什么最后会有偏差的问题&lt;/p&gt;
&lt;p&gt;另外整体一遍做过之后调试之后也对 IPv4 / IPv6 有了进一步的认识，对网络问题如何定位，查找也有了一些心得。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;终于可以把 2021 年的 Chrome Tab 给关上了呢&lt;/s&gt;&lt;/p&gt;
</content:encoded></item><item><title>Node.js 路径大小写的坑</title><link>https://blog.xingoxu.com/2020/07/macos-node-require-path-case-insensitive/</link><guid isPermaLink="true">https://blog.xingoxu.com/2020/07/macos-node-require-path-case-insensitive/</guid><description>大多数前端开发同学都用的是 macOS ，然而 macOS 上文件名不区分大小写，因此你不能在同一个文件夹下同时创建 `package.json` 和 `packagE.json`。

这个细节很小，因为大家不是英语母语，现在又越来越依靠 intelliSense 补全文件路径，在这个事情上翻跟头会比较少，就算翻了跟头也很容易忘记。

</description><pubDate>Wed, 01 Jul 2020 18:59:40 GMT</pubDate><content:encoded>&lt;p&gt;大多数前端开发同学都用的是 macOS ，然而 macOS 上文件名不区分大小写，因此你不能在同一个文件夹下同时创建 &lt;code&gt;package.json&lt;/code&gt; 和 &lt;code&gt;packagE.json&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个细节很小，因为大家不是英语母语，现在又越来越依靠 intelliSense 补全文件路径，在这个事情上翻跟头会比较少，就算翻了跟头也很容易忘记。&lt;/p&gt;

&lt;p&gt;大多数情况下你在这个上边会跌进的一个坑是&lt;/p&gt;
&lt;h1&gt;Linux 下部署时找不到 Module&lt;/h1&gt;
&lt;p&gt;也许是之前哪位高人用记事本写的代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const list = require(&apos;./List&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然鹅现实生活中你的 List 的文件名是&lt;code&gt;list.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;完了，你就得在你的代码库里把 List 统统改成 list&lt;/p&gt;
&lt;p&gt;所以这其实是个很小的问题也很容易解决就是浪费了一点时间。&lt;/p&gt;
&lt;p&gt;但我碰到一个浪费了我一个下午的问题，也促使我写了这篇其实没有什么技术含量的笔记&lt;/p&gt;
&lt;h1&gt;&lt;code&gt;require(&apos;./a.js&apos;) !== require(&apos;./A.js&apos;)&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;前因后果：&lt;/p&gt;
&lt;p&gt;在用 TypeORM 写增删改查的时候，新引进了一张表，于是挂上去调试。发现一直报找不到表的错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TypeORM EntityMetadataNotFound: No metadata for &quot;***&quot; was found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就是这个错。&lt;/p&gt;
&lt;p&gt;反反复复确认了表已经挂到了 option 下边。&lt;/p&gt;
&lt;p&gt;怎么办，只能进 node_modules 下边直接改源码调试了（&lt;/p&gt;
&lt;p&gt;进去 &lt;code&gt;console.log&lt;/code&gt; 三下五除二，发现表确实挂载了，然而&lt;/p&gt;
&lt;p&gt;https://github.com/typeorm/typeorm/blob/master/src/connection/Connection.ts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    /**
     * Gets entity metadata for the given entity class or schema name.
     */
    getMetadata(target: Function|EntitySchema&amp;lt;any&amp;gt;|string): EntityMetadata {
        const metadata = this.findMetadata(target);
        if (!metadata)
            throw new EntityMetadataNotFoundError(target);

        return metadata;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;    /**
     * Finds exist entity metadata by the given entity class, target name or table name.
     */
    protected findMetadata(target: Function|EntitySchema&amp;lt;any&amp;gt;|string): EntityMetadata|undefined {
        return this.entityMetadatas.find(metadata =&amp;gt; {
            console.log(metadata.target, target, metadata.target === target) // ←ここ
            if (metadata.target === target)
                return true;
            if (target instanceof EntitySchema) {
                return metadata.name === target.options.name;
            }
            if (typeof target === &quot;string&quot;) {
                if (target.indexOf(&quot;.&quot;) !== -1) {
                    return metadata.tablePath === target;
                } else {
                    return metadata.name === target || metadata.tableName === target;
                }
            }

            return false;
        });
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;左边右边都是 Function xxx，但是却不完全相等。&lt;/p&gt;
&lt;p&gt;于是我开始疯狂比较两边 import 的代码，最后才发现，import 的时候因为 Class 名和文件名一样，所以一个用的是 intelliSense 自动补全，一个是我复制粘贴的 Class 名，但是 Class 名是首字母大写的，但文件名不是。&lt;/p&gt;
&lt;p&gt;那么为什么同样的文件，引用的时候文件名不同，引用会不同呢？&lt;/p&gt;
&lt;p&gt;https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/loader.js#L936&lt;/p&gt;
&lt;p&gt;我们都知道 Node.js 的 require 只会引用一次，究其原因是因为 Node.js 会把模块缓存到内存里，以便快速重复调用。
我们在上边的源代码可以看到，Node.js 会使用 filename 进行缓存，而这里的 filename 是你 require 的文件名 + 绝对路径。&lt;/p&gt;
&lt;p&gt;因此 Node.js 会认为这是两个模块，就会重复 require 两次，但是如果是在 windows 下，filename 会被 path.resolve 给 toLowerCase 成一个模块，在 Linux 下，又会因为大小写敏感而找不到模块，也就是只会在 macOS 上出现的一个问题。&lt;/p&gt;
&lt;p&gt;所幸不是到部署才发现的问题，也所幸这个只会在调试的时候出现问题。。。。&lt;/p&gt;
</content:encoded></item><item><title>Node.js 依存モジュールのファイルはケースセンシティブの件</title><link>https://blog.xingoxu.com/ja/2020/07/macos-node-require-path-case-insensitive/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2020/07/macos-node-require-path-case-insensitive/</guid><description>皆さん開発の時ほとんど macOS を使ってるんでしょうか、だが macOS のファイル名はケースインセンシティブ（大小文字は区別しない）。つまり同じフォルダ下に `package.json` と `packagE.json` は一緒にいられない。

ほとんどの人は知ってるかにもかかわらず、あまりこれに注意を払ってないのではないかなと思って、だってみんなの母語は英語ではないし、インポートの際は intelliSense も結構賢く補足してもらってるので、あんまりここに転んだことはないと思います。転んでもすぐ忘れるんだろう。

</description><pubDate>Wed, 01 Jul 2020 18:59:40 GMT</pubDate><content:encoded>&lt;p&gt;皆さん開発の時ほとんど macOS を使ってるんでしょうか、だが macOS のファイル名はケースインセンシティブ（大小文字は区別しない）。つまり同じフォルダ下に &lt;code&gt;package.json&lt;/code&gt; と &lt;code&gt;packagE.json&lt;/code&gt; は一緒にいられない。&lt;/p&gt;
&lt;p&gt;ほとんどの人は知ってるかにもかかわらず、あまりこれに注意を払ってないのではないかなと思って、だってみんなの母語は英語ではないし、インポートの際は intelliSense も結構賢く補足してもらってるので、あんまりここに転んだことはないと思います。転んでもすぐ忘れるんだろう。&lt;/p&gt;

&lt;p&gt;よく会った問題はこれです👇&lt;/p&gt;
&lt;h1&gt;Linux でデプロイ時にモジュールは見つからない&lt;/h1&gt;
&lt;p&gt;多分誰がメモ帳で書いたコード&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const list = require(&apos;./List&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;でも List のファイル名は&lt;code&gt;list.js&lt;/code&gt;、&lt;/p&gt;
&lt;p&gt;そしたらすべての List を list に変えなきゃいけない。&lt;/p&gt;
&lt;p&gt;細かい点で解決には難しくないが、時間ちょっと無駄しましたね。&lt;/p&gt;
&lt;p&gt;でも今日話したいのは僕の午後をまるごと無駄しましてこの技術的な内容あまりない記事を書くことになったこれです👇&lt;/p&gt;
&lt;h1&gt;&lt;code&gt;require(&apos;./a.js&apos;) !== require(&apos;./A.js&apos;)&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;TypeORM を使ってる時新しいスキーマ（テーブル）を入れたが、デバッグの時ずーとそのスキーマが見つからないエラーに怒られて&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TypeORM EntityMetadataNotFound: No metadata for &quot;***&quot; was found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;option に何度も確認しまして確かにスキーマは入ってるが。&lt;/p&gt;
&lt;p&gt;どうしようと思って、 node_modules に入って直接ソースコードを改ざんしてデバッグすることになった。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;console.log&lt;/code&gt; でスキーマはたしかに入ってますが、&lt;/p&gt;
&lt;p&gt;https://github.com/typeorm/typeorm/blob/master/src/connection/Connection.ts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    /**
     * Gets entity metadata for the given entity class or schema name.
     */
    getMetadata(target: Function|EntitySchema&amp;lt;any&amp;gt;|string): EntityMetadata {
        const metadata = this.findMetadata(target);
        if (!metadata)
            throw new EntityMetadataNotFoundError(target);

        return metadata;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;    /**
     * Finds exist entity metadata by the given entity class, target name or table name.
     */
    protected findMetadata(target: Function|EntitySchema&amp;lt;any&amp;gt;|string): EntityMetadata|undefined {
        return this.entityMetadatas.find(metadata =&amp;gt; {
            console.log(metadata.target, target, metadata.target === target) // ←ここ
            if (metadata.target === target)
                return true;
            if (target instanceof EntitySchema) {
                return metadata.name === target.options.name;
            }
            if (typeof target === &quot;string&quot;) {
                if (target.indexOf(&quot;.&quot;) !== -1) {
                    return metadata.tablePath === target;
                } else {
                    return metadata.name === target || metadata.tableName === target;
                }
            }

            return false;
        });
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;左と右は同じく &lt;code&gt;Function xxx&lt;/code&gt; がリファレンスは同じではない。&lt;/p&gt;
&lt;p&gt;これは事件ですね。んでファイル両方の import を一行一行で確認して、最終的に import のパスに問題を見つかった。
自分がインポートした際に、一つは Class 名をそのままコピペしたが、もう一つはファイル名でしたが、Class 名は PascalCase が、ファイル名は camelCase でした。&lt;/p&gt;
&lt;p&gt;そしたらなぜ同じファイルで使う時ファイル名が違ったらリファレンスは違うになりますか？&lt;/p&gt;
&lt;p&gt;Node.js のソースコードに見てきました。
https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/loader.js#L936&lt;/p&gt;
&lt;p&gt;Node.js の require は一回しか実行しない、その原因は Node.js はモジュールをメモリに保存して、その後コードの中で require したらすぐ使えるという意図で設計されました。
ソースコードからも見えて、Node.js はファイル名でキャッシュしますが、ここの filename は require のファイル名 + 絶対パス。&lt;/p&gt;
&lt;p&gt;なので Node.js は２つモジュールとみなすが、windows だと、 filename は path.resolve で toLowerCase で同じファイル名にするが、Linux だとケースセンシティブでモジュール見つからないで弾かれますが、この問題は macOS しか出ませんね。&lt;/p&gt;
&lt;p&gt;ま、デプロイまで問題出るよりラッキーですね。&lt;/p&gt;
</content:encoded></item><item><title>什么是 CLS？在浏览器和 Node.js 中实现 CLS</title><link>https://blog.xingoxu.com/2020/06/cls/</link><guid isPermaLink="true">https://blog.xingoxu.com/2020/06/cls/</guid><description>在写 Flutter 和 Serverless 查资料的时候，在某个博客里看到了 CLS 的相关内容，感觉其实是个很不错的软件工程的解耦想法，于是保存了下来。今天回过头来仔细研究了一下并决定给自己留下一些记录。

</description><pubDate>Mon, 29 Jun 2020 19:48:05 GMT</pubDate><content:encoded>&lt;p&gt;在写 Flutter 和 Serverless 查资料的时候，在某个博客里看到了 CLS 的相关内容，感觉其实是个很不错的软件工程的解耦想法，于是保存了下来。今天回过头来仔细研究了一下并决定给自己留下一些记录。&lt;/p&gt;

&lt;h1&gt;场景&lt;/h1&gt;
&lt;p&gt;无论是在浏览器，还是在服务端 Node.js，我们经常会碰到打点上报，追踪错误这样的需求，即使不对特定用户进行追踪，我们也会给某个 session 分配唯一 ID 以在 log / analytics 界面能够看到用户的完整行为，对于产品分析与错误再现是十分重要的。&lt;/p&gt;
&lt;p&gt;假设我们需要写一个 error handling ，这个 error handling 会 hold 住所有的请求的异常，我们如何分辨哪个错误是哪个请求造成的呢？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;log.error(&quot;Error occured&quot;, req);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么这个 error handling 就跟 req 耦合了&lt;/p&gt;
&lt;p&gt;假设我们需要追踪某个错误，是哪个 user 产生的，又或者是哪个错误，user 干了什么导致的？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;log.info(&quot;User has done xxx&quot;, user);
log.error(&quot;Error occured by&quot;, user);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是跟 user 也深深的耦合了。&lt;/p&gt;
&lt;p&gt;单单这样的例子好像没有什么大问题，不过多两个参数嘛。但写过大型应用的同学，后期不断增加功能的时候，你一定写过那种长长的参数列表的函数，又或者是好几百行的一个函数，实在是太不优雅，重构起来也太难。&lt;/p&gt;
&lt;h1&gt;尝试解决&lt;/h1&gt;
&lt;p&gt;函数如果是同步的，那么我们可以直接挂到全局变量（某个对象）下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const global = {};
$(&quot;button&quot;).click((event) =&amp;gt; {
  global.event = event;
  log(&quot;button clicked&quot;);
});

function log(...args) {
  console.log(global.event, ...args); // { x: xxx, y: xxx, target: xxx } &apos;button clicked&apos;
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显然这在异步中行不通&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const global = {};
$(&quot;button&quot;).click((event) =&amp;gt; {
  global.event = event;
  setTimeout(() =&amp;gt; {
    log(&quot;button clicked&quot;);
  }, 1000);
});

function log(...args) {
  console.log(global.event, ...args);
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你会发现打印的 global.event 全变成了同一个对象&lt;/p&gt;
&lt;p&gt;我们需要能够从始至终在同一个异步调用链中一个持续化的存储，
又或者是我们需要能够辨识当前的异步函数他的唯一辨识符，以和同样内容的异步函数但并不是本身的运行的这个作区分。&lt;/p&gt;
&lt;h1&gt;CLS 登场&lt;/h1&gt;
&lt;p&gt;在其他语言中，有一个叫做 &lt;a href=&quot;https://en.wikipedia.org/wiki/Thread-local_storage&quot;&gt;Thread-local storage&lt;/a&gt; 的东西，然而在 Javascript 中，并不存在多线程这种概念（相对而言，Web Worker 等与主进程并不冲突），于是 CLS ，Continuation-local Storage，一个类似于 TLS，得名于函数式编程中的 Continuation-passing style，旨在链式函数调用过程中维护一个持久的数据。&lt;/p&gt;
&lt;h2&gt;浏览器的解决方案 Zone.js&lt;/h2&gt;
&lt;p&gt;先看看是怎么解决的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&apos;button&apos;).click(event =&amp;gt; {
  Zone.current.fork({
    name: &apos;clickZone&apos;,
    properties: {
      event
    }
  }).run(
    setTimeout(() =&amp;gt; {
      log(&apos;button clicked&apos;);
    }, 1000);
  );
});

function log(...args) {
  console.log(global.event, ...args);
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/angular/angular/tree/master/packages/zone.js&quot;&gt;&lt;code&gt;Zone.js&lt;/code&gt;&lt;/a&gt; 是 Angular 2.0 引入的，当然它的功能不只是提供 CLS，他还有其他相关 API。&lt;/p&gt;
&lt;h3&gt;一个并不完美的解决方案&lt;/h3&gt;
&lt;p&gt;我们试着思考一下， &lt;code&gt;Zone.js&lt;/code&gt; 是如何做到这些的。如果浏览器没有提供异步函数运行环境的唯一标识，那么只剩下唯一的一条路，改写所有会产生异步的函数，包装了一层后也就能加入hook了。&lt;/p&gt;
&lt;p&gt;我尝试自己写了一下&lt;/p&gt;


&lt;p&gt;看似好像没什么问题，不过&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/angular/angular/issues/31730&quot;&gt;angular with tsconfig target ES2017 async/await will not work with zone.js&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;浏览器中现在并没有完美的解决方案&lt;/h4&gt;
&lt;p&gt;我们可以做个实验，在 console 里敲下如下代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const _promise = Promise;
Promise = function () { console.log(&apos;rewrite by ourselves&apos;) };
new Promise(() =&amp;gt; {}) instanceof Promise
// rewrite by ourselves
// true

async function test() {}
test() instanceof Promise
// false
test() instanceof _promise
// true

async function test() { return new Promise() }

test() instanceof Promise
// rewrite by ourselves
// false
test() instanceof _promise
// rewrite by ourselves
// true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说浏览器会把 async 函数的返回值用原生 Promise 包装一层，因为是原生语法，也就无法 hook async 函数。
当然我们可以用 transpiler 把 async 函数改写成 generator 或者 Promise，不过这并不代表是完美的。&lt;/p&gt;
&lt;h2&gt;Node.js 的解决方案 async_hooks&lt;/h2&gt;
&lt;p&gt;Node.js 8后出现的 &lt;code&gt;async_hook&lt;/code&gt; 模块，到了版本14仍然没有移去他身上的 &lt;code&gt;Experimental&lt;/code&gt; 状态。以及在刚出现的时候是有性能问题的讨论（3年后的今天虽然不知道性能怎么样，不过既然没有移去 &lt;code&gt;Experimental&lt;/code&gt; 的标签，如果追求高性能的话还是应该保持观望）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;虽然没有移去 Experimental 的状态，但是稳定性应该没有什么太大问题，大量的 Node.js 的追踪库 / APM 依赖着 async_hooks 模块，如果有重大问题，应该会及时上报并修复&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于性能问题，不展开篇幅讨论，取决于你是否愿意花一点点的性能下降来换取代码的低耦合。&lt;/p&gt;
&lt;h3&gt;如何使用&lt;/h3&gt;
&lt;p&gt;async_hooks 提供了一个 createHook 的函数，他可以帮助你监听异步函数的运行时创建以及退出等状态，并且附带了这个运行时的唯一辨识id，我们可以简单地用它来创建一个 CLS。&lt;/p&gt;


&lt;h3&gt;Node.js 13 后的官方实现&lt;/h3&gt;
&lt;p&gt;在社区中已经有了那么多优秀实现的前提下，Node.js 13.10 后新增了一个 &lt;code&gt;AsyncLocalStorage&lt;/code&gt; 的 API&lt;/p&gt;
&lt;p&gt;https://nodejs.org/api/async_hooks.html#async_hooks_class_asynclocalstorage&lt;/p&gt;
&lt;p&gt;实际上他已经是开箱可用的 CLS 了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const {
  AsyncLocalStorage,
} = require(&quot;async_hooks&quot;);

const express = require(&quot;express&quot;);
const app = express();

const session = new AsyncLocalStorage();

app.use((_req, _res, next) =&amp;gt; {
  let userId = Math.random() * 1000;
  console.log(userId);
  session.enterWith({ userId });
  setTimeout(() =&amp;gt; {
    next();
  }, userId);
});

app.use((_req, res, next) =&amp;gt; {
  const { userId } = session.getStore();
  res.json({ userId });
});

app.listen(3000, () =&amp;gt; {
  console.log(&quot;Listen 3000&quot;);
});


const fetch = require(&apos;node-fetch&apos;)

new Array(10).fill(0).forEach((_, i) =&amp;gt; fetch(&apos;http://localhost:3000/test&apos;, {
  method: &apos;GET&apos;,
}).then(res =&amp;gt; res.json()).then(console.log))

// Output:
// Listen 3000
// 355.9573987560112
// 548.3773445851497
// 716.2437886469793
// 109.84756385607896
// 907.6261832949347
// 308.34659685842513
// 407.0145853469649
// 525.820449114568
// 76.91502437038133
// 997.8611964598299
// { userId: 76.91502437038133 }
// { userId: 109.84756385607896 }
// { userId: 308.34659685842513 }
// { userId: 355.9573987560112 }
// { userId: 407.0145853469649 }
// { userId: 525.820449114568 }
// { userId: 548.3773445851497 }
// { userId: 716.2437886469793 }
// { userId: 907.6261832949347 }
// { userId: 997.8611964598299 }
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.im/post/5e23f89f6fb9a02fcf18e24a&quot;&gt;Javascript与CLS（Continuation-local Storage）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/50835920&quot;&gt;翻阅源码后，我终于理解了Zone.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shanyue.tech/node/cls.html#async-hooks&quot;&gt;使用 async_hooks 监听异步资源的生命周期&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.xizhibei.me/2018/04/07/distributed-tracing/&quot;&gt;分布式追踪&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>CLS とは？ブラウザとNode.jsで CLS を実装してみます</title><link>https://blog.xingoxu.com/ja/2020/06/cls/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2020/06/cls/</guid><description>資料を調べる際に、CLS の存在を知りました。エンジニアリングで結構いいデカップリングのやり方と感じまして、シェアしたいと思います。

</description><pubDate>Mon, 29 Jun 2020 19:48:05 GMT</pubDate><content:encoded>&lt;p&gt;資料を調べる際に、CLS の存在を知りました。エンジニアリングで結構いいデカップリングのやり方と感じまして、シェアしたいと思います。&lt;/p&gt;

&lt;h1&gt;シチュエーション&lt;/h1&gt;
&lt;p&gt;ブラウザか、サーバーのNode.jsか、どっちでもエラーハンドリング、ユーザートラッキングのニーズは日常茶飯事。例えユーザーを特定しなくても、id をつけて、ユーザーの行為を追跡して、エラーの再現にも重要し、プロダクトの改善にも役たちます。&lt;/p&gt;
&lt;p&gt;仮に今エラーハンドリングを書こうと思って、このエラーハンドリングはすべてのエラーを処理しますが、どのリクエストから生み出したエラーを知りたいと&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;log.error(&quot;Error occured&quot;, req);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このハンドリングは req と結合しちゃった&lt;/p&gt;
&lt;p&gt;仮に今このエラーどのユーザーから出たエラー、ユーザーが何をやったかを知りたいと&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;log.info(&quot;User has done xxx&quot;, user);
log.error(&quot;Error occured by&quot;, user);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ユーザーとも結合しちゃった&lt;/p&gt;
&lt;p&gt;この２つの例は一見するとそんなに大きいな問題ではなさそう、ただ２つのパラメータが増えただけじゃ。
だけど、大型サービスを作る時、どんどん増えた機能に対して、関数の引数と関数の長さと共にどんどん伸びちゃって気持ち悪くてリファクタリングしようとしょうもないこと、少なくありませんでしょうか？&lt;/p&gt;
&lt;h1&gt;解決してみよう&lt;/h1&gt;
&lt;p&gt;関数が同期のであれば、グローバルで変数につけたらいいじゃんー&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const global = {};
$(&quot;button&quot;).click((event) =&amp;gt; {
  global.event = event;
  log(&quot;button clicked&quot;);
});

function log(...args) {
  console.log(global.event, ...args); // { x: xxx, y: xxx, target: xxx } &apos;button clicked&apos;
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;だが、非同期関数のであれば&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const global = {};
$(&quot;button&quot;).click((event) =&amp;gt; {
  global.event = event;
  setTimeout(() =&amp;gt; {
    log(&quot;button clicked&quot;);
  }, 1000);
});

function log(...args) {
  console.log(global.event, ...args);
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;すべての global.event は同じイベントになちゃった(´；ω；｀)！それはだめですね。&lt;/p&gt;
&lt;p&gt;我々必要なのは非同期呼び出しチェーンに最初から最後まで持続的なストレージ、
もしくは今走ってる非同期関数の呼び出しの唯一の識別子。&lt;/p&gt;
&lt;h1&gt;CLS が登場&lt;/h1&gt;
&lt;p&gt;他の言語では、&lt;a href=&quot;https://en.wikipedia.org/wiki/Thread-local_storage&quot;&gt;Thread-local storage&lt;/a&gt;と呼ばれるものがあります。が JavaScript はマルチスレッドはありません（Web Workerなどはメインと関係ないし、自分でもマルチスレッドしない）。CLS という名前は TLS みたいに関数型プログラミングからの Continuation-passing style 名前をもらって、Continuation-local Storage、そのチェインの呼び出しの中で持続的データストレージをメンテナンスする。&lt;/p&gt;
&lt;h2&gt;ブラウザの解決 Zone.js&lt;/h2&gt;
&lt;p&gt;どうのように解決したかちょっと見てみましょう&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&apos;button&apos;).click(event =&amp;gt; {
  Zone.current.fork({
    name: &apos;clickZone&apos;,
    properties: {
      event
    }
  }).run(
    setTimeout(() =&amp;gt; {
      log(&apos;button clicked&apos;);
    }, 1000);
  );
});

function log(...args) {
  console.log(global.event, ...args);
  // other logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/angular/angular/tree/master/packages/zone.js&quot;&gt;&lt;code&gt;Zone.js&lt;/code&gt;&lt;/a&gt; は Angular 2.0 から誕生したもので、もちろん他の機能も持ってる。&lt;/p&gt;
&lt;h3&gt;この方法は残念なところがあります&lt;/h3&gt;
&lt;p&gt;考えてみましょう、 &lt;code&gt;Zone.js&lt;/code&gt; はどうやってこれを実現しました。ブラウザは呼び出しに対して唯一の識別子を提供するAPIがなければ、すべての非同期関数をリライトしかできなく、そうすれば非同期が入る時と出る時 hook できて、この効果が実装できますね。&lt;/p&gt;
&lt;p&gt;自分も書いてみました。&lt;/p&gt;


&lt;p&gt;また問題なさそうだけど、&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/angular/angular/issues/31730&quot;&gt;angular with tsconfig target ES2017 async/await will not work with zone.js&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;ブラウザ今では完璧の解決方法はありません&lt;/h4&gt;
&lt;p&gt;実験をやってみましょう、console で下のコードを打ったら、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const _promise = Promise;
Promise = function () { console.log(&apos;rewrite by ourselves&apos;) };
new Promise(() =&amp;gt; {}) instanceof Promise
// rewrite by ourselves
// true

async function test() {}
test() instanceof Promise
// false
test() instanceof _promise
// true

async function test() { return new Promise() }

test() instanceof Promise
// rewrite by ourselves
// false
test() instanceof _promise
// rewrite by ourselves
// true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ブラウザは、async 関数のリターンをネイティブの Promise で再ラッピングします。ネイティブ文法なので、async 関数はリライトできない。
もちろん transpiler で async 関数を generator もしくは Promise にすることは可能ですが、完璧とは言わないでしょう。&lt;/p&gt;
&lt;h2&gt;Node.js の解決 &lt;code&gt;async_hooks&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Node.js バージョン 8 以降出た &lt;code&gt;async_hook&lt;/code&gt; モジュール、バージョン 14 の今でも &lt;code&gt;Experimental&lt;/code&gt; ステータスから脱却してない。出たごろ性能に関しての議論もあったが、今はどうなってるかまだわからない状態ですが&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Experimental ステータスにしても安定性としては問題なさそう、大量な Node.js のトラッキング / APM が依存していて、問題があったら issue が立てられるはずです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;性能に関する問題はここは展開しない、コードの低結合と少しパフォーマンスの低下を交換するかしないかによりますね。&lt;/p&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;async_hooks&lt;/code&gt; は &lt;code&gt;createHook&lt;/code&gt; という関数を提供した、これが非同期関数のライフサイクルに hook できます、しかも唯一識別子も提供してくれますので、CLS を簡単に作れます。&lt;/p&gt;


&lt;h3&gt;Node.js バージョン 13 からオフィシャルの実装も&lt;/h3&gt;
&lt;p&gt;コミュニティの中でたくさんの CLS ライブラリーがあった上に、Node.js 13.10 から &lt;code&gt;AsyncLocalStorage&lt;/code&gt; の API がありました。&lt;/p&gt;
&lt;p&gt;https://nodejs.org/api/async_hooks.html#async_hooks_class_asynclocalstorage&lt;/p&gt;
&lt;p&gt;実はこれはすでにすぐに使える CLS です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const {
  AsyncLocalStorage,
} = require(&quot;async_hooks&quot;);

const express = require(&quot;express&quot;);
const app = express();

const session = new AsyncLocalStorage();

app.use((_req, _res, next) =&amp;gt; {
  let userId = Math.random() * 1000;
  console.log(userId);
  session.enterWith({ userId });
  setTimeout(() =&amp;gt; {
    next();
  }, userId);
});

app.use((_req, res, next) =&amp;gt; {
  const { userId } = session.getStore();
  res.json({ userId });
});

app.listen(3000, () =&amp;gt; {
  console.log(&quot;Listen 3000&quot;);
});


const fetch = require(&apos;node-fetch&apos;)

new Array(10).fill(0).forEach((_, i) =&amp;gt; fetch(&apos;http://localhost:3000/test&apos;, {
  method: &apos;GET&apos;,
}).then(res =&amp;gt; res.json()).then(console.log))

// Output:
// Listen 3000
// 355.9573987560112
// 548.3773445851497
// 716.2437886469793
// 109.84756385607896
// 907.6261832949347
// 308.34659685842513
// 407.0145853469649
// 525.820449114568
// 76.91502437038133
// 997.8611964598299
// { userId: 76.91502437038133 }
// { userId: 109.84756385607896 }
// { userId: 308.34659685842513 }
// { userId: 355.9573987560112 }
// { userId: 407.0145853469649 }
// { userId: 525.820449114568 }
// { userId: 548.3773445851497 }
// { userId: 716.2437886469793 }
// { userId: 907.6261832949347 }
// { userId: 997.8611964598299 }
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;参照&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.im/post/5e23f89f6fb9a02fcf18e24a&quot;&gt;Javascript与CLS（Continuation-local Storage）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/50835920&quot;&gt;翻阅源码后，我终于理解了Zone.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shanyue.tech/node/cls.html#async-hooks&quot;&gt;使用 async_hooks 监听异步资源的生命周期&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.xizhibei.me/2018/04/07/distributed-tracing/&quot;&gt;分布式追踪&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>用最热的Serverless，以最快的速度，写最野的JavaScript</title><link>https://blog.xingoxu.com/2020/06/try-serverless/</link><guid isPermaLink="true">https://blog.xingoxu.com/2020/06/try-serverless/</guid><description>Serverless，云原生，年初到现在，我关注的好几个前端公众号和资讯号都在疯狂推这些东西，去年年底就早有耳闻，原来以为是各种活动大会组织联合云厂商在对 devops 卖票整的新技术，但热度越来越强，于是我也跃跃欲试蹭个热度

</description><pubDate>Sun, 21 Jun 2020 15:52:35 GMT</pubDate><content:encoded>&lt;p&gt;Serverless，云原生，年初到现在，我关注的好几个前端公众号和资讯号都在疯狂推这些东西，去年年底就早有耳闻，原来以为是各种活动大会组织联合云厂商在对 devops 卖票整的新技术，但热度越来越强，于是我也跃跃欲试蹭个热度&lt;/p&gt;

&lt;h1&gt;Serverless 到底是什么¿&lt;/h1&gt;
&lt;p&gt;一句话概括就是 Cloud Function + Object Storage + Cloud Database + API Gateway and more by Cloud Service Provider. 简单来说就是有个叫 serverless 的开源框架把云厂商提供的这些服务整合成了一个配置文件，后端运维统统都不要了。好处显而易见，服务弹性伸缩，价格按量收费，大多数的运维问题，你的云服务提供商统统帮你兜了，小学生也能写网站。&lt;/p&gt;
&lt;p&gt;这么牛逼，前端可得好好学学，让后端和运维统统下岗咯？&lt;/p&gt;
&lt;h1&gt;Serverless、启动！&lt;/h1&gt;
&lt;p&gt;既然 Serverless 图的就是快，那我们自然是不能自己手动一个一个的去到云服务商那里去手动设置的咯。
当然你也可以这么做，只不过我的服务今天就上线，你的服务可能就要等到后天了。&lt;/p&gt;
&lt;p&gt;Github 星星 3万个，1000万下载的 serverless npm package，&lt;code&gt;npm install -g serverless&lt;/code&gt;，下载！启动！&lt;/p&gt;
&lt;p&gt;任意位置，terminal 输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ serverless
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;友好向导一步一步带你迈向 serverless 美好&lt;s&gt;大坑&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;进入你刚创建的项目，敲下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sls deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;点击屏幕给出的连接！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello World!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;牛逼！我们的后端服务器已经搭好了！太简单了吧！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;国内用户 serverless 自动使用腾讯云
以上内容其实在 https://www.serverless.com/framework/docs/providers/aws/examples/hello-world/node/ 都有&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;套个模板，快上加快&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下内容使用 aws 进行操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天我打算做一个信用卡外汇比价工具，三步搞定：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;抓取汇率&lt;/li&gt;
&lt;li&gt;保存当天汇率（云函数没有状态）&lt;/li&gt;
&lt;li&gt;前端计算比价&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;非常适合 serverless 的初学应用&lt;/p&gt;
&lt;p&gt;代码已经开源并上线，欢迎大家边看边 review&lt;/p&gt;
&lt;p&gt;成品地址：https://whichcard.xingoxu.com/
代码地址：https://github.com/xingoxu/whichcard-abroad&lt;/p&gt;
&lt;p&gt;serverless 这个框架，还能使用 template 来创建项目，既然图的就是快，找一个现成的模板套进去，填一填就上线是不是更美滋滋&lt;/p&gt;
&lt;p&gt;技术栈，就选 nuxt.js，开启 SSR，再加上可编程使用，妙啊&lt;/p&gt;
&lt;p&gt;搜一搜&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;serverless create --template-url https://github.com/tonyfromundefined/nuxt-serverless -n whichcard-abroad
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建项目后，我们编辑一下 &lt;code&gt;serverless.yml&lt;/code&gt;，加上非关系型数据库相关配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;resources:
  Resources:
    CurrencyTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${env:DYANMODB_TABLE}
        AttributeDefinitions:
          - AttributeName: ${env:DYANMODB_PRIMARY_KEY}
            AttributeType: S
        KeySchema:
          - AttributeName: ${env:DYANMODB_PRIMARY_KEY}
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数据库需要配置权限，要给运行 lambda function 的用户，也就是第一次使用 serverless 的时候让你发行的那个key所代表的用户，给他权限，那，同样在 &lt;code&gt;serverless.yml&lt;/code&gt; 下加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;provider:
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: &quot;arn:aws:dynamodb:${self:provider.region}:*:table/${env:DYANMODB_TABLE}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好了，我们服务器已经配置完了，开始编写后端&lt;/p&gt;
&lt;p&gt;刚才用的这个模板，大多数已经搭建好了，只不过后端这里没有 typescript 支持&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/tsconfig.json&quot;&gt;&lt;code&gt;tsconfig.json&lt;/code&gt;&lt;/a&gt; 复制一份，重命名 &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/tsconfig-server.json&quot;&gt;&lt;code&gt;tsconfig-server.json&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;配置我就不粘过来了，大家可以自己参考上边连接。&lt;/p&gt;
&lt;p&gt;用了 typescript 之后，我得把他变成 js 后才能被 lambda function 给读取，在 &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/webpack.config.js&quot;&gt;&lt;code&gt;webpack.config.js&lt;/code&gt;&lt;/a&gt;加上 &lt;code&gt;ts-loader&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;抓取汇率&lt;/h2&gt;
&lt;p&gt;我们以 &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/api/functions/visa.ts&quot;&gt;VISA&lt;/a&gt; 为例，他的汇率当天公布在 &lt;a href=&quot;https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html&quot;&gt;这个网页&lt;/a&gt; 上&lt;/p&gt;
&lt;p&gt;我们导入 &lt;code&gt;axios&lt;/code&gt;，导入&lt;code&gt;cheerio&lt;/code&gt;，三下五除二，jQuery一把梭，轻松加愉快，摸出了他的汇率&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import axios from &apos;axios&apos;;
import cheerio from &apos;cheerio&apos;;
import { format } from &apos;date-fns&apos;;

const getVisaCurrency = async ({
  transCurr = &quot;USD&quot;,
  billCurr = &quot;JPY&quot;,
  date
}) =&amp;gt; {
  const { data: htmlBody } = await axios.get&amp;lt;
    string
  &amp;gt;(
    `https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html`,
    {
      params: {
        amount: 1,
        fee: &apos;0.0&apos;,
        utcConvertedDate: &apos;&apos;,
        exchangedate: format(
          date,
          &apos;MM/dd/yyyy&apos;
        ),
        fromCurr: billCurr,
        toCurr: transCurr,
        submitButton:
          &apos;Calculate exchange rate&apos;
      }
    }
  );
  const $ = cheerio.load(htmlBody);
  const $targetDOM = $(
    &apos;.converted-amount-value&apos;
  );
  const result = $targetDOM
    .eq($targetDOM.length - 2)
    .text()
    .match(/^\d+\.\d+/)![0];

  return result;
};

export { getVisaCurrency };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;40行的代码我们就解决了战斗&lt;/p&gt;
&lt;h2&gt;保存当天汇率&lt;/h2&gt;
&lt;p&gt;既然按需付费，那么空闲的时候云厂商势必不可能给你资源，因此云函数是无状态这点其实还是比较 make sense 的&lt;/p&gt;
&lt;p&gt;虽然我们可以对每个请求都实时抓取一次汇率，但是这显然也太影响打开速度、用户体验了吧。&lt;/p&gt;
&lt;p&gt;而且如果被上游发现，对方直接把 aws 一整段 ip 给封了的事情也不是没有&lt;/p&gt;
&lt;p&gt;即使是抓取公开数据这种事情，还是静悄悄搞比较好。&lt;/p&gt;
&lt;p&gt;直接导入 &lt;code&gt;aws-sdk&lt;/code&gt;，草草几行代码就能写好保存工具函数和查询工具函数&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/api/utils/database.ts&quot;&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { DynamoDB } from &apos;aws-sdk&apos;;
import { format } from &apos;date-fns&apos;;

const DATE_FORMAT = &apos;yyyy-MM-dd&apos;;
const DYANMODB_TABLE: string = &quot;currencyTable&quot;;
const DYANMODB_PRIMARY_KEY: string = &quot;currency&quot;;

const dynamoDBClient = new DynamoDB({
  region: process.env.DYANMODB_REGION
});

const queryFromCache = async (
  date: Date
): Promise&amp;lt;DBCurrencyObject | undefined&amp;gt; =&amp;gt; {
  const {
    Count,
    Items
  } = await dynamoDBClient
    .query({
      TableName: DYANMODB_TABLE,
      KeyConditionExpression: `#key=:dt`,
      ExpressionAttributeNames: {
        &apos;#key&apos;: DYANMODB_PRIMARY_KEY
      },
      ExpressionAttributeValues: {
        &apos;:dt&apos;: {
          S: format(date, DATE_FORMAT)
        }
      }
    })
    .promise();
  if (Count &amp;amp;&amp;amp; Count == 1)
    return DyanmodbResultAdapter(
      Items![0]
    ) as DBCurrencyObject;
  return undefined;
};

const storeResult = async ({
  date,
  result,
  billCurr,
  transCurr,
  brand
}): Promise&amp;lt;void&amp;gt; =&amp;gt; {
  let cacheResult = await queryFromCache(
    date
  );
  if (!cacheResult)
    cacheResult = {
      date: format(date, DATE_FORMAT)
    };
  if (!cacheResult[brand])
    cacheResult[brand] = {};
  if (!cacheResult[brand]![transCurr])
    cacheResult[brand]![transCurr] = {};

  cacheResult[brand]![transCurr]![
    billCurr
  ] = result;

  await dynamoDBClient
    .updateItem({
      Key: {
        [DYANMODB_PRIMARY_KEY]: {
          S: format(date, DATE_FORMAT)
        }
      },
      TableName: DYANMODB_TABLE,
      UpdateExpression: `set ${brand}=:${brand}`,
      ExpressionAttributeValues: {
        [`:${brand}`]: {
          M: DyanmodbRequestAdapter(
            cacheResult[brand]!
          )
        }
      }
    })
    .promise();
};

export { queryFromCache, storeResult };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DyanmodbRequestAdapter&lt;/code&gt;和&lt;code&gt;DyanmodbResultAdapter&lt;/code&gt;是为了解决 dyanmodb 存储的时候符合他的sdk的递归的key（加上类型），另外在这里篇幅过长略去了一些类型定义，大家可以在源代码里查看&lt;/p&gt;
&lt;p&gt;同时，我们不要忘记，数据在抓取/存储的过程中都有可能发生新请求，因此我们再写一个工具类把刚才的抓取函数包装一下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export function asyncOnce&amp;lt;
  T extends (...args: any) =&amp;gt; Promise&amp;lt;any&amp;gt;
&amp;gt;(
  func: (
    ...args: Parameters&amp;lt;T&amp;gt;
  ) =&amp;gt; ReturnType&amp;lt;T&amp;gt;
) {
  let running: ReturnType&amp;lt;
    typeof func
  &amp;gt; | null = null;
  return (
    ...args: Parameters&amp;lt;typeof func&amp;gt;
  ) =&amp;gt; {
    if (running === null) {
      running = func(...args);
      running.finally(() =&amp;gt; {
        running = null;
      });
    }
    return running;
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;前端计算比价&lt;/h2&gt;
&lt;p&gt;其实我们这个网站，如果没有关于帮助页面的话，就是只有一个页面的网站了。因此其实没有必要暴露 API，不过我这次为了尝试一下Nuxt.js的Programming Usage，那前端和后端就可以非常巧妙的结合在一起&lt;/p&gt;
&lt;p&gt;我们直接在 SFC 中 import 进我们刚才写好的抓取函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { response } from &apos;@/api/functions/currency&apos;;

export default {
  async asyncData(context) {
    let currencyData;
    if (process.server &amp;amp;&amp;amp; context) {
      currencyData = await response(
        context.req
      );
    } else {
      const data = await axios.$get(
        &apos;/currency&apos;,
        {
          params: { ...someParams }
        }
      );

      currencyData = data;
    }
    return { currencyData }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样的话，就算是 SSR，也不需要自己向自己发送一个 &lt;code&gt;/currency&lt;/code&gt; 的请求。&lt;/p&gt;
&lt;p&gt;如果我们没有其他页面，那么 &lt;code&gt;/currency&lt;/code&gt; 的API也不用暴露，相当于把 Nuxt.js 当成了模板引擎！&lt;/p&gt;
&lt;p&gt;写过 Express.js 等的小伙伴很清楚，一般是先生成数据，然后渲染模板，但是在这里，我们的重点是先写好前端后，导入 server 的函数，把请求丢过去拿数据。&lt;/p&gt;
&lt;p&gt;是不是很野！（此处应该有惊叹声（哇哦好野））&lt;/p&gt;
&lt;p&gt;剩下的写界面啊，写排序啊什么的就略过。&lt;/p&gt;
&lt;h1&gt;解决一些小问题&lt;/h1&gt;
&lt;h2&gt;记得开启 extractCSS&lt;/h2&gt;
&lt;p&gt;Nuxt.js 默认不开启 &lt;code&gt;extractCSS&lt;/code&gt;，如果你像我一样引了一个 UI 库，还对这个 UI 库自定义了的话，那你的 HTML 可能会长到令人发指。记得在 &lt;code&gt;nuxt.config.js&lt;/code&gt; 中启用哦&lt;/p&gt;
&lt;h2&gt;Nuxt.js 把 aws-sdk 打包进了前端&lt;/h2&gt;
&lt;p&gt;我暂时还没有深入去看是 Nuxt.js 的 webpack 的问题，还是可能是 &lt;code&gt;vue-loader&lt;/code&gt; 的问题（毕竟我们的宗旨是要快）&lt;/p&gt;
&lt;p&gt;不过这个问题可以用 nuxt plugin 的方式去回避。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;plguins&lt;/code&gt; 文件夹下创建 &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/plugins/getData.server.ts&quot;&gt;&lt;code&gt;getData.server.ts&lt;/code&gt;&lt;/a&gt;，&lt;/p&gt;
&lt;p&gt;把跟 server 有关的写成一个 handler，然后挂载到 &lt;code&gt;Vue&lt;/code&gt; 上也可以，&lt;code&gt;context&lt;/code&gt; 上也可以，都可以，只要是个在 SFC 中可以访问到的全局方法就可以了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import Vue from &apos;vue&apos;;
import { response } from &apos;@/api/functions/currency&apos;;
import { Context } from &apos;@nuxt/types&apos;;

Vue.$serverGetCurrency = (context: Context) =&amp;gt; {
  return response(context.req);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后到 SFC 里把刚才 Server 的方法改成这个全局方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (process.server &amp;amp;&amp;amp; context) {
  currencyData = await Vue.$serverGetCurrency(
    context
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外 ts 定义的问题，在函数的旁边 declare 一下就没有问题了（&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/plugins/getData.server.ts&quot;&gt;源代码&lt;/a&gt;）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;记得参考 &lt;a href=&quot;https://nuxtjs.org/guide/plugins/&quot;&gt;Nuxt.js Plugins&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://vuejs.org/v2/guide/typescript.html#Augmenting-Types-for-Use-with-Plugins&quot;&gt;Vue.js Augumenting Types for Use With Plugins&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;这么香？我读书少，你不要骗我&lt;/h1&gt;
&lt;p&gt;Serverless 本身其实并不是什么新鲜东西，云函数运行环境、对象存储、云数据库哪个都不是2019年或者2020年才出现的新东西，但他的想法解决了小微服务的上线速度问题，对刚起步的成长型企业，没有基础设施的小公司，或者是我有一个想法就差一个程序员的公司来说，是一个非常省时间省事情节约人力物力成本的选择。&lt;/p&gt;
&lt;p&gt;不过...&lt;/p&gt;
&lt;h2&gt;本地开发，云端调试¿&lt;/h2&gt;
&lt;p&gt;就问你怕不怕本地跑得好好的，放到云厂商那边炸了，然后调试无门！
为什么会这样呢，我们以 aws 为例，你有没有想过云原生是怎么处理 node_modules 这样的问题的？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/nodejs-package.html&quot;&gt;Node.js 中的 AWS Lambda 部署程序包&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;答案是，和你的源代码一起上传！&lt;/p&gt;
&lt;p&gt;🐂🍺了我的 aws，也就是说如果你的 node_modules 里边有依赖 native 能力的话，传上去必爆炸，而且你本地还检测不出任何问题。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;比如 &lt;a href=&quot;https://stackoverflow.com/questions/36079438/npm-install-with-aws-lambda&quot;&gt;npm install with AWS Lambda - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;成本问题&lt;/h2&gt;
&lt;p&gt;云服务商又当基础服务提供商，又帮你干了运维 Scaling 的事情，还提供了友好的 Interface ，这么多这么好的事情，当然不可能是免费的，一年免费与看起来低价的 lambda 的背后，是高额的捆绑消费以及对价格不敏感群体的整体割韭菜&lt;/p&gt;
&lt;p&gt;我没有办法直接对比使用 Serverless 的开销与传统服务器的开销，但是 以AWS 为例，Serverless 使用的 API Gateway 每百万次 $3.5 请求对于一个正常企业来说，应该是不小的开销，甚至如果遭受一次 DDNS 攻击的话，确实是有点害怕你的房子明天是不是还在了。。。&lt;/p&gt;
&lt;p&gt;而相比之下只需要多花几刀钱买一个不错的云服务器，独享内存，相对稳定的CPU，以及几乎无限流量（Fair Use），显而易见应该是一个更省钱的选择。&lt;/p&gt;
&lt;h2&gt;但还是香&lt;/h2&gt;
&lt;p&gt;在大公司里有着自己的基础设置，运营着自己的云原生，那么适当的下放一些简单的增删改查需求给前端，效率提升应该是毋庸置疑的。&lt;/p&gt;
&lt;h1&gt;最后&lt;/h1&gt;
&lt;p&gt;以上，希望本文的整体思想，又或者是代码片段，能够给你带来一些灵感或者启发。&lt;/p&gt;
&lt;p&gt;本文有任何问题欢迎指出，也欢迎你对我写的这个小学生网站提出任何意见。&lt;/p&gt;
&lt;p&gt;欢迎给本文打赏（在线要饭）&lt;/p&gt;
</content:encoded></item><item><title>Serverless から見えてきた一体化設計</title><link>https://blog.xingoxu.com/ja/2020/06/try-serverless/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2020/06/try-serverless/</guid><description>最近 Serverless を触ってみましてあるサイトを作ってみました、ってすごく便利で爆速でウェブを作れて、一番なのはNuxt.jsと相性良くてサーバーとフロントエンドが纏まって管理めっちゃ安くなったので紹介したいと思います。

</description><pubDate>Sun, 21 Jun 2020 15:52:35 GMT</pubDate><content:encoded>&lt;p&gt;最近 Serverless を触ってみましてあるサイトを作ってみました、ってすごく便利で爆速でウェブを作れて、一番なのはNuxt.jsと相性良くてサーバーとフロントエンドが纏まって管理めっちゃ安くなったので紹介したいと思います。&lt;/p&gt;

&lt;h1&gt;Serverless なにそれ？&lt;/h1&gt;
&lt;p&gt;一言いうと Cloud Function + Object Storage + Cloud Database + API Gateway and more by Cloud Service Provider. 簡単にいうと Serverless というとある OSS フレームワークが AWS/Azure/GCP などクラウドサービスを一つの設定ファイルにまとめて、バックエンドもいらずサーバーを立てる。&lt;/p&gt;
&lt;p&gt;メリットとしては：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サービスの弾性スケーリング&lt;/li&gt;
&lt;li&gt;従量制料金&lt;/li&gt;
&lt;li&gt;インフラもクラウドサービス業者がやってくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;肝心のロジックだけ集中する必要なので小学生でもサービスを爆速で作れる時代に入ったかも？&lt;/p&gt;
&lt;p&gt;そんなにすごいならみんな覚えたらサーバーエンジニアの職がなくなったんじゃ！&lt;/p&gt;
&lt;h1&gt;Serverless、やってやろう&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下、AWS を例として使います&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;爆速を言いまくったので、AWS で一つ一つ設定するわけがない。もちろんそうやっても問題ありませんが、今日俺のサービスを作って発表しますが、君のサービスは後日まで待たなきゃよ。&lt;/p&gt;
&lt;p&gt;Github Star 3万個、一千万ダウンロード数の serverless npm package、&lt;code&gt;npm i -g serverless&lt;/code&gt;でインストール、そして、ターミナルでこれを打つだけ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ serverless
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;チュートリアルが出てきてお手軽に環境構築を手助けしますね。&lt;/p&gt;
&lt;p&gt;そして、作ったプロジェクトのフォルダーに入って、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sls deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出てきたリンクをクリックして、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello World!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;すっげぇじゃん、もうサーバー立てましたじゃん！&lt;/p&gt;
&lt;h1&gt;Serverless と Nuxt.js 相性すごくいい&lt;/h1&gt;
&lt;p&gt;今日僕は https://whichcard.xingoxu.com/ このサイトを作ります。&lt;/p&gt;
&lt;p&gt;何かというと、海外カードを使う時ポイント+手数料がどのカードが一番お得なのがわかんないので、ランキングがあるとわかりやすくと思って作ったわけ。&lt;/p&gt;
&lt;p&gt;そして、これを作るために、たった三つのステップ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;為替を取ってきて&lt;/li&gt;
&lt;li&gt;当日の為替を保存する（Cloud Functionは無ステータスのため）&lt;/li&gt;
&lt;li&gt;フロントエンドで計算してランキングを出します&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Serverless の実践としては最適と思いますね。&lt;/p&gt;
&lt;p&gt;ソースコードはアップロードしましたので、そちらを見ながらレビューしていただけると大歓迎です。&lt;/p&gt;
&lt;h2&gt;ってなぜ Nuxt.js&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;こんなに小さいもので環境構築したくない（爆速したい）&lt;/li&gt;
&lt;li&gt;Vue に一番詳しいのでなるべく Vue 使いたい（爆速わけ）&lt;/li&gt;
&lt;li&gt;SSR がほしい（←重要）&lt;/li&gt;
&lt;li&gt;Programmatically で使える（←超重要）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Serverless テンプレートと設定&lt;/h2&gt;
&lt;p&gt;んで、検索したら意外と Serverless のテンプレートに Nuxt.js もありますね！
テンプレートを使ったら更に開発スピードを加速しよう、いいっすね～&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;serverless create --template-url https://github.com/tonyfromundefined/nuxt-serverless -n whichcard-abroad
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作ったら、&lt;code&gt;serverless.yml&lt;/code&gt;を編集します。Non-relation Database周りの設定をします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;resources:
  Resources:
    CurrencyTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${env:DYANMODB_TABLE}
        AttributeDefinitions:
          - AttributeName: ${env:DYANMODB_PRIMARY_KEY}
            AttributeType: S
        KeySchema:
          - AttributeName: ${env:DYANMODB_PRIMARY_KEY}
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;データベースに権限を与えないとはいけないので、lambda function を走ってるユーザー、すなわち serverless を叩くときに key を発行されたユーザーに権限を与えますので、&lt;code&gt;serverless.yml&lt;/code&gt; の中にこれを加えよう&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;provider:
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: &quot;arn:aws:dynamodb:${self:provider.region}:*:table/${env:DYANMODB_TABLE}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;はいサーバー設定終了🙌おめでとう&lt;/p&gt;
&lt;p&gt;次は、バックエンドのTypeScriptを追加します&lt;/p&gt;
&lt;p&gt;このテンプレートはバックエンド全部設定してくれましたが、バックエンドのTypeScriptは追加してないので、&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/tsconfig.json&quot;&gt;&lt;code&gt;tsconfig.json&lt;/code&gt;&lt;/a&gt; をコピーして、&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/tsconfig-server.json&quot;&gt;&lt;code&gt;tsconfig-server.json&lt;/code&gt;&lt;/a&gt;に変更します。&lt;/p&gt;
&lt;p&gt;内容もちょっと変わりましたが、ここに貼らなく上のリンクに見に行っていただけると🙏。&lt;/p&gt;
&lt;p&gt;TypeScript追加したら js にコンパイルしなきゃ node.js の lambda function には使えないので &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/webpack.config.js&quot;&gt;&lt;code&gt;webpack.config.js&lt;/code&gt;&lt;/a&gt;に&lt;code&gt;ts-loader&lt;/code&gt;の追加をお忘れなく。&lt;/p&gt;
&lt;h2&gt;為替を取ってきて&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/api/functions/visa.ts&quot;&gt;VISA&lt;/a&gt; カードを例として、為替は&lt;a href=&quot;https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html&quot;&gt;ここで&lt;/a&gt; 公表されます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;axios&lt;/code&gt;と&lt;code&gt;cheerio&lt;/code&gt;を導入して、jQuery感で40行のコードで楽に為替を取ってきました&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import axios from &apos;axios&apos;;
import cheerio from &apos;cheerio&apos;;
import { format } from &apos;date-fns&apos;;

const getVisaCurrency = async ({
  transCurr = &quot;USD&quot;,
  billCurr = &quot;JPY&quot;,
  date
}) =&amp;gt; {
  const { data: htmlBody } = await axios.get&amp;lt;
    string
  &amp;gt;(
    `https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html`,
    {
      params: {
        amount: 1,
        fee: &apos;0.0&apos;,
        utcConvertedDate: &apos;&apos;,
        exchangedate: format(
          date,
          &apos;MM/dd/yyyy&apos;
        ),
        fromCurr: billCurr,
        toCurr: transCurr,
        submitButton:
          &apos;Calculate exchange rate&apos;
      }
    }
  );
  const $ = cheerio.load(htmlBody);
  const $targetDOM = $(
    &apos;.converted-amount-value&apos;
  );
  const result = $targetDOM
    .eq($targetDOM.length - 2)
    .text()
    .match(/^\d+\.\d+/)![0];

  return result;
};

export { getVisaCurrency };
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;当日の為替を保存する&lt;/h2&gt;
&lt;p&gt;従量制課金なので、空いている時はリソースは配られるわけがない、なのでCloud Functionは無ステータスは筋が通っている。&lt;/p&gt;
&lt;p&gt;一つのリクエストに対して、為替を取ってくるのは問題ないが、ユーザーエクスペリエンスとしては最低でした…&lt;/p&gt;
&lt;p&gt;しかも、データが取られたサイトに見つかられたら、AWSのIP全部ブロックすると一番やばい。パブリックデータとしても、少しモラルがある方法で取るほうがいい。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aws-sdk&lt;/code&gt; をインポートして、TypeScriptではちょっと転換面では面倒（型定義では少しコード増やさなきゃ）だけど、基本的には時間かかってないと気がする。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { DynamoDB } from &apos;aws-sdk&apos;;
import { format } from &apos;date-fns&apos;;

const DATE_FORMAT = &apos;yyyy-MM-dd&apos;;
const DYANMODB_TABLE: string = &quot;currencyTable&quot;;
const DYANMODB_PRIMARY_KEY: string = &quot;currency&quot;;

const dynamoDBClient = new DynamoDB({
  region: process.env.DYANMODB_REGION
});

const queryFromCache = async (
  date: Date
): Promise&amp;lt;DBCurrencyObject | undefined&amp;gt; =&amp;gt; {
  const {
    Count,
    Items
  } = await dynamoDBClient
    .query({
      TableName: DYANMODB_TABLE,
      KeyConditionExpression: `#key=:dt`,
      ExpressionAttributeNames: {
        &apos;#key&apos;: DYANMODB_PRIMARY_KEY
      },
      ExpressionAttributeValues: {
        &apos;:dt&apos;: {
          S: format(date, DATE_FORMAT)
        }
      }
    })
    .promise();
  if (Count &amp;amp;&amp;amp; Count == 1)
    return DyanmodbResultAdapter(
      Items![0]
    ) as DBCurrencyObject;
  return undefined;
};

const storeResult = async ({
  date,
  result,
  billCurr,
  transCurr,
  brand
}): Promise&amp;lt;void&amp;gt; =&amp;gt; {
  let cacheResult = await queryFromCache(
    date
  );
  if (!cacheResult)
    cacheResult = {
      date: format(date, DATE_FORMAT)
    };
  if (!cacheResult[brand])
    cacheResult[brand] = {};
  if (!cacheResult[brand]![transCurr])
    cacheResult[brand]![transCurr] = {};

  cacheResult[brand]![transCurr]![
    billCurr
  ] = result;

  await dynamoDBClient
    .updateItem({
      Key: {
        [DYANMODB_PRIMARY_KEY]: {
          S: format(date, DATE_FORMAT)
        }
      },
      TableName: DYANMODB_TABLE,
      UpdateExpression: `set ${brand}=:${brand}`,
      ExpressionAttributeValues: {
        [`:${brand}`]: {
          M: DyanmodbRequestAdapter(
            cacheResult[brand]!
          )
        }
      }
    })
    .promise();
};

export { queryFromCache, storeResult };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DyanmodbRequestAdapter&lt;/code&gt;と&lt;code&gt;DyanmodbResultAdapter&lt;/code&gt;は aws-sdk を使うためにデータの転換関数。長いのでここで貼らなく、ソースコード見ていただけると思います。&lt;/p&gt;
&lt;p&gt;データを取る時と保存する時リクエストが来る可能性もありますので、&lt;code&gt;asyncOnce&lt;/code&gt;の関数を書いて入り口をラッピングして一回だけ実行させることを保証しましょう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export function asyncOnce&amp;lt;
  T extends (...args: any) =&amp;gt; Promise&amp;lt;any&amp;gt;
&amp;gt;(
  func: (
    ...args: Parameters&amp;lt;T&amp;gt;
  ) =&amp;gt; ReturnType&amp;lt;T&amp;gt;
) {
  let running: ReturnType&amp;lt;
    typeof func
  &amp;gt; | null = null;
  return (
    ...args: Parameters&amp;lt;typeof func&amp;gt;
  ) =&amp;gt; {
    if (running === null) {
      running = func(...args);
      running.finally(() =&amp;gt; {
        running = null;
      });
    }
    return running;
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;フロントエンドでランキングを計算します&lt;/h2&gt;
&lt;p&gt;さっきも言ったけど、Nuxt.js の Programmatically で使えるのは重要。なぜ重要というと、Cloud Function の入り口は一つで、リクエスト来る時フロントエンドのレンダリングとAPIのサービングは両方立たなきゃ。&lt;/p&gt;
&lt;p&gt;従来のやり方としては、&lt;code&gt;Express.js&lt;/code&gt; などでRouterを追加して、静的HTMLをレンダリングする、いわゆるサーバーレンダリング。&lt;/p&gt;
&lt;p&gt;それだとフロントエンドエンジニアにとってはちょっと不便、でもこれを使ったら、サーバーとフロントが賢く纏まった。&lt;/p&gt;
&lt;p&gt;ちょっと見てみましょう&lt;/p&gt;
&lt;p&gt;SFC でさっき書いたサーバー関数を import します&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { response } from &apos;@/api/functions/currency&apos;;

export default {
  async asyncData(context) {
    let currencyData;
    if (process.server &amp;amp;&amp;amp; context) {
      currencyData = await response(
        context.req
      );
    } else {
      const data = await axios.$get(
        &apos;/currency&apos;,
        {
          params: { ...someParams }
        }
      );

      currencyData = data;
    }
    return { currencyData }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そしたら、SSR の場合はサーバー自身が自身の &lt;code&gt;/currency&lt;/code&gt; にリクエストすることはなくなりました。&lt;/p&gt;
&lt;p&gt;また、この設計のいいところは、もしほかのページがなければ、&lt;code&gt;/currency&lt;/code&gt; の API も外に出さなくてもいいです、Nuxt.js をテンプレートエンジンとして使った。&lt;/p&gt;
&lt;p&gt;Node.js をサーバーとして使った方はわかると思います、普通のサーバーレンダリングはデータ生成してからレンダリングするが、ここではフロントエンドを先に書いちゃって、その後サーバーの関数をインポートして、データを取る。&lt;/p&gt;
&lt;p&gt;書き心地もわかりやすい。&lt;/p&gt;
&lt;p&gt;すごくない？&lt;/p&gt;
&lt;p&gt;残りはインターフェイスなどは、ここでは略します。&lt;/p&gt;
&lt;h1&gt;問題を解決&lt;/h1&gt;
&lt;h2&gt;extractCSS をつける&lt;/h2&gt;
&lt;p&gt;Nuxt.js はデフォルトとしては &lt;code&gt;extractCSS&lt;/code&gt; を閉じてます、UI Frameworkを使った方はもしかしてHTMLはとんでもない長さにされました。&lt;code&gt;nuxt.config.js&lt;/code&gt; にての起用をお忘れなく。&lt;/p&gt;
&lt;h2&gt;Nuxt.js が aws-sdk をフロントエンドのJavaScriptにバンドルしまった&lt;/h2&gt;
&lt;p&gt;Nuxt.js の webpackか、&lt;code&gt;vue-loader&lt;/code&gt;かどっちの問題まだ深く見てないが（爆速で作るわけ）、nuxt plugin で迂回することはできる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;plguins&lt;/code&gt; フォルダ下に &lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/plugins/getData.server.ts&quot;&gt;&lt;code&gt;getData.server.ts&lt;/code&gt;&lt;/a&gt;を作ります、&lt;/p&gt;
&lt;p&gt;サーバー関数をhandlerにして、&lt;code&gt;Vue&lt;/code&gt; でもいいし、&lt;code&gt;context&lt;/code&gt; でもいいし SFC でアクセスできるグローバル関数であればOK。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import Vue from &apos;vue&apos;;
import { response } from &apos;@/api/functions/currency&apos;;
import { Context } from &apos;@nuxt/types&apos;;

Vue.$serverGetCurrency = (context: Context) =&amp;gt; {
  return response(context.req);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SFCでさっきのところでこの関数を使う&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (process.server &amp;amp;&amp;amp; context) {
  currencyData = await Vue.$serverGetCurrency(
    context
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TypeScriptの型定義なら、その関数の隣で declare すればどこでも問題ないはずです（&lt;a href=&quot;https://github.com/xingoxu/whichcard-abroad/blob/master/src/plugins/getData.server.ts&quot;&gt;ソースコード&lt;/a&gt;）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;レファレンス &lt;a href=&quot;https://nuxtjs.org/guide/plugins/&quot;&gt;Nuxt.js Plugins&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://vuejs.org/v2/guide/typescript.html#Augmenting-Types-for-Use-with-Plugins&quot;&gt;Vue.js Augumenting Types for Use With Plugins&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;めっちゃ便利、落とし穴ないの？&lt;/h1&gt;
&lt;p&gt;Serverless は新しいものではない、Cloud Function、Object Storage、Cloud Database どっちでも2020年から出たものではない。ただそのコンセプトはスタートアップ企業のサービスのラウンチスピードをすごく手助けしました。彼達にとって、サーバーさえもないし、エンジニアもわずか数人もしくは一人だけかもしれませんが、そんな状況の企業にはとてもふさわしいも過言ではない。時間とコスト両方省けられる選択です。&lt;/p&gt;
&lt;p&gt;でもね…&lt;/p&gt;
&lt;h2&gt;ローカルで開発、そらでデバッグ&lt;/h2&gt;
&lt;p&gt;「あら、ローカルでちゃんと動いてるのに、アップロードしたらエラーが出ちゃった！」
それはなぜですか？AWS を例としてCloud Native はどう node_modules を処理してるのは見てみましょう。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-package.html&quot;&gt;Node.js の AWS Lambda デプロイパッケージ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;その答えは、コードと一緒にアップロードします。&lt;/p&gt;
&lt;p&gt;つまり、node_modulesにnode-gypなど native を依存してるかつ aws のハードウェア適してない場合は必ずエラーが出るのではないか、しかもローカルでは検知できない。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ほら &lt;a href=&quot;https://stackoverflow.com/questions/36079438/npm-install-with-aws-lambda&quot;&gt;npm install with AWS Lambda - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;コスト&lt;/h2&gt;
&lt;p&gt;さっきまだコストを省けると言ったのに、それなぜまた問題と視されますか？&lt;/p&gt;
&lt;p&gt;クラウドサービスプラットフォーム、ベーシックサービスを提供しながら、インフラ、自動スケーリング、フレンドリーインターフェイスも提供し、そんなにいいこと無料のわけがない。最初に一年無料、従量制課金の後ろは、他のサービスを同梱して一緒に課金しちゃうと、価格に対して敏感ではない人を「騙す」&lt;/p&gt;
&lt;p&gt;Serverless と従来のサーバーを直接で比較することはできない、ただ、AWS の API Gateway 百万回 $3.5の料金は高くない？DDNSを受けたら、お家飛んできそうよ。&lt;/p&gt;
&lt;p&gt;$5では vultr 買えます、しかも無限トラフィック、安定してるリソース、サービスがでかくなったらコスト的には絶対勝つと思います。&lt;/p&gt;
&lt;h2&gt;クラウドサービスプラットフォームに対しての依存性&lt;/h2&gt;
&lt;p&gt;AWS でサービスを立ったが、後日 AWS と揉めたら、また Amazon と利益上で対立して他のクラウドサービスに行きたい、もしくは自分のサーバーがありまして自分のサーバーに移行しようとすると、コードをもう一度書かなきゃし、設定とか見直さないとも行けないし…&lt;/p&gt;
&lt;h2&gt;でもそのいいところを忘れないで&lt;/h2&gt;
&lt;p&gt;もしでかい会社のであれば、自分がそのインフラ持ってて、Serverless みたいのものを作ったら、適当に簡単なものをフロントエンド側に任せたら効率的にはすごく早いのではないかと考えられますね。&lt;/p&gt;
&lt;h1&gt;以上&lt;/h1&gt;
&lt;p&gt;ご閲覧ありがとうございました、この記事の考え、コード、あなたにアイデアまたはインスピレーションをもたらしたら嬉しいです。&lt;/p&gt;
&lt;p&gt;記事について質問、またはこの小学生も作れるウェブサイトについて意見があれば大歓迎です。&lt;/p&gt;
</content:encoded></item><item><title>Google I/O 2019 Web 前端内容总结</title><link>https://blog.xingoxu.com/2019/05/2019-05-17-google-io-tech/</link><guid isPermaLink="true">https://blog.xingoxu.com/2019/05/2019-05-17-google-io-tech/</guid><description># Web 新产品 / 新技术
- web.dev
  - https://web.dev
  - 一个可以用来学习框架、性能、各种 Web 技术的地方
  - 还有实战 Codelab
  - 正在进行多国翻译
- Lighthouse Performance Budgets
  - https://developers.google.com/web/tools/lighthouse/audits/budgets
  - 在Lighthouse中设定性能预算，让Lighthouse在测试性能时使用并打分
- PWA Desktop
  - PWA现在可以各大桌面平台系统中安装了
- Trusted Web Activity
  - https://developers.google.com/web/updates/2019/02/using-twa
  - Chrome Custom Tab 的升级版，不再显示标题栏
  - 一个常见的使用场景是在已有的App中去使用PWA来打包家族应用并打造原生体验
  - 在网页中可以使用schema url来与App通信
  - App可以在网址后附上参数给网页发送数据
- Perception Toolkit
  - https://web.dev/perception-toolkit
  - 一个工具包使用Shape Detection API去扫描条码或者获取实物信息
  - 从网站的 meta 信息展示相关卡片
  - 提供了WebAssembly版以向下兼容
- Puppeteer with Firefox
  - 可以使用Firefox进行自动化了
  - `npm i puppeteer-firefox`

</description><pubDate>Fri, 17 May 2019 16:55:59 GMT</pubDate><content:encoded>&lt;h1&gt;Web 新产品 / 新技术&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;web.dev
&lt;ul&gt;
&lt;li&gt;https://web.dev&lt;/li&gt;
&lt;li&gt;一个可以用来学习框架、性能、各种 Web 技术的地方&lt;/li&gt;
&lt;li&gt;还有实战 Codelab&lt;/li&gt;
&lt;li&gt;正在进行多国翻译&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lighthouse Performance Budgets
&lt;ul&gt;
&lt;li&gt;https://developers.google.com/web/tools/lighthouse/audits/budgets&lt;/li&gt;
&lt;li&gt;在Lighthouse中设定性能预算，让Lighthouse在测试性能时使用并打分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PWA Desktop
&lt;ul&gt;
&lt;li&gt;PWA现在可以各大桌面平台系统中安装了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Trusted Web Activity
&lt;ul&gt;
&lt;li&gt;https://developers.google.com/web/updates/2019/02/using-twa&lt;/li&gt;
&lt;li&gt;Chrome Custom Tab 的升级版，不再显示标题栏&lt;/li&gt;
&lt;li&gt;一个常见的使用场景是在已有的App中去使用PWA来打包家族应用并打造原生体验&lt;/li&gt;
&lt;li&gt;在网页中可以使用schema url来与App通信&lt;/li&gt;
&lt;li&gt;App可以在网址后附上参数给网页发送数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Perception Toolkit
&lt;ul&gt;
&lt;li&gt;https://web.dev/perception-toolkit&lt;/li&gt;
&lt;li&gt;一个工具包使用Shape Detection API去扫描条码或者获取实物信息&lt;/li&gt;
&lt;li&gt;从网站的 meta 信息展示相关卡片&lt;/li&gt;
&lt;li&gt;提供了WebAssembly版以向下兼容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Puppeteer with Firefox
&lt;ul&gt;
&lt;li&gt;可以使用Firefox进行自动化了&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm i puppeteer-firefox&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Web 将来可以使用的新功能 / 新Web API / 新 JavaScript API 等&lt;/h1&gt;
&lt;h2&gt;Chrome Only (目前为止，没有写入w3c标准)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lazy loading
&lt;ul&gt;
&lt;li&gt;在图片和iframe中添加 loading=&quot;lazy&quot; 属性来让浏览器自动懒加载&lt;/li&gt;
&lt;li&gt;Chrome 75 启用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Portals
&lt;ul&gt;
&lt;li&gt;https://web.dev/hands-on-portals&lt;/li&gt;
&lt;li&gt;一个新tag，类似iframe，以提供转到网页中嵌入内容的无缝体验&lt;/li&gt;
&lt;li&gt;可以在Chrome Canary体验&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web Packaging
&lt;ul&gt;
&lt;li&gt;https://github.com/WICG/webpackage&lt;/li&gt;
&lt;li&gt;对网页进行签名打包，在不同服务器上部署，使得浏览器可以不仅在源服务器上获取内容（p2p的感觉）&lt;/li&gt;
&lt;li&gt;暂时没有任何 demo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Paint Holding
&lt;ul&gt;
&lt;li&gt;同一网站切换页面时将保持之前的绘制不会白屏一次&lt;/li&gt;
&lt;li&gt;Chrome Canary 可预览&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cookie Changes upcoming in Chrome 76
&lt;ul&gt;
&lt;li&gt;https://web.dev/samesite-cookies-explained&lt;/li&gt;
&lt;li&gt;没有添加Same-Site的Cookie将会自动适用&lt;code&gt;Same-Site=LAX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chrome 正在开发的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WICG/native-file-system&quot;&gt;原生文件系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=897276&quot;&gt;无需提前申请即可存储文件在本地&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sso-google/sms-otp-retrieval&quot;&gt;基于短信的验证&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;关联Session： What’s New with Chrome and the Web (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Web API&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;开发中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分享 -&amp;gt; Web Share API (Shipped) -&amp;gt; Web Share Target (v2) (Working)&lt;/li&gt;
&lt;li&gt;media control on System level -&amp;gt; mediaSession API (Shipped)&lt;/li&gt;
&lt;li&gt;检测条码与形状 -&amp;gt; Shape Detection API (FaceDetect / BarcodeDetect both shipped in Chrome Canary)&lt;/li&gt;
&lt;li&gt;App Badging (App上的数字) -&amp;gt; window.Badge / window.ExperimentalBadge (Origin Trial 78)&lt;/li&gt;
&lt;li&gt;唤醒锁 -&amp;gt; (Screen wake lock / System wake lock) -&amp;gt; Wake Lock (In Development)&lt;/li&gt;
&lt;li&gt;文件操作 -&amp;gt; File Picker -&amp;gt; chooseFileSystemEntries (propse stage / In Development)&lt;/li&gt;
&lt;li&gt;访问串口设备（例如打印机） -&amp;gt; Serial API (Proposed API)&lt;/li&gt;
&lt;li&gt;HID 设备访问 -&amp;gt; WebHID (Proposed API / In Development)&lt;/li&gt;
&lt;li&gt;访问通讯录 -&amp;gt; Contacts Picker (Proposed API / Experimenting)&lt;/li&gt;
&lt;li&gt;访问安装字体列表 -&amp;gt; Proposed / In Development&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;很快实装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;剪贴板复制与粘贴图片 Clipboard API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bit.ly/sms-verification-explainer&quot;&gt;基于短信的手机号验证流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;基于时间的推送通知API Notification Triggers API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;以上内容年内实装&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;在 Chrome 中可参与试用并参与反馈
https://developers.chrome.com/origintrials&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Web API 可在 Project hugu 参阅进度 &lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/list?can=2&amp;amp;q=proj-fugu&amp;amp;sort=m&amp;amp;colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&quot;&gt;Project hugu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g356dbrkpgj21rs0xs4qp.jpg&quot; alt=&quot;Web API 预定&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;相关Session： Unlocking New Capabilities for the Web (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;JavaScript API / Syntax&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;类的私有字段 (已实装) - working on privatter method and getters and setters&lt;/li&gt;
&lt;li&gt;String.prototype.matchAll (已实装)&lt;/li&gt;
&lt;li&gt;数字分隔 (Chrome 75)&lt;/li&gt;
&lt;li&gt;BigInt (Chrome 74 与 Firefox nightly 与 node 实装 &amp;amp; transpiler available)&lt;/li&gt;
&lt;li&gt;Array.prototype.flat (in chrome firefox safari node)&lt;/li&gt;
&lt;li&gt;从 Entries 反转化为 Object  (in chrome firefox safari node )&lt;/li&gt;
&lt;li&gt;globalThis (in chrome firefox safari node )&lt;/li&gt;
&lt;li&gt;正在将数字排序的稳定性写入标准&lt;/li&gt;
&lt;li&gt;多国语言相关
&lt;ul&gt;
&lt;li&gt;Intl.RelativeTimeFormat -&amp;gt; today yesterday tomorrow (in chrome firefox node)&lt;/li&gt;
&lt;li&gt;Intl.ListFormat -&amp;gt; ex. A, B or C  (in chrome node)&lt;/li&gt;
&lt;li&gt;Intl.DateTimeFormat -&amp;gt; ex. May, 5  (in chrome)&lt;/li&gt;
&lt;li&gt;Intl.Locale -&amp;gt; Internal Translation (in chrome node)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Promise.allSettled (in chrome 76 nightly) / Promise.any&lt;/li&gt;
&lt;li&gt;WeakRef and finalizers (in chrome with flags) &amp;amp; 写入标准&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;关联Session： What’s new in JavaScript (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;经验分享与性能提升&lt;/h1&gt;
&lt;p&gt;Chrome 想为各个框架提供一些API这样他们在连续执行分块任务时同时相应用户输入&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scheduling API
&lt;ul&gt;
&lt;li&gt;https://github.com/WICG/main-thread-scheduling&lt;/li&gt;
&lt;li&gt;https://github.com/WICG/is-input-pending&lt;/li&gt;
&lt;li&gt;https://github.com/WICG/display-locking&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google 分享了他们在性能上的一些做法和建议&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阶段式SSR&lt;/li&gt;
&lt;li&gt;捕获JS完全加载前的用户点击&lt;/li&gt;
&lt;li&gt;保持初始大小的JS&lt;/li&gt;
&lt;li&gt;交互驱动懒加载组件&lt;/li&gt;
&lt;li&gt;建立依赖关系图，声明性加载功能，同时获取数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g356nnvqhfj21ra0z2e81.jpg&quot; alt=&quot;Google Important Piece&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Google 的性能建议&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;懒加载&lt;/li&gt;
&lt;li&gt;响应式图片（根据设备像素密度等加载不同分辨率图片）&lt;/li&gt;
&lt;li&gt;图片CDN&lt;/li&gt;
&lt;li&gt;延迟第三方JS&lt;/li&gt;
&lt;li&gt;移除代价巨大的库&lt;/li&gt;
&lt;li&gt;分离代码&lt;/li&gt;
&lt;li&gt;避免Web Font字体闪烁&lt;/li&gt;
&lt;li&gt;Prefetch&lt;/li&gt;
&lt;li&gt;Preconnect&lt;/li&gt;
&lt;li&gt;Preload&lt;/li&gt;
&lt;li&gt;首屏关键CSS&lt;/li&gt;
&lt;li&gt;gzip -&amp;gt; Brotli&lt;/li&gt;
&lt;li&gt;响应式加载JS（适应不同浏览器分别加载不同JS）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以及使用Lighthouse 与设定性能预算 LightWallet&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g358gekpplj21430l4k2y.jpg&quot; alt=&quot;Performance Suggestion&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;相关Session：&lt;br /&gt;
Elevating the Web Platform with the JavaScript Framework Community (Google I/O ’19)&lt;br /&gt;
Speed at Scale: Web Performance Tips and Tricks from the Trenches (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;p&gt;更多性能其他案例、How to、以及Web内容可参照
https://www.youtube.com/playlist?list=PLNYkxOF6rcIATmAmz7HcCzongGvQEtx8i&lt;/p&gt;
</content:encoded></item><item><title>Google I/O 2019 フロントエンドまとめ</title><link>https://blog.xingoxu.com/ja/2019/05/2019-05-17-google-io-tech/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2019/05/2019-05-17-google-io-tech/</guid><description># Web 新プロダクト / 新技術
- web.dev というサイト
  - https://web.dev
  - フレームワーク、パフォーマンス、Web各種技術など載っているグーグルが作ったまとめサイト
  - 全部無料で学べる
  - 今フレームワークはReact.jsだけけど、今後追加予定
  - 実践 Codelab、その場で試すことはできます
  - 翻訳は今進行中らしい
- Lighthouse Performance Budgets
  - https://developers.google.com/web/tools/lighthouse/audits/budgets
  - Lighthouseにパフォーマンス時間 / ファイル大きさ予算を設定し、Lighthouseが測ってくれる
- PWA Desktop
  - PWA 今デスクトップOSにインストールできます
- Trusted Web Activity
  - https://developers.google.com/web/updates/2019/02/using-twa
  - Chrome Custom Tab のアップグレード版、タイトルバーがない
  - よく見られるユースケースは、現存のアプリの中で、ファミリーアプリのウェブ版を入れて、ネイテイブ感を作る
  - ウェブページにはschema urlでアプリにメッセージ送れます
  - アプリは URL の後ろにパラメータ付けるならウェブページにメッセージ送れます
- Perception Toolkit
  - https://web.dev/perception-toolkit
  - Shape Detection APIを使ってるツールキット
  - バーコード、実物、画像を取得してウェブサイトのmetaから取った情報と比較して、関連カードを出す
  - APIまだ使えないブラウザにWeb Assemblyを使う、互換性を保つ
- Puppeteer with Firefox
  - Firefoxが使えるようになりました
  - `npm i puppeteer-firefox`

</description><pubDate>Fri, 17 May 2019 16:55:59 GMT</pubDate><content:encoded>&lt;h1&gt;Web 新プロダクト / 新技術&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;web.dev というサイト
&lt;ul&gt;
&lt;li&gt;https://web.dev&lt;/li&gt;
&lt;li&gt;フレームワーク、パフォーマンス、Web各種技術など載っているグーグルが作ったまとめサイト&lt;/li&gt;
&lt;li&gt;全部無料で学べる&lt;/li&gt;
&lt;li&gt;今フレームワークはReact.jsだけけど、今後追加予定&lt;/li&gt;
&lt;li&gt;実践 Codelab、その場で試すことはできます&lt;/li&gt;
&lt;li&gt;翻訳は今進行中らしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lighthouse Performance Budgets
&lt;ul&gt;
&lt;li&gt;https://developers.google.com/web/tools/lighthouse/audits/budgets&lt;/li&gt;
&lt;li&gt;Lighthouseにパフォーマンス時間 / ファイル大きさ予算を設定し、Lighthouseが測ってくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PWA Desktop
&lt;ul&gt;
&lt;li&gt;PWA 今デスクトップOSにインストールできます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Trusted Web Activity
&lt;ul&gt;
&lt;li&gt;https://developers.google.com/web/updates/2019/02/using-twa&lt;/li&gt;
&lt;li&gt;Chrome Custom Tab のアップグレード版、タイトルバーがない&lt;/li&gt;
&lt;li&gt;よく見られるユースケースは、現存のアプリの中で、ファミリーアプリのウェブ版を入れて、ネイテイブ感を作る&lt;/li&gt;
&lt;li&gt;ウェブページにはschema urlでアプリにメッセージ送れます&lt;/li&gt;
&lt;li&gt;アプリは URL の後ろにパラメータ付けるならウェブページにメッセージ送れます&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Perception Toolkit
&lt;ul&gt;
&lt;li&gt;https://web.dev/perception-toolkit&lt;/li&gt;
&lt;li&gt;Shape Detection APIを使ってるツールキット&lt;/li&gt;
&lt;li&gt;バーコード、実物、画像を取得してウェブサイトのmetaから取った情報と比較して、関連カードを出す&lt;/li&gt;
&lt;li&gt;APIまだ使えないブラウザにWeb Assemblyを使う、互換性を保つ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Puppeteer with Firefox
&lt;ul&gt;
&lt;li&gt;Firefoxが使えるようになりました&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm i puppeteer-firefox&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Web にもうすぐ使えるもの / 新Web API / 新 JavaScript API など&lt;/h1&gt;
&lt;h2&gt;Chrome Only (w3cにまだ書いてない)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lazy loading
&lt;ul&gt;
&lt;li&gt;画像とiframeの中 loading=&quot;lazy&quot; のアトリビュートを追加すると遅延ロードくれます&lt;/li&gt;
&lt;li&gt;Chrome 75 から&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Portals
&lt;ul&gt;
&lt;li&gt;https://web.dev/hands-on-portals&lt;/li&gt;
&lt;li&gt;新たな要素、iframeみたい、埋め込む内容に切り替えるスムーズ体験を提供する&lt;/li&gt;
&lt;li&gt;Chrome Canary 使える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web Packaging
&lt;ul&gt;
&lt;li&gt;https://github.com/WICG/webpackage&lt;/li&gt;
&lt;li&gt;ウェブサイトをサインしてパッケージして、どこでもデプロイして、ブラウザはどこでも同じサイトとみなす（p2pの感じ）&lt;/li&gt;
&lt;li&gt;例はまだない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Paint Holding
&lt;ul&gt;
&lt;li&gt;同じサイト画面遷移時白い画面は出ない&lt;/li&gt;
&lt;li&gt;Chrome Canary 見れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cookie は Chrome 76 からちょっと変わる
&lt;ul&gt;
&lt;li&gt;https://web.dev/samesite-cookies-explained&lt;/li&gt;
&lt;li&gt;Same-Site使っていないCookieは&lt;code&gt;Same-Site=LAX&lt;/code&gt;を適用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chrome今開発中もの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WICG/native-file-system&quot;&gt;ネイテイブファイルシステム&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=897276&quot;&gt;申請しなくもローカルでファイルを保存できる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sso-google/sms-otp-retrieval&quot;&gt;SMS基づくユーザー検証&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;関連Session： What’s New with Chrome and the Web (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;独自APIを開発するから海外でも好評得ていないらしい…&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Web API&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;開発中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ウェブシェア -&amp;gt; Web Share API (Shipped) -&amp;gt; Web Share Target (v2) (Working)&lt;/li&gt;
&lt;li&gt;media control on System level -&amp;gt; mediaSession API (Shipped)&lt;/li&gt;
&lt;li&gt;バーコード、画像、実物探知 -&amp;gt; Shape Detection API (FaceDetect / BarcodeDetect both shipped in Chrome Canary)&lt;/li&gt;
&lt;li&gt;App Badging (アプリアイコンの数字) -&amp;gt; window.Badge / window.ExperimentalBadge (Origin Trial 78)&lt;/li&gt;
&lt;li&gt;Wake Lock -&amp;gt; (Screen wake lock / System wake lock) -&amp;gt; Wake Lock (In Development)&lt;/li&gt;
&lt;li&gt;ファイル -&amp;gt; File Picker -&amp;gt; chooseFileSystemEntries (提案中 / In Development)&lt;/li&gt;
&lt;li&gt;シリアルデバイスサクセス（プリンターなど） -&amp;gt; Serial API (提案済み)&lt;/li&gt;
&lt;li&gt;HID デバイスアクセス -&amp;gt; WebHID (提案済み / In Development)&lt;/li&gt;
&lt;li&gt;連絡帳サクセス -&amp;gt; Contacts Picker (提案済み / Experimenting)&lt;/li&gt;
&lt;li&gt;インストールしたフォントをアクセス -&amp;gt; 提案済み / In Development&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;もうすぐ実装します&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clipboard API with Image （クリップボードAPIに画像も添付できる）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bit.ly/sms-verification-explainer&quot;&gt;SMS基づくOTP検証&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notification Triggers API （時間基づくプッシュ通知）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上記内容年内実装
Chrome で試すまたフィードバックは下記サイトまで
https://developers.chrome.com/origintrials&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Web API は Project huguで 確認できます &lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/list?can=2&amp;amp;q=proj-fugu&amp;amp;sort=m&amp;amp;colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&quot;&gt;Project hugu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g356dbrkpgj21rs0xs4qp.jpg&quot; alt=&quot;Web API スケジュール&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;関連Session： Unlocking New Capabilities for the Web (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;JavaScript API / Syntax&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Class のプライベート属性 (実装済み) - working on privatter method and getters and setters&lt;/li&gt;
&lt;li&gt;String.prototype.matchAll (実装済み)&lt;/li&gt;
&lt;li&gt;Number spearater (Chrome 75)&lt;/li&gt;
&lt;li&gt;BigInt (Chrome 74 と Firefox nightly と node 実装済み &amp;amp; transpiler available)&lt;/li&gt;
&lt;li&gt;Array.prototype.flat (in chrome firefox safari node)&lt;/li&gt;
&lt;li&gt;Entries から Object に転換する Object.entriesの逆操作 (in chrome firefox safari node )&lt;/li&gt;
&lt;li&gt;globalThis (in chrome firefox safari node )&lt;/li&gt;
&lt;li&gt;Array.sortの安定性を標準の中に書くように努力してる&lt;/li&gt;
&lt;li&gt;多言語について
&lt;ul&gt;
&lt;li&gt;Intl.RelativeTimeFormat -&amp;gt; today yesterday tomorrow (in chrome firefox node)&lt;/li&gt;
&lt;li&gt;Intl.ListFormat -&amp;gt; ex. A, B or C  (in chrome node)&lt;/li&gt;
&lt;li&gt;Intl.DateTimeFormat -&amp;gt; ex. May, 5  (in chrome)&lt;/li&gt;
&lt;li&gt;Intl.Locale -&amp;gt; Internal Translation (in chrome node)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Promise.allSettled (in chrome 76 nightly) / Promise.any&lt;/li&gt;
&lt;li&gt;WeakRef and finalizers (in chrome with flags) &amp;amp; 標準の中に書くように&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;関連Session： What’s new in JavaScript (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;経験シェアとパフォーマンス&lt;/h1&gt;
&lt;p&gt;Chrome はフレームワークなどスケジュールAPIを提供したい、
連続実行、レンダリングの時もユーザーの操作受けるように。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scheduling API
&lt;ul&gt;
&lt;li&gt;https://github.com/WICG/main-thread-scheduling&lt;/li&gt;
&lt;li&gt;https://github.com/WICG/is-input-pending&lt;/li&gt;
&lt;li&gt;https://github.com/WICG/display-locking&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google はパフォーマンスにやり方とアドバイス&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;段階的SSR&lt;/li&gt;
&lt;li&gt;JS完全ロード前のクリック事件を取るように&lt;/li&gt;
&lt;li&gt;一定サイズの初期JS&lt;/li&gt;
&lt;li&gt;インタラクション駆動型遅延ロード&lt;/li&gt;
&lt;li&gt;依存関係グラフ、宣言型機能ロード、同時にデータを取る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g356nnvqhfj21ra0z2e81.jpg&quot; alt=&quot;Google Important Piece&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Google のパフォーマンスアドバイス&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;遅延ロード&lt;/li&gt;
&lt;li&gt;レスポンシブ画像（ピクセル密度による画像をロードする）&lt;/li&gt;
&lt;li&gt;画像CDN&lt;/li&gt;
&lt;li&gt;サードパーティのJSを遅延する&lt;/li&gt;
&lt;li&gt;高価なライブラリを削除する&lt;/li&gt;
&lt;li&gt;コード分割&lt;/li&gt;
&lt;li&gt;Web Fontの白いフラッシュを避ける&lt;/li&gt;
&lt;li&gt;Prefetch&lt;/li&gt;
&lt;li&gt;Preconnect&lt;/li&gt;
&lt;li&gt;Preload&lt;/li&gt;
&lt;li&gt;クリティカルCSS（はじめの画面だけ必要のCSSをロードする）&lt;/li&gt;
&lt;li&gt;gzip -&amp;gt; Brotli&lt;/li&gt;
&lt;li&gt;端末、ブラウザによるJSをロードする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;また、Lighthouse を使って、性能予算を設定する&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g358gekpplj21430l4k2y.jpg&quot; alt=&quot;Performance Suggestion&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;関連Session：&lt;br /&gt;
Elevating the Web Platform with the JavaScript Framework Community (Google I/O ’19)&lt;br /&gt;
Speed at Scale: Web Performance Tips and Tricks from the Trenches (Google I/O ’19)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;その他&lt;/h1&gt;
&lt;p&gt;他のパフォーマンスユースケース、ノウハウ、Web内容はここへ
https://www.youtube.com/playlist?list=PLNYkxOF6rcIATmAmz7HcCzongGvQEtx8i&lt;/p&gt;
</content:encoded></item><item><title>群晖 NAS 打造自动电视录像服务器</title><link>https://blog.xingoxu.com/2019/05/2019-05-16-record-jp-digital-tv-on-nas/</link><guid isPermaLink="true">https://blog.xingoxu.com/2019/05/2019-05-16-record-jp-digital-tv-on-nas/</guid><description># 什么是录像服务器

录像服务器就是指将电脑接上电视天线，把电视节目自动录制下来并保存在硬盘上。在日本许多电视机都会自带录制功能，指定节目之后每周录制相同时间段的节目，或者指定条件，自动录制符合条件的节目。这次我们就要来尝试在NAS上搭建这么一个录制服务器。

# 为什么我们要搭建这样的服务器

既然电视机已经有了这样的功能，为什么还需要额外搭建这样的服务器呢。
电视机确实已经很强大，但我们也有串流需求，在家，在外边，在笔记本上随时随地都想收看录制的电视节目的话，只有一个电视机和收看设备的话很难做到。
搭建了这个服务器之后，我们还能实现在手机在电脑实时观看电视直播功能，画质当然与电视台一致。

# 为什么要放在NAS上

还不是为了拯救我那24小时开机的NAS但却只用来同步文件的电老虎吗

</description><pubDate>Thu, 16 May 2019 15:47:37 GMT</pubDate><content:encoded>&lt;h1&gt;什么是录像服务器&lt;/h1&gt;
&lt;p&gt;录像服务器就是指将电脑接上电视天线，把电视节目自动录制下来并保存在硬盘上。在日本许多电视机都会自带录制功能，指定节目之后每周录制相同时间段的节目，或者指定条件，自动录制符合条件的节目。这次我们就要来尝试在NAS上搭建这么一个录制服务器。&lt;/p&gt;
&lt;h1&gt;为什么我们要搭建这样的服务器&lt;/h1&gt;
&lt;p&gt;既然电视机已经有了这样的功能，为什么还需要额外搭建这样的服务器呢。
电视机确实已经很强大，但我们也有串流需求，在家，在外边，在笔记本上随时随地都想收看录制的电视节目的话，只有一个电视机和收看设备的话很难做到。
搭建了这个服务器之后，我们还能实现在手机在电脑实时观看电视直播功能，画质当然与电视台一致。&lt;/p&gt;
&lt;h1&gt;为什么要放在NAS上&lt;/h1&gt;
&lt;p&gt;还不是为了拯救我那24小时开机的NAS但却只用来同步文件的电老虎吗&lt;/p&gt;

&lt;h1&gt;需要准备的东西&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;你的一台NAS
&lt;ul&gt;
&lt;li&gt;我们需要在上边接上电视天线并运行录制程序&lt;/li&gt;
&lt;li&gt;需要能够运行Docker与虚拟机 （&lt;a href=&quot;https://www.synology.com/en-us/dsm/packages/Virtualization&quot;&gt;你可以在这里查看兼容机型&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PLEX USB地上波天线 PX-S1UD V2.0
&lt;ul&gt;
&lt;li&gt;一个作为录制电视的初始入门的USB天线&lt;/li&gt;
&lt;li&gt;不贵，约4530日元&lt;/li&gt;
&lt;li&gt;一根天线只能录制一个节目，需要录制多个电视节目可以买多个&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B0141NFWSG/&quot;&gt;亚马逊购买链接&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SCM IC读卡器
&lt;ul&gt;
&lt;li&gt;用来读取 B-CAS 卡、1000日元左右&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B0085H4YZC/&quot;&gt;亚马逊购买链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;注意这个发货并不一定是同一个品牌同一型号的读卡器，在之后的测试读卡器部分可能会出现一些问题，需要做好强大的心理准备&lt;/li&gt;
&lt;li&gt;也可以用SoftCAS，不过感觉不是很可靠以及有触犯法律风险，不在本篇讨论范围&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;大硬盘
&lt;ul&gt;
&lt;li&gt;用来保存你的节目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;B-CAS 卡
&lt;ul&gt;
&lt;li&gt;测试你可以从现在的电视上拿下来借用&lt;/li&gt;
&lt;li&gt;后期你可以从不用的中古电视或者DVD录像机上取下来借用&lt;/li&gt;
&lt;li&gt;亚马逊上可能有人出品，但买卖B-CAS卡可能触及法律风险需要注意&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;天线分波器 / 分配器、一根天线连接线
&lt;ul&gt;
&lt;li&gt;把一根天线变成两根天线的东西，或者把地上波与BS/CS波分开的东西，根据个人需要进行购买，并不必须&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;注意&lt;/h1&gt;
&lt;p&gt;以下内容仅保证文章撰写时点的有效性，本文并不面向初级用户，请仅有一定动手能力以及自己能够解决途中出现的问题的读者进行搭建，并请自行负担出现的任何问题与责任。
电视节目的复制，传播可能触及相关法律，在使用时请十分注意。
由于参考了本文进行的操作发生的任何损失，作者不负担任何责任与赔偿。&lt;/p&gt;
&lt;h1&gt;架构说明&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/005BYqpggy1g336pg2yuyj30fm0akgm2.jpg&quot; alt=&quot;架构&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;NAS 准备&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;安装Docker&lt;/li&gt;
&lt;li&gt;安装 Virtual Machine Manager&lt;/li&gt;
&lt;li&gt;在虚拟机里安装Ubuntu 16或者18.04 或者随便你喜欢的发行版
&lt;ul&gt;
&lt;li&gt;本文将以Ubuntu 18.04作为参考进行，其他发行版本请自行注意路径等&lt;/li&gt;
&lt;li&gt;但无论如何注意 Linux 内核版本必须高于3.15（原因下述）&lt;/li&gt;
&lt;li&gt;建议将虚拟机的Ubuntu设置成仅内网访问&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;准备天线&lt;/h1&gt;
&lt;p&gt;进入Ubuntu虚拟机，安装天线驱动，具体操作步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就算完成了&lt;/p&gt;
&lt;p&gt;因为天线驱动最低支持3.15的Linux内核，而群晖的内核是3.10，导致没有办法将天线与调用天线驱动的内容放置在主机本体运行，才不得不使用了虚拟机这样的结构。&lt;/p&gt;
&lt;p&gt;如果群晖之后升级到了3.15以上的内核，那可以尝试一下使用 https://github.com/Chinachu/docker-mirakurun-chinachu 的 Docker 镜像。&lt;/p&gt;
&lt;h1&gt;准备读卡器与B-CAS卡&lt;/h1&gt;
&lt;p&gt;在Ubuntu虚拟机内安装一些工具（之后也会使用到）与读卡器驱动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install build-essential git cmake g++
$ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完毕之后，使用 &lt;code&gt;sudo pcsc_scan&lt;/code&gt; 命令，如果出现了 &lt;code&gt;Japanese Chijou Digital B-CAS Card (pay TV)&lt;/code&gt; 类似的字样，那么B-CAS卡的安装和驱动就顺利完成了&lt;/p&gt;
&lt;p&gt;笔者在这里碰到过两个问题，一个是B-CAS插反了，没读到芯片（汗），另一个是B-CAS卡无效问题。
B-CAS卡如果无效的话，是会顺利出线上述字样的，但是之后无法正常使用录制电视，可以将B-CAS插上电视看一下是否有错误提示。&lt;/p&gt;
&lt;p&gt;另外如果使用的不是NEC读头的读卡器，可能会没法扫描出或者没法启动pcscd（参考的原文章作者碰到了这个问题），读者可以自行搜索相关方法或参考下方参考文章链接。&lt;/p&gt;
&lt;h1&gt;安装B-CAS解码用的相关库&lt;/h1&gt;
&lt;p&gt;由于日本地上波加密后进行广播，直接录制的话也没法播放和保存。因此我们需要在接收信号的同时使用B-CAS卡进行解码并无视加密。实现这个的是一个叫libarib25的库。&lt;/p&gt;
&lt;p&gt;这个库需要编译。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master.zip
$ cd libarib25-master
$ cmake .
$ make
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成安装&lt;/p&gt;
&lt;h1&gt;安装录像指令&lt;/h1&gt;
&lt;p&gt;我们需要安装recdvb这个录像指令，之后的录像管理都会调用这个指令来进行。
源代码是公开的但是没有放在github上，需要编译安装。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
$ tar xvzf recdvb-1.3.2.tgz
$ cd recdvb-1.3.2
$ ./autogen.sh
$ ./configure --enable-b25
$ make 
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成安装。&lt;/p&gt;
&lt;p&gt;安装之后就可以使用这个指令直接录制电视节目了。
比如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ recdvb --b25 --strip &amp;lt;channel&amp;gt; &amp;lt;seconds&amp;gt; test.m2ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;channel根据地区，放送电波塔不同，数字不同，可以在&lt;a href=&quot;http://www.maspro.co.jp/contact/channel.pdf&quot;&gt;这里&lt;/a&gt;进行确认。&lt;/p&gt;
&lt;p&gt;另外，可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ recdvb --b25 --strip --http &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指令，在本地起一个服务器推送流，
使用VLC或者IINA可以打开&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://[IPアドレス]:8080/[channel number]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;channel number就是上边那个数字。&lt;/p&gt;
&lt;p&gt;但，在这之前，
需要在Ubuntu虚拟机的&lt;code&gt;/etc/hosts&lt;/code&gt;中设定连接者的ip域名（为了保证安全），
我的话并没有在外网访问Tuner Server的想法，并不需要这样的设定，因此修改源代码重新编译安装。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考 https://nyanonon.hatenablog.com/entries/2015/11/17&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;按下 &lt;code&gt;Ctrl+C&lt;/code&gt; 关闭推送流服务器。&lt;/p&gt;
&lt;h1&gt;安装mirakurun 建立Tuner Server&lt;/h1&gt;
&lt;p&gt;Mirakurun是一个Node.js编写的系统，具有同时多频道录像，多天线管理，优先度处理功能。
以及提供了各种API，以方便对应各种客户端的请求，在外网无法直接访问服务器也可以管理预约录制节目等。&lt;/p&gt;
&lt;p&gt;安装Mirakurun可以参照&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Mirakurun/blob/master/doc/Platforms.md&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以下内容方便参照部分搬运&lt;/p&gt;
&lt;h2&gt;安装 Node.js 10&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;请参照 https://github.com/nodesource/distributions/blob/master/README.md#debinstall&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装 PM2&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo npm install pm2 -g
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装Mirakurun主程序&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo npm install mirakurun -g --unsafe-perm --production
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置Mirakurun&lt;/h2&gt;
&lt;p&gt;主要是对Tuner进行配置，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mirakurun config tuners
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里卡了很久，一直没法成功录制，但最终注释掉了一些奇怪的配置就搞定了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: PX-S1UD-1
  types:
    - GR
  command: recdev --b25 --strip &amp;lt;channel&amp;gt; - -
  isDisabled: false
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;mirakurun restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启mirakurun之后查看 pm2 log，如果没有错误正常开始Recording，表示搭建成功。&lt;/p&gt;
&lt;p&gt;频道的话对Tuner设置成功之后会自己更新频道并更新节目列表，因此无需其他操作，一个天线的情况下耐心等待5分钟到10分钟左右即可。&lt;/p&gt;
&lt;p&gt;到这里为止，我们所有服务端的设置基本就完成了，Mirakurun本身已经提供了API，可以通过API进行调用获得节目信息或者录制，也提供了Http流推送，来方便其他客户端进行录制。&lt;/p&gt;
&lt;p&gt;API使用等可以参阅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Mirakurun&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;安装Chinachu以及ffmpeg等软件&lt;/h1&gt;
&lt;p&gt;我们需要一个可视化客户端来帮助我们管理预约，对Mirakurun进行下达命令。
于是我们需要安装Chinachu。&lt;/p&gt;
&lt;p&gt;由于这里开始，我们可以在Docker中也能完成这样的任务，搭建过程就省略，取而代之大家可以到&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/xingoxu/docker-chinachu-vaapi-ffmpeg&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查看DockerFile，或者参照DockerFile自行编写自己需要的脚本来进行搭建Chinachu。&lt;/p&gt;
&lt;p&gt;如果读者按照我的镜像进行搭建，需要注意如下（自己编写Docker脚本时也需注意一些Docker问题）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时区问题
&lt;ul&gt;
&lt;li&gt;需要挂载 &lt;code&gt;/etc/localtime:/etc/localtime:ro&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chinachu 的预约/设置数据
&lt;ul&gt;
&lt;li&gt;挂载如下文件与目录以防止容器重建丢失数据、&lt;/li&gt;
&lt;li&gt;./chinachu/data:/chinachu/data&lt;/li&gt;
&lt;li&gt;./chinachu/rules.json:/chinachu/rules.json&lt;/li&gt;
&lt;li&gt;./chinachu/config.json:/chinachu/config.json&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;日志问题
&lt;ul&gt;
&lt;li&gt;Chinachu和pm2已经自带日志，就不需要Docker再帮我们兜一层日志了&lt;/li&gt;
&lt;li&gt;编写启动脚本 并设置入口点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

npm install
pm2-runtime processes.json &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;不要忘记挂载录像目录
&lt;ul&gt;
&lt;li&gt;/volume2/TVRecorded:/chinachu/recorded&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不要忘记暴露端口&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置Chinachu设置&lt;/h2&gt;
&lt;p&gt;Chinachu的官方配置文档在这里&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Chinachu/wiki/Gamma-Configuration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基本没有什么太多需要注意的，将预设内容拷贝一份挂载进Docker就可以。&lt;/p&gt;
&lt;p&gt;需要注意vaapi相关内容，下述。&lt;/p&gt;
&lt;p&gt;之后就启动Docker容器吧，启动脚本就请各位自行挂载并启动了
也可以使用docker-compose来启动，&lt;code&gt;docker-compose up&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;搭建成功&lt;/h2&gt;
&lt;p&gt;输入 NAS 地址和端口号后进入Chinachu界面并能看到节目表基本就算成功了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g336sgurv5j224s17k1ky.jpg&quot; alt=&quot;节目表&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;添加录制后转码脚本&lt;/h2&gt;
&lt;p&gt;录制后是m2ts的TS文件，我们可以利用 NAS 闲暇 CPU （x86架构的 nas 基本都具有硬件加速）将 TS 文件转换成 mp4，缩小文件体积保存等。&lt;/p&gt;
&lt;p&gt;需要注意的是，如果我们需要使用vaapi（Intel CPU的硬件加速解码），那么我们在启动Docker时需要使用root权限，否则无法访问 &lt;code&gt;/dev/dri/renderD128&lt;/code&gt;硬件。&lt;/p&gt;
&lt;p&gt;但是录制后的文件的所有者就会变成root，其他应用程序读取或修改的时候会有一些问题，因此我推荐在录制后，转码后，可以自己编写脚本来重新设置权限。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ chown &amp;lt;uid&amp;gt;:&amp;lt;gid&amp;gt; &amp;lt;/path/to/file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ffmpeg的相关参数我在这里贴出自己的进行共享，你当然也可以参照官方文档进行调整。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ffmpeg \
  -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device intel -filter_hw_device intel \
  -i /path/to/recorded/file \
  -analyzeduration 30M -probesize 30M \
  -vf &apos;format=nv12|vaapi,hwupload,deinterlace_vaapi&apos; \
  -c:v h264_vaapi  \
  -threads 4 \
  /path/to/output/file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注：这里的环境PATH比较微妙，请一定使用绝对路径。&lt;/p&gt;
&lt;p&gt;我写了一个 shell 脚本，将脚本命名成你喜欢的名称，假设 &lt;code&gt;afterRecord&lt;/code&gt; ，不要忘记赋予执行权限，在 &lt;code&gt;config.json&lt;/code&gt; 中修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;recordedCommand&quot;: &quot;./userScripts/afterRecord&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以根据自己需求修改转码设置，或者添加LINE通知等功能，打造属于自己的录像服务器。&lt;/p&gt;
&lt;h1&gt;另外一些配置&lt;/h1&gt;
&lt;h2&gt;给WebGUI设置访问权限&lt;/h2&gt;
&lt;p&gt;直接把 WebGUI 暴露在公网上还是很危险的，我们给界面添加一个密码输入，保证录像服务器只能自己用。&lt;/p&gt;
&lt;p&gt;由于我用了 docker-compose ，可以很方便的添加 nginx 并设置反代&lt;/p&gt;
&lt;h3&gt;生成密码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ sudo htpasswd -c /path/to/.htpasswd &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;拷贝至服务器&lt;/h3&gt;
&lt;p&gt;在服务器上直接生成的可以跳过&lt;/p&gt;
&lt;h3&gt;修改nginx 配置 重启 docker&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;......
location / {
    proxy_pass   http://localhost:5601;
    auth_basic &quot; Basic Authentication &quot;;      
    auth_basic_user_file &quot;/etc/nginx/.htpasswd&quot;;       
}
.....
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ docker-compose restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刷新界面，此时应该被要求输入密码&lt;/p&gt;
&lt;h2&gt;添加索引&lt;/h2&gt;
&lt;p&gt;通过自己的脚本来创建的文件群晖是无法增加索引的，以至于在DLNA广播中无法显示我们转码或者录制的文件&lt;/p&gt;
&lt;p&gt;假设我们的录像文件直接存储在&lt;code&gt;/path/to/record/folder&lt;/code&gt;下面，我们可以编写脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

cd /path/to/record/folder

for mediafile in $(find /path/to/record/folder -maxdepth 1 -type f -mmin -&amp;lt;minutes&amp;gt; -not -name .DS_Store)
	do
		synoindex -a $mediafile
	done

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中第三行 &lt;code&gt;cd&lt;/code&gt; 不可漏去，否则群晖不会在此文件夹中执行 &lt;code&gt;find&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;保存脚本，假设 &lt;code&gt;reindexTVRecorded&lt;/code&gt;，在 &lt;code&gt;控制面板 - 任务计划 - 新增 - 计划任务 - 用户脚本&lt;/code&gt;，输入计划，输入任务运行脚本保存即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/005BYqpggy1g336q15opxj31bx0u0wmy.jpg&quot; alt=&quot;重新索引&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;存在的问题（没有实现的需求）&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;字幕
&lt;ul&gt;
&lt;li&gt;有部分电视台同时放送字幕，录制的TS是有字幕的，可以在VLC确认到&lt;/li&gt;
&lt;li&gt;但没有办法使用网上的通用方法比如assdumper提取出来，提取出来是空的&lt;/li&gt;
&lt;li&gt;暂时没有尝试使用 &lt;code&gt;Caption2Ass.exe&lt;/code&gt;等windows程序&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多国声道
&lt;ul&gt;
&lt;li&gt;存在两个问题&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;使用双声道在单声道中分别放送两个国家的音源（多存在于NHK新闻）&lt;/li&gt;
&lt;li&gt;使用多个流推送多国声道&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;无论哪种情况，使用了网上的无论哪种包括
&lt;code&gt;-filter_complex channelsplit&lt;/code&gt; 或者
&lt;code&gt;-dual_mono_mode main&lt;/code&gt;
都无法成功解决&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对以上问题如果有办法解决的读者请联系我 m__m&lt;/p&gt;
&lt;h1&gt;结束&lt;/h1&gt;
&lt;p&gt;在手中有NAS的情况下1w不到搭建一个这样的录像服务器还是性价比很高的，之后就可以随时随地观看一些并不那么需要大屏幕观看的内容。&lt;/p&gt;
&lt;p&gt;文章中还是充满了自己自身的需求，另外文章编写的时候已经间隔搭建完差不多有一个月左右的时间，有些细节可能没有办法很到位描写清楚，如果你有什么问题，可以在评论区留言。&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/shotasano/items/3809b8f3e0b62d51d3c3&quot;&gt;Raspberry Pi 3+Chinachuで地デジ録画サーバー構築&lt;/a&gt;
&lt;a href=&quot;https://ywnb.net/p/201612/3264&quot;&gt;Linuxの自宅サーバをテレビ化して家中どこでもテレビが見れる環境を作ろう(2)&lt;/a&gt;
&lt;a href=&quot;https://www.jianshu.com/p/e62c2a1cd3ab&quot;&gt;通过Nginx反向代理配置Basic Authentication实现kibana的访问安全&lt;/a&gt;
&lt;a href=&quot;http://arc680.hatenablog.jp/entry/2017/01/31/005135&quot;&gt;2017/01/30 時点での録画サーバ構築手順&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Synology NASに自宅で録画サーバーを立てました</title><link>https://blog.xingoxu.com/ja/2019/05/2019-05-16-record-jp-digital-tv-on-nas/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2019/05/2019-05-16-record-jp-digital-tv-on-nas/</guid><description># なぜNASに

NASを持ってる方多いと思いますし、NASは24時間起動してるので、新しいデバイス買わなく節電できて録画サービスを任せろう。

# 使うもの

- Synology NAS 一台
  - アンテナを接続してリコードする
  - DockerとVirtual Machine Manager対応機種 （[機種一覧](https://www.synology.com/en-us/dsm/packages/Virtualization)）
- PLEX USB地上波アンテナ PX-S1UD V2.0
  - 初心者に優しい地デジアンテナ
  - 高くない、4530円
  - 1チャンネルのみの視聴、録画が可能、買い足して同時受信チャンネルが増やせる
  - [買う](https://www.amazon.co.jp/gp/product/B0141NFWSG/)
- SCM IC读卡器
  - B-CASカードの読み取り用、1000円ぐらい
  - [買う](https://www.amazon.co.jp/gp/product/B0085H4YZC/)
  - 型番は同じではないかも、SCMじゃないやつ届けられたら自己調整必要
  - SoftCASも使えるらしいが、私は使わない
- HDD
  - 録画した映像保存用
- B-CAS カード
  - テストはテレビから借りるのはいいと思います
  - アマゾンにも誰が売ってるらしいが、自己責任でお願いします
- アンテナ分波器 / 分配器 、接続線
  - TVと同時視聴するため。必須ではない。

</description><pubDate>Thu, 16 May 2019 15:47:37 GMT</pubDate><content:encoded>&lt;h1&gt;なぜNASに&lt;/h1&gt;
&lt;p&gt;NASを持ってる方多いと思いますし、NASは24時間起動してるので、新しいデバイス買わなく節電できて録画サービスを任せろう。&lt;/p&gt;
&lt;h1&gt;使うもの&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Synology NAS 一台
&lt;ul&gt;
&lt;li&gt;アンテナを接続してリコードする&lt;/li&gt;
&lt;li&gt;DockerとVirtual Machine Manager対応機種 （&lt;a href=&quot;https://www.synology.com/en-us/dsm/packages/Virtualization&quot;&gt;機種一覧&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PLEX USB地上波アンテナ PX-S1UD V2.0
&lt;ul&gt;
&lt;li&gt;初心者に優しい地デジアンテナ&lt;/li&gt;
&lt;li&gt;高くない、4530円&lt;/li&gt;
&lt;li&gt;1チャンネルのみの視聴、録画が可能、買い足して同時受信チャンネルが増やせる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B0141NFWSG/&quot;&gt;買う&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SCM IC读卡器
&lt;ul&gt;
&lt;li&gt;B-CASカードの読み取り用、1000円ぐらい&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/B0085H4YZC/&quot;&gt;買う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;型番は同じではないかも、SCMじゃないやつ届けられたら自己調整必要&lt;/li&gt;
&lt;li&gt;SoftCASも使えるらしいが、私は使わない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HDD
&lt;ul&gt;
&lt;li&gt;録画した映像保存用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;B-CAS カード
&lt;ul&gt;
&lt;li&gt;テストはテレビから借りるのはいいと思います&lt;/li&gt;
&lt;li&gt;アマゾンにも誰が売ってるらしいが、自己責任でお願いします&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アンテナ分波器 / 分配器 、接続線
&lt;ul&gt;
&lt;li&gt;TVと同時視聴するため。必須ではない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;注意&lt;/h1&gt;
&lt;p&gt;記事書く時点だけの有効性を保証します、エンドユーザー、コンピュータ初心者向けではない。
以下の手順は全て自己責任で、何かしらの問題が発生しても自力で対処できる方のみ実行してください。
テレビ番組のコピー、配信は違法となる場合があります。使用についても十分注意して下さい。
この記事を参考にしたことにより生じたあらゆる損害について、著者は一切の責任を負いません。&lt;/p&gt;
&lt;h1&gt;構造&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/005BYqpggy1g336pg2yuyj30fm0akgm2.jpg&quot; alt=&quot;架构&quot; /&gt;&lt;/p&gt;
&lt;p&gt;大体こういう感じでやっていきたいと思います。&lt;/p&gt;
&lt;h1&gt;NAS の準備&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Dockerをインストール&lt;/li&gt;
&lt;li&gt;Virtual Machine Manager　をインストール&lt;/li&gt;
&lt;li&gt;VMM に Ubuntu 16.04/18.04をインストール
&lt;ul&gt;
&lt;li&gt;他のLinux Distrubtionもできるかも、本記事はUbuntu 18.04で説明します&lt;/li&gt;
&lt;li&gt;Linuxのカーネルは3.15を越えないといけない（理由あと説明）&lt;/li&gt;
&lt;li&gt;LANのみアクセスできるように設定するのはおすすめ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;アンテナ設置&lt;/h1&gt;
&lt;p&gt;VMにアンテナのドライバをインストールします&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完了。&lt;/p&gt;
&lt;p&gt;アンテナドライバ最低3.15のLinux カーネル必要なので、Synology NASのLinuxカーネルは3.10なのでVMを立って使います。&lt;/p&gt;
&lt;p&gt;もし今後 NAS のカーネルが3.15以上になったら、次回 https://github.com/Chinachu/docker-mirakurun-chinachu の Docker イメージを使ってみたいと思います。&lt;/p&gt;
&lt;h1&gt;カードリーダーとB-CASの準備&lt;/h1&gt;
&lt;p&gt;カードリーダーソフトとビルドツールのパッケージをインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install build-essential git cmake g++
$ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完了後、&lt;code&gt;sudo pcsc_scan&lt;/code&gt; を実行して、&lt;code&gt;Japanese Chijou Digital B-CAS Card (pay TV)&lt;/code&gt;みたいものでたら完成です。&lt;/p&gt;
&lt;p&gt;しかし、私はここ２つ問題遭った、
１つ目は入れ間違えたww、
２つ目はB-CASカード無効問題、B-CASカードを最初にテレビに入れて見てみたら多分分かると思います。&lt;/p&gt;
&lt;p&gt;型番も問題になるかもしれない、参考した記事の作家さんは遭ったのでそちらの記事をお越しいただければと思います。&lt;/p&gt;
&lt;h1&gt;B-CASのデコード用ライブラリのインストール&lt;/h1&gt;
&lt;p&gt;日本の地デジ放送は暗号化された状態で配信されているため、そのまま受信して保存すると再生や複製の際に問題が起こる。そこで、B-CASカードの情報を使って受信と同時に復号するのが望ましい。これを実現するライブラリがlibarib25だ。&lt;/p&gt;
&lt;p&gt;コンパイル必要です&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master.zip
$ cd libarib25-master
$ cmake .
$ make
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;インストール完了です。&lt;/p&gt;
&lt;h1&gt;録画用コマンドのインストール&lt;/h1&gt;
&lt;p&gt;録画ソフトはこれを使って録画しますので、recdvbをインストールします。
ソースコードあるんけど、Githubに載っていない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
$ tar xvzf recdvb-1.3.2.tgz
$ cd recdvb-1.3.2
$ ./autogen.sh
$ ./configure --enable-b25
$ make 
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;インストール完了。&lt;/p&gt;
&lt;p&gt;この時点で、コマンドでの録画が可能になった。例えば、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ recdvb --b25 --strip &amp;lt;channel&amp;gt; &amp;lt;seconds&amp;gt; test.m2ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;チャンネルは受信タワーによる違いますので、&lt;a href=&quot;http://www.maspro.co.jp/contact/channel.pdf&quot;&gt;こちら&lt;/a&gt;から確認できます。&lt;/p&gt;
&lt;p&gt;また、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ recdvb --b25 --strip --http &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;を使ったらリアルタイムストリーミングを配信します。&lt;/p&gt;
&lt;p&gt;Windows / MacのVLCかMacのIINAからURLを開いたら直接見れます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://[IPアドレス]:8080/[channel number]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;チャンネルは上と同じです。&lt;/p&gt;
&lt;p&gt;だが、その前に、
VMの&lt;code&gt;/etc/hosts&lt;/code&gt;を設定しなければいけない（安全保障かな）、
でも私のチューナーサーバーはWANに公開するつもりはないので下のリンクを参考して解除しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://nyanonon.hatenablog.com/entries/2015/11/17&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;Ctrl+C&lt;/code&gt; を押して終了させます。&lt;/p&gt;
&lt;h1&gt;Mirakurunをインストールしてチューナーサーバーを立ちます&lt;/h1&gt;
&lt;p&gt;チューナーサーバーMirakurunではWeb APIを提供して、録画コマンドの並列処理や、複数チューナーの管理、優先度処理など様々な機能が利用できます。
Mirakurunのクライエントを通じて外でも番組を予約もできる。&lt;/p&gt;
&lt;p&gt;Mirakurunのインストールはこちらへ参考していただければと思います。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Mirakurun/blob/master/doc/Platforms.md&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ざっくりここで書きます&lt;/p&gt;
&lt;h2&gt;Node.js 10 をインストール&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;请参照 https://github.com/nodesource/distributions/blob/master/README.md#debinstall&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;PM2をインストール&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo npm install pm2 -g
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mirakurun メインプログラムインストール&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo npm install mirakurun -g --unsafe-perm --production
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mirakurun を設定&lt;/h2&gt;
&lt;p&gt;Tuner設定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mirakurun config tuners
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここで半日間かかった！わけわからんパラメーターを抜いたら使えました！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: PX-S1UD-1
  types:
    - GR
  command: recdev --b25 --strip &amp;lt;channel&amp;gt; - -
  isDisabled: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mirakurun再起動します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mirakurun restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pm2 log&lt;/code&gt; で状況を見てみましょう、特になんのエラーが出てなく、&lt;code&gt;Recording&lt;/code&gt; が出たら多分大丈夫です。&lt;/p&gt;
&lt;p&gt;チャンネルの設定は Mirakurun は自分が取得しますので、5-10分ぐらい待てばいい。&lt;/p&gt;
&lt;p&gt;ここまでチューナーサーバーの設定は完了しました。
MirakurunはAPIとHttp Streamingも提供してるので、
APIの使用はここへ&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Mirakurun&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Chinachu / ffmpeg をインストールする&lt;/h1&gt;
&lt;p&gt;でもGUIクライエントがないとめんどくさい、Chinachuをインストールします。&lt;/p&gt;
&lt;p&gt;Dockerのイメージを作りましたので、DockerFile参照して使うか、自分がカストマイズするもよい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/xingoxu/docker-chinachu-vaapi-ffmpeg&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;もし私のDockerFileを参照して立ているなら、下記を注意してください。
（Dockerを利用する方も見るといい）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タイムゾーン問題
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/localtime:/etc/localtime:ro&lt;/code&gt;をマウント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chinachu の予約、設定データ
&lt;ul&gt;
&lt;li&gt;下記のファイルとフォルダをマウントしてデータを保存しましょう&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./chinachu/data:/chinachu/data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./chinachu/rules.json:/chinachu/rules.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./chinachu/config.json:/chinachu/config.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;膨大ログ問題
&lt;ul&gt;
&lt;li&gt;Chinachuとpm2はログ入ってるから、Dockerのログはいらない、エラーだけを出力させろう&lt;/li&gt;
&lt;li&gt;下記スクリプトを書いて保存して入り口を設定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

npm install
pm2-runtime processes.json &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;録画ファルダのマウントをお忘れなく
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/volume2/TVRecorded:/chinachu/recorded&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ポートの公開&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chinachu 設定&lt;/h2&gt;
&lt;p&gt;公式ドキュメント&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://github.com/Chinachu/Chinachu/wiki/Gamma-Configuration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基本、コピーしてちょっとカストマイズすれば大丈夫。&lt;/p&gt;
&lt;p&gt;VAAPIについてはあとトランスコードの部分で説明します。&lt;/p&gt;
&lt;p&gt;それで、Dockerを起動して、
&lt;code&gt;docker-compose&lt;/code&gt;も利用可能ですので、自分のニーズをあわせてChinachuを起動します。&lt;/p&gt;
&lt;h2&gt;できましたか&lt;/h2&gt;
&lt;p&gt;NASのURLとポート番号をブラウザに入力して下の画面見れると成功です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1g336sgurv5j224s17k1ky.jpg&quot; alt=&quot;节目表&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;録画後のトランスコード&lt;/h2&gt;
&lt;p&gt;録画したファイルは大きな生TS、 大体 x86 アーキテクチャの NAS はハードウェアアクセラレーションついてるので、速いスピードでmp4にトランスコードして、どこでも見れるコーデックにしながら、ファイルサイズも小さくさせる。&lt;/p&gt;
&lt;p&gt;注意するべきのはDockerにvaapi（Intel CPUのハードウェアアクセラレーション）を使うと、rootの権限でアプリを走らないと行けない（&lt;code&gt;/dev/dri/renderD128&lt;/code&gt;をアクセスために）&lt;/p&gt;
&lt;p&gt;だがこうすると、録画したファイルはrootが所有者になって、他のアプリの編集は出来ないので、録画後、トランスコードした後、chownを走らせましょう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ chown &amp;lt;uid&amp;gt;:&amp;lt;gid&amp;gt; &amp;lt;/path/to/file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ffmpegのパラメーターも共有しますが、自分のニーズをあわせて公式ドキュメントを参照して調整できます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ffmpeg \
  -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device intel -filter_hw_device intel \
  -i /path/to/recorded/file \
  -analyzeduration 30M -probesize 30M \
  -vf &apos;format=nv12|vaapi,hwupload,deinterlace_vaapi&apos; \
  -c:v h264_vaapi  \
  -threads 4 \
  /path/to/output/file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：ここのPATHは絶対にフルパスを指定してください、そうじゃないと妙なところに行っちゃいますよ。&lt;/p&gt;
&lt;p&gt;名前をつけて、&lt;code&gt;afterRecord&lt;/code&gt;とし、 &lt;code&gt;config.json&lt;/code&gt; に&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  ...
  &quot;recordedCommand&quot;: &quot;./userScripts/afterRecord&quot;,
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;を編集して。&lt;/p&gt;
&lt;p&gt;自分のニーズ合わせてスクリプトをカストマイズして自分唯一無二のサーバーを作りましょう！
僕はLINE通知を入ってて録画したら通知がLINEに来ますね。&lt;/p&gt;
&lt;h1&gt;NASでやるべきのこと&lt;/h1&gt;
&lt;h2&gt;WebGUI パスワードをつける&lt;/h2&gt;
&lt;p&gt;WebGUIそのままWANに公開するとちょっと危ない、入るときパスワード機能を入れましょう、自分だけ入ることを確保しましょう。&lt;/p&gt;
&lt;p&gt;僕docker-compose を使ったから、すぐ nginx を追加できます。&lt;/p&gt;
&lt;h3&gt;パスワードを生成する&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ sudo htpasswd -c /path/to/.htpasswd &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;サーバーにコピーして&lt;/h3&gt;
&lt;p&gt;サーバーで生成する方はスキップー&lt;/p&gt;
&lt;h3&gt;nginx を設定して docker-compose 再起動&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;...
location / {
    proxy_pass   http://localhost:5601;
    auth_basic &quot; Basic Authentication &quot;;      
    auth_basic_user_file &quot;/etc/nginx/.htpasswd&quot;;       
}
...
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ docker-compose restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ブラウザをリフレッシュして、ここでパスワードが求められてるはずです。&lt;/p&gt;
&lt;h2&gt;NAS 再インデックス&lt;/h2&gt;
&lt;p&gt;自分のスクリプトで作ったファイルは NAS は知らないので、DLNAとかで出てこない。
そこで再インデックスする必要があります。&lt;/p&gt;
&lt;p&gt;仮にすべて録画したファイルは&lt;code&gt;/path/to/record/folder&lt;/code&gt;の第一層でいる、このようなスクリプトを書いて&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

cd /path/to/record/folder

for mediafile in $(find /path/to/record/folder -maxdepth 1 -type f -mmin -&amp;lt;minutes&amp;gt; -not -name .DS_Store)
	do
		synoindex -a $mediafile
	done

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;reindexTVRecorded&lt;/code&gt;を名前を付けて、 &lt;code&gt;Control Panel - Task - New - Scheduled - User Script&lt;/code&gt;、時間とか選択して、スクリプトのパス入れて「はい」を押したら完了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/005BYqpggy1g336q15opxj31bx0u0wmy.jpg&quot; alt=&quot;重新索引&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;残りの問題と課題&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;字幕
&lt;ul&gt;
&lt;li&gt;録画したTSはVLCで字幕見れますけど、どうすればsrtを抽出できる&lt;/li&gt;
&lt;li&gt;assdumper使ったけど、何も出てこない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Caption2Ass.exe&lt;/code&gt;などwindowsプログラムは使ってない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多国音声
&lt;ul&gt;
&lt;li&gt;２つの問題があって&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;ステレオで一つずつモノラル音声で２つ国の音声放送された（NHKニュースよくある）&lt;/li&gt;
&lt;li&gt;多ストリーミングで多国音声放送された&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-filter_complex channelsplit&lt;/code&gt; か
&lt;code&gt;-dual_mono_mode main&lt;/code&gt;
ネットによく見たパラメーターどっちを使ってもエラーが出ちゃう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;心当たりがある方教えていただければ幸いです！ m__m&lt;/p&gt;
&lt;h1&gt;最後&lt;/h1&gt;
&lt;p&gt;NASがある場合は5000ぐらいで立てるのはいいと思います、今後どこでもテレビを見れると嬉しい。&lt;/p&gt;
&lt;p&gt;記事の中は自分自身の特集のニーズいっぱい詰まってるし、記事を書くときも立てたから一ヶ月ぐらいがあって、抜けている箇所があるかもしれないし、変な日本語もあるかも、もし何が不明点があればコメントで書いてくださいー&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/shotasano/items/3809b8f3e0b62d51d3c3&quot;&gt;Raspberry Pi 3+Chinachuで地デジ録画サーバー構築&lt;/a&gt;
&lt;a href=&quot;https://ywnb.net/p/201612/3264&quot;&gt;Linuxの自宅サーバをテレビ化して家中どこでもテレビが見れる環境を作ろう(2)&lt;/a&gt;
&lt;a href=&quot;https://www.jianshu.com/p/e62c2a1cd3ab&quot;&gt;通过Nginx反向代理配置Basic Authentication实现kibana的访问安全&lt;/a&gt;
&lt;a href=&quot;http://arc680.hatenablog.jp/entry/2017/01/31/005135&quot;&gt;2017/01/30 時点での録画サーバ構築手順&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最後まで読んでいただきありがとうございました！&lt;/p&gt;
</content:encoded></item><item><title>心灵盟友 Buddy Complex 圣地巡礼</title><link>https://blog.xingoxu.com/2018/05/buddy-complex-seichijunrei/</link><guid isPermaLink="true">https://blog.xingoxu.com/2018/05/buddy-complex-seichijunrei/</guid><description>黄金周里因为自己喜欢的画手太太画了渡瀬青葉，所以又把一年前抛弃的 Buddy Complex 捡起来看了一下，意外的发现还挺好看的。全部看完后昨天圣地巡礼了一下。

这个动画也只有第一集是现实中出现的场景，后边都是未来在天上在船上并没有日本的景色。


# 千葉県習志野市

&lt;p&gt;&lt;/p&gt;

&lt;div&gt;

![通学路のカーブ](https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v6ybw31j21hc0u0kjt.jpg)&lt;/div&gt;&lt;div&gt;

![通学路のカーブ](https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73zuchj21kw0y5kjp.jpg)&lt;/div&gt;
&lt;div&gt;通学路のカーブ&lt;/div&gt;

非常遗憾自行车店好像在翻新，去年在Google Map上貌似还有的样子

&lt;br /&gt;

</description><pubDate>Sun, 13 May 2018 18:13:03 GMT</pubDate><content:encoded>&lt;p&gt;黄金周里因为自己喜欢的画手太太画了渡瀬青葉，所以又把一年前抛弃的 Buddy Complex 捡起来看了一下，意外的发现还挺好看的。全部看完后昨天圣地巡礼了一下。&lt;/p&gt;
&lt;p&gt;这个动画也只有第一集是现实中出现的场景，后边都是未来在天上在船上并没有日本的景色。&lt;/p&gt;
&lt;h1&gt;千葉県習志野市&lt;/h1&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v6ybw31j21hc0u0kjt.jpg&quot; alt=&quot;通学路のカーブ&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73zuchj21kw0y5kjp.jpg&quot; alt=&quot;通学路のカーブ&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;通学路のカーブ&lt;/div&gt;
&lt;p&gt;非常遗憾自行车店好像在翻新，去年在Google Map上貌似还有的样子&lt;/p&gt;
&lt;br /&gt;

&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v74bns8j21hc0u0u15.jpg&quot; alt=&quot;滑り台の公園&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73nt2sj21kw121e84.jpg&quot; alt=&quot;滑り台の公園&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;滑り台の公園&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v78ihtxj21hc0u07wp.jpg&quot; alt=&quot;小高商店信号機&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v71em5qj21kw108npd.jpg&quot; alt=&quot;小高商店信号機&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;小高商店信号機&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v7hhi18j21hc0u0npl.jpg&quot; alt=&quot;小高商店&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v7dvctbj21j515de82.jpg&quot; alt=&quot;小高商店&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;小高商店&lt;/div&gt;
&lt;p&gt;小高商店 2013 年的时候好像因为车站周围改造所以关店了，好遗憾&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvggz6j21hc0u04qx.jpg&quot; alt=&quot;津田沼駅5番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcrsid5j21kw0xb7wk.jpg&quot; alt=&quot;津田沼駅5番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅5番線&lt;/div&gt;
&lt;p&gt;非常遗憾的是，没有07:12往三鷹的电车与7:15的中野非始发电车，样式也并不是动画的样子。&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvkz1bj21hc0u0b2h.jpg&quot; alt=&quot;津田沼駅4番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcpd680j21kw13fqv5.jpg&quot; alt=&quot;津田沼駅4番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅4番線&lt;/div&gt;
&lt;p&gt;刚才还在5番線的但事实上这里的镜头确实是4番線向5番線方向的景色，但是左边的广告牌却是5番線的广告牌&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvkz1bj21hc0u0b2h.jpg&quot; alt=&quot;津田沼駅5番線の広告&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/05/13/5af80ae8da67b.jpg&quot; alt=&quot;津田沼駅5番線の広告&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅5番線の広告&lt;/div&gt;
&lt;h1&gt;東京都笹塚&lt;/h1&gt;
&lt;p&gt;接下来就是男主被追的场景，这里大多都一模一样。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypiy343j21hc0u0e89.jpg&quot; alt=&quot;富士見丘高校前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yphw1vrj21kw17pqv9.jpg&quot; alt=&quot;富士見丘高校前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;富士見丘高校前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypuq4ilj21hc0u0e89.jpg&quot; alt=&quot;電気屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yprlci2j21kw0zz4qs.jpg&quot; alt=&quot;電気屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;電気屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yq0qqmdj21hc0u0x6w.jpg&quot; alt=&quot;松屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypt0zd0j21kw15cu0z.jpg&quot; alt=&quot;松屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;松屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypym75nj21hc0u0e89.jpg&quot; alt=&quot;みのん歯科医院前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypwxe3bj21kw0vxb2b.jpg&quot; alt=&quot;みのん歯科医院前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;みのん歯科医院前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yr9psyzj21hc0u0kjt.jpg&quot; alt=&quot;お茶屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yr9386bj21kw1634qr.jpg&quot; alt=&quot;お茶屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;お茶屋前&lt;/div&gt;
TDK 变成了 alba，也是很久以前就变了的貌似
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrjdl0nj21hc0u0he1.jpg&quot; alt=&quot;栄湯の脇&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yres6h2j21kw0x2u11.jpg&quot; alt=&quot;栄湯の脇&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;栄湯の脇&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrmijcgj21hc0u0e89.jpg&quot; alt=&quot;国道20号 不動産屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrlen9dj21kw16ohdw.jpg&quot; alt=&quot;国道20号 不動産屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号 不動産屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr9vhnh93jj21hc0u0u14.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr9vid1c5ij23402454qw.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrwh3lyj21hc0u01l5.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrqaqqvj21kw0rz7wk.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr9vjz73pqj21hc0u07wp.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr9vkbwy2aj22c00sab2a.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu1hgwgj21hc0u0b2h.jpg&quot; alt=&quot;笹塚交差点 DARUMA前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ytgi9rnj21kw16ox6s.jpg&quot; alt=&quot;笹塚交差点 DARUMA前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点 DARUMA前&lt;/div&gt;
&lt;p&gt;だるま 2013 年关店的，不过其他的地方都能对上&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yucd8gxj21hc0u04qx.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu0t3xrj21kw151hdv.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yuhfjedj21hc0u0e89.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu5ays1j21kw13mnpe.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yuhws22j21hc0u07wp.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yucijqmj21kw1umnph.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv6tavtj21hc0u0qvc.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvag3s3j21kw14bx6t.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;从这里开始难度就变得好高，大家凑合看吧&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvs0kenj21hc0u07wp.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv3hcd2j21kw23v7wj.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;高架电车没有地方能拍，就跑的稍微远了一点，不过还是没能拍好&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvuux58j21hc0u0u14.jpg&quot; alt=&quot;高架の鉄道&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv73ha9j20o20eudri.jpg&quot; alt=&quot;高架の鉄道&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架の鉄道&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvypfwhj21hc0u0he1.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvw28eoj21kw1kunph.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;正在制作 valiancer 的中◯屋工厂&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywfvp14j21hc0u0b2h.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywiii13j21kw12tu10.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;大山交差点这里并没有完全按照现实世界的布景画&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywsysjhj21hc0u0e89.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywsbvdpj21kw16oqv7.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yxg5vp6j21hc0u0b2h.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yx5v5kej21kw16ob2b.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yxhyrcfj21hc0u04qx.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yyb62p3j20n00eagv4.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yz7327tj21hc0u0b2h.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yz1jo80j21kw16o1l0.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;p&gt;到这里就全部结束啦，顺带一提主人公的家是真实存在的，不过因为私人房屋的原因不会上传到SNS等地方，如果有兴趣的访问的话也请一定不要给对方带来困扰。&lt;/p&gt;
&lt;p&gt;Google Maps：https://drive.google.com/open?id=1fTiF9I8exv6jFB-86H49elu6EntfaA1q&amp;amp;usp=sharing&lt;/p&gt;
</content:encoded></item><item><title>バディ・コンプレックス 聖地巡礼</title><link>https://blog.xingoxu.com/ja/2018/05/buddy-complex-seichijunrei/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2018/05/buddy-complex-seichijunrei/</guid><description>GWなか好きな絵描きさんが渡瀬青葉を描きましたので、一年前見放したバディ・コンプレックスをまた見ていて、意外といい作品と思っています。
全部見ました昨日聖地巡礼しました。

1話ラストで未来へ行ってしまって以来、完結編の最後に至っても2014年の東京、千葉の景色が再度登場することはありませんでした
なお本作品の舞台には高校や閑静な住宅街を含みます。もし訪問される際は現地の方へ最大限配慮して行動されるようお願いしたく思います。

# 千葉県習志野市
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;

![通学路のカーブ](https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v6ybw31j21hc0u0kjt.jpg)&lt;/div&gt;&lt;div&gt;

![通学路のカーブ](https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73zuchj21kw0y5kjp.jpg)&lt;/div&gt;
&lt;div&gt;通学路のカーブ&lt;/div&gt;

津田沼サイクルなくなった、リニューアル中みたいです、グーグルマップによる去年まだあるらしい、残念

&lt;br /&gt;

</description><pubDate>Sun, 13 May 2018 18:13:03 GMT</pubDate><content:encoded>&lt;p&gt;GWなか好きな絵描きさんが渡瀬青葉を描きましたので、一年前見放したバディ・コンプレックスをまた見ていて、意外といい作品と思っています。
全部見ました昨日聖地巡礼しました。&lt;/p&gt;
&lt;p&gt;1話ラストで未来へ行ってしまって以来、完結編の最後に至っても2014年の東京、千葉の景色が再度登場することはありませんでした
なお本作品の舞台には高校や閑静な住宅街を含みます。もし訪問される際は現地の方へ最大限配慮して行動されるようお願いしたく思います。&lt;/p&gt;
&lt;h1&gt;千葉県習志野市&lt;/h1&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v6ybw31j21hc0u0kjt.jpg&quot; alt=&quot;通学路のカーブ&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73zuchj21kw0y5kjp.jpg&quot; alt=&quot;通学路のカーブ&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;通学路のカーブ&lt;/div&gt;
&lt;p&gt;津田沼サイクルなくなった、リニューアル中みたいです、グーグルマップによる去年まだあるらしい、残念&lt;/p&gt;
&lt;br /&gt;

&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v74bns8j21hc0u0u15.jpg&quot; alt=&quot;滑り台の公園&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v73nt2sj21kw121e84.jpg&quot; alt=&quot;滑り台の公園&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;滑り台の公園&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v78ihtxj21hc0u07wp.jpg&quot; alt=&quot;小高商店信号機&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v71em5qj21kw108npd.jpg&quot; alt=&quot;小高商店信号機&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;小高商店信号機&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v7hhi18j21hc0u0npl.jpg&quot; alt=&quot;小高商店&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8v7dvctbj21j515de82.jpg&quot; alt=&quot;小高商店&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;小高商店&lt;/div&gt;
&lt;p&gt;小高商店もなくなった、調べたら2013年の時駅周辺改造のため、本当残念&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvggz6j21hc0u04qx.jpg&quot; alt=&quot;津田沼駅5番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcrsid5j21kw0xb7wk.jpg&quot; alt=&quot;津田沼駅5番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅5番線&lt;/div&gt;
&lt;p&gt;07:12の三鷹行き電車と07:15の中野行き非津田沼駅始発電車はない、仕様もアニメのものではない。&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvkz1bj21hc0u0b2h.jpg&quot; alt=&quot;津田沼駅4番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcpd680j21kw13fqv5.jpg&quot; alt=&quot;津田沼駅4番線&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅4番線&lt;/div&gt;
&lt;p&gt;作中では5番線になっているが実際描かれていたのは4番線からの景色。でも左端に写っているユザワヤの広告は５番線の広告。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8vcvkz1bj21hc0u0b2h.jpg&quot; alt=&quot;津田沼駅5番線の広告&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/05/13/5af80ae8da67b.jpg&quot; alt=&quot;津田沼駅5番線の広告&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;津田沼駅5番線の広告&lt;/div&gt;
&lt;h1&gt;東京都笹塚&lt;/h1&gt;
&lt;p&gt;これからは主人公追われた景色。大体一緒です。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypiy343j21hc0u0e89.jpg&quot; alt=&quot;富士見丘高校前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yphw1vrj21kw17pqv9.jpg&quot; alt=&quot;富士見丘高校前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;富士見丘高校前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypuq4ilj21hc0u0e89.jpg&quot; alt=&quot;電気屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yprlci2j21kw0zz4qs.jpg&quot; alt=&quot;電気屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;電気屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8yq0qqmdj21hc0u0x6w.jpg&quot; alt=&quot;松屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypt0zd0j21kw15cu0z.jpg&quot; alt=&quot;松屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;松屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypym75nj21hc0u0e89.jpg&quot; alt=&quot;みのん歯科医院前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr8ypwxe3bj21kw0vxb2b.jpg&quot; alt=&quot;みのん歯科医院前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;みのん歯科医院前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yr9psyzj21hc0u0kjt.jpg&quot; alt=&quot;お茶屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yr9386bj21kw1634qr.jpg&quot; alt=&quot;お茶屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;お茶屋前&lt;/div&gt;
TDKからalbaになっちゃった、多分も大昔の事
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrjdl0nj21hc0u0he1.jpg&quot; alt=&quot;栄湯の脇&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yres6h2j21kw0x2u11.jpg&quot; alt=&quot;栄湯の脇&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;栄湯の脇&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrmijcgj21hc0u0e89.jpg&quot; alt=&quot;国道20号 不動産屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrlen9dj21kw16ohdw.jpg&quot; alt=&quot;国道20号 不動産屋前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号 不動産屋前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr9vhnh93jj21hc0u0u14.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr9vid1c5ij23402454qw.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrwh3lyj21hc0u01l5.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yrqaqqvj21kw0rz7wk.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr9vjz73pqj21hc0u07wp.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fr9vkbwy2aj22c00sab2a.jpg&quot; alt=&quot;国道20号&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;国道20号&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu1hgwgj21hc0u0b2h.jpg&quot; alt=&quot;笹塚交差点 DARUMA前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ytgi9rnj21kw16ox6s.jpg&quot; alt=&quot;笹塚交差点 DARUMA前&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点 DARUMA前&lt;/div&gt;
&lt;p&gt;だるま 2013 年閉店ですが、他の施設ちゃんと合った。&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yucd8gxj21hc0u04qx.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu0t3xrj21kw151hdv.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yuhfjedj21hc0u0e89.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yu5ays1j21kw13mnpe.jpg&quot; alt=&quot;笹塚交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;笹塚交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yuhws22j21hc0u07wp.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yucijqmj21kw1umnph.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv6tavtj21hc0u0qvc.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvag3s3j21kw14bx6t.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;難易度高くなった&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvs0kenj21hc0u07wp.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv3hcd2j21kw23v7wj.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;高架の電車はどこでも取れないから、ちょっと遠いから取ったけど、良くないね&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvuux58j21hc0u0u14.jpg&quot; alt=&quot;高架の鉄道&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yv73ha9j20o20eudri.jpg&quot; alt=&quot;高架の鉄道&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架の鉄道&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvypfwhj21hc0u0he1.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yvw28eoj21kw1kunph.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;ヴァリアンサーを生産している中◯屋工場です&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywfvp14j21hc0u0b2h.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywiii13j21kw12tu10.jpg&quot; alt=&quot;高架下&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;高架下&lt;/div&gt;
&lt;p&gt;大山交差点周りは今までと違ってあまり実際の景色に忠実ではない様子。看板や窓の形など、細かいパーツが一致する程度でしかありませんでした。&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywsysjhj21hc0u0e89.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8ywsbvdpj21kw16oqv7.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yxg5vp6j21hc0u0b2h.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yx5v5kej21kw16ob2b.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yxhyrcfj21hc0u04qx.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yyb62p3j20n00eagv4.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yz7327tj21hc0u0b2h.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7ely1fr8yz1jo80j21kw16o1l0.jpg&quot; alt=&quot;大山交差点&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大山交差点&lt;/div&gt;
&lt;p&gt;ここまで全部終わりました、ちなみに主人公の家は本当に存在している、個人宅なので掲載はしません、興味があれば訪れる時絶対迷惑かけないように&lt;/p&gt;
&lt;p&gt;最後までご閲覧いただきありがとうございました。&lt;/p&gt;
&lt;p&gt;Google Maps：https://drive.google.com/open?id=1fTiF9I8exv6jFB-86H49elu6EntfaA1q&amp;amp;usp=sharing&lt;/p&gt;
</content:encoded></item><item><title>推特 Account Activity API 使用体验</title><link>https://blog.xingoxu.com/2018/04/twitter-account-activity-api/</link><guid isPermaLink="true">https://blog.xingoxu.com/2018/04/twitter-account-activity-api/</guid><description>前几天使用了一下推特的 Account Activity API，这个 API 支持注册一个 webhook，用于接受授权账户的实时活动（推特文，事件，设置）。

包括以下内容：
- 推特内容
- at 提醒
- 回复
- 转发
- 带评论转发
- 点赞
- 发出的私信和接收到的私信
- 关注
- 拉黑
- 屏蔽
- 阅读回执

在试用的过程中，碰到了一些问题，做一个整理。

</description><pubDate>Mon, 30 Apr 2018 20:59:43 GMT</pubDate><content:encoded>&lt;p&gt;前几天使用了一下推特的 Account Activity API，这个 API 支持注册一个 webhook，用于接受授权账户的实时活动（推特文，事件，设置）。&lt;/p&gt;
&lt;p&gt;包括以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;推特内容&lt;/li&gt;
&lt;li&gt;at 提醒&lt;/li&gt;
&lt;li&gt;回复&lt;/li&gt;
&lt;li&gt;转发&lt;/li&gt;
&lt;li&gt;带评论转发&lt;/li&gt;
&lt;li&gt;点赞&lt;/li&gt;
&lt;li&gt;发出的私信和接收到的私信&lt;/li&gt;
&lt;li&gt;关注&lt;/li&gt;
&lt;li&gt;拉黑&lt;/li&gt;
&lt;li&gt;屏蔽&lt;/li&gt;
&lt;li&gt;阅读回执&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在试用的过程中，碰到了一些问题，做一个整理。&lt;/p&gt;

&lt;h1&gt;应用中心创建应用&lt;/h1&gt;
&lt;p&gt;首先需要到 https://apps.twitter.com/ 在这里按提示创建应用，获得应用的 key 与 Secret。&lt;/p&gt;
&lt;h1&gt;申请 Account Activity API 试用权限&lt;/h1&gt;
&lt;p&gt;https://developer.twitter.com/en/apply
到这里按照提示申请API权限，并附上 app ID（app ID相关解释：https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/overview ）&lt;/p&gt;
&lt;p&gt;申请完成后会收到邮件
&lt;img src=&quot;https://i.loli.net/2018/04/30/5ae7000843f53.png&quot; alt=&quot;申请成功回执&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注册 webhook&lt;/h1&gt;
&lt;h2&gt;CRC 测试&lt;/h2&gt;
&lt;p&gt;webhook 的地址要求通过 CRC 测试，详细要求可以查看
https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/guides/securing-webhooks&lt;/p&gt;
&lt;p&gt;写了一个自己的demo，关于CRC测试的代码：
https://github.com/xingoxu/twitter-like-downloader/blob/master/routes/twitter.js#L13-L23&lt;/p&gt;
&lt;h2&gt;通过 postman 发送请求注册 webhook&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;POST:
https://api.twitter.com/1.1/account_activity/all/env-beta/webhooks.json?url=${你的webhook地址}

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Bearer TOKEN&lt;/code&gt; 可以通过&lt;code&gt;https://api.twitter.com/oauth2/token&lt;/code&gt;接口获得&lt;/p&gt;
&lt;p&gt;注意&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;webhook 地址 需要https，且只能使用443端口（https://twittercommunity.com/t/how-to-register-a-webhook-url-in-twitter/86096/36 ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;通过 postman 发送请求在 subscription 里注册 webhook&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;GET:
https://api.twitter.com/1.1/account_activity/all/env-beta/webhooks.json

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;获取到刚才的 webhook id&lt;/p&gt;
&lt;p&gt;之后&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST:
https://api.twitter.com/1.1/account_activity/all/env-beta/subscriptions.json

Header:
Authorization: OAuth 1.0

Body:
webhook_id: 刚才的 webhook id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意这里需要用OAuth 1.0（用于识别注册的user id）&lt;/p&gt;
&lt;p&gt;注册完成后不会有任何返回，&lt;code&gt;HTTP Code: 204 No Conent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注册完成后可以通过&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET：https://api.twitter.com/1.1/account_activity/all/env-beta/subscriptions/list.json

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以收到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;environment&quot;: &quot;env-beta&quot;,
    &quot;application_id&quot;: &quot;12345678&quot;,
    &quot;subscriptions&quot;: [
        {
            &quot;user_id&quot;: &quot;12345678&quot;  // &amp;lt;- 自己的user_id
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;测试&lt;/h1&gt;
&lt;p&gt;随便对一条推特点赞&lt;/p&gt;
&lt;p&gt;可以收到推特来的 webhook object。&lt;/p&gt;
&lt;p&gt;自己用这个写了一个推特的bot，可以作为参考。
https://github.com/xingoxu/twitter-like-downloader&lt;/p&gt;
</content:encoded></item><item><title>ツイッターの Account Activity API 使ってみた</title><link>https://blog.xingoxu.com/ja/2018/04/twitter-account-activity-api/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2018/04/twitter-account-activity-api/</guid><description>前日ツイッターのAccount Activity APIを使ってみました、この API が一つ webhook 登録が可能です、アカウントのリアル活動（ツィート、通知、設定）を受信します。

以下のものが含まれます：
- ツィート
- at 通知
- リプライ
- リツイート
- 引用リツイート
- いいね
- ダイレクトメッセージとその受信
- フォロー
- ブロック
- ミュート

使う時実際起こった問題を書きました。

</description><pubDate>Mon, 30 Apr 2018 20:59:43 GMT</pubDate><content:encoded>&lt;p&gt;前日ツイッターのAccount Activity APIを使ってみました、この API が一つ webhook 登録が可能です、アカウントのリアル活動（ツィート、通知、設定）を受信します。&lt;/p&gt;
&lt;p&gt;以下のものが含まれます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ツィート&lt;/li&gt;
&lt;li&gt;at 通知&lt;/li&gt;
&lt;li&gt;リプライ&lt;/li&gt;
&lt;li&gt;リツイート&lt;/li&gt;
&lt;li&gt;引用リツイート&lt;/li&gt;
&lt;li&gt;いいね&lt;/li&gt;
&lt;li&gt;ダイレクトメッセージとその受信&lt;/li&gt;
&lt;li&gt;フォロー&lt;/li&gt;
&lt;li&gt;ブロック&lt;/li&gt;
&lt;li&gt;ミュート&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使う時実際起こった問題を書きました。&lt;/p&gt;

&lt;h1&gt;アプリを作ります&lt;/h1&gt;
&lt;p&gt;まずここで https://apps.twitter.com/ チュートリアルに従ってアプリを作って、アプリの key と secret を取得します。&lt;/p&gt;
&lt;h1&gt;Account Activity API を申請します&lt;/h1&gt;
&lt;p&gt;https://developer.twitter.com/en/apply
ここで権限を申請します，app ID の添付を忘れずに（app ID について：https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/overview ）&lt;/p&gt;
&lt;p&gt;申請成功したらメールが来ます
&lt;img src=&quot;https://i.loli.net/2018/04/30/5ae7000843f53.png&quot; alt=&quot;申請成功のメール&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;webhook URL を登録&lt;/h1&gt;
&lt;h2&gt;CRC テスト&lt;/h2&gt;
&lt;p&gt;webhook は CRC テストを合格しなければ登録できない、具体的な要望はここに書いている -&amp;gt;
https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/guides/securing-webhooks&lt;/p&gt;
&lt;p&gt;自分もNode.jsのdemoを書きました、一応参考になれば：
https://github.com/xingoxu/twitter-like-downloader/blob/master/routes/twitter.js#L13-L23&lt;/p&gt;
&lt;h2&gt;postman でリクエストを送って webhook URL を登録します&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;POST:
https://api.twitter.com/1.1/account_activity/all/env-beta/webhooks.json?url=${あなたのwebhook URL}

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Bearer TOKEN&lt;/code&gt; は&lt;code&gt;https://api.twitter.com/oauth2/token&lt;/code&gt;で取得できます。&lt;/p&gt;
&lt;p&gt;注意&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;webhook URL は https と 443 ポートのみサポートします（https://twittercommunity.com/t/how-to-register-a-webhook-url-in-twitter/86096/36 ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;postman でリクエストを送って subscription に webhook を登録します&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;GET:
https://api.twitter.com/1.1/account_activity/all/env-beta/webhooks.json

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;さっきの webhook の id を取って&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST:
https://api.twitter.com/1.1/account_activity/all/env-beta/subscriptions.json

Header:
Authorization: OAuth 1.0

Body:
webhook_id: さっきの webhook の id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意すべきところ：ここAuthorization は OAuth 1.0（user id 認識ため）&lt;/p&gt;
&lt;p&gt;リスポンス内容はない、&lt;code&gt;HTTP Code: 204 No Conent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;登録したらここに見えます&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET：https://api.twitter.com/1.1/account_activity/all/env-beta/subscriptions/list.json

Header:
Authorization: Bearer TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これを受けれます&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;environment&quot;: &quot;env-beta&quot;,
    &quot;application_id&quot;: &quot;12345678&quot;,
    &quot;subscriptions&quot;: [
        {
            &quot;user_id&quot;: &quot;12345678&quot;  // &amp;lt;- 自分のuser_id
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;テスト&lt;/h1&gt;
&lt;p&gt;好きなツイートをいいねすると&lt;/p&gt;
&lt;p&gt;ツイッターサーバーから webhook object 受けれます。&lt;/p&gt;
&lt;p&gt;最後、Account Activity API使ってる自家用ツイッターBotです、参考になればぜひ
https://github.com/xingoxu/twitter-like-downloader&lt;/p&gt;
&lt;p&gt;最後まで閲覧いただきありがとうございました。&lt;/p&gt;
</content:encoded></item><item><title>再见 2017</title><link>https://blog.xingoxu.com/2018/04/2017-end/</link><guid isPermaLink="true">https://blog.xingoxu.com/2018/04/2017-end/</guid><description>忙完这一阵，回过神来已经是2018年的4月了，才有空开始补一些之前没有干完的事情，比如写这一篇2017年的总结。

仔细想想还真的是2017年经历了太多太多事情，很多事情甚至自己都没有想到，感觉自己非常幸运，总的来说是一个很开心的一年。
</description><pubDate>Tue, 10 Apr 2018 12:15:49 GMT</pubDate><content:encoded>&lt;p&gt;忙完这一阵，回过神来已经是2018年的4月了，才有空开始补一些之前没有干完的事情，比如写这一篇2017年的总结。&lt;/p&gt;
&lt;p&gt;仔细想想还真的是2017年经历了太多太多事情，很多事情甚至自己都没有想到，感觉自己非常幸运，总的来说是一个很开心的一年。&lt;/p&gt;

&lt;p&gt;按时间顺序&lt;/p&gt;
&lt;h1&gt;跳槽到饿了妈&lt;/h1&gt;
&lt;p&gt;怎么说，年前就有想跳槽的想法，其实在萌购干着也挺好的，老板也承诺说毕业之后的工资多少多少，价格嘛也不低（跟饿了妈差不多），但始终是有那么点没有安全感，终于逮到个机会去了饿了妈面试，虽然自己是个菜鸡，不过面试的问题还算是都自我感觉挺好的答了下来，于是就很顺利的跳槽到了饿了妈。&lt;/p&gt;
&lt;p&gt;也算走到了算是一个不太容易倒闭的公司，体验了各种大公司的流程，效率也挺高的，时间嘛也还行自己手脚比较快所以基本会有一定的空闲时间，不算很多，但可以。&lt;/p&gt;
&lt;h1&gt;去日本玩&lt;/h1&gt;
&lt;p&gt;刚进饿了妈不久，就要收拾东西准备攻略自己一个人出去玩啦。半年前的既定安排跟跳槽也无关，不过当时想着4月底5月初的时间段怎么说也得三方啊毕业的准备都差不多了吧，那又是谁知道这个点了我自己居然还会跳槽，真是。。。&lt;/p&gt;
&lt;p&gt;嘛操着自己零零碎碎平假名和片假名，也没跟太多人说话，现在想起来我当时到底是怎么旅游的都完全不怎么会说日语，顺顺利利的玩了10天，肥肠快乐，嘛钱也用了不少，差不多一共两万左右吧？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://photos.app.goo.gl/Gh0Qox7rmOz3rRqz2&quot;&gt;Google Photo&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;毕业&lt;/h1&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/04/10/5acc59ab88143.jpg&quot; alt=&quot;毕业啦&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;一霎眼毕业了，当时好像没有什么感觉，取了毕业证书，学位证书，回家就往公司的系统上传表示7.1日起就可以拿正式工资了，只有这点才让我感觉到了毕业。不过现在想想，我居然已经是个社会人了，而且已经实习+上班上了一年了，时间的力量还真是强大，把自己给塑造成了什么样只有回头看的时候才能知道。&lt;/p&gt;
&lt;p&gt;我对学校没什么好感，对周围同学也没什么太多好感，4年自己也不知道自己干了什么，只是埋头学了很多东西，所以这4年，嘛也就这样。&lt;/p&gt;
&lt;h1&gt;N2合格&lt;/h1&gt;
&lt;p&gt;旅游回来之后发现自己只有一个月时间就要考N2于是工作之余还不停的去做之前买来没做的练习再去查字典，最后考前一星期还买了一本书再做练习，直接就上了考场。考完回来感觉应该能过吧，虽然有一半的语法题我是瞎蒙的，有一篇阅读没有时间看。这种没有范围的考试真的非常吓人，又或者说因为是第一次正正经经考一个完全自学的语言所以会如此害怕。&lt;/p&gt;
&lt;p&gt;复习非常累，考试也很累，幸好最后顺利通过，还是很开心的（分数不高啦）&lt;/p&gt;
&lt;h1&gt;跳槽去了LINE&lt;/h1&gt;
&lt;p&gt;这算是下半年一直在做的一件事情吧，从9月初开始试试的心态投了一封简历，结果到最后面试走完被发了offer真的非常非常开心又意外，一个是LINE是日本的企业之中应该是我心中最想去的一个企业，Google也好Twitter也好也很想去，但那些真的水平太高，自己99%是不太可能的，不过LINE的话最初我觉得自己可能70%不太可能，不过最后居然能进是非常意外的，另一个意外就是自己其实日语也就是三脚猫水准，也不要说三脚猫了，一脚猫吧，顶多也就看看小学生向的普通动画，在这之前都没跟日本人说过话，推特也只是在去日本玩送东西给太太的时候结下的太太聊天，聊的也不多还不需要太注重细节，就这么烂的水平，居然最后被采用了。&lt;/p&gt;
&lt;p&gt;然后就是递签证，返签证，去日本找地方睡觉，上班这样的过程，签证只花了一周不过递签证跟返签证还真是艰辛前前后后块花了一个半月，嘛只能算是好事多磨。期间当然是在饿了妈当没事人一样刷KPI，我觉得如果我不走的话我KPI至少有B吧，A能不能有就不太清楚了。&lt;/p&gt;
&lt;p&gt;第一次离开自己家自己一个人住，唔太幸福了，小黄本放题啊~~&lt;/p&gt;
&lt;p&gt;要说原因的话，也不太那么好明着说吧，嘛自己来日本的时候的确也是觉得哇这里真好真舒服，想来这里上班呢，另一个是2017下半年也的确发生了很多事，让自己对周围的环境有了一些看法吧。&lt;/p&gt;
&lt;h1&gt;2018年的计划？&lt;/h1&gt;
&lt;p&gt;天呐看看去年的计划，什么rxJs，什么后端，什么可视化前端，什么游戏开发，完全没有学嘛。
2018年的话，先把欠账还清吧，下的动画啥的赶紧看完，不过游戏啥的基本都完成了还算是，摸鱼上手（笑）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bgm.tv/award/2017/xingo&quot;&gt;Bangumi 2017&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vue + TypeScript 尝鲜体验</title><link>https://blog.xingoxu.com/2017/10/vue-typescript-early/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/10/vue-typescript-early/</guid><description>&amp;gt; 适用 Vue.version &amp;lt; 2.5 &amp;amp;&amp;amp; Vue.version &amp;gt;= 2.2

其实我个人一开始很讨厌 TypeScript 这个东西，就是因为讨厌 Java 的啰里巴嗦，突然在我眼前出现了 Javascript，便爱上了这门语言。

但现在的我稍稍又觉得这样的东西其实还行，只使用类型系统也并没有完全限制 Javascript 本身的灵活性，并且他帮助我不会犯一些低级错误，而且还能配合 Visual Studio Code 的提示，我觉得这个还是很不错的，最近忙起来的时候，甚至经常把两个输入框的 value 直接进行比较了，于是就想尝试一下 TypeScript。

</description><pubDate>Wed, 18 Oct 2017 15:04:23 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;适用 Vue.version &amp;lt; 2.5 &amp;amp;&amp;amp; Vue.version &amp;gt;= 2.2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实我个人一开始很讨厌 TypeScript 这个东西，就是因为讨厌 Java 的啰里巴嗦，突然在我眼前出现了 Javascript，便爱上了这门语言。&lt;/p&gt;
&lt;p&gt;但现在的我稍稍又觉得这样的东西其实还行，只使用类型系统也并没有完全限制 Javascript 本身的灵活性，并且他帮助我不会犯一些低级错误，而且还能配合 Visual Studio Code 的提示，我觉得这个还是很不错的，最近忙起来的时候，甚至经常把两个输入框的 value 直接进行比较了，于是就想尝试一下 TypeScript。&lt;/p&gt;

&lt;h1&gt;官方做法&lt;/h1&gt;
&lt;p&gt;Vue 2.2 以上之后，官方给 Vue已经添加了很多类型声明，那么我们就来实践一下在单文件 Vue 中使用 TypeScript。&lt;/p&gt;
&lt;h2&gt;webpack rules 中添加 ts-loader 相关（这里使用 webpack 2）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  test: /\.ts$/,
  exclude: /node_modules|vue\/src/,
  loader: &apos;ts-loader&apos;,
  options: {
    appendTsSuffixTo: [/\.vue$/]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表示对 .ts 文件编译时使用 ts-loader 进行读取，appendTsSuffixTo 是为了让 tsc 对 vue 文件能够当成一个 module 进行处理，以解决 moudle not found 的问题（tsc 本身不认识 vue 结尾的文件）&lt;/p&gt;
&lt;h2&gt;添加 .d.ts文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;declare module &quot;*.vue&quot; {
  import Vue from &apos;vue&apos;
  export default Vue
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也是为了让 vscode 在 ts 文件中识别 vue 结尾文件&lt;/p&gt;
&lt;h2&gt;项目根目录下添加 tsconfig.json&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;allowSyntheticDefaultImports&quot;: true,
    &quot;lib&quot;: [
      &quot;dom&quot;,
      &quot;es5&quot;,
      &quot;es2015.promise&quot;
    ],
    &quot;module&quot;: &quot;es2015&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;isolatedModules&quot;: false,
    &quot;target&quot;: &quot;es5&quot;
  },
  &quot;include&quot;: [
    &quot;./src/**/*.ts&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;allowSyntheticDefaultImports&lt;/code&gt; 是为了能够用 es6 形式的 import，其他就参照 Vue 和官网的弄了个最小化的 json。&lt;/p&gt;
&lt;h2&gt;万事俱备，让我们 &lt;code&gt;npm run dev&lt;/code&gt; 跑起来！&lt;/h2&gt;
&lt;p&gt;在这里，我们假设使用 Vue 官方的 webpack boilerplate，对 Hello.vue 进行一下改造。&lt;/p&gt;
&lt;p&gt;在模板的 msg 下新增一行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h2&amp;gt;Say Hello Times: {{ count }}&amp;lt;/h2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并将 script 部分修改成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue, { ComponentOptions } from &apos;vue&apos;
  // Declare the component&apos;s type
  interface HelloInterface extends Vue {
    msg: string,
    count: number,
    sayHello(): number
  }
  
  export {
    HelloInterface as interface
  }
  export default {
    data() {
      return {
        msg: &apos;Welcome to Your Vue.js App&apos;,
        count: 0
      }
    },
    methods: {
      sayHello() {
        this.count++;
        return this.count;
      }
    }
    // We need to explicitly annotate the exported options object
    // with the Hello type
  } as ComponentOptions&amp;lt;HelloInterface&amp;gt;;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码没有什么太大的问题&lt;/p&gt;
&lt;p&gt;接着我们改造一下 App.vue&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./assets/logo.png&quot; @click=&quot;sayHello&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue, { ComponentOptions } from &apos;vue&apos;;
  import { interface as helloInterface, default as Hello } from &apos;./components/Hello.vue&apos;;
  interface App extends Vue {
    $refs: {
      // 对 helloComponent 进行声明，可以使用 helloComponent 上的方法和属性
      helloComponent: helloInterface
    }
  }
  export default {
    methods: {
      sayHello() {
        this.$refs.helloComponent.count++;
        this.$refs.helloComponent.sayHello();
      }
    },
    components: {
      Hello
    }
  } as ComponentOptions&amp;lt;App&amp;gt;;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，像 refs 这种动态的在运行时才能确定的东西，如果需要在 coding 过程中静态化，则需要在 interface 中对其进行声明，写的 code 稍微有点多，不过可以接受。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注： App.vue 修改成 &lt;code&gt;lang=ts&lt;/code&gt; 后，顶层的 main.js 需要换成 main.ts 并修改 webpack 入口点，否则发生 file not found 错误&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;vue-class-component&lt;/h1&gt;
&lt;p&gt;官方的另一种推荐做法是 &lt;code&gt;vue-class-component&lt;/code&gt;，不过 demo 和 readme 有点小问题，可把我这个 TypeScript 新手给难到啦，提了 pr 希望快快通过。&lt;/p&gt;
&lt;p&gt;让我们看看使用 &lt;code&gt;vue-class-component&lt;/code&gt; 之后的 Hello.vue&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue from &apos;vue&apos;
  import Component from &apos;vue-class-component&apos;

  @Component
  export default class Hello extends Vue {
    msg: string = &apos;Welcome to Your Vue.js App&apos;
    count: number = 0
    sayHello(): number {
      this.count++;
      return this.count;
    }
  }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再让我们看看 App.vue&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue from &apos;vue&apos;
  import Component from &apos;vue-class-component&apos;
  import Hello from &apos;./components/Hello.vue&apos;;
  
  @Component({
    components: {
      Hello
    }
  })
  export default class App extends Vue {
    $refs: {
      helloComponent: Hello
    }
    
    sayHello() {
      this.$refs.helloComponent.count++;
      this.$refs.helloComponent.sayHello();
    }
  }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;非常 Cool，非常精炼，暂时没有想到可能会发生的没法解决的因为 vue 或者 vue 组件 和 TypeScript 水土不服的编译错误，而且都有了类型和提示。&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;尤大佬说在接下来的 Vue 2.5 还会加强一系列的 TypeScript 支持（&lt;a href=&quot;https://medium.com/the-vue-point/upcoming-typescript-changes-in-vue-2-5-e9bd7e2ecf08&quot;&gt;链接&lt;/a&gt;），不知道是怎样的支持呢。
另外，欢迎大家在评论区发表 Vue + TypeScript 的使用场景以及你遇到的错误。&lt;/p&gt;
</content:encoded></item><item><title>Vue + TypeScript 早期体験</title><link>https://blog.xingoxu.com/ja/2017/10/vue-typescript-early/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2017/10/vue-typescript-early/</guid><description>&amp;gt; Vue.version &amp;lt; 2.5 &amp;amp;&amp;amp; Vue.version &amp;gt;= 2.2　適用される

# 公式ドキュメントによるやり方

Vue 2.2 から、Vue にいろんな公式型宣言を提供しており、さっそく、単一ファイルコンポーネントに TypeScript を試してみましょう。

## webpack rules に ts-loader 相関を添付しましょう
&amp;gt; こっちは webpack2

```diff
module: {
  rules: [
+   {
+     test: /\.ts$/,
+     exclude: /node_modules|vue\/src/,
+     loader: &apos;ts-loader&apos;,
+     options: {
+       appendTsSuffixTo: [/\.vue$/]
+     }
+   },
    ...
```

</description><pubDate>Tue, 10 Oct 2017 17:33:23 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Vue.version &amp;lt; 2.5 &amp;amp;&amp;amp; Vue.version &amp;gt;= 2.2　適用される&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;公式ドキュメントによるやり方&lt;/h1&gt;
&lt;p&gt;Vue 2.2 から、Vue にいろんな公式型宣言を提供しており、さっそく、単一ファイルコンポーネントに TypeScript を試してみましょう。&lt;/p&gt;
&lt;h2&gt;webpack rules に ts-loader 相関を添付しましょう&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;こっちは webpack2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;module: {
  rules: [
+   {
+     test: /\.ts$/,
+     exclude: /node_modules|vue\/src/,
+     loader: &apos;ts-loader&apos;,
+     options: {
+       appendTsSuffixTo: [/\.vue$/]
+     }
+   },
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;.ts のファイルを ts-loader で読み込む
&lt;code&gt;appendTsSuffixTo&lt;/code&gt;は vue を module として tsc でプロセスして、module not found の問題を解決する（tsc は .vue ファイルが知らない）&lt;/p&gt;
&lt;h2&gt;.d.ts ファイルを作成する&lt;/h2&gt;
&lt;p&gt;どんな名前もいい、どこでもいい、tsconfig.json の include PATH にいればいい、必ず .d.ts を名前の終わりします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;declare module &quot;*.vue&quot; {
  import Vue from &apos;vue&apos;
  export default Vue
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;vscode の .ts ファイルに .vueファイルも知らせます。&lt;/p&gt;
&lt;h2&gt;tsconfig.json を作成する&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;allowSyntheticDefaultImports&quot;: true,
    &quot;lib&quot;: [
      &quot;dom&quot;,
      &quot;es5&quot;,
      &quot;es2015.promise&quot;
    ],
    &quot;module&quot;: &quot;es2015&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;isolatedModules&quot;: false,
    &quot;target&quot;: &quot;es5&quot;
  },
  &quot;include&quot;: [
    &quot;./src/**/*.ts&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;allowSyntheticDefaultImports&lt;/code&gt; は es6 の import を直接使えるの option&lt;/p&gt;
&lt;h2&gt;準備万端、&lt;code&gt;npm run dev&lt;/code&gt; いきましょう！&lt;/h2&gt;
&lt;p&gt;こっちは vue-cli の webpack boilerplate を例として、Hello.vue を改造しましょう。&lt;/p&gt;
&lt;p&gt;html template の msg の下に&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;h1&amp;gt;{{ msg }}&amp;lt;/h1&amp;gt;
+ &amp;lt;h2&amp;gt;Say Hello Times: {{ count }}&amp;lt;/h2&amp;gt;
  &amp;lt;h2&amp;gt;Essential Links&amp;lt;/h2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;script の部分を&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue, { ComponentOptions } from &apos;vue&apos;
  // Declare the component&apos;s type
  interface HelloInterface extends Vue {
    msg: string,
    count: number,
    sayHello(): number
  }
  
  export {
    HelloInterface as interface
  }
  export default {
    data() {
      return {
        msg: &apos;Welcome to Your Vue.js App&apos;,
        count: 0
      }
    },
    methods: {
      sayHello() {
        this.count++;
        return this.count;
      }
    }
    // We need to explicitly annotate the exported options object
    // with the Hello type
  } as ComponentOptions&amp;lt;HelloInterface&amp;gt;;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こうして改造します&lt;/p&gt;
&lt;p&gt;親としての App.vue を改造してみて&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;div id=&quot;app&quot;&amp;gt;
-   &amp;lt;img src=&quot;./assets/logo.png&quot;&amp;gt;
+   &amp;lt;img src=&quot;./assets/logo.png&quot; @click=&quot;sayHello&quot;&amp;gt;
-   &amp;lt;hello&amp;gt;&amp;lt;/hello&amp;gt;
+   &amp;lt;hello ref=&quot;helloComponent&quot;&amp;gt;&amp;lt;/hello&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import Vue, { ComponentOptions } from &apos;vue&apos;;
  import { interface as helloInterface, default as Hello } from &apos;./components/Hello.vue&apos;;
  interface App extends Vue {
    $refs: {
      // helloComponent を宣言する、helloComponent のメソッドとプロパティを使えようになるました
      helloComponent: helloInterface
    }
  }
  export default {
    methods: {
      sayHello() {
        this.$refs.helloComponent.count++;
        this.$refs.helloComponent.sayHello();
      }
    },
    components: {
      Hello
    }
  } as ComponentOptions&amp;lt;App&amp;gt;;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;refsといった動的なもの、interface に宣言して、typescript にオートコンプリートを使えます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;App.vue の &lt;code&gt;script&lt;/code&gt; を &lt;code&gt;lang=ts&lt;/code&gt; 変更すると、main.js を main.ts に変更する必要があります、webpack の entry も忘れないでください，そうしないと file not found のエラーが発生する可能性がある。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;コードはちょっと多いね、公式サイトによるの &lt;code&gt;vue-class-component&lt;/code&gt; を使ってみますか？&lt;/p&gt;
&lt;h1&gt;vue-class-component&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;vue-class-component&lt;/code&gt;の demo と readme はちょっと問題がある、TypeScript の新入りの私が困った、pr を提出した、速くマージされて欲しい。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vue-class-component&lt;/code&gt; を使っている Hello.vue の script 部分&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  import Vue from &apos;vue&apos;;
  import Component from &apos;vue-class-component&apos;;
  　
  @Component
  export default class Hello extends Vue {
    msg: string = &apos;Welcome to Your Vue.js App&apos;
    count: number = 0
    sayHello(): number {
      this.count++;
      return this.count;
    }
  };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;で、App.vue&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  import Vue from &apos;vue&apos;;
  import Component from &apos;vue-class-component&apos;;
  import Hello from &apos;./components/Hello.vue&apos;;
  　
  @Component({
    components: {
      Hello
    }
  })
  export default class App extends Vue {
    $refs: {
      helloComponent: Hello
    }
  　
    sayHello() {
      this.$refs.helloComponent.count++;
      this.$refs.helloComponent.sayHello();
    }
  };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随分清潔になりました、オートコンプリートもバッチリ！他の vue コンポーネントと TypeScript の不具合は一時的に考え出来ません。&lt;/p&gt;
&lt;h1&gt;終わりに&lt;/h1&gt;
&lt;p&gt;Vue 2.5から TypeScript のサポートはどんどん増えますと&lt;a href=&quot;https://medium.com/the-vue-point/upcoming-typescript-changes-in-vue-2-5-e9bd7e2ecf08&quot;&gt;言います&lt;/a&gt;、どんなサポートですね〜&lt;/p&gt;
&lt;p&gt;日本語まだ下手ですから、変なところいっぱいと思います、コメントエリアに指摘すれば幸いです。&lt;/p&gt;
&lt;p&gt;最後まで閲覧いただきありがとうございました。&lt;/p&gt;
</content:encoded></item><item><title>いくつのユーザー状態の記録方法</title><link>https://blog.xingoxu.com/ja/2017/09/record-user-login-status-methods/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2017/09/record-user-login-status-methods/</guid><description># Cookie

昔のやり方は、Cookie に直接保存する。サーバーストレージはまだそんな安いの状況下で、たくさんのウェブサイトはユーザーの登録そういうインフォメーションを変化してサインして Cookie に保存する。

変化やサインは、md5+salt、または secret を使って双方向の暗号化するとかの方法。

ウェブサイトに二回アクセスとしたら、Cookieに指定のkeyのvalueを検証する、それはただしかどうか。
</description><pubDate>Thu, 28 Sep 2017 18:03:55 GMT</pubDate><content:encoded>&lt;h1&gt;Cookie&lt;/h1&gt;
&lt;p&gt;昔のやり方は、Cookie に直接保存する。サーバーストレージはまだそんな安いの状況下で、たくさんのウェブサイトはユーザーの登録そういうインフォメーションを変化してサインして Cookie に保存する。&lt;/p&gt;
&lt;p&gt;変化やサインは、md5+salt、または secret を使って双方向の暗号化するとかの方法。&lt;/p&gt;
&lt;p&gt;ウェブサイトに二回アクセスとしたら、Cookieに指定のkeyのvalueを検証する、それはただしかどうか。&lt;/p&gt;

&lt;p&gt;こうやっていいところは：
サーバーストレージ占有なし、Cookie はユーザーの情報です&lt;/p&gt;
&lt;p&gt;こうやって悪いところは：
ユーザー情報盗むはやすい、特にhttpsなし、中間者攻撃されたら、悪い人にログインされたことはできる。
また、別々に保存するのデータを改ざんされるはやすい。&lt;/p&gt;
&lt;h1&gt;Session&lt;/h1&gt;
&lt;p&gt;計算力とストレージの速い発展、問題は次々に現れた。保存希望のユーザー情報はますます多くなる、Cookie のサイズ制限は少ない。&lt;/p&gt;
&lt;p&gt;原理的には、Session は Cookie です。&lt;/p&gt;
&lt;p&gt;サイトにアクセスとき、サーバーから唯一の Session ID を配ってCookie に保存する。ログインのとき、この Session ID による、サーバーに Session Object を作る、このオブジェクトにuser idとか、状態というユーザーの情報を保存している。&lt;/p&gt;
&lt;p&gt;Session ID は Session Object を作るのときに配れも可能です、Session IDの作る方法は時間によるに限らない、sidの唯一を保証すればいい。&lt;/p&gt;
&lt;p&gt;Session Object のストレージ場所も選べる。Sessionはとても大事ですと思われなら、mysql に保存するは可能です、そうではない場合は、redis に、メモリにも可能です。&lt;/p&gt;
&lt;p&gt;だから、Sessionはとてもフレキシブル。&lt;/p&gt;
&lt;p&gt;Session は過去の技術ではない、今はたくさんのウェブサイトに使われている。その原因は、httpしか問題いません。Internet Explorer &amp;gt;= 10 の場合も CORS に Cookie の伝送が可能ですから、問題ない。&lt;/p&gt;
&lt;p&gt;いいところ：
クライエントサイド sid しか見えない&lt;/p&gt;
&lt;p&gt;悪いところ：
情報を取得する、一つ query 必要です。
盗むも可能ですが、Session / Cookie の問題ではない、http の問題です、httpで何も見える。&lt;/p&gt;
&lt;p&gt;いいと悪いは時代に応じるです、Cookie に保存するときは、サーバーの計算力は低い、memcacheやredisもない、Sessionの時間はかかる、今はこれは決して悪いところじゃない。&lt;/p&gt;
&lt;p&gt;Session と Cookie はフロントエンドにとって何をする必要はない、サーバーは Set-Cookie の http header で sid と Cookie の更新を完成することはできる。&lt;/p&gt;
&lt;h1&gt;Token Based&lt;/h1&gt;
&lt;p&gt;上記２つの方法は、２つの異なるアイデアを表しています。一つは情報をクライエントサイドに保存する、一つはサーバーにする。&lt;/p&gt;
&lt;p&gt;フロントエンドとバックエンドを分けるときは、上記の２つアイデアも Cookie なしに進化する。&lt;/p&gt;
&lt;p&gt;一つは
Session Token を取って、JSON、または 他のhttp header に伝送する&lt;/p&gt;
&lt;p&gt;一つは
JWT（JSON Web Token） 情報をクライエントサイドに保存するというアイデアを表す。Cookie とちょっと似ているけど，情報を base64 に変化して、secretでサインして、一緒に token になる。&lt;/p&gt;
&lt;p&gt;クライエントサイドに保存するのいいところは：
情報はクライエントに保存しているから、コードに直接処理はできる、ロードバランスとかの心配いらない。
また、Session の期限切れば、データベースに delete の必要がある。&lt;/p&gt;
&lt;p&gt;悪いところは：
情報多くなるとき、Token は長くなる、http request は大きいになる、伝送の時間がかかる。&lt;/p&gt;
&lt;p&gt;JWT の payload は base64 コーディングする、誰か標準に通じれば、内容を見られます。&lt;/p&gt;
&lt;p&gt;Token Based 認証はフロントエンドに保存して、コーディングは必要です、一般はlocalStorageで。
だから、Token Based 認証は XSS に攻撃される可能性はある、Cookie Based 認証は CSRF に攻撃される可能性はある。&lt;/p&gt;
&lt;h1&gt;結論&lt;/h1&gt;
&lt;p&gt;いくつかの単語をすべての場合に要約することはできません、Token と Cookie また 情報をクライエントサイドに保存するとサーバーにするの場合を想像する、どんな方法を採用しようか、現業務を基にして、ちょっと長いのビジョンで選択を考える。&lt;/p&gt;
</content:encoded></item><item><title>用户登录状态 验证权限的时代变迁</title><link>https://blog.xingoxu.com/2017/09/record-user-login-status-methods/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/09/record-user-login-status-methods/</guid><description># Cookie

直接在Cookie中存信息可谓是上古时代的操作了，在服务器还没有那么便宜的情况下，好多网站选择将用户的登录信息存在cookie中，他们把用户名或者用户id转换并签名之后，直接存入Cookie，如果有其他需要的信息，也是如此操作

转换或签名可以是加盐md5，也可以是使用secret的双向加密

用户第二次访问网站的时候，代码中对这段信息进行验证，看看是否是正确的签名的
</description><pubDate>Thu, 28 Sep 2017 17:57:15 GMT</pubDate><content:encoded>&lt;h1&gt;Cookie&lt;/h1&gt;
&lt;p&gt;直接在Cookie中存信息可谓是上古时代的操作了，在服务器还没有那么便宜的情况下，好多网站选择将用户的登录信息存在cookie中，他们把用户名或者用户id转换并签名之后，直接存入Cookie，如果有其他需要的信息，也是如此操作&lt;/p&gt;
&lt;p&gt;转换或签名可以是加盐md5，也可以是使用secret的双向加密&lt;/p&gt;
&lt;p&gt;用户第二次访问网站的时候，代码中对这段信息进行验证，看看是否是正确的签名的&lt;/p&gt;

&lt;p&gt;这样做的好处是：
不会再占用服务器资源，直接就在cookie中读取数据，获得结果&lt;/p&gt;
&lt;p&gt;坏处是：
登录凭据容易被窃取，尤其是那个年代还没有流行https，如果被中间人了，或者以另一种方式拿到了cookie，那就会被窃取登录，另外，每个数据还可能是分开存储的，因此容易被篡改&lt;/p&gt;
&lt;p&gt;当然那时的互联网也并没有那么发达，cookie也就存存用户名什么的用于显示&lt;/p&gt;
&lt;h1&gt;Session&lt;/h1&gt;
&lt;p&gt;后来网速变快了，web 应用高速发展，大家意识到了很多问题，cookie 大小不够啊，cookie 每个 key 都这么搞一下暴露太多了等等&lt;/p&gt;
&lt;p&gt;从原理上来说，Session 就是 Cookie&lt;/p&gt;
&lt;p&gt;客户端进入网站后，服务器分配一个 Session ID 给客户端种入 Cookie，用户登录时，在服务器查询 Session ID，在服务器写入 Session Object，这个对象里存了用户的登录数据，比如 id 啦，用户名啦，登录状态 / 角色等等&lt;/p&gt;
&lt;p&gt;另外分配 Session ID 也可以是懒分配，也就是等到在服务器存 Session Object 的时候再分配也没有关系，Session ID 的分配可以是用 UserID 来进行加密分配，也可以用毫不相关的时间等信息进行加密分配，只需要保证这个 sid 唯一，不容易被伪造即可&lt;/p&gt;
&lt;p&gt;Session 的存放也是可重可轻，如果觉得 Session 很重要，那么可以放入 mysql，如果觉得 Session 不怎么重要，甚至可以放入内存，重启丢失&lt;/p&gt;
&lt;p&gt;Session 到至今还是非常非常多的网站在用，原因就是在于其实除了 https 以外的问题，并没有什么问题，IE &amp;gt;= 10 之后，Cookie 也可以跨域，那么 Session 就没有什么问题&lt;/p&gt;
&lt;p&gt;好处是：
在客户端除了 sid 以外，看不到任何信息，当然不太容易篡改&lt;/p&gt;
&lt;p&gt;坏处是：
取 Session 的时候，是会需要再 query 一次的
也容易被窃取，当然这并不是 Session / Cookie 的锅，http 下，啥都是一清二楚的&lt;/p&gt;
&lt;p&gt;另外，优缺点都是相对于时代来说的，存 Cookie 的时代服务器的性能不高，也没有 memcache 或者 redis 这种东西，存入 mysql 就需要再 query 一次，负载均衡当然不能同步 内存中的 Session，Cookie 成为了首选，那么现在呢，这点算力恐怕算不了什么，那么 Session 的那个坏处，就应该被划掉，Session 理所当然成为了流行的会话管理方式&lt;/p&gt;
&lt;p&gt;Session 和 Cookie 都不需要前端介入，服务端通过 Set-Cookie http 头就可以完成 sid 和 Cookie 的更新&lt;/p&gt;
&lt;h1&gt;Token Based&lt;/h1&gt;
&lt;p&gt;上边两种方法代表了两种存登录凭据的思想，一种是把凭据存客户端，一种是把凭据存服务端&lt;/p&gt;
&lt;p&gt;那么随着前后端分离的运动，上边两种的登录凭据的思想也发展出了两种不使用 Cookie 的方法&lt;/p&gt;
&lt;p&gt;把凭据存服务端的 Session，把他的Token，单拿出来，在JSON中传递，或者在 http 头里传递或者其他方式传递&lt;/p&gt;
&lt;p&gt;JWT（JSON Web Token） 代表了把凭据存客户端的思想，和当时的 Cookie 有点像，登录的时候把那些需要的信息 base64 编码作为一段，然后再对这些字段用 secret 进行签名，连起来这么一段 Token 去发给客户端作为凭据&lt;/p&gt;
&lt;p&gt;凭据存在客户端的好处是：
因为登录状态都是跟着客户端跑的，时效信息都存在客户端，Session 如果过期了，要对 Session 数据库进行垃圾清理，那么凭据存在客户端就不需要，而且因为都是跟着客户端跑的，在服务器扩大搞集群，搞异地多活，就不需要考虑读数据库这种事情，因为都是客户端请求为 based ，随便哪个服务器来 handle 请求都没有问题&lt;/p&gt;
&lt;p&gt;凭据存客户端坏处是：
当凭据内容越来越多，Token 也会越来越长，每一次请求都会携带这么大这么长的内容，显然不是非常合适&lt;/p&gt;
&lt;p&gt;JWT 还有个问题就是中间那部分是 base64 编码的，如果熟悉标准的话，等于就是明文存储凭据了，虽然不能改，当然还是能看到&lt;/p&gt;
&lt;p&gt;Token 类的鉴权需要前端参与并存储，存储一般会放在 localStorage等地方，因此其实是比较容易受到 XSS 的影响
Cookie 类的鉴权容易受到 CSRF 的影响&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;其实只言片语还是没法概括到所有的情况，只能大体的对Token 或者 Cookie 以及 凭据存服务端或者客户端的优缺点进行想象，究竟去使用哪一种鉴权方式，还是应该基于业务，对业务有非常深入的理解，以及稍带一些长远的思考&lt;/p&gt;
</content:encoded></item><item><title>日本語ブログ始動</title><link>https://blog.xingoxu.com/ja/2017/08/hello-jp-world/</link><guid isPermaLink="true">https://blog.xingoxu.com/ja/2017/08/hello-jp-world/</guid><pubDate>Sat, 26 Aug 2017 16:55:10 GMT</pubDate><content:encoded>&lt;p&gt;こんにちわ、はじめまして、こちらは xingo さんの日本語ブログ！&lt;/p&gt;
&lt;p&gt;日本語まだ下手です、どうぞ、お気軽いに指導します、よろしくお願いします！&lt;/p&gt;
&lt;p&gt;さて、このブログですが、まずはどのようなものかご説明したいと思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xingo さんの技術相関&lt;/li&gt;
&lt;li&gt;xingo さんの作品&lt;/li&gt;
&lt;li&gt;xingo さんの日常生活&lt;/li&gt;
&lt;li&gt;xingo さんの旅行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このような感じで本番までお付き合いいただけたら幸いです&lt;/p&gt;
&lt;p&gt;では、また次回&lt;/p&gt;
</content:encoded></item><item><title>2017 你的名字 东京 圣地巡礼</title><link>https://blog.xingoxu.com/2017/08/kiminonawa-tokyo-seichijunrei/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/08/kiminonawa-tokyo-seichijunrei/</guid><description>BD 出了一个月，略忙再加上 VCB 也没有出 rip，前天 rip 刚出于是赶紧下载了来做整理啦

靠着仅有的印象和网上的一些经验攻略，把东京几乎所有的场景都拍到了吧（大概）

&lt;br /&gt;


&lt;div&gt;

![第一次交换身体瀧去学校查手机地图](https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd2euzhtj21hc0u0b2h.jpg)&lt;/div&gt;&lt;div&gt;

![第一次交换身体瀧去学校查手机地图](https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1sqchgj21kw23vb2b.jpg)&lt;/div&gt;
&lt;div&gt;新宿站&lt;/div&gt;

&lt;br /&gt;



&lt;div&gt;

![瀧去学校路上](https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1xbjrpj21hc0u0x6w.jpg)&lt;/div&gt;&lt;div&gt;

![瀧去学校路上](https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1jphpxj21kw23vb2a.jpg)&lt;/div&gt;
&lt;div&gt;新宿站前路&lt;/div&gt;</description><pubDate>Sat, 26 Aug 2017 13:02:06 GMT</pubDate><content:encoded>&lt;p&gt;BD 出了一个月，略忙再加上 VCB 也没有出 rip，前天 rip 刚出于是赶紧下载了来做整理啦&lt;/p&gt;
&lt;p&gt;靠着仅有的印象和网上的一些经验攻略，把东京几乎所有的场景都拍到了吧（大概）&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd2euzhtj21hc0u0b2h.jpg&quot; alt=&quot;第一次交换身体瀧去学校查手机地图&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1sqchgj21kw23vb2b.jpg&quot; alt=&quot;第一次交换身体瀧去学校查手机地图&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站&lt;/div&gt;
&lt;br /&gt;

&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1xbjrpj21hc0u0x6w.jpg&quot; alt=&quot;瀧去学校路上&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd1jphpxj21kw23vb2a.jpg&quot; alt=&quot;瀧去学校路上&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站前路&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd2d2vh6j21hc0u0qvc.jpg&quot; alt=&quot;瀧去学校路上（東京や！）&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd23g4dij21kw16oe82.jpg&quot; alt=&quot;瀧去学校路上（東京や！）&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站前路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbmz0td8j21hc0u01l6.jpg&quot; alt=&quot;瀧去学校路上后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbm3fz0qj21kw16oqv6.jpg&quot; alt=&quot;瀧去学校路上后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站全景（可在天桥上拍）&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fix34kkpjyj21hc0u0qvd.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fix34dnb9jj23402c04qr.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;西新宿 新宿警察署 夜晚&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd2mqd8wj21hc0u01l6.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwd232dg3j21kw0uvhdt.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;西新宿 新宿警察署 白天&lt;/div&gt;
&lt;p&gt;这里非常丢人的拍错了角度，因为完全没看图😂
&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf1cckc9j21hc0u0kjt.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf0r611qj21kw16ob2b.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站 南口与中央东口之间的铁路桥下 白天&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf1e349nj21hc0u0kjt.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf18dalpj21kw23vx6r.jpg&quot; alt=&quot;一段时间的交换身体&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿站 南口与中央东口之间的铁路桥下 夜晚&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1rwwgkj21hc0u07wp.jpg&quot; alt=&quot;三叶代替瀧和前辈发展关系&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg0ubhtbj21kw16o7wj.jpg&quot; alt=&quot;三叶代替瀧和前辈发展关系&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;涉谷站 东急电铁入口 TATSUYA&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbo72i9mj21hc0u07wp.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbnf9sw0j21kw16o4qr.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷站外&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9dm2p8j21hc0u0qvc.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf8koc6oj21950nzaxk.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷站前广场&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwesmfu6rj21hc0u01l5.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwesdqq9gj21kw23vhdu.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷站前广场&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbo03yauj21hc0u04qx.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbnkbx57j21kw23vb2b.jpg&quot; alt=&quot;瀧第一次和前辈约会&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷站前广场&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg21vktbj21hc0u07wp.jpg&quot; alt=&quot;前辈和瀧结束约会的地方 全剧也多次出现&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1rroymj21kw23vqv7.jpg&quot; alt=&quot;前辈和瀧结束约会的地方 全剧也多次出现&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr 信濃町站前天桥&lt;/div&gt;
&lt;p&gt;桥上的这个路标牌实地并木有，但是却在六本木找到了一模一样的路牌，不是很清楚怎么回事&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwbm32i2aj21hc0u04qx.jpg&quot; alt=&quot;瀧被前辈甩了单独在天桥&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwblheotsj21kw16onpe.jpg&quot; alt=&quot;瀧被前辈甩了单独在天桥&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr 信濃町站前天桥上&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9nzwjsj21hc0u01l5.jpg&quot; alt=&quot;被甩后的几处镜头 这个镜头全剧出现了两次&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf99pw2bj20nl0ik481.jpg&quot; alt=&quot;被甩后的几处镜头 这个镜头全剧出现了两次&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr 信濃町站对面&lt;/div&gt;
&lt;p&gt;全图是这样的：&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9he7b3j21kw23vkjm.jpg&quot; alt=&quot;jr 信濃町站对面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1ulinaj21hc0u0npl.jpg&quot; alt=&quot;被甩后的几处镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1a803cj21kw16o1kz.jpg&quot; alt=&quot;被甩后的几处镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;刚才天桥的后边&lt;/div&gt;
&lt;p&gt;这里角度非常刁钻不是很好拍到，只能这样拍一下，全图如下：
&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1g9v6qj21kw16oe83.jpg&quot; alt=&quot;天桥的后边&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwesi9jegj21hc0u0e89.jpg&quot; alt=&quot;瀧画系守镇风景那一段的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwersryagj21kw16ohdv.jpg&quot; alt=&quot;瀧画系守镇风景那一段的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;明治神宫前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiweshteg1j21hc0u0e89.jpg&quot; alt=&quot;三叶来东京找瀧&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwerz363lj21kw23vqv6.jpg&quot; alt=&quot;三叶来东京找瀧&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr 代々木站&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg5q68p6j21hc0u0he1.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg57dk0cj21kw23v7wj.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;赤坂見附駅 至四谷站 路上&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg68bzxuj21hc0u01l6.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg5sbgtmj21kw23vu0z.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;赤坂見附駅 地铁出口&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiweslzvu6j21hc0u0he1.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwes8cxcuj21kw16o1kz.jpg&quot; alt=&quot;八年后瀧和前辈见面&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;赤坂見附駅 至四谷站 （靠近四谷） 野球场旁边小路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9j4x23j21hc0u0e89.jpg&quot; alt=&quot;八年后 与前辈约会结束后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9377mzj21kw16o1kz.jpg&quot; alt=&quot;八年后 与前辈约会结束后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;涉谷站旁天桥&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf9iwr8aj21hc0u0b2h.jpg&quot; alt=&quot;八年后 与前辈约会结束后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf8yt1tbj21kw23v7wk.jpg&quot; alt=&quot;八年后 与前辈约会结束后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿中央东口前过天桥 南口过天桥广场 星巴克门口&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf1etfa9j21hc0u07wp.jpg&quot; alt=&quot;jr上发现对方后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf0qdlnyj21kw23vu0y.jpg&quot; alt=&quot;jr上发现对方后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷三丁目站 四谷站 中间的新宿通路 往须贺神社方向&lt;/div&gt;
&lt;p&gt;这里标注一下三个标志在哪 😂 间隔非常远
&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf4tbu88j21kw23ux6p.jpg&quot; alt=&quot;动画中的三个标志的位置&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg1tucs9j21hc0u0x6w.jpg&quot; alt=&quot;jr上发现对方后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg128dhwj21kw16okjn.jpg&quot; alt=&quot;jr上发现对方后的镜头&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;四谷四丁目 路口&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg6f7rd1j21hc0u0u14.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg5pvutaj21kw23vkjm.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr新宿站 南口&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf15din3j21hc0u04qx.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwf0g51fij21kw16o4qr.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;jr 信濃町站对面&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg6fhfhnj21hc0u0qvd.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg5vl7jxj21kw23vx6q.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿通路 去 须贺神社 的小路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwgaaomadj21hc0u0he1.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg9jlbylj21kw23ve83.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿通路 去 须贺神社 的小路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwga6n8cxj21hc0u01l6.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg9qqr04j21kw23vhdv.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;须贺神社前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwga2gnhnj21hc0u0u15.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg9ptj31j21kw23vkjn.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;须贺神社前&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwga9mg3dj21hc0u0u15.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://static.xingoxu.com/blog/sinaimg/6b8bbe7egy1fiwg9pzc9qj21kw23v7wk.jpg&quot; alt=&quot;最后互相寻找对方&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;须贺神社前&lt;/div&gt;
&lt;br /&gt;
完结~</content:encoded></item><item><title>探索 Service Worker “生命周期”</title><link>https://blog.xingoxu.com/2017/08/explore-service-worker-working-lifetime/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/08/explore-service-worker-working-lifetime/</guid><description>最近讨论 PWA 的好多啊，PWA 中有个非常重要的角色是 Service Worker 。刚写这篇文章的时候粗心一看，把现在发的 Working Draft 的发布时间以为就是 Service Worker 的发布时间，被棕神挑刺啦。spec 仓库的第一个 commit 是 2013 年 2 月 7 日，W3C 发第一个 Service Worker 的 public working draft 是 2014 年 5 月 8 日，第一个实现 Service Worker 的是 Chrome 40 （2015 年 1 月 21 日）

</description><pubDate>Fri, 11 Aug 2017 15:05:42 GMT</pubDate><content:encoded>&lt;p&gt;最近讨论 PWA 的好多啊，PWA 中有个非常重要的角色是 Service Worker 。刚写这篇文章的时候粗心一看，把现在发的 Working Draft 的发布时间以为就是 Service Worker 的发布时间，被棕神挑刺啦。spec 仓库的第一个 commit 是 2013 年 2 月 7 日，W3C 发第一个 Service Worker 的 public working draft 是 2014 年 5 月 8 日，第一个实现 Service Worker 的是 Chrome 40 （2015 年 1 月 21 日）&lt;/p&gt;

&lt;p&gt;以下将Service Worker简称为SW&lt;/p&gt;
&lt;p&gt;SW的功能略有耳闻，在MDN上它被描述为，“对资源缓存和自定义的网络请求进行控制的一个好的统筹机制”，同时他还具有“访问推送通知和后台同步API”&lt;/p&gt;
&lt;p&gt;听起来很神奇，事实上看起来也很神奇，Twitter上个月更新了样式，大家都看到了推特变成了圆头像圆角，然而推特还使用了新的 SW，在允许推特使用Notification的情况下，推特可以在你Chrome开启的时候而没有打开网页的时候给你推送你所关注的内容（&lt;a href=&quot;https://twitter.com/settings/web_notifications&quot;&gt;传送门&lt;/a&gt;），有一种javascript在关闭网页后，甚至没有打开网页的情况下，就能在后台运行的感觉。&lt;/p&gt;
&lt;p&gt;但事实上并非如此&lt;/p&gt;
&lt;h1&gt;编写一个最简单的 SW&lt;/h1&gt;
&lt;p&gt;从零创建 Service Worker，只需四步&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;：我们需要一张 index.html&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My first Service Worker test&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    Hello, Service Worker!
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;：我们需要一个 sw.js，他就是我们的service worker&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;When you see this, we have successfully registered the SW!&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;：我们需要在刚才的网页上注册，我们可以在网页中的js引入注册，在这里我直接写在了index.html的script标签&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  if (&apos;serviceWorker&apos; in navigator) {
    navigator.serviceWorker.register(&apos;/sw.js&apos;, { scope: &apos;/&apos; }).then(function(reg) {
      // registration worked
      console.log(&apos;Registration succeeded. Scope is &apos; + reg.scope);
    }).catch(function(error) {
      // registration failed
      console.log(&apos;Registration failed with &apos; + error);
    });
  }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;最后一步&lt;/strong&gt;：将上边的两个文件放在一个文件夹里，从这个文件夹起个服务器&lt;/p&gt;
&lt;p&gt;打开浏览器，访问localhost，让我们看看控制台&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d457727c83.png&quot; alt=&quot;一个最简单的 SW&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此，我们的第一个 SW 就成功完成了&lt;/p&gt;
&lt;h1&gt;SW 的 Debug&lt;/h1&gt;
&lt;p&gt;在chrome中，我们可以通过 &lt;a&gt;&lt;code&gt;chrome://serviceworker-internals/&lt;/code&gt;&lt;/a&gt; 查看浏览器注册的所有SW&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d45b36a053.png&quot; alt=&quot;chrome://serviceworker-internals/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以在 &lt;a&gt;&lt;code&gt;chrome://inspect/#service-workers&lt;/code&gt;&lt;/a&gt; 查看到当前正在运行的所有 SW&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d45ea6be64.png&quot; alt=&quot;chrome://inspect/#service-workers&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击inspect，可以在Console中看到SW在控制台中输出的内容，在Source中，对SW进行断点调试&lt;/p&gt;
&lt;p&gt;如果你还保留着刚才的那个localhost，你可以发现，在inspect service-worker页面中，我们刚才的sw.js还一直在运行着&lt;/p&gt;
&lt;h1&gt;Service Worker 的“生命周期”&lt;/h1&gt;
&lt;p&gt;SW 的生命周期与事件可以在MDN上找到，也不再重复贴出，SW的缓存与推送通知就是靠着他的生命周期所发出的这些&lt;code&gt;event&lt;/code&gt;来驱动的。&lt;/p&gt;
&lt;p&gt;我想说的是另一个生命周期，我刚才说到，如果我们第一次进入localhost，并一直保留在那个页面，在inspect service-worker还可以看到service worker还一直运行着&lt;/p&gt;
&lt;p&gt;我们可以将 sw.js 改写成如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;setInterval(() =&amp;gt; {
  console.log(&apos;test&apos;);
}, 5 * 1000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 chrome://serviceworker-internals/ 取消注册 SW ，并强制刷新 localhost（ mac下 ⌘+shift+R，windows 下 ctrl+shift+R ），我们会发现控制台中，每五秒就打印了一次 test，这也正是说明，SW在第一次进入的时候没有关闭页面的时候，一直在运行，我们也可以在刚才的 chrome://serviceworker-internals/ 看到这个 SW 正在运行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d4776cc312.png&quot; alt=&quot;5秒打印console.log(&apos;test&apos;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然而当我们关闭localhost页面，稍等十几秒后，在两个调试页面上，sw.js都会消失/停止了运行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d45b36a053.png&quot; alt=&quot;关闭localhost后 sw 停止了运行&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们再直接打开localhost，打开控制台，发现只有&lt;code&gt;Registration succeeded.&lt;/code&gt;，而没有了test，再看两个调试页面，发现sw.js依然没有运行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d498dc090f.png&quot; alt=&quot;重新再次打开页面 sw 没有运行&quot; /&gt;&lt;/p&gt;
&lt;p&gt;让我们关闭这个localhost，将 sw.js 改写如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Yet Another sw.js&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后，打开localhost&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d4b2ce1e1e.png&quot; alt=&quot;第一次改写sw.js&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们刚才对 SW 完成了一次更新，发现他注册 handler 只会注册一次，接下来我们对 SW 的生命周期与运行周期进行探索，看看他在打开网页时，会不会触发生命周期。&lt;/p&gt;
&lt;p&gt;然后我们再对 sw.js 进行重写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;self.addEventListener(&apos;install&apos;, function (event) {
  console.log(&apos;install&apos;);
});

self.addEventListener(&apos;activate&apos;, function (event) {
  console.log(&apos;activate&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关闭localhost，等待sw停止运行或者deactivate它后再打开localhost，控制台显示出了&lt;code&gt;install&lt;/code&gt;和&lt;code&gt;activate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d4b85023f5.png&quot; alt=&quot;改写sw.js 加入生命周期&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再次关闭 localhost ，等待 sw 停止运行再打开 localhost ，控制台上只有 registration succeeded&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d498dc090f.png&quot; alt=&quot;重新再次打开页面 sw 没有运行&quot; /&gt;&lt;/p&gt;
&lt;p&gt;很明显，SW 的生命周期的事件也只会触发一次，只是相对于他第一次下载后。&lt;/p&gt;
&lt;p&gt;更新SW的机制可以在MDN上的 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API/Using_Service_Workers#%E6%81%A2%E5%A4%8D%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%AF%B7%E6%B1%82&quot;&gt;#更新你的Service Worker&lt;/a&gt; 这章看到，但这仅仅几行文字，而且比较绕口，我认为这其实是SW自身的工作周期，或者说是运行机制&lt;/p&gt;
&lt;p&gt;于是在W3C Working Draft找到了Service Worker的&lt;a href=&quot;https://www.w3.org/TR/service-workers-1/#service-worker-lifetime&quot;&gt;Lifetime定义&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The lifetime of a service worker is tied to the execution lifetime of events and not references held by service worker clients to the ServiceWorker object.

A user agent may terminate service workers at any time it:

- Has no event to handle.
- Detects abnormal operation: such as infinite loops and tasks exceeding imposed time limits (if any) while handling the events.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是我觉得SW的工作周期结合上边的表现可以由下边的图来表示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/11/598d4e045ebfe.png&quot; alt=&quot;SW 工作周期&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其实图里有一点不对的是，sw 的第一次运行并不一定是网页关闭才结束的，根据标准来的话，只要 sw 没有 event 需要 handle ，sw 的工作进程都可以结束，只是 Chrome 下是如此运行的。&lt;/p&gt;
&lt;p&gt;另外需要一提的是因为工作线程结束了，因此在外边的变量不一定还保持着之前结束前的状态，所以不要写出如下的代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let count = 0;
self.addEventListener(&apos;fetch&apos;, function (event) {
  count++;
  console.log(count);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能为1，也可能是2&lt;/p&gt;
&lt;h1&gt;最后&lt;/h1&gt;
&lt;p&gt;SW 是一个事件驱动型Worker，本质上，它是个Worker，工作在 worker context，所以没有访问 DOM 的权限&lt;/p&gt;
&lt;p&gt;如果他要和window进行一些操作的话，与web worker类似，需要使用postMessage这样的方法来传递信息，在window里才能进行DOM操作&lt;/p&gt;
&lt;p&gt;SW 是个Event bus，他的几个运行周期的事件，是专门为缓存与推送量身打造的（install事件和push事件），因此他的扩展性也非常好，以后如果有更多需求只需添加事件即可（比如chrome实现了sync事件是为了弥补离线时从本地到服务器post的不好体验），它将我们对资源拉的需求（对服务器的请求资源，对服务器的轮询），隐形转换为了推（本地缓存资源代码控制缓存，统一服务器推送）&lt;/p&gt;
</content:encoded></item><item><title>交叉编译原版某不可描述程序为梅林某停更插件续命</title><link>https://blog.xingoxu.com/2017/08/cross-compile-55-libev/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/08/cross-compile-55-libev/</guid><description>&amp;gt; Forked from [原文 and 非自审查版](http://telegra.ph/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E5%8E%9F%E7%89%88shadowsocks%E4%B8%BAkoolshare%E6%A2%85%E6%9E%97ss%E6%8F%92%E4%BB%B6%E7%BB%AD%E5%91%BD-08-07)

# 准备环境

1. ubuntu 16.04
2. [原版梅林源码](https://github.com/RMerl/asuswrt-merlin)
3. ss-libev 源码

</description><pubDate>Mon, 07 Aug 2017 14:41:43 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Forked from &lt;a href=&quot;http://telegra.ph/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E5%8E%9F%E7%89%88shadowsocks%E4%B8%BAkoolshare%E6%A2%85%E6%9E%97ss%E6%8F%92%E4%BB%B6%E7%BB%AD%E5%91%BD-08-07&quot;&gt;原文 and 非自审查版&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;准备环境&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;ubuntu 16.04&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RMerl/asuswrt-merlin&quot;&gt;原版梅林源码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ss-libev 源码&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;原理说明&lt;/h1&gt;
&lt;p&gt;解包梅林 SS 插件发现，基本都是脚本，核心都是调用 ss-redir ，因此猜测 ss-redir 为原版 SS ，只需要更新原版 SS ，并在前端进行相应修改，便能对其续命&lt;/p&gt;
&lt;h2&gt;ubuntu 16.04&lt;/h2&gt;
&lt;p&gt;不是很了解 linux，但是应该只要能够运行 arm-linux-gcc 的 linux 发行版都可以，但我在 ubuntu 16.04 下实验成功，因此这里写 ubuntu 16.04，当然 docker 是可以的（因为我就是在 macos 下用的 docker）&lt;/p&gt;
&lt;h2&gt;原版梅林源码&lt;/h2&gt;
&lt;p&gt;虽然是 koolshare 改版固件，但其还是合并了梅林的代码，因此可以使用梅林的交叉编译工具链&lt;/p&gt;
&lt;p&gt;下载时，注意对应相对的梅林版本号，可以看一下固件发布时的说明&lt;/p&gt;
&lt;p&gt;梅林的交叉编译工具链在梅林源码 &lt;code&gt;release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3&lt;/code&gt;，release 下应该是固件版本的不同，但几个固件版本下的 toolchains 均指向这个文件夹，应该是 toolchains 没有改变过&lt;/p&gt;
&lt;h2&gt;ss-libev 源码&lt;/h2&gt;
&lt;p&gt;不解释&lt;/p&gt;
&lt;h1&gt;炼丹编译&lt;/h1&gt;
&lt;h2&gt;镜像准备与 arm-linux-gcc&lt;/h2&gt;
&lt;p&gt;ubuntu 首先需要安装一些编译工具，如果对系统有洁癖的，推荐使用docker，我使用了别人写好的 DockerFile 的镜像&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mritd/dockerfile/tree/master/asuswrt-merlin-build&quot;&gt;Asuswrt Merlin 固件交叉编译环境&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动并挂载源码，运行 &lt;code&gt;docker exec -it container-name zsh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;进入容器后尝试运行 &lt;code&gt;arm-linux-gcc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果出现 &lt;code&gt;arm-linux-gcc: no input files&lt;/code&gt; 说明正常，进行下一步&lt;/p&gt;
&lt;p&gt;如果出现 其他，请检查路径，权限，否则等下编译出来的可能是 ubuntu 的 ss （我之前编译时，解压后arm-linux-gcc没有运行权限，于是没法编译，给了权限就可以了）&lt;/p&gt;
&lt;h2&gt;编译 SS 依赖与 SS&lt;/h2&gt;
&lt;p&gt;编译 SS 还有一些依赖需要安装，以下过程参阅&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://haoutil.com/topic/cross-compile-shadowsocks-libev&quot;&gt;交叉编译SS-libev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需要编译 &lt;code&gt;mbedTLS&lt;/code&gt;、&lt;code&gt;pcre&lt;/code&gt;、&lt;code&gt;libsodium&lt;/code&gt;、&lt;code&gt;libev&lt;/code&gt;、&lt;code&gt;libudns&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;按照原博文的编译后，最后编译 SS 时死活没有检测到编译了libudns，怕是编译后文件夹没有添加到 &lt;code&gt;PATH&lt;/code&gt; 中，当然刚才的博文里还提供了一键编译脚本，但那个一键编译脚本中判断参数的部分在ubuntu里报错，于是我就去了，直接写死环境 &lt;code&gt;arm-linux&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;fork了一下&lt;/p&gt;

&lt;p&gt;编译过程大约需要持续 5-10 分钟&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/07/5987eac266528.png&quot; alt=&quot;编译开始&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/07/5987f6bf102a1.png&quot; alt=&quot;编译成功&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用一键脚本编译的话，在 &lt;code&gt;dists/ss-libev/bin&lt;/code&gt; 中拿到 &lt;code&gt;ss-redir&lt;/code&gt;，将他scp到路由器上，执行 &lt;code&gt;ss-redir -v&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2017/08/07/5987e533d41aa.jpg&quot; alt=&quot;编译成功后运行ss-redir -v&quot; /&gt;&lt;/p&gt;
&lt;p&gt;出现以上则为成功&lt;/p&gt;
&lt;h1&gt;替换原插件并自行打包&lt;/h1&gt;
&lt;p&gt;Fork原插件repo&lt;/p&gt;
&lt;p&gt;&lt;code&gt;base=shadowsocks&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./ss/ssconfig.sh&lt;/code&gt; 中将地址更换成自己的repo可以使用自动更新&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./version&lt;/code&gt; 第一行是版本号  第二行是 tar.gz 的 hash值&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./bin&lt;/code&gt; SS 的各种二进制执行文件，可以将刚才编译出来的东西都覆盖进来&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./webs/Main_Ss_Content.asp&lt;/code&gt; 前端界面，加加密方式都在这里添加&lt;/p&gt;
</content:encoded></item><item><title>2017 野良神圣地巡礼</title><link>https://blog.xingoxu.com/2017/06/noragami-seichijunrei/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/06/noragami-seichijunrei/</guid><description>上个月人生的第一次出国以及第一次赴日去了东京，巡了君名和野良神还有一些四月的圣地，回来后一直在~~忙~~（忙着玩塞尔达和p5），当然工作也是挺多的挺烦的，于是今天稍稍有那么点空闲时间整理一下

时间还算比较充裕，就把第一季和ARAGOTO那些印象比较深的巡了，另外野良神和其他几个动画搞了个圣地巡礼的app，大多数地点在那个上边也有标注，app的名字叫「舞台めぐり」
&lt;br /&gt;


&lt;div&gt;

![ARAGOTO EP07](https://ooo.0o0.ooo/2017/06/04/59339ee10d3e0.jpg)&lt;/div&gt;&lt;div&gt;

![ARAGOTO EP07](https://ooo.0o0.ooo/2017/06/04/59339ee32e9ad.jpg)&lt;/div&gt;
&lt;div&gt;西新宿&lt;/div&gt;

这边正好在修路，没法搞到很好的角度



&lt;br /&gt;

&lt;div&gt;

![ARAGOTO EP07](https://ooo.0o0.ooo/2017/06/04/5933a3f92feb9.jpg)&lt;/div&gt;&lt;div&gt;

![ARAGOTO EP07](https://ooo.0o0.ooo/2017/06/04/5933a3ff26b98.jpg)&lt;/div&gt;
&lt;div&gt;刚才那张的对面&lt;/div&gt;</description><pubDate>Sun, 04 Jun 2017 13:28:41 GMT</pubDate><content:encoded>&lt;p&gt;上个月人生的第一次出国以及第一次赴日去了东京，巡了君名和野良神还有一些四月的圣地，回来后一直在&lt;s&gt;忙&lt;/s&gt;（忙着玩塞尔达和p5），当然工作也是挺多的挺烦的，于是今天稍稍有那么点空闲时间整理一下&lt;/p&gt;
&lt;p&gt;时间还算比较充裕，就把第一季和ARAGOTO那些印象比较深的巡了，另外野良神和其他几个动画搞了个圣地巡礼的app，大多数地点在那个上边也有标注，app的名字叫「舞台めぐり」
&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/59339ee10d3e0.jpg&quot; alt=&quot;ARAGOTO EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/59339ee32e9ad.jpg&quot; alt=&quot;ARAGOTO EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;西新宿&lt;/div&gt;
&lt;p&gt;这边正好在修路，没法搞到很好的角度&lt;/p&gt;

&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a3f92feb9.jpg&quot; alt=&quot;ARAGOTO EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a3ff26b98.jpg&quot; alt=&quot;ARAGOTO EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;刚才那张的对面&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a6f83ad8c.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a6fa247b8.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;新宿駅南改札口后边的通道&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a7ebb1901.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a7ed97a44.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;湯島天満宮&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a91bbabdf.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933a91d66d0c.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;東京メトロ湯島駅&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aa0149fc8.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aa02a5912.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;湯島天満宮入口&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aa3de6da4.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aa3f9776c.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;湯島天満宮入口 近距离&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933ab1c37646.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933ab1e204ef.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;上野公园科技馆门口&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aaf4d4ec3.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933aaf683a6a.jpg&quot; alt=&quot;无印 EP10&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;上野公园&lt;/div&gt;至此，东京市中心结束
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933acd05887f.jpg&quot; alt=&quot;无印 EP02&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933acd1ef0bf.jpg&quot; alt=&quot;无印 EP02&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大泉学園駅&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933ad61024a7.jpg&quot; alt=&quot;无印 EP01&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933ad61e63c8.jpg&quot; alt=&quot;无印 EP01&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大泉学園駅&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933af4346583.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933af455f606.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大泉学園駅ホーム&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933af51ea015.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933af53b0456.jpg&quot; alt=&quot;无印 EP03&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;大泉学園駅ホーム&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b0cd9e364.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b0cfc86ed.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;練馬 梨の花公園 附近的通路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b0f56bf05.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b0f7ece2c.jpg&quot; alt=&quot;无印 EP05&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;練馬 梨の花公園 附近的通路&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b15a367e6.jpg&quot; alt=&quot;无印 EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b15bb00e7.jpg&quot; alt=&quot;无印 EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;練馬 梨の花公園&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b1ab4d835.jpg&quot; alt=&quot;无印 EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b1ac8c0c3.jpg&quot; alt=&quot;无印 EP07&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;練馬 梨の花公園&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b33ea643d.jpg&quot; alt=&quot;无印 EP04&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b34072305.jpg&quot; alt=&quot;无印 EP04&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;石神井公園内的一家店 小福家的店&lt;/div&gt;因为这家店不让拍照，只能远远拍一张表示来过了
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b34dcc77c.jpg&quot; alt=&quot;无印 EP02&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/06/04/5933b34ff1170.jpg&quot; alt=&quot;无印 EP02&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;石神井公園去駅的散步小路&lt;/div&gt;
&lt;p&gt;还有君名的，等七月bd发售了再截图整理吧&lt;/p&gt;
</content:encoded></item><item><title>寿屋 李小狼 1/7</title><link>https://blog.xingoxu.com/2017/04/kotobukiya-syaoran/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/04/kotobukiya-syaoran/</guid><description>&amp;gt; [bgm 人物介绍](https://bgm.tv/character/6527)
&amp;gt; 
&amp;gt; [MyFigureCollection.net](http://myfigurecollection.net/item/236142)
&amp;gt;
&amp;gt; [Amazon.co.jp](https://www.amazon.co.jp/dp/B00QUQ431K)


コトブキヤ ARTFX J カードキャプターさくら 李小狼 1/7 スケール PVC 製 塗装済み完成品フィギュア

壽屋

</description><pubDate>Sun, 16 Apr 2017 14:57:56 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://bgm.tv/character/6527&quot;&gt;bgm 人物介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://myfigurecollection.net/item/236142&quot;&gt;MyFigureCollection.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B00QUQ431K&quot;&gt;Amazon.co.jp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;コトブキヤ ARTFX J カードキャプターさくら 李小狼 1/7 スケール PVC 製 塗装済み完成品フィギュア&lt;/p&gt;
&lt;p&gt;壽屋&lt;/p&gt;

&lt;p&gt;「見つけた。『クロウカード』の気配だ。」&lt;/p&gt;
&lt;p&gt;壽屋『カードキャプターさくら』フィギュアシリーズ第二弾!
今でも絶大な人気を誇る名作『カードキャプターさくら』より、「李小狼」が ARTFX J シリーズで登場!&lt;/p&gt;
&lt;p&gt;男性、女性共に幅広い支持を持つ人気キャラクター「李小狼」を立体化。
CLAMP のイラストを元に、戦闘用の装束を身にまとった姿を再現致しました。
凛々しさの中に年相応のあどけなさが垣間見える表情や、装束を翻した大胆なポージングに加え、小狼の羅針盤をモチーフにしたベースが作品の世界観をより一層引き立てます。&lt;/p&gt;
&lt;p&gt;コトブキヤ ARTFX J「カードキャプターさくら」シリーズ第二弾。
圧倒的なクオリティを是非お手に取ってお確かめください。&lt;/p&gt;
&lt;p&gt;售价： ¥11,000&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f301d5e00f7.jpg&quot; alt=&quot;与盒对比&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;总览&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f30ddac0986.jpg&quot; alt=&quot;总览1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f30e257c5c8.jpg&quot; alt=&quot;总览2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f30e27b49cf.jpg&quot; alt=&quot;总览3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f30e32c9af8.jpg&quot; alt=&quot;总览4&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;细节&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107cec352.jpg&quot; alt=&quot;正脸&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107c747a6.jpg&quot; alt=&quot;侧脸&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107be0a0a.jpg&quot; alt=&quot;左侧脸&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107b9413b.jpg&quot; alt=&quot;右侧脸&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107c6dad5.jpg&quot; alt=&quot;半侧脸-脖子&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最喜欢的是脖子下方的白色里边的衣服，也是做得非常的精细&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f3107b567f2.jpg&quot; alt=&quot;剑&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;非常精致的手办，很棒&lt;/p&gt;
</content:encoded></item><item><title>UC 厂 百夜优一郎</title><link>https://blog.xingoxu.com/2017/04/uc-hyakuya-yuichiro/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/04/uc-hyakuya-yuichiro/</guid><description>&amp;gt; [bgm 人物介绍](https://bgm.tv/character/28623)
&amp;gt; 
&amp;gt; [MyFigureCollection.net](http://myfigurecollection.net/item/286361)
&amp;gt;
&amp;gt; [Amazon.co.jp](https://www.amazon.co.jp/dp/B017AT19HQ)

mensHdge technical statue No.21 終わりのセラフ 百夜優一郎 ノンスケール ATBC-PVC 製 塗装済みフィギュア

ユニオンクリエイティブ

</description><pubDate>Sun, 16 Apr 2017 00:03:42 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://bgm.tv/character/28623&quot;&gt;bgm 人物介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://myfigurecollection.net/item/286361&quot;&gt;MyFigureCollection.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/B017AT19HQ&quot;&gt;Amazon.co.jp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;mensHdge technical statue No.21 終わりのセラフ 百夜優一郎 ノンスケール ATBC-PVC 製 塗装済みフィギュア&lt;/p&gt;
&lt;p&gt;ユニオンクリエイティブ&lt;/p&gt;

&lt;p&gt;「その人間の醜さに怯えながら死ね 吸血鬼」&lt;/p&gt;
&lt;p&gt;『終わりのセラフ』より百夜優一郎が立体化! ・マントは着脱可能!&lt;/p&gt;
&lt;p&gt;[セット内容] ・本体 ・台座&lt;/p&gt;
&lt;p&gt;附赠一张与手办姿势一致的相卡&lt;/p&gt;
&lt;p&gt;售价 ¥9,074&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f2374f069b2.jpg&quot; alt=&quot;与盒对比&quot; /&gt;&lt;/p&gt;
&lt;p&gt;三角底座&lt;/p&gt;
&lt;h1&gt;总览&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f239fe0be6b.jpg&quot; alt=&quot;总览1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23a55beba4.jpg&quot; alt=&quot;总览2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23ac6ce866.jpg&quot; alt=&quot;总览3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;披风可脱&lt;/p&gt;
&lt;p&gt;脱下披风&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23ba8ebf06.jpg&quot; alt=&quot;脱下披风1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23c179335b.jpg&quot; alt=&quot;脱下披风2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23c369b509.jpg&quot; alt=&quot;脱下披风3&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;细节展示&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f24015f0a78.jpg&quot; alt=&quot;腿1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f240bd21aec.jpg&quot; alt=&quot;腿2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/16/58f24387309b9.jpg&quot; alt=&quot;腿3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23ab70c206.jpg&quot; alt=&quot;腿4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;小优的腿非常细长，还原的特别棒&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f2410eebc55.jpg&quot; alt=&quot;剑&quot; /&gt;&lt;/p&gt;
&lt;p&gt;剑的颜色很棒，细节还是比较到位的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f24198865cf.jpg&quot; alt=&quot;正脸1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f242ec38660.jpg&quot; alt=&quot;正脸2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f2432996026.jpg&quot; alt=&quot;正脸3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f2418710169.jpg&quot; alt=&quot;侧脸1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f2437a5df8c.jpg&quot; alt=&quot;侧脸2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f24202c7096.jpg&quot; alt=&quot;侧脸3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;脸的还原度还是比较高的，也不错，虽然头发在有些角度看上去有些奇怪，总体还是不错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/15/58f23c9853de4.jpg&quot; alt=&quot;缺点&quot; /&gt;&lt;/p&gt;
&lt;p&gt;身上，衣服上的细节均或多或少有所变形 有一种崩坏的感觉，最明显的比如腰带，但每个细节还是有做，勉强过得去吧&lt;/p&gt;
&lt;p&gt;腰带下方的衣服颜色有很奇怪的痕迹&lt;/p&gt;
&lt;p&gt;披风的固定不牢固，容易松动，图上就是松动了的披风&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;还是一个可以入的手办，只是这个性价比略低，史老师做工感觉要比小优好很多，只比小优贵1000&lt;/p&gt;
</content:encoded></item><item><title>谈一谈 surface pro 4 和 macbook pro 2016</title><link>https://blog.xingoxu.com/2017/04/macbook-and-surface/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/04/macbook-and-surface/</guid><description>前年12月入手的surface pro 4，去年11月入手的mbp，都是第一时间下单的，所以其实很早就想做一个对比，或者说在拿到sp4之后就想写一个感受，只是一直没有时间去想这些事情

此文结论先写在前面：
&amp;gt; web开发，请选择 macOS与macbook pro

</description><pubDate>Thu, 13 Apr 2017 17:11:22 GMT</pubDate><content:encoded>&lt;p&gt;前年12月入手的surface pro 4，去年11月入手的mbp，都是第一时间下单的，所以其实很早就想做一个对比，或者说在拿到sp4之后就想写一个感受，只是一直没有时间去想这些事情&lt;/p&gt;
&lt;p&gt;此文结论先写在前面：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;web开发，请选择 macOS与macbook pro&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;上两张购买图&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/11/58ec53869fecd.png&quot; alt=&quot;apple订单&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/11/58ec5386c1a70.png&quot; alt=&quot;微软订单&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;谈一谈sp4的感受&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;性能不错，总体比普通笔记本好一点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面细讲&lt;/p&gt;
&lt;h2&gt;优点&lt;/h2&gt;
&lt;h3&gt;外观&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;很潮&lt;/li&gt;
&lt;li&gt;很好看&lt;/li&gt;
&lt;li&gt;很薄&lt;/li&gt;
&lt;li&gt;很轻便&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;性能&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;六代低压i7很快，个人感觉比我的三代i5快很多&lt;/li&gt;
&lt;li&gt;屏幕颜色很棒&lt;/li&gt;
&lt;li&gt;炉石可以在小屏幕上直接玩，非常少的时候会掉帧，其他60帧运行&lt;/li&gt;
&lt;li&gt;ow试过，低画质1920*1080 30-40帧左右&lt;/li&gt;
&lt;li&gt;windows hello 识别进系统很好用！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我觉得他并不是一台游戏机，所以我没有看中它的显卡，所以3 4我只是非常偶然的用过一次，就不再用了，还是不要指望显卡太多比较好&lt;/p&gt;
&lt;h2&gt;缺点&lt;/h2&gt;
&lt;h3&gt;背后支架 键盘盖&lt;/h3&gt;
&lt;p&gt;听说这是拿过专利的，&lt;strong&gt;但是&lt;/strong&gt;当你把它当普通笔记本想在地铁上，公交车上，想在腿上写点什么，sp4就嘲笑你的大腿短，我是要保持一个如何的姿势才能看到屏幕&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/11/58ec58709c7b5.png&quot; alt=&quot;背后支架示意图1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;还有&lt;/p&gt;
&lt;p&gt;我想在桌上用sp4画画，然后非常尴尬，sp4最大角度听说是150度左右，但是在桌上画画，你想要的角度正好是150-180度之间，于是你就怎么都觉得手很不爽，还不如wacom，后边带翅膀的键盘🙄&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/11/58ec59e30ce82.png&quot; alt=&quot;背后支架示意图1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;笔&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;延迟很大&lt;/li&gt;
&lt;li&gt;在玻璃上写字不准&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;延迟很大，我用onenote都有感觉慢，用ps就更明显了，下笔经常停顿，用画图则没有这种感觉，当然也没有了笔压&lt;/p&gt;
&lt;p&gt;不准，因为我从来没写过这么丑的字，要写好字花很长时间，没有真笔写得好，再加上延迟，科科&lt;/p&gt;
&lt;p&gt;还有一些老生常谈的问题，大家都知道&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;散热&lt;/li&gt;
&lt;li&gt;续航&lt;/li&gt;
&lt;li&gt;系统&lt;/li&gt;
&lt;li&gt;休眠&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;散热&lt;/h3&gt;
&lt;p&gt;不要说使用很激烈了，莫名其妙的转风扇，莫名其妙的又不转风扇，不是很懂，开个音乐开个ps就转了，热倒也就算了，就是太吵了&lt;/p&gt;
&lt;h3&gt;续航&lt;/h3&gt;
&lt;p&gt;最多4小时，别听微软xjb吹了&lt;/p&gt;
&lt;h3&gt;系统&lt;/h3&gt;
&lt;p&gt;win10小问题非常多，且不说开发环境的问题，开机键盘完全不能用，要等实足两分钟，有时莫名其妙卡住（冻住），得等一会又突然好了&lt;/p&gt;
&lt;p&gt;高分屏支持又很差，很多软件外接显示器的字体大小和你单独在surface上看的大小又不一样，每次得设置，又或者是根本没法设置&lt;/p&gt;
&lt;p&gt;没有键盘盖基本不能打字，什么屏幕键盘啊，难用的一笔&lt;/p&gt;
&lt;h3&gt;休眠&lt;/h3&gt;
&lt;p&gt;有问题 非常大的问题，几次说修好了，几次触发了我内心的阴影，合盖风扇不停转最后电池用光了，正确的休眠方式，把键盘盖拿掉按电源键休眠，基本没有问题&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;所以综上所述我觉得他比普通笔记本来说并没有提升什么太多，而且屏幕也不怎么大够用，微软画的饼还没有实现，so what，不如把这点钱拿去炒股（笑）&lt;/p&gt;
&lt;p&gt;也千万别想着什么边走边画，这种场景，不存在的，你可能需要的，就只是一台笔记本&lt;/p&gt;
&lt;h1&gt;谈一谈mbp的感受&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;开发很棒&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面细讲&lt;/p&gt;
&lt;h2&gt;优点&lt;/h2&gt;
&lt;h3&gt;外观&lt;/h3&gt;
&lt;p&gt;手感很好，包括键盘，触摸板是广受好评，老生常谈，非常棒
新的几个特性touchbar 指纹解锁什么的，虽说touchbar用的不多，但是也还算中规中矩，不差&lt;/p&gt;
&lt;h3&gt;性能&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;其实也算是低压i5，但也没有慢到哪里去，总之开发很棒&lt;/li&gt;
&lt;li&gt;屏幕很好&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;系统&lt;/h3&gt;
&lt;p&gt;我觉得mbp最好的就是macOS在搭建开发环境上的便利，brew，命令行什么的，在windows下你要在各种窗口里切换，怎么地，打开一个bash最快也要右键点git bash，都是模拟环境，macOS上就是自己设定了快捷键之后一按就可以敲命令了&lt;/p&gt;
&lt;p&gt;安装环境也是非常的快，基本不会看到windows的那种莫名其妙的错误提示，出错了，看着提示就能知道发生了什么，一般也就是sudo 的事情&lt;/p&gt;
&lt;p&gt;更可贵的是，我在macOS下成功make了，我在centos里从来就没有make成功过东西&lt;/p&gt;
&lt;h2&gt;缺点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;很多好用的软件都要买&lt;/li&gt;
&lt;li&gt;外接显示器是灾难，需要设置一番，会有一些不便利（我这里插拔显示器需要重新关闭打开一次显示器）&lt;/li&gt;
&lt;li&gt;系统还是有一些小问题的，但无伤大雅，没有微软那么严重，碰到过几次五国，碰到过花屏，但都是茶余饭后的消遣罢了，真的，比较少看见&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;对比&lt;/h1&gt;
&lt;p&gt;没有对比就没有伤害&lt;/p&gt;
&lt;h2&gt;续航&lt;/h2&gt;
&lt;p&gt;sp4 4小时
mbp 5小时 吧&lt;/p&gt;
&lt;h2&gt;重量&lt;/h2&gt;
&lt;p&gt;sp4更轻  如果mbp有sp4的重量就好了，mbp两块铁皮实在是重（也没有那么重，就是对比起来那个轻的比较多）&lt;/p&gt;
&lt;h2&gt;接口&lt;/h2&gt;
&lt;p&gt;sp4 一个usb 一个dp 一个磁吸口
mbp 四个type-c&lt;/p&gt;
&lt;p&gt;很多人喷mbp的接口都是type-c的，太激进&lt;/p&gt;
&lt;p&gt;事实上mbp 除非单输出外接显示器，否则你是不需要鼠标的，然后现在基本也不用u盘传文件了，那么基本来说，这些口其实对你来说根本没有什么关系&lt;/p&gt;
&lt;p&gt;于是我现在四个口都在干嘛呢&lt;/p&gt;
&lt;p&gt;一个接显示器，usb-c to dp，一定记住买显示器千万不要买hdmi的，很坑，当然我既然已经用了surface过了，当然就不会再用hdmi显示器了&lt;/p&gt;
&lt;p&gt;一个接外置网卡和3个usb的hub，有时会连手机充电，主要是网卡，内网传文件会比较快（家里有NAS），正常来说用5Ghz的无线就非常足够了&lt;/p&gt;
&lt;p&gt;一个接电源&lt;/p&gt;
&lt;p&gt;在这个接口问题上，每个人都有每个人的想法用途，我就罗列一下自己的需求&lt;/p&gt;
&lt;h2&gt;综合对比&lt;/h2&gt;
&lt;p&gt;最后一个综合对比就是网上大家经常说的生产力&lt;/p&gt;
&lt;p&gt;一个是office，office在mac上也有，现在也是office 365，mac上也是更新很快，touchbar一出微软也跟进，设计上和win也是基本同一，要说不方便，可能刚上手会有一些问题，但是就一个码农的角度来说，我用的office的功能区别不大，稍微熟悉一下还是马上就能get到的&lt;/p&gt;
&lt;p&gt;另一个是QQ问题，QQ虽然没有win上功能那么多，基本功能也都满足了，还没有win的那么臃肿，特别是包括5.4.1版本之前 都没有撤回功能哦，个人觉得并不烂&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;从我个人的需求来说，感觉mbp要比surface好用很多，我觉得系统上的便利比surface那些硬件上的便利要好很多很多很多，而且surface非常不稳定&lt;/p&gt;
&lt;p&gt;最后上一张图表示一下自己的工作环境&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/04/13/58ef41b98caec.jpg&quot; alt=&quot;工作环境&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>探究/使用webpack的AMD</title><link>https://blog.xingoxu.com/2017/01/webpack-amd/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/01/webpack-amd/</guid><description>什么？webpack出2了？

刚用了小半年的webpack就又要重头学过了？

![摊手](https://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/pcmoren_tanshou_thumb.png)

那么试试吧？先试试改造一下blog？

我擦？怎么用requirejs？

</description><pubDate>Sun, 22 Jan 2017 17:13:19 GMT</pubDate><content:encoded>&lt;p&gt;什么？webpack出2了？&lt;/p&gt;
&lt;p&gt;刚用了小半年的webpack就又要重头学过了？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/pcmoren_tanshou_thumb.png&quot; alt=&quot;摊手&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么试试吧？先试试改造一下blog？&lt;/p&gt;
&lt;p&gt;我擦？怎么用requirejs？&lt;/p&gt;

&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;也不算熟悉webpack吧，1的时候用vue-cli bootstrap了萌购的几个手机页面，虽说其实完全不用关心构建这一块，只需要改改路径就可以了，但闲下来的时候好奇心也是会驱动自己看看别人是怎么写的构建文件的，不过看别人写的构建文件，又稍微看了点其他网站的webpack的有关教程，自己倒也是没有想到AMD这件事情，也对webpack并不怎么熟悉，而且1的文档也实在是狗屎的可以，就停留在会用，会模仿着套路写&lt;/p&gt;
&lt;p&gt;前两天2出了，看看这新的文档站，手边又正好不怎么忙，那么看看&lt;/p&gt;
&lt;p&gt;官方风格不错，也有很好的introduction和concept的解释，重新学习了一下官方对loaders的定义，不过2刚出，文档站里也有很多问题，比如loaders现在叫rules但文档里还是loaders等这样的小问题&lt;/p&gt;
&lt;p&gt;不过这些字眼看多了，小困难轻松克服，再看看migrate，貌似并没有什么大改动，想给公司项目试试，不过看vue-cli官方生成的构建文件里的loaders是动态生成的，于是先暂时放一放。那先试试自己的blog，改造一下，打开主题的main.js，马上反应过来一个问题，靠，我以前用AMD写的&lt;/p&gt;
&lt;h1&gt;import requirejs from &apos;requirejs&apos;;&lt;/h1&gt;
&lt;p&gt;前情提要结束，回到正题，webpack里怎么用上AMD？&lt;/p&gt;
&lt;p&gt;直觉告诉我，import requirejs from &apos;requirejs&apos;;&lt;/p&gt;
&lt;p&gt;好吧，在写下这行代码前，我去requirejs的官网看了&lt;a href=&quot;http://requirejs.org/docs/node.html#3&quot;&gt;文档&lt;/a&gt;
看了，也没讲到构建工具，但就写法来说，都是一样的，那么试试&lt;/p&gt;
&lt;p&gt;哦对了，忘记贴我的构建文件了，不过也没东西，就指定了入口和出口&lt;/p&gt;

&lt;p&gt;然后 &lt;code&gt;npm install webpack --save-dev &amp;amp;&amp;amp; npm install requirejs --save&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后入口点app.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requirejs from &apos;requirejs&apos;;

console.log(&apos;passed&apos;, &quot;I&apos;m in app.js&quot;);

requirejs([&apos;./async.js&apos;], function (asyncModule) {
  asyncModule.init();
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;async.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define([],function(){
  return {
    init(){
      console.log(&quot;I&apos;m in async.js&quot;);
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/58849f426e077.png&quot; alt=&quot;import requirejs&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好的，无情报错，unexpected character，打开看了一下这个r.js，第一行显示是注释，但在webpack却报错了，看来是姿势不对&lt;/p&gt;
&lt;h1&gt;搜索一下&lt;/h1&gt;
&lt;p&gt;那么在webpack中怎么用上AMD呢，搜了webpack 1的&lt;a href=&quot;http://webpack.github.io/docs/api-in-modules.html#require-amd&quot;&gt;文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;哦？原来直接就能写？
试试，去掉import，直接require看看？async.js不变，app.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;passed&apos;, &quot;I&apos;m in app.js&quot;);

require([&apos;./async.js&apos;], function (asyncModule) {
  asyncModule.init();
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时出现
&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884a3812a1e9.png&quot; alt=&quot;直接require并传函数进去&quot; /&gt;&lt;/p&gt;
&lt;p&gt;发现我们的async被打包成了0.bundle.js&lt;/p&gt;
&lt;p&gt;让我们打开浏览器看看
&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884a3e560cd8.png&quot; alt=&quot;浏览器成功运行1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看Network和源文件，的确是异步&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884a41a3dfa0.png&quot; alt=&quot;Network 1&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884a43180145.png&quot; alt=&quot;Source 1&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;require.ensure&lt;/h1&gt;
&lt;p&gt;在2的文档中，并没有找到这个require的异步用法，倒是找到了migrating from v1的require.ensure，通过这个 找到了2的一个文档，疑似发现了webpack的AMD&lt;a href=&quot;https://webpack.js.org/guides/code-splitting-require/#require-ensure-&quot;&gt;文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;webpack 2把这个api单独拿出来讲了一整页是有它的道理
一个是，webpack2把这个现在这样的引用 也看成引用一个chunk，只不过是异步引用
另一个是，没有了以前1的require AMD用法，可能将来会弃用？&lt;/p&gt;
&lt;p&gt;从文档上也得知了，用这样的api，可以对chunkname进行指定，那我们来试试，app.js改成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;passed&apos;, &quot;I&apos;m in app.js&quot;);

require.ensure([&apos;./async.js&apos;], function (require) {
  var asyncModule = require(&apos;./async.js&apos;);
  console.log(asyncModule); //等下再说
  asyncModule.init();
},&apos;async&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器控制台还是正常输出了&lt;/p&gt;
&lt;p&gt;但我们输出的文件还是0.bundle.js啊&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884a7e1b5563.png&quot; alt=&quot;使用require.ensure bash中 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;眉头一紧，觉得事情有蹊跷&lt;/p&gt;
&lt;p&gt;赶紧搜索一下2的文档，&lt;a href=&quot;https://webpack.js.org/configuration/output/#output-filename&quot;&gt;找到filename&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note this options does not affect output files for on-demand-loaded chunks. For these files the &lt;strong&gt;output.chunkFilename&lt;/strong&gt; option is used. It also doesn&apos;t affect files created by loaders. For these files see loader options.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好的，去看&lt;a href=&quot;https://webpack.js.org/configuration/output/#output-chunkfilename&quot;&gt;chunkFileName&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原来如此，给config加上这么一条&lt;code&gt;chunkFilename: &apos;[name].js&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;现在再构建一次试试&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884aab1c137b.png&quot; alt=&quot;使用require.ensure bash中 2&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;AMD模块的写法&lt;/h1&gt;
&lt;h2&gt;es6的exports写法&lt;/h2&gt;
&lt;p&gt;让我们改变一下AMD模块的写法，之前我们是用标准的AMD define，那么ES6的exports写法会怎么样呢？&lt;/p&gt;
&lt;p&gt;app.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;passed&apos;, &quot;I&apos;m in app.js&quot;);

require.ensure([&apos;./async.src.js&apos;], function (require) {
  var asyncModule = require(&apos;./async.js&apos;);
  console.log(asyncModule);
  asyncModule.init();
},&apos;async&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;async.src.js （刚才不当心取名async覆盖掉了原来的async.js）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
  init() {
    console.log(&quot;I&apos;m in async.js&quot;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器报错
&lt;img src=&quot;https://ooo.0o0.ooo/2017/01/22/5884ada8243fb.png&quot; alt=&quot;浏览器报错&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个问题webpack没有给我们答案，不过我在 stackoverflow 的解释中看到了&lt;a href=&quot;http://stackoverflow.com/questions/33704714/cant-require-default-export-value-in-babel-6-x&quot;&gt;答案&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;自动检测的写法&lt;/h2&gt;
&lt;p&gt;有很多插件是这种写法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function (root, factory) {
    if (typeof define === &apos;function&apos; &amp;amp;&amp;amp; define.amd) {
        define([&apos;jquery&apos;], factory);
    } else {
        factory(root[&apos;jQuery&apos;]);
    }
}(this, function ($) {

    console.log($);
    console.log(&quot;I&apos;m in async.js !&quot;);
    //$.fn.anything = funciton(){...}

}));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ok，webpack也能帮你amd使用amd，cmd使用cmd，不过cmd也不会走下面那条factory的路哦&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;使用require.ensure进行AMD获取模块
对于AMD模块，最好使用AMD模块标准编写，因为还能在define时写好前置模块，让webpack自动帮我们处理打包&lt;/p&gt;
&lt;p&gt;&lt;s&gt;2的文档写的仍然非常有水准&lt;/s&gt; 黑科技满满&lt;/p&gt;
&lt;h1&gt;Why AMD？&lt;/h1&gt;
&lt;p&gt;有同学说 用了webpack，就不需要用AMD了啊，确实，一个页面只有一个css，一个js，依赖由webpack处理了，script要炸也是一起炸，不存在一个模块加载了另一个模块没有加载的情况，也不存在AMD的应用场景了啊&lt;/p&gt;
&lt;p&gt;确实，在处理模块之间的关系，webpack已经全部处理了，那么业务呢？&lt;/p&gt;
&lt;p&gt;业务总有扭曲的时候，老大如果今天跟你说：“前端同学们，我们手机和电脑要做两套逻辑”，那么我们现在，除了让 nginx/后端语言 根据userAgent返回两套网页，有了新的选择&lt;/p&gt;
</content:encoded></item><item><title>2017 いやほい</title><link>https://blog.xingoxu.com/2017/01/2017-iyahoi/</link><guid isPermaLink="true">https://blog.xingoxu.com/2017/01/2017-iyahoi/</guid><description>时间匆匆流逝，告别2016年，回看2015年，这一年也算是小有成就感

</description><pubDate>Tue, 03 Jan 2017 19:55:45 GMT</pubDate><content:encoded>&lt;p&gt;时间匆匆流逝，告别2016年，回看2015年，这一年也算是小有成就感&lt;/p&gt;

&lt;h1&gt;技术&lt;/h1&gt;
&lt;p&gt;狂点技术点的一年&lt;/p&gt;
&lt;p&gt;年初还在学习Android的我，抵不住朋友的 誘う ，决定学习一下JavaScript，把红书看完之后觉得找到了真爱语言，非常喜欢JavaScript的开放与灵活，于是放弃Android转前端&lt;/p&gt;
&lt;p&gt;2月~3月决定对blog现有主题进行修改来上手对HTML/CSS/JS的学习&lt;/p&gt;
&lt;p&gt;3月底~6月初 帮助学校完成简单的学生管理与成绩抓取&lt;/p&gt;
&lt;p&gt;6月底 开始萌购实习&lt;/p&gt;
&lt;p&gt;7月 协助完成&lt;a href=&quot;http://rennigou.jp&quot;&gt;萌购任你购&lt;/a&gt;前台页面&lt;/p&gt;
&lt;p&gt;8月上 完成简单活动页面&lt;a href=&quot;http://www.030buy.net/special/2016.8.9.hh/&quot;&gt;螺旋警戒线&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;8月下 完成&lt;a href=&quot;http://works.xingoxu.com/buy-calc/&quot;&gt;日系剁手网站价格综合对比工具&lt;/a&gt; &lt;a href=&quot;http://weibo.com/1804320382/E51AYqS9e?type=like&quot;&gt;微博&lt;/a&gt;获得9333转发，2446个赞，阅读量273.3万&lt;/p&gt;
&lt;p&gt;9月 完成单页面活动页面&lt;a href=&quot;http://www.030buy.net/special/2016.9.6.qwqxs/&quot;&gt;轻文轻小说&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;10月~12月 独立完成萌购App内所有内嵌网页&lt;/p&gt;
&lt;p&gt;12月上 为&lt;a href=&quot;https://user.030buy.net/login&quot;&gt;登录页&lt;/a&gt;添加Canvas2D动画&lt;/p&gt;
&lt;p&gt;从技术上，感觉自己是进步非常大，然而技术日新月异，长远的看，可能也只是从0到1的过程，并没有到100，所以还要接着加油！&lt;/p&gt;
&lt;h1&gt;娱乐上&lt;/h1&gt;
&lt;p&gt;5月帝都玩 &lt;a href=&quot;https://goo.gl/photos/QebSkK5bAivkywjL7&quot;&gt;Google Photos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6月陪肉排玩了一天&lt;/p&gt;
&lt;p&gt;7月和监督一起去了独立游戏大会&lt;/p&gt;
&lt;p&gt;12月和监督一起cp19 &lt;a href=&quot;https://goo.gl/photos/hrwJoTuMnZd7cXgD7&quot;&gt;Google Photos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bgm.tv/award/2016/xingo&quot;&gt;bangumi 2016&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;新的一年&lt;/h1&gt;
&lt;p&gt;顺利完成4月底的旅行&lt;/p&gt;
&lt;p&gt;顺利毕业&lt;/p&gt;
&lt;p&gt;至少考出N3，希望能考出N2&lt;/p&gt;
&lt;p&gt;希望在技术上能有新的进步 rxJs，后端也好，可视化前端也好，游戏开发也好&lt;/p&gt;
</content:encoded></item><item><title>改进多说</title><link>https://blog.xingoxu.com/2016/12/improve-duoshuo/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/12/improve-duoshuo/</guid><description>- 增加用户尾巴
- 头像/表情转换成https

</description><pubDate>Tue, 27 Dec 2016 15:34:24 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;增加用户尾巴&lt;/li&gt;
&lt;li&gt;头像/表情转换成https&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;多说现有问题&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;稳定版不能切换表情&lt;/li&gt;
&lt;li&gt;dev版不能收起表情框&lt;/li&gt;
&lt;li&gt;新浪头像/QQ头像/新浪表情 国内已经支持https了，多说没有及时跟进&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外多说记录了ua，在用户返回的数据里也给到了发评论的ua，想利用这个ua，展现我们睾贵的操作系统/浏览器/硬件等&lt;/p&gt;
&lt;p&gt;相比不能切换表情，不能收起表情框稍微好那么一点，于是我决定将多说替换成开发版，而且对标准版增加UA以及https的教程网上也有很多，我也进行了参考，我自修改的&lt;a href=&quot;https://github.com/xingoxu/improve-duoshuo/blob/b3985130b8fe565e5d47185edcc12c5efc4022ac/embed.js&quot;&gt;0.32版improve-duoshuo&lt;/a&gt;就是使用标准版的多说进行了显示UA，只是没有替换https，如果你需要对标准版进行动手术，欢迎你参考我的这份，也欢迎你参考本篇blog的Reference&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下内容使用多说dev版进行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先格式化多说，使其稍微好看一点&lt;/p&gt;
&lt;h1&gt;添加https&lt;/h1&gt;
&lt;h2&gt;用户头像https&lt;/h2&gt;
&lt;p&gt;参考&lt;a href=&quot;https://blog.nofile.cc/posts/2016/11/26/note-duoshuo-https.html&quot;&gt;多说插件支持站点 https&lt;/a&gt;，在&lt;a href=&quot;https://github.com/xingoxu/improve-duoshuo/commit/0c4a3456784e98f5a47ef0a46f5a5f4e3165f66a&quot;&gt;第2634行&lt;/a&gt;替换a字符串&lt;/p&gt;
&lt;h2&gt;替换表情https&lt;/h2&gt;
&lt;p&gt;点击表情后，Network中出现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/27/586228e6c8f9e.png&quot; alt=&quot;点击表情后，DevTools-Network&quot; /&gt;&lt;/p&gt;
&lt;p&gt;格式化后发现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/27/586229a1c0dae.png&quot; alt=&quot;格式化jsonp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;证明前缀写死在js中，搜索一下&lt;code&gt;http://&lt;/code&gt;，发现和新浪有关的只有&lt;a href=&quot;https://github.com/xingoxu/improve-duoshuo/commit/0c4a3456784e98f5a47ef0a46f5a5f4e3165f66a&quot;&gt;第3333行&lt;/a&gt;，修改成https后，问题解决&lt;/p&gt;
&lt;h1&gt;增加ua&lt;/h1&gt;
&lt;p&gt;dev版多说格式化后找到&lt;code&gt;ds-comment-header&lt;/code&gt; &lt;code&gt;ds-user-name&lt;/code&gt; 附近，发现全部改成了react风格的绑定&lt;/p&gt;
&lt;p&gt;尝试旧逻辑不变，直接插入&lt;code&gt;{ userTail.showAdmin(author) }&lt;/code&gt;和 &lt;code&gt;{ userTail.showUA(comment) }&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;userTail是之前0.32的全局helper&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;发现逻辑正常，证明模板可以读取全局变量，但输出字符被escape了&lt;/p&gt;
&lt;p&gt;那就只能老老实实的改成模板形式了&lt;/p&gt;
&lt;p&gt;代码参见&lt;a href=&quot;https://github.com/xingoxu/improve-duoshuo/commit/81106ba23d110f0e866e627799fc95d6bec6bc76&quot;&gt;旧2869行/新2847行&lt;/a&gt;，没啥技术含量&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nofile.cc/posts/2016/11/26/note-duoshuo-https.html&quot;&gt;多说插件支持站点 https&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://ssk.91txh.com/209&quot;&gt;多说回复后显示浏览器及操作系统信息（Useragent）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;吐槽&lt;/h1&gt;
&lt;p&gt;多说这几个礼拜天天炸，时不时500，看来是要跑路啊，赶紧趁跑路前上一波https装个逼（雾&lt;/p&gt;
&lt;p&gt;也欢迎对我的&lt;a href=&quot;https://github.com/xingoxu/improve-duoshuo&quot;&gt;improve-duoshuo&lt;/a&gt;提issue提pr&lt;/p&gt;
</content:encoded></item><item><title>使用Travis Ci使hexo自动生成并部署</title><link>https://blog.xingoxu.com/2016/12/use-travis-ci-your-blog/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/12/use-travis-ci-your-blog/</guid><description>前两天偶然看见v2ex上有人说使用travis ci做hexo的持续集成，想起对哦，何必需要每次写完博客再进行手动的hexo clean &amp;amp;&amp;amp; hexo g &amp;amp;&amp;amp; hexo d呢

</description><pubDate>Fri, 23 Dec 2016 15:51:13 GMT</pubDate><content:encoded>&lt;p&gt;前两天偶然看见v2ex上有人说使用travis ci做hexo的持续集成，想起对哦，何必需要每次写完博客再进行手动的hexo clean &amp;amp;&amp;amp; hexo g &amp;amp;&amp;amp; hexo d呢&lt;/p&gt;

&lt;h1&gt;为什么选择travis ci&lt;/h1&gt;
&lt;p&gt;因为他和github配合的很好，如果是github的开源项目，travis ci 永久免费&lt;/p&gt;
&lt;p&gt;言下之意，如果你是使用github pages来托管你的博客的话，那travis ci简直就是最好的搭档&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/23/585cdeb7b5d87.png&quot; alt=&quot;travis ci 开源项目永久免费&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注册travis ci&lt;/h1&gt;
&lt;p&gt;什么鬼，没有注册，travis-ci.org也只支持使用github登录&lt;/p&gt;
&lt;h2&gt;开启travis ci对项目的trigger&lt;/h2&gt;
&lt;p&gt;没什么难的，进右上角头像里的accounts，按照出现的提示打开repo的开关就可以了&lt;/p&gt;
&lt;h1&gt;撰写.travis.yml&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.travis-ci.com/user/languages/javascript-with-nodejs/&quot;&gt;官方的nodejs的specific doc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.travis-ci.com/user/customizing-the-build/&quot;&gt;Getting Started&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你想再加hook，那么自己看官方文档去，这里对我自己的travis.yml稍作解释&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hosted on &lt;a href=&quot;https://github.com/xingoxu/xingoxu.github.io/blob/source/.travis.yml&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;language: node_js
node_js:
  - &apos;6&apos;
before_install:
  - export TZ=&apos;Asia/Shanghai&apos;
  - npm install hexo-cli -g
install:
  - npm install
script:
  - hexo clean &amp;amp;&amp;amp; hexo g
after_script:
  - git config --global user.name &quot;xingoxu&quot;
  - git config --global user.email &quot;xingoxu@gmail.com&quot;
  - git clone https://${GH_REF} .deploy_git
  - cd .deploy_git
  - git checkout master
  - cd ../
  - sed -i&apos;&apos; &quot;s~${GH_REF}~${GH_TOKEN}:x-oauth-basic@${GH_REF}~&quot; _config.yml
  - hexo d &amp;gt; log.txt 2&amp;gt;&amp;amp;1
  - cat log.txt | sed &quot;s~${GH_TOKEN}~TOKEN~g&quot;
branches:
  only:
  - source
env:
  global:
  - GH_REF: github.com/xingoxu/xingoxu.github.io.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前面的不用多说，需要关注的是部署的问题&lt;/p&gt;
&lt;h2&gt;解决git push的证书问题&lt;/h2&gt;
&lt;p&gt;普通的push肯定是需要ssh的key的，或者https的话需要输入用户名和密码&lt;/p&gt;
&lt;p&gt;然鹅，这里是持续化环境中，也就是虚拟机环境中，那根本没法询问用户啊&lt;/p&gt;
&lt;p&gt;所以我们要给我们的部署施加一些小魔法&lt;/p&gt;
&lt;p&gt;那就是，github的开发者api。使用github的api，使用personal access token与push链接的拼接以达到不登陆的效果&lt;/p&gt;
&lt;p&gt;进入Settings -&amp;gt; &lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;Personal access tokens&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新建一个token，我给他命名为travis&lt;/p&gt;
&lt;p&gt;然后勾上repo的相应权限&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/23/585cf0ac72c22.png&quot; alt=&quot;写在push链接里的token&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后，要注意的是，这样的密钥是不能写在.travis.yml中的，那坏人看到了，肯定能拿去干坏坏的事情&lt;/p&gt;
&lt;p&gt;于是，可以放在travis ci的repo的settings的环境变量中&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/23/585cf1ce75576.png&quot; alt=&quot;travis ci repo setting&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以在文件中以&lt;code&gt;${变量名}&lt;/code&gt;来引用&lt;/p&gt;
&lt;p&gt;文件中的env global，和在这里设置的效果相同&lt;/p&gt;
&lt;p&gt;所以&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sed -i&apos;&apos; &quot;s~${GH_REF}~${GH_TOKEN}:x-oauth-basic@${GH_REF}~&quot; _config.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就会变成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sed -i&apos;&apos; &quot;s~github.com/xingoxu/xingoxu.github.io.git~这里是密钥:x-oauth-basic@github.com/xingoxu/xingoxu.github.io.git~&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以将config.yml中的deploy的地址改成这样的一个拼接地址，就不需要密钥啦&lt;/p&gt;
&lt;h2&gt;解决master commit树被清空&lt;/h2&gt;
&lt;p&gt;如果仅解决push问题，那么你会发现，你部署分支的commit树被清空了&lt;/p&gt;
&lt;p&gt;其实也不是什么很大的问题，但感觉看起来很丑，每次更新都像是一个新站点，没有历史更新记录，虽然这样以后你可以用source的commit来记录和回溯，但，总觉得怪怪的&lt;/p&gt;
&lt;p&gt;使用下面的git命令来解决问题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://${GH_REF} .deploy_git
cd .deploy_git
git checkout master
cd ../
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实是很简单的git操作，就是需要注意一下&lt;/p&gt;
&lt;p&gt;最后注意下主题文件夹如果是git文件夹的问题，不过这个应该不算是持续集成的问题&lt;/p&gt;
&lt;h2&gt;解决hexo d显示出私钥的问题&lt;/h2&gt;
&lt;p&gt;travis ci的build log是可以被大家看到的，但是，在添加变量那边关掉后 就不会显示出来了，然而，这也仅限于使用&lt;code&gt;${}&lt;/code&gt;来引用他的地方，git push时，会把此地址再显示一遍，这样你的私人密钥又会被显示了&lt;/p&gt;
&lt;p&gt;于是乎我把hexo d的命令改成了这两行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo d &amp;gt; log.txt 2&amp;gt;&amp;amp;1
cat log.txt | sed &quot;s~${GH_TOKEN}~TOKEN~g&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将hexo d的输出，包括标准与非标准，全部输入到log.txt，再cat出来的时候，使用sed对里边含有GH_TOKEN统统替换成TOKEN字符串&lt;/p&gt;
&lt;p&gt;我对linux命令不怎么样熟悉，只能写成这样，如果您有更好的，不输出到log.txt的方法，可以在评论里指点一下&lt;/p&gt;
&lt;p&gt;当然这样也有“缺点”，其实这个缺点在这里不成立，缺点就是把错误吞了，但不成立的原因是，after script的错误不错误不会影响到ci的过程&lt;/p&gt;
&lt;h1&gt;好处&lt;/h1&gt;
&lt;p&gt;写完文章后不再需要手动hexo clean &amp;amp;&amp;amp; hexo g &amp;amp;&amp;amp; hexo d了&lt;/p&gt;
&lt;h1&gt;坏处&lt;/h1&gt;
&lt;p&gt;也算不上什么坏处吧，非script部分出错了不会有提示，当然放在script里也没啥关系&lt;/p&gt;
&lt;p&gt;还有一个就是毕竟是云端操作，时间会比性能强劲的本地电脑长&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://xin053.github.io/2016/06/05/Travis%20CI%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2Hexo%E5%8D%9A%E5%AE%A2%E5%88%B0Github/&quot;&gt;Travis CI 自动部署 Hexo 博客到 Github&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>新MacBook Pro连接U2715H并使用SwitchResX开启2K HiDPI</title><link>https://blog.xingoxu.com/2016/12/config-switchresx-and-2khidpi/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/12/config-switchresx-and-2khidpi/</guid><description>**非Apple显示器字体模糊的终极方案**

  OSX的渲染和输出是分成两部分的，因此，我们可以利用这个机制在普通2K显示器上开启2K HiDPI

</description><pubDate>Sun, 18 Dec 2016 21:57:37 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;非Apple显示器字体模糊的终极方案&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OSX的渲染和输出是分成两部分的，因此，我们可以利用这个机制在普通2K显示器上开启2K HiDPI&lt;/p&gt;

&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;等了一年半，很早就想入macbook的坑了，然而呢厨师貌似忘记了mbp这条产品线了，当然了，英特尔也是有一部分责任的，因此一年前的这个时候，我买了微软的surface pro 4。&lt;/p&gt;
&lt;p&gt;结果这玩意非常不好使啊，开发者这边各种吃屎啊，各种没有快捷键啊，起个bash非常烦啊（最快也要右键），终于一个月前入手了macbook，但入手之后的那段时间，非常非常忙，各种事情吧，所以直到最近才有时间去配置各种开发环境。&lt;/p&gt;
&lt;p&gt;当然我也不是果粉，os x这个破系统也是💊，各种问题，也有很吃屎的地方（有空整理），所以，surface pro 4还不能扔掉233&lt;/p&gt;
&lt;h1&gt;初次连接显示器&lt;/h1&gt;
&lt;p&gt;连上u2715h之后，我以为会展现一个比windows更好看更漂亮的，结果没想到，连上之后的字 是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/18/58569bffcf83b.png&quot; alt=&quot;未调整前&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好好的東京のイケメン男子就被这个长满粉刺的字体给毁了，尤其是这个g，非常难看，感觉糊在一起了，整个人都不好了，怎么会这样&lt;/p&gt;
&lt;h1&gt;google一下？&lt;/h1&gt;
&lt;p&gt;80%教你开启LCD字体平滑，但开启之后，并没有任何卵用&lt;/p&gt;
&lt;p&gt;20%教你使用一个ruby脚本，将Television变成显示器，然而，还是没有任何卵用&lt;/p&gt;
&lt;p&gt;上面那张图就是干完那两件事情之后的截图，还是那样，粉刺字体，像狗啃过&lt;/p&gt;
&lt;h1&gt;试试hidpi？&lt;/h1&gt;
&lt;p&gt;在surface上装过虚拟机的黑果，当时用过一个软件叫RDM，为高分屏而准备的（也就是变成Retina的渲染效果），打开发现，有HiDPI的选项，选择1280x800，开启了hidpi，字体平滑了，结果因为显示器是16:9，选择的是16:10，旁边有两条黑边，想选择1280x720，结果点了无反应，唉，无奈 回到原来的分辨率&lt;/p&gt;
&lt;p&gt;所以通过这个事情知道了，并不是显示器的问题，只是苹果在1:1的显示下已经放弃了治疗（同时在思考macbook air朋友的心理阴影）&lt;/p&gt;
&lt;h1&gt;探索新可能&lt;/h1&gt;
&lt;p&gt;既然知道了hidpi是字体平滑的关键所在，那我就试试往这个方向搜索看看，由&lt;a href=&quot;https://www.v2ex.com/t/277921&quot;&gt;这贴&lt;/a&gt;和&lt;a href=&quot;https://www.v2ex.com/t/307893&quot;&gt;这贴&lt;/a&gt;和&lt;a href=&quot;https://www.zhihu.com/question/27610849&quot;&gt;这贴&lt;/a&gt;得知，osx的渲染和输出是两个步骤，得知了一款SwitchResX的软件，可以修改自定义分辨率，那就尝试一下&lt;/p&gt;
&lt;p&gt;按照&lt;a href=&quot;https://www.zhihu.com/question/35300978&quot;&gt;此贴&lt;/a&gt;得票最高做法，安装SwitchResX，关闭SIP，重启，添加Custom Resolution，保存，重启&lt;/p&gt;
&lt;p&gt;结果tm是 &quot;Not active - invalid?&quot; ，握日 折腾了一晚上，还是不行吗？心灰意冷之时，拉到下方看到 Sierra 做法，只是比上方多新建一个账户，感觉很奇怪，新建一个账户又能改变什么呢，抱着并不怎么会成功的心态尝试了一下，新建了账户，删除了原有的分辨率，填入了1080px2的分辨率 3840x2160，重启，进入新建的这个账户，尝试一下，居然成功了！&lt;/p&gt;
&lt;p&gt;于是更大胆的思考了一下，既然是渲染与输出两部分，那也就是说，我可以使用5k分辨率HiDPI到2k，进行输出咯？于是我就尝试添加了一个5120x2880，重启，点击切换，哇！成了！字体变得顺滑了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/18/5856a391cadba.png&quot; alt=&quot;成功在普通2K显示器开启2K HiDPI&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/12/18/5856a5badb5b3.png&quot; alt=&quot;对比&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;后遗症&lt;/h1&gt;
&lt;p&gt;折腾了这么多的方法后，这些方法给我留下了后遗症，我并不能确定是SwitchResX这个软件留下的，还是因为这些个方法一起作用，导致了下面的后遗症&lt;/p&gt;
&lt;h2&gt;合盖的时候外接显示器必须不能是hidpi&lt;/h2&gt;
&lt;p&gt;正常外接显示器的情况下，合盖之后，外接显示器黑屏，再亮屏&lt;/p&gt;
&lt;p&gt;如果合盖之前外接显示器是hidpi，合盖之后，外接显示器一定黑屏毫无显示，此时其实有信号，有鼠标，但就是黑屏，打开盖子又正常了。尝试之后发现是合盖的时候外接显示器不能为hidpi，这并不意味着你开盖的时候外接显示器不能是hidpi，也并不意味着你合盖之后外接显示器不能变成hidpi，只是如果你要合盖，那外接显示器请不要是hidpi&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;开盖莫名其妙注销了&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;真的是莫名其妙至极，插电插外显示器的情况下，开盖后要求输入密码，结果输入之后原有程序统统重新打开，黑人问号！&lt;/p&gt;
&lt;p&gt;我尝试过把系统设置里取消勾掉再重新勾上，也尝试过把SwitchResX中的Sleep monitors after disabling给取消勾掉，更尝试过删除switchresx，并没有任何效果，所以这个后遗症需要十分注意！&lt;/p&gt;
&lt;p&gt;当然我自己也找到了一个变通的方法，那就是，拔掉线，再开盖，就不会注销了，虽然麻烦了点，但我希望把我电脑搞出这个设定的人去吃屎&lt;/p&gt;
&lt;h1&gt;小问题&lt;/h1&gt;
&lt;p&gt;这个问题应该不是由软件引起的，没错，这个问题就是 卡&lt;/p&gt;
&lt;p&gt;思考一下，你的显示器是2k的，显示效果完全都由显卡渲染，mac输出5k分辨率，再缩到2k，虽然是新款的macbook pro，系统的动画也不卡，但用chrome的时候，就会很明显的发现一些css3的效果非常明显的掉帧，大概降到了20帧/s吧，safari好一点，但也就比chrome好大概10帧左右&lt;/p&gt;
&lt;p&gt;这个问题说大不大，说小不小，不大的原因是，chrome这种调显卡渲染的程序不要开太多，对于我这样拿mbp写代码的人，基本没有什么影响，也就是开一个chrome，开一个编辑器，编辑器基本无视，也就是chrome，chrome也就是看看文档，和显示的效果而已&lt;/p&gt;
&lt;p&gt;不小的原因是，我今天中午下了个720p的新番全屏来看，结果看到一半，开始掉帧卡了，一摸macbook，贼热（我的macbook放在床上，因为天气很冷，所以也不怎么在意温度，不看视频的时候摸了下只是温的），马上放到了桌子上，让他散热，很快macbook的温度就降下来了（也让我看到了这么牛逼的散热，这surface简直是落后几个世纪），愉快的继续看视频&lt;/p&gt;
&lt;p&gt;所以结论是&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;保持散热&lt;/li&gt;
&lt;li&gt;别开太多浏览器&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当然如果你很在乎性能，不在乎这点渲染效果，那还是还原成2k普通分辨率吧，我之前的switchresx应该也不是完全卸载，完全卸载官方的做法是在顶部菜单里uninstall，不过官方说会删除所有switchresx做过的修改，那估计自定义的分辨率也会被删除&lt;/p&gt;
</content:encoded></item><item><title>最近遇到的小坑</title><link>https://blog.xingoxu.com/2016/10/2016-10-27/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/10/2016-10-27/</guid><description>1. Android Chrome 非常奇怪的字体偏移
2. IOS Safari -webkit-box 非常奇怪的字体偏移
3. linear-gradient 小笔记
4. 晒晒最近的怪物猎人物语

夹个怪猎物语的私货你们有意见吗【没有】

</description><pubDate>Thu, 27 Oct 2016 23:58:37 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;Android Chrome 非常奇怪的字体偏移&lt;/li&gt;
&lt;li&gt;IOS Safari -webkit-box 非常奇怪的字体偏移&lt;/li&gt;
&lt;li&gt;linear-gradient 小笔记&lt;/li&gt;
&lt;li&gt;晒晒最近的怪物猎人物语&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;夹个怪猎物语的私货你们有意见吗【没有】&lt;/p&gt;

&lt;p&gt;最近两天在做移动端的web开发，总体来说活不算多，页面很简单，全新的页面没有包袱，也有现成的ui库可以用，又是用vue进行开发，一个礼拜就切完了所有5个图，所以大多数时间都花在了适配后端数据以及细节的深究&lt;/p&gt;
&lt;h1&gt;Android 非常奇怪的字体偏移&lt;/h1&gt;
&lt;p&gt;上图（左iphone 6/ios 10.0，右Nexus 6p/Android 7.0/Chrome 53.0）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/25/580ef6ffa1f2c.png&quot; alt=&quot;ios.png&quot; /&gt; &lt;img src=&quot;https://ooo.0o0.ooo/2016/10/25/580ef6ffc70f9.png&quot; alt=&quot;android.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;仔细对比&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/24/580dd472845a5.png&quot; alt=&quot;ios-android对比1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;（上边标题没有划出来的地方貌似是 ios -webkit-box 的问题）&lt;/p&gt;
&lt;p&gt;几乎所有用 px 单位设置过 line-height 的地方， android 都会不由自主的字会向上偏移大概 2px 左右，然而看看隔壁苹果，我去可真是正常的不能再正常了，全部按照我想要的来，真漂亮。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;生气，我大谷歌桌面端的浏览器这么fashion，手机吃瘪了？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然而偶尔调试一下，发现设置成line-height: normal;便全部都正常了&lt;/p&gt;
&lt;p&gt;上图（左右均 Android ，使用 Chrome inspect 调试）
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/24/580dd5fac5263.png&quot; alt=&quot;对比2&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/24/580dd62612125.png&quot; alt=&quot;对比3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完全没有道理啊，可以看到蓝色部分，字根本没有按照极限走，反而全部都贴顶，甚至还有超出蓝色部分的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想不明白的我用同事的Nexus 6测试，结果发现，握日，他的手机居然是正常的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;仔细一看，发现是渲染字体的问题&lt;/p&gt;
&lt;p&gt;我的Nexus 6p使用的是日文语言，渲染的时候用的是Noto Sans CJK JP Regular
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/25/580eb1207efbf.png&quot; alt=&quot;normal.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而他的是中文，渲染就用普通Noto Sans&lt;/p&gt;
&lt;blockquote&gt;想了想，日文字体中的很多中文字体是不存在的，发现了不存在的中文字体可能去借用了其他字体库，日文的中文字体和普通的中文字体混在了一起，系统没有处理好出了问题，一个猜想，不一定对&lt;/blockquote&gt;
&lt;blockquote&gt;当我把iphone 6改成日文再测试，发现，还是很棒的渲染效果 （辣鸡Google&lt;/blockquote&gt;
&lt;h1&gt;IOS -webkit-box 奇怪的字体偏移&lt;/h1&gt;
&lt;p&gt;用-webkit-box在做一个省略的两行标题的时候，碰到的一个非常奇怪的问题&lt;/p&gt;
&lt;p&gt;上图（iphone 6/ios 10.0）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/25/580f016a7a353.png&quot; alt=&quot;iphone-webkit-box-1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同样的一个组件，css应该完全一样，没有继承，也试过了line-height重置成normal，然而并没有什么卵用&lt;/p&gt;
&lt;p&gt;试试去除-webkit-box，发现成了，猜测是-webkit-box在safari的某种条件下的特殊bug，Android正常&lt;/p&gt;
&lt;p&gt;反正这块地方高度定死，不如直接脱离文档流，float: left，解决了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/25/580f056e7979c.png&quot; alt=&quot;ios-webkit-box-fixed.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;虽然解决了，然而并不知道原因&lt;/p&gt;
&lt;p&gt;不过box也已经废弃了，flex已经替代box（标准不一样）。后来搜了一下，做多行省略号倒是有很多tricks，当时也是纠结于这一个事情，实在是太傻了233，还是不要闷声写代码啊，多谷歌一下，说不定有其他套路233&lt;/p&gt;
&lt;h1&gt;linear-gradient 小笔记&lt;/h1&gt;
&lt;p&gt;很久以前便知道了他的大名，然而 很久都没有使用过它，因为他 远看厉害，去看他的标准，却总是被搞得一头雾水
这两天做一个timeline的效果，以前不怎么用linear-gradient，一般用:before,:after进行拼接，然而这次觉得，巨麻烦，用上了linear-gradient
第一次用，做类似于--o- 这样的效果，稍微瞄了几眼标准，随手写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;background: linear-gradient(to right,black 70%,white 30%);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/58121bf5dea34.png&quot; alt=&quot;左70右30&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看了效果，不错&lt;/p&gt;
&lt;p&gt;结果今天过去做- o  这样的效果，写下了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;background: linear-gradient(to right,black 30%,white 70%);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/58121c6942677.png&quot; alt=&quot;左30右70，却变成了黑白渐变&quot; /&gt;
结果变成了黑白渐变&lt;/p&gt;
&lt;p&gt;只好乖乖去仔细看文档&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; linear-gradient( 
  [ &amp;lt;angle&amp;gt; | to &amp;lt;side-or-corner&amp;gt; ,]? &amp;lt;color-stop&amp;gt; [, &amp;lt;color-stop&amp;gt;]+ )
  \---------------------------------/ \----------------------------/
    Definition of the gradient line        List of color stops  

where &amp;lt;side-or-corner&amp;gt; = [left | right] || [top | bottom]
  and &amp;lt;color-stop&amp;gt;     = &amp;lt;color&amp;gt; [ &amp;lt;percentage&amp;gt; | &amp;lt;length&amp;gt; ]?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意这个color-stop&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;color-stop&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This value is comprised of a  value, followed by an optional stop position (either a percentage or a  along the gradient&apos;s axis).
Rendering of color stops in CSS gradients follows the same rules as color stops in SVG gradients.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;followed by an optional stop position ← 原来是停止位置。。。&lt;/p&gt;
&lt;p&gt;所以应该这么写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;background: linear-gradient(to right,black 1%,white 1%) no-repeat;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然啦，要注意多个颜色（&amp;gt;3）的情况下，两个颜色之间的距离如果大于0就是产生渐变（废话，这是人家本来的用处啊233）&lt;/p&gt;
&lt;p&gt;所以如果要做无渐变的多个颜色的混合，应该这么写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;background: linear-gradient(to right,black 1%,white 1%,white 3%,#0c0119 3%) no-repeat;
                                     \------/ \------/ \------/ \------/
                                     颜色0结束 颜色1开始 颜色1结束 颜色2开始
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;晒游戏晒游戏233&lt;/h1&gt;
&lt;p&gt;最近在玩怪物猎人物语！超喜欢リュート，田村睦心这季配了好多男主，都超可爱！隔壁bs的约克也是！&lt;/p&gt;
&lt;p&gt;感觉这个游戏就是卡普空简化战斗的怪物猎人啊，果然从小培养信仰吗（然而我并不吃这套哼&lt;/p&gt;
&lt;p&gt;还差一些材料，现在在刷塔，刷完塔做出装备后就马上能全委托通关啦【并不打算再刷其他东西了】&lt;/p&gt;
&lt;p&gt;晒个现在的银火龙套&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/58122335e1c72.jpg&quot; alt=&quot;1.jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/5812238f779f8.jpg&quot; alt=&quot;2.jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/581223dbbfa58.jpg&quot; alt=&quot;3.jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/581223db71dc7.jpg&quot; alt=&quot;4.jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/10/27/581223d5d6ea8.jpg&quot; alt=&quot;5.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;快说帅233&lt;/p&gt;
</content:encoded></item><item><title>近况</title><link>https://blog.xingoxu.com/2016/09/2016-09-18/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/09/2016-09-18/</guid><description>即使是找到了实习，然而还是没能闲下来啊\_(:з」∠)\_

</description><pubDate>Sun, 18 Sep 2016 16:53:27 GMT</pubDate><content:encoded>&lt;p&gt;即使是找到了实习，然而还是没能闲下来啊_(:з」∠)_&lt;/p&gt;

&lt;h2&gt;浏览器的dom操作合并&lt;/h2&gt;
&lt;p&gt;刚学js的时候，明白js单线程时间线的模型，知道dom操作是缓慢的，因此明白要做动画最好应该在css中书写，修改dom只修改他的class，在不同的状态间切换，刚开始做一些动画成功了，然而做一个&lt;code&gt;input[type=text]&lt;/code&gt;的错误闪烁框，写了animation，想在两个状态间交换，然而点了却没有反应，无论是用jQ写，还是用原生dom写，在控制台中根本没有变换过，当时很是疑问，最后我&lt;s&gt;异想天开&lt;/s&gt;，试了一下setTimeout，把两个状态间的一个放入其中，结果就顺利的展现出想要的效果了。
　　当时没有仔细想过，后来当看到优化dom操作，减少重流重绘 博文的时候，猛然想起，浏览器对dom树的操作都是有优化的，同一个时间线中操作dom的操作会被合并成一个，到你下一次读取的时候才会产生变化&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var domElem; //假设这是dom节点
console.log(domElem.className);
//&amp;lt;- &apos;c&apos;
domElem.className = &apos;a&apos;;
domElem.className = &apos;b&apos;;
domElem.className = &apos;a&apos;;

/*
实际上浏览器只干了一件事情
domElem.className = &apos;a&apos;;
*/

console.log(domElem.className);
//&amp;lt;- &apos;a&apos;
domElem.className = &apos;b&apos;;
console.log(domElem.className);
//&amp;lt;-&apos;b&apos;
domElem.className = &apos;c&apos;;
console.log(domElem.className);
//&amp;lt;-&apos;c&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;React的学习&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;工作量不够&lt;/s&gt;趁着空闲的时间，学习了React【，感受是React其实是单向版的Vue，但React最重要的是它带给我们的Components的概念，React其他的东西非常小，不依赖组件，什么都没有，可以说是Virtual Dom版的Mustache，正因为其他都很小，他的Components就变成了他想传达给我们的理念~~（大概是这样）~~。看了getting started，手痒痒，写了一个一直很想做的一个东西，感觉用React来写这个真是太合适了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://works.xingoxu.com/buy-calc/&quot;&gt;日系剁手网站价格综合对比工具&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实我最想对比的是亚马逊直邮和代购之间的价格差，但是亚马逊这个计费规则实在是太奇葩了，而且，真结算的时候貌似并不是他的那个计费规则，所以只好暂时搁置&lt;/p&gt;
&lt;p&gt;因为之前有MVVM框架的概念，在学习Vue和React就显得简单了很多，作为在实际使用的人来说，三种框架（Angularjs, React, Vue）我感觉写的最顺手的，最符合顺下来的思路的，还是Vue&lt;/p&gt;
&lt;h2&gt;利用Performance追踪运营商广告&lt;/h2&gt;
&lt;p&gt;这几天，智障的上海电信又给我插入了丰富的广告内容，以前插的是什么jd啦，taobao啦，tmall啦，一号店啦，现在他们都上https了，丧心病狂的电信就开始插cnbeta，csdn，s1，卧槽，excuse me，你这样挑衅技术真的好吗？
　好吧，你赢了，我承认当我看到和感受到被插了，我打开chrome面板只能看到当前的html的结构，network部分是空空的，只能从html结构里查插入的广告服务器地址。
然而前几天在&lt;a href=&quot;http://weibo.com/u/2313289447&quot;&gt;@EtherDream&lt;/a&gt; 微博上看到的这条语句，就可以快速的筛出非本域的加载的资源了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;performance.getEntries().forEach(v=&amp;gt; console.log(v.name));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然而我们狗日的上海电信是tcp劫持给你插包，把正常网页插在iframe中返回，真几把酷炫，希望电信原地爆炸，全家上天，并求大佬给点流量到他们的广告服务器上【。&lt;/p&gt;
&lt;h2&gt;近期游戏与番&lt;/h2&gt;
&lt;p&gt;8月买了胧村正，卧槽，这游戏真好玩！三个礼拜本篇白金！现在正在努力DLC全奖杯中~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/59264ac2020d6.png&quot; alt=&quot;本篇与DLC1完美通关~&quot; /&gt;&lt;/p&gt;
&lt;p&gt;番的话，最近看了&lt;a href=&quot;https://bgm.tv/subject/4014&quot;&gt;《异邦人 无皇刃谭》&lt;/a&gt;，超好看，推荐！
&lt;img src=&quot;https://lain.bgm.tv/pic/cover/l/1c/df/4014_e6u34.jpg&quot; alt=&quot;异邦人 无皇刃谭&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>近况</title><link>https://blog.xingoxu.com/2016/06/2016-06-16/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/06/2016-06-16/</guid><description>突然发现今天是个轴对称的日期233是个写博客的好日子（？），离上一次写博客有两个月，然而这两个月中真是经历了许多许多，不过接下来感觉可以稍微放轻松一点了

</description><pubDate>Thu, 16 Jun 2016 20:47:18 GMT</pubDate><content:encoded>&lt;p&gt;突然发现今天是个轴对称的日期233是个写博客的好日子（？），离上一次写博客有两个月，然而这两个月中真是经历了许多许多，不过接下来感觉可以稍微放轻松一点了&lt;/p&gt;

&lt;p&gt;还是按时间顺序留一下近况吧：&lt;/p&gt;
&lt;h2&gt;肉排的上海之行&lt;/h2&gt;
&lt;p&gt;（听说）肉排来上海看演唱会，也很想不上课，于是主动请缨，开了张事假单陪他一起去疯了一天，爽死了。早上在家一起玩了一会看了集magi &lt;s&gt;（然后入了坑）&lt;/s&gt; （虽然是为了阿里巴巴入了坑，结果却喜欢上了白龙233），中午一起去吃了面之后下午唱了一下午的歌呢，超高兴的是纯K居然有野良神的ed，而且画面有好多雪音呢 &lt;s&gt;（痴汉脸）&lt;/s&gt;
　　和肉排出去玩的照片可以在 &lt;a href=&quot;https://goo.gl/photos/PqgWaayG9yxYDcPq6&quot;&gt;Google Photos&lt;/a&gt; 上看见 &lt;s&gt;（其实大多都是雪音）&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;软考&lt;/h2&gt;
&lt;p&gt;得知有软考这个东西的时候，是上个学期的快期末，当时还以为这考试有多了不得，也是在微博上看了许多认识了原来这个国家并不认识的一面吧，而且一看那个清一色的题集，教程什么的，都是一个出版社出的，还有再看里面的内容的话，跟这个时代的许多也是格格不入，大概就知道是怎么回事了。
　　不过里面考的技术的东西是非常简单基础的，也就不那么在意。把一整本书刷了之后也没有留下什么遗憾，什么买了书不做啊浪费钱这样的遗憾。不如说还是略微有点收获的，认识了函数指针呢233感觉是肯定能过，希望不要给自己乱插什么flag（&lt;/p&gt;
&lt;h2&gt;百度面试&lt;/h2&gt;
&lt;p&gt;3月中旬投的前端简历，3月底考完的在线笔试，考完笔试我以为基本也是没有可能了，因为简答题也没编出很多，选择题也不一定完全对（有PHP），最后算法题三道总共300%也只做出120%貌似，因此我觉得是木有可能了。结果5月中旬的时候打了个电话来直接来面试我了，完全没有准备，就这么战战兢兢的在阳台上说了和面试官聊了一个多小时，自己明白自己说的有很多还是有那么点问题的，聊的也是最近基本都没怎么用的css（一直在写angularjs业务逻辑），不过还是过了。
　　第二个礼拜又打了个电话过来面试，面完之后让我去一次张江百度面试一次，我投的是前端，上来问我你还会其他后端语言吗，我笑着说只会nodejs（心中黑人问号233），然后问了比较多的nodejs和express的使用吧，最近是一直在用，感觉自己回答的还挺好的，然而问到方法里填的参数，有些方法实在是记不住，因为我二次封装了他们，似乎是这些影响了一些吧，最后面试官问我有什么要问的，我问我怎么样，他说还有一些细节没有掌握好，我又问你觉得我能过吗，他笑着说　不好说，会尽快通知你的。
　　这尽快一等就是两个礼拜多，看到网页上状态是“筛选未通过”，于是我就去寻找其他家了。结果到了考试周，我都快入职其他家了，百度电话打了过来，问我有没有找到暑期实习，我说找到了，他问我入职了吗，我说还没有，他说　如果我给你offer，你能来吗，我惊讶了挺久的，脑子一片空白，回答了一句，能让我再想想不（智障的我），他说好吧我了解了，然后就挂了。
　　唉其实挂了电话后心里就有了谱，早就答应了人家，我觉得我也不太敢爽约别人，不过我当时说让我再想想实在是太智障了233。虽然我知道如果去百度肯定也是个备胎。
　　上张图，表示并木有撒谎（？：
　　&lt;img src=&quot;https://ooo.0o0.ooo/2016/06/16/5762991891eee.png&quot; alt=&quot;投递进度&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;帝都再临&lt;/h2&gt;
&lt;p&gt;3月的时候知道自己5月份又能去北京玩，别提有多高兴了，还是公费不用自己出钱，爽死了。虽然本来过去是为了竞赛，然而我本来就没想在算法和数据结构上要有多大的造诣，能过学校的考试拿个优就好，能稍微拿个一般的奖就好，因为并不想往ACM方向发展嘛，根本就没认真在这上面花过时间，所以只要被我逮到空，就是各种约啊！哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈好开心啊那几天！
　　27号下午到的北京，晚上就跟肉排和监督聚在一起啦！一起吃了饭！
　　28号下午考试，上午稍微练了手做了道算法题，晚上和微博另一个好友面了基。
　　29号上午去北大溜达了一下，拿了个纪念品，然后马上就赶往监督家闹腾了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈！！！监督家真好玩！！！！！！！！好软的床！好多抱的！好多手办！好多漫画！好多海报！啊啊啊啊啊啊啊！うーらーやーまーしーいー！！！！！不我们还是先吃了中饭！然后在监督家各种玩啊！最后又一起吃了晚饭！すっごく楽しい！
　　30号睡了个懒觉，下午就回家啦
　　
　　唉每次和监督面基，总能聊好多好多，总觉得不管聊什么，监督总是很懂，真的就是很懂，很厉害很厉害，厉害的深不可测，崇拜啊~
　　第二次去北京的照片可以在 &lt;a href=&quot;https://goo.gl/photos/QebSkK5bAivkywjL7&quot;&gt;Google Photos&lt;/a&gt; 上可以看见。&lt;/p&gt;
&lt;h2&gt;学生事务中心网上平台&lt;/h2&gt;
&lt;p&gt;经过一个月搭建框架，一个月填充功能，一个月重读重写，终于基本能用啦，我还会加功能的，一是要完成到毕业，二是要做到毕设的程度，我会加油的！
　　在自己服务器上的就会关掉啦，如果有公共内容的话，我会把它的文档填充完整的！&lt;/p&gt;
&lt;h2&gt;萌购实习&lt;/h2&gt;
&lt;p&gt;在等待百度面试的时候，投了简历给萌购，当晚就收到了笔试的题目，迅速完成后第二天便收到了面试的通知，考虑过后，还是决定去萌购。
　　感谢监督君和肉排桑在这半年来帮我出谋划策制定学习路线，真的非常感谢！&lt;/p&gt;
&lt;h2&gt;大四课程的免听&lt;/h2&gt;
&lt;p&gt;总绩点达到3.0，通过英语四级六级，且有单位实习的话，可以免听大四的课程，唉去找了一圈老师，扭扭捏捏不太肯告诉我，特别有个丑老师，又不好说话，一定要我按程序走，问到程序，他又说不清楚，跑到教务去，发现有这条，就心定了，唉为了忙活个短学期的免听和迟上课以及下学期的免听，真是操碎了心啊。&lt;/p&gt;
&lt;h2&gt;接下来的计划&lt;/h2&gt;
&lt;p&gt;近来的话会学习Vue.js，学习git的内容，实习的话我一定要在实习中学习到更多的经验！因此只是暂时的歇息，要为接下来的成为社会人做好扎实的过渡咯！
　　长期的话肯定是赚钱买买买咯，最近一堆很想买的东西，啊好心痒痒呢！
　　还有的话有空会把博客再调整一下，感觉不管是js部分还是css部分都写的不怎么好。。。&lt;/p&gt;
</content:encoded></item><item><title>近期学习小结</title><link>https://blog.xingoxu.com/2016/04/2016-04-19/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/04/2016-04-19/</guid><description>又是好久没有写博客啦，最近一段时间学习了Angularjs，Bootstrap，Promise，nodejs，express，其实本来就想学这些，正巧学校老师拜托我帮忙搞个迷你的项目来帮助他们管理一些事务，技术又不限，又考虑到这些事务其实是很简单的最基础的增删改查，就搭着这个顺风车学习了这些，还能实践

</description><pubDate>Tue, 19 Apr 2016 00:48:42 GMT</pubDate><content:encoded>&lt;p&gt;又是好久没有写博客啦，最近一段时间学习了Angularjs，Bootstrap，Promise，nodejs，express，其实本来就想学这些，正巧学校老师拜托我帮忙搞个迷你的项目来帮助他们管理一些事务，技术又不限，又考虑到这些事务其实是很简单的最基础的增删改查，就搭着这个顺风车学习了这些，还能实践&lt;/p&gt;

&lt;h1&gt;nodejs&lt;/h1&gt;
&lt;p&gt;nodejs的学习我是跟着《了不起的Node.js》这本书来入门的，其中书后面的connect，express等部分可能有点过时了（api之类的），但是其实这些框架学习了前面的知识后，稍微看一下这本书讲的理念，完全可以去看文档便能灵活掌握使用方法了，就nodejs这一块我感觉坑其实不多不深。
另外我觉得这本书不错~~（我不是书商啊大家不要随便轻信我的话）~~，是因为他让我对现在web后端的一些新的概念，新的理念，一些实际应用中的是如何实现有了一点概念，比如session（之前我还读season233），mongodb这些的，总算是感觉自己离这些看起来很高大上的东西其实只有几行代码的距离。在nodejs中，如果需要处理一些复杂的逻辑，回调函数用的多的话，那么Promise就有了用武之地，包括维护代码整洁，代码分层（？）这个样子是非常有帮助的，而且nodejs稳步实现ES6嘛所以Promise是原生对象（奇怪WebStorm为什么没有提示）。&lt;/p&gt;
&lt;h1&gt;Promise&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://liubin.org/promises-book/&quot;&gt;JavaScript Promise迷你书&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;AngularJS&lt;/h1&gt;
&lt;p&gt;整个Angularjs的学习过程我觉得是非常陡峭的，学的时候我并没有买书看，我先去看的视频，视频其实没有多少，然而反复看了三个礼拜（老忘），上手写了几段，而且视频看到最后说是声明式ui，恍然大悟（？），才算是感觉好像入门了。。。。&lt;s&gt;（唉我说google的文档啊你能不能好好写啊，找着看真累）&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;双向绑定的&apos;$scope&apos;&lt;/h2&gt;
&lt;p&gt;用Angularjs来实现的前端的web应用（？），在其ngApp下的作用域的每一个DOM节点上都会有$scope，$scope是双向绑定的灵魂所在。这个$scope是以原型链的方式来继承上一级节点的$scope的，因此在实现逻辑复用的时候，是不应该将函数啊什么的全部都往scope上来附，感觉就相当于全局变量污染（？），可读性和扩展性会比较差。&lt;/p&gt;
&lt;h2&gt;controller与directive&lt;/h2&gt;
&lt;p&gt;刚学习Angularjs的时候我对controller和directive很懊恼，玛德，怎么前面这个东西是个controller，后面这个东西怎么也有controller，后面这个东西还能依赖啊，那么多config项，什么compile啊什么link啊，然后当写了一点，体验了一些过后，controller这个东西，就是mvc中的controller，你可以在controller范围内的节点上声明ngClick调用controller，那就是mvc的结构咯，v-&amp;gt;c,c-&amp;gt;m,m-&amp;gt;v，而directive这个东西其实是angularjs最后偏向的mvw的what，因为他什么都可以当，我现在比较喜欢拿directive当presenter，当我一直在考虑如何将代码的逻辑理顺，把代码结构分清，而且各司其职，我发现原来我更倾向于mvp这个模式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;按需加载 AngularJS 的 Controller&lt;br /&gt;
http://www.cnblogs.com/zhrj000/p/3383898.html&lt;br /&gt;
http://beginor.github.io/2014/12/20/angularjs-controller-load-on-demand.html&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;angularjs controller之间如何通信&lt;br /&gt;
https://segmentfault.com/a/1190000000639592&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;angularjs手动触发dirty check&lt;br /&gt;
https://segmentfault.com/q/1010000003796580&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;angularjs的一些坑（？）&lt;/h2&gt;
&lt;p&gt;在angularjs 中 jquery on是bind？我似乎在link中用jquery绑定的on并没有live的效果，最后还是用了directive来绑定link，感觉是不是小题大做了？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;还发现了 input[type=text] 设置display:block的时候，发现其并没有像个div占满一整行，反而像inline-block，觉得比较奇怪。。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;近期做的nodejs+express+AngularJS+BootStrap+Promise的实现&lt;/h1&gt;
&lt;p&gt;一个简单的实现，用户的增删改查，用户权限对模块的自由控制
&lt;code&gt;https://dev点xingoxu.cn&lt;/code&gt;
用户名与密码都是12345678901，增加的用户学号是11位的，错误没有做太多的处理只是在主界面上禁用了所有交互并显示错误（没有花特别特别多的时间在这个上面）&lt;/p&gt;
&lt;p&gt;不要玩坏了噻，总感觉自己做出来的东西特别容易塌。。。。。&lt;/p&gt;
&lt;p&gt;前端：
https://github.com/xingoxu/dashboard-with-angularjs&lt;/p&gt;
&lt;p&gt;后端：
https://github.com/xingoxu/crud-with-nodejs-mysql&lt;/p&gt;
&lt;p&gt;改进点有很多了吧：&lt;/p&gt;
&lt;h2&gt;password&lt;/h2&gt;
&lt;p&gt;因为没有实际对它的处理经验，我感觉有两种处理方式，1是上https，随便怎么传（x），2是把密码用客户端一个会变的东西来进行加密，然后把这个会变的东西固定处理后发送到服务器，再进行解密，感觉2似乎还是有点不可靠？&lt;/p&gt;
&lt;h2&gt;合并http请求&lt;/h2&gt;
&lt;p&gt;现在的add,delete,update操作完成后还需要再refresh一次，其实可以把他们都合并到一个http请求里&lt;/p&gt;
&lt;h2&gt;异常处理&lt;/h2&gt;
&lt;p&gt;界面可以完善的更好&lt;/p&gt;
&lt;h2&gt;后端还有很多逻辑可以复用&lt;/h2&gt;
&lt;h1&gt;最后&lt;/h1&gt;
&lt;p&gt;angularjs到此放一放，包括provider，包括实现原理等，可能需要等很以后有需要才能继续拾起来啦，接下来会细看一下html5+css3，js忍者秘籍和ES6&lt;/p&gt;
&lt;p&gt;感谢肉排桑和监督桑在这一年来学习上的督促与教导，感谢他们我才能系统学习了这么多知识！真是非常感谢！&lt;/p&gt;
&lt;p&gt;另外一些其他的存档：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yuzhewo.com/2015/11/03/%E4%BF%AE%E6%94%B9gitlab%E4%BD%BF%E7%94%A8%E7%8E%B0%E6%9C%89nginx%E6%9C%8D%E5%8A%A1%E5%8F%8A502%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/&quot;&gt;gitlab vhost配置 502&lt;/a&gt;
&lt;a href=&quot;https://www.fancycoding.com/centos7-mail-server-with-dovecot-postfix-ssl/&quot;&gt;centos7配置邮件服务器&lt;/a&gt;
&lt;a href=&quot;http://blog.sina.com.cn/s/blog_93a6a0c30101fshd.html&quot;&gt;z-index不生效&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>gulp.js初体验 - 自动编译/刷新/Release</title><link>https://blog.xingoxu.com/2016/03/gulpjs-1/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/03/gulpjs-1/</guid><description># Intro:
1. gulp能做什么
2. 利用gulp编译stylus，本地预览，自动刷新，自动提升版本并Release
3. 心得


</description><pubDate>Fri, 25 Mar 2016 20:34:33 GMT</pubDate><content:encoded>&lt;h1&gt;Intro:&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;gulp能做什么&lt;/li&gt;
&lt;li&gt;利用gulp编译stylus，本地预览，自动刷新，自动提升版本并Release&lt;/li&gt;
&lt;li&gt;心得&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;gulp能做什么&lt;/h1&gt;
&lt;p&gt;半个月前朋友提醒我说可以开始学习构建了，学习grunt，gulp，当时我对这些一无所知，对于构建的理解，只是处于minify html/css/js，uglify js等，想想这些不都已经有了很多现成的工具吗，然后又去grunt,gulp主页逛了，完全看不懂主页上的getting started要干什么&lt;/p&gt;
&lt;p&gt;然而最近在尝试使用bootstrap与学习angularjs，想要试试自己搞一个小型的CRUD的app，我发现，我需要一个工具，能帮我处理这些框架中的sass，less，需要一个工具能帮我自动从framework文件夹编译成result并放入dist，而且我也根本无法脱离stylus的语法了（汗），单独编译以及手动整理真是太花费人的时间了，完全不能专注于写代码&lt;/p&gt;
&lt;p&gt;于是诞生了以下需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编译sass,less,stylus&lt;/li&gt;
&lt;li&gt;帮我把编译好的内容自动替换掉旧的dist&lt;/li&gt;
&lt;li&gt;灵活的http-server，最好能在我修改源文件的时候自动编译好自动刷新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;打开搜索引擎，发现gulp似乎在一阵之前很火热啊，于是稍稍学习了一下gulp&lt;/p&gt;
&lt;p&gt;gulp的官方入门，我感觉不是很好，因为他只告诉了你如何安装插件233（误，好吧，看了一圈又一圈的博客，终于理解了gulp想让我们用它干什么了&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编写构建任务&lt;/li&gt;
&lt;li&gt;执行构建任务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其实核心就这两样&lt;/p&gt;
&lt;p&gt;然后在任务中我们能干什么呢，gulp给我们了一些api&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从文档中读取流（.src）&lt;/li&gt;
&lt;li&gt;将流传到某个插件中让他读取（.pipe）&lt;/li&gt;
&lt;li&gt;最后把插件中输出的流我们把它变回文件（gulp.pipe(gulp.dest())）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;怪不得叫流式自动化构建，玛德，就不能说正常人的语言吗！&lt;/p&gt;
&lt;p&gt;gulp还给我们提供了一个watch api，用来在任务中挂起并监视文件变动&lt;/p&gt;
&lt;h1&gt;利用gulp的任务&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/gulp-stylus&quot;&gt;gulp-stylus&lt;/a&gt;
&lt;a href=&quot;https://www.npmjs.com/package/gulp-sourcemaps&quot;&gt;gulp-sourcemap&lt;/a&gt;
&lt;a href=&quot;https://github.com/gulpjs/gulp/blob/master/docs/recipes/server-with-livereload-and-css-injection.md&quot;&gt;gulp-browserSync&lt;/a&gt;
&lt;a href=&quot;https://github.com/gulpjs/gulp/blob/master/docs/recipes/automate-release-workflow.md&quot;&gt;利用gulp提升版本号并自动发布&lt;/a&gt;
&lt;a href=&quot;https://github.com/gulpjs/gulp/blob/master/docs/recipes/split-tasks-across-multiple-files.md&quot;&gt;将任务分不同文件存放 - 我最喜欢的特性&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;哈哈以上都是官方的api文档，其实了解了gulp怎么运作之后，编写属于自己的任务还是挺简单的&lt;/p&gt;
&lt;p&gt;&lt;s&gt;抄写&lt;/s&gt;仿照官方的编译stylus与sourcemap，写了个自己的compile任务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var gulp = require(&apos;gulp&apos;),
	stylus = require(&apos;gulp-stylus&apos;),
	sourceMaps = require(&apos;gulp-sourcemaps&apos;),
	runSequence = require(&apos;run-sequence&apos;);

gulp.task(&apos;compile-stylus&apos;, function() {
	//non-minified用作查看是否是编译问题而不是compress问题
	gulp
		.src(&apos;src/stylus/*.styl&apos;)
		.pipe(stylus({
			&apos;include css&apos;: true
		}))
		.pipe(gulp.dest(&apos;src/debuggable/css/&apos;));
	var taskReturn =
		gulp
		.src(&apos;src/stylus/*.styl&apos;)
		.pipe(sourceMaps.init())
		.pipe(stylus({
			&apos;include css&apos;: true,
			&apos;compress&apos;: true
		}))
		.pipe(sourceMaps.write(&apos;../../debug-maps&apos;))//cwd:src/dist/css/
		.pipe(gulp.dest(&apos;src/dist/css/&apos;));
	return taskReturn;
});

gulp.task(&apos;compile&apos;, function(callback) {
	runSequence(
		&apos;compile-stylus&apos;,
		function(error) {
			if (error) {
				console.log(error.message);
			} else {
				console.log(&apos;compile finished!&apos;);
			}
			callback(error);
		});
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然而我发现其实生成了sourcemap，chrome的调试工具就很棒的帮我们自动对应到了stylus上了，所以好像输出一下那个编译后文件并没有什么卵用了。。。&lt;/p&gt;
&lt;h1&gt;心得&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意！&lt;/strong&gt;
gulp有个坑就是在相对路径时，不要加&apos;./&apos;，以及注意调用路径，第一次写任务的时候被坑惨了，还以为是自己哪里写错了or getting started过时了&lt;/p&gt;
&lt;p&gt;gulp的运行时路径就是你cmd/gitbash的路径，不是相对于js的路径（&lt;strong&gt;使用require-dir的小伙伴们要注意了&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;还有个坑就是自动更新版本并提交的那个中文文档有问题，插件被换掉了，所以按照中文文档写的任务是跑不起来会提示错（好像是fs.end不是一个function）&lt;/p&gt;
&lt;p&gt;用了gulp之后，感觉真是爽爆了233&lt;/p&gt;
</content:encoded></item><item><title>近期学习小结</title><link>https://blog.xingoxu.com/2016/03/2016-03-20/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/03/2016-03-20/</guid><description># Intro:
1. 重拾HTML/CSS
2. jQuery与Firefox的一个坑
3. 心得

</description><pubDate>Sun, 20 Mar 2016 23:36:32 GMT</pubDate><content:encoded>&lt;h1&gt;Intro:&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;重拾HTML/CSS&lt;/li&gt;
&lt;li&gt;jQuery与Firefox的一个坑&lt;/li&gt;
&lt;li&gt;心得&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;很久没有写博客啦，其实最近一直都在学习，寒假刚开始的时候在学习Android，学着学着感觉Google给我们埋的坑实在是又多又深，关键是，你根本不知道这些是什么情况，原理是什么，去查，只会告诉你，换兼容包兄弟，太坑了吧！而且我一直认为，既然你推广MD设计，那么至少得给开发一些造好的轮子，好多实现都必须自己去实现，MD设计的一些Button什么的，仅仅是更换个背景颜色，就得自己重头造轮子，是不是要把人往悬崖上推？？？于是，在意识到这坑有点吓人的情况下，又对Android其实并没有特别大的兴趣的情况下，立刻停止了学习。&lt;/p&gt;
&lt;h1&gt;重拾HTML/CSS&lt;/h1&gt;
&lt;p&gt;大一的时候跟着Codecademy在线课程学习过基础HTML/CSS，其实当时是为了玩bilibili的空间的自定义CSS，话说回来，入门真的非常简单。然而这次重新审视自己，想想自己到底喜欢什么，看完了JavaScript的入门后，决定转前端。&lt;/p&gt;
&lt;p&gt;重新学习HTML/CSS，更多的是在一些理论上的查缺补漏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档流模型（块级元素，行级元素），定位的层模型（relative/absolute/fixed）&lt;/li&gt;
&lt;li&gt;css属性的继承性，css的选择器（+ 空格 &amp;gt; : []），以及属性权重（继承权重0.1 标签权重1 class权重10 id权重100 可叠加），相同情况下后覆盖前，!important大于一切（也有说权重为1000的）&lt;/li&gt;
&lt;li&gt;三个单位：em px %各自所对应衡量的标准&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其实学习HTML/CSS入门很快，但我经常发处女病（这边怎么会多1px？/这边怎么看上去不像是10px？/这边间距是不是多了4px？），但幸好不是坏事，了解了许多许多之前并没有了解的事情。&lt;/p&gt;
&lt;p&gt;好多都有了现有的文章啦，也就不再多阐述了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.zhangxinxu.com/wordpress/?p=2427&quot;&gt;transform的matrix&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.w3school.com.cn/css/css_margin_collapsing.asp&quot;&gt;CSS 外边距合并&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.hicss.net/do-not-tell-me-you-understand-margin/&quot;&gt;垂直外边距合并问题&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cnblogs.com/myqianlan/p/4255346.html&quot;&gt;a img 高度多4px&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://blog.csdn.net/chen_zw/article/details/8741365&quot;&gt;position属性&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://zihua.li/2013/12/keep-height-relevant-to-width-using-css/&quot;&gt;宽高成比例&lt;/a&gt; 《- 没想到padding的height百分比是以width作参照的&lt;br /&gt;
&lt;a href=&quot;http://www.zhangxinxu.com/wordpress/?p=2357&quot;&gt;inline-block 4px（间距）问题&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.w3chtml.com/css3/properties/user-interface/box-sizing.html&quot;&gt;box-sizing&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cnblogs.com/mofish/archive/2012/05/14/2499400.html&quot;&gt;clearfix&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cnblogs.com/KeithWang/p/3139517.html&quot;&gt;block inline inline-block&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://segmentfault.com/a/1190000003038583&quot;&gt;line-height&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.zhangxinxu.com/wordpress/?p=4925&quot;&gt;vertical align line-height&lt;/a&gt;&lt;br /&gt;
内联元素对齐与基线对齐，块级元素与边框对齐&lt;br /&gt;
行高是整行的高度，并不是盒子的高度，你可以理解为盒子浮在行上，行拉开了，但是盒子还是那么高&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;jQuery与Firefox的一个坑&lt;/h1&gt;
&lt;p&gt;在写本博客主题的时候，碰到了一个玛德超奇怪的一个问题，为某个按钮添加了mousedown与mouseup事件，然后再给这个按钮添加了click事件，结果呢，IE都反应正常，firefox居然不发生click事件！嘿你敢信？虽然我的mouseup事件是停止了冒泡，然而关click事件奶子事情？事件冒泡不应该只是对于文档层次而言的吗？不是很懂你们Firefox，暂时先把click事件变成mouseup事件&lt;/p&gt;
&lt;p&gt;其他关于js的一些小坑~&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/feng524822/p/4084037.html&quot;&gt;label触发两次click事件&lt;/a&gt;
&lt;a href=&quot;http://www.w3school.com.cn/tags/tag_label.asp&quot;&gt;label与input关系&lt;/a&gt;
&lt;a href=&quot;http://stackoverflow.com/questions/24639335/javascript-console-log-causes-error-synchronous-xmlhttprequest-on-the-main-thr&quot;&gt;sync script&lt;/a&gt;
jQuery现在已经官方支持了live-query，方法名是on off
&lt;a href=&quot;http://www.ruanyifeng.com/blog/2012/11/require_js.html&quot;&gt;js的模块化加载框架 - requireJS&lt;/a&gt;
ejs貌似对switch语句不识别&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;心得&lt;/h1&gt;
&lt;p&gt;前端这边入门门槛很低，得益于完备的各大网站的html/css的完整的文档（翻译自w3school，以及各大前辈的博客），以及jquery的文档做的也很棒，学习起来真的特别方便！话说在学习jQuery的时候感觉把css所有的选择器重新复习了233&lt;/p&gt;
</content:encoded></item><item><title>GSC-535 风来的西林</title><link>https://blog.xingoxu.com/2016/03/gsc-535/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/03/gsc-535/</guid><description>终于买了又帅又可爱的西林困，嘻嘻，稍微照几张~
</description><pubDate>Sun, 20 Mar 2016 23:11:17 GMT</pubDate><content:encoded>&lt;p&gt;终于买了又帅又可爱的西林困，嘻嘻，稍微照几张~&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec136546c8.jpg&quot; alt=&quot;GSC535-1 (6).jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec131cdbca.jpg&quot; alt=&quot;GSC535-1 (1).jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec133a750e.jpg&quot; alt=&quot;GSC535-1 (2).jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec1362a8e1.jpg&quot; alt=&quot;GSC535-1 (3).jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec1337b00c.jpg&quot; alt=&quot;GSC535-1 (4).jpg&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2016/03/20/56eec13a81f2b.jpg&quot; alt=&quot;GSC535-1 (5).jpg&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Hexo主题Paper White</title><link>https://blog.xingoxu.com/2016/03/hexo-theme-paper-white/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/03/hexo-theme-paper-white/</guid><description>欢迎有爱自取啦

最后更新： 2016.01.09

</description><pubDate>Sat, 12 Mar 2016 03:44:46 GMT</pubDate><content:encoded>&lt;p&gt;欢迎有爱自取啦&lt;/p&gt;
&lt;p&gt;最后更新： 2016.01.09&lt;/p&gt;

&lt;h1&gt;Paper White - A Hexo Theme&lt;/h1&gt;
&lt;p&gt;================&lt;/p&gt;
&lt;p&gt;ReadMe 请&lt;a href=&quot;https://github.com/xingoxu/hexo-theme-paper-white&quot;&gt;移步&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此处将集中显示各种奇奇怪怪 demo&lt;/p&gt;
&lt;h1&gt;embed code&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;	//载入分享模块
	if (paperWhiteConfig.canShare) {
		require([&apos;/js/share.js&apos;], function(share) {
			share.init();
			share.shareLinks.push({
				id: &apos;download&apos;, //暂时都能下载，如有不能下载的需求移动至init进行克隆数组等操作
				label: &apos;下载&apos;,
				url:&apos;{{raw_image_url}}&apos;, 
				download: true 
			});
			photoSwipeOption.shareEl = true;
			photoSwipeOption.shareButtons = share.shareLinks;
		});
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;embed gist&lt;/h1&gt;

&lt;h1&gt;jsfiddle&lt;/h1&gt;

&lt;h1&gt;table&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;价格&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;计算机&lt;/td&gt;
&lt;td&gt;$1600&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管线&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>写一些最近Android学习中遇到的坑以及心得</title><link>https://blog.xingoxu.com/2016/01/android-study-1-22/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/01/android-study-1-22/</guid><description>## Intro:
1. Android Studio Library的导入与导出
2. Java的Exception再复习
3. Handler的内存泄漏问题与其相关的Looper坑
4. AppCompat v7的Toolbar与Contextual ActionBar
5. 心得


</description><pubDate>Fri, 22 Jan 2016 02:05:18 GMT</pubDate><content:encoded>&lt;h2&gt;Intro:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Android Studio Library的导入与导出&lt;/li&gt;
&lt;li&gt;Java的Exception再复习&lt;/li&gt;
&lt;li&gt;Handler的内存泄漏问题与其相关的Looper坑&lt;/li&gt;
&lt;li&gt;AppCompat v7的Toolbar与Contextual ActionBar&lt;/li&gt;
&lt;li&gt;心得&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;最近Loop：&lt;a href=&quot;http://music.163.com/#/song?id=32192451&quot;&gt;シュガーソングとビターステップ&lt;/a&gt;&lt;/h2&gt;

&lt;h2&gt;Android Studio 库相关的正确使用姿势&lt;/h2&gt;
&lt;p&gt;Android Studio 1.5.x 更新后很多网上找到的其他教程包括回答基本都是旧版本的，直接lib下添加，然而在编译时总是遇到这样那样的问题，原因在于Gradle会把jar compile了，然而module本身的package(感觉相当于命名空间？)却没有导入，当你导入后，两行命令相互打架编译时能通过却无法生成apk提示错误。提示的错误五花八门，一会是java虚拟机非0退出，一会是Class文件重名。&lt;/p&gt;
&lt;h3&gt;引用其他人的jar/aar Lib&lt;/h3&gt;
&lt;p&gt;Library在Android Studio中相当于一个Module，在Project中如果想要导入其他人的库，则选择File-&amp;gt;New Module...
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926470bb0406.png&quot; alt=&quot;File-&amp;gt;New Module...&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择Import .JAR/.AAR Package，之后简单，就不细说了，请不要忘了如果Lib作者有要求提示在Gradle中加入脚本的不要忘记加入
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926470bc2810.png&quot; alt=&quot;Import Jar/AAR&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;新建Library Project&lt;/h3&gt;
&lt;p&gt;还是新建普通的Project，然后New Module选择Android Library，在新模块下工作，写demo的话就到app下进行工作就ok了&lt;/p&gt;
&lt;h3&gt;导出Library&lt;/h3&gt;
&lt;p&gt;对整个Module Build后就可以在模块路径下，build-&amp;gt;outputs-&amp;gt;aar中找到aar包了&lt;/p&gt;
&lt;h2&gt;Java Exception&lt;/h2&gt;
&lt;h3&gt;异常分类&lt;/h3&gt;
&lt;p&gt;所有的异常都派生于Throwable类&lt;/p&gt;
&lt;p&gt;但所有的异常在Throwable下将分为两类:Error,Exception&lt;/p&gt;
&lt;p&gt;Error是Java运行时系统的内部错误和资源耗尽错误，应用程序不应该抛出这样的错误。这一类不用管&lt;/p&gt;
&lt;p&gt;Exception层则又分为两层，Runtime Exception和其他异常(Checked Exception)&lt;/p&gt;
&lt;p&gt;Runtime Exception是运行时错误，是由于编写程序时的疏忽导致的，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误的类型转换&lt;/li&gt;
&lt;li&gt;数组访问越界&lt;/li&gt;
&lt;li&gt;访问空指针&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他异常包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开不存在的文件&lt;/li&gt;
&lt;li&gt;在EOF后尝试读取数据&lt;/li&gt;
&lt;li&gt;根据字符串查找Class对象，然而该字符串表示的类并不存在&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&quot;如果出现了RuntimeException异常，那么就一定是你的问题&quot;
去理解这句话与两类Exception，应该这么理解：&lt;/p&gt;
&lt;p&gt;RuntimeException是指这样的问题能够在编写程序时完全避免，是逻辑异常！
&lt;strong&gt;因此！&lt;/strong&gt;
程序运行时也不需要去针对发生这样的异常而去采取相应的解决措施。
&lt;strong&gt;而且！&lt;/strong&gt;
不应在方法上对RuntimeException进行声明&lt;/p&gt;
&lt;p&gt;而其他异常，也就是Checked Exception，是指在书写这一方法时，对那些格式正确，命令逻辑无错但却并不存在，命令无法执行，而且并不能知道如何去解决这些问题的时候所抛出的异常
对于这样的Exception，书写方法的人与调用方法的人都对这样的格式正确，逻辑无错的命令事先并不知情，对代码已检查过后抛出
&lt;strong&gt;因此&lt;/strong&gt;
他叫已经检查过了的错误，所以这样的异常需要进行捕获，而不是事先便能排除。&lt;strong&gt;但Java中并没有这样一类叫做Checked Exception&lt;/strong&gt;，这是语言规范。&lt;/p&gt;
&lt;p&gt;事实上我觉得已检查异常这个名字真的很容易误解。&lt;s&gt;已检查了的异常还用抛出咩233&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请注意，所有的异常都发生在运行时，而不仅仅是RuntimeException&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;两类异常如何选择？&lt;/h3&gt;
&lt;h4&gt;使用方法时：&lt;/h4&gt;
&lt;p&gt;当遇到RuntimeException时，应该是事先检查而避免发生异常，不是发生异常后进行捕捉处理
当遇到其他异常（已检查异常）时，则应try&amp;amp;catch，当发生异常时，如果能够解决，则处理，不能解决，则继续向上抛出&lt;/p&gt;
&lt;h4&gt;编写方法时：&lt;/h4&gt;
&lt;p&gt;当遇到RuntimeException时，大多数情况下不必手动抛出，也不应在方法上声明，例如越界访问，一般来说，这样的运行时错误会被自动抛出，如若想自己对参数进行校正检验抛出可以继承RuntimeException类创建一个自定义运行时异常对象或者new RuntimeException对象
当遇到CheckedException时，直接抛出即可&lt;/p&gt;
&lt;h3&gt;如何考虑异常的捕获&lt;/h3&gt;
&lt;p&gt;“底层抛出，顶层记录解决”，是一句比较正确程序观的话。&lt;/p&gt;
&lt;h2&gt;Handler的内存泄露问题&lt;/h2&gt;
&lt;p&gt;这个问题的引发是由于在实践Handler时使用匿名内部类/非静态内部类重写handleMessage方法，Android Studio的深色提示会显示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926470bb12d7.png&quot; alt=&quot;Handler Memory Leaks Tips&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个问题的解决很多文章很多回答都有，贴两个：
http://blog.csdn.net/lincyang/article/details/46875157
http://www.jianshu.com/p/cb9b4b71a820&lt;/p&gt;
&lt;p&gt;在看这些回答前，应该先了解，在Java中的引用与垃圾回收的机制，以及强弱引用
http://blog.csdn.net/matrix_xu/article/details/8424038&lt;/p&gt;
&lt;p&gt;对于这些回答中的一些小疏漏就是，对于任何外界（生命周期比Handler短）的引用，都应该用WeakReference&lt;/p&gt;
&lt;h3&gt;深层次想法&lt;/h3&gt;
&lt;p&gt;对于内存泄漏，就是该释放的时候，系统的垃圾回收器没办法释放掉，原因是有强引用正在引用着这个对象，如果说两个对象的生命周期一致，则没有这个问题，如果说生命周期比我生成的对象要短，而且，我不一定需要这个对象一定是保存到我的对象结束为止的话，就应该使用弱引用而不是强引用&lt;/p&gt;
&lt;h2&gt;Looper&lt;/h2&gt;
&lt;p&gt;Looper这个坑真是深的不行，所有的学习过程中，包括看视频啊，看书啊，看博客啊，都没有提到。
对于线程之间的通信，使用的是Handler/Message Queue进行相互交流，对于自行new 的线程，我们需要执行以下两步来初始化Looper以保证Handler能处理消息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
@Override
public void run() {
	//do anything
	Looper.prepare();
	//prepare your Handler here and do anything
	Looper.loop();
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然而当我们的Handler处理完消息，我们的消息只需要处理一次，想要把线程终结了的时候，没有视频，没有书会告诉你，要记得把Looper关掉，源码是说Looper.loop()是死循环，因此Thread永远不会停止，Handler永远会接受消息，没错Handler的职责就是一直负责处理消息，然而如果没有消息再进来了，这时我们不需要这条线程这个Handler这个Looper了，如果一直不停的创建Looper，则会引发Android的Assert!
Assert的提示是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Abort message: &apos;Could not create wake pipe.  errno=24&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Looper: Could not create epoll instance.  errno=24
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有时会提示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/A art/runtime/indirect_reference_table.cc:77] Check failed: table_mem_map_.get() != nullptr ashmem_create_region failed for &apos;indirect ref table&apos;: Too many open files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真是千奇百怪的错误提示，google搜了一大圈都没搜到，也从来没有往Looper这个方向想，尽管loop是死循环，但对他死循环没有卡系统也就没有想太多&lt;/p&gt;
&lt;p&gt;根本原因Looper的实现是用pipe//待探究&lt;/p&gt;
&lt;p&gt;最后解决是如果我处理完了信息不需要Looper了，对Looper&lt;strong&gt;对象&lt;/strong&gt;进行quit()就可以了：looper.quit();，这样线程也就随之而结束了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Looper对象如何获取：
在prepare后
Looper looper = Looper.myLooper();
就可以了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当然啦，如果处理异步，规范的做法应该是两条线程，主线程交给后台线程进行处理耗时操作，而不是每次新开的一个线程里直接发送返回处理&lt;/p&gt;
&lt;p&gt;&lt;s&gt;（我不会说我在写这段话的时候才想起来应该这么做，这个问题可困扰我好长时间了）&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;对于有兴趣想知道为什么我会找到这样问题的可以来看：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/pixivAPI_android/blob/90de95bb4e475ad0211b449d22b06bdc3b7e7bf4/app/src/main/java/com/xingoxu/pixivapi_in_android/Logic/pixivImageCacheHelper.java&quot;&gt;pixivImageCacheHelper&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想法是新开一个线程发送请求后就在当前线程处理返回的请求，应该做法是在新开的线程中定义Handler，将这个handler作为主线程发送的请求的参数&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;AppCompat v7的Toolbar与Contextual ActionBar的坑&lt;/h2&gt;
&lt;p&gt;Google 在v7兼容包发布后对于Contextual ActionMode感觉上来说不太支持，所有的文档也并不鼓励使用Contextual ActionMode，然后在使用的过程中就感受到了满满的恶意&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.android.com/guide/topics/ui/menus.html#CAB&quot;&gt;来自谷歌官方的提示：&lt;/a&gt;
Note: The contextual action bar is not necessarily associated with the app bar. They operate independently, even though the contextual action bar visually overtakes the app bar position.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Toolbar and Contextual ActionBar with AppCompat-v7&lt;/p&gt;
&lt;p&gt;https://stackoverflow.com/questions/26443403/toolbar-and-contextual-actionbar-with-appcompat-v7
http://stackoverflow.com/questions/27663853/how-to-make-the-contextual-actionmode-bar-overlay-the-appcompat-v7-toolbar-but-n&lt;/p&gt;
&lt;p&gt;http://stackoverflow.com/questions/32318563/appcompat-v7-v23-0-0-statusbar-color-black-when-in-actionmode&lt;/p&gt;
&lt;p&gt;最后对于ActionMode的status bar变黑问题上，我选择了：
http://stackoverflow.com/questions/30180091/when-using-actionmode-the-status-bar-turns-black-on-lollipop
的处理方法，虽然不够完美，有精力的话是会想重新自己造轮子的&lt;/p&gt;
&lt;h2&gt;心得&lt;/h2&gt;
&lt;p&gt;感谢你看到这里！&lt;/p&gt;
&lt;p&gt;对Java/Android的设计模式感受到了前所未有的累，虽然知道他用的这个模式，自己在写的时候虽然只是模仿就已经是非常艰难了，因为是在学习，虽然是以作品驱动的学习动力，也不敢乱用第三方的库啊什么的，嘛，希望自己能够加油！ &lt;s&gt;自己选的坑含着泪也要跳下去&lt;/s&gt;&lt;/p&gt;
&lt;h3&gt;IDEA/Android Studio的一些自用快捷键：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl+P 方法参数提示&lt;/li&gt;
&lt;li&gt;Ctrl+Space 补全提示&lt;/li&gt;
&lt;li&gt;Ctrl+B 快速跳转定义/实现&lt;/li&gt;
&lt;li&gt;Ctrl+Q 文档显示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;References：&lt;/h3&gt;
&lt;p&gt;都是已经填平了的坑的文章，感谢这些作者的付出！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/&quot;&gt;API Demos Source Code From Git at Google&lt;/a&gt;
&lt;a href=&quot;http://stackoverflow.com/q/4237469&quot;&gt;Why do variable names often start with the letter &apos;m&apos;?&lt;/a&gt;
&lt;a href=&quot;http://my.oschina.net/blackylin/blog/144342&quot;&gt;imageView src与background关于alpha的两三事&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/lmj623565791/article/details/45059587&quot;&gt;RecyclerView的使用&lt;/a&gt;
&lt;a href=&quot;https://www.bignerdranch.com/blog/recyclerview-part-2-choice-modes/&quot;&gt;为RecyclerView 添加ChoiceMode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大量图片异步加载
http://blog.csdn.net/chdjj/article/details/20455791
https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html&lt;/p&gt;
&lt;p&gt;SwipeRefreshLayout RecyclerView的下拉刷新与上拉加载
http://51up.club/2015/10/13/SwipeRefreshLayout-RecyclerView-%E5%AE%9E%E7%8E%B0%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0%E5%92%8C%E4%B8%8A%E6%8B%89%E5%8A%A0%E8%BD%BD%E6%9B%B4%E5%A4%9A/
https://www.easydone.cn/2015/10/26/&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Stepping Further - 2016</title><link>https://blog.xingoxu.com/2016/01/2016-stepping-further/</link><guid isPermaLink="true">https://blog.xingoxu.com/2016/01/2016-stepping-further/</guid><description>Time flies very fast. 一年之中的种种似乎仿佛还在眼前，然而却也是回不去的昨天。

</description><pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Time flies very fast. 一年之中的种种似乎仿佛还在眼前，然而却也是回不去的昨天。&lt;/p&gt;

&lt;h2&gt;blog的诞生&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/5925478b03d5c.png&quot; alt=&quot;第一篇来自hexo的博客&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
域名是2015年年初购买的，购买的原因我似乎自己也快忘了，好像是当时测试用的Azure还没有过期，自己就买了个域名搭着服务器玩玩apache与wordpress，然而才用了一两个月好想Azure就开始关闭测试账户了，真是意想不到，因为这项开支，自己却无意中学习了那么多有趣的知识，比如域名记录A AAAA CNAME NS，比如静态博客生成Hexo框架，比如CSS in YAML Aint Markup Language，认识了很多网页的调试工具。其实自己去年刚学习HTML+CSS的时候感觉非常有趣就有想当前端的想法，然而却又太胆小，不敢去学，那时什么都不知道，今年虽然下定决心要当个dev，~~但想学js的心仍然没有停止（待我会玩Android就学）~~ 另外到现在也其实没整明白博客有啥意思，像我这样连高考作文800字憋不出来的人，能憋出这么多字的博客已经是精一杯了，明明自己微博活的更精彩。
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.xingoxu.com/2015/04/hello-world/&quot;&gt;第一篇来自hexo的博客&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h2&gt;20岁&lt;/h2&gt;
&lt;p&gt;我仍然不敢相信自己居然已经跨入20岁，我似乎一直觉得自己还是15，16，似乎昨天还是高三学生，似乎今天还要背诵默写古诗词，但身边一切的一切都早已变了。20岁的这一年，有了人生许多的第一次，20岁的这一年，明天似乎触手可得。傍晚时分，我给自己买了一块跟去年一样的蛋糕，希望能够重新背起包袱，向人生的最有活力的时段进发。
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;成绩&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/59252d929d187.png&quot; alt=&quot;今年的作品(?)&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
当大家都不怎么学习的时候，你只需稍稍的努力，便能取得一个很不错的成绩。第一次尝到认真学习的甜头，只用了半个学期，就把上半学年不怎么地的绩点拉了上来还能拿奖，但综合这一年，感觉不怎么合算，第二学期还好，大三上的这一个学期，写了很多，做了很多，然而并没有什么卵用，虽然还没出成绩，但感觉得分不会很高。你很认真的在做一个东西，你把他当一个产品来看待，用了很多课外的知识，但老师只看你课内努力的这一部分，那为什么不早点告诉我我随便写点玩具代码就交给你呢？而且想要发展的方向也并不是C#方向，老师连基本的面向对象的概念也不讲，这个年纪，真是耽误人啊！
下半年把java核心技术这本书好好的读了一遍，还是写的不错，话说几个好友给我推荐的几本书都很好很容易上手也由浅入深，很喜欢很经典，嘛，就是没有时间去实践，虽然在写算法题的时候会用java来写，但还是感觉熟练度啊，熟悉程度啊，完全是比不上连书都没看过的C#，这完全得益于winform/wpf的框架和自动提示，太智能，不得不感叹上手容易，想搜什么也是很快就能定位到目标。
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;第一次的独立远行&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926441199e9c.jpg&quot; alt=&quot;国子监&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
惭愧的是，这么大了居然才是一个人出门玩（典型的家长的独生乖儿子），出门玩也是各种三叮咛四嘱咐的，到了帝都还时不时打电话来发短消息发QQ发微信给我问我玩的开心不开心，也是醉了！花了小半天做了点有什么好玩的地方的功课就冲动的买下了火车票，也没跟任何人说，然而等我坐上车的时候却被母亲的大嘴巴已经讲的全亲戚朋友都知道了。。。。。也没跟太多人搭过话，所以自认这趟旅行京味还是不够足的，但值回票价就可以啦！逛过巷子，去过景点，吃过包子（跟魔都小笼类似），看过孔夫老爷子，拜过国子监~~（怪不得下半年那么拼原来是上身了）~~，还有什么值得留恋的呢？
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;测试&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/592644ff505dc.png&quot; alt=&quot;ccf&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;作为想要当一名合格的coder的人，深知算法和数据结构是基础内功，然而此内功虽然是万恶之本，但点到即可，不需过多掌握，关键在于应用性技能，但看到身边的一小部分同学有些出没ACM比赛，有些不知道搞起了什么东西胸有成竹，自己的心中总有那么一些不安，想做些什么，另一个自己却总是说“你什么都不会出去丢人？不怕被拒？”，于是自己也报了一些所谓的一个测试标准，成绩下来的时候还是有点意外的，班长说咱学校好久没有300分以上的了，你终于过了，我感觉很莫名其妙，300分算很好嘛。。。。毕竟自己什么练习也没做。。。。稍稍安心了一下，虽然这个测试现在看起来并没有什么卵用。。。。
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;年末的实习&lt;/h2&gt;
&lt;p&gt;下定决心年末想找份实习实践一下&lt;s&gt;半年&lt;/s&gt;一年所学吧，可以熟练一点，然后也是算是受到了监督前辈的鼓舞吧，再加上自己看着下半年的抢钱计划（长叹一口气），想想自己简历也没什么好写的，斗着胆随便写了点东西就投了，然后有一家要我去面试，感觉还行吧也没问什么特别奇怪的问题，就是数据结构算法和面向对象的问的多了点，关于语言的倒是只问了重载的写法，有点让我意外，却也在情理之中，虽然知道自己大三and一般单位周六周日都不会上班因此基本上是不会被录取的，话也说在前面了，但面试的这个程序员小哥还是把面试面完了，也不知是真是假，他说你要是大四我就要你了（这应该只是安慰吧应该只是安慰吧），反正再学习一下吧，寒假里把安卓再好好学学，写一个算能见人的作品，也通过这次面试知道自己数据结构还有面向对象这些小概念还是不是很清楚需要再深入学习。不算是一个差的结局吧，永远相信努力的人运气不会太差~~（？）~~
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;动画小结&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926452a96a8e.png&quot; alt=&quot;Battle Spirits Sword Eyes&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;今年感觉会坑很多连载动画，大多看了一部分便又开始兴致冲冲的追了另一部动画片，前一部便一直搁着，还有就是不愿意在闲暇时间看动画，喜欢把大块时间留给动画，然而大块时间都在写作业导致了看番的时间少得可怜（在写这篇文章时离年末还有一个礼拜，不知道这一个礼拜能不能把坑都补掉，这一周作业都解决了基本没事）&lt;/p&gt;
&lt;h3&gt;年初：&lt;/h3&gt;
&lt;p&gt;记录的地平线（一）/2014年而来的 四月是你的谎言/战勇/打工吧魔王大人/男子高中生的日常/Hunter X Hunter/流星洛克人 &amp;amp; Tribe/记录的地平线（二）&lt;/p&gt;
&lt;h3&gt;年中以动画电影为主：&lt;/h3&gt;
&lt;p&gt;秒速5厘米/情热传说 导师的黎明/追逐繁星的孩子/萤火之森/穿越时空的少女/ブレイブ ストーリー/ 夏日大作战/言叶之庭/幽灵公主/龙猫/风之谷/起风了/星之声&lt;/p&gt;
&lt;h3&gt;年末：&lt;/h3&gt;
&lt;p&gt;银之匙（一）（二）/高达创战者（一）/Battle Spirits Season 6(最強銀河究極ゼロ～バトルスピリッツ～)
最后还完整复习了DA01 DA滚球兽的诞生 DA我们的战争游戏&lt;/p&gt;
&lt;p&gt;动画小结的最后再甩一下锅，其实也有部分不是我的错！还有汉化组还没出汉化的呢_(:3」∠)_
&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;游戏小结&lt;/h2&gt;
&lt;p&gt;今年可以说在游戏上，在动漫上还是花了比较多的钱的，无论是旧坑闪十一，还是新坑TOZ，还是年末的新坑BS，花钱花精力，真是辣鸡游戏，毁我钱财，败我身心233，psv，ps4，new 3ds全都有了，大概是真·迈向死宅了（。&lt;/p&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/59264a4a15fb1.jpg&quot; alt=&quot;3DS今年游戏时间&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;PS4&lt;/h3&gt;
&lt;p&gt;当得知TOZ要出PS4版本时，心中便已按捺不住，偷跑一出便下了单一起把ps4买了，玩了十几个小时，画质实在是太棒了，高清斯雷舔舔舔啊！&lt;/p&gt;
&lt;h3&gt;3DS&lt;/h3&gt;
&lt;p&gt;今年游戏玩了很多，坑了也很多，没有一款游戏基本是好好认真的刷刷刷的，上半年把go3 超新星刷了个自觉的算是满意了，给这张盘画上了个算是圆满的句号吧，然而就是把之前刷了130个小时的稍微完善一下也花了30多个小时，全年第二，临近年末玩了火纹if，打算认真刷的，然而在今年结束前是不可能结束掉啦。&lt;/p&gt;
&lt;h3&gt;PSV&lt;/h3&gt;
&lt;p&gt;今年购买了太鼓达人V和初音F2，f2其实在上半年的ps3中就已经通过关了，然而感觉歌曲还不错于是便买下来了重新打，太鼓达人作为一款零碎时间的打发游戏，V版的歌曲还是很不错的（一开始还不了解，打了感觉还不错），太鼓达人是好友Fido安利的&lt;/p&gt;
&lt;h2&gt;音乐&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926463e35706.jpg&quot; alt=&quot;7!! - オレンジ&quot; /&gt;
7!!的オレンジ作为四月是你的谎言的ED，从听到这首歌开始，一直loop到了年末，很喜欢钢琴的那一部分，很动人&lt;/p&gt;

&lt;h2&gt;Stepping Further - 2016&lt;/h2&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/59264a48c009e.jpg&quot; alt=&quot;今年的伙伴们（误）&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;一年回顾的最后，自己给自己煲个鸡汤，无论是2015年喜也好，2015年的悲也好，还是错过的遗憾，还是令人感慨的种种，都已是过去的一页，无论喜忧，要好好面对2016的自己，希望能够在新的一年中找到一份像样的实习工作，希望能够快点学会自己想要学会的东西，打起12分的精神，能够像えんどうさん一样继续充满干劲！&lt;/p&gt;
&lt;h3&gt;2016年初计划&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2015年没有看完的番统统要看完&lt;/li&gt;
&lt;li&gt;2015年没有打完的游戏统统要打完&lt;/li&gt;
&lt;li&gt;2015年没有看完的书要统统看完&lt;/li&gt;
&lt;li&gt;以上内容不准延续到2017&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/34/xiaoku_thumb.gif&quot; alt=&quot;新浪 - 笑哭&quot; /&gt;看起来并没有诚意呢233&lt;/p&gt;
</content:encoded></item><item><title>解决一个OTA后安装Xposed发生No space left on device错误</title><link>https://blog.xingoxu.com/2015/12/solve-a-problem-with-xposed-after-otato6-0-1/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/solve-a-problem-with-xposed-after-otato6-0-1/</guid><description># 遇见情况

Android 5.0.1-&amp;gt;6.0.1 OTA并root后安装Xposed框架，却提示报错：
&amp;gt; cp: write error: No space left on device

</description><pubDate>Thu, 31 Dec 2015 18:22:18 GMT</pubDate><content:encoded>&lt;h1&gt;遇见情况&lt;/h1&gt;
&lt;p&gt;Android 5.0.1-&amp;gt;6.0.1 OTA并root后安装Xposed框架，却提示报错：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cp: write error: No space left on device&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第一次看见这样的错误提示，觉得很奇怪，明明手机剩余空间还有一半以上，后来爬贴才发现system分区分开来的，/system/App分区的可用空间居然小于20MB了&lt;/p&gt;
&lt;p&gt;好吧，google也是可以的，只能删除一些谷歌的全家桶了&lt;/p&gt;
&lt;h1&gt;解决方法&lt;/h1&gt;
&lt;p&gt;使用任意可使用root权限的文件管理器，定位到/system/App下删除不使用的app的文件夹即可，腾出20M以上就可以了&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://bbs.gfan.com/android-8198870-1-1.html&quot;&gt;解决安装 XPOSED 时遇到的cp: write error: No space left on device&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>重配置WNDR4300手记</title><link>https://blog.xingoxu.com/2015/12/router-reconfig-2015/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/router-reconfig-2015/</guid><description>给路由器迁移的时候，发现了一个SS的问题，导致自己踩雷又从头配置了一遍。。。（作死小能手前来报到）

</description><pubDate>Thu, 31 Dec 2015 18:20:58 GMT</pubDate><content:encoded>&lt;p&gt;给路由器迁移的时候，发现了一个SS的问题，导致自己踩雷又从头配置了一遍。。。（作死小能手前来报到）&lt;/p&gt;

&lt;h1&gt;缘由&lt;/h1&gt;
&lt;p&gt;今天是美好的12.31号，也是在学校的最后一个学习日（下周起为考试周），心情异常高兴，自然是要把学校那个很好的路由器带回家咯，虽然曾有过一次不同环境配置的经验，但今天居然掉坑了&lt;/p&gt;
&lt;h2&gt;环境说明&lt;/h2&gt;
&lt;p&gt;家庭：上海电信光纤接入，光猫自带路由，不可更改，想要自接无线路由出墙需要无线路由再分配一次DHCP
学校：上海电信光纤接入，光猫不自带路由，自己拨号&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;到家直接更改接口处的LAN与WAN，分别改成如图所示：
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/59254648ca777.png&quot; alt=&quot;LAN&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/592546679bdb8.png&quot; alt=&quot;WAN-1&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/5925467479b82.png&quot; alt=&quot;WAN-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;172.168.x.x是很容易想到的除开192的一个地址，虽然属于B类地址，然而现在并没有被卖掉，也被大家广而使用，因此也并没有什么特别的不妥，大不了以后要是有人指向他了，咱就改成192之后的呗&lt;/p&gt;
&lt;p&gt;改完之后发现网能上了，也能顺利出去了，但踏马的路由器设置进不去了，诶怎么都进不去，把网断了，踏马的还是进不去，断网前不停地转圈圈，一直&lt;code&gt;waiting For 172.168.1.1...&lt;/code&gt;断网后显示&lt;code&gt;Connection Reset&lt;/code&gt;，亲你是在逗我吗！这叫个什么事！什么叫网上的去路由器设置上不去，狗带！&lt;/p&gt;
&lt;p&gt;仔细想想，想来想去，还是没有想出个啥道理，以为自己哪里设置没改过来，只好重置&lt;/p&gt;
&lt;h1&gt;重配置&lt;/h1&gt;
&lt;h2&gt;语言的更改&lt;/h2&gt;
&lt;p&gt;重置完后的第一件事情是要将英语改成中文，虽然咱英文不烂，但网络有些专有名词看起来再过一遍脑子还是挺吃力的，关于为什么要改语言，就要追溯到上一个作死贴&lt;a href=&quot;https://blog.xingoxu.com/2015/09/router-rebuild-2015/&quot;&gt;WNDR4300救砖（openwrt）&lt;/a&gt;&lt;img src=&quot;http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/34/xiaoku_thumb.gif&quot; alt=&quot;新浪 - 笑哭&quot; /&gt;，15.05官方固件踏马没带中文！话题回来，首先我们要做的是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opkg update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但这个狗带的电信尼玛又作死了！openwrt.org开不开，奇慢无比，而且15.05的openwrt在配置里可以看到是有签名校验的，想了很久，去搜了一下可行性，最后还是用镜像站吧，还是ustc的大学站，不错啊，你们这个镜像站啊，excited！啧啧&lt;/p&gt;
&lt;p&gt;将软件包配置改成如下：&lt;/p&gt;
&lt;p&gt;原：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz chaos_calmer_base http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/base
src/gz chaos_calmer_luci http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/luci
src/gz chaos_calmer_packages http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/packages
src/gz chaos_calmer_routing http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/routing
src/gz chaos_calmer_telephony http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/telephony
src/gz chaos_calmer_management http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/packages/management
option check_signature 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz chaos_calmer_base http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/base
src/gz chaos_calmer_luci http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/luci
src/gz chaos_calmer_packages http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/packages
src/gz chaos_calmer_routing http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/routing
src/gz chaos_calmer_telephony http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/telephony
src/gz chaos_calmer_management http://mirrors.ustc.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/nand/packages/management
option check_signature 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好噜，上网再搜了一下，luci的最新的中文界面语言包的包名叫做&lt;code&gt;luci-i18n-base-zh-cn&lt;/code&gt;，got后直接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opkg install luci-i18n-base-zh-cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就好啦，安装基本包的时候也使用这几个镜像站，等到我们装完ss后再改回来升级安装包吧&lt;/p&gt;
&lt;h2&gt;打不开172.168.1.1原因的发现&lt;/h2&gt;
&lt;p&gt;之间一路顺风，安装各种依赖包ss chinadns什么的，这个因为之前 &lt;s&gt;作死过很多次&lt;/s&gt; 装过很多次，所以还是比较知道的，待老夫配置好ss后启动试试效果，结果踏马的又开不开我的路由器配置界面啦！情况和开始的一样！哇擦！才想起来，172.168.x.x的地址会不会并没有被排除掉然后被ss接管了直接转发出去了，幸好这个时候putty是连接着的（ssh连接为何不受ip地址影响也是不懂了），赶紧关掉ss，发现路由器设置能进了，内心松下一口气，但我也很奇怪，为什么上次回来的时候路由器也是这样搞得一切正常呢。（后想起：ss openwrt版本呢2.3.1后不再自带ignore.list）&lt;/p&gt;
&lt;p&gt;想来想去，好吧，也没有很好的系统层面上的解决方法，ss我也不知道她的实现方法是怎样的，先添加一下排除试试看吧，定位到ss的luci界面，直接在下面添加了排除，重启服务，发现一切正常，可以进入，明白了ss排除有效，因此我需要在ss的ignore.list将172.168.x.x这个域名段全部添加入，排除掉他，这样我内网传输也暂时不会有什么问题了。&lt;/p&gt;
&lt;p&gt;putty定位到&lt;code&gt;/etc/ignore.list&lt;/code&gt;（我的ignore.list设定在这里，你需要定位到自己设置的位置），vi打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/5926497f2e6de.png&quot; alt=&quot;ignore.list&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前面的四位ip地址姑且能理解，后面的16 18 19 24是什么鬼啊！后实验一番，想起计算机网络的内容（x&lt;/p&gt;
&lt;p&gt;每个ip数字8位二进制，/后指的是指定到多少位忽略，比如&lt;/p&gt;
&lt;p&gt;1.0.1.0/24 -&amp;gt; 00000001.00000000.00000001.00000000的前24位，也就是1.0.1.x会被忽略&lt;/p&gt;
&lt;p&gt;所以如果我想要172.168.x.x忽略的话，则可以设定 172.168.0.0/16&lt;/p&gt;
&lt;p&gt;重设定之后，重启发现一切正常，问题解决&lt;/p&gt;
&lt;h1&gt;安全性&lt;/h1&gt;
&lt;p&gt;咱刚才不是设置了镜像站么，如果镜像站被政要控制了，咱下下来的东西带有恶意脚本监控咋办，只好说，如果到那时，咱只能用能出去的电脑把包包都下下来再scp上传安装，我也试过，然而我并不知道安装顺序，出来了一些错误，什么找不到，那个找不到，唉，这东西对我这个linux门外汉实在是太高深了，只能希望那一天不要到来吧，也希望永远不要再重新配置这个路由器了。。。。我已经看到头大了。。。&lt;/p&gt;
&lt;h1&gt;结束记&lt;/h1&gt;
&lt;p&gt;明明下午计划好的是美好的补番行动，然而我却又把青春与生命献给了狗屎的电信，谴责一下万恶之源，拨号/公网ip还给家庭用户，会断你财路？你没AT&amp;amp;T T-Mobile有钱？你踏马想钱想太多了吧！我只想说不义之财不可得！早日飞妈！&lt;/p&gt;
</content:encoded></item><item><title>闪电十一人GO动画全op&amp;ed音乐专辑整理</title><link>https://blog.xingoxu.com/2015/12/inazuma-eleven-go-anime-op-ed-collection/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/inazuma-eleven-go-anime-op-ed-collection/</guid><description>和无印相比，go的资源真是好找了许多
除GO3 ED外均为320K+APE/FLAC，GO3 ED只有320K且无完整专辑【我看GO3的时候ED从来只看左边正片233，ed3信息少得可怜
建议使用Ctrl+F迅速找到所在专辑
有BK的尽量附上BK
该单曲要是有单曲专辑会在当前歌曲优先附上单曲专辑（一般来数单曲专辑是完整版歌曲，如果要寻TV版长度一般在原生集中）
所有歌曲的专辑皆以动画发布的歌曲专辑优先，歌手自己的专辑将不包括在这次整理中
提示输入密码的话，所有密码均为：xingo（只是为了不被各大网盘屏蔽篡改）
如果无法下载，又或者是因为疏忽编辑错误，又或者是发现了某资源的无损版本，请立刻在微博上[@xingo](http://weibo.com/pokemonxu/)

专辑来源来自互联网，非常感谢各位署名的不署名的分享！由于整理时头晕眼花恕不能全部加上来源（基本都附在压缩包的注释内），如果在这里找到自己的资源需要注明的话请与我联系我会立刻加上！
</description><pubDate>Sat, 26 Dec 2015 16:02:54 GMT</pubDate><content:encoded>&lt;p&gt;和无印相比，go的资源真是好找了许多
除GO3 ED外均为320K+APE/FLAC，GO3 ED只有320K且无完整专辑【我看GO3的时候ED从来只看左边正片233，ed3信息少得可怜
建议使用Ctrl+F迅速找到所在专辑
有BK的尽量附上BK
该单曲要是有单曲专辑会在当前歌曲优先附上单曲专辑（一般来数单曲专辑是完整版歌曲，如果要寻TV版长度一般在原生集中）
所有歌曲的专辑皆以动画发布的歌曲专辑优先，歌手自己的专辑将不包括在这次整理中
提示输入密码的话，所有密码均为：xingo（只是为了不被各大网盘屏蔽篡改）
如果无法下载，又或者是因为疏忽编辑错误，又或者是发现了某资源的无损版本，请立刻在微博上&lt;a href=&quot;http://weibo.com/pokemonxu/&quot;&gt;@xingo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;专辑来源来自互联网，非常感谢各位署名的不署名的分享！由于整理时头晕眼花恕不能全部加上来源（基本都附在压缩包的注释内），如果在这里找到自己的资源需要注明的话请与我联系我会立刻加上！&lt;/p&gt;

&lt;h1&gt;主题曲类&lt;/h1&gt;
&lt;h2&gt;op类&lt;/h2&gt;
&lt;h3&gt;GO1&lt;/h3&gt;
&lt;h4&gt;天までとどけっ! （第1话~第18话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - 天までとどけっ!
商品番号 PKCF-1055
JAN 4942463623050&lt;br /&gt;
メディア マキシシングル CD&lt;br /&gt;
組枚数 1
発売日 2011/07/06&lt;/p&gt;
&lt;p&gt;アーティスト/ キャスト
T-Pistonz + KMC&lt;/p&gt;
&lt;p&gt;内容
大人気アニメ「イナズマイレブン」の新シリーズ「イナズマイレブンGO」のオープニングテーマ&lt;/p&gt;
&lt;p&gt;と、ゲーム「イナズマイレブン ストライカーズ」のオープニングテーマを収録! すっかり「イナ&lt;/p&gt;
&lt;p&gt;ズマイレブン」の顔となったT-Pistonz+KMCが今回も担当!&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;天までとどけっ!&lt;/li&gt;
&lt;li&gt;みんなあつまリーヨ!&lt;/li&gt;
&lt;li&gt;天までとどけっ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;みんなあつまリーヨ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K（无BK）下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbafaqmll8j
(baidu)http://pan.baidu.com/s/1bnvmT0V
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3Hx
(360云盘)http://yunpan.cn/Q7JcYmIWuvrC4  提取码 8351&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbdyhc2ot09
(baidu)http://pan.baidu.com/s/1jdCN8
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3A4
(360云盘)http://yunpan.cn/Q7JcLt7HWsIba  提取码 ef28&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;成せば成るのさ 七色卵（第19话~第33话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - 成せば成るのさ七色卵
商品番号：PKCF 1059
高視聴率を更新中！爆裂超人気アニメ「イナズマイレブンGO」!! Wii用ソフト、ニンテンドー3DS&lt;/p&gt;
&lt;p&gt;ソフトも続々発売、映画化も決定し、ますます注目を集める「イナズマイレブン」シリーズ！
すっかり「イナズマイレブン」の顔となったT-Pistonz＋KMCが今回こアニメオープニングテーマ&lt;/p&gt;
&lt;p&gt;を担当。9月7日放映分より新オープニングテーマがオンエア！今回も熱い楽曲でアニメを更に盛&lt;/p&gt;
&lt;p&gt;り上げます！&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;成せば成るのさ 七色卵&lt;/li&gt;
&lt;li&gt;がってんだっしょ!&lt;/li&gt;
&lt;li&gt;成せば成るのさ 七色卵 (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;がってんだっしょ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmolp3zz6
(baidu)http://pan.baidu.com/s/1pJ5DMqv
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3He
(360云盘)http://yunpan.cn/Q7KM3Tzxuvi8x  提取码 8bb7&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmogki4k7
(baidu)http://pan.baidu.com/s/1gdd3O4r
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3Bc
(360云盘)http://yunpan.cn/Q7JcPfwZLRndI  提取码 d6e1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
#### おはよう！シャイニング·デイ（第34话~第45话） / 打ち砕ーくっ！（第46话~第47话）（所属专辑：单曲专辑）
&lt;p&gt;T-Pistonz+KMC - おはよう！シャイニング デイ／打ち砕ーくっ！
価格     1050円(税込)
発売日     2012/02/15
商品番号     PKCF-1073
JAN     4942463623234
メディア     マキシシングル CD
組枚数     1&lt;/p&gt;
&lt;p&gt;アーティスト/ キャスト
T-Pistonz+KMCT-Pistonz + KMC&lt;/p&gt;
&lt;p&gt;内容
アニメ『イナズマイレブンGO』オープニングテーマ、3DS用ソフト『イナズマイレブンGO シャイ&lt;/p&gt;
&lt;p&gt;ン』オープニングテーマ「おはようシャイニング?デイ」、3DS用ソフト『イナズマイレブンGO ダ&lt;/p&gt;
&lt;p&gt;ーク』オープニングマテーマ「打ち砕ーくっ!」を収録! これぞT-Pistonz+KMCの真骨頂、パワフ&lt;/p&gt;
&lt;p&gt;ルで超ポジティブなナンバー!! 通常盤は、イナズマイレブンGOカードゲームプロモカード1種封&lt;/p&gt;
&lt;p&gt;入。&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;おはよう!シャイニング?デイ&lt;/li&gt;
&lt;li&gt;打ち砕ーくっ!&lt;/li&gt;
&lt;li&gt;おはよう!シャイニング?デイ (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;打ち砕ーくっ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbew5obdrur
(baidu)http://pan.baidu.com/s/1hqehJ4w
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3HT
(360云盘)http://yunpan.cn/Q7JcSctEnbhF8  提取码 814c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbew5k4lh9k
(baidu)http://pan.baidu.com/s/1eQpHfTg
(微盘)http://vdisk.weibo.com/s/APlR9kfmR3B8
(360云盘)http://yunpan.cn/Q7JHe2rjCkmvC  提取码 a00b&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;GO2 Chrono Stone&lt;/h3&gt;
&lt;h4&gt;情热で胸アツ！（第1话~第17话(奇话数)）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - 情热で胸アツ！
CD (2012/6/20)
ディスク枚数: 1
フォーマット： Single, Limited Edition, Maxi
レーベル: アップフロントワークス
収録時間: 17 分
ASIN: B007MDQ2SM
EAN： 4942463623272&lt;/p&gt;
&lt;p&gt;内容紹介：
爆熱大人気「イナズマイレブンGO」新オープニングテーマを歌うのはもちろんT-Pistonz+KMC!!
ニューシングルは“イナズマユニフォーム付き!!&quot;&lt;/p&gt;
&lt;p&gt;「情熱で胸アツ! 」は4月よりテレビ東京系アニメ「イナズマイレブンGO クロノ·ストーン」OPテ&lt;/p&gt;
&lt;p&gt;ーマとしてオンエア!
今回はなんと初回限定盤の特典として、イナズマイレブンGOユニフォームが付いてくる!!
松風天馬·剣城京介·神童拓人各モデルは、それぞれ背番号が異なるデザイン!イナズマイレブンフ&lt;/p&gt;
&lt;p&gt;ァンには見逃せないマストアイテム!!&lt;/p&gt;
&lt;p&gt;収録曲：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;情熱で胸アツ!&lt;/li&gt;
&lt;li&gt;心をつなごう!&lt;/li&gt;
&lt;li&gt;情熱で胸アツ! (オリジナル·カラオケ)&lt;/li&gt;
&lt;li&gt;心をつなごう! (オリジナル·カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbewvrsbxfo
(baidu)http://pan.baidu.com/s/1hqqYWoG
(微盘)http://vdisk.weibo.com/s/APlR9kfmRFvA
(360云盘)http://yunpan.cn/Q7JuHDSRpxeHC  提取码 c46e&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbaf61mk6x4
(baidu)http://pan.baidu.com/s/1o64tUh8
(微盘)http://vdisk.weibo.com/s/APlR9kfmRFvF
(360云盘)http://yunpan.cn/Q7ZbRVmFjnm5B  提取码 99e2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;感动共有！（第2话~第18话(偶话数)）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - 感动共有！
発売日：2012/07/04
商品番号：PKCF-1083&lt;/p&gt;
&lt;p&gt;2012年4月より新シリーズとなってますますパワーアップした、テレビ東京系TVアニメ『イナズマ&lt;/p&gt;
&lt;p&gt;イレブンGO クロノ?ストーン』のアナザーOPテーマ曲ほかを収めたシングル。
表題曲の「感動共有!」は、4月25日よりOPテーマ曲「情熱で胸アツ!」と隔週でオンエア中!&lt;/p&gt;
&lt;p&gt;爆発大人気「イナズマイレンGO クロノ?ストーン」アナザーオープニングテーマソング!&lt;/p&gt;
&lt;p&gt;収録曲
1 感動共有!
2 突き抜けろっ!
3 感動共有! (オリジナル?カラオケ)
4 突き抜けろっ! (オリジナル?カラオケ)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcm7fxwejb
(baidu)http://pan.baidu.com/s/1i3BVDDr
(微盘)http://vdisk.weibo.com/s/APlR9kfmRFvt
(360云盘)http://yunpan.cn/Q7VxYkL9rbefQ  提取码 c44c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbsqu6j8td
(baidu)http://pan.baidu.com/s/1c0xmJDm
(微盘)http://vdisk.weibo.com/s/APlR9kfmRFvt
(360云盘)http://yunpan.cn/Q7VxP8C7pmdT5  提取码 6ebd&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;初心をKEEP ON！（第19话~第35话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;TVアニメ『イナズマイレブンGO クロノ?ストーン』OP3「初心をKEEP ON!」／T-Pistonz + KMC
発売日：2012/10/31
商品番号：AVCD-55005&lt;/p&gt;
&lt;p&gt;テレビ東京系アニメ『イナズマイレブンGO クロノ?ストーン』新オープニング?テーマ。&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;初心をKEEP ON!&lt;/li&gt;
&lt;li&gt;手をつなごう&lt;/li&gt;
&lt;li&gt;初心をKEEP ON! (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;手をつなごう (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcm7fpynab
(baidu)http://pan.baidu.com/s/1eQGL566
(微盘)http://vdisk.weibo.com/s/APlR9kfmRFv_
(360云盘)http://yunpan.cn/Q7VxS48fA88dQ  提取码 2300&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcm7fpdea0
(baidu)http://pan.baidu.com/s/1kTzauij
(微盘)http://vdisk.weibo.com/s/APlR9kfmRF1T
(360云盘)http://yunpan.cn/Q7VxBxkpeGzJb  提取码 990a&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;ライメイ！ブルートレイン（第36话~第51话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - ライメイ！ブルートレイン
CD (2013/2/13)
光碟数目: 1
フォーマット： Single, Limited Edition, Maxi
レーベル: FRAME
収録時間: 32 分
ASIN: B00AI9HHJA
EAN： 4988064550197
T-Pistonz+KMCが歌うテレビ東京系アニメ『イナズマイレブンGO クロノ?ストーン』のオープニン&lt;/p&gt;
&lt;p&gt;グ?テーマ、ニンテンドー3DS『イナズマイレブンGO クロノ?ストーン ライメイ』のテーマ?ソン&lt;/p&gt;
&lt;p&gt;グ「ライメイ!ブルートレイン」を収録したシングル。さらに、「ネップウ!ファイヤーバード2号&lt;/p&gt;
&lt;p&gt;」はニンテンドー3DS『イナズマイレブンGO クロノ?ストーン ネップウ』のテーマ?ソング。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ライメイ!ブルートレイン&lt;/li&gt;
&lt;li&gt;ネップウ!ファイヤーバード2号&lt;/li&gt;
&lt;li&gt;掌のぬくもり&lt;/li&gt;
&lt;li&gt;ライメイ!ブルートレイン (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;ネップウ!ファイヤーバード2号 (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;掌のぬくもり (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbsqxtq60h
(baidu)http://pan.baidu.com/s/1bnbAgsZ
(微盘)http://vdisk.weibo.com/s/APlR9kfmRuYw
(360云盘)http://yunpan.cn/Q7Vx67WQfxugT  提取码 8fb3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbewvlpi6u3
(baidu)http://pan.baidu.com/s/1CjVki
(微盘)http://vdisk.weibo.com/s/APlR9kfmRuYo
(360云盘)http://yunpan.cn/Q7VnFxwN6xmgH （提取码：ee80）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;GO3&lt;/h3&gt;
&lt;h4&gt;ガチで勝とうゼッ!（第1话~第17话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - ガチで勝とうゼッ!
艺人 : T-Pistonz+KMC
专辑 (Single) : ガチで勝とうゼッ! (Gachi de Katoze!)
发行日期 : 2013.06.19&lt;/p&gt;
&lt;p&gt;内容紹介 :&lt;/p&gt;
&lt;p&gt;パフォーマンス?グループT-PistonzとラッパーのKMCによる合体ユニットの16thシングル。「ガチ&lt;/p&gt;
&lt;p&gt;で勝とうゼッ!」は、テレビ東京系アニメ『イナズマイレブンGO ギャラクシー』のOPテーマに起&lt;/p&gt;
&lt;p&gt;用されたハイ?テンションなナンバーだ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ガチで勝とうゼッ!&lt;/li&gt;
&lt;li&gt;空は知ってる&lt;/li&gt;
&lt;li&gt;ガチで勝とうゼッ!(オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;空は知ってる (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K（无3、4）下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbewvltee1p
(baidu)http://pan.baidu.com/s/1gdEbDcR
(微盘)http://vdisk.weibo.com/s/APlR9kfmRuYL
(360云盘)http://yunpan.cn/Q7ZbBtcfbbncJ  提取码 971a&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd24923vdg
(baidu)http://pan.baidu.com/s/1bnvmTXl
(微盘)http://vdisk.weibo.com/s/APlR9kfmRuYs
(360云盘)http://yunpan.cn/Q7Vx8JTeNZZzf  提取码 a06d&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;地球を回せっ！（第18话~第32话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;[131120]TVアニメ「イナズマイレブンGO ギャラクシー」新OPテーマ「地球を回せっ!」／T-&lt;/p&gt;
&lt;p&gt;Pistonz+KMC
登録情報
CD (2013/10/30)
ディスク枚数: 1
フォーマット： Single, Maxi
レーベル: FRAME
収録時間: 17 分
ASIN: B00EPD2PLK
EAN: 4988064550487&lt;/p&gt;
&lt;p&gt;内容紹介
【初回特典(封入)】イナズマイレブンシリーズ チェンジングジャケット(円堂 守、白竜、剣城&lt;/p&gt;
&lt;p&gt;京介の3種類中1種ランダム封入)&lt;/p&gt;
&lt;p&gt;テレビ東京系アニメ「イナズマイレブン」シリーズのオープニングテーマでおなじみ、T-&lt;/p&gt;
&lt;p&gt;Pistonz+KMCのニューシングルがリリース決定。
爆熱放送中! テレビ東京系6局ネットアニメ「イナズマイレブンGO ギャラクシー」新オープニン&lt;/p&gt;
&lt;p&gt;グテーマ!!!爆熱放送中!&lt;/p&gt;
&lt;p&gt;Disc-1 CD&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;地球を回せっ!&lt;/li&gt;
&lt;li&gt;チャンス!!&lt;/li&gt;
&lt;li&gt;地球を回せっ! (オリジナル·カラオケ)&lt;/li&gt;
&lt;li&gt;チャンス!!(オリジナル·カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;全2曲4バージョン収録予定
メディア掲載レビューほか
パフォーマンス·ユニット「T-Pistonz」に、ラッパー「KMC」が合体した、T-Pistonz+KMCのシン&lt;/p&gt;
&lt;p&gt;グル。&lt;/p&gt;
&lt;p&gt;収録曲:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;地球を回せっ!&lt;/li&gt;
&lt;li&gt;チャンス!!&lt;/li&gt;
&lt;li&gt;地球を回せっ! (オリジナル.カラオケ)&lt;/li&gt;
&lt;li&gt;チャンス!!(オリジナル.カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbp19z4tth
(baidu)http://pan.baidu.com/s/1eQvMJ7c
(微盘)http://vdisk.weibo.com/s/APlR9kfmRsCx
(360云盘)http://yunpan.cn/Q7VxEv9ItnHxf  提取码 4759&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;flac下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4i8f22e7
(baidu)http://pan.baidu.com/s/1eQCbOrw
(微盘)http://vdisk.weibo.com/s/APlR9kfmRsBV
(360云盘)http://yunpan.cn/Q7VxWrzAidGv3  提取码 54a3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;这张专辑有PV MV和Live的dvd资源，不过我觉得没有收藏的必要
有欲收藏的老爷请点这里-&amp;gt;http://bbs.dm123.cn/read-htm-tid-794059.html&lt;/p&gt;
&lt;h4&gt;スパノバ！（第33话~第43话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;T-Pistonz+KMC - スパノバ!／BIGBANG!
Disc-1 CD
M-1:スパノバ!
M-2:BIGBANG!
M-3:スパノバ! (カラオケバージョン)
M-4:BIGBANG! (カラオケバージョン)
全2曲4ヴァージョン収録予定
※曲順は変更の可能性がございます。&lt;/p&gt;
&lt;p&gt;Disc-2 DVD&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;スパノバ! (ミュージックビデオ)&lt;/li&gt;
&lt;li&gt;スパノバ! (振付レクチャービデオ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbefc4ee8zk
(baidu)http://pan.baidu.com/s/1CPScQ
(微盘)http://vdisk.weibo.com/s/APlR9kfmRsCv
(360云盘)http://yunpan.cn/Q7ZbMv5VvKniq  提取码 a17c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;flac（含MV）下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd2ab3quio
(baidu)http://pan.baidu.com/s/1hqvIFB2
(微盘)http://vdisk.weibo.com/s/APlR9kfmRsCJ
(360云盘)http://yunpan.cn/Q7VvGfURLkm5U　提取码 5290&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;ed类&lt;/h2&gt;
&lt;h3&gt;GO1&lt;/h3&gt;
&lt;h4&gt;やっぱ青春（第1话~第18话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;空野葵（北原沙彌香） - やっぱ青春
CD (2011/6/22)
ディスク枚数: 1
フォーマット： Single, CD+DVD, Limited Edition, Maxi
レーベル: アップフロントワークス
収録時間: 16 分
ASIN: B004XES1G4&lt;/p&gt;
&lt;p&gt;内容紹介
人気アニメ「イナズマイレブン」の新シリーズ「イナズマイレブンGO」のエンディングテーマ！
アイドル集団「ハロー！プロジェクト」を卒業した北原沙弥香が「空野葵」役を担当。アニメエ&lt;/p&gt;
&lt;p&gt;ンディングを「空野葵」として歌う！&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;やっぱ青春&lt;/li&gt;
&lt;li&gt;ガムシャラ&lt;/li&gt;
&lt;li&gt;やっぱ青春 （オリジナル?カラオケ）&lt;/li&gt;
&lt;li&gt;ガムシャラ （オリジナル?カラオケ）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpzpy9qxl
(baidu)http://pan.baidu.com/s/1bnw8PY3
(微盘)http://vdisk.weibo.com/s/APlR9kfmRJDO
(360云盘)http://yunpan.cn/Q7c5qbwU8Te4x  提取码 7a60&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbef0ft313s
(baidu)http://pan.baidu.com/s/1jG3gnqu
(微盘)http://vdisk.weibo.com/s/APlR9kfmRJwP
(360云盘)http://yunpan.cn/Q7c5PHNdYVp4i  提取码 bcde&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;かなり纯情（第19话~第33话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;空野葵（北原沙彌香） - かなり纯情
内容紹介
爆熱超人気アニメ「イナズマイレブンＧＯ」新エンディングテーマ！
声優『北原沙弥香』セカンドシングルリリーズ！
●高視聴率を更新中！爆裂人気アニメ「イナズマイレブンＧＯ」！！Wii用ソフト、ニンテンドー&lt;/p&gt;
&lt;p&gt;3DSソフトも続々発売、
映画化も決定し、ますます注目を集める「イナズマイレブン」シリーズ！
●この大人気アニメに「空野葵」声優役として出演中、北原沙弥香がセカンドシングルを発売”9月&lt;/p&gt;
&lt;p&gt;7日よりオンエアとなる
アニメ新エンディングテーマ「かなり純情」を空野葵(CV:北原沙弥香）として歌います！&lt;/p&gt;
&lt;p&gt;【通常盤(初回仕様):CD＋イナズマイレブンGOカードゲームプロモカード1種封入】&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;かなり純情&lt;/li&gt;
&lt;li&gt;窓側から愛をこめて&lt;/li&gt;
&lt;li&gt;かなり純情 (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;窓側から愛をこめて (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4q49sujb
(baidu)http://pan.baidu.com/s/1pJHjj0f
(微盘)http://vdisk.weibo.com/s/APlR9kfmRJqm
(360云盘)http://yunpan.cn/Q7Vx38dSK35UL  提取码 0356&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpzphnr4w
(baidu)http://pan.baidu.com/s/1kTxE1yZ
(微盘)http://vdisk.weibo.com/s/APlR9kfmRJT2
(360云盘)http://yunpan.cn/Q7c5SyTq8wiSq  提取码 1270&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;HAJIKE—YO!!（第34话~第45话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;空野葵（北原沙彌香） - HAJIKE—YO!!
発売日 2012/02/08
商品番号 PKCF-1066
JAN 4942463623166&lt;/p&gt;
&lt;p&gt;内容
空野葵(CV: 北原沙弥香)が歌う、アニメ『イナズマイレブンGO』エンディングテーマ、ニンテン&lt;/p&gt;
&lt;p&gt;ドー3DS用ソフト『イナズマイレブンGO シャイン』エンディングテーマ! ニンテンドー3DS用ソフ&lt;/p&gt;
&lt;p&gt;ト『イナズマイレブンGO ダーク』エンディングテーマ「爱情?情热?热风」、『剧场版イナズマイ&lt;/p&gt;
&lt;p&gt;レブンGO 究极の绊 グリフォン』挿入歌「梦のかたまり」も収录。初回限定盘は、PV+アニメエン&lt;/p&gt;
&lt;p&gt;ディング映像を収录したDVD付き。&lt;/p&gt;
&lt;p&gt;【アーティスト/ キャスト】&lt;/p&gt;
&lt;p&gt;空野葵(CV.北原沙弥香)&lt;/p&gt;
&lt;p&gt;【収录曲目】&lt;/p&gt;
&lt;p&gt;1 [Disc 1] HAJIKE-YO!!
2 [Disc 1] 爱情?情热?热风
3 [Disc 1] 梦のかたまり
4 [Disc 1] HAJIKE-YO!! (オリジナル?カラオケ)
5 [Disc 1] 爱情?情热?热风 (オリジナル?カラオケ)
6 [Disc 2] HAJIKE-YO!! (ミュージックビデオ)
7 [Disc 2] HAJIKE-YO!! (アニメエンディング Ver.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4f8k7xm7
(baidu)http://pan.baidu.com/s/1hqvcL1a
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo_1
(360云盘)http://yunpan.cn/Q7c5S7yj8AIf8  提取码 b6d6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpyq43qqv
(baidu)http://pan.baidu.com/s/1eQ1m1km
(微盘)http://vdisk.weibo.com/s/APlR9kfmRokM
(360云盘)http://yunpan.cn/Q7HJVygRZDYp3  提取码 af53&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DVDISO下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4f8rn0ab
(baidu)http://pan.baidu.com/s/1pJJlbIV
(微盘)http://vdisk.weibo.com/s/APlR9kfmRol7
(360云盘)http://yunpan.cn/Q7HJZSQPvJTh2  提取码 0c78&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;おはょう！ツヤィニング·ディ（第46话~第47话）（所属专辑：go1 op3专辑）&lt;/h4&gt;
&lt;p&gt;op3的后半部分，&lt;a href=&quot;#op3-4&quot;&gt;点击跳转&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;GO2 Chrono Stone&lt;/h3&gt;
&lt;h4&gt;夏がやってくる（第1话~第18话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;空野葵 (CV: 北原沙弥香) - 夏がやってくる
内容绍介
テレビ东京系で放映中の大人気アニメ新シリーズ『イナズマイレブンGO
クロノ?ストーン』(2012年4月18日放映スタート)でヒロイン空野葵役を务める声优、北原沙弥香&lt;/p&gt;
&lt;p&gt;のシングル4枚目。アニメEDテーマ「夏がやってくる」を、空野葵として歌う作品。&lt;/p&gt;
&lt;p&gt;収录曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;夏がやってくる&lt;/li&gt;
&lt;li&gt;夏が终わっちゃう&lt;/li&gt;
&lt;li&gt;夏がやってくる (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;夏が终わっちゃう (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbef0f3p5np
(baidu)http://pan.baidu.com/s/1gd7qf8B
(微盘)http://vdisk.weibo.com/s/APlR9kfmRJSE
(360云盘)http://yunpan.cn/Q7c5RDJuUw3PC  提取码 ea4a&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape附dvdiso下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpzp85iju
(baidu)http://pan.baidu.com/s/1qWEzqC8
(微盘)http://vdisk.weibo.com/s/APlR9kfmRoHz
(360云盘)http://yunpan.cn/Q7HJVEniTpUHZ  提取码 4c86&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;手をつなごう（第19话~第35话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此专辑自购无损：https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;仆たちの城（第36话~第39话，第41话、第43话~第46话、第48话~50话） / 青春おでん（第40话、第42话、第47话、第51话）（所属专辑：单曲专辑）&lt;/h4&gt;
&lt;p&gt;TVアニメ イナズマイレブンGO クロノ?ストーン ED3、4 - 僕たちの城、青春おでん (数量限定生産)
CD (2013/2/6)
ディスク枚数: 1
フォーマット： Single, Limited Edition, Maxi
レーベル: FRAME
収録時間: 20 分
ASIN: B00AI9HHPO
EAN： 4988064550173&lt;/p&gt;
&lt;p&gt;内容紹介
爆裂大人気「イナズマイレブンGO クロノ?ストーン」新エンディングテーマ、新春に登場!!&lt;/p&gt;
&lt;p&gt;高視聴率を更新中! 爆裂超人気アニメ「イナズマイレブンGO クロノ?ストーン」!!
その人気アニメの新エンディングテーマを歌うのは誰か!?
今作も数量限定生産盤として、ここでしか手に入らないフィギュアストラップが付いてくる!!!&lt;/p&gt;
&lt;p&gt;メディア掲載レビューほか
「イナズマイレブンGOオールスターズ」による、テレビ東京系アニメ『イナズマイレブンGO クロ&lt;/p&gt;
&lt;p&gt;ノ?ストーン』のエンディング?テーマを収録したシングル。&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;僕たちの城&lt;/li&gt;
&lt;li&gt;青春おでん&lt;/li&gt;
&lt;li&gt;僕たちの城 (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;青春おでん (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbef0krad6v
(baidu)http://pan.baidu.com/s/1dDGhCsD
(微盘)http://vdisk.weibo.com/s/APlR9kfmRoHM
(360云盘)http://yunpan.cn/Q7c5BI6mrpBsG  提取码 4eaf&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasp7vn9c4
(baidu)http://pan.baidu.com/s/1o6oeV9K
(微盘)http://vdisk.weibo.com/s/APlR9kfmRoHK
(360云盘)http://yunpan.cn/Q7HJjUQYLesxv  提取码 9fea&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;go3 Galaxy&lt;/h3&gt;
&lt;h4&gt;胜手にシンデレラ（第1话~第17话）&lt;/h4&gt;
&lt;p&gt;COLORS - 勝手にシンデレラ
発売日：2013/07/03
商品番号：AVCD-55016
JAN：4988064550166
メディア：CD&lt;/p&gt;
&lt;p&gt;テレビ東京系アニメ『イナズマイレブンGO ギャラクシー』の新エンディング曲は、空野葵 (CV:&lt;/p&gt;
&lt;p&gt;北原沙弥香)と森村好葉 (CV: 悠木碧)。なんとジャンルはヘビメタで、本物にこだわり、作曲と&lt;/p&gt;
&lt;p&gt;ギターは世界的に活躍するギタリスト、マーティ?フリードマンが担当!!&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;勝手にシンデレラ&lt;/li&gt;
&lt;li&gt;ファンタジーが止まらない&lt;/li&gt;
&lt;li&gt;（缺）勝手にシンデレラ (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;（缺）ファンタジーが止まらない (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd23gfcm49
(baidu)http://pan.baidu.com/s/1qWLkQIw
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo7d
(360云盘)http://yunpan.cn/Q7c56tkPvtbAM  提取码 4acb&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;ファッション☆宇宙戦士（第18话~第32话）&lt;/h4&gt;
&lt;p&gt;COLORS - ファッション☆宇宙戦士
收录曲：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ファッション☆宇宙戦士&lt;/li&gt;
&lt;li&gt;夸り高き我らはここにいる&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasv6jf134
(baidu)http://pan.baidu.com/s/1i35khwT
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo72
(360云盘)http://yunpan.cn/Q7c5MLuRV5qF4  提取码 6081&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;岚?竜巻?ハリケーン（第33话~第42话）&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasv6j0lmm
(baidu)http://pan.baidu.com/s/1ntE5wk5
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo7H
(360云盘)http://yunpan.cn/Q7c5MbTuV3N5F  提取码 ef2c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;完结曲 本当にありがとう!（第43话）&lt;/h4&gt;
&lt;h2&gt;是否出过专辑未知，但五周年纪念专辑包含&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K单曲自转上传&lt;/strong&gt;
(115)http://115.com/lb/5lbbpg3jfztd
(baidu)http://pan.baidu.com/s/1jG85S7G
(微盘)http://vdisk.weibo.com/s/APlR9kfmRGfi
(360云盘)http://yunpan.cn/Q7PxyxLJUDJtc （提取码：50f1）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;原声OST&lt;/h1&gt;
&lt;h2&gt;GO1&lt;/h2&gt;
&lt;p&gt;イナズマイレブンGO テレビアニメ 熱血サントラ!
発売日 2012/04/11&lt;br /&gt;
商品番号 PKCF-1075
JAN 4942463623258&lt;/p&gt;
&lt;p&gt;[内容]
人気アニメ「イナズマイレブンGO」の初となるオリジナルサウンドトラックがリリース! 現アニ&lt;/p&gt;
&lt;p&gt;メOPテーマのT-Piston+KMC「おはよう! シャイニング?デイ」から、ヒロイン役声優として出演も&lt;/p&gt;
&lt;p&gt;している北原沙弥香が歌うアニメEDテーマ「HAJIKE-YO!!」、そしてイナズマ大好き少年達にはす&lt;/p&gt;
&lt;p&gt;っかりお馴染みの前OPテーマ、T-Piston+KMC「成せば成るのさ 七色卵」など歴代のテーマソング&lt;/p&gt;
&lt;p&gt;、さらにアニメの名場面で使用された代表的な楽曲をぎっしり収録したイナズマファンのマスト&lt;/p&gt;
&lt;p&gt;アイテム! DVDには、アニメ映像をたっぷり収録!&lt;/p&gt;
&lt;p&gt;【アーティスト/ キャスト】&lt;/p&gt;
&lt;p&gt;T-Pistonz+KMC 空野葵(CV:北原沙弥香)&lt;/p&gt;
&lt;p&gt;【収録曲目】&lt;/p&gt;
&lt;p&gt;1 [Disc 1] 天までとどけっ! (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
2 [Disc 1] やっぱ青春 (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;br /&gt;
3 [Disc 1] 成せば成るのさ 七色卵 (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
4 [Disc 1] かなり純情 (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;br /&gt;
5 [Disc 1] おはよう!シャイニング?デイ (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
6 [Disc 1] HAJIKE-YO!! (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;br /&gt;
7 [Disc 1] 木枯らし荘の朝&lt;br /&gt;
8 [Disc 1] 雷門サッカー部 ～天馬と仲間たち～&lt;br /&gt;
9 [Disc 1] 友達&lt;br /&gt;
10 [Disc 1] 革命を起こせ!&lt;br /&gt;
11 [Disc 1] 不屈の闘志&lt;br /&gt;
12 [Disc 1] 憎悪の悲哀&lt;br /&gt;
13 [Disc 1] オレたちは負けない!&lt;br /&gt;
14 [Disc 1] 折れた志&lt;br /&gt;
15 [Disc 1] 神童の葛藤&lt;br /&gt;
16 [Disc 1] 聖帝&lt;br /&gt;
17 [Disc 1] フィフスセクターの猛威&lt;br /&gt;
18 [Disc 1] シード&lt;br /&gt;
19 [Disc 1] 新生雷門サッカー部&lt;br /&gt;
20 [Disc 1] 戦え!雷門サッカー部!!&lt;br /&gt;
21 [Disc 1] 消せない寂しさ&lt;br /&gt;
22 [Disc 1] 勝利を掴め!&lt;br /&gt;
23 [Disc 1] 友情&lt;br /&gt;
24 [Disc 1] 立ちはだかる壁&lt;br /&gt;
25 [Disc 1] 一触即発&lt;br /&gt;
26 [Disc 1] 敗北&lt;br /&gt;
27 [Disc 1] ホーリーロードを突き進め!&lt;br /&gt;
28 [Disc 1] 化身使い&lt;br /&gt;
29 [Disc 1] ゴールへ!&lt;br /&gt;
30 [Disc 1] 化身激突!&lt;br /&gt;
31 [Disc 1] 少年たちの決意&lt;br /&gt;
32 [Disc 1] デスソード&lt;br /&gt;
33 [Disc 1] 立ち上がれ!雷門イレブン&lt;br /&gt;
34 [Disc 1] 波状攻撃&lt;br /&gt;
35 [Disc 1] フィフスセクターの戦士たち&lt;br /&gt;
36 [Disc 1] 怒涛の必殺技攻撃&lt;br /&gt;
37 [Disc 1] 雷門覚醒&lt;br /&gt;
38 [Disc 1] 激突&lt;br /&gt;
39 [Disc 1] 千宮路の力&lt;/p&gt;
&lt;p&gt;40 [Disc 2] 天までとどけっ! (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
41 [Disc 2] やっぱ青春 (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;br /&gt;
42 [Disc 2] 成せば成るのさ 七色卵 (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
43 [Disc 2] かなり純情 (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;br /&gt;
44 [Disc 2] おはよう!シャイニング?デイ (アニメオープニングVer.) T-Pistonz+KMC&lt;br /&gt;
45 [Disc 2] HAJIKE-YO!! (アニメエンディングVer.) 空野葵(CV:北原沙弥香)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc41ciotj0
(baidu)http://pan.baidu.com/s/1dDhBGBn
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo7b
(360云盘)http://yunpan.cn/Q7LEMSe7aJFBX （提取码：9e01）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd28j4mguu
(baidu)http://pan.baidu.com/s/1nt3adZV
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo7n
(360云盘)http://yunpan.cn/Q7LEkyBsv62gN （提取码：9599）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DVDISO已损坏因此不上传&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;GO2&lt;/h2&gt;
&lt;p&gt;イナズマイレブンGO クロノ?ストーン 時空最強サントラベストセレクション&lt;/p&gt;
&lt;p&gt;発売日         2013/03/20
商品番号 AVCD-55037
JAN        4988064550371&lt;/p&gt;
&lt;p&gt;内容
超人気アニメ「イナズマイレブン」シリーズ最新作「イナズマイレブンGO クロノ?ストーン」の&lt;/p&gt;
&lt;p&gt;サウンドトラックが初登場! 超次元サッカーの世界を体験しよう!&lt;/p&gt;
&lt;p&gt;【アーティスト/ キャスト】&lt;/p&gt;
&lt;p&gt;T-Pistonz+KMC  北原沙弥香  光田康典(音楽)  亀岡夏海(音楽)&lt;/p&gt;
&lt;p&gt;【収録曲目】&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;感動共有! (アニメサイズ) T-Pistonz+KMC&lt;/li&gt;
&lt;li&gt;初心をKEEP ON! (アニメサイズver.) T-Pistonz+KMC&lt;/li&gt;
&lt;li&gt;ライメイ!ブルートレイン (アニメOPバージョン) T-Pistonz+KMC&lt;/li&gt;
&lt;li&gt;僕たちの城 (アニメサイズver.) 松風天馬(CV:寺崎裕香)&amp;amp;剣城京介(CV:大原崇)&amp;amp;神童拓人(CV:斎賀みつき)&amp;amp;西園信助(CV:戸松遥)&amp;amp;霧野蘭丸(CV:小林ゆう)&lt;/li&gt;
&lt;li&gt;青春おでん (アニメサイズver.) 空野葵(CV:北原沙弥香)&amp;amp;瀬戸水鳥(CV:美名)&amp;amp;山菜茜(CV:ゆりん)&amp;amp;菜花黄名子(CV:悠木碧)&lt;/li&gt;
&lt;li&gt;イナズマTMキャラバン&lt;/li&gt;
&lt;li&gt;プロトコル?オメガ&lt;/li&gt;
&lt;li&gt;天馬の化身&lt;/li&gt;
&lt;li&gt;時空の支配者&lt;/li&gt;
&lt;li&gt;危機&lt;/li&gt;
&lt;li&gt;未来から来た少年&lt;/li&gt;
&lt;li&gt;パラレルワールド&lt;/li&gt;
&lt;li&gt;未来からの刺客&lt;/li&gt;
&lt;li&gt;大敵の弾圧&lt;/li&gt;
&lt;li&gt;タクティクスAX3&lt;/li&gt;
&lt;li&gt;邪悪なる明晰&lt;/li&gt;
&lt;li&gt;尾張の国&lt;/li&gt;
&lt;li&gt;合戦!闘志天生&lt;/li&gt;
&lt;li&gt;クロノ?ストーン ?伝説のサッカー選手たち?&lt;/li&gt;
&lt;li&gt;デッドフューチャートーナメント&lt;/li&gt;
&lt;li&gt;幻惑の静笑&lt;/li&gt;
&lt;li&gt;信じあえる仲間&lt;/li&gt;
&lt;li&gt;少女の重責&lt;/li&gt;
&lt;li&gt;エルドラド&lt;/li&gt;
&lt;li&gt;正義と勇気の真価&lt;/li&gt;
&lt;li&gt;城壁の戦い&lt;/li&gt;
&lt;li&gt;テンマーズの攻撃&lt;/li&gt;
&lt;li&gt;プロトコル?オメガ2.0&lt;/li&gt;
&lt;li&gt;最後のサッカー&lt;/li&gt;
&lt;li&gt;ジャンヌダルク&lt;/li&gt;
&lt;li&gt;鼓舞の光&lt;/li&gt;
&lt;li&gt;化身アームド!&lt;/li&gt;
&lt;li&gt;決死の作戦&lt;/li&gt;
&lt;li&gt;悪の巨大化身&lt;/li&gt;
&lt;li&gt;進軍&lt;/li&gt;
&lt;li&gt;テンマーズ結成!&lt;/li&gt;
&lt;li&gt;記憶の彼方&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpt95gfl2
(baidu)http://pan.baidu.com/s/1bn1sAUN
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6k
(360云盘)http://yunpan.cn/Q7LEvV4hZ8LN6 （提取码：9b9b）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;flac下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd2rb0pnk5
(baidu)http://pan.baidu.com/s/1o6I7he6
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6E
(360云盘)http://yunpan.cn/Q7rjWNdBvJnJw （提取码：1dba）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;GO3 OST（无TV长度op ed）&lt;/h2&gt;
&lt;p&gt;登録情報
CD (2014/2/26)
ディスク枚数: 1
レーベル: エイベックス?エンタテインメント
収録時間: 56 分
ASIN: B00H6ZCUYG
EAN： 4988064550524&lt;/p&gt;
&lt;p&gt;イナズマイレブンGO ギャラクシー の激闘の歴史がよみがえるサウンドトラックが発売! ★ポイン&lt;/p&gt;
&lt;p&gt;ト★ 1シリーズ最新作のサウンドトラックが登場!
テレビ東京系アニメ『イナズマイレブンGO ギャラクシー』のオリジナル?サウンドトラック。ア&lt;/p&gt;
&lt;p&gt;ニメの激闘の歴史がよみがえる1枚。&lt;/p&gt;
&lt;p&gt;Tracklist&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;イナズマジャパン代表選手!&lt;/li&gt;
&lt;li&gt;キャプテン松風天馬&lt;/li&gt;
&lt;li&gt;謎の男ポトムリ&lt;/li&gt;
&lt;li&gt;希望のゴールへ向かって!&lt;/li&gt;
&lt;li&gt;反転攻勢&lt;/li&gt;
&lt;li&gt;心の憂色&lt;/li&gt;
&lt;li&gt;消せない傷&lt;/li&gt;
&lt;li&gt;ふざけ合うチームメイト&lt;/li&gt;
&lt;li&gt;善と悪の抗争&lt;/li&gt;
&lt;li&gt;不測の事態&lt;/li&gt;
&lt;li&gt;侵略者&lt;/li&gt;
&lt;li&gt;逆風下の旋律&lt;/li&gt;
&lt;li&gt;決意と葛藤&lt;/li&gt;
&lt;li&gt;ギャラクシーノーツ号宇宙へ&lt;/li&gt;
&lt;li&gt;オズロックの陰謀&lt;/li&gt;
&lt;li&gt;少女カトラ&lt;/li&gt;
&lt;li&gt;ダークサイド&lt;/li&gt;
&lt;li&gt;限界を超えて&lt;/li&gt;
&lt;li&gt;気づかない想い&lt;/li&gt;
&lt;li&gt;天馬とチームの絆&lt;/li&gt;
&lt;li&gt;不思議な生物 ピクシー&lt;/li&gt;
&lt;li&gt;謎めいた生物&lt;/li&gt;
&lt;li&gt;小さな希望&lt;/li&gt;
&lt;li&gt;精霊へんげ&lt;/li&gt;
&lt;li&gt;焦燥&lt;/li&gt;
&lt;li&gt;ファラム?オービアス&lt;/li&gt;
&lt;li&gt;闘いの旋律&lt;/li&gt;
&lt;li&gt;勝利は我らに&lt;/li&gt;
&lt;li&gt;本当の心意&lt;/li&gt;
&lt;li&gt;全ての結末へ&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbefg4y5oyk
(baidu)http://pan.baidu.com/s/1rRkp4
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6X
(360云盘)http://yunpan.cn/Q7rjt2nbBhaZU （提取码：be14）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;flac下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasx8vou36
(baidu)http://pan.baidu.com/s/1hqzM21m
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6D
(360云盘)http://yunpan.cn/Q7rjnJYQHNhUG （提取码：9ca8）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;角色歌&lt;/h1&gt;
&lt;h2&gt;GO1&lt;/h2&gt;
&lt;h3&gt;イナズマイレブンGO キャラクターソング オリジナルアルバム&lt;/h3&gt;
&lt;p&gt;◆高視聴率を更新中!!爆裂超人気アニメ「イナズマイレブンGO」!!　Wii用ソフト、ニンテンドー&lt;/p&gt;
&lt;p&gt;３DSソフトも続々発売、映畫も公開となり、ますます注目を集める「イナズマイレブン」シリー&lt;/p&gt;
&lt;p&gt;ズ!!
２０１１年４月に発売された前作「イナズマイレブン　キャラクターソング　オリジナルアルバ&lt;/p&gt;
&lt;p&gt;ム」は３万枚を超える大ヒット！今作も「イナズマイレブン」の中でも特に人気の高いキャラク&lt;/p&gt;
&lt;p&gt;ター?聲優陣が結集！！
【「イナズマイレブンGO」アニメ情報】 毎週水曜日１９：００~熱血放送中!! テレビ東京系６局&lt;/p&gt;
&lt;p&gt;ネット（テレビ東京、テレビ北海道、テレビ愛知、テレビ大阪、テレビせとうち、TVQ九州放送&lt;/p&gt;
&lt;p&gt;&amp;lt;曲目&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;雷門中学校 校歌&lt;/li&gt;
&lt;li&gt;そよかぜドリーム&lt;/li&gt;
&lt;li&gt;放課後ケミストリー&lt;/li&gt;
&lt;li&gt;だから絶対大丈夫&lt;/li&gt;
&lt;li&gt;同じ夢を見てる&lt;/li&gt;
&lt;li&gt;みんなのために&lt;/li&gt;
&lt;li&gt;レジスタンス&lt;/li&gt;
&lt;li&gt;明日のフィールド&lt;/li&gt;
&lt;li&gt;本物の強さ&lt;/li&gt;
&lt;li&gt;あの樹の下に集まろう!&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbefa1t9b3x
(baidu)http://pan.baidu.com/s/1jGh13X8
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo63
(360云盘)http://yunpan.cn/Q7LE8B4NNvgE3 （提取码：4707）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;无损下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpknskt0h
(baidu)http://pan.baidu.com/s/1kT3Kkej
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-b
(360云盘)http://yunpan.cn/Q7LEEbRCfXVzJ （提取码：24f4）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;『イナズマオールスターズ×TPK』キャラクターソングアルバム「マジで感謝!」&lt;/h3&gt;
&lt;p&gt;※※※※※※初回生产限定※※※※※※
特典
■ラジオ电视剧収录「イナズマイレブン」系列の人気角色総势15名によるオリジナルalbum!
松风天马(cv.寺崎裕香)、神童拓人(cv.斎贺みつき)、鬼道有人(cv.吉野裕行)、
剣城京介(cv.大原崇)、円堂守(cv.竹内顺子)、豪炎寺修也(cv.野岛裕史)、吹雪士郎(cv.宫野真守&lt;/p&gt;
&lt;p&gt;)、
染冈竜吾(cv.加瀬康之)、西园信介(cv.戸松遥)、狩屋マサキ(cv.泰勇気)、雾野兰丸(cv.小林ゆう&lt;/p&gt;
&lt;p&gt;)、
フェイルーン(cv.木村亜希子)、瀬戸水鸟(cv.美名)、山菜茜(cv.ゆりん)、空野葵(cv.北原沙弥香&lt;/p&gt;
&lt;p&gt;)、(顺不同です)など
「イナズマイレブン」系列の人気角色総势15名によるオリジナルalbum!&lt;/p&gt;
&lt;p&gt;初回盘のみ特典トラックとして7月7日にニコファーレで开催された「天の川までとどけ! イナズ&lt;/p&gt;
&lt;p&gt;マイレブンGO七夕フェスティバル」
で行われた「イナズマイレブンGO2クロノストーン/アナザーストーリー」生アフレコを初回限定&lt;/p&gt;
&lt;p&gt;特典として収录!&lt;/p&gt;
&lt;p&gt;【脚本:日野晃博 出演:寺崎裕香(松风天马), 木村亜希子(フェイルーン),
大原崇(剣城京介), 斎贺みつき(神童拓人), 小林ゆう(雾野兰丸), 佐藤健辅(矢嶋阳介三国太一)&lt;/p&gt;
&lt;p&gt;】&lt;/p&gt;
&lt;p&gt;====================List====================&lt;/p&gt;
&lt;p&gt;01 蒼き魂
松風天馬（CV:寺崎裕香）＆神童拓人（CV:斎賀みつき）&lt;/p&gt;
&lt;p&gt;02 さよなら過去の俺
剣城京介（CV: 大原崇）＆狩屋マサキ（CV: 泰勇気）&lt;/p&gt;
&lt;p&gt;03 明日のヒーロー
豪炎寺修也（CV: 野島裕史）＆神童拓人（CV:斎賀みつき）&lt;/p&gt;
&lt;p&gt;04 涙のArt　～虹色の花～
霧野蘭丸（CV: 小林ゆう）＆フェイルーン（CV；木村亜希子）&lt;/p&gt;
&lt;p&gt;05 恋のシュークリーム
空野葵（ＣＶ:北原沙弥香)＆瀬戸水鳥（CV：美名）＆山菜茜（CV：ゆりん）&lt;/p&gt;
&lt;p&gt;06 とどけっ！友情のエール
西園信助（CV：戸松遥）＆狩屋マサキ（CV: 泰勇気）&lt;/p&gt;
&lt;p&gt;07 炎のプライド
豪炎寺修也（CV: 野島裕史）＆染岡竜吾（CV:加瀬康之）＆吹雪士郎（CV: 宮野真守）&lt;/p&gt;
&lt;p&gt;08 好きだからっ！
円堂守（CV: 竹内順子）＆鬼道有人（CV：吉野裕行）&lt;/p&gt;
&lt;p&gt;09 手をつなごう
松風天馬（ＣＶ:寺崎裕香）＆剣城京介（ＣＶ:大原崇）＆空野葵(ＣＶ:北原沙弥香)&lt;/p&gt;
&lt;p&gt;10 眩しい未来Yeah!!!
円堂守（CV: 竹内順子）＆松風天馬（ＣＶ:寺崎裕香）&lt;/p&gt;
&lt;p&gt;11 マジで感謝！from イナズマオールスターズ
円堂守（CV: 竹内順子）＆染岡竜吾（CV:加瀬康之）＆松風天馬（ＣＶ:寺崎裕香）＆剣城京介（ＣＶ:大原崇）＆神童拓人（CV:斎賀みつき）&lt;/p&gt;
&lt;p&gt;（ボーナストラック）＊初回生産限定盤のみ
12 オリジナルストーリー「イナズマイレブンGO クロノストーン特別編 七夕の逆襲」
脚本：日野晃博　出演：寺崎裕香（松風天馬）　木村亜希子（フェイルーン）　大原崇（剣城京&lt;/p&gt;
&lt;p&gt;介）　斎賀みつき（神童拓人）小林ゆう（霧野蘭丸）　佐藤健輔（矢嶋陽介三国太一サスケ）谷山紀章（アルファ）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K?下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasx8fcrc1
(baidu)http://pan.baidu.com/s/1jGih5hc
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-H
(360云盘)http://yunpan.cn/Q7PuNaeabABLm （提取码：b602）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;GO2 Chrono Stone&lt;/h2&gt;
&lt;h3&gt;イナズマイレブンGO クロノ?ストーン キャラクターソング オリジナルアルバム&lt;/h3&gt;
&lt;p&gt;(初回生産限定)
CD (2013/2/27)
ディスク枚数: 1
フォーマット： Limited Edition
レーベル: FRAME
収録時間: 47 分
ASIN: B00AI9HHX6
EAN： 4988064550265&lt;/p&gt;
&lt;p&gt;内容紹介
イナズマイレブンGOクロノ?ストーンの人気キャラが集合!
夢のコラボ実現! まさに超次元サッカー!&lt;/p&gt;
&lt;p&gt;テレビ東京系アニメ「イナズマイレブンGOクロノ?ストーン」、
12月1日公開の劇場版「イナズマイレブンGOvsダンボール戦機W」も絶好調!
アニメのFRAMEから飛び出したキャラクターたちが集合!&lt;/p&gt;
&lt;p&gt;どんなコラボが実現するのかっ?乞うご期待! だろ?&lt;/p&gt;
&lt;p&gt;メディア掲載レビューほか
テレビ東京系アニメ『イナズマイレブンGOクロノ?ストーン』から飛び出したキャラクターたちが&lt;/p&gt;
&lt;p&gt;集合したキャラクター?ソング?アルバム。“夢のコラボ”が実現した作品。&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;p&gt;01.君だから。
松風天馬（CV：寺崎裕香）&amp;amp;雨宮太陽（CV：江口 拓也）&lt;/p&gt;
&lt;p&gt;02.いつかの話
三国太一（CV : 佐藤健輔）＆狩屋マサキ（CV : 泰勇気）&lt;/p&gt;
&lt;p&gt;03.ヤサシイミライ
フェイ?ルーン (CV : 木村亜希子） &amp;amp; 菜花黄名子（CV : 悠木碧）&lt;/p&gt;
&lt;p&gt;04.DO OUR BEST!!
浜野海士（CV：金野潤）&amp;amp;倉間典人（CV : 高垣彩陽）&lt;/p&gt;
&lt;p&gt;05.青春おでん
空野葵（CV：北原沙弥香）＆瀬戸水鳥（CV：美名）＆
山菜茜(CV：ゆりん) ＆菜花黄名子（CV：悠木碧）&lt;/p&gt;
&lt;p&gt;06.B.E.L.I.E.V.
霧野蘭丸（CV : 小林ゆう）&lt;/p&gt;
&lt;p&gt;07.瞳の中にキミがいる
空野葵（CV：北原沙弥香 ）&lt;/p&gt;
&lt;p&gt;08.ココロJUMP!!
西園信助（CV : 戸松遥）＆影山輝 （CV : 藤村歩）&lt;/p&gt;
&lt;p&gt;09.勇気のハーモニー
神童 拓人（CV : 斎賀 みつき）&lt;/p&gt;
&lt;p&gt;10.僕たちの城
松風天馬（CV：寺崎裕香）＆剣城京介（CV：大原崇）＆
神童拓人(CV：斎賀みつき)＆西園信助（CV：戸松遙）＆
霧野蘭丸（CV：小林ゆう）&lt;/p&gt;
&lt;p&gt;11.手をつなごう -KMC MIX- (ボーナストラック)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpknppymq
(baidu)http://pan.baidu.com/s/1c0pfqPM
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-c
(360云盘)http://yunpan.cn/Q7rjnpLDtgXvX （提取码：695b）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;无损下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4y87imxb
(baidu)http://pan.baidu.com/s/1i3yy71z
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-7
(360云盘)http://yunpan.cn/Q7rjXinXdzHfb （提取码：f69f）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;イナズマオールスターズ×TPKキャラクターソングアルバム「感動共有!」&lt;/h3&gt;
&lt;p&gt;CD (2013/8/14)
ディスク枚数: 1
レーベル: FRAME
収録時間: 45 分
ASIN: B00D8SJ4QW
EAN： 4988064550425&lt;/p&gt;
&lt;p&gt;内容紹介
歴代のイナイレブンシリーズからオールスターが集合! T-Pistonz+KMCの楽曲にのせて歌います!&lt;/p&gt;
&lt;p&gt;あなたは「感動共有! 」に号泣必死です! 歴代のイナイレブンシリーズからオールスターが集合!&lt;/p&gt;
&lt;p&gt;TPKの楽曲にのせて歌います! あなたは「感動共有! 」に号泣必死です! 昨年11月に発売された前&lt;/p&gt;
&lt;p&gt;作を受けてのイナズマイレブンシリーズの全タイトルの人気キャラクターがTPK楽曲に乗せて歌う&lt;/p&gt;
&lt;p&gt;第2弾! イナズマイレブン全シリーズのオールスターが一枚のアルバムに登場するのはこのアルバ&lt;/p&gt;
&lt;p&gt;ムだけ! 大胆なコラボレーションが今回も実現するのかっ?! 期待度超次元! ★ポイント★ 1すべて&lt;/p&gt;
&lt;p&gt;のイナズマイレブンシリーズからキャラクターを選抜。 2すべての楽曲をT-Pistonz+KMCが手がけ&lt;/p&gt;
&lt;p&gt;ます。 3昨年11月発売の前作は、1万枚以上出荷している人気タイトルです。Disc-1 収録曲未定&lt;/p&gt;
&lt;p&gt;※「感動共有! 」イナズマイレブンGO クロノ?ストーン』のアナザーオープニングテーマとして2&lt;/p&gt;
&lt;p&gt;話目から18話目まで隔週でオンエアされた楽曲 →こちらをキャラクターソングとしてカバーする&lt;/p&gt;
&lt;p&gt;ことが決定しております。&lt;/p&gt;
&lt;p&gt;メディア掲載レビューほか
TVアニメ『イナズマイレブン』シリーズから歴代の人気キャラクターがT-Pistonz+KMC楽曲に乗せ&lt;/p&gt;
&lt;p&gt;て歌う第2弾アルバム。『イナズマイレブンGO クロノ?ストーン』のアナザー?オープニング?テー&lt;/p&gt;
&lt;p&gt;マ「感動共有!」のキャラクター?ソング?カヴァー他を収録。 (C)RS&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;恋のストラップ
　瀬戸水鳥(CV.美名)&amp;amp;山菜茜(CV.ゆりん)&lt;/li&gt;
&lt;li&gt;いい風が吹いてキター!
　松風天馬(CV.寺崎裕香)&amp;amp; フェイ·ルーン(CV.木村亜希子)&lt;/li&gt;
&lt;li&gt;Don&apos;t Stop!!!!
　井吹宗正(CV.鈴木達央)&lt;/li&gt;
&lt;li&gt;明日も晴れたら
　空野葵(CV.北原沙弥香)&amp;amp;野咲さくら(CV.遠藤綾)&lt;/li&gt;
&lt;li&gt;グレート魂
　錦龍馬(CV.岩崎了)&amp;amp;ザナーク?アバロニク(CV.小西克幸)&lt;/li&gt;
&lt;li&gt;友情の化身
　雨宮太陽(CV.江口拓也)&lt;/li&gt;
&lt;li&gt;ささやかな祈り
　空野葵(CV.北原沙弥香)&lt;/li&gt;
&lt;li&gt;となりにいるよっ
　西園信助(CV.戸松遥)&amp;amp;三国太一(CV.佐藤健輔)&lt;/li&gt;
&lt;li&gt;君が居れば
　瞬木隼人(CV.石川界人)&amp;amp;鉄角真(CV.泰勇気)&lt;/li&gt;
&lt;li&gt;三日月スマイル
　円堂守(CV.竹内順子)&amp;amp;剣城京介(CV.大原崇)&amp;amp;神童拓人(CV:斎賀みつき)&amp;amp;霧野蘭丸(CV.小林ゆう)&lt;/li&gt;
&lt;li&gt;感動共有!fromイナズマオールスターズ
　 松風天馬(CV:寺崎裕香)&amp;amp;神童拓人(CV.斎賀みつき)&amp;amp;井吹宗正(CV.鈴木達央)&amp;amp;鉄角真(CV.泰勇気)
コーラス：空野葵(CV.北原沙弥香)&amp;amp;瀬戸水鳥(CV.美名)&amp;amp;山菜茜(CV.ゆりん)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasx8s76rm
(baidu)http://pan.baidu.com/s/1qW18a1A
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6M
(360云盘)http://yunpan.cn/Q7rjbjL9qaqHk （提取码：89af）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;无损下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd28jlr23x
(baidu)http://pan.baidu.com/s/1bntlbYn
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6b
(360云盘)http://yunpan.cn/Q7rjbauhEWIXE （提取码：4406）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;イナズマイレブンシリーズ 5周年记念「本当にありがとう」&lt;/h3&gt;
&lt;p&gt;[CD] イナズマイレブンシリーズ 5周年记念「本当にありがとう」
イナズマオールスターズ
商品番号 AVCD-55064
JAN 4988064550647
メディア CD
组枚数 2
価格 4095円(税込)
発売日 2014/02/19
アーティスト/ キャスト
イナズマオールスターズ
商品说明
イナズマイレブンシリーズ5周年特别企画「ベストイレブン国民投票」で発表される、ベストイレ&lt;/p&gt;
&lt;p&gt;ブンのメンバーを中心に参加する「梦のキャラソンアルバム」が発売! 过去シリーズの人気キャ&lt;/p&gt;
&lt;p&gt;ラソンを集めたディスク+新たに制作するキャラソンの2枚组CD。アナザージャケット仕様。
収录曲
【DISC-1】　メモリアルディスク&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;守ってみせる!
歌 : 円堂守 ( CV.竹内顺子 )&lt;/li&gt;
&lt;li&gt;そよかぜドリーム
歌 : 松风天马 ( CV.寺崎裕香 )&lt;/li&gt;
&lt;li&gt;レジスタンス
歌 : 鬼道有人 ( CV.吉野裕行 )&lt;/li&gt;
&lt;li&gt;炎の理由
歌 : 豪炎寺修也 ( CV.野岛裕史 )&lt;/li&gt;
&lt;li&gt;グレート魂
歌 : 锦龙马 ( CV.岩崎了 ) &amp;amp; ザナーク·アバロニク ( CV.小西克幸 )&lt;/li&gt;
&lt;li&gt;炎のプライド
歌 : 豪炎寺修也 ( CV.野岛裕史 ) &amp;amp; 染冈竜吾 ( CV.加瀬康之 ) &amp;amp; 吹雪士郎 ( CV.宫野真守 )&lt;/li&gt;
&lt;li&gt;友情の化身
歌 : 雨宫太阳 ( CV.江口拓也 )&lt;/li&gt;
&lt;li&gt;ヤサシイミライ
歌 : フェイ·ルーン ( CV.木村亜希子 ) &amp;amp; 菜花黄名子 ( CV.悠木碧 )&lt;/li&gt;
&lt;li&gt;アイスロード
歌 : 吹雪士郎 ( CV.宫野真守 )&lt;/li&gt;
&lt;li&gt;マジで感谢! from イナズマオールスターズ
歌 : 円堂守 ( CV.竹内顺子 ) &amp;amp; 染冈竜吾 ( CV.加瀬康之 )
&amp;amp; 松风天马 ( CV.寺崎裕香 ) &amp;amp; 剣城京介 ( CV.大原崇 ) &amp;amp; 神童拓人 ( CV.斎贺みつき )
【DISC-2】　アニバーサリーディスク&lt;/li&gt;
&lt;li&gt;またね···のキセツ
歌 : 円堂守 ( CV.竹内顺子 ) &amp;amp; 豪炎寺修也 ( CV.野岛裕史 ) &amp;amp; 鬼道有人 ( CV.吉野裕行 )
&amp;amp; 风丸一郎太 ( CV.西墙由香 ) &amp;amp; 吹雪士郎 ( CV.宫野真守 ) &amp;amp; 松风天马 ( CV.寺崎裕香 )
&amp;amp; 神童拓人 ( CV.斎贺みつき ) &amp;amp; 狩屋マサキ ( CV.泰勇気 ) &amp;amp; 真名部阵一郎 ( CV.野岛裕史 )&lt;/li&gt;
&lt;li&gt;CHAMPIONSHIP
歌 : 雾野兰丸 ( CV.小林ゆう )&lt;/li&gt;
&lt;li&gt;选ばれし者たち
歌 : 瞬木隼人 ( CV.石川界人 ) &amp;amp; 九坂隆二 ( CV.冈林史泰 ) &amp;amp; 皆帆和人 ( CV.代永翼 )
&amp;amp; 真名部阵一郎 ( CV.野岛裕史 ) &amp;amp; 鉄角真 ( CV.泰勇気 )&lt;/li&gt;
&lt;li&gt;COOL HEAT
歌 : 神童拓人 ( CV.斎贺みつき ) &amp;amp; 井吹宗正 ( CV.铃木达央 )&lt;/li&gt;
&lt;li&gt;流星ボーイ
歌 : 木野秋 ( CV.折笠富美子 ) &amp;amp; 音无春奈 ( CV.佐々木日菜子 ) &amp;amp; 雷门夏未 ( CV.小林沙苗 )&lt;/li&gt;
&lt;li&gt;FIELD OF LOVE
歌 : 空野葵 ( CV.北原沙弥香 )&lt;/li&gt;
&lt;li&gt;手をつなごう
歌 : 神童拓人 ( CV.斎贺みつき ) &amp;amp; 雾野兰丸 ( CV.小林ゆう ) &amp;amp; 瀬戸水鸟 ( CV.美名 )&lt;/li&gt;
&lt;li&gt;雷门中学校　校歌
歌 : 円堂守 ( CV.竹内顺子 ) &amp;amp; 壁山塀吾郎 ( CV.田野めぐみ ) &amp;amp; 松风天马 ( CV.寺崎裕香 )
&amp;amp; 剣城京介 ( CV.大原崇 ) &amp;amp; 西园信助 ( CV.戸松遥 ) &amp;amp; 狩屋マサキ ( CV.泰勇気 )
&amp;amp; 影山辉 ( CV.藤村歩 ) &amp;amp; 空野葵 ( CV.北原沙弥香 ) &amp;amp; 木野秋 ( CV.折笠富美子 )
&amp;amp; 音无春奈 ( CV.佐々木日菜子 ) &amp;amp; 雷门夏未 ( CV.小林沙苗 )&lt;/li&gt;
&lt;li&gt;仆たちの城
歌 : 松风天马 ( CV.寺崎裕香 ) &amp;amp; 剣城京介 ( CV.大原崇 ) &amp;amp; 神童拓人 ( CV.斎贺みつき )
&amp;amp; 西园信助 ( CV.戸松遥 ) &amp;amp; 雾野兰丸 ( CV.小林ゆう ) &amp;amp; 空野葵 ( CV.北原沙弥香 )
&amp;amp; 瀬戸水鸟 ( CV.美名 ) &amp;amp; 山菜茜 ( CV.ゆりん )&lt;/li&gt;
&lt;li&gt;本当にありがとう!
歌 : 円堂守 ( CV.竹内顺子 ) &amp;amp; 松风天马 ( CV.寺崎裕香 )&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbpknxjhlv
(baidu)http://pan.baidu.com/s/1kT1InMB
(微盘)http://vdisk.weibo.com/s/APlR9kfmRo6a
(360云盘)http://yunpan.cn/Q7HJrGH8niZi4  提取码 24c3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;无损下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbasx8dywi1
(baidu)http://pan.baidu.com/s/1hqGb4Sc
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-e
(360云盘)http://yunpan.cn/Q7HJxmaA6sTZM  提取码 11fc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;其他专辑&lt;/h1&gt;
&lt;h2&gt;北原沙弥香 - 春のグラデーション（动画ED与游戏ED的完整曲整合）（无无损）&lt;/h2&gt;
&lt;p&gt;CD (2013/3/6)
ディスク枚数: 1
レーベル: FRAME
収录时间: 45 分
ASIN: B00AU5R7X8
EAN： 4988064550296&lt;/p&gt;
&lt;p&gt;内容绍介：
テレビ东京系アニメ『イナズマイレブンGO』シリーズで人気のヒロイン役「空野葵」(北原沙弥香&lt;/p&gt;
&lt;p&gt;)のファースト·アルバム。『イナズマイレブンGO』シリーズのエンディング曲に加え、ゲーム版&lt;/p&gt;
&lt;p&gt;エンディング曲も収录したベスト·アルバム的な内容。&lt;/p&gt;
&lt;p&gt;収录曲：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HAJIKE-YO!!&lt;/li&gt;
&lt;li&gt;ガムシャラ&lt;/li&gt;
&lt;li&gt;春のグラデーション&lt;/li&gt;
&lt;li&gt;かなり纯情&lt;/li&gt;
&lt;li&gt;梦のかたまり&lt;/li&gt;
&lt;li&gt;夏が终わっちゃう&lt;/li&gt;
&lt;li&gt;窓侧から爱をこめて&lt;/li&gt;
&lt;li&gt;昨日の恋はどこ吹く风&lt;/li&gt;
&lt;li&gt;やっぱ青春&lt;/li&gt;
&lt;li&gt;爱情·情热·热风&lt;/li&gt;
&lt;li&gt;夏がやってくる&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbd28jzrh8g
(baidu)http://pan.baidu.com/s/1pJv40zh
(微盘)http://vdisk.weibo.com/s/APlR9kfmRq-P
(360云盘)http://yunpan.cn/Q7HJuJQd38csX  提取码 7b96&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/span&gt;</content:encoded></item><item><title>闪电十一人（动画）全op&amp;ed音乐专辑整理</title><link>https://blog.xingoxu.com/2015/12/inazuma-eleven-anime-op-ed-collection/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/inazuma-eleven-anime-op-ed-collection/</guid><description>建议使用Ctrl+F迅速找到所在专辑
有BK的尽量附上BK
该单曲要是有单曲专辑会在当前歌曲优先附上单曲专辑（一般来数单曲专辑是完整版歌曲，如果要寻TV版长度一般在原声集中）
如无注明所有音乐最低品质320K，如果有无损会尽量附上
所有歌曲的专辑皆以动画发布的歌曲专辑优先，歌手自己的专辑将不包括在这次整理中
提示输入密码的话，所有密码均为：xingo
如果无法下载，又或者是因为疏忽编辑错误，又或者是发现了某资源的无损版本，请立刻在微博上[@xingo](http://weibo.com/pokemonxu/) 
专辑来源来自互联网，非常感谢各位署名的不署名的分享！如果在这里找到自己的资源需要注明的话请与我联系我会立刻加上！
</description><pubDate>Sat, 26 Dec 2015 15:11:11 GMT</pubDate><content:encoded>&lt;p&gt;建议使用Ctrl+F迅速找到所在专辑
有BK的尽量附上BK
该单曲要是有单曲专辑会在当前歌曲优先附上单曲专辑（一般来数单曲专辑是完整版歌曲，如果要寻TV版长度一般在原声集中）
如无注明所有音乐最低品质320K，如果有无损会尽量附上
所有歌曲的专辑皆以动画发布的歌曲专辑优先，歌手自己的专辑将不包括在这次整理中
提示输入密码的话，所有密码均为：xingo
如果无法下载，又或者是因为疏忽编辑错误，又或者是发现了某资源的无损版本，请立刻在微博上&lt;a href=&quot;http://weibo.com/pokemonxu/&quot;&gt;@xingo&lt;/a&gt;
专辑来源来自互联网，非常感谢各位署名的不署名的分享！如果在这里找到自己的资源需要注明的话请与我联系我会立刻加上！&lt;/p&gt;

&lt;h1&gt;主题曲类&lt;/h1&gt;
&lt;h2&gt;op类&lt;/h2&gt;
&lt;h3&gt;立ち上がリーヨ（1话 - 26话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;T-Pistonz - 立ちあがリーヨ&lt;/p&gt;
&lt;p&gt;商品番号: PKCF-1001
メディア: マキシシングルCD
組枚数: 1
発売日: 2008/11/26
価格: 1050円(税込)&lt;/p&gt;
&lt;p&gt;内容
博多出身のロックバンド「豚骨ピストンズ」のメンバーを中心に「ラッキィ池田」などダンサーを含め結成された8人組パフォーマンスユニット &quot;T-Pistonz&quot; が歌う、TVアニメ「イナズマイレブン」のオープニングテーマ!&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;立ち上がリーヨ&lt;/li&gt;
&lt;li&gt;そばにおリーヨ&lt;/li&gt;
&lt;li&gt;立ち上がリーヨ (Instrumental)&lt;/li&gt;
&lt;li&gt;そばにおリーヨ (Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115) http://115.com/lb/5lbbsb2ctdph
(baidu) http://pan.baidu.com/s/1kTkhosn
(微盘) http://vdisk.weibo.com/s/APlR9kfn2m-9
(360云盘) http://yunpan.cn/Q7sjkNRFQzXRp 提取码 3486&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;マジで感谢!（27话 - 54话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;T-Pistonz &amp;amp; KMC - マジで感谢!
商品番號: PKCF-1010
メディア: マキシシングルCD
組枚數: 1
發賣日: 2009/06/10
價格: 1050圓(稅迂)&lt;/p&gt;
&lt;p&gt;內容:
大人気TVアニメ「イナズマイレブン」の新オープニングテーマ!! 前作に引き続きT-Pistonzが担当、今作では福岡在住の人気ラッパー?KMCとのコラボ!
KMCのクールなRAPと、トンニーノの熱いヴォーカルの異種格闘技が生み出した、新たな友情?愛情ソング。&lt;/p&gt;
&lt;p&gt;收錄曲:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;マジで感謝!&lt;/li&gt;
&lt;li&gt;マジで感謝!～みんなでシャララversion～&lt;/li&gt;
&lt;li&gt;マジで感謝!～KMC REMIX～&lt;/li&gt;
&lt;li&gt;マジで感謝!(Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbsb2mkanr
(baidu)http://pan.baidu.com/s/1jGn7aOe
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m-4
(360云盘)http://yunpan.cn/Q7sjX9V8syRTx 提取码 7715&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;つながリーヨ（55话 - 67话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;つながリーヨ/スゲーッマジで感謝!~スーパーファイア~
CD (2009/11/4)
ディスク枚数: 2
フォーマット： Single, CD+DVD, Limited Edition, Maxi
レーベル: FRAME
収録時間: 18 分
ASIN: B002M5P62S&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;つながリーヨ&lt;/li&gt;
&lt;li&gt;スゲーッマジで感謝!~スーパーファイア~&lt;/li&gt;
&lt;li&gt;つながリーヨ (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;スゲーッマジで感謝!~スーパーファイア~ (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbaf2mcclt4
(baidu)http://pan.baidu.com/s/1eQ5qhME
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m-e
(360云盘)http://yunpan.cn/Q7sjaxCxjqJ4H 提取码 17f4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;勝って泣こうゼッ!（68话 - 87话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;登録情報&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CD (2010/3/10)&lt;/li&gt;
&lt;li&gt;ディスク枚数: 1&lt;/li&gt;
&lt;li&gt;フォーマット： Single, Maxi&lt;/li&gt;
&lt;li&gt;レーベル: FRAME&lt;/li&gt;
&lt;li&gt;収録時間: 20 分&lt;/li&gt;
&lt;li&gt;ASIN: B0031LSWBY&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;内容紹介
パフォーマンス?ユニットのT-PistonzとラッパーのKMCによるユニットのシングル。テレビ東京系アニメ『イナズマイレブン』の主題歌で、心に響くご機嫌なナンバーとなっている。&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;勝って泣こうゼッ!&lt;/li&gt;
&lt;li&gt;友達でいようなっ&lt;/li&gt;
&lt;li&gt;勝って泣こうゼッ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;友達でいようなっ (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;（192Kbps）&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmwz5by4g
(baidu)http://pan.baidu.com/s/1jG7POoQ
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m-5
(360云盘)http://yunpan.cn/Q7sj7FJZVntbF 提取码 888d&lt;/p&gt;
&lt;p&gt;此专辑自购无损：https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;GOODキター! （88话-107话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;CD (2010/7/14)
ディスク枚数: 2
フォーマット： Single, CD+DVD, Limited Edition, Maxi
レーベル: FRAME
収録時間: 17 分
ASIN: B003I8WYPA&lt;/p&gt;
&lt;p&gt;内容紹介&lt;/p&gt;
&lt;p&gt;テレビ東京系アニメ『イナズマイレブン』と、ニンテンドーDS用ゲーム『イナズマイレブン3 世界への挑戦!! ボンバー』のオープニング?テーマを収録したシングル。歌唱は同シリーズの顔としておなじみとなったパフォーマンス?ユニット、T-Pistonzと男性ラッパー、KMC(ケムシ)が担当します!!&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GOODキター!&lt;/li&gt;
&lt;li&gt;元気になリーヨ!&lt;/li&gt;
&lt;li&gt;GOODキター! (オリジナル?カラオケ)&lt;/li&gt;
&lt;li&gt;元気になリーヨ! (オリジナル?カラオケ)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;（192Kbps）&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbaf2mrn4gq
(baidu)http://pan.baidu.com/s/1sjnYKZr
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m_O
(360云盘)http://yunpan.cn/Q7sj7iTVbRvqi 提取码 2f58&lt;/p&gt;
&lt;p&gt;此专辑自购无损：https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;僕らのゴォール!（108话-127话）（所属专辑：单曲专辑）&lt;/h3&gt;
&lt;p&gt;T-Pistonz+KMC - 僕らのゴォール!
内容
大人気アニメ「イナズマイレブン」の11月よりオンエアされていたあのオープニングテーマが遂に発売! カップリングには、イナズマオールスターズが歌うエンディングテーマ「またね???のキセツ」のT-Pistonz+KMCによるセルフカヴァーを収録。&lt;/p&gt;
&lt;p&gt;收录曲目：&lt;/p&gt;
&lt;p&gt;1 僕らのゴォール!
2 またね…のキセツ
3 僕らのゴォール!（オリジナル?カラオケ）
4 またね…のキセツ（オリジナル?カラオケ）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbc4qg2agkf
(baidu)http://pan.baidu.com/s/1c02CwAc
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m-4
(360云盘)http://yunpan.cn/Q7swgSEEk3ZH7 提取码 d992
(微云)http://url.cn/UzJV5P&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;ed类&lt;/h2&gt;
&lt;h3&gt;青春おでん（1话 - 26话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;twe&apos;lv/青春おでん／純情青春ラブ [PKCF-1002]
商品番号: PKCF-1002
メディア: マキシシングルCD
発売日: 2008/10/29
価格: 1050円(税込)&lt;/p&gt;
&lt;p&gt;アーティスト/ キャスト
礼空トオル (作詞者)　青木隆 (作曲者)　
高橋論一 (編曲者)　光田康典 (作曲者)&lt;/p&gt;
&lt;p&gt;内容
大ヒットゲーム「イナズマイレブン」に登場する春菜、夏未、秋の3人のヒロインが、ゲームからリアルな世界に飛び出してアイドルユニット&quot;twe&apos;lv&quot;としてデビュー! テレビ東京系アニメ「イナズマイレブン」エンディングテーマとなるデビュー曲「青春おでん」は、「静岡おでんの会」応援ご当地ソングのカヴァー。カップリングにはカリスマゲームクリエーターであるレベルファイブ社長?日野晃博作詞、ゲーム音楽界の四天王と呼ばれる光田康典作曲による、ニンテンドーDSゲーム「イナズマイレブン」エンディングテーマ「純情青春ラブ」を収録。オリジナル?カラオケ付。&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;青春おでん&lt;/li&gt;
&lt;li&gt;純情青春ラブ&lt;/li&gt;
&lt;li&gt;青春おでん(Instrumental)&lt;/li&gt;
&lt;li&gt;純情青春ラブ(Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbafrk4dnnj
(baidu)http://pan.baidu.com/s/1pJLmMN5
(微盘)http://vdisk.weibo.com/s/APlR9kfn2mrG
(360云盘)http://yunpan.cn/Q7sjYHYA2Vn6T 提取码 19d8&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;青春バスガイド（27话 - 50话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;TVアニメ「イナズマイレブン」ED2 - 青春バスガイド／Berryz工房
商品番号: PKCP-5138
メディア: マキシシングルCD
組枚数: 2
発売日: 2009/06/03
価格: 1680円(税込)&lt;/p&gt;
&lt;p&gt;内容
Berryz工房の記念すべき20枚目のシングルは、大人気アニメ「イナズマイレブン」のエンディングテーマ!! DVD(内容未定)付き限定盤。イベント抽選シリアルナンバーカード封入。&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;青春バスガイド&lt;/li&gt;
&lt;li&gt;ライバル&lt;/li&gt;
&lt;li&gt;青春バスガイド(Instrumental)&lt;/li&gt;
&lt;li&gt;ライバル(Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcm6suhsmr
(baidu)http://pan.baidu.com/s/1kT61SJd
(微盘)http://vdisk.weibo.com/s/APlR9kfn2mkX
(360云盘)http://yunpan.cn/Q7sjqPNMh8uRi 提取码 b388&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;流星ボーイ（51话 - 67话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;Berryz工房 - 私の未来のだんな様 / 流星ボーイ[2009/11/11発売]
内容紹介
２００９年１０月２８日発表の２１ｓｔシングル。ゲーム?ソフト『イナズマイレブン２　脅威の侵略者　ファイア』およびテレビ東京系アニメ『イナズマイレブン』エンディング?テーマとなった「流星ボーイ」ほかを収録。熱くファンキーな歌声を披露している。&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;私の未来のだんな様&lt;/li&gt;
&lt;li&gt;流星ボーイ&lt;/li&gt;
&lt;li&gt;私の未来のだんな様 (Instrumental)&lt;/li&gt;
&lt;li&gt;流星ボーイ (Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbafrk0opnj
(baidu)http://pan.baidu.com/s/1eQvMFPg
(微盘)http://vdisk.weibo.com/s/APlR9kfn2n1o
(360云盘)http://yunpan.cn/Q7sjPVzZ3XJdN 提取码 6543&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;雄叫びボーイ WAO!（68话 - 87话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;Berryz工房 - 雄叫びボーイ WAO!
CD (2010/3/3)
ディスク枚数: 1
フォーマット： Single, CD+DVD, Limited Edition, Maxi
レーベル: ピッコロタウン
収录时间: 15 分
ASIN: B0031LSWC8&lt;/p&gt;
&lt;p&gt;ディスク：1&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;雄叫びボーイ WAO!&lt;/li&gt;
&lt;li&gt;友达は友达なんだ!&lt;/li&gt;
&lt;li&gt;雄叫びボーイ WAO! (Instrumental)&lt;/li&gt;
&lt;li&gt;友达は友达なんだ! (Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbsvicq5qv
(baidu)http://pan.baidu.com/s/1gdraV8B
(微盘)http://vdisk.weibo.com/s/APlR9kfn2mwI
(360云盘)http://yunpan.cn/Q7sjPEYg3LwDR 提取码 58a4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;本气ボンバー！！（88话 - 101话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;Berryz工房 - 本气ボンバー！！
価格：1,237円（税込、送料別）&lt;/p&gt;
&lt;p&gt;収録曲&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本気ボンバー!!&lt;/li&gt;
&lt;li&gt;MOON POWER&lt;/li&gt;
&lt;li&gt;本気ボンバー!! (Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbdyuctj69l
(baidu)http://pan.baidu.com/s/1o68xEfK
(微盘)http://vdisk.weibo.com/s/APlR9kfn2mQx
(360云盘)http://yunpan.cn/Q7sjSVyRJmjSq 提取码 5293&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;シャイニング パワー（102话 - 112话）（所属专辑：单曲专辑、TV音乐精选集）&lt;/h3&gt;
&lt;p&gt;Berryz工房 - シャイニング　パワー&lt;/p&gt;
&lt;p&gt;発売日：2010/11/10.品番/金額：CD＋DVD
【初回生産限定盤A】PKCP-5166～7/1,680円
CD＋DVD
【初回生産限定盤B】PKCP-5168～9/1,680円
CD
【初回生産限定盤C】PKCP-5170/1,050円
CD
【通常盤】PKCP-5171/1,050円
CD
【イナズマ盤】PKCP-5172/1,050円&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;シャイニング パワー&lt;/li&gt;
&lt;li&gt;ちょっとさみしいな&lt;/li&gt;
&lt;li&gt;シャイニング パワー(Instrumental)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbewxd9xfmv
(baidu)http://pan.baidu.com/s/1jGh1ycA
(微盘)http://vdisk.weibo.com/s/APlR9kfn2m_Y
(360云盘)http://yunpan.cn/Q7sjRAdcKfGqZ 提取码 4966&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;またね…のキセツ（113话 -127话）（所属专辑：单曲专辑、op6单曲专辑）&lt;/h3&gt;
&lt;p&gt;「イナズマイレブン」エンディングテーマ～「またね!」のキセツ/イナズマオールスターズ(円堂守(CV:竹内順子),豪炎寺修也(CV:野島裕史),鬼道有人(CV:吉野裕行),吹雪士郎(CV:宮野真守),風丸一郎太(CV:西墻由香)) [Single] [限定盤]&lt;/p&gt;
&lt;p&gt;アーティスト 竹内順子,野島裕史,吉野裕行,宮野真守,西墻由香
レーベル FRAME
JDC CD PKCF-1028
JAN CD 4942463622787
価格 ¥1600(税抜)
発売日 2011-02-16&lt;/p&gt;
&lt;p&gt;初回生産限定盤／CD+DVD／同時発売通常商品はPKCF-1030&lt;/p&gt;
&lt;p&gt;規格番号：PKCF-1028&lt;/p&gt;
&lt;p&gt;特典?初回仕様について&lt;/p&gt;
&lt;p&gt;「封入特典」以外の特典（ポスターなど）は、基本的にお付けしておりません。また、発売日以降のご注文では商品名に明記されている場合を除き「初回仕様」のご指定はできません。あらかじめご了承ください。&lt;/p&gt;
&lt;p&gt;CDの内容：
人気声優たちが集結し、｀イナズマオールスターズ｀を結成！人気アニメ『イナズマイレブン』エンディング?テーマ。　(C)RS&lt;/p&gt;
&lt;p&gt;曲名リスト：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;「またね！」のキセツ（イナズマオールスターズ）&lt;/li&gt;
&lt;li&gt;最高で最强&lt;/li&gt;
&lt;li&gt;「またね！」のキセツ（instrumental）&lt;/li&gt;
&lt;li&gt;最高で最强（instrumental）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbewxdx65lp
(baidu)http://pan.baidu.com/s/1mgE7ukC
(微盘)http://vdisk.weibo.com/s/APlR9kfn2mQl
(360云盘)http://yunpan.cn/Q7sjMKVUdPYmM 提取码 a22d&lt;/p&gt;
&lt;p&gt;此专辑自购无损：https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;TV音乐精选集&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;本作有两个精选集，第二个因为是游戏及TV版背景音乐等没有资源，所以只能找到1。。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;イナズマイレブン　ソングコレクション～超次元テーマソング集！1
登录情报&lt;/p&gt;
&lt;p&gt;CD (2011/3/23)
フォーマット： CD
レーベル: アップフロントワークス
収录时间: 46 分&lt;/p&gt;
&lt;p&gt;曲目リスト&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;立ち上がリーヨ／T-Pistonz&lt;/li&gt;
&lt;li&gt;青春おでん／twe&apos;lv&lt;/li&gt;
&lt;li&gt;マジで感谢！／T-Pistonz＋KMC&lt;/li&gt;
&lt;li&gt;青春バスガイド／Berryz工房&lt;/li&gt;
&lt;li&gt;つながリーヨ／T-Pistonz＋KMC&lt;/li&gt;
&lt;li&gt;流星ボーイ／Berryz工房&lt;/li&gt;
&lt;li&gt;胜って泣こうゼッ！／T-Pistonz＋KMC&lt;/li&gt;
&lt;li&gt;雄叫びボーイ WAO! ／Berryz工房&lt;/li&gt;
&lt;li&gt;GOODキター！／T-Pistonz＋KMC&lt;/li&gt;
&lt;li&gt;本気ボンバー！！／Berryz工房&lt;/li&gt;
&lt;li&gt;シャイニング パワー／Berryz工房&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmvxi844l
(baidu)http://pan.baidu.com/s/1eQu0LPo
(微盘)http://vdisk.weibo.com/s/APlR9kfn1VAE
(360云盘)http://yunpan.cn/Q7fxAZxwF8kn2 提取码 8075&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第二集的曲目列表在wiki上有就不附了：）&lt;/p&gt;
&lt;h1&gt;原声OST&lt;/h1&gt;
&lt;h3&gt;イナズマイレブン テレビアニメ 熱血サントラ! 第1巻&lt;/h3&gt;
&lt;p&gt;发售日:2009/09/23
CD碟数:1
发行公司:FRA
收录时间:01:04:53
JAN编号:4942463622626&lt;/p&gt;
&lt;p&gt;曲目信息：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;マジで感謝！&lt;/li&gt;
&lt;li&gt;立ち上がリーヨ&lt;/li&gt;
&lt;li&gt;青春バスガイド&lt;/li&gt;
&lt;li&gt;青春おでん&lt;/li&gt;
&lt;li&gt;雷門中学校（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;雷門中学校　～円堂と仲間たち～&lt;/li&gt;
&lt;li&gt;発動！バーニングフェーズ（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;逆境（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;伝説のイナズマイレブン&lt;/li&gt;
&lt;li&gt;揺れる帝国&lt;/li&gt;
&lt;li&gt;帝国学園のテーマ～帝国学園がやってきた！～（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;帝国学園のテーマ～帝国学園がやってきた！～　デスゾーン&lt;/li&gt;
&lt;li&gt;帝国学園との死闘（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;行け！雷門中&lt;/li&gt;
&lt;li&gt;公式戦（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;サッカーバトル（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;放課後の楽園（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;１１の想い&lt;/li&gt;
&lt;li&gt;謎（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;忍び寄る雷鳴&lt;/li&gt;
&lt;li&gt;黒き影～影山のテーマ～（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;円陣（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;やる気のない部員（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;驚異の必殺技&lt;/li&gt;
&lt;li&gt;バーニングフェーズ　スペシャル（ＬＥＶＥＬ５　ＶＩＳＩＯＮ　２００７　ＶＥＲＳＩＯＮ）&lt;/li&gt;
&lt;li&gt;はじまり（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;悲しい過去　ピアノバージョン&lt;/li&gt;
&lt;li&gt;風と青春（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;やろうぜ！サッカー&lt;/li&gt;
&lt;li&gt;１分間の奇蹟&lt;/li&gt;
&lt;li&gt;神々の聖戦（アニメＶｅｒ．）&lt;/li&gt;
&lt;li&gt;聖地（アニメＶｅｒ．）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmg88npfz
(baidu)http://pan.baidu.com/s/1hqy02Jq
(微盘)http://vdisk.weibo.com/s/APlR9kfn1VA2
(360云盘)http://yunpan.cn/Q7fxKKwj5DJsL 提取码 a449&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;イナズマイレブン テレビアニメ 熱血サントラ! 第2巻&lt;/h3&gt;
&lt;p&gt;発売日 2010/05/26
商品番号 PKCF-1022
JAN 4942463622725
メディア アルバム CD
組枚数 2&lt;/p&gt;
&lt;p&gt;少年たちに大人気のアニメ「イナズマイレブン」のサウンドトラック、第2弾! すっかりお馴染みの前OPテーマT-Pistonz「つながリーヨ」を始め、歴代テーマ曲、挿入歌など3曲、それに加えゲームでしか聴けなかった幻のED テーマ「あいつは太陽ボーイ! 」を初CD化。さらにアニメの名場面で使用された代表的な楽曲を20曲以上収録。オープニング映像、エンディング映像の他、ここでしか見られない貴重映像も満載のDVD付。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;つながリーヨ/T-Pistonz +KMC&lt;/li&gt;
&lt;li&gt;流星ボーイ/Berryz工房&lt;/li&gt;
&lt;li&gt;スゲーッマジで感謝！～スーパーファイア～/T-Pistonz +KMC&lt;/li&gt;
&lt;li&gt;イナズマキャラバン～最強の選手を探し求めて～&lt;/li&gt;
&lt;li&gt;太陽に向かって&lt;/li&gt;
&lt;li&gt;雷門中学校 ～夢と希望～&lt;/li&gt;
&lt;li&gt;夕暮れの鉄塔&lt;/li&gt;
&lt;li&gt;イナビカリファイター（アニメVer.）&lt;/li&gt;
&lt;li&gt;葬られた希望&lt;/li&gt;
&lt;li&gt;夏未お嬢様&lt;/li&gt;
&lt;li&gt;ナニワランド&lt;/li&gt;
&lt;li&gt;闘志&lt;/li&gt;
&lt;li&gt;走るイナズマ&lt;/li&gt;
&lt;li&gt;さらば豪炎寺修也&lt;/li&gt;
&lt;li&gt;ピッチの轟き&lt;/li&gt;
&lt;li&gt;悲しい過去（アニメVer.）&lt;/li&gt;
&lt;li&gt;もう一人のエースストライカー&lt;/li&gt;
&lt;li&gt;雷門の力&lt;/li&gt;
&lt;li&gt;決死の攻撃&lt;/li&gt;
&lt;li&gt;心の誓い&lt;/li&gt;
&lt;li&gt;新監督　吉良瞳子&lt;/li&gt;
&lt;li&gt;黒服の男&lt;/li&gt;
&lt;li&gt;国家機関SPフィクサーズ&lt;/li&gt;
&lt;li&gt;新人類　ザ?ジェネシス&lt;/li&gt;
&lt;li&gt;対決！&lt;/li&gt;
&lt;li&gt;黒いサッカーボール&lt;/li&gt;
&lt;li&gt;ギャルズのテーマ&lt;/li&gt;
&lt;li&gt;驚愕のエイリア学園&lt;/li&gt;
&lt;li&gt;死闘～ジェミニストームとの決戦～&lt;/li&gt;
&lt;li&gt;星の使徒&lt;/li&gt;
&lt;li&gt;あいつは太陽ボーイ！/宮原永海&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;无损资源枯竭&lt;/strong&gt;
[EAC] [100526] イナズマイレブン テレビアニメ 熱血サントラ! 第2巻 (ape＋cue CDのみ)[100623].rar 430M
http://tora.to/blog/420397.htm&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbafbm6zf2j
(baidu)http://pan.baidu.com/s/1sjwgqAT
(微盘)http://vdisk.weibo.com/s/APlR9kfn1VzQ
(360云盘)http://yunpan.cn/Q7fx6fXBySHDB 提取码 c2d2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;イナズマイレブン テレビアニメ 熱血サントラ! 第3巻&lt;/h3&gt;
&lt;p&gt;メディア ：　コンパクトディスク(12cm)
ジャンル ：　アニメーション,OVA等　
発売日 ：　2011/06/22　　
商品番号 ：　PKCF-1056
組数 ：　1
価格 ：　2300 円（税込）
WEB価格 ：　2300 円（税込）　
発売会社 ：　アップフロントワークス
レーベル ：　FRAME
販売会社 ：　キングレコード&lt;/p&gt;
&lt;p&gt;コメント?特典：
テレビ東京系アニメ『イナズマイレブン』のオリジナル?サントラ第3弾。T-Pistonz+KMCとBerryz工房のアッパーな歴代テーマ曲(TV尺)と、光田康典、亀岡夏海らが手がけた本格的なオーケストラ?サウンドの劇伴をたっぷり収録。闘志に火をつけてくれるようなとにかく勇壮に仕上げられた楽曲は秀逸。(キ)
初回仕様?特典物の記載のある商品につきまして
初回仕様商品や初回特典付の商品のみ必要なお客様は、必ずお申し込み時に「通信欄」に「初回のみ希望」などとご記入の上、お申込み下さい。（特にポスターなど外付特典のあります場合は、特典内容を具体的にご記入下さい。）
ただし、左の在庫状況表示が「お取り寄せ」「○-○日で発送」「発売日以降」表示になっています場合は、事前に入荷商品の仕様がわかりませんため、「初回仕様のみ」「特典付のみ」などのご指定がいただけません。通常商品でのお届けとなる場合がございます。&lt;/p&gt;
&lt;p&gt;内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;立ち上がリーヨ(アニメオープニングVer.)(T-Pistonz)&lt;/li&gt;
&lt;li&gt;青春おでん(アニメエンディングVer.)(twe’lv)&lt;/li&gt;
&lt;li&gt;マジで感謝!(アニメオープニングVer.)(T-Pistonz+KMC)&lt;/li&gt;
&lt;li&gt;青春バスガイド(アニメエンディングVer.)(Berryz工房)&lt;/li&gt;
&lt;li&gt;つながりーヨ(アニメオープニングVer.)(T-Pistonz+KMC)&lt;/li&gt;
&lt;li&gt;流星ボーイ(アニメエンディングVer.)(Berryz工房)&lt;/li&gt;
&lt;li&gt;勝って泣こうゼッ!(アニメオープニングVer.)(T-Pistonz+KMC)&lt;/li&gt;
&lt;li&gt;雄叫びボーイWAO!(アニメエンディングVer.)(Berryz工房)&lt;/li&gt;
&lt;li&gt;GOODキター!(アニメオープニングVer.)(T-Pistonz+KMC)&lt;/li&gt;
&lt;li&gt;本気(マジ)ボンバー!!(アニメエンディングVer.)(Berryz工房)&lt;/li&gt;
&lt;li&gt;シャイニング パワー(アニメエンディングVer.)(Berryz工房)&lt;/li&gt;
&lt;li&gt;僕らのゴォール!(アニメオープニングVer.)(T-Pistonz+KMC)&lt;/li&gt;
&lt;li&gt;またね…のキセツ(アニメエンディングVer.)(イナズマオールスターズ)&lt;/li&gt;
&lt;li&gt;フットボールフロンティア?インターナショナル&lt;/li&gt;
&lt;li&gt;それぞれのプライド&lt;/li&gt;
&lt;li&gt;11の想い(Arrange Version)&lt;/li&gt;
&lt;li&gt;砂の獅子&lt;/li&gt;
&lt;li&gt;必殺タクティクス&lt;/li&gt;
&lt;li&gt;雷門中の崩壊～衝撃の帰還～&lt;/li&gt;
&lt;li&gt;研ぎ澄まされし聖者たち&lt;/li&gt;
&lt;li&gt;燃え上がる爆炎&lt;/li&gt;
&lt;li&gt;苦悩&lt;/li&gt;
&lt;li&gt;さらば豪炎寺修也(Piano Version)&lt;/li&gt;
&lt;li&gt;イプシロンの襲撃&lt;/li&gt;
&lt;li&gt;フィールドの戦士&lt;/li&gt;
&lt;li&gt;陰謀&lt;/li&gt;
&lt;li&gt;カウンター&lt;/li&gt;
&lt;li&gt;不落の要塞&lt;/li&gt;
&lt;li&gt;究極奥義&lt;/li&gt;
&lt;li&gt;不協和の気配&lt;/li&gt;
&lt;li&gt;必殺技への挑戦&lt;/li&gt;
&lt;li&gt;反撃ののろし&lt;/li&gt;
&lt;li&gt;世界の強豪たち&lt;/li&gt;
&lt;li&gt;ロスタイムの強攻&lt;/li&gt;
&lt;li&gt;大陸の覇者&lt;/li&gt;
&lt;li&gt;誕生&lt;/li&gt;
&lt;li&gt;イナズマジャパン&lt;/li&gt;
&lt;li&gt;さらば豪炎寺修也(Harmonica Version)&lt;/li&gt;
&lt;li&gt;永遠の仲間たち&lt;/li&gt;
&lt;li&gt;試合開始&lt;/li&gt;
&lt;li&gt;みんなで行こうぜ!&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;320K下载地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbdy1bdexk5
(baidu)http://pan.baidu.com/s/1c0Il1mw
(微盘)http://vdisk.weibo.com/s/APlR9kfn1Vzw
(360云盘)http://yunpan.cn/Q7fx6CIdf5Pi5 提取码 f438&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ape+cue下载地址（不带BK）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbcmv8laakf
(baidu)http://pan.baidu.com/s/1i3j5uMp
(微盘)http://vdisk.weibo.com/s/APlR9kfn1VzX
(360云盘)http://yunpan.cn/Q7fxM6vtIVzHb 提取码 98ed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;角色歌&lt;/h1&gt;
&lt;p&gt;価格 2500円(税込)
発売日 2011/04/06
商品番号 PKCF-1047
JAN 4942463622978
イナズマオールスターズ竹内順子(円堂守)野島裕史(豪炎寺修也)吉野裕行(鬼道有人)西墻由香(風丸一郎太)宮野真守(吹雪士郎)円堂守、壁山塀五郎&amp;amp;雷門中学校合唱部
宮野真守
竹内順子
下野紘
吉野裕行
人気アニメ『イナズマイレブン』のキャラクターソングアルバム!! イナズマイレブンの中でも特に人気のあるキャラクター?声優によるキャラクターソングを収録。エンディングテーマ「またね???のキセツ」、『劇場版イナズマイレブン 最強軍団オーガ襲来』の主題歌「最強で最高」のイナズマオールスターズによるカヴァーも収録! ジャケットには書き下ろしイラストを使用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;雷門中学校 校歌 円堂守、壁山塀五郎&amp;amp;雷門中学校合唱部&lt;/li&gt;
&lt;li&gt;守ってみせる! 竹内順子&lt;/li&gt;
&lt;li&gt;瞳の中の勝利 吉野裕行&lt;/li&gt;
&lt;li&gt;炎の理由 野島裕史&lt;/li&gt;
&lt;li&gt;Bad Boys Brother&apos;s Blues ～海と漢と侠とモヒカン～ 加瀬康之&lt;/li&gt;
&lt;li&gt;舞いあがれ! 西墻由香&lt;/li&gt;
&lt;li&gt;スターライン 水島大宙&lt;/li&gt;
&lt;li&gt;栄光へのエール! 下野紘&lt;/li&gt;
&lt;li&gt;アイスロード 宮野真守&lt;/li&gt;
&lt;li&gt;最強で最高 イナズマオールスターズ&lt;/li&gt;
&lt;li&gt;またね…のキセツ イナズマオールスターズ&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(115)http://115.com/lb/5lbbsa2fmwer
(baidu)http://pan.baidu.com/s/1eQpHdC2
(微盘)http://vdisk.weibo.com/s/APlR9kfn1VzD
(360云盘)http://yunpan.cn/Q7fx258zzuxVD 提取码 89eb&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>初识命令行git</title><link>https://blog.xingoxu.com/2015/12/git-study-1/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/git-study-1/</guid><description>git的教程很多，但很杂，留一篇自用吧
</description><pubDate>Fri, 25 Dec 2015 21:50:12 GMT</pubDate><content:encoded>&lt;p&gt;git的教程很多，但很杂，留一篇自用吧&lt;/p&gt;
 
&lt;h1&gt;机遇&lt;/h1&gt;
&lt;p&gt;以前一直使用傻瓜式的SourceTree，然而今天（2015-12-1）升了级之后全部爆炸，完全push不上去，好吧，不得不感叹一下windows平台真的越来越像个定时炸弹（微软再这么玩真的。。。）
在部署blog的时候也学习了git的一点点概念，所以上手挺快&lt;/p&gt;
&lt;h1&gt;0 安装&lt;/h1&gt;
&lt;p&gt;在windows平台上，git的客户端有很多，在这里我选择git for windows(以前是msysgit)&lt;/p&gt;
&lt;p&gt;首先你得从他的官网(https://git-for-windows.github.io/)上下载下来&lt;/p&gt;
&lt;p&gt;安装过程中没有什么需要配置的，如果看不懂，请自行学习英语这一门语言&lt;/p&gt;
&lt;p&gt;安装后先打开git然后输入两条命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;user_test&quot;
#git的全局设置，设置一次即可，这里设置用户名
git config --global user.email &quot;user_test@user.test&quot;
#git的全局设置，设置一次即可，这里设置邮件
git config --global push.default simple
#听说需要设置
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;1 初始化仓库&lt;/h1&gt;
&lt;p&gt;不管是远程已经有了仓库，还是自己家有仓库，首先在git里你都必须新建一个仓库，如果在文件夹下没有检测到.git文件夹，他就不会对这个文件夹有任何操作，such as pull or push&lt;/p&gt;
&lt;p&gt;可以在任何你想建立仓库的父文件夹下右键git bash here(如果你没有在安装时去除这个钩钩的话)&lt;/p&gt;
&lt;p&gt;进入后输入命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir 仓库名
cd 仓库名
git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;![git init][1]
[1]: https://ooo.0o0.ooo/2017/05/25/5926482034f7a.png
你的仓库就初始化好了！&lt;/p&gt;
&lt;h1&gt;2 设置你的SSH Key&lt;/h1&gt;
&lt;p&gt;在与我们的github服务器进行交流前，我们要告诉他，我们是谁。在github中，我们可以用密码登陆，也可以用ssh key来操作仓库&lt;/p&gt;
&lt;p&gt;如果你想使用其他方式与github服务器交流，请搜索其他文章，如果你已经初始化了ssh key，也请搜索其他文章如何关联&lt;/p&gt;
&lt;p&gt;键入命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -C &apos;你的email&apos; -t rsa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看清英文，一步一步，如果你需要设置密码，在途中自行输入，以后上传时都会要求输入密码，当然也可以不设置&lt;/p&gt;
&lt;h1&gt;3 pull and push&lt;/h1&gt;
&lt;p&gt;首先先将我们的仓库与远程仓库进行关联&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git remote add origin ssh地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;![ssh path][2]
[2]: https://ooo.0o0.ooo/2017/05/25/592648208b7e8.png
ssh地址都可以在github仓库页面上找到，以git@github.com:开头的，请将它们整个复制进去&lt;/p&gt;
&lt;p&gt;操作完成后不会有任何提示&lt;/p&gt;
&lt;h2&gt;pull&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git pull origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;add&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以将当前所有文件加入push list(.git文件夹)&lt;/p&gt;
&lt;h2&gt;push&lt;/h2&gt;
&lt;p&gt;在push前，请记得打commit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &quot;commit注释&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前还不明白 -u参数作用&lt;/p&gt;
&lt;h1&gt;4 What if I did wrong?&lt;/h1&gt;
&lt;p&gt;起因: 不小心把pixiv的账号密码一起传到了github上。。。&lt;/p&gt;
&lt;p&gt;方法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git reset --hard &amp;lt;commit_id&amp;gt;

git push origin HEAD --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;根据–soft –mixed –hard，会对working tree和index和HEAD进行重置:
git reset –mixed：此为默认方式，不带任何参数的git reset，即时这种方式，它回退到某个版本，只保留源码，回退commit和index信息
git reset –soft：回退到某个版本，只回退了commit的信息，不会恢复到index file一级。如果还要提交，直接commit即可
git reset –hard：彻底回退到某个版本，本地的源码也会变为上一个版本的内容


HEAD 最近一个提交
HEAD^ 上一次
&amp;lt;commit_id&amp;gt;  每次commit的SHA1值. 可以用git log 看到,也可以在页面上commit标签页里找到.
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;From： http://www.douban.com/note/189603387/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;References:&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jianshu.com/p/R5nTSR&quot;&gt;如何在Markdown中显示链接中带括号的图片&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>hexo的备份与迁移</title><link>https://blog.xingoxu.com/2015/12/hexo-backup-and-migrate/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/hexo-backup-and-migrate/</guid><description>原虚拟机效率太低，决定重新装新的虚拟机只跑node.js+hexo，正好学习如何备份hexo元数据。
</description><pubDate>Fri, 25 Dec 2015 21:42:48 GMT</pubDate><content:encoded>&lt;p&gt;原虚拟机效率太低，决定重新装新的虚拟机只跑node.js+hexo，正好学习如何备份hexo元数据。&lt;/p&gt;

&lt;p&gt;原则上来说，只需要备份post和主题文件夹，到新的环境下重新部署一下hexo就可以了，然而重新部署的过程中，在生成时发现，居然无法生成index.html了，也不知道是哪里出了问题，也不知道是不是插件出了问题，完全没地方下手啊，直接开搜（。&lt;/p&gt;
&lt;p&gt;发现一个巨简单的方法，可忙这样的东西难道不是just work就ok的吗，你管他版本号要多新，想要版本号新了用新特性就再重新部署呗&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文来自：https://www.zhihu.com/question/21193762/answer/45552939
　　
　　
把整个hexo的文件夹打包即可  换电脑的时候 重新npm install就可以了~&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用后感受：这位小伙伴，你简直是天才！It works!&lt;/p&gt;
</content:encoded></item><item><title>近况</title><link>https://blog.xingoxu.com/2015/12/2015-12-21/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/2015-12-21/</guid><description>很久时间没有写博客了，6月放假在外面忙活打工的事~~（为了还老妈的债）~~ ，9月去了北京和监督面了基，触动很大，便一直在学习与写作业，然后学校作业也是多的醉人，虽然没有任何技术含量然而还是很烦，主要是课程老师看完作品后就说，你再加个功能呗，我![新浪表情-再见](https://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/88_thumb.gif)！终于有空了，然而却发现马上又要寒假了，自己还是什么经验和吹b的资本都没有\_(:3」∠)\_

</description><pubDate>Mon, 21 Dec 2015 22:57:16 GMT</pubDate><content:encoded>&lt;p&gt;很久时间没有写博客了，6月放假在外面忙活打工的事~~（为了还老妈的债）~~ ，9月去了北京和监督面了基，触动很大，便一直在学习与写作业，然后学校作业也是多的醉人，虽然没有任何技术含量然而还是很烦，主要是课程老师看完作品后就说，你再加个功能呗，我&lt;img src=&quot;https://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/88_thumb.gif&quot; alt=&quot;新浪表情-再见&quot; /&gt;！终于有空了，然而却发现马上又要寒假了，自己还是什么经验和吹b的资本都没有_(:3」∠)_&lt;/p&gt;

&lt;p&gt;按时间顺序留一些近况吧：&lt;/p&gt;
&lt;h2&gt;帝都面基&lt;/h2&gt;
&lt;p&gt;其实一开始没有什么动力去帝都，因为论展子，论城市化跟魔都差不多，去了没啥意思，然而母上说想去就去吧，车钱我贴你，我就厚颜无耻的去了，反正我又不出钱（。嘛去的那几天人不多，刚好是阅兵结束了，而且除了第二天下雨，其他几天都是很好的天气，很舒服。
　　第二天和监督面触动比较大，白天各种聊天，晚上我突然想去他家看看，他说没问题，结果一到他家就发现沙发上一本docker，学习氛围各种啊！监督家还有很多很多很多很多很多好玩的东西，可惜我就坐了半小时，不开熏不开熏不开熏！！！！！早知道大家都宅不如窝在家里打一天3ds哈哈哈。
　　第三天和肉排面基，去玩了圆明园啊看了又去中关村逛各种，感觉那两天过去不是玩的，是去聊天的233，但收获很大&amp;gt;.&amp;lt;
　　去北京的这几天的照片都在&lt;a href=&quot;https://goo.gl/photos/m44LLqWzDXtaLvcu7&quot;&gt;Google Photos&lt;/a&gt;上可以看见&lt;/p&gt;
&lt;h2&gt;C#/.NET学习&lt;/h2&gt;
&lt;p&gt;并没有很系统的学习，学校要教，我也没看书，就跟着vs的自动提示完成了老师的练习，感受就是IDE很强大，代码很爽，但是在界面控制上是非常累的，逻辑上就这个开，那个关的，非常累，到最后写大作业的时候就很吃力啊，对界面框架的不熟悉，写出来的东西就又臭又长，如果需求改了会非常累，所以最后那个下载器花了三个礼拜，做出来的效果自己感觉是一般的，因为本身引用的这个界面框架是非常厉害的。&lt;/p&gt;
&lt;h2&gt;Pixiv下载器&lt;/h2&gt;
&lt;p&gt;这个就是c#写的一个作业，从json api转换成我要的数据，多线程，还有http的8种交互，最后还有.net的绑定数据的超级简单，感觉这个东西让我见识到了很多，没有很系统的学习，也算是受益匪浅，有关pixiv下载器的功能与使用在&lt;a href=&quot;https://blog.xingoxu.com/2015/12/PixInTouch/&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;开发心路：&lt;/h3&gt;
&lt;h4&gt;关于多线程&lt;/h4&gt;
&lt;p&gt;子线程中的异常应当进行合适的处理，最好是返回给主线程进行处理，否则在只会在控制台中看到抛了异常然而主线程中却无法捕捉到任何异常。&lt;/p&gt;
&lt;h4&gt;关于数据绑定&lt;/h4&gt;
&lt;p&gt;在写程序的时候见识到了.net一些控件数据绑定的强大，然而有优点也有缺点，不知道是wpf还是界面框架开发者的疏忽，在进行数据绑定时，如果绑定的数据是引用类型的数组，此数组中剩余有元素没有进行初始化的话，CLR会抛出异常，然后抛出的提示却是“CLR遇到了一个问题，这个问题可能是CLR本身的问题”之类云云的，具体提示忘了。。。报的位置也不对，乱七八糟的，一会是这个线程，一会是那个无关的语句，还真以为是vs爆炸了，然后翻了之前的版本，发现不对呀是正常的，然后才发现是新加的feature导致开辟了数组却没有全部new，绑定的时候就爆炸了。&lt;/p&gt;
&lt;h2&gt;Surface Pro 4&lt;/h2&gt;
&lt;p&gt;监督的安利下购买了这款设备，唉想买个16g的太难买了，10月发布等了几乎快三个月，也是微醺啊！其实很想买mbp的，但是今年苹果没有出新款，然而的确是等着用一款便携式的设备（以前买的笔电太差了续航而且当时不懂买了个带显卡很好的，没用），而且还想顺便学学画画(?)&lt;s&gt;听他放屁&lt;/s&gt;
　　拿到手后，第一感受是，还不错，第二感受是，尼玛这系统做的太烂了，算了能操vs能操vmware能操多点任务就可以了，其他的就不要多折腾了。
　　拿到手之后手贱拆了笔结果硬装上去大概装坏了，&lt;img src=&quot;http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/88_thumb.gif&quot; alt=&quot;新浪表情-再见&quot; /&gt;又是一个448再见！
　　最心惊肉跳的是拿到手后的第三天，store打开异常，一直白的，刷了一下发现出墙的东西是正常的，以为是前两天搞了个Universal App出墙的东西坏掉了，然后就找网上去reset商店，结果找了个powershell的一个方法，一弄，商店彻底爆炸，图标不显示，变成了一串英文字母，{MSStorexxx这样子的，omg，心好累，想下恢复镜像，爬了半天下不下来，微软这个下载镜像不让断点续传还只能用浏览器自带还会自动断线是什么情况，让不让人玩了？？？？最后通过自带的恢复居然重装了系统，也是天了噜，这个功能微软你居然做了，还做了那么好。。。。。然后恢复之后键盘盖又爆炸了，驱动识别不出来，然后再一次恢复_(:3」∠)_，然后还是没有好，正当打算第二天去售后的时候，关了下机开机，好了，&lt;img src=&quot;http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/88_thumb.gif&quot; alt=&quot;新浪表情-再见&quot; /&gt;微软你可以爆炸嘛？&lt;/p&gt;
&lt;h2&gt;blog的新主题&lt;/h2&gt;
&lt;p&gt;从上次换了那个主题之后就一直耿耿于怀，那种设计感觉并不是我想要的那种感觉，一次逛v2的时候看到了这个主题，还不错，星期六的时候修改了一下，不知道看这篇文章的你喜欢吗&lt;/p&gt;
</content:encoded></item><item><title>PixInTouch发布页面</title><link>https://blog.xingoxu.com/2015/12/pixintouch/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/12/pixintouch/</guid><description>作为一个花了三个礼拜稍微有那么点心思的~~其实花了很多想法，然而根本看不出这是一个花了心思的作品~~，还是给他开个页面用来发布吧！

</description><pubDate>Mon, 21 Dec 2015 13:42:54 GMT</pubDate><content:encoded>&lt;p&gt;作为一个花了三个礼拜稍微有那么点心思的&lt;s&gt;其实花了很多想法，然而根本看不出这是一个花了心思的作品&lt;/s&gt;，还是给他开个页面用来发布吧！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/59252d9256e76.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;需求：&lt;/h2&gt;
&lt;p&gt;.Net Framework 4.5
（windows xp不支持，windows 7/8用户如您不确定是否拥有这个环境，请您移步&lt;a href=&quot;#instruction&quot;&gt;安装说明与使用&lt;/a&gt;）&lt;/p&gt;
&lt;h2&gt;功能：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;按您关注的作者的新作品/您的收藏（公开/非公开）进行浏览作品&lt;/li&gt;
&lt;li&gt;按您关注的作者（公开/非公开）的作品/收藏进行浏览作品&lt;/li&gt;
&lt;li&gt;按pixiv官方榜单的呈现方式进行浏览作品&lt;/li&gt;
&lt;li&gt;搜索某个关键词（以列表方式呈现不理想），以作者id浏览他的作品/收藏&lt;/li&gt;
&lt;li&gt;浏览到的作品集中、批量下载（原图）&lt;/li&gt;
&lt;li&gt;针对某幅作品的单独下载，漫画作品的挑页下载&lt;/li&gt;
&lt;li&gt;集中的下载管理器&lt;/li&gt;
&lt;li&gt;退出时的未下载完保存/手动保存未下载列表&lt;/li&gt;
&lt;li&gt;自定义的背景图与颜色&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;注意：&lt;/h3&gt;
&lt;p&gt;针对动图的下载不够完善，移动端的api只能获取到600x600的动图帧，如果要下载原图，还是需要登录网页版手动爬图！请您知悉！&lt;/p&gt;
&lt;h2&gt;下载：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;作为一个github的开源项目，该软体的源代码托管在&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF&quot;&gt;这里&lt;/a&gt;，您可以时刻关注这个项目的最新发展及手动修改编译打造属于您自己的扒图器！&lt;/li&gt;
&lt;li&gt;您也可以点击&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF/releases&quot;&gt;这里&lt;/a&gt;获得我为您编译的最新版本！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;当前最新版本&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF/releases/tag/v0.9beta4&quot;&gt;v0.9 beta4 may be the last one&lt;/a&gt;
What&apos;s new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载前的确认对话框的自定义显示&lt;/li&gt;
&lt;li&gt;移除了一些我们完全不需要的文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF/releases/tag/v0.9beta3&quot;&gt;v0.9 beta3 given name&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What&apos;s new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载前的确认对话框自选文件夹&lt;/li&gt;
&lt;li&gt;扒图器的更名与添加图标&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF/releases/tag/v0.9beta2&quot;&gt;v0.9 beta2 little stabler?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What&apos;s new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修复可能导致空列表的默认参数问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xingoxu/pixivDownloader-WPF/releases/tag/v0.9beta&quot;&gt;v0.9 beta Acting Like a 5-year-old baby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What&apos;s new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首次发布功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;安装使用与说明&lt;/h2&gt;
&lt;p&gt;本软体无需安装，直接打开pixiv_downloader.exe即可运行&lt;/p&gt;
&lt;p&gt;windows 7/8用户如您不确定是否拥有.Net Framework 4.5的环境，请您按如下提示检查：
开始菜单（Start）-&amp;gt;搜索（Search）-&amp;gt;控制面板（Control Panel）-&amp;gt;程序与功能（Programs and Features）
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/59254449639da.png&quot; alt=&quot;Programs and Features&quot; /&gt;
在程序与功能面板的右上角进行搜索：.net framework
如您发现类似于如下的提示，则您已经安装了4.5版本
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/59254461f29df.png&quot; alt=&quot;search in Programs and Features&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如您发现并没有.Net Framework或是版本不足4.5，请您移步至：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=40779&quot;&gt;Microsoft .NET Framework 4.5.1 (Offline Installer) English&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/zh-cn/download/details.aspx?id=40779&quot;&gt;Microsoft .NET Framework 4.5.1 (Offline Installer) Chinese&lt;/a&gt;
进行安装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如您有使用的问题，欢迎在下方进行留言，我会回复！&lt;/p&gt;
</content:encoded></item><item><title>新的博客，新的自己</title><link>https://blog.xingoxu.com/2015/09/newblog-newlife-2015/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/09/newblog-newlife-2015/</guid><description>借着这个上学期期末误删的配置这学期开学重新配置以及同好好友给的力量，希望自己能够在这新的学期，努力多点一些技能树，望自己能成为更好的自己
</description><pubDate>Wed, 16 Sep 2015 16:46:46 GMT</pubDate><content:encoded>&lt;p&gt;借着这个上学期期末误删的配置这学期开学重新配置以及同好好友给的力量，希望自己能够在这新的学期，努力多点一些技能树，望自己能成为更好的自己&lt;/p&gt;

&lt;p&gt;话又说回来，以前最看不起java了，结果还是得学java，我倒是希望能赶紧自学google的go语言，不过还是先把java精了吧&lt;/p&gt;
&lt;p&gt;另外，正如你所见，这里很多地方都正在under construction，所以注意不要点到什么奇怪的地方去了哦（根本没有233&lt;/p&gt;
&lt;p&gt;重新搭建hexo的过程中，又被自己给笨到了，还是记一下
部署hexo一定要使用旧版本（1.x）的msysgit，否则怎么deploy都上不去，气死了，老是说我密钥错误，换个git居然全好了，尼玛哦&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a href=&quot;http://www.cognize.me/2015/08/22/msysgiterror/&quot;&gt;解决hexo一个奇怪的错误&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自用下载：
http://pan.baidu.com/s/1o6zP5CA
http://yunpan.cn/cmherr5u6PsrM （提取码：46e7）&lt;/p&gt;
&lt;p&gt;换新模板的过程中接触到了一些新的，比如swiftype这个玩意，不错&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jerryfu.net/post/search-engine-for-hexo-with-swiftype-v2.html&quot;&gt;利用swiftype为hexo添加站内搜索v2.0&lt;/a&gt;
&lt;a href=&quot;http://ssk.91txh.com/209&quot;&gt;多说添加useragent&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>安卓4.4以上系统已root设备正确升级</title><link>https://blog.xingoxu.com/2015/09/android-root-ota/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/09/android-root-ota/</guid><description>原生root设备要是想要保留数据系统升级，一般都会选择线刷升级(直接刷入高版本system镜像等)，然而上次在逛g+时，却发现有人说这样升级非常不安全，一旦用户数据部分分区发生改变，直接刷入镜像启动后可能会发生假砖，导致最后得全新刷机，同时，这人也给出了一个非常安全的方法，看到后我觉得这样的方法非常可取，分享给大家
</description><pubDate>Wed, 16 Sep 2015 16:39:38 GMT</pubDate><content:encoded>&lt;p&gt;原生root设备要是想要保留数据系统升级，一般都会选择线刷升级(直接刷入高版本system镜像等)，然而上次在逛g+时，却发现有人说这样升级非常不安全，一旦用户数据部分分区发生改变，直接刷入镜像启动后可能会发生假砖，导致最后得全新刷机，同时，这人也给出了一个非常安全的方法，看到后我觉得这样的方法非常可取，分享给大家&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;平刷当前版本的镜像，recovery system等，目的是为了去除root，保持system分区签名安全(如果安装了xposed框架，请先卸载在刷)&lt;/li&gt;
&lt;li&gt;sideload OTA包，如果系统已经有了推送，下载好了ota，也可直接升级&lt;/li&gt;
&lt;li&gt;enjoy the new system! 可以开始进行root操作等&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;详细的步骤就不完全写出来了，教程太多一抓一大把&lt;/p&gt;
</content:encoded></item><item><title>Java学习笔记1</title><link>https://blog.xingoxu.com/2015/09/java-learningnotes-1/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/09/java-learningnotes-1/</guid><description>随便记的
</description><pubDate>Tue, 15 Sep 2015 20:51:16 GMT</pubDate><content:encoded>&lt;p&gt;随便记的&lt;/p&gt;

&lt;h1&gt;部署与安装&lt;/h1&gt;
&lt;h2&gt;三步：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下载并安装JDK&lt;/li&gt;
&lt;li&gt;配置环境变量&lt;/li&gt;
&lt;li&gt;测试&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;注意点：&lt;/h2&gt;
&lt;p&gt;环境变量有三：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;JAVA_HOME&lt;/code&gt; 对应&lt;code&gt;jdk&lt;/code&gt;根目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PATH&lt;/code&gt; 对应&lt;code&gt;jdk\bin&lt;/code&gt;目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLASSPATH&lt;/code&gt; 对应&lt;code&gt;jdk\lib&lt;/code&gt;目录&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;使用IDE进行开发java程序&lt;/h1&gt;
&lt;p&gt;我选择eclipse&lt;/p&gt;
&lt;h2&gt;步骤：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建java项目&lt;/li&gt;
&lt;li&gt;创建程序包（一般为com.x）&lt;/li&gt;
&lt;li&gt;创建源代码文件并编写&lt;/li&gt;
&lt;li&gt;测试运行&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;变量与常量&lt;/h1&gt;
&lt;h2&gt;注意点：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;注意java中区分大小写，因此要注意大小写，关键字也要注意否则会编译错误&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>WNDR4300救砖（openwrt）</title><link>https://blog.xingoxu.com/2015/09/router-rebuild-2015/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/09/router-rebuild-2015/</guid><description>记一次作死把路由如何弄砖，又是如何救回来的过程

</description><pubDate>Tue, 15 Sep 2015 20:19:41 GMT</pubDate><content:encoded>&lt;p&gt;记一次作死把路由如何弄砖，又是如何救回来的过程&lt;/p&gt;

&lt;h1&gt;本教程适用于：&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;砖前为openwrt&lt;/li&gt;
&lt;li&gt;救后为openwrt&lt;/li&gt;
&lt;li&gt;因为刷了sysupgrade变砖的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他情况本救砖方法不一定有效，请三思而尝试&lt;/p&gt;
&lt;h1&gt;怎么变砖&lt;/h1&gt;
&lt;p&gt;14.07大容量固件下用15.05官方升级包升级，变砖&lt;/p&gt;
&lt;p&gt;尼玛，这个大容量固件是你们自己官方出的好伐！！！&lt;/p&gt;
&lt;p&gt;下次再也不敢盲目尝鲜了！ &lt;img src=&quot;http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/88_thumb.gif&quot; alt=&quot;新浪表情-再见&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;救砖方法&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;救砖方法参考：http://blog.csdn.net/zhiyuan411/article/details/41399273&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;下载OpenWrt刷机包（要完整镜像，img的那种）：http://downloads.openwrt.org/&lt;/li&gt;
&lt;li&gt;下载TFTP软件：http://www.wayos.cn/down/other/tftp.rar&lt;/li&gt;
&lt;li&gt;把电脑用网线连在路由器，电脑改为固定IP：192.168.1.2，子网掩码：255.255.255.0，ip网关：192.168.1.1&lt;/li&gt;
&lt;li&gt;WNDR4300用电源键断电&lt;/li&gt;
&lt;li&gt;用细针等物件按住reset键不放（reset键在4300的底部，序列号的的最左侧，是个小圆孔，标有：restore factory settings）&lt;/li&gt;
&lt;li&gt;按下4300电源键，通电&lt;/li&gt;
&lt;li&gt;直到电源灯由黄色闪烁到绿色闪烁，松开reset&lt;/li&gt;
&lt;li&gt;使用TFTP软件上传固件：路由器IP填192.168.1.1，密码留空，固件文件选择刚刚下载的OpenWrt刷机包那个img文件，点击“刷新固件”&lt;/li&gt;
&lt;li&gt;等待TFTP软件显示绿色圆点，表示刷机成功。再等待几分钟，就可以看到电源键变绿，4300起来了。&lt;/li&gt;
&lt;li&gt;此时，局域网已经支持DHCP，并可以通过 http://192.168.1.1 来进入luci管理平台，广域网口插入网线，设置后可以上网。&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;p&gt;注：恢复后没有5G的配置项，解决办法：已经正常运行时，把4300断电，然后插电重启。就会看到5G的配置项。&lt;/p&gt;
&lt;h1&gt;最后再记&lt;/h1&gt;
&lt;p&gt;恢复后什么都没有了，要重头配置，在配置的过程中还发现了自己以前记录的一些问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;除了要安装那些包外，还要安装ip iptables-mod-tproxy这两个包&lt;/li&gt;
&lt;li&gt;ss包从luci开发者的github界面进入，不要从其他地方进入，傲娇的很luci。。。记得选择spec优化版本（？）&lt;/li&gt;
&lt;li&gt;ss更新过后luci界面开发者就将地址只支持数字ip了，不再支持域名了（明明人家windows客户端优秀的不行&lt;/li&gt;
&lt;li&gt;尽管是2.3.2，但是新安装的（还是15.05的openwrt上）并没有看到UDP中继，然而ignore.list倒是要自己下载。。。&lt;/li&gt;
&lt;li&gt;ignore.list下载方式在最下面
&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;wget -O- &apos;http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest&apos; | awk -F\| &apos;/CN\|ipv4/ { printf(&quot;%s/%d\n&quot;, $4, 32-log($5)/log(2)) }&apos; &amp;gt; /etc/ignore.list
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;luci-ss界面关于不支持域名的issue：https://github.com/shadowsocks/openwrt-shadowsocks/issues/124&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>2015.05.12 C++继承</title><link>https://blog.xingoxu.com/2015/05/cpp-inherit/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/05/cpp-inherit/</guid><description>继承和组合是C++中比较重要的代码重用方式

</description><pubDate>Tue, 12 May 2015 02:04:37 GMT</pubDate><content:encoded>&lt;p&gt;继承和组合是C++中比较重要的代码重用方式&lt;/p&gt;

&lt;h1&gt;继承与组合&lt;/h1&gt;
&lt;p&gt;通常，继承被看做是is-a，组合被看做是has-a
当我们不仅想重用内部实现而且还想重用接口的话，使用继承是最好的。&lt;/p&gt;
&lt;h1&gt;继承方法&lt;/h1&gt;
&lt;p&gt;C++内有三种继承方式：公有继承、私有继承、保护继承&lt;/p&gt;
&lt;h2&gt;公有继承&lt;/h2&gt;
&lt;p&gt;公有继承是把父类的公有和保护成员/函数保持原有状态进行继承&lt;/p&gt;
&lt;h2&gt;私有继承&lt;/h2&gt;
&lt;p&gt;私有继承是把父类的所有公有和保护成员/函数作为私有成员进行继承
使用私有继承时，隐藏了父类的所有成员，能在子类中调用，完成部分功能。但既然已变成了私有，所有指针都不能指向此子类继承的成员，因此如果使用私有继承，在父类中有指针（虚函数）指向，则会提示“不允许对不可访问的基类进行转换” or “不可访问”&lt;/p&gt;
&lt;h2&gt;保护继承&lt;/h2&gt;
&lt;p&gt;保护继承是把父类的所有公有和保护成员/函数作为保护成员进行继承
即：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;public&lt;/th&gt;
&lt;th&gt;protected&lt;/th&gt;
&lt;th&gt;private&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;公有继承&lt;/td&gt;
&lt;td&gt;public&lt;/td&gt;
&lt;td&gt;protected&lt;/td&gt;
&lt;td&gt;不可见&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;私有继承&lt;/td&gt;
&lt;td&gt;private&lt;/td&gt;
&lt;td&gt;private&lt;/td&gt;
&lt;td&gt;不可见&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保护继承&lt;/td&gt;
&lt;td&gt;protected&lt;/td&gt;
&lt;td&gt;protected&lt;/td&gt;
&lt;td&gt;不可见&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;C++中默认继承方式为private继承&lt;/p&gt;
&lt;h1&gt;向上类型转换&lt;/h1&gt;
&lt;p&gt;C++中允许向上类型转换，也就是，从一个专门的类型转换到一个更一般的类型，也就是从子类转换到父类，所以这样的类型转换也是安全的。对于这个转换唯一可能出现的事情就是它失去它专属的成员，而不是获得。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thinking in C++ page.356&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;多父类继承&lt;/h1&gt;
&lt;p&gt;子类: 父类1,父类2的形式进行多父类继承
对象的层次结构为，父类1，父类2，子类成员
如果有同名成员/函数，无法直接调用，需要使用父类::成员来使用
二义性适用于任何名字，包括函数名。二义性的产生见名字查找问题。&lt;/p&gt;
&lt;h2&gt;虚继承/虚基类&lt;/h2&gt;
&lt;p&gt;多父类继承时，如果一个子类继承的两个父类是从同一个父类中派生的，则在C++中会被认为成从两个同一个父类派生的，无法在子类中使用这个父类的函数or向上转换到这个父类，因为二义性，编译器并不知道是哪一个父类中的函数，即使他们是从同一个父类中派生的，因此使用virtual关键词来进行虚继承，否则编译器将报错。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thinking in C++ page 810&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;名字查找问题&lt;/h2&gt;
&lt;p&gt;在同名的两个函数之间进行选择时，编译器将选择占优势的那个函数。如果没有占优势的名字，就会产生二义性。
&lt;em&gt;人懒得要死代码都懒得抄了&lt;/em&gt;
&lt;em&gt;多态与继承，有待更新&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.csdn.net/complety/article/details/7493194&quot;&gt;浅谈C++继承方式&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/tonywearme/article/details/7039963&quot;&gt;揭开私有继承的面纱&lt;/a&gt;
Thinking in C++ page 336-361&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>2015.05.09 C++多态</title><link>https://blog.xingoxu.com/2015/05/cpp-polymorphism/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/05/cpp-polymorphism/</guid><description>“调用’同名函数’却会因上下文不同会有不同的实现的一种机制”
C++中的多态根据运行时机制的不同分为静态多态与动态多态，下面是静态多态与动态多态的主要实现方式。
</description><pubDate>Sat, 09 May 2015 02:04:49 GMT</pubDate><content:encoded>&lt;p&gt;“调用’同名函数’却会因上下文不同会有不同的实现的一种机制”
C++中的多态根据运行时机制的不同分为静态多态与动态多态，下面是静态多态与动态多态的主要实现方式。&lt;/p&gt;

&lt;h1&gt;静态多态&lt;/h1&gt;
&lt;p&gt;静态多态指的是基于模板的多态，对所有可能出现的情况，把所有代码全部写好，最关键的是，这些关联处理处于编译期而非运行期。
常见的静态多态：函数多态，模板多态，宏多态。&lt;/p&gt;
&lt;h1&gt;函数多态/函数重载(overload)&lt;/h1&gt;
&lt;p&gt;不同参数，相同名字，返回值不看重即可对函数进行重载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class overload{
public:
	void overload_test(){
		cout &amp;lt;&amp;lt; &quot;This is a test function!&quot; &amp;lt;&amp;lt; endl;
	}
	void overload_test(int a){
		cout &amp;lt;&amp;lt; &quot;This is an overload function!&quot; &amp;lt;&amp;lt; endl;
	}
	int overload_test(double a){
		cout &amp;lt;&amp;lt; &quot;This is also an overload function!&quot; &amp;lt;&amp;lt; endl;
		return 0;
	}
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;模板多态/模板函数/函数模板&lt;/h1&gt;
&lt;p&gt;执行相同内容，只是参数类型不同，返回值也随着参数类型不同而改变，使用模板函数是最恰当的。模板函数要是欲对某一个不同的参数类型想进行不同的操作还可以使用模板特例。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class func_template{
public:
	template&amp;lt;typename X&amp;gt;
	X func_template_func(X a, X b){//function:return big one
		if (b&amp;gt;a) a = b;
		return a;
	}

	template&amp;lt;&amp;gt;//模板特例
	double func_template_func(double a, double b){
		cout &amp;lt;&amp;lt; &quot;This is a specfic template function&quot; &amp;lt;&amp;lt; endl;
		return 0;
	}

};
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;利用虚函数实现的多态&lt;/h1&gt;
&lt;p&gt;在父类中定义虚函数，在子类继承父类后对此函数进行覆盖，然后调用的时候一定要使用引用传递。
虚函数与指针/引用传递传递一个不能少，虚函数与指针传递共同配合形成一个父类指针指向所需要的子类函数，如果缺了任意一个，即使通过编译，也仍然只会调用父类的虚函数内容。&lt;/p&gt;
&lt;p&gt;要注意的是，子类继承时一定要使用&lt;code&gt;public&lt;/code&gt;继承，否则编译会报错，不允许对不可访问的基类进行转换。因为指针并不能指向一个&lt;code&gt;private&lt;/code&gt;对象，&lt;code&gt;private&lt;/code&gt;对象也并不能向上转换（理解&lt;code&gt;private&lt;/code&gt;的意义）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/592545c28b9b8.png&quot; alt=&quot;不允许对不可访问的基类进行转换&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class father_class{
public:
	virtual void run(){
	};
	
};

class son_class :public father_class{
public:
	void run(){
		cout &amp;lt;&amp;lt; &quot;test&quot; &amp;lt;&amp;lt; endl;
	}

};



void output(father_class &amp;amp;a){
	a.run();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为C++通过父类指针查找到子类函数，查找的过程，是在运行时完成的，所以这样的多态叫做动态多态。
以上&lt;/p&gt;
&lt;p&gt;代码中涉及到的一些其他，请参见：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;待填充&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.360doc.com/content/11/0710/17/1976682_132733496.shtml&quot;&gt;C++多态&lt;/a&gt;
&lt;a href=&quot;http://www.cnblogs.com/hongzg1982/archive/2011/05/11/2042920.html&quot;&gt;C++多态&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>2015.04.24 C++近期学习小结</title><link>https://blog.xingoxu.com/2015/04/cpp-study-log/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/cpp-study-log/</guid><description>函数参数传递，类的构造函数，类的可见性，类的继承
都是一些碎片化的东西，做做笔记防止自己忘记
</description><pubDate>Fri, 24 Apr 2015 02:05:32 GMT</pubDate><content:encoded>&lt;p&gt;函数参数传递，类的构造函数，类的可见性，类的继承
都是一些碎片化的东西，做做笔记防止自己忘记&lt;/p&gt;

&lt;h1&gt;函数参数传递&lt;/h1&gt;
&lt;p&gt;只贴改过的代码了，其实程序和讲解这篇文章写得很棒，我就不当个复制粘贴的了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/Romi/archive/2012/08/09/2630014.html&quot;&gt;C/C++中函数参数传递详解&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

void swap1(int a, int b){	//value capture
	int temp = a;
	a = b;
	b = temp;
}

void swap2(int *a, int *b){ //pointer capture
	int temp = *a;
	*a = *b;
	*b = temp;	
}

void swap3(int *a, int *b){  //pointer capture another 
	int *temp;
	temp = a;
	a = b;
	b = temp;
}

void swap4(int &amp;amp;a, int &amp;amp;b){		//reference capture
	int temp;
	temp = a;
	a = b;
	b = temp;
}

void main(){
	int a = 1, b = 2;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	swap1(a, b);
	cout &amp;lt;&amp;lt; &quot;值传递后:&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;值传递只直接传递值，并不对原本实参有任何影响&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	swap2(&amp;amp;a, &amp;amp;b);
	cout &amp;lt;&amp;lt; &quot;指针传递A后:&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;对指针内容中进行交换，值变更&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	swap3(&amp;amp;a, &amp;amp;b);
	cout &amp;lt;&amp;lt; &quot;指针传递B后:&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;只对指针指向地址进行交换，而且也仅限于函数内的叫a,b的指针交换&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	swap4(a, b);
	cout &amp;lt;&amp;lt; &quot;引用传递后:&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;a=&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &quot;\t&quot; &amp;lt;&amp;lt; &quot;b=&quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;直接对变量进行操作&quot; &amp;lt;&amp;lt; endl;
	system(&quot;pause&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;类的构造函数&lt;/h1&gt;
&lt;h2&gt;默认构造函数&lt;/h2&gt;
&lt;p&gt;类的默认构造函数是一个与类名相同，参数为空的函数，当对象被创建时，将会自动调用类的默认构造函数。如果类没有定义默认构造函数时，编译器会自动给类创建一个函数体为空的默认构造函数。&lt;/p&gt;
&lt;h2&gt;重载/一般构造函数&lt;/h2&gt;
&lt;p&gt;可以为类自定义构造函数，构造函数名与类名相同，参数可以定义，当参数不为空时，则会对类的构造函数进行重载，在创建对象时，需要使用new语句，并输入参数，否则将使用默认构造函数。有参数的与类名相同的函数，称为重载构造函数，或一般构造函数。&lt;/p&gt;
&lt;h1&gt;类的可见性&lt;/h1&gt;
&lt;h2&gt;public&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;public&lt;/code&gt;可见性可以在创建类对象的时候直接被对象调用，调用方法为&lt;code&gt;object_name.variable&lt;/code&gt;/&lt;code&gt;function&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;private&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;private&lt;/code&gt;可见性只能在本类定义中被使用，子类无法继承，对象无法直接调用&lt;/p&gt;
&lt;h2&gt;protected&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;protected&lt;/code&gt;可见性在无子类的情况下与&lt;code&gt;private&lt;/code&gt;一致，有子类的情况下，能被子类继承，在子类定义中使用，但不能被子类的对象直接引用。子类继承的仍然是&lt;code&gt;protected&lt;/code&gt;类型，也就是说能被子类的子类继承。&lt;/p&gt;
&lt;h2&gt;疑问&lt;/h2&gt;
&lt;p&gt;《C++ Primer》其中关于protected 成员的描述是这样的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;protected Members&lt;/p&gt;
&lt;p&gt;The protected access label can be thought of as a blend of private and public :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Like private members, protected members are inaccessible to users of the class.&lt;/li&gt;
&lt;li&gt;Like public members, the protected members are accessible to classes derived from this class.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, protected has another important property:
A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;奇怪的就是，难道是理解有误吗？明显&lt;code&gt;protected&lt;/code&gt;就算被继承后也是&lt;code&gt;protected&lt;/code&gt;类型，然而书上则说父类的&lt;code&gt;protected&lt;/code&gt;成员只能通过子类的对象进行访问，然而即使是&lt;code&gt;public&lt;/code&gt;成员，子类对象也无法直接访问父类的成员（如果已被覆盖），更何况是&lt;code&gt;protected&lt;/code&gt;了，根本没法直接访问，通不过编译，不明白啊。&lt;/p&gt;
&lt;h1&gt;类的继承&lt;/h1&gt;
&lt;p&gt;子类继承父类，使用 &lt;code&gt;derived_class_name:base_class_name&lt;/code&gt;进行继承，继承时，先执行父类默认构造函数，再执行子类构造函数。析构时，先析构子类构造函数，再析构父类析构函数。
　　子类继承父类的&lt;code&gt;public&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt;成员函数与成员变量，继承下来的成员仍然是&lt;code&gt;public&lt;/code&gt;与&lt;code&gt;protected&lt;/code&gt;可见性的（public继承），子类可以对父类中的成员进行覆盖，在子类（对象）中优先调用子类成员。在子类定义中，即使成员已覆盖，也可以使用父类的成员，只需要在定义中使用&lt;code&gt;father_class_name::member_name&lt;/code&gt;，就可以使用父类成员，但在子类对象中不能调用父类成员&lt;/p&gt;
&lt;h1&gt;类的操作的实现&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class father_class{

public:
	father_class(){//父类默认构造函数
		public_print();
		private_print();
		protected_print();
	}
	father_class(int a){//父类自定义构造函数
		cout &amp;lt;&amp;lt; &quot;father class constructed function overloaded.&quot; &amp;lt;&amp;lt; endl;
	}
	int father_public_variable = 100;
	void public_print(){
		cout &amp;lt;&amp;lt; &quot;This is a public function.&quot; &amp;lt;&amp;lt; endl;
	}
private:

	void private_print(){
		cout &amp;lt;&amp;lt; &quot;This is a private function.&quot; &amp;lt;&amp;lt; endl;
	}
protected:
	int father_protected_variable = 2;
	void protected_print(){
		cout &amp;lt;&amp;lt; &quot;This is a protected function.&quot; &amp;lt;&amp;lt; endl;
	}
};

class son_class :father_class{
public:
	son_class(){//子类默认构造函数
		public_print();
		//private_print();基类不可访问父类的private
		protected_print();		
	}
	int father_public_variable = 200;
	
	void public_print(){//覆盖父类中的public_print
		cout &amp;lt;&amp;lt; &quot;I&apos;am son_public_print function.&quot; &amp;lt;&amp;lt; endl;

		//print public variable
		cout &amp;lt;&amp;lt; father_public_variable &amp;lt;&amp;lt; endl;
		cout &amp;lt;&amp;lt; father_class::father_public_variable &amp;lt;&amp;lt; endl;
		
		father_protected_variable = 50;
		cout &amp;lt;&amp;lt; father_protected_variable &amp;lt;&amp;lt; endl;
		cout &amp;lt;&amp;lt; father_class::father_protected_variable &amp;lt;&amp;lt; endl;
	}
};

void main(){
	father_class father_object;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;father object created.&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
	father_class* father_object_2 = new father_class(0);
	cout &amp;lt;&amp;lt; endl;
	son_class son_object;
	cout &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;son object created.&quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;

	
	son_object.father_public_variable = 500;
	father_object.father_public_variable = 300;//不影响son_object
	//son_object.father_protected_variable = 10;子类对象不能对protected变量进行直接操作
	son_object.public_print();
	
	delete father_object_2;
	system(&quot;pause&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/Romi/archive/2012/08/09/2630014.html&quot;&gt;C/C++中函数参数传递详解&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/luoruiyi2008/article/details/7179788&quot;&gt;C++中protected的访问权限&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>两个Android Chrome的小坑</title><link>https://blog.xingoxu.com/2015/04/android-chrome-issues-with-webpage/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/android-chrome-issues-with-webpage/</guid><description>背景不支持fixed属性
标题栏沉浸
</description><pubDate>Wed, 22 Apr 2015 01:49:26 GMT</pubDate><content:encoded>&lt;p&gt;背景不支持fixed属性
标题栏沉浸&lt;/p&gt;

&lt;h1&gt;背景不支持fixed属性&lt;/h1&gt;
&lt;p&gt;安卓浏览器/安卓Chrome中对于background已经移除了fixed属性&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一种：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对div进行fixed&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二种（适用于body background）：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;html{
 height:100%;
 min-height:100%;
 }
body{
 min-height:100%;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;标题栏沉浸&lt;/h1&gt;
&lt;p&gt;支持Android 5.x下Chrome的标题栏沉浸颜色&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/592546e52c39a.png&quot; alt=&quot;安卓Chrome沉浸主题色&quot; /&gt;
&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/24/592546f366eaa.png&quot; alt=&quot;安卓Chrome沉浸主题色-任务列表显示&quot; /&gt;&lt;/p&gt;
&lt;p&gt;header中加入以下代码，选个喜欢的颜色&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;theme-color&quot; content=&quot;#ffffff&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;icon&quot; sizes=&quot;192x192&quot; href=&quot;nice-highres.png&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://ippotsuko.com/support-for-theme-color-in-chrome-39-for-android/&quot;&gt;支持Android 5.x下Chrome的标题栏沉浸颜色&lt;/a&gt;
&lt;a href=&quot;http://stackoverflow.com/questions/14876035/background-size-cover-not-working-in-portrait-on-android-tablet&quot;&gt;background-size: cover not working in portrait on Android tablet&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>自抓 GOODキター!/ 勝って泣こうゼッ！/またね...のキセツ/手をつなごう 无损下载</title><link>https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/self-copy-cd-inazuma-1-html/</guid><description>喜欢请购买正版，仅供试听学习用

</description><pubDate>Tue, 21 Apr 2015 01:13:34 GMT</pubDate><content:encoded>&lt;p&gt;喜欢请购买正版，仅供试听学习用&lt;/p&gt;

&lt;p&gt;解压密码：xingo&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.itc.cn/photo/omNqDKb6sQb&quot; alt=&quot;四张专辑&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.itc.cn/photo/omN7cbdwIHH&quot; alt=&quot;勝って泣こうゼッ！&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN75gBZ2i0&quot; alt=&quot;勝って泣こうゼッ！&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7hqIgUMx&quot; alt=&quot;勝って泣こうゼッ！&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7krm9W4p&quot; alt=&quot;勝って泣こうゼッ！&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN70XsESvH&quot; alt=&quot;勝って泣こうゼッ！&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;勝って泣こうゼッ！（初回限定版）&lt;/h2&gt;
&lt;p&gt;整轨下载：
百度：http://pan.baidu.com/s/1sjJlAK9
360：http://yunpan.cn/cjeaFRNXRfFwK （提取码：e3fc）
初回限定DVDiso下载：
百度：http://pan.baidu.com/s/1hq5s8lQ
360：http://yunpan.cn/cjearCeBqRyMU （提取码：2902）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.itc.cn/photo/omN7zDXR3d8&quot; alt=&quot;GOODキター!&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7PvNg3T1&quot; alt=&quot;GOODキター!&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7HmCNy1d&quot; alt=&quot;GOODキター!&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7GhMPzeq&quot; alt=&quot;GOODキター!&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7W37VlUG&quot; alt=&quot;GOODキター!&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omN7n8pLSeV&quot; alt=&quot;GOODキター!&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;GOODキター!（初回限定）&lt;/h2&gt;
&lt;p&gt;整轨下载：
百度：http://pan.baidu.com/s/1pJ9grIb
360：http://yunpan.cn/cjeaSigZun9Zj （提取码：1ca8）&lt;/p&gt;
&lt;p&gt;初回限定DVDiso下载：
百度：http://pan.baidu.com/s/1mgMfycC
360：http://yunpan.cn/cjeaBEQfMTazp （提取码：2085）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.itc.cn/photo/omNqthJN9eV&quot; alt=&quot;またね...のキセツ&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omNqmBF0Beg&quot; alt=&quot;またね...のキセツ&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omNq8VKDYC0&quot; alt=&quot;またね...のキセツ&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omNq3p6deZV&quot; alt=&quot;またね...のキセツ&quot; /&gt;
&lt;img src=&quot;https://img.itc.cn/photo/omNqRe4q6KA&quot; alt=&quot;またね...のキセツ&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;またね…のキセツ（初回限定）&lt;/h2&gt;
&lt;p&gt;整轨下载：
百度：http://pan.baidu.com/s/1eQgsztg
360：http://yunpan.cn/cjeak2gANEvyI （提取码：1ad7）&lt;/p&gt;
&lt;p&gt;初回限定DVDiso下载：
百度：http://pan.baidu.com/s/1qW5cpQk
360：http://yunpan.cn/cjeavRVDIiKaN （提取码：c9a8）&lt;/p&gt;
&lt;h2&gt;手をつなごう&lt;/h2&gt;
&lt;p&gt;整轨下载：
百度：http://pan.baidu.com/s/1jG3QLwy
360：http://yunpan.cn/cjea2X9IfV5ak （提取码：4764）&lt;/p&gt;
</content:encoded></item><item><title>自用hexo+github pages搭建log</title><link>https://blog.xingoxu.com/2015/04/hexo-setup-log/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/hexo-setup-log/</guid><description>hexo+github pages 静态页面 速度杠杠的

</description><pubDate>Fri, 17 Apr 2015 03:02:20 GMT</pubDate><content:encoded>&lt;p&gt;hexo+github pages 静态页面 速度杠杠的&lt;/p&gt;

&lt;p&gt;#环境&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Node.js
Git&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;GitHub Pages创建&lt;/h1&gt;
&lt;p&gt;很多种GitHub Pages，这次创建的是个人id顶级pages
New repository，项目的名字就是username.github.io
其他选项不再详细赘述，比较简单&lt;/p&gt;
&lt;h1&gt;配置SSH Keys&lt;/h1&gt;
&lt;p&gt;（不知是否可以使用github自己客户端的git，自动生成ssh key，可以的话就跳过这步）
现有ssh key check&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd ~/.ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No such file or directory 说明没有创建
如果有，请删除，个人文件夹（C:/Users/username/）下的.ssh文件夹&lt;/p&gt;
&lt;h2&gt;生成新的SSH key&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ ssh-keygen -t rsa -C &quot;邮件地址@youremail.com&quot;
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa):
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-C大写注意
回车后系统要求输入密码，输入即可
可以不设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/59264929aa77e.png&quot; alt=&quot;ssh key success&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;添加SSH key到GitHub&lt;/h2&gt;
&lt;p&gt;要把SSH key添加入GitHub才能正常pull/send requests&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开.ssh文件夹下的.pub文件，用notepad/notepad++等编辑器打开&lt;/li&gt;
&lt;li&gt;登陆github，进入&lt;code&gt;Account Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;SSH Public Keys&lt;/code&gt; -&amp;gt; &lt;code&gt;add another public keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把刚才的pub文件内容复制进key文本框中，点击add key&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;测试&lt;/h2&gt;
&lt;p&gt;输入以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现以下情况表示配置正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The authenticity of host &apos;github.com (207.97.227.239)&apos; can&apos;t be established.
RSA key fingerprint is                                                    .
Are you sure you want to continue connecting (yes/no)?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入yes&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hi xingoxu! You&apos;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完善个人信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git config --global user.name &quot;cnfeat&quot;//用户名
$ git config --global user.email  &quot;cnfeat@gmail.com&quot;//填写自己的邮箱
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置成功&lt;/p&gt;
&lt;h2&gt;常见错误参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://help.github.com/articles/generating-ssh-keys/&quot;&gt;GitHub Help - Generating SSH Keys&lt;/a&gt;
&lt;a href=&quot;https://help.github.com/articles/error-permission-denied-publickey/&quot;&gt;GitHub Help - Error Permission denied (publickey)&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;开始使用hexo部署博客&lt;/h1&gt;
&lt;h2&gt;安装hexo&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ npm install hexo-cli -g
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;部署hexo&lt;/h2&gt;
&lt;p&gt;找个地方新建个文件夹，右键git bash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hexo init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后尝试执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hexo g
$ hexo s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果出现错误，尝试重新执行 &lt;code&gt;npm install hexo-cli -g&lt;/code&gt;
成功后可以在浏览器中查看到&lt;code&gt;localhost:4000&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;使用/调试&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ hexo s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每次执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hexo clean
$ hexo g
$ hexo deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;deploy/d 是部署到github
但前提是首先我们要配置hexo&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;首先安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ npm install hexo-deployer-git --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;否则不识别git上传方式&lt;/p&gt;
&lt;p&gt;然后配置根目录下_config.yml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deploy:
type: git
repository: git@github.com:A-limon/alimon.github.com.git #此行内容可以在没有部署项目的项目首页找到，点击SSH
branch: master #为不同项目创建，参考其他资料

# Site #整站的基本信息
title:  #网站标题
subtitle: #网站副标题
description:  #网站描述
author:   #网站作者，在下方显示
email:  #联系邮箱
language: zh-CN


# URL
## If your site is put in a subdirectory
url: http://www.cnfeat.com #你的域名
root: /
permalink: :year/:month/:day/:title/
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这么多差不多就配置好了
要注意的是hexo的配置文件，冒号后面一定要空一格空格，字符串后面也要空一格空格&lt;/p&gt;
&lt;h2&gt;安装主题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/wuchong/jacman.git themes/jacman
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/A-limon/pacman.git themes/pacman
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;启用主题&lt;/h3&gt;
&lt;p&gt;_config.yml中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;theme: jacman
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更新主题&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ cd themes/jacman
$ git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意备份主题_config.yml&lt;/p&gt;
&lt;h1&gt;安装插件&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ npm install &amp;lt;plugin-name&amp;gt; --save
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装sitemap与feed插件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ npm install hexo-generator-sitemap --save
$ npm install hexo-generator-feed --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改_config.yml，增加以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Extensions
Plugins:
- hexo-generator-feed
- hexo-generator-sitemap

#Feed Atom
feed:
  type: atom
  path: atom.xml
  limit: 20

#sitemap
sitemap:
  path: sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主题中有相应部分也要做出修改&lt;/p&gt;
&lt;h1&gt;设置CNAME&lt;/h1&gt;
&lt;p&gt;在sources文件夹新建一个CNAME文件，内容是一行无空格一个CNAME域名
这样做的目的是可以使hexo generate的时候把cname放进网站根目录下
当github项目中的设置中这样显示的时候，证明设置成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ooo.0o0.ooo/2017/05/25/59264929af2f0.png&quot; alt=&quot;github-cname-success&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当你使用非cname，想使用A域名等，请看这里：
&lt;a href=&quot;https://help.github.com/articles/setting-up-a-custom-domain-with-github-pages/&quot;&gt;Setting up a custom domain with GitHub Pages - User Documentation&lt;/a&gt;
最后不要忘记在你的ns服务商中设置cname哦&lt;/p&gt;
&lt;h1&gt;拾漏补遗&amp;amp;技巧&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;\scaffolds\post.md&lt;/code&gt;进行修改，可以更改默认发布模板
例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;title: {{ title }}
published: {{ date }}
tags: 
  - Uncategorized
description: 
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pacman 主题启用公式高亮
要在pacman的_config.yml中最后加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;highlight:
  enable: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;p.s.听说pacman还不支持3.0(?)&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;p&gt;参见以下作者文章，感谢他们的努力！：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://cnfeat.com/2014/05/10/2014-05-11-how-to-build-a-blog/&quot;&gt;如何搭建一个独立博客——简明Github Pages与Hexo教程&lt;/a&gt;
&lt;a href=&quot;http://yangjian.me/workspace/introducing-pacman-theme/&quot;&gt;Pacman主题介绍&lt;/a&gt;
&lt;a href=&quot;http://wuchong.me/blog/2014/11/20/how-to-use-jacman/&quot;&gt;如何使用 Jacman 主题&lt;/a&gt;
&lt;a href=&quot;http://hexo.io/docs/migration.html&quot;&gt;Migration | Hexo&lt;/a&gt;
&lt;a href=&quot;http://hexo.io/zh-cn/docs/permalinks.html&quot;&gt;Permalinks | Hexo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>给github pages上ssl(hexo可用)</title><link>https://blog.xingoxu.com/2015/04/github-pages-ssl/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/github-pages-ssl/</guid><description>github pages已经支持https，可惜不支持自定义证书
我们可以用cloudflare cdn加速，顺便还能上他新推出的flexible ssl

</description><pubDate>Fri, 17 Apr 2015 03:01:59 GMT</pubDate><content:encoded>&lt;p&gt;github pages已经支持https，可惜不支持自定义证书
我们可以用cloudflare cdn加速，顺便还能上他新推出的flexible ssl&lt;/p&gt;

&lt;h1&gt;Getting Started&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Sign up for Cloudflare if you don’t already have an account&lt;/li&gt;
&lt;li&gt;Add your website, and make sure all automatically generated records match those on your registrar’s website&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;If you already have a gh-pages website and are simply moving to https, you don’t need to do anything else
If not, and are trying to set up your site at apex, create an A record pointing to Github’s IP addresses, else a CNAME pointing to your-username.github.io
Make sure there’s a CNAME file at the root of your gh-pages repo with your domain name&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Domain Registrar’s website and change the Domain Name Servers to those Cloudflare provides you with&lt;/li&gt;
&lt;li&gt;Finish Setting up your Domain on Cloudflare and go to the Domain Dashboard&lt;/li&gt;
&lt;li&gt;Open the “Cloudflare Settings” for your domain, and change the SSL Setting to “Flexible SSL”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;等待一个小时左右，Cloudflare就会为你的网站配上证书了&lt;/p&gt;
&lt;h1&gt;强制网页跳转https&lt;/h1&gt;
&lt;p&gt;在头代码中加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;canonical&quot; href=&quot;&amp;lt;%- page.permalink %&amp;gt;&quot;&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
       var host = &quot;blog.xingoxu.com&quot;;
       if ((host == window.location.host) &amp;amp;&amp;amp; (window.location.protocol != &quot;https:&quot;))
           window.location.protocol = &quot;https&quot;;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Letting Search Engine know&lt;/h1&gt;
&lt;p&gt;Add these following in &lt;code&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;url: https://www.yoursite.com   # with the https protocol
enforce_ssl: www.yoursite.com   # without any protocol
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Caution&lt;/h1&gt;
&lt;p&gt;CloudFlare提供的SSL服务是基于SNI技术的，也就是说，机子上是IE8及以下用户完全无法打开（Chrome使用证书为系统，所以在win7下IE8的Chrome浏览器也是无法打开的，无论版本），注意了&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://sheharyar.me/blog/free-ssl-for-github-pages-with-custom-domains/&quot;&gt;Set Up SSL on Github Pages With Custom Domains for Free&lt;/a&gt;
&lt;a href=&quot;http://hexo.io/docs/variables.html&quot;&gt;Variables | Hexo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Hello World</title><link>https://blog.xingoxu.com/2015/04/hello-world/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/04/hello-world/</guid><pubDate>Mon, 06 Apr 2015 09:50:15 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to &lt;a href=&quot;http://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;http://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for more info. If you get any problems when using Hexo, you can find the answer in &lt;a href=&quot;http://hexo.io/docs/troubleshooting.html&quot;&gt;troubleshooting&lt;/a&gt; or you can ask me on &lt;a href=&quot;https://github.com/hexojs/hexo/issues&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quick Start&lt;/h2&gt;
&lt;h3&gt;Create a new post&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ hexo new &quot;My New Post&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&quot;http://hexo.io/docs/writing.html&quot;&gt;Writing&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Run server&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&quot;http://hexo.io/docs/server.html&quot;&gt;Server&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Generate static files&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ hexo generate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&quot;http://hexo.io/docs/generating.html&quot;&gt;Generating&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Deploy to remote sites&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ hexo deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&quot;http://hexo.io/docs/deployment.html&quot;&gt;Deployment&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>openwrt 挂载硬盘以及迅雷下载</title><link>https://blog.xingoxu.com/2015/03/openwrt-mount-harddisk-and-thunder-download/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/03/openwrt-mount-harddisk-and-thunder-download/</guid><pubDate>Tue, 03 Mar 2015 03:27:12 GMT</pubDate><content:encoded>&lt;p&gt;迅雷下载模块：
http://www.right.com.cn/forum/thread-157967-1-1.html&lt;/p&gt;
&lt;p&gt;luci界面：
http://www.right.com.cn/forum/thread-135833-1-1.html&lt;/p&gt;
&lt;p&gt;samba共享：&lt;/p&gt;
&lt;p&gt;http://www.right.com.cn/forum/thread-151546-1-1.html&lt;/p&gt;
&lt;p&gt;opkg update
opkg install luci-app-samba&lt;/p&gt;
&lt;p&gt;修改/etc/config/samba
增加以下内容：&lt;/p&gt;
&lt;p&gt;config sambashare
option ‘name’ ‘share’
option ‘path’ ‘/mnt’
option ‘read_only’ ‘no’
option ‘guest_ok’ ‘no’
option ‘create_mask’ ‘0700’
option ‘dir_mask’ ‘0700’&lt;/p&gt;
&lt;p&gt;修改/etc/samba/smb.conf.template&lt;/p&gt;
&lt;p&gt;guest ok = no
invalid users = root&lt;/p&gt;
&lt;p&gt;修改后执行命令：
/etc/init.d/samba start&lt;/p&gt;
&lt;p&gt;samba添加用户：&lt;/p&gt;
&lt;p&gt;smbpasswd -a root
设置密码&lt;/p&gt;
&lt;p&gt;挂载硬盘：&lt;/p&gt;
&lt;p&gt;opkg install以下包&lt;/p&gt;
&lt;p&gt;kmod-usb-storage
kmod-usb-storage-extras 可选
block-mount
kmod-fs-ext4
kmod-fs-ntfs 只读不可写&lt;/p&gt;
&lt;p&gt;插入记得挂载，putty 命令
mount /dev/sda(x) /mnt/sda(x)
卸载umount /dev/sda(x)&lt;/p&gt;
&lt;p&gt;迅雷离线教程：
http://www.right.com.cn/forum/thread-115029-1-1.html
https://chrome.google.com/webstore/detail/thunderlixianassistant/eehlmkfpnagoieibahhcghphdbjcdmen&lt;/p&gt;
</content:encoded></item><item><title>自用WNDR4300搭建ss+chnroute满足需求</title><link>https://blog.xingoxu.com/2015/03/wndr4300-setup-log/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/03/wndr4300-setup-log/</guid><pubDate>Mon, 02 Mar 2015 03:27:23 GMT</pubDate><content:encoded>&lt;p&gt;dnsmasq仍旧生效，效果很好&lt;/p&gt;
&lt;p&gt;原文章来自：http://bilibi.li/2015/02/22/how-to-setup-shadowsocks-and-chinadns-in-openwrt-on-wndr4300/&lt;/p&gt;
&lt;p&gt;https://cokebar.info/archives/664&lt;/p&gt;
&lt;p&gt;原文已经基本阐述完整，就不再重复书写&lt;/p&gt;
</content:encoded></item><item><title>Android 网卡（主机）显示名更改</title><link>https://blog.xingoxu.com/2015/03/android-hostname-change/</link><guid isPermaLink="true">https://blog.xingoxu.com/2015/03/android-hostname-change/</guid><description>逼格更高，路由器里显示手机名字2333333

</description><pubDate>Mon, 02 Mar 2015 01:45:17 GMT</pubDate><content:encoded>&lt;p&gt;逼格更高，路由器里显示手机名字2333333&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;使用R.E.管理器，找到/system/build.prop文件，使用文本编辑器打开，在最后一行添加下面一行内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;net.hostname=yourname&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;重新启动手机&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录到无线路由，看看dhcp的客户端列表是不是已经变了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意！中间绝对不能有空格！可以有下划线和中横线&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>