<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Kuiki's Experience]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://blog.kuiki.cn/</link><image><url>http://blog.kuiki.cn/favicon.png</url><title>Kuiki&apos;s Experience</title><link>https://blog.kuiki.cn/</link></image><generator>Ghost 3.21</generator><lastBuildDate>Tue, 17 Mar 2026 04:12:29 GMT</lastBuildDate><atom:link href="https://blog.kuiki.cn/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[nextcloud经由nginx_proxy时max_size的问题]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在我自己搭建的nextcloud中，我碰到了过大的文件无法上传的问题，我的nextcloud是搭建在nginx_proxy后方的，因为无法上传的文件大小大约为2m，和nginx的default client_max_body_size很相似，所以我非常有理由怀疑，是因为nginx的这个参数影响了上传<br>
因为我太懒了，一直没去研究，最近在群里一问，张师傅直接给出了解决方案<br>
在nginx_proxy中把vhost引出来，然后在对应域名的vhost中加入这个参数，并加入自己的配置，虽然这样有耦合了，不过至少解决问题了<br>
在nginx_proxy添加对应的env配置项之前，也只能这样了</p>
<p>以下是配置详情</p>
<ul>
<li>nginx_proxy docker-compose.yml</li>
</ul>
<pre><code class="language-docker-compose">version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.</code></pre>]]></description><link>https://blog.kuiki.cn/nextcloud-nginx_proxy-max_body/</link><guid isPermaLink="false">5c19f39315bb220001143296</guid><category><![CDATA[Docker]]></category><category><![CDATA[NginxProxy]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Wed, 19 Dec 2018 07:40:14 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在我自己搭建的nextcloud中，我碰到了过大的文件无法上传的问题，我的nextcloud是搭建在nginx_proxy后方的，因为无法上传的文件大小大约为2m，和nginx的default client_max_body_size很相似，所以我非常有理由怀疑，是因为nginx的这个参数影响了上传<br>
因为我太懒了，一直没去研究，最近在群里一问，张师傅直接给出了解决方案<br>
在nginx_proxy中把vhost引出来，然后在对应域名的vhost中加入这个参数，并加入自己的配置，虽然这样有耦合了，不过至少解决问题了<br>
在nginx_proxy添加对应的env配置项之前，也只能这样了</p>
<p>以下是配置详情</p>
<ul>
<li>nginx_proxy docker-compose.yml</li>
</ul>
<pre><code class="language-docker-compose">version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - ./nginx/vhost.d:/etc/nginx/vhost.d
      - ./nginx/html:/usr/share/nginx/html
    ports:
      - 80:80
      - 443:443
    network_mode: bridge
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
      - ./nginx/vhost.d:/etc/nginx/vhost.d
      - ./nginx/html:/usr/share/nginx/html
    network_mode: bridge
</code></pre>
<p>./nginx/vhost.d/nextcloud.kuiki.cn_location</p>
<pre><code class="language-nginx">client_max_body_size 1024M;
</code></pre>
<p>如此以来，nextcloud.kuiki.cn的client_max_body_size便被设置到了1G</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[joystick for pmgo]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>宝可梦Lets Go要发售了，发售前不如来玩玩pmgo<br>
不过pmgo毕竟在大陆锁区，那我们如何在大陆玩到pmgo呢？<br>
首先要解决网络问题，pmgo必须使用vpn，并且必须是pmgo发售地区的vpn才可以，所以搭个梯子是必不可少的<br>
怎么搭梯子就不讨论了<br>
搭好梯子后，可以登录pmgo了，却发现登录进来周围一个Pokemon都没有，因为pmgo锁区，大陆是不会刷出Pokemon的<br>
所以我们还需要针对定位进行欺骗<br>
安卓新版本系统中封堵了不少以前能用的虚拟定位的方法，经过网上各种查阅，总结出一个能在2018年11约使用的摇杆虚拟定位方法，搭配Pokemon简直不能更完美了</p>
<p>当前使用设备系统环境如下：<br>
手机：小米4 联通3G版<br>
系统：LineageOS 14.1 （20181107）<br>
安卓版本：7.1.2<br>
安卓安全补丁级别：2018年10月5日</p>
<p>大概思路如下：<br>
使用Magisk获取root权限并且不让pmgo检测到<br>
使用gps Joystick来模拟定位<br>
说起来很简单，做起来还是有点麻烦的</p>
<p>首先安装Magisk，安装步骤自行Google<br>
我安装的版本为17.1（with 6.0.1 manager）</p>]]></description><link>https://blog.kuiki.cn/joystick-for-pmgo/</link><guid isPermaLink="false">5becde163e971e0001554e57</guid><category><![CDATA[Game]]></category><category><![CDATA[Pokemon]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Thu, 15 Nov 2018 03:11:37 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>宝可梦Lets Go要发售了，发售前不如来玩玩pmgo<br>
不过pmgo毕竟在大陆锁区，那我们如何在大陆玩到pmgo呢？<br>
首先要解决网络问题，pmgo必须使用vpn，并且必须是pmgo发售地区的vpn才可以，所以搭个梯子是必不可少的<br>
怎么搭梯子就不讨论了<br>
搭好梯子后，可以登录pmgo了，却发现登录进来周围一个Pokemon都没有，因为pmgo锁区，大陆是不会刷出Pokemon的<br>
所以我们还需要针对定位进行欺骗<br>
安卓新版本系统中封堵了不少以前能用的虚拟定位的方法，经过网上各种查阅，总结出一个能在2018年11约使用的摇杆虚拟定位方法，搭配Pokemon简直不能更完美了</p>
<p>当前使用设备系统环境如下：<br>
手机：小米4 联通3G版<br>
系统：LineageOS 14.1 （20181107）<br>
安卓版本：7.1.2<br>
安卓安全补丁级别：2018年10月5日</p>
<p>大概思路如下：<br>
使用Magisk获取root权限并且不让pmgo检测到<br>
使用gps Joystick来模拟定位<br>
说起来很简单，做起来还是有点麻烦的</p>
<p>首先安装Magisk，安装步骤自行Google<br>
我安装的版本为17.1（with 6.0.1 manager）<br>
安装好后，在magisk hide中勾选pmgo，并且在magisk设置中隐藏Magisk Manager<br>
安装gps Joystick，并且启用隐私模式来隐藏自己，并卸载原程序<br>
安装一个能将app切换到system分区的app，例如幸运破解器、Link2SD之类的，然后将gps Joystick移动到system分区，以便关闭系统的定位服务<br>
在gps joystick中进入设置，开启「禁用位置服务」选项<br>
重启<br>
然后就可以在gps joystick中操作gps位置了</p>
<p>PS: 安装Magisk是为了给Link2SD授权root权限来将gps joystick移入system分区，如果你自己可以把joystick移入系统分区，可以不安装Magisk、Link2SD（例如通过recovery、adb root之类的方法</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[解决因字体问题导致xfce4-panel崩溃的问题]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>最近经常要用vnc来远程我的ubuntu server，但是上面的xfce4桌面环境自从装了chromium之后就没有panel了，看日志，报错如下：</p>
<pre><code class="language-log">xfce4-panel: ../../../../src/cairo-scaled-font.c:459: _cairo_scaled_glyph_page_destroy: Assertion `!scaled_font-&gt;cache_frozen' failed.
</code></pre>
<p>可以看出，是字体导致的问题，尝试在xfce4的设置中换了系统的默认设置后，重启vnc，panel终于出来了。<br>
具体设置位置：<br>
右键桌面-&gt;Applications-&gt;Settings-&gt;Appearance-&gt;Fonts<br>
我设置为<strong>Monospace</strong>后重启vnc问题解决</p>
<p>另，为了在xfce下支持中文，可以安装一款中文字体，例如：</p>
<pre><code class="language-bash">sudo apt install fonts-wqy-zenhei
</code></pre>
<p>然后将字体设置为<strong>文泉驿等宽正黑</strong></p>]]></description><link>https://blog.kuiki.cn/fix-fonts-case-xfce4-panel-crash/</link><guid isPermaLink="false">5a6e9eb80cafce0001e40e4b</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[XFCE4]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Mon, 29 Jan 2018 04:24:31 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>最近经常要用vnc来远程我的ubuntu server，但是上面的xfce4桌面环境自从装了chromium之后就没有panel了，看日志，报错如下：</p>
<pre><code class="language-log">xfce4-panel: ../../../../src/cairo-scaled-font.c:459: _cairo_scaled_glyph_page_destroy: Assertion `!scaled_font-&gt;cache_frozen' failed.
</code></pre>
<p>可以看出，是字体导致的问题，尝试在xfce4的设置中换了系统的默认设置后，重启vnc，panel终于出来了。<br>
具体设置位置：<br>
右键桌面-&gt;Applications-&gt;Settings-&gt;Appearance-&gt;Fonts<br>
我设置为<strong>Monospace</strong>后重启vnc问题解决</p>
<p>另，为了在xfce下支持中文，可以安装一款中文字体，例如：</p>
<pre><code class="language-bash">sudo apt install fonts-wqy-zenhei
</code></pre>
<p>然后将字体设置为<strong>文泉驿等宽正黑</strong>，可以解决panel出现中文崩溃的问题</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[创建Macintosh的安装u盘]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>偶尔要创建mac的安装u盘，命令记录一下免得到处找</p>
<pre><code class="language-bash">sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallMacintosh --applicationpath /Applications/Install\ macOS\ High\ Sierra.app --nointeraction
</code></pre>
<p>其中volume参数以及applicationpath参数需要按照实际情况填写</p>
<!--kg-card-end: markdown-->]]></description><link>https://blog.kuiki.cn/create-mac-install-udisk/</link><guid isPermaLink="false">5a65a7be19e6530001b4a548</guid><category><![CDATA[Mac]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Mon, 22 Jan 2018 09:01:47 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>偶尔要创建mac的安装u盘，命令记录一下免得到处找</p>
<pre><code class="language-bash">sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallMacintosh --applicationpath /Applications/Install\ macOS\ High\ Sierra.app --nointeraction
</code></pre>
<p>其中volume参数以及applicationpath参数需要按照实际情况填写</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[批量将文件名从大写改为小写]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>今天妹子叫我帮忙把某个文件夹下所有大些文件名改为小写，之前我写过，不过忘了，网上查了不少资料，自己又尝试了几次，才搞定，为防止以后又忘记，把命令写下来</p>
<pre><code class="language-bash">for file in `find -name \*.JPG -type f`
do
mv $file `echo $file | tr '[A-Z]' '[a-z]'`
done
</code></pre>
<p><strong>PS：此命令遇到文件夹名称非小写会报错，因为会尝试一同从命名文件夹，但是该文件夹又不存在，所以会导致报错，待优化为只修改文件名而忽略路径</strong></p>
<!--kg-card-end: markdown-->]]></description><link>https://blog.kuiki.cn/rename-file-from-upper-to-lower/</link><guid isPermaLink="false">5a539be219e6530001b4a542</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[Shell]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Mon, 08 Jan 2018 16:30:36 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>今天妹子叫我帮忙把某个文件夹下所有大些文件名改为小写，之前我写过，不过忘了，网上查了不少资料，自己又尝试了几次，才搞定，为防止以后又忘记，把命令写下来</p>
<pre><code class="language-bash">for file in `find -name \*.JPG -type f`
do
mv $file `echo $file | tr '[A-Z]' '[a-z]'`
done
</code></pre>
<p><strong>PS：此命令遇到文件夹名称非小写会报错，因为会尝试一同从命名文件夹，但是该文件夹又不存在，所以会导致报错，待优化为只修改文件名而忽略路径</strong></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[VSCode Golang依赖包]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在VSCode中安装Golang语言的依赖<br>
因为GFW的原因，在VSCode中无法好好安装Golang的依赖，所以需要手动go get来安装<br>
所需包如下</p>
<pre><code class="language-Log">go get -u -v github.com/nsf/gocode
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru</code></pre>]]></description><link>https://blog.kuiki.cn/vscode-golang-dependent/</link><guid isPermaLink="false">5a47966419e6530001b4a53d</guid><category><![CDATA[VSCode]]></category><category><![CDATA[Golang]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Sat, 30 Dec 2017 13:50:31 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在VSCode中安装Golang语言的依赖<br>
因为GFW的原因，在VSCode中无法好好安装Golang的依赖，所以需要手动go get来安装<br>
所需包如下</p>
<pre><code class="language-Log">go get -u -v github.com/nsf/gocode
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/derekparker/delve/cmd/dlv
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[grpc连接池]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>从我开始使用grpc到现在，也有不短的一段时间了，然而我还是没有把grpc的基本用法摸透。最近刚好又在看grpc，就来对grpc的连接做个研究</p>
<p>google官方提供的例子中，只有最普通的使用方式：创建连接，访问远程方法，销毁连接<br>
然而在实际项目中，绝不可能如此简单，往往涉及到高并发、高频调用等问题，所以我们就需要考虑到连接性能的问题。<br>
在访问数据库时我们也会碰到类似的瓶颈，在访问量大时，一个连接根本无法满足使用需求，而每次建立新连接的话，很快服务器的可用连接数就会消耗殆尽，所以我们使用连接池来解决这个问题。<br>
这次，我们也要在grpc中尝试使用连接池，来帮助高频客户端提高连接性能。</p>
<hr>
<p>首先，我们来对不同的连接方法能体现出的性能做个测试，测试使用官方的helloworld例子，改成多次调用。<br>
为了测试，我们在以下方面做了改动：<br>
服务端在响应前sleep 1s<br>
客户端通过多种方式重复访问服务端（见表格中描述），来检测性能</p>
<table>
<thead>
<tr>
<th>方法</th>
<th>是否并发</th>
<th>服务端sleep时间</th>
<th>访问数</th>
<th>成功数</th>
<th>失败数</th>
<th>耗费时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>使用同一个grpc连接</td>
<td>是</td>
<td>1s</td>
<td>1000</td>
<td>1000</td>
<td>0</td>
<td>10.015325122s</td></tr></tbody></table>]]></description><link>https://blog.kuiki.cn/grpc-connection-pool/</link><guid isPermaLink="false">5a24fd942f6b3c00019e3ee6</guid><category><![CDATA[Code]]></category><category><![CDATA[GRPC]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Mon, 04 Dec 2017 09:39:56 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>从我开始使用grpc到现在，也有不短的一段时间了，然而我还是没有把grpc的基本用法摸透。最近刚好又在看grpc，就来对grpc的连接做个研究</p>
<p>google官方提供的例子中，只有最普通的使用方式：创建连接，访问远程方法，销毁连接<br>
然而在实际项目中，绝不可能如此简单，往往涉及到高并发、高频调用等问题，所以我们就需要考虑到连接性能的问题。<br>
在访问数据库时我们也会碰到类似的瓶颈，在访问量大时，一个连接根本无法满足使用需求，而每次建立新连接的话，很快服务器的可用连接数就会消耗殆尽，所以我们使用连接池来解决这个问题。<br>
这次，我们也要在grpc中尝试使用连接池，来帮助高频客户端提高连接性能。</p>
<hr>
<p>首先，我们来对不同的连接方法能体现出的性能做个测试，测试使用官方的helloworld例子，改成多次调用。<br>
为了测试，我们在以下方面做了改动：<br>
服务端在响应前sleep 1s<br>
客户端通过多种方式重复访问服务端（见表格中描述），来检测性能</p>
<table>
<thead>
<tr>
<th>方法</th>
<th>是否并发</th>
<th>服务端sleep时间</th>
<th>访问数</th>
<th>成功数</th>
<th>失败数</th>
<th>耗费时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>使用同一个grpc连接</td>
<td>是</td>
<td>1s</td>
<td>1000</td>
<td>1000</td>
<td>0</td>
<td>10.015325122s</td>
</tr>
<tr>
<td>使用同一个grpc连接</td>
<td>是</td>
<td>1s</td>
<td>10000</td>
<td>10000</td>
<td>0</td>
<td>100.131993775s</td>
</tr>
<tr>
<td>使用同一个grpc连接</td>
<td>是</td>
<td>0s</td>
<td>1000</td>
<td>1000</td>
<td>0</td>
<td>24.081929ms</td>
</tr>
<tr>
<td>使用同一个grpc连接</td>
<td>是</td>
<td>0s</td>
<td>10000</td>
<td>10000</td>
<td>0</td>
<td>279.445219ms</td>
</tr>
<tr>
<td>每次创建grpc连接</td>
<td>是</td>
<td>0s</td>
<td>10000</td>
<td>3990</td>
<td>6010</td>
<td>1.923255655s</td>
</tr>
<tr>
<td>每次创建grpc连接</td>
<td>否</td>
<td>0s</td>
<td>10000</td>
<td>5377</td>
<td>4623</td>
<td>2.411625408s</td>
</tr>
<tr>
<td>使用三方连接池</td>
<td>是</td>
<td>0s</td>
<td>10000</td>
<td>3148</td>
<td>6852</td>
<td>1.820526703s</td>
</tr>
</tbody>
</table>
<p>从第一条数据上看，我推测，grpc本身应该是实现了连接池的，否则这里的耗费时间应当是1000s以上，而只花费了10s，我推测grpc自带的连接池默认是100并发的<br>
通过监控tcp连接数，还发现grpc自身实现的连接池，只会产生一个tcp连接，也许不应该叫他连接池，而应该称之为允许并发数更好</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[解决switch无法联机的问题]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>最近买了switch，但是switch一直无法联机<br>
经过查询，很多帖子都指向一个问题：<strong>NET Type</strong><br>
先来科普一下NET Type（我自己理解的也不深，不一定完全准确）<br>
说到NET Type，就要先来说一下NET（网络地址转换）技术<br>
我们都知道，ipv4资源是几十年前就开始使用的东西了，当时也没有考虑到未来会有如此多的网络设备，ipv4资源有限，根本无法满足所有网络设备每台都配备一个网络地址的能力，于是NET技术应运而生。NET技术是让一台设备A介入英特网，然后设备B、C、D通过介入这台设备A来接入因特网，设备B、C、D不直接接入英特网，而靠设备A来转发网络请求，这样就能多台设备共用一个ipv4地址上网了（只有设备A有英特网上的ipv4地址，也叫公网地址）<br>
而国内由于进入互联网时代进入的晚，我国拿到的ipv4资源就更短缺，为了满足十几亿人的上网需求，NET技术在我国是应用最为广泛的。<br>
而在我公司内，更是有这多打3-4层的网络地址转换，在switch的NET Type评级中为C、D的等级，完全无法联机打游戏。</p>
<p>为什么能从eshop下游戏而无法联机打游戏呢？这又要说到switch的联机方式了。为了减轻服务器负担，switch的联机方式不是以任天堂服务器为中心进行游戏数据交换的，而是仅仅以任天堂服务器为中心，组成一个星形网络进行匹配数据交换与心跳检测，然后所有switch两两连接，组成一个环形网络交换游戏数据，</p>]]></description><link>https://blog.kuiki.cn/resolve-switch-online-game-issue/</link><guid isPermaLink="false">5a14dc8fb32feb00017225fb</guid><category><![CDATA[NintendoSwitch]]></category><category><![CDATA[VPN]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Wed, 22 Nov 2017 08:42:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>最近买了switch，但是switch一直无法联机<br>
经过查询，很多帖子都指向一个问题：<strong>NET Type</strong><br>
先来科普一下NET Type（我自己理解的也不深，不一定完全准确）<br>
说到NET Type，就要先来说一下NET（网络地址转换）技术<br>
我们都知道，ipv4资源是几十年前就开始使用的东西了，当时也没有考虑到未来会有如此多的网络设备，ipv4资源有限，根本无法满足所有网络设备每台都配备一个网络地址的能力，于是NET技术应运而生。NET技术是让一台设备A介入英特网，然后设备B、C、D通过介入这台设备A来接入因特网，设备B、C、D不直接接入英特网，而靠设备A来转发网络请求，这样就能多台设备共用一个ipv4地址上网了（只有设备A有英特网上的ipv4地址，也叫公网地址）<br>
而国内由于进入互联网时代进入的晚，我国拿到的ipv4资源就更短缺，为了满足十几亿人的上网需求，NET技术在我国是应用最为广泛的。<br>
而在我公司内，更是有这多打3-4层的网络地址转换，在switch的NET Type评级中为C、D的等级，完全无法联机打游戏。</p>
<p>为什么能从eshop下游戏而无法联机打游戏呢？这又要说到switch的联机方式了。为了减轻服务器负担，switch的联机方式不是以任天堂服务器为中心进行游戏数据交换的，而是仅仅以任天堂服务器为中心，组成一个星形网络进行匹配数据交换与心跳检测，然后所有switch两两连接，组成一个环形网络交换游戏数据，每台switch在任天堂服务器的帮助下与其他switch建立p2p连接，这时就需要switch能被别的switch访问到。在别的国家ipv4资源不那么短缺的话，一般NET层数只有一层，switch可以很轻松的通过upnp开启一条与别的switch连接的通道，但国内运营商层层NET，加上网络环境差，就导致了某些地方的网络无法让switch与其他switch建立p2p连接，于是就出现了明明能上网能下游戏，游戏的联网大厅也能进，但是就是无法和别的玩家联机的情况了。</p>
<p>为了解决这个问题，我们就需要提升我们的NET等级，而我所知道的，vpn技术就能实现这一点。（PS：强调一下，请合理运用vpn，不要用来做一些违法的事情）。通过vpn，我们可以将我们的设备连接到一个有公网ipv4的主机下，然后就只有一层网络地址转换（NET Type为B），这时就可以愉快的享受联机游戏了。</p>
<hr>
<p>下面是搭建pptp协议vpn的方法</p>
<p>首先我们需要一台有公网IP的电脑作为服务器，如果你自己家里电脑符合要求，就使用自己家里的电脑，我选择用阿里云的服务器来做这件事。为了降低延迟，我们需要选择与自己地理位置最近的服务器，我选择的是华南1的服务器（请选择国内的服务器，国外的服务器搭的vpn是不能在国内使用的）<br>
出于方便，选用docker技术来搭建pptp服务器<br>
安装docker的教程请自己查</p>
<p>docker镜像选用mobtitude/vpn-pptp镜像<br>
docker-compose.yml文件如下</p>
<pre><code class="language-docker-compose">version: '3'

services:
  pptp:
    image: mobtitude/vpn-pptp
    container_name: pptp_server
    privileged: true
    network_mode: host
    volumes:
      - ./secrets:/etc/ppp/chap-secrets
</code></pre>
<p>然后同目录下还应当有一个secrets文件记录用户信息，内容如下</p>
<pre><code># Secrets for authentication using PAP
# client    server      secret      acceptable local IP addresses
yourName    *           yourPass    *
</code></pre>
<p>然后运行<code>docker-compose up -d</code>即可<br>
但是由于此docker镜像可能过旧？搭好后的pptp服务器处于能连接但是无法上网的状态，通过查看这个项目的issue，发现早已有人给出<a href="https://github.com/mobtitude/docker-vpn-pptp/issues/16">解决方案</a><br>
我们只需在这个容器中再运行以下命令即可</p>
<pre><code class="language-bash">iptables -A INPUT -i ppp0 -j ACCEPT
iptables -A OUTPUT -o ppp0 -j ACCEPT
iptables -A FORWARD -i ppp0 -j ACCEPT
iptables -A FORWARD -o ppp0 -j ACCEPT
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[新服务器安装常用环境脚本]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>偶尔要在新服务器安装常用环境，整理以下脚本备用</p>
<pre><code class="language-bash"># OS: Ubuntu 16.04 x64 server
apt update
apt install -y zsh git vim curl python3-pip exuberant-ctags cmake gcc g++ \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
# oh-my-zsh
sh -c &quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&quot;
# evervim
curl -sLf https://raw.githubusercontent.com/</code></pre>]]></description><link>https://blog.kuiki.cn/new-server-setup-script/</link><guid isPermaLink="false">5a010d0734dc200001801f4c</guid><category><![CDATA[UbuntuServer]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Tue, 07 Nov 2017 02:49:19 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>偶尔要在新服务器安装常用环境，整理以下脚本备用</p>
<pre><code class="language-bash"># OS: Ubuntu 16.04 x64 server
apt update
apt install -y zsh git vim curl python3-pip exuberant-ctags cmake gcc g++ \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
# oh-my-zsh
sh -c &quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&quot;
# evervim
curl -sLf https://raw.githubusercontent.com/LER0ever/EverVim/master/Boot-EverVim.sh | bash
# docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository \
   &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable&quot;
apt update
apt install -y docker-ce
# docker-compose
curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在macOS high Sierra上安装Office2016的注意事项]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>新装了系统之后，用之前skys给我分享的Office2016安装包(md5:da19a8d901b369b3dd9fa01bf901f02a)装好后发现无法自动更新，Outlook提示无法在high Sierra上运行</p>
<p>此镜像是一个较旧版本的Office2016批量授权免激活镜像，内含的Office2016为15.13.3版#<br>
已知无法正常运行的功能有：</p>
<ul>
<li>Microsoft AutoUpdate(MAU);影响：Office无法升级</li>
<li>Outlook因版本过旧无法启动</li>
</ul>
<hr>
<h2 id>解决办法：</h2>
<p>手动下载新版MAU安装后即可自动升级，升级到15.35之后功能就正常了<br>
地址：<a href="https://support.office.com/en-us/article/Update-history-for-Office-2016-for-Mac-700cab62-0d67-4f23-947b-3686cb1a8eb7#bkmk_mau">Microsoft AutoUpdate</a><br>
<strong>ISSUE: 因MAU只检测启动过的Office程序的更新，所以Outlook无法通过MAU升级</strong></p>
<p>解决Outlook无法使用的方法：<br>
手动下载新版Outlook单独安装后即可<br>
地址：<a href="https://support.office.com/zh-cn/article/Office-2016-for-Mac-%E7%9A%84%E5%8F%91%E8%A1%8C%E8%AF%B4%E6%98%8E-ed2da564-6d53-4542-9954-7e3209681a41?ui=zh-CN&amp;rs=zh-CN&amp;ad=CN">Office2016 Update</a></p>
<hr>
<!--kg-card-end: markdown-->]]></description><link>https://blog.kuiki.cn/install-office2016-at-macos-high-sierra/</link><guid isPermaLink="false">59f9247434dc200001801f46</guid><category><![CDATA[Mac]]></category><category><![CDATA[Office]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Wed, 01 Nov 2017 01:49:08 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>新装了系统之后，用之前skys给我分享的Office2016安装包(md5:da19a8d901b369b3dd9fa01bf901f02a)装好后发现无法自动更新，Outlook提示无法在high Sierra上运行</p>
<p>此镜像是一个较旧版本的Office2016批量授权免激活镜像，内含的Office2016为15.13.3版#<br>
已知无法正常运行的功能有：</p>
<ul>
<li>Microsoft AutoUpdate(MAU);影响：Office无法升级</li>
<li>Outlook因版本过旧无法启动</li>
</ul>
<hr>
<h2 id>解决办法：</h2>
<p>手动下载新版MAU安装后即可自动升级，升级到15.35之后功能就正常了<br>
地址：<a href="https://support.office.com/en-us/article/Update-history-for-Office-2016-for-Mac-700cab62-0d67-4f23-947b-3686cb1a8eb7#bkmk_mau">Microsoft AutoUpdate</a><br>
<strong>ISSUE: 因MAU只检测启动过的Office程序的更新，所以Outlook无法通过MAU升级</strong></p>
<p>解决Outlook无法使用的方法：<br>
手动下载新版Outlook单独安装后即可<br>
地址：<a href="https://support.office.com/zh-cn/article/Office-2016-for-Mac-%E7%9A%84%E5%8F%91%E8%A1%8C%E8%AF%B4%E6%98%8E-ed2da564-6d53-4542-9954-7e3209681a41?ui=zh-CN&amp;rs=zh-CN&amp;ad=CN">Office2016 Update</a></p>
<hr>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在Evervim中安装wakatime插件]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在evervim中，插件由evervim来管理，用户bundle文件为**~/.EverVim.bundles**,我们只需要将我们需要的插件<strong>wakatime/vim-wakatime</strong>写入这个文件即可</p>
<pre><code class="language-bash">echo Plug \'wakatime/vim-wakatime\' &gt;&gt; ~/.EverVim.bundles

# vim Plug Update
vim :PluginUpdate
</code></pre>
<p>更新：<br>
可能是由于evervim更新，现在还需要在.Evervim.vimrc中添加如下语句才可以读取额外的bundles文件</p>
<pre><code class="language-vimrc">let g:override_evervim_bundles = 1
</code></pre>
<!--kg-card-end: markdown-->]]></description><link>https://blog.kuiki.cn/install-wakatime-for-evervim/</link><guid isPermaLink="false">59f198d034dc200001801f41</guid><category><![CDATA[Vim]]></category><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Thu, 26 Oct 2017 08:15:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在evervim中，插件由evervim来管理，用户bundle文件为**~/.EverVim.bundles**,我们只需要将我们需要的插件<strong>wakatime/vim-wakatime</strong>写入这个文件即可</p>
<pre><code class="language-bash">echo Plug \'wakatime/vim-wakatime\' &gt;&gt; ~/.EverVim.bundles

# vim Plug Update
vim :PluginUpdate
</code></pre>
<p>更新：<br>
可能是由于evervim更新，现在还需要在.Evervim.vimrc中添加如下语句才可以读取额外的bundles文件</p>
<pre><code class="language-vimrc">let g:override_evervim_bundles = 1
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在kvm上安装FreeNas]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>KVM是Linux下的非常方便好用、可以使用终端控制的虚拟机平台，在Linux下可以发挥非常不错的效能。我最近又在纠结nas，想要一个方便好用的nas，但是nas系统基本都是以操作系统的方式提供的，而我又没钱买那么多机器，所以虚拟机是一个不错的解决方案。</p>
<p>前置步骤：</p>
<ul>
<li>安装kvm虚拟机平台</li>
<li>下载FreeNas镜像</li>
</ul>
<p>首先进入kvm host的终端，使用以下命令来创建一台kvm虚拟机</p>
<pre><code class="language-bash">virt-install --name freenas --memory 4096 --vcpus sockets=1,cores=2,threads=2 --disk device=cdrom,path=/kvm/iso/FreeNAS-11.0-U4.iso --disk path=/kvm/images/freenas.img,size=10,bus=virtio --disk path=/kvm/images/freenas_</code></pre>]]></description><link>https://blog.kuiki.cn/install-freenas-at-kvm/</link><guid isPermaLink="false">59eff17634dc200001801f2b</guid><category><![CDATA[UbuntuServer]]></category><category><![CDATA[FreeNas]]></category><category><![CDATA[Nas]]></category><category><![CDATA[KVM]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Wed, 25 Oct 2017 02:34:05 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>KVM是Linux下的非常方便好用、可以使用终端控制的虚拟机平台，在Linux下可以发挥非常不错的效能。我最近又在纠结nas，想要一个方便好用的nas，但是nas系统基本都是以操作系统的方式提供的，而我又没钱买那么多机器，所以虚拟机是一个不错的解决方案。</p>
<p>前置步骤：</p>
<ul>
<li>安装kvm虚拟机平台</li>
<li>下载FreeNas镜像</li>
</ul>
<p>首先进入kvm host的终端，使用以下命令来创建一台kvm虚拟机</p>
<pre><code class="language-bash">virt-install --name freenas --memory 4096 --vcpus sockets=1,cores=2,threads=2 --disk device=cdrom,path=/kvm/iso/FreeNAS-11.0-U4.iso --disk path=/kvm/images/freenas.img,size=10,bus=virtio --disk path=/kvm/images/freenas_1.img,size=50,bus=virtio --disk path=/kvm/images/freenas_2.img,size=50,bus=virtio --network bridge=br0,model=virtio --noautoconsole --accelerate --hvm --graphics vnc,listen=0.0.0.0,port=20006 --video vga --input tablet,bus=usb
</code></pre>
<p><strong>注，以上参数请更具实际需要修改，以上参数主要设置了以下信息</strong></p>
<ul>
<li>cpu: 1颗双核双线程处理器（共4逻辑处理器）</li>
<li>cdrom 请改为自己下载的freenas镜像的路径</li>
<li>disk 本例子中共创建了3块磁盘（一块系统盘10G，2块数据盘各50G，需要注意的是系统盘不能用来存数据）</li>
<li>网络 桥接到br0接口（请自己用ifconfig看自己机子里网桥的名字叫什么）</li>
<li>graphics 一个vnc图形显示器，端口20006</li>
<li>video 一个vga显示器</li>
</ul>
<p>运行时记得看返回，如果有报错就针对报错信息来改你的参数<br>
创建好之后，在virt-manager中应当也能看到这台虚拟机了，然后用virt-manager还是vnc来安装就随你了，装完后记得卸载光驱，然后启动即可</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在Mac下管理KVM虚拟机]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>kvm虚拟机的管理客户端virt-manager只提供了linux端，这就给我这个用mac的人带来了困扰。不过既然是linux平台下的软件，那就一定有跨平台解决方案。</p>
<p>一开始我选择的方案是vnc到kvm host，然后在kvm host安装virt-manager，然后来管理。然而管理虽然是可以管理了，但是我发现它却无法远程操作，在远程操作虚拟机时所有键盘操作都无法正确的被转发。<br>
上网爬了下解决方案，意外发现原来kvm的虚拟机是可以直接通过vnc协议连接的，那事情就简单了，我们进入kvm虚拟机的配置，添加一个Graphics设备，Type我们选VNC Server，Address选All Interfaces（其实就是监听0.0.0.0），可以指定一个Ports，最好指定密码（在我这不指定密码无法连接），然后就用VNC Client连接即可。<br>
需要管理虚拟机硬件的时候，就用vnc连接到kvm host然后在用virt-manager就可以，当然你也可以选择在终端使用virsh来管理，显得更有逼格一些，不过我刚接触，还是先用图形化界面熟悉下比较好😄</p>
<!--kg-card-end: markdown-->]]></description><link>https://blog.kuiki.cn/connect-to-kvm-at-mac/</link><guid isPermaLink="false">59eff29634dc200001801f2c</guid><category><![CDATA[Mac]]></category><category><![CDATA[VNC]]></category><category><![CDATA[KVM]]></category><category><![CDATA[Virtual]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Wed, 25 Oct 2017 02:18:57 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>kvm虚拟机的管理客户端virt-manager只提供了linux端，这就给我这个用mac的人带来了困扰。不过既然是linux平台下的软件，那就一定有跨平台解决方案。</p>
<p>一开始我选择的方案是vnc到kvm host，然后在kvm host安装virt-manager，然后来管理。然而管理虽然是可以管理了，但是我发现它却无法远程操作，在远程操作虚拟机时所有键盘操作都无法正确的被转发。<br>
上网爬了下解决方案，意外发现原来kvm的虚拟机是可以直接通过vnc协议连接的，那事情就简单了，我们进入kvm虚拟机的配置，添加一个Graphics设备，Type我们选VNC Server，Address选All Interfaces（其实就是监听0.0.0.0），可以指定一个Ports，最好指定密码（在我这不指定密码无法连接），然后就用VNC Client连接即可。<br>
需要管理虚拟机硬件的时候，就用vnc连接到kvm host然后在用virt-manager就可以，当然你也可以选择在终端使用virsh来管理，显得更有逼格一些，不过我刚接触，还是先用图形化界面熟悉下比较好😄</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[修复apt NO_PUBPEY错误]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>今天在安装open media vault时，选择在debian基础上安装的方式，在添加OMV的apt source之后碰到如下错误</p>
<pre><code class="language-error">W: GPG error: http://packages.openmediavault.org/public kralizec InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7E7A6C592EF35D13
W: The repository 'http://packages.openmediavault.org/public kralizec InRelease' is not signed.
N: Data from such a</code></pre>]]></description><link>https://blog.kuiki.cn/fix-apt-no-pubkey-issue/</link><guid isPermaLink="false">59ef374534dc200001801f27</guid><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Tue, 24 Oct 2017 13:05:42 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>今天在安装open media vault时，选择在debian基础上安装的方式，在添加OMV的apt source之后碰到如下错误</p>
<pre><code class="language-error">W: GPG error: http://packages.openmediavault.org/public kralizec InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7E7A6C592EF35D13
W: The repository 'http://packages.openmediavault.org/public kralizec InRelease' is not signed.
N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
N: See apt-secure(8) manpage for repository creation and user configuration details.
</code></pre>
<p>意思是这个安装源的公钥不存在，无法验证该安装源。然而OMV官方并未提供该安装源的公钥。但是在提示中我们知道该公钥指纹为<strong>7E7A6C592EF35D13</strong>，所以我们可以通过以下命令从ubuntu的公钥服务器中获取该公钥：</p>
<pre><code class="language-bash">apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7E7A6C592EF35D13
</code></pre>
<p>之后再运行apt-get update不会再报NO_PUBKEY的错误了</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[use vscode via vnc]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在vnc server中打开vscode时(ubuntu17.04 + xfce4 + vnc4server + vscode deb version)，会发现点了图标无效果，查看vnc日志，得到以下错误：</p>
<pre><code class="language-log">Xlib:  extension &quot;XInputExtension&quot; missing on display &quot;:1.0&quot;.
</code></pre>
<p>经过查询，获得以下解决方案：</p>
<pre><code class="language-bash">sudo cp /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0 /usr/share/code/libxcb.so.1
sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/'</code></pre>]]></description><link>https://blog.kuiki.cn/use-vscode-via-vnc/</link><guid isPermaLink="false">59e23619d8b575000154ec28</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[VNC]]></category><category><![CDATA[VSCode]]></category><dc:creator><![CDATA[Kuiki]]></dc:creator><pubDate>Sat, 14 Oct 2017 16:09:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在vnc server中打开vscode时(ubuntu17.04 + xfce4 + vnc4server + vscode deb version)，会发现点了图标无效果，查看vnc日志，得到以下错误：</p>
<pre><code class="language-log">Xlib:  extension &quot;XInputExtension&quot; missing on display &quot;:1.0&quot;.
</code></pre>
<p>经过查询，获得以下解决方案：</p>
<pre><code class="language-bash">sudo cp /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0 /usr/share/code/libxcb.so.1
sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/' /usr/share/code/libxcb.so.1
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>