K

Kenvix's Blog

一条业余写代码的咸鱼的博客

实现带有Nvidia GPU+Rootless Podman+Docker+Systemd+自动驱动注入支持的systemd nspawn容器

<p>在AI计算集群等场景中,系统级容器的稳定部署、GPU资源高效透传及多容器运行时兼容是核心需求,传统容器方案要么无法良好支持systemd服务管理,要么GPU透传配置复杂、需在容器内重复安装驱动,且难以兼顾Rootless Podman与Docker的二级容器运行需求。本文针对这一现状,详细阐述一套集成Nvidia GPU透传、自动驱动注入、systemd-nspawn容器管理及多二级容器运行时的完整方案,该方案已在某高校AI计算集群中稳定运行数月,可有效降低集群容器化部署的复杂度,提升资源利用率。</p> <p>针对传统容器部署存在GPU透传配置繁琐、需在容器内额外安装驱动导致环境冗余、systemd支持不足、二级容器运行时兼容性差及Rootless模式适配困难等痛点,本方案核心优势在于无需在容器内安装GPU驱动,可动态扫描并挂载NVIDIA库和工具,完美支持GPU透传与CDI驱动注入,兼容Docker与Rootless Podman两种二级容器运行时,同时通过脚本实现systemd-nspawn容器的自动监控与管理,简化集群部署与运维成本。</p> <p>功能特性:</p> <ul> <li>✅ <strong>多级容器的 NVIDIA GPU 透传支持</strong>,支持 DinD/PinD 模式</li> <li>✅ 动态扫描 NVIDIA 库和工具,不需要在容器内安装 GPU 驱动,<strong>容器驱动自动跟随宿主机更新</strong></li> <li>✅ 真正的系统级容器,<strong>完美支持 systemd 服务管理</strong>,同时无Docker一级容器方案的存储冗余、可靠性差等诸多弊端。</li> <li>✅ 支持 Docker 和 Podman 二级容器运行时,<strong>容器内可以再运行容器</strong>,支持 CDI 方式的 NVIDIA GPU 驱动注入</li> <li>✅ 多节点集群支持,自动配置跨节点路由,支持宿主集群NFS。</li> <li>✅ 支持 Rootless Podman 容器运行时,安全性风险低。</li> <li>✅ 自动监控和管理 systemd-nspawn 容器。</li> </ul>

2026/2/2
阅读更多

手动保留常用端口,解决 Windows 端口被 Hyper-V / WinNAT 占用的问题

<p>对于 Windows 10 及 Windows 11,当启用 Hyper-V 或者虚拟机平台后,Windows NAT 服务会随机保留一些端口以便于提供 NAT (网络地址转换) 服务,以实现虚拟机的上网。这些端口范围是随机确定的,因此很容易导致开发时遇到端口占用问题。比如会遇到以下错误:</p> <ul> <li>Error: listen EADDRINUSE: address already in use :::3000</li> <li>以一种访问权限不允许的方式做了一个访问套接字的尝试。</li> <li>An attempt was made to access a socket in a way forbidden by its access permissions</li> </ul> <p>除此以外,还可能会遇到明明服务启动成功但是却访问不了的问题,这也很有可能是因为端口被 WinNAT 给占了。</p> <h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p>网络上普遍建议重新设置一下「TCP 动态端口范围」(如文章 <a href="https://zhaoji.wang/solve-the-problem-of-windows-10-ports-being-randomly-reserved-occupied-by-hyper-v/" target="_blank" rel="noopener">解决 Windows 10 端口被 Hyper-V 随机保留(占用)的问题</a> ),但是这种方法并不总是有效,因为你并不知道自己未来会即兴用到哪些端口,如果端口分的少了,又会导致其他问题,比如因为可用端口不够用而妨碍上网。</p> <p>好在,Windows有一个很有趣的特性,就是用户可以 <strong>自行保留端口</strong> 给用户态程序使用。被用户保留的端口只能被用户态程序分配使用,却不能被内核驱动程序和服务使用。比如我设置保留 1080 端口后,Clash 这类普通用户态程序可以直接申请到这个端口,但是 IIS、WinNAT 等内核驱动程序和服务试图申请时却会被系统拒绝。这样一来,就可以避免端口被 WinNAT 占用的问题。</p>

2024/6/3
阅读更多

免Telent/TTL屏蔽运营商新版光猫的远控、TR069和RMS,获取动态随机超级管理员密码并固化权限

<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在校园网、小区网等环境中,运营商的光猫通常会被 Technical Report - 069(TR069)和远程维护系统(RMS)远程管理,这些系统会在你不知情的情况下修改你的光猫配置,甚至会在你不知情的情况下重置你的光猫,导致你的网络配置失效,甚至设备全部失联。因此,屏蔽这些远程管理机制是非常有必要的。</p> <p>然而,不幸地是,新版本的光猫早已修复了一切可以删除 TR069 和 RMS的漏洞,包括但不限于:</p> <ul> <li>不可能通过面板直接删除 TR069</li> <li>不可能通过 F12 或者改包、发包的方式变相删除 TR069 或修改接口的配置</li> <li>RMS 的配置被写死,不可能通过修改配置文件的方式禁用或修改 RMS</li> <li>没有任何漏洞或后门可以在不拆机的情况下打开 Telenet</li> <li>甚至连拆机都不一定能的打开 Telenet,因为 <code>uart_en=0</code></li> </ul> <p>本文将介绍一种全新的思路:通过<strong>故意制造 IP 冲撞</strong>,使得 RMS 服务访问异常,从而达到光猫不能正常拉取远程配置的目的。本方法不仅可以防止配置被远程修改,还能防止局端修改你的光猫超级管理员密码,以实现权限的固化,以解决<a href="https://www.v2ex.com/t/1008720" target="_blank" rel="noopener">我在 V2EX 提出的这个问题</a>。</p>

2024/2/25
阅读更多

利用Windows卷影副本(Volume Shadow)找回被覆盖和删除的数据

<p>Windows默认启用的系统恢复机制会定期创建卷影副本,创建的时机通常为安装或卸载软件以及系统更新。卷影副本 (Volume Shadow) 实际上就是我们在 Linux 上经常提到的 “快照(Snapshot)”,它利用写时复制 (CoW) 机制为我们提供了文件系统在某个时间点的一个状态的视图。通过利用这个视图,我们可以找回近期不慎删除或被覆盖的数据,也可以用于某些电子取证场景。实际上,系统恢复就是利用快照机制还原文件到先前某个状态实现的。</p> <p><strong>注意:</strong> 由于卷影副本存在一个严重的bug, <strong>该方法并不可靠</strong>!找回的文件数据可能不完整,或需要手动拼接。该方法仅供紧急情况或取证场景使用,切勿以此代替备份软件。</p> <p><strong>前提条件:</strong> 系统恢复未被禁用、文件系统为NTFS、存在可用的系统恢复还原点</p> <p>利用软链接将卷影副本链接到常规磁盘分区下面,就可以访问这些过去时间点的文件系统视图了。</p>

2024/1/4
阅读更多

在Windows下实现WireGuard动态DNS解析(DDNS)的正确方法:避免无意义的开销

<p>WireGuard 隧道一旦建立后,域名就不再重新解析了,一旦服务端的 IP 发生改变,这隧道就断了。</p> <p>截止文章最后修订,WireGuard 官方始终没有提供 Windows 下的动态 DNS 解析(DDNS)客户端脚本,所以说你想实现,如果你想在 Windows 下使用 WireGuard 配合经常改变 IP 的域名,你就必须要自己写一个动态 DNS 解析脚本。</p> <p>我基于<a href="https://gist.github.com/z0mb1e-kgd/54aede86adf2e30e390dba13886d18e1" target="_blank" rel="noopener">网上的脚本</a>进行了一番魔改,增加了以下特性:</p> <ul> <li>只处理已启用的 WireGuard 隧道,没开的隧道不会处理</li> <li>可以作为服务安装,自带延迟功能</li> <li>增加各类判断条件和错误处理,以便纠错</li> </ul>

2023/9/30
阅读更多

OpenWRT/DNSMasq 配置DHCP静态路由主动推送 实现流量直达和旁路由流量零代价分载

<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>通常来说,如果我们划分了另一个网段,流量是需要通过网关来进行路由的。例如 LAN 网段为 <code>172.20.0.0/24</code>,然后我们在家庭 PVE 服务器上创建了一个用于虚拟机的 <code>172.20.1.0/24</code> 网段,其中 PVE 服务器的网卡的 IP 为 <code>172.20.0.3</code> ,为了能够使得 LAN 的设备能直接访问虚拟机的 IP 段 <code>172.20.1.0/24</code>,就需要在网关设备上添加一个静态路由,指向 <code>172.20.1.0/24</code>,如下图。</p> <img src="/post/openwrt-dhcp-push-static-route/1.webp"> <p>诚然,这样做确实可以实现 LAN 的设备能直接访问虚拟机的 IP 段而不需要设置代理,但是这样做有一个缺点:<strong>所有访问虚拟机的流量都需要经过网关处理</strong>!这就导致了网关的 CPU 负载会变高,而且网关的网络带宽也会被内网访问虚拟机的流量占用。</p> <p>注意到 PVE 服务器的网卡的 IP 为 <code>172.20.0.3</code>,和 LAN 位于同一网段,有没有什么办法可以直接让 LAN 的设备访问 <code>172.20.1.0/24</code> 段时,直接到达 <code>172.20.0.3</code> 而不要经过网关?</p> <p>答案是有的,那就是<strong>静态路由主动推送</strong>。这个功能在 OpenWRT 上可以通过直接在 LUCI 上设置来实现,而在其他 Linux 发行版上可以通过修改 <code>/etc/dnsmasq.conf</code> 来实现。</p>

2023/8/28
阅读更多

解决 Windows 打开视频/图片文件夹很慢的问题

<p><strong>症状</strong>:打开视频/图片文件夹时,会卡在“正在加载”界面很久,或者直接卡死。此时打开任务管理器,观察到 <code>explorer.exe</code> 的 CPU 占用率很高,有一些磁盘占用。</p> <p>一开始以为是我把视频和图片文件夹放到了 OneDrive 里,但是把文件夹移出 OneDrive 后问题依旧存在。后偶然观察到在库上打开此文件夹没有这种问题,遂怀疑到是否是因为 排序/分组 的原因。</p> <p><strong>解决方法</strong>:在文件夹中右键,选择“排序”-&gt;“无”,然后再选择“分组依据”-&gt;“无”,问题解决。</p> <p>出现这种问题的根本原因是我们用了需要读取图片EXIF和视频文件本身来做排序的属性,Explorer 需要打开该目录下的所有文件(例如对于照片是寻找EXIF),找到需要的信息,然后做完排序才展示出来。而如果我们选择了“无”,则不需要读取文件本身,直接展示即可。</p> <p>当然,这样的话分组就没了啊?所以有什么替代方案吗?答案是有的,出现这种问题的根本原因是我们用了需要读取图片EXIF和视频文件本身来做排序的属性,那用文件系统本身支持的属性来做排序就可以了。例如对于“日期”(这个日期是照片的EXIF的日期,需要读取文件),我们可以用“修改日期”来排序(这个修改日期是文件系统的文件写入时间),这样就不需要读取文件本身了。当然两者是不完全等价的,不过一般情况是一样的。</p>

2023/6/15
阅读更多

AltA2DP - 向支持Sony LDAC协议的耳机提供Windows下蓝牙LDAC音频编码器支持

<p><strong>特别注意</strong>:禁止任何形式的转载!</p> <p>本驱动可以解决Windows屎一样的蓝牙音频编码器,向支持 Sony LDAC 协议的耳机提供Windows下蓝牙LDAC音频编码器支持。<strong>个人破解版本,非最新版本</strong>,反正功能没差。新版授权机制改了,但最近在赶论文,没时间研究,有兴趣的可以自己研究一下(反正又不是不能用嘛 🤣)。</p> <img src="/post/windows-a2dp-ldac-driver/1.webp"> <p><strong>注意</strong>:</p> <ul> <li>LDAC 对蓝牙信号要求比较高,比如我笔记本自带的蓝牙用 LDAC 990Kbps 能卡的六亲不认,可以买个外接 USB 蓝牙用。</li> <li>打游戏时如果觉得 LDAC 导致延迟太高可以在它的面板里切换为 SBC 编码器。</li> <li>由于修改后的驱动没有签名,使得大多数带有反作弊的竞技游戏都会拒绝启动(基本上,除了 CSGO 都没法玩)。有些游戏甚至在只是安装驱动但未加载的情况下也会拒绝启动(点名批评战地2042)。因此,有打竞技游戏的需求则不推荐使用任何破解版本。</li> </ul>

2023/3/31
阅读更多

(2024更新)修复黑群晖 DSM7.0 + Btrfs 存储空间/磁盘损毁/堪用 的问题

<p>意外断电重启后,发现群晖提示硬盘损毁了,但是实际上硬盘还是正常的,S.M.A.R.T. 状态也良好,但是无法写入数据,系统状态报告为“严重”,群晖的程序也拒绝工作。</p> <p>我们来先治标再治本。</p> <h2 id="治标:修复存储空间故障方法"><a href="#治标:修复存储空间故障方法" class="headerlink" title="治标:修复存储空间故障方法"></a>治标:修复存储空间故障方法</h2><ol> <li><p>通过 SSH <strong>直接登录</strong> root 账号。如果不方便直接登录 root,则执行:</p> <pre><code class="shell">cd / sudo -i </code></pre> <p>对于虚拟机黑群晖如果SSH挂了也没事,开个<strong>管道模式</strong>的串口连接(例如 <code>\\.\pipe\dsm</code>),然后用Putty或者Xshell <strong>以管理员身份运行</strong> 连上管道即可。</p> </li> <li><p>检查有问题的存储池,此时可以看到 <em>sdc3</em> 后面的 <code>[E]</code> 表示他现在是错误状态:</p> </li> </ol> <pre><code class="shell">cat /proc/mdstat </code></pre>

2023/3/3
阅读更多

校园网白嫖思路分享:局域网中转-不花钱、不认证、高速上网

<p>本文将分享一些校园网的白嫖思路(WireGuard / SoftEther VPN Server基于 UDP 53 端口的 VPN 三层白嫖、Socks 5 白嫖+科学上网二合一的四层白嫖),也就是不花一分钱就和一般用户一样使用校园网。</p> <p>2023/2/23: 更新各平台配置NAT命令和L2TP方法,并根据先前在评论区的答复介绍可以直接放弃的一些不可行的思路</p> <h1 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h1><p>下面列出的思路均要求使用一个校园网的服务器作为中转,因此,需要能够在不需要付费、认证后就能上网的网络环境(一般为办公区或实验室网络)下放一个电脑(树莓派也行);或者有任意学校服务器的使用权。</p> <p>整体思路就是找个在学校里面地方搭个服务器中转流量</p> <h1 id="各种思路"><a href="#各种思路" class="headerlink" title="各种思路"></a>各种思路</h1><h2 id="基于-UDP-53-端口的-VPN-三层白嫖"><a href="#基于-UDP-53-端口的-VPN-三层白嫖" class="headerlink" title="基于 UDP 53 端口的 VPN 三层白嫖"></a>基于 UDP 53 端口的 VPN 三层白嫖</h2><p><strong>原理</strong>:UDP 53 是 DNS 协议所用端口,由于门户(Portal)认证为了实现 HTTP 劫持跳转到登录页面,必须使得浏览器能够正常地进行 DNS 解析,因此在不认证、不付费的情况下也会放行 UDP 53 端口的流量。</p> <p><strong>特点</strong>:<strong>不需要校园网认证</strong>,不需要购买校园网,不需要校园网账号。此外由于 VPN 自带加密,因此可以克服开放 Wi-Fi 网络通信完全不加密的缺陷。</p> <p>下面所列出的两个思路均是三层(IP)级的 VPN 方法,可以转发所有三层报文,因此支持 ICMP 协议(可以用ping)。</p> <p><strong>注意</strong>:使用 UDP 53 端口需要所在网络没有<strong>DNS劫持</strong>的问题,如果你所在的网络存在DNS劫持(例如,OpenWRT的DHCP/DNS下的”DNS重定向”功能就是DNS劫持),则该方法会失败。</p> <h3 id="实现思路1:WireGuard"><a href="#实现思路1:WireGuard" class="headerlink" title="实现思路1:WireGuard"></a>实现思路1:WireGuard</h3><p><strong>我特别推荐此方案</strong>。WireGuard 是几乎无状态的VPN协议,切换网络零感知,不需要重新连接VPN,对于经常睡眠-唤醒的电脑特别有用。睡眠唤醒后可以立刻上网。此外 WireGuard 在 Linux 和 Windows 操作系统上均是纯内核态的实现,性能极其高。 </p> <p><strong>方法</strong>:搭建一个 wireguard 服务端,然后端口监听在 53 上</p> <p>搭建 Linux 服务端的教程很多,一键包也很多。但若要搭建 Windows 服务端,请一定要<a href="/post/setup-nat-on-windows/">阅读我之前的这篇文章</a>。</p> <p><strong>缺点</strong>:搭建确实有些复杂,另外配置文件对于不懂计算机网络的人来说实在是晦涩难懂</p>

2023/2/23
阅读更多

在 Windows 上配置网卡多个 VLAN、多个虚拟网卡、实现单线多拨网速叠加(无需驱动支持)

<p>本文分为两节,分别是如何在 Windows 上利用 Hyper-V 交换机<strong>实现对 VLAN 的支持</strong>;以及如何利用 Hyper-V 交换机功能创建多块虚拟网卡,实现<strong>单线多拨叠加网速</strong>。可以只使用 Hyper-V 交换机而不使用 Hyper-V 虚拟机,所以这不会影响你电脑的性能。以上功能均不需要网卡驱动支持。</p> <p>效果图:</p> <img src="/post/windows-use-vlan-and-multi-dial/1.jpg"> <img src="/post/windows-use-vlan-and-multi-dial/0.jpg"> <p>ℹ️ 使用 Hyper-V 功能需要 Windows 10 <strong>专业版</strong> 或以上版本,如果你使用的是家庭版,可以通过断网<strong>更改产品密钥</strong>、再通过KMS服务器激活的方式原地升级到专业版。</p>

2022/9/23
阅读更多

解决视频彩铃、语音通话自动转视频通话导致打电话自动挂断的问题

<h2 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h2><p>使用Android手机向某些电话号码拨打电话时,由于运营商自动播放视频彩铃,导致电话自动转成视频通话,但由于某些bug,导致电话自动挂断,因而无法打出电话的问题</p> <p>即:拨打电话,响铃几秒后,提示正在进行运营商视频通话,然后提示通话结束。对方能够听到短时间的响铃。</p>

2022/7/22
阅读更多

超低成本廉价考研教程:如何用小于¥500甚至¥300的开销考个研

<p>在本科学历日渐贬值时代,读研基本成了一个日常话题,然而考研成本甚高,即使是不参与线下培训班、纯网课也往往需要花费万元以上。正好老早就有线下好友吐槽我博客技术文太多 <del>哪有那么多啊,我真的从来都不写复杂技术的文章的啊</del>,乘着手上的拟录取通知还热乎,今天就来分享分享如何用超低成本考研。</p> <p>我的考研开销情况:</p> <table> <thead> <tr> <th>类目</th> <th>花费(人民币/元)</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>书本</td> <td>249.65</td> <td>126.41(13本书,pdd)+ 123.24(5本书,正版)</td> </tr> <tr> <td>初试报名费</td> <td>180</td> <td></td> </tr> <tr> <td>耗材(纸、笔等)</td> <td>25</td> <td>有优惠券那就买纸罢</td> </tr> <tr> <td>网课</td> <td>0</td> <td></td> </tr> <tr> <td>复试费</td> <td>0</td> <td>目标院校不收复试费,另外收费院校的复试通知被我鸽了</td> </tr> <tr> <td>总计</td> <td>454.65</td> <td>这个开销可以更小,至少可以再少 100</td> </tr> </tbody> </table> <img src="/post/low-cost-postgraduate-entrance-examination/0.jpg"> <p>生草的是,学信网上关于考研开销的调查表甚至没有这么低的选项。</p>

2022/4/11
阅读更多

在 Ubuntu 21.10 上启用蓝牙 LDAC/AAC/AptX 高质量音频编码支持

<p>Ubuntu 21.10 已经默认 <strong>部分</strong> 安装了 PipeWire 并用于 WebRTC。我们只需要安装 PipeWire 所需的蓝牙音频编码器,并替代默认的 PulseAudio 声音系统即可自动启用 LDAC / AAC / AptX 支持。</p>

2022/3/10
阅读更多

在 VMware Workstation 桥接模式的网卡上让虚拟机使用 VLAN 的正确方法

<h1 id="要解决的问题"><a href="#要解决的问题" class="headerlink" title="要解决的问题"></a>要解决的问题</h1><p>有一个虚拟机运行在 VMWare workstation 中,如何让这个虚拟机桥接到宿主机的网络上的某个 VLAN?</p> <h1 id="常见使用场景"><a href="#常见使用场景" class="headerlink" title="常见使用场景"></a>常见使用场景</h1><p>只有一个网口的单臂软路由,同时宿主机为 Windows,虚拟机软件为 VMware Workstation,在虚拟机中运行 OpenWrt</p> <p>需要在一个网口上,利用 VLAN 实现虚拟 WAN 口上的 PPPoE 拨号和 虚拟 LAN 口上的上网服务。</p> <h1 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h1><ol> <li>根据宿主机网卡的品牌,下载对应的 VLAN 设置软件。已知 Realtek 和 Intel 网卡都提供这样的软件。Realtek 网卡的软件为 <a href="https://cn.bing.com/search?q=Realtek+Ethernet+Diagnostic+Utility" target="_blank" rel="noopener">Realtek Ethernet Diagnostic Utility</a></li> <li>下文以 Realtek 网卡为例。如果你的网卡厂商不提供 VLAN 设置软件,请直接转到文末</li> <li>在宿主机上设置你想要使用的 VLAN 编号,软件将会创建一个虚拟网卡。记住网卡名称和适配器名称</li> </ol>

2022/1/28
阅读更多

在 Windows 上设置 NAT 或网络共享的正确方法——避免Wi-Fi热点无法使用

<p>最近在我的笔记本上用 <a href="https://github.com/micahmo/WireGuardServerForWindows" target="_blank" rel="noopener">WireGuardServerForWindows</a> 项目搭了一个 WireGuard 服务端,但是发现一个问题,我一给 WireGuard 开网络共享,我就没法开 Wi-Fi 热点了</p> <h2 id="罪魁祸首:SharedAccess"><a href="#罪魁祸首:SharedAccess" class="headerlink" title="罪魁祸首:SharedAccess"></a>罪魁祸首:SharedAccess</h2><p>目前的NAT的普遍做法是用 <code>SharedAccess</code> 服务,也就是你在控制面板看到的那个 “Internet 连接共享”</p> <img src="/post/setup-nat-on-windows/1.jpg"> <p>但是这个服务是针对热点的设计的,只能支持一个 NAT 实例,这意味着,由于SharedAccess服务已经被wireguard服务器的NAT占用掉了,你就没办法建立一个有 Internet 的 Wi-Fi热点</p> <p>但是,如果,使用New-NetNat命令,就能够设置许多NAT实例,同时可以用热点。</p> <h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2>

2022/1/5
阅读更多

自编译 红米 AC2100 OpenWRT R21.7.26

<p>分享一下之前自行编译的路由器固件给有需要的人</p> <p>一句话总结特点:<strong>锐捷 | 闭源驱动 | Wireguard | 组网 | NFS | 多拨 | 弱信号剔除</strong></p>

2021/8/6
阅读更多

Linux 内核结构和子系统简介

<p>本文是对 <a href="https://developer.ibm.com/technologies/linux/articles/l-linux-kernel/" target="_blank" rel="noopener">Anatomy of the Linux kernel</a>

2021/2/17
阅读更多

Java 快速读取文本 (算法竞赛适用)

<h1 id="背景-远离-Scanner"><a href="#背景-远离-Scanner" class="headerlink" title="背景: 远离 Scanner"></a>背景: 远离 Scanner</h1><p>今天无意翻阅 <a href>Scanner</a> 类时,发现了一个很坑的地方:</p> <pre><code class="java">// 摘抄自 Scanner JDK15 源码 public final class Scanner implements Iterator&lt;String&gt;,

2020/10/31
阅读更多

利用 ThreadLocal + Lambda,实现有状态变量的单例模式

<p>通常情况下单例模式的对象<strong>不</strong>应该具有状态,然而现实是复杂的,总会有那么一些特殊情况下需要小小地【违例】一下。</p> <h1 id="动机"><a href="#动机" class="headerlink" title="动机"></a>动机</h1><p>一个父类的方法执行前需要设置一个变量的值,变量值会对方法的执行结果产生影响。现希望子类以单例的方式继承父类。</p> <p>以我实际遇到的一个问题为例,JOOQ 是一个 ORM 类库,这个类库能够自动扫描数据库并生成 DAO,但是自动生成的 DAO

2020/8/19
阅读更多

状态压缩的动态规划问题:骨牌完全覆盖棋盘问题

<p>这个算法问题对于算法菊苣们来讲不过是小菜一碟。发到博客主要是希望能够对未来拿到这个问题而毫无头绪的读者带来些许帮助。</p> <p>这篇文章实际上是我的《算法分析与设计》课程的大作业,从 Word 粘贴到博客仅做了一些格式上的修改,因此文章风格会比较离谱(报告文档的风格),敬请谅解。</p>

2020/7/1
阅读更多

我的 Windows 10 2004 新增 Bug 解决办法记录

<h1 id="虚拟化相关"><a href="#虚拟化相关" class="headerlink" title="虚拟化相关"></a>虚拟化相关</h1><h2 id="大量端口被无端保留,50000-以上高位端口无法分配"><a href="#大量端口被无端保留,50000-以上高位端口无法分配" class="headerlink" title="大量端口被无端保留,50000 以上高位端口无法分配"></a>大量端口被无端保留,50000 以上高位端口无法分配</h2><p>这是 Hyper-V 导致的,可以卸载 Hyper-V 平台解决它。</p> <p>具体参考:</p> <ul> <li><a href="https://segmentfault.com/a/1190000022338199" target="_blank" rel="noopener">Hyper-V和IDEA运行端口占用问题</a> </li> <li><a href="https://stackoverflow.com/questions/48478869/cannot-bind-to-some-ports-due-to-permission-denied" target="_blank" rel="noopener">Cannot bind to some ports due to permission denied</a> </li> <li><a href="https://github.com/docker/for-win/issues/3171#issuecomment-459205576" target="_blank" rel="noopener">Unable to bind ports: Docker-for-Windows &amp; Hyper-V excluding but not using important port ranges </a></li> </ul> <h2 id="系统为每个网卡都创建一个-vEthernet-虚拟网卡"><a href="#系统为每个网卡都创建一个-vEthernet-虚拟网卡" class="headerlink" title="系统为每个网卡都创建一个 vEthernet 虚拟网卡"></a>系统为每个网卡都创建一个 vEthernet 虚拟网卡</h2><p>这是 Hyper-V 平台导致的,只要装了 Hyper-V 平台就会这样,暂时没找到关闭办法。</p> <p>先卸载 Hyper-V 平台、沙盒、容器、虚拟机平台、虚拟机监控程序平台。</p> <p>如果之后需要使用这些功能可以重启后再启用。</p> <h2 id="WSL-2-进入-shell-卡死"><a href="#WSL-2-进入-shell-卡死" class="headerlink" title="WSL 2 进入 shell 卡死"></a>WSL 2 进入 shell 卡死</h2><p>执行:<code>wsl --shutdown</code> 强制停止 WSL 后再试。</p> <h2 id="VMware-Workstation-兼容性问题"><a href="#VMware-Workstation-兼容性问题" class="headerlink" title="VMware Workstation 兼容性问题"></a>VMware Workstation 兼容性问题</h2><p>升级最新的 15.5.5 可以兼容 Hyper-V 了。</p> <h2 id="VMware-Workstation-15-频繁未响应"><a href="#VMware-Workstation-15-频繁未响应" class="headerlink" title="VMware Workstation 15 频繁未响应"></a>VMware Workstation 15 频繁未响应</h2><p>似乎是一个 Bug,当剪贴板有图片时进入虚拟机就会导致卡死。</p> <p>关于这个,我在 VMWare 社区发了个帖子:<a href="https://communities.vmware.com/message/2953868#2953868" target="_blank" rel="noopener">Workstation and Player GUI freezed when host clipboard has image on Windows 10</a></p> <h1 id="其他软件"><a href="#其他软件" class="headerlink" title="其他软件"></a>其他软件</h1><h2 id="手心输入法字体渲染模糊"><a href="#手心输入法字体渲染模糊" class="headerlink" title="手心输入法字体渲染模糊"></a>手心输入法字体渲染模糊</h2><p>打开手心输入法的安装目录,对所有的 exe:</p> <pre><code>属性 -- 兼容性选项 -- 更改所有用户的设置 -- 更改高 DPI 设置 -- 高 DPI 缩放替代 -- 选择 “应用程序” </code></pre><blockquote> <p>另外可以禁用掉手心输入法的开机启动,没有任何其他影响</p> </blockquote> <h2 id="网易云音乐升级成了-x86-转制版本"><a href="#网易云音乐升级成了-x86-转制版本" class="headerlink" title="网易云音乐升级成了 x86 转制版本"></a>网易云音乐升级成了 x86 转制版本</h2><p>我保留了一份 网易云音乐 UWP 版 Appx Bundle 存档,可以在这里下载:<a href="https://github.com/kenvix/NeteaseMusicUWP" target="_blank" rel="noopener">kenvix/NeteaseMusicUWP</a></p> <blockquote> <p>这个沙雕版本正好和 Windows 10 2004 同时发布,就写到一起了</p> </blockquote> <h2 id="OneDrive-一直在-“连接中”"><a href="#OneDrive-一直在-“连接中”" class="headerlink" title="OneDrive 一直在 “连接中”"></a>OneDrive 一直在 “连接中”</h2><p>如果你开启了系统代理,请排除以下地址:</p> <pre><code>mobile.pipe.aria.microsoft.com login.windows.net </code></pre><p>此外,如果你使用 OneDrive for Business 还需要排除掉你的 SharePoint 域名,例如 <code>example-my.sharepoint.com</code></p>

2020/6/6
阅读更多

解决 Android Studio 及 IDEA 中 Gradle 错误信息乱码的问题

<h1 id="错误现象"><a href="#错误现象" class="headerlink" title="错误现象"></a>错误现象</h1><p>如图所示,在 IDEA 2019.X 以及 Android Studio 3.6.X, Gradle 在编译项目过程中所有中文错误提示均乱码。</p> <img src="/post/fix-gradle-error-message-garbled/1.jpg" title="1.jpg">

2020/3/5
阅读更多

Kotlin 的那些骚操作

<p>最近在学习 Kotlin 这门编程语言,不得不感叹 Kotlin 这语言是真的骚。</p> <h1 id="重载操作符"><a href="#重载操作符" class="headerlink" title="重载操作符"></a>重载操作符</h1><h2 id="在伴生对象重载-invoke-操作符"><a href="#在伴生对象重载-invoke-操作符" class="headerlink" title="在伴生对象重载 invoke 操作符"></a>在伴生对象重载 invoke 操作符</h2><pre><code class="kotlin">interface BotUser { val id: Long val name: String val description: String companion object { operator fun invoke( id: Long, name: String = &quot;&quot;, description: String = &quot;&quot; ): BotUser { return BotUserImpl(id, name, description) } } } class BotUserImpl(...) { ... } </code></pre> <p>如果你这样做的话,可以让接口或者抽象类仿佛看起来能够被实例化一样(看似调用“构造方法”,实际上是调用了 invoke() )。</p> <p><strong>用途:</strong>项目中途将某个类抽象为一个接口,并将原有类作为此接口的默认实现,这样可以做到源代码的兼容(对 Java 代码以及二进制仍不兼容,毕竟本质不同)。</p> <blockquote> <p>代码来自我的项目 “MoeCraftBotNG”</p> </blockquote> <h2 id="其他操作符重载"><a href="#其他操作符重载" class="headerlink" title="其他操作符重载"></a>其他操作符重载</h2><p>一般可以重载 <code>get()</code> <code>set()</code> 来使对象能够按数组、字典一样去操作。</p> <p>为对象编写 <code>contains()</code> 方法时(判断某个元素是否“属于”此对象),可以顺便为此方法加个 <code>operator</code> 关键字可以让 <code>in</code> 关键字支持这个对象</p> <p>然而操作符重载还是慎用为妙,众所周知这个特性就是被 C++ 玩坏的,当你 java 甚至以不支持操作符重载为荣。好在 Kotlin 在这方面也比较节制。</p> <h1 id="协程"><a href="#协程" class="headerlink" title="协程"></a>协程</h1><p>如果想让你的 suspend 函数被 Java 用户友善地调用,防止你被人砍,你可以:</p> <p>用 Kotlin 编写一个类:</p> <pre><code class="kotlin">class Coroutines { /** * 获取在 Java 代码中调用 Kotlin Suspend 函数所需的最后一个参数 (Continuation) * @param onFinished 当suspend函数执行完毕后所调用的回调。若 Throwable 不为 null 则说明执行失败。否则为执行成功 * @param dispatcher 协程执行线程的类型。可以为 Dispatchers.Default(CPU密集型) Dispatchers.Main(主线程) Dispatchers.IO(IO密集型) */ @JvmOverloads fun &lt;R&gt; getContinuation(onFinished: BiConsumer&lt;R?, Throwable?&gt;, dispatcher: CoroutineDispatcher = Default): Continuation&lt;R&gt; { return object : Continuation&lt;R&gt; { override val context: CoroutineContext get() = dispatcher override fun resumeWith(result: Result&lt;R&gt;) { //注意 Result 是 inline class,不可直接给出去 onFinished.accept(result.getOrNull(), result.exceptionOrNull()) } } } } </code></pre> <p>kotlin suspend 函数的调用难点在于最后一个参数,这个参数是 suspend 函数自动生成的,但是在 Java 方面处理起来却十分棘手。你可以提供这样的一个类来生成最后一个参数的值。</p> <p>然后在 Java 中,就可以这样调用了:</p> <pre><code class="java">Coroutines coroutines = new Coroutines(); //假设一个 suspend fun login(username: String, password: String): RequestResult,位于 object UserUtils UserUtils.INSTANCE.login(&quot;user&quot;, &quot;pass&quot;, coroutines.getContinuation( (result, throwable) -&gt; { //suspend fun执行结束的回调 System.out.println(&quot;Coroutines finished&quot;); System.out.println(&quot;Result: &quot; + result); System.out.println(&quot;Exception: &quot; + throwable); } ) ); </code></pre> <p>另外,也可以使用 <code>org.jetbrains.kotlinx:kotlinx-coroutines-jdk8</code>,这个库可以让 suspend fun 返回 <code>CompletableFuture&lt;&gt;</code> 以便在 java 使用</p> <pre><code class="kotlin">fun doSomethingAsync(): CompletableFuture&lt;List&lt;MyClass&gt;&gt; = GlobalScope.future { doSomething() } //返回 CompletableFuture 包装的 suspend fun doSomething() </code></pre> <h1 id="内置函数"><a href="#内置函数" class="headerlink" title="内置函数"></a>内置函数</h1><p>Kotlin 有很多实用的内置函数,只提几个。</p> <h2 id="run"><a href="#run" class="headerlink" title="run()"></a>run()</h2><p>run() 字面意思,用于执行一个任意代码块,并返回代码块的返回值</p> <p>run() 有两种,签名如下:</p> <pre><code class="kotlin">public inline fun &lt;R&gt; run(block: () -&gt; R): R public inline fun &lt;T, R&gt; T.run(block: T.() -&gt; R): R </code></pre> <p>第一种 run() 在为构造函数委托传递参数时特别有用,例如有一个类和两个次构造函数</p> <pre><code class="kotlin">class ManagedJavaProperties(val inputStream: InputStream, val outputStream: OutputStream? = null) { constructor(file: File): this(file.inputStream(), file.outputStream()) constructor(fileName: String): this(???) //需要进行处理才能委托给其他构造函数 } </code></pre> <p>第二个次构造函数中需要对 fileName 进行一些处理,此时需要 run() 登场了:</p> <pre><code class="kotlin">class ... { constructor(fileName: String): this( kotlin.run { val file = File(fileName) if (!file.exists()) { file.createNewFile() } file } ) } </code></pre> <p>第二种 run() 则是将调用者当作 this 传递给 lambda,除此之外和第一种完全相同</p> <p>run() 也可以用于防止代码块内变量污染当前作用域。(类似于 Java 的 <code>{ }</code> )</p> <h1 id="抑制错误"><a href="#抑制错误" class="headerlink" title="抑制错误"></a>抑制错误</h1><p>Kotlin 的 <code>@Suppress</code> 注解不仅可以抑制警告,还可以抑制任何错误。具体的错误名字可以到 kotlin 编译器项目按错误提示寻找。</p>

2019/12/13
阅读更多

在普通的 Gradle Java/Kotlin 项目中使用 BuildConfig

<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Android Studio 为其 Android 项目提供了十分方便的 <code>BuildConfig</code> 功能,该功能在运行编译时自动生成 <code>BuildConfig.java</code> 文件,其中储存了编译时的一些系统信息(如APP版本号、渠道、编译时间、编译器等),并可以用于条件编译。</p> <p>所幸,有人已经仿照出了具有类似功能的 Gradle

2019/8/20
阅读更多

修复国行 MIUI 打开 Google Play 始终提示 DF-DFERH-01 的问题

<h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><p>自带 Google 服务框架的国行 MIUI,<strong>即使设置全局代理</strong>,打开 Google Play 仍然提示 DF-DFERH-01.</p> <p>反复对 Play Store/Service 清除数据、插拔 SIM 卡均无效。在其他第三方 ROM 上 Play 正常使用。</p> <p>使用 adb logcat 查看日志,捕获到下列错误:</p> <img

2019/6/7
阅读更多

解决 VSCode 持续调用 WMIC 导致一个 CPU 核心完全被占满的问题

<h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><p>只要启动 VSCode,无论是否有负载,VSCode 都会不停地调用 WMIC.exe ,WMIC.exe 完全占满一个 CPU 核心,导致 CPU 温度很高。</p> <img src="/post/fix-vscode-wmic-issue/1.png" title="1.png"> <h1 id="解决办法"><a href="#解决办法" class="headerlink"

2019/2/15
阅读更多

扔鸡蛋问题

<p><img src="/img/a.jpg" alt="img"> 菜鸡第一次看算法题,这篇笔记还是不要看比较好<br>

2019/2/14
阅读更多

计算机幻觉从入门到入土

<p><strong>[NOTICE]</strong> 本文仅为一篇我个人学习笔记,不适合作为其他人的学习引导。</p> <p>因为博主写这篇笔记就是这个状态 ↓</p> <p><img src="/img/gaodongle.jpg" alt="img"></p> <p>↑ 为此专门查了怎么用more标签隐藏文章内容</p>

2019/2/10
阅读更多

Java 注解预处理 Annotation Processing & 代码生成

<p>关于 Java 的注解预处理的资料实在是过于稀少,连stackoverflow上都没多少人研究,以致于我这个萌新在尝试使用注解预处理来生成代码时踩了不少坑,正好博客也快长草了,遂决定留一篇文章,希望能够对后来者有所帮助。</p> <p>本文章同时对一般 Java 项目和 Android 项目适用。</p> <h1 id="为何使用-Java-注解预处理"><a href="#为何使用-Java-注解预处理" class="headerlink" title="为何使用 Java 注解预处理"></a>为何使用 Java

2019/2/2
阅读更多

Ubuntu 上通过以太网分享网络连接(NAT)

<p>Ubuntu 自带网络分享功能,但该功能很不稳定,往往断开连接后再连就无法使用了。<br>现在我们使用 DNSMASQ+IPTables 手动配置NAT. </p> <h2 id="禁用-systemd-resolved"><a href="#禁用-systemd-resolved" class="headerlink" title="禁用 systemd-resolved"></a>禁用 systemd-resolved</h2><p>Ubuntu 提供的 systemd-resolved 抢占53端口,首先禁用它。

2019/1/3
阅读更多

Windows 选择指定的网卡来开承载网络型热点

<p>Windows 10 自带的移动热点比较废,只允许带8个设备,并且在断网后自动关闭,不能满足需求。<br>而通过 <code>netsh</code> 创建的 Microsoft 承载网络虽好,但却不支持选择用于创建热点的网卡。<br>本文介绍的玄学方法可以让用户做到自己选择网卡开 Microsoft 承载网络 热点。 </p> <ol> <li>打开 网络和 Internet 设置</li> <li>更改适配器选项</li> <li>选择你希望使用的网卡,重命名</li> <li>起个字母排序在你不想使用的网卡的名字之前的名字,例如

2018/11/3
阅读更多

修复升级 Windows10 版本后所有内置应用闪退+第三方应用参数错误的问题

<p>昨天把Windows10升级到1809后所有应用都挂了,应用商店和内置应用闪退,常用的应用参数错误,连WSL都出问题了。容我先亲切问候一下微软 :)</p> <h2 id="修复内置应用闪退、应用商店打不开"><a href="#修复内置应用闪退、应用商店打不开" class="headerlink" title="修复内置应用闪退、应用商店打不开"></a>修复内置应用闪退、应用商店打不开</h2><p>这里有 <a

2018/10/5
阅读更多

配置用于 Gradle + SQLite 的 jOOQ 3.11 代码自动生成 (已过期)

<blockquote> <p><strong><font color="red">敬告:这篇文章已经过期</font></strong>,不适用于最新版的 JOOQ,也不支持 Java11+ 和 Gradle 6.x,关于最新版的 JOOQ 使用说明,<a href="/post/jooq-autugen-mysql-with-gradle/">点击此处请阅读我的新文章</a></p> </blockquote> <h2 id="为什么要写这篇文章"><a href="#为什么要写这篇文章" class="headerlink"

2018/10/4
阅读更多

配置用于 Gradle6.x + MySQL 8 的 jOOQ 3.14 代码自动生成 (已更新)

<h2 id="为什么要写这篇文章"><a href="#为什么要写这篇文章" class="headerlink" title="为什么要写这篇文章"></a>为什么要写这篇文章</h2><p>之前介绍了一下<a href="/post/jooq-autugen-with-gradle/">在旧版Gradle、SQLite上配置JOOQ</a>,不过那篇文章实在是太旧了,在新版Gradle上已无法使用,也不兼容Java11。</p> <p>关于如何配置用于 Gradle + M 的 jOOQ 3.11

2018/10/4
阅读更多

修复 Windows 环境下的程序访问 WSL 中的 MySQL 提示 Access Denied 的问题

<h2 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h2><p>Windows 10 版本 1803 + Ubuntu 18.04<br>位于 Windows 下的程序(例如Navicat)连接 MySQL 提示 Access Denied<br>同样位于 WSL 的程序可以正常访问 MySQL</p> <h2 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h2><p>MySQL 把 Windows

2018/8/31
阅读更多

修复 WSL 下 PHP+FastCGI 卡死的问题

<h2 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h2><p>Windows 10 版本 1803 + Ubuntu 18.04<br>以 Nginx 服务端为例,访问多数 PHP 文件,PHP 会直接卡死。<br>访问那些极其简单的 PHP 文件 (例如Hello world, phpinfo()) 虽然可以加载出来但浏览器显示网页仍未加载完全。</p> <h2 id="原因"><a href="#原因" class="headerlink"

2018/8/31
阅读更多

使用任意磁盘或路径保存 Windows 文件历史记录

<blockquote> <p>不知为何,博主的 Windows 不允许使用本机的机械硬盘保存文件历史记录,这大概又是一个秘制bug吧。 </p> </blockquote> <p>无论是 Windows7 的备份还是 Windows10 的文件历史记录,它们都允许用户选择网络位置保存数据,于是我们就可以这样操作:</p> <blockquote> <p>\\localhost\X$\Path</p> </blockquote> <p>该路径表示本机 <code>X:</code> 盘的 <code>Path</code>

2018/8/30
阅读更多

[1.12.2+Mod] MoeCraft :: 自由开放的科技向公益 Mod 服务器

<h1 id="特色-amp-概述"><a href="#特色-amp-概述" class="headerlink" title="特色&amp;概述"></a>特色&amp;概述</h1><p><img src="https://cdn.moecraft.net/client/screenshot.jpg" alt="screenshot-main"> </p> <blockquote> <p>MoeCraft 创立于 2016 年六月,是一个非盈利的、旨在为热爱 MC 的玩家创造最优环境的公益 Minecraft

2018/8/11
阅读更多

2018/8/2
阅读更多

禁用使用Intel核显的Windows笔记本自动调节亮度功能

<p>Intel 核显自带一个“节电功能”,它的工作原理:</p> <blockquote> <p>比如你设置的100%的亮度,放着一张白的图片,那么屏幕只能100%亮度显示。但是如果是50%灰的图片呢,我只要50%亮度显示纯白就行了诶。如果整个屏幕最亮的颜色只有10%,那就干脆把亮度降到10%来省电好了,然而对于电影这种明暗变化较快的没优化好,导致体验较差。<br>来源: <a href="https://www.zhihu.com/question/25522457/answer/100757369" target="_blank"

2018/7/27
阅读更多

真正实现Minecraft高级登录(外置登录)的几种方案

<p>通常把Minecraft服务器的登录方式分为高级登录(外置登录)和内置登录。高级登录的特点是用户的登录操作在启动器完成,启动器传递token给Minecraft客户端,客户端在加入服务器时直接将token传递给服务端完成身份验证。正版Minecraft登录就是典型的外置登录。而一般的非正版服务器(online-mode=false)则是身份验证仅在用户加入游戏后通过聊天框输入密码完成认证,此时用户已经加入了游戏,仅仅靠登录插件来限制用户进行其他操作。<br>而内置登录往往存在下列问题:

2018/7/21
阅读更多

谈谈神舟的两艘贼船,Z7M-KP7S1 / Z7M-KP7SC

<p>先放张蓝天的N85xEJ1模具的感人的拆机图镇楼<br><img src="/post/fucking-hasee-z7m/niubi.jpg" title="niubi.jpg"><br>没错!这感天动地的单铜管散热!压 1050Ti + i7!我大神船的头就是这么铁! </p> <h1 id="厉害了,我的船"><a href="#厉害了,我的船" class="headerlink"

2018/7/15
阅读更多

USBCopyer: 插上U盘自动按需复制文件

<p>注:本文介绍的是带来巨量更新的USBCopyer V5 </p> <h1 id="USBCopyer-插上U盘自动按需复制文件"><a href="#USBCopyer-插上U盘自动按需复制文件" class="headerlink" title="USBCopyer: 插上U盘自动按需复制文件"></a>USBCopyer:

2018/6/22
阅读更多

USBCopyer 回调功能详细说明

<p>“回调” 是 USBCopyer V5.0 新引入的一个概念,它用于在 USBCopyer 执行特定操作时触发用户指定的代码或程序,以便实现某种高级的、程序没有提供的功能。 </p> <h1 id="基本使用方法:"><a href="#基本使用方法:" class="headerlink" title="基本使用方法:"></a>基本使用方法:</h1><ol> <li>在USBCopyer设置打开回调的开关</li> <li>打开USBCopyer所在目录下的 USBCopyer\USBCopyerSystem

2018/6/22
阅读更多

C# 实现自定义"应用程序设置"的配置文件(user.config)存储路径

<blockquote> <p>关于“应用程序设置”: <a href="https://msdn.microsoft.com/zh-cn/library/a65txexh.aspx" target="_blank" rel="noopener">前往MSDN查看</a></p> </blockquote> <p>默认提供的 SettingsProvider 不允许我们修改应用程序设置的配置文件的路径,这就导致了以下问题:</p> <ol> <li>设置保存在了 %appdata% 目录下,使应用程序不够绿色化</li> <li>当用户把程序拷贝到其他电脑上时,设置将丢失</li> <li>当用户升级程序时,设置将丢失(自带的 Upgrade() 过于复杂)</li> </ol> <p>要解决上述问题,就需要由我们自己来定义在哪里存储应用程序设置<br>MSDN给出的方法是:自己实现一个 SettingsProvider<br>

2018/6/21
阅读更多

Win10 资源管理器为所有格式激活“编辑”按钮并修改文本文件“编辑”按钮的编辑器

<img src="/post/windows-enable-edit-button-for-all-format/main.jpg" title="screenshot"> <p>默认情况下,Windows 10 资源管理器的功能区对绝大多数文本格式的不可用的,即使能够使用(例如 .js .cpp .txt

2018/6/14
阅读更多

留言板

<p>这是一个留言板,它什么都不做 <img src="/img/good.jpg" alt="/img/good.jpg"></p> <h2 id="联系方式"><a href="#联系方式" class="headerlink" title="联系方式"></a>联系方式</h2><p><strong>邮箱</strong>: <a href>kenvixzure@live.com</a> </p> <p><strong>社交平台</strong>:<a href="https://github.com/kenvix"

2018/2/17
阅读更多

又一次 Hello world

<h1 id="是的我又回来了蛤铪蛤铪蛤铪蛤铪蛤铪"><a href="#是的我又回来了蛤铪蛤铪蛤铪蛤铪蛤铪" class="headerlink" title="是的我又回来了蛤铪蛤铪蛤铪蛤铪蛤铪"></a>是的我又回来了蛤铪蛤铪蛤铪蛤铪蛤铪</h1><p>(假装笑得很开心)</p>

2018/2/16
阅读更多

Java 学习笔记 (仍在更新)

内容过多,放到内页显示

2017/11/7
阅读更多

在Win10 Pro下挂载NFS(网络文件系统)

<img src="/post/win10-mount-nfs/1.png" title="1.png"> <p><span style="color: #0000ff;"><strong>注意:</strong></span>Win10 Creators Update前只有Win10企业版可以挂载NFS, Creators Update后专业版也可挂载NFS了。此外,Windows 不支持挂载 NFSv4。</p> <p>&nbsp;</p> <h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>按Win+R输入OptionalFeatures,勾选”NFS服务”</p> <p>不需要勾选“管理工具”,那玩意是个废物,非WinServer只能靠命令行挂载NFS。</p> <p>装好后按Win+R输入cmd</p>

2017/6/24
阅读更多

Nginx 反向代理 Aria2 JSONRPC

<p>给Aria2服务器所用的SSL证书往往不支持Aria2所使用的6800端口,而80/443端口还要提供HTTP服务,为此就需要用Nginx来实现同时提供HTTP和Aria2 JSONRPC服务了。</p> <p>目前已经测试通过并部署到了生产服务器,本文只做一个记录。</p> <p><strong>最终效果:</strong></p> <img src="/post/nginx-proxy-aria2/20170513104446.jpg" width="20170513104446">

2017/5/13
阅读更多

(Android6.0~9.0) 清除锁屏密码

<p>如果手机已经Root并且开了ADB调试并且以前授权过要连接的电脑,则直接连该电脑即可。</p> <p>如果手机未Root但刷入了TWRP或CWM等Recovery,则需要重启后进recovery,然后连电脑。</p> <p>然后运行以下命令即可:</p> <pre><code class="sh">adb shell rm /data/system/gallery_private.key rm /data/system/gatekeeper.password.key rm

2017/4/25
阅读更多

WordPress 更换站点地址后批量修改文章/评论中的旧地址

<p><strong>仅作记录,不建议使用。</strong></p> <p>运行以下代码即可:</p> <p><strong>前一个地址</strong>是要替换的旧地址</p> <p><strong>后一个地址</strong>是新地址</p>

2017/4/23
阅读更多

修复一加3/3T因固件过老导致刷入ROM时提示错误7的问题

<p>博主在刷入Oneplus3 H2OS Openbeta 7后再刷LineageOS遇到了“Comparing TZ version TZ.BF.X.X-X.X.XXXX to TZ.BF.X.X-X.X.XXXX assert failed”报错</p> <p>原因是当前手机固件版本过低或过高,第三方ROM不兼容。</p> <p>我们知道,<strong>原厂ROM刷机包一般都会带有完整的固件</strong>,位于刷机包内 <span style="color: #008000;"><strong>firmware-update</strong></span> 文件夹,可以直接提取这里面的固件,然后使用 <span style="color: #008000;"><strong>fastboot flash <em>分区名 固件路径</em></strong></span>,其中<em><span style="color: #008000;">分区名</span></em>就是你看到的文件名再去掉扩展名</p> <p>于是博主准备使用fastboot刷入固件,但又遇到了以下报错:</p> <blockquote> <p>fastboot flash tz tz.mbn</p> <p>target reported max download size of 440401920 bytes</p> <p>sending ‘tz’ (1628 KB)…</p> <p>OKAY [ 0.080s]</p> <p>writing ‘tz’…</p> <p><strong>FAILED (remote: Partition flashing is not allowed)</strong></p> <p>finished. total time: 0.118s<br>(心情复杂.jpg)</p> </blockquote> <p>然后博主突然想到recovery也可以刷入固件,抱着试一试的心态,做了一个固件刷机包</p> <p>&nbsp;</p> <p>wow! 真的成功了哎,现在可以刷LineageOS了</p>

2017/3/11
阅读更多

修复Android DM-Verity 警告

<p>刷入某些ROM可能导致手机在引导时弹出DM-Verity警告,警告内容为 </p> <blockquote> <p>The dm-verity is not started in enforcing mode ….</p> </blockquote> <p><span style="color: #008000;"><strong>修复方法:</strong></span>重开DM-Verity然后再禁用。</p> <p><span style="color:

2017/3/4
阅读更多

贴吧云签到 资源索引(下载|文档|插件)

<p>贴吧云签到在Git@OSC和Github均有仓库,任选(国内推荐Git@OSC)。</p> <h2 id="云签到主程序"><a href="#云签到主程序" class="headerlink" title="云签到主程序"></a>云签到主程序</h2><p><a href="https://git.oschina.net/kenvix/Tieba-Cloud-Sign" target="_blank" rel="noopener">Git@OSC</a> <a

2016/5/8
阅读更多

继续监控!使用树莓派+Motion实现实时视频监控并通过浏览器查看

<p>之前我们已经实现了<a href="https://kenvix.com/rpi-monitor">使用树莓派实现定时拍照监控并发送邮件到邮箱</a>,但是定时拍照有两个缺点:</p> <p>1.拍照每5min才进行一次,这中间会错过很多东西;提高拍照频率又会占用太多存储空间</p> <p>2.<strong>不具有即时性</strong>。有时候你想查看这个时候的监控,却得等一小时后才能看,因为邮件还没发送。</p> <p><strong><span style="color: #339966;">所以我们还需要视频监控</span></strong></p> <p><strong>首先确保手上有下列东西:</strong></p> <p>1.树莓派(以下简称RPI)一个</p> <p>2.一个USB免驱摄像头,支持YUY2或者JPEG均可(JPEG最佳)。RPICamera没试过</p> <p><strong>博主的配置:</strong> RPI3b 一个废弃的YUY2摄像头<br>

2016/4/30
阅读更多

自动获取Pixiv每日排行榜第一张图片(600x600 | 可用于博客背景图)

<p>代码来自@mokeyjay的 <a href="http://www.mokeyjay.com/archives/1063" target="_blank" rel="noopener">Pixiv每日排行榜Top50小部件</a>,本人做了一些修改来专用于输出第一张图片的完整图片(也可以输出其他的图片)</p> <p>可用于获取Pixiv每日排行榜第一张图片并直接输出,比如作为博客背景图像(配合高斯模糊食用效果最佳)</p> <img src="/post/autoget-pixiv-first-photo/20160428231413.jpg" title="20160428231413.jpg"> <hr> <p><strong>食用方法:</strong>(两种任选)</p> <p>第一种:直接把图片路径指向这个php文件</p> <p>第二种:图片路径指向保存文件路径(默认为pixiv.jpg),然后挂个计划任务每天自动调用pixiv.php来刷新图片</p> <hr> <p><strong>以下是代码:</strong>【建议保存为pixiv.php】</p>

2016/4/28
阅读更多

使用树莓派实现定时拍照监控并发送邮件到邮箱

<p><strong>首先确保手上有下列东西:</strong></p> <p>1.树莓派(以下简称RPI)一个</p> <p>2.一个USB免驱摄像头,支持YUY2或者JPEG均可(JPEG最佳)。RPICamera没试过</p> <p>3.一个支持SMTP的邮箱</p> <p><strong>博主的配置:</strong>RPI3b 一个废弃的YUY2摄像头 QQ邮箱</p> <p>那么,开工吧!</p>

2016/4/23
阅读更多

好压 V2.7 Beta1 绿色版——功能强大,良心的压缩软件

<p><span style="color: #ff0000;"><strong>注:</strong></span>本文所讲的是瑞创网络的好压,并非现在的毒瘤2345好压</p> <blockquote> <p>以下是官方介绍:</p> <p>好压压缩软件(HaoZip)是完全免费的新一代压缩软件。好压软件功能包括强力压缩、分卷、加密、自解压,相比其它压缩软件系统资源占用更少,压缩率比较高。<br>LZ大概从10年就开始使用好压了,功能强大,界面美观,确实是当年的业界良心</p> </blockquote> <p>可惜现在的好压已经彻底成了毒瘤,毕竟从了2345,哈哈。</p> <hr> <p>本文所推荐是12年发布的V2.7 Beta1版本</p> <p>该版本虽然在标题有丑陋的“2345”标识,但是并没有任何流氓行为,也没有流氓按钮,可以放心使用</p> <p>之所以推荐V2.7而不是早期版本,是因为这个版本的支持压缩很多格式(包括RAR),而且UI相当完善</p> <p><a href="http://baike.baidu.com/view/2348887.htm" target="_blank" rel="noopener">详细说明请戳这里</a>(百度百科)</p>

2016/3/26
阅读更多

任意语言实现读取压缩包注释

<p>前言:用记事本打开压缩包有惊喜。。</p> <p>首先需要了解一下什么是压缩包注释,为什么要使用压缩包注释</p> <h1 id="压缩包注释"><a href="#压缩包注释" class="headerlink" title="压缩包注释"></a>压缩包注释</h1><p>本质类似RAR+JPG(<a href="https://www.zhihu.com/question/20469727" target="_blank" rel="noopener">知乎</a>),就是在压缩包后面追加一堆文本</p> <p>这些文本就是注释了</p> <p>由此可见,压缩包注释并不是一种规范,但是大多数压缩软件在生成压缩包的时候都可以携带注释</p> <h2 id="为什么使用压缩包注释"><a href="#为什么使用压缩包注释" class="headerlink" title="为什么使用压缩包注释"></a>为什么使用压缩包注释</h2><p>1.注释本体不会被压缩,可以直接读取</p> <p>2.压缩软件可以查看和生成注释,生成注释很方便(推荐一下好压2.7老版,挺良心的)</p> <p>3.使用注释不会影响压缩的文件</p>

2016/3/5
阅读更多

自己实现QQ群自定义分享(管理员开启了群交易?)

<img src="/post/qqqun-custom-share/20160228151821.jpg" title="20160228151821.jpg"> <p>不依赖任何第三方网站,自己动手实现自定义的分享</p> <p>比如管理员已开启群交易</p>

2016/2/28
阅读更多

MoeCDN - 加速Gravatar/GoogleAPIs等无法在国内访问的资源

<p><strong>2016-2-23</strong> 新增PHP通用版本(只需一次include)</p> <p>这大概是我重建博客后第一次发布作品吧。。</p> <p>目前该插件支持三种博客系统:</p> <p>Wordpress-由<a href="http://i.qaq.cat/" target="_blank" rel="noopener">Balthild Ires</a> 维护</p> <p>Typecho -由<a href="https://www.imim.pw/" target="_blank" rel="noopener">Kirainmoe</a> 维护</p> <p>Emlog及PHP通用版 -由<a href="https://kenvix.com">Kenvix(博主)</a>维护</p> <p>(所以说emlog/通用版才是我的作品,请勿在意第一句)</p> <p>回到重点,什么是MoeCDN?</p> <h1 id="MoeCDN"><a href="#MoeCDN" class="headerlink" title="MoeCDN"></a>MoeCDN</h1><p><strong>MoeNet Public libraries CDN plugin</strong><br><strong> <a href="http://git.oschina.net/kenvix/MoeCDN-EMLOG#我们提供各项加速服务" target="_blank" rel="noopener"></a>我们提供各项加速服务.</strong></p> <p>CDN服务器由 <a href="https://www.andy1999.com/" target="_blank" rel="noopener">Andy1999</a> 维护</p> <h3 id="免费Gravatar-头像加速"><a href="#免费Gravatar-头像加速" class="headerlink" title="免费Gravatar 头像加速"></a><a href="http://git.oschina.net/kenvix/MoeCDN-EMLOG#免费-gravatar-头像加速" target="_blank" rel="noopener"></a>免费Gravatar 头像加速</h3><p>将gravatar.com的原有域名,直接指向gravatar.moefont.com即可<br>如果需要HTTPS支持,请使用gravatar-ssl.moefont.com ,<em>非HTTPS站点请勿使用</em></p> <h3 id="免费GoogleApis-加速"><a href="#免费GoogleApis-加速" class="headerlink" title="免费GoogleApis 加速"></a><a href="http://git.oschina.net/kenvix/MoeCDN-EMLOG#免费-googleapis-加速" target="_blank" rel="noopener"></a>免费GoogleApis 加速</h3><p>使用谷歌公共库可以加快网页加载速度,但是,众所周知的原因,在中国您不能享受这一点<br>但是现在,您只需替换googleapis.com为cdn.moefont.com即可享受这一切</p> <p>例如:<br>fonts.googleapis.com -&gt; cdn.moefont.com/fonts<br>ajax.googleapis.com -&gt; cdn.moefont.com/ajax</p>

2016/2/23
阅读更多

[Minecraft] WebLogin-连接到你的服务器来检查玩家是否可以登录

<h1 id="这是什么"><a href="#这是什么" class="headerlink" title="这是什么"></a>这是什么</h1><p>当玩家尝试连接到服务器时,插件会自动向你填写的服务器POST数据</p> <p>当服务器返回特定消息的时候,允许或者拒绝玩家登录(默认消息为&lt;[AccessOK]&gt;,其他消息将作为踢出玩家所显示的信息)</p> <img src="/post/minecraft-weblogin/20160201180346.png" title="20160201180346.png"> <p>1.7.10以下版本未测试,如果能用的话请告知。已测试1.12.2</p> <p>灵感来源于Beelogin,向其作者致谢</p> <h1 id="它有什么优势"><a href="#它有什么优势" class="headerlink" title="它有什么优势"></a>它有什么优势</h1><h3 id="1-更安全"><a href="#1-更安全" class="headerlink" title="1.更安全"></a>1.更安全</h3><p>比起传统的CrazyLogin之类的进游戏后再登录的插件,他更安全</p> <p>众所周知,CL无法拦截MOD发送的数据包,比如NEI(没登录也能修改世界时间之类的)</p> <h3 id="2-更开放"><a href="#2-更开放" class="headerlink" title="2.更开放"></a>2.更开放</h3><p>WebLogin只是个服务端,一切验证行为都由目标网页端完成,WebLogin几乎不参与交互</p> <p>比如MoeCraft设计的“按一下按钮登录”</p> <h3 id="3-功能强大"><a href="#3-功能强大" class="headerlink" title="3.功能强大"></a>3.功能强大</h3><ul> <li>它会向服务端提交 玩家名称,IP,UUID,时间 信息</li> <li>支持密码验证</li> <li>支持自定义消息(支持显示网页端给出的消息)</li> <li>当网页端服务器宕机时,可以设置是否允许玩家直接登录(此时可以使用Crazylogin等传统插件)

2016/2/1
阅读更多

Android卡刷包提示This package is for device: ... this device is ...的解决方案

<p>本人用的是mi4,刷入秋叶随风的合并分区包以后再刷6.0的包提示“This package is for device: cancro this device is .”</p> <p>看样子是不认设备了,就想到了直接从脚本里面干掉这个检测</p> <p>[这里是一张该问题的截图,然而博主在将博客从WP人工迁移到Hexo时找不到了]</p>

2016/1/31
阅读更多

<p>欢迎使用WordPress。这不是您的第一篇文章。编辑或删除它,然后开始写作吧!</p>

2015/11/22
阅读更多

给EMLOG评论框加上复选框[√]防止垃圾评论

<blockquote> <p>注:本文章撰写于2013-03-05,考虑到部分博客仍然在使用这种方法,故于2018-07-31人力导入。<br>我不推荐在AI技术已经如此发达的今天继续使用这种方法防御垃圾评论。</p> </blockquote> <p>这是打√的验证机制,打√至少比原生的验证码方便,比滑动条减少文件加载。只要能防住机器刷评论就行。手工垃圾评论不怕。现在把方法无偿分享出来,供各位有需要的emer使用。<br>

2013/3/5
阅读更多

欢迎使用emlog

<p>从今天起,做一个幸福的人。</p>

2008/4/25
阅读更多