宿舍用 UPS 不间断电源选购指南

前言

学校宿舍实施工作日 11:00 PM – 06:00 AM 断电策略,不利于赶 Deadline 以及 PT 下载;除此之外,整栋楼数百千瓦负载的通断无疑会产生浪涌,对于磁盘阵列和显示器都有着潜在危害。为此,在宿舍购置一台 UPS 不间断电源是很有必要的——不仅能在断电后为笔记本及移动设备充电,还能对接 NAS 和 HTPC 实现自动关机,更能提供 AVR 稳压,过滤电压突波,避免珍贵的数据和设备遭到损失。

选购

常规 UPS 从工作原理上大致可分为三种:

  1. 后备式 UPS:在市电正常时通过市电直接供电;市电中断或市电电压超出范围时,由电池逆变进行供电。成本较低,市电与电池切换时有一定延迟(一般的电子设备如果电源质量可靠,可忽略切换时延迟所造成的影响),一般输出方波,电压精度低。
  2. 在线式 UPS:逆变器始终处于工作状态,对于市电转化得到直流或电池的直流进行整流输出,电压精度高,空载大,噪音较大,成本较高。
  3. 在线互动式 UPS:市电正常时由市电直接供电;市电电压不稳时通过稳压电路或电池逆变供电;市电中断后通过电池逆变供电。具有 AVR 自动电压调节功能,噪音较小,成本介于后备式和在线式之间。

考虑到宿舍环境以及学生的经济能力,建议选购后备式 UPS 或在线互动式 UPS,兼顾成本与低噪音。

UPS 从供电时间上大致可分为两种:

  1. 标机:内置几块蓄电池,不提供外接电池接口。
  2. 长延时机:有的可以内置电池,一般通过外接电池方式连接 48V – 192V 蓄电池阵列,实现数小时以上的供电时间。

大部分学生宿舍均不允许存放蓄电池,且蓄电池连接线缆时如有不规范操作可能产生电弧并引发火灾,因此不建议在宿舍使用外接电池的 UPS 或是购置逆变器 + 蓄电池自行组装 UPS。

对于 UPS 功率的选择,一般按 UPS 标注功率等于 60% 实际负载来算:例如实际负载 600W,选购 1000VA 的 UPS。

目前市场上可以购买到民用 UPS 品牌以 APC(施耐德电气)、山特、克雷士为主。综合比对下来,作为法国品牌的 APC 电气方案比较专业成熟,相对而言价格也较另外两家国产 UPS 厂商贵出几倍,一般提供两年的保修;山特在京东和淘宝的口碑不错,价格也很实惠,一般提供三年保修。

如果手头比较拮据,可以考虑在闲鱼、转转等二手平台购买不含电池的品牌空机 UPS,然后自行从官方等渠道购买替换电池搭配使用。

经过均衡对比,我选择的是 APC 的 BR1000G-CN 在线互动式 UPS,提供最大 600W 负载和 50分钟(100W)的延时。对于 Windows 平台,APC 提供 PowerChute 软件,通过 USB 连接 UPS 进行高级管理,实现定时静音、自动关机等功能;对于 Unix 平台,有开源的 APCUPSD 提供支持。

如有关于宿舍 UPS 不间断电源选购的疑问,欢迎留言。

使用贴士

  • 对长延时有需求的同学不要图省事购买大功率 UPS:UPS 在长期轻载状态下会致使蓄电池过度放电,损害电池寿命。
  • 如果宿舍不断电,每三个月需对 UPS 进行一次充放电操作。
  • 放电后必须保证 UPS 有足够的充电时间(10 小时以上)。

PT 下载从入门到养老

介绍

PT (Private Tracker) 是一种基于私有 BT Tracker 服务器的资源传播形式,经授权的用户使用受允许的客户端进行种子制作与下载。相较于传统 BT,PT 站往往采取了严格的邀请制度以及免责制度来规避法律风险,同时要求用户客户端开启传输加密以绕过运营商的检测策略。

许多高清爱好者聚集在 PT 站,发布翻录的蓝光原盘、CD 以及录制的卫星电视讯号;得益于 Netflix、HBO 等高清流媒体在线视频平台的发展,近年也出现了一些 WEB-DL (Download from web)资源。

目前国内使用的 PT 站源码大部分为基于浙江大学 xiazuojie 团队所开发的开源整站项目 NexusPHP,基于 PHP + MySQL + Memcached。

国内 PT 站可以划分为两个系别:教育网 PT 站公网 PT 站

  • 教育网 PT 站

北邮人(北京邮电大学)、蒲公英(西北工业大学)、极速之星(北京理工大学)、六维空间(东北大学)为主。

原创影视资源较少,基本都是转载。Coursera、Udacity 等公开课资源(WEB-DL)以及电子书较多,此外还提供一些 Steam 游戏备份文件与学习资料等内容。

  • 公网 PT 站

传说中国有五大公网 PT 站:HDS、TTG、HDC、CHD、HDR。 后来经过世界版权日风波,HDStar 管理组被捕入狱,剩下的站也多多少少受到了一些影响,有的关闭了,有的隐没了。

目前以影视资源为主的有 HDChina(原 HDWinG)、CHDbits、CMCT 等站点;

以动漫资源为主的有 U2、Skyey Snow 天雪动漫

以音乐资源为主的有 OpenCD 皇后 PT。

对于用户,往往有以下要求:

  1. 上传、下载量
  2. 分享率(上传量/下载量)
  3. 魔力值(Bonus points,即积分,获得于用户赠送、活动奖励或做种)
  4. 最小做种时间(称为 H&R (Hit and Run),一些 PT 站禁止下完就跑的行为,要求用户至少保留做种一定时间)

生存指南

考核期

大部分站点都有邀请考核制度,需要在一个月时间内达成一定的上传量、下载量以及魔力值。考核由于不计算魔力值的兑换上传量,因此只能老老实实下载热门种子并做种。

考核后

对于一些以影视作品为主的网站,尽可能的下载热门种子,这样能更快的获得上传量。对于以小种为主的 PT 站,如 OpenCD 以及大部分教育网站点,则需要通过下载大量小体积种子并长时间做种以换取魔力值,再使用魔力值兑换上传。

养老期

此时混 PT 只为偶尔下几个资源,而不是那么注重参与了,因此保证一个良好的分享率以备不时之需是很有必要的。可以通过 SeedBox 例如 FeralHosting 配合 RSS 订阅来实现自动化无人值守下载,也可以自己搭建黑群晖等 NAS 或私人 HTPC 平台来进行自动化下载。

部分站点可以通过捐赠获得 VIP 头衔,从此不再需要担心分享率问题。

注意

  • 除非在特定板块,不要在某个 PT 站提到其他 PT 站点的名字
  • 尽可能地尊重发布者,不要在评论区发表不积极的意见
  • 遇到技术问题应先使用搜索引擎检索,而不是当伸手党
  • 不要作弊,否则可能会遭受连锁封禁(被多个站点同时封禁)
  • 不要持有小号
  • 谨慎选择邀请人,不要随意发送邀请
  • 不要在公共场合发送、索求邀请码

Intellij IDEA 执行 JUnit 单元测试的正确姿势

  1. 安装 JUnit 插件

    File -> settings -> Plugins -> Browse repositories -> JUnit -> JUnit Generator V2.0,安装后需重启 Intellij IDEA。

  2. 为当前项目添加依赖

    File -> Project Structure -> Libraries,找到 Jetbrain Intellij IDEA 的安装目录下的 lib 文件夹,添加 hamcrest-core-1.3.jarjunit-4.12.jar 以及 junit.jar

  3. 为待测试类添加测试样例

    在待测类中按 ALT + INSERT,选中 JUnit Test

解决 Office 套件多授权冲突

因为使用 KMS 或绑定多用户的原因,Office 界面可能会出现多个授权信息,形成冲突。

  1. 访问 Office 安装目录
  2. 以管理员权限执行指令 cscript ospp.vbs /dstatus 查看当前在册授权
  3. 记录失效 License 的后五位字符
  4. 以管理员权限执行指令 cscript ospp.vbs /unpkey:[Last 5 chars of license] 注销授权

WA 到死原因总结

  1. 警惕使用 n = -n; 进行数值正负转换

数值在内存中是以补码的形式进行存储的,因此 int 的数据范围为 [-2147483648, 2147483647],左右边界不对称。

当题目中声明所有数据均在 int 范围内时,应当警惕使用 n = -n;:如果值恰好为下界 -2147483648,则运算后结果仍为 -2147483648

  1. 警惕对于负数进行取模操作

不同语言中对于除法的实现算法不同,Java 和 C/C++ 中使用 truncate 除法(截断小数部分),Python 中使用 floor 除法(向下取整),因此负数取模的结果也不相同。

为了保证一致性,建议使用 (n + m) % m 的方式进行取模。

p.s. Ceiling 是向上取整。

macOS Mojave on VMware 调节分辨率

问题

基于 VMware Workstation 15 Pro 安装的 macOS Mojave 显示分辨率始终为 1024 x 768,安装 VMware Tools 与 SwitchResX 均未解决问题。

解决方案

打开 Terminal,执行 /Library/Application\ Support/VMware\ Tools/vmware-resolutionSet [width] [height],最大支持 8192 x 8192

由于虚拟机黑苹果最高只支持 128MB 显存,请不要将分辨率调过高,以免卡顿、花屏。

使用 GitLab 进行开发

开始工作

  1. Git – Downloads 下载最新版本的 Git 客户端。

  2. 运行 Git Bash,执行 ssh-keygen -t rsa -C “[your_email]@domain.com” 创建密钥对,得到 id_rsa.pub 公钥文件与 id_rsa 私钥文件。(务必妥善保管

  3. 参考 私人 GitLab 使用方法 中的 “SSH 配置” 章节,将公钥内容添加至自己的 GitLab 账号。

  4. 访问原始项目,点击中央的 fork 按钮,克隆一个分支至自己的账号。

  5. 访问自己刚刚 fork 出的分支,复制页面中间格式为 [email protected]:[username]/[project_name].git 的字符串。

  6. 在本地计算机上找到你想存放本项目的目录,例如 D:\Programs\,在 Git Bash 中执行 cd [绝对路径] 的方式跳转至该目录,例如 cd D:/Programs (注意前后斜杠的变化)。Windows 用户也可以直接打开该文件夹,右键点击空白区域,点击 Git Bash Here,在该文件夹中打开 Git Bash。

  7. 配置 Git 用户名和邮箱

    1
    2
    $ git config –global user.name "username"
    $ git config –global user.email "[email protected]"
  8. 执行 git clone [刚刚复制的字符串],将项目克隆到本地。

  9. 访问本地仓库,执行 git branch -a 浏览分支列表。

  10. 执行 git remote -v 查看 origin 是否为自己的远程仓库

  11. 执行 git remote add upstream [原始项目的 git 地址] 添加原始项目为同步源。

  12. 执行 git remote -v 查看 upstream 是否为原始项目。

  13. 执行 git fetch upstream 同步仓库。

  14. 执行 git checkout master 切换到 master 分支。

  15. 执行 git merge upstream/master 将原始项目的最新更改同步至本地。

  16. 执行 git push origin master 将本地仓库同步至自己的远程仓库。

  17. 执行 git checkout dev 切换到开发分支。

  18. 使用 Eclipse 打开项目,开始开发工作。

  19. 结束工作,执行 git status 查看修改过的文件。

  20. 执行 git diff 或者 git diff [filename] 比对文件改动,做最后检查。

  21. 执行 git commit -m “[注释]” 提交修改到 暂存区

  22. 执行 git push origin dev 将本地的开发分支提交至自己的远程仓库。

  23. 完成一个阶段性任务(程序功能)后,在 GitLab 页面上发起 Pull Request,项目主管将进行 Code Review 并提出修改建议,通过后将合并至主仓库。

注意事项

  1. 请在每天开始工作前将远程仓库的 master 分支同步至本地(在本地的 master 分支中使用 git fetch upstream 然后 merge)。
  2. 请基于最新的 dev 分支进行开发。(同步方法见上方)

开发帮助

QuickSort Dijkstra 3-Way Partitioning

思想

原始的 2-Way 快排在遇到大量重复数据时会退化为 O(n^2),为了解决这个问题,3-Way 快排被提出了。通过将区间分割为“小于”、“等于”和“大于”(基准数)三个部分,获得了趋近 O(nlogn) 的复杂度。不同于 2-Way 快排的是,我们在此选取一个基准数的值,而非一个基准元素。

(小声逼逼:当然为了方便也可以直接改进 2-Way 快排,在每一次基准数归位后遍历全区间元素,将等于基准数的元素交换到基准数旁边,也能获得等价的三个区间。当然,效率相对于 3-Way 快排有所下降,代码实现的复杂度也上升了。)

使用 i 下标表示“小于”区间的上界;使用 q 下标表示“等于”区间的上界;使用 j 下标表示“大于”区间的下界。

  1. 选取一个元素的值作为基准数值
  2. 判断 arr[q]pivot 的关系: 如果小于 pivot,交换 arr[i]arr[q]q 自增,i 自增 如果大于 pivot,交换 arr[j]arr[q]q ** 不变 **,j 自减 如果等于 pivotq 自增
  3. 重复步骤 2,直至 qj 相遇。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static void swap(int arr[], int a, int b)
{
/**
* Due to Java doesn't have reference, we can use XOR to swap the values
*/
if (a != b)
{
arr[a] ^= arr[b];//a = a^b
arr[b] ^= arr[a];//b = b^a^b = a
arr[a] ^= arr[b];//a = a^b^a = b
}
}
public static void quickSort(int f[], int lo, int hi)
{
if (lo >= hi)
return;

int pivot = f[(int)Math.random() % (hi - lo + 1) + lo];//randomize pivot

/**
* i "less" upper bound
* j "more" lower bound
* q "equal" upper bound
*
* ##less## ->i ##equal## ->q ##unknown## j<- ##more##
*/

int i = lo, j = hi, q = lo;

//partition
while (q <= j)
{
if (f[q] < pivot)
swap(f, q, i++);
else if (f[q] > pivot)
swap(f, q--, j--);//the exchanged value need to be check, so we q--
++q;
}
//recursion
quickSort(f, lo, i);//left
quickSort(f, j+1, hi);//right
}