PotatoPlus: 如何更新

由于 PotatoPlus 仍然处于预发布(pre-release)阶段,故时刻保持最新有助于排除各种程序错误,减少失败设计所带来的误操作等情况。这篇文章提供了如何获取及应用更新的一些信息。

如果你从 Chrome 应用商店 / Edge 外接程序 / Firefox (via GitHub Releases) 获取扩展

一般情况下,你无需关注 PotatoPlus 的更新情况,因为较新版本的 Chrome, Edge 和 Firefox 浏览器会自动检查扩展的更新,这个间隔大约为5小时(Firefox默认为24小时)。但请注意,如果你在 Edge 外接程序获得插件,由于其较慢的审核速度(短则几小时,长可达一周),可能需要等待几天才能获取到更新。

如果你的浏览器没有自动检查更新,或是你需要立即更新 PotatoPlus,可以试着按下面步骤手动检查更新。

手动检查更新

Google Chrome: 点选 Chrome 右上角插件按钮,再选择菜单底部的“管理扩展”;或是直接访问 chrome://extensions 。然后,打开右上角“开发者模式”的开关,再点击左侧“更新”按钮就可立即检查所有扩展的更新。

Microsoft Edge: 点选右上角菜单,并选择“扩展”;或是直接访问 edge://extensions 。然后,打开左下角“开发者模式”的开关,再点击右上方“更新”按钮就可立即检查所有扩展的更新。

Mozilla Firefox: 点选右上角菜单,并选择“扩展”;或是直接访问 about:addons 。然后,点击上方的齿轮按钮,并选择检查更新。

不同渠道获取更新的延迟

GitHub 源代码:即时

Userscript(GitHub Releases / NJU GitLab):即时

Firefox 扩展(GitHub Releases):少于 5 分钟

Chrome 应用商店:一般少于 30 分钟(插件升级到 Manifest V3 后审核速度显著提升)

Edge 外接程序:一般在三天之内,偶尔需要一周或更久

如果你使用 Tampermonkey 运行 Userscript

Tampermonkey 在默认情况下会每隔一天自动检查已启用的脚本更新,所以大多数情况下你的版本都会保持最新。当然,为了更及时地获得更新,你也可以调整这一更新的频率,只需进入 Tampermonkey 管理面板,并在“设置”选项卡中找到“更新频率”并进行调整。

如果 Tampermonkey 无法自动检查更新,或是你需要立即更新,可以点击 Tampermonkey 菜单中的“检查用户脚本更新“按钮来检查全部已启用脚本的更新。

如果你从 Firefox Browser Add-ons 商店获得扩展

由于 Mozilla 的审核政策,非普适性的扩展将无法在商店上架,需要自行分发。自 v0.2.3.1 起,PotatoPlus 的 Firefox 版本扩展将通过 GitHub Releases 分发,并支持自动更新。如果你正在使用旧版本,请切换到这个版本以获得最新功能。

如果你从 GitHub 源代码安装扩展

以此方式安装的插件暂时不能自动更新。你可以在有更新时通过 git pull 获取最新的源代码。

如果你从 GitHub Release 手动获取了 Chrome 扩展程序

GitHub Release 发布的 Chrome 扩展程序(.crx)可能无法自动更新(取决于浏览器和网络状况),故你可能需要手动检查最新版本。建议从 Chrome 网上应用店Microsoft Edge Add-ons 获取扩展。在更换渠道获取新的 PotatoPlus 前,请不要忘记移除旧的插件。

项目主页:

Mind Fragments – 关于iOS App Store的一些思考

注:本文中iOS亦指代iPadOS。

这个从第一代iPhone发布起就颇受争议的封闭式系统环境再一次被推上了风口浪尖。独家控制的审核机制与高达30%的应用内购买提成,这个安装App的唯一渠道正不断加大着应用的开发与运营成本;但在限制与约束的同时,这套系统在另一方面也表现出了它的优越之处。

首先来看看,强制使用的应用内购买(In-App Purchase, IAP)系统为用户和开发者各带来了什么。对于用户来讲,使用IAP付款具有高度的便捷性、安全性和隐私性。IAP无需输入信用卡信息或是跳转支付应用就可以快速完成支付,且不会面临欺诈风险,也没有用户数据交给开发者。对于开发者,IAP减少了配置各种支付系统的麻烦,支付的便捷性也减小了用户支付时的阻力,有利于增加收入。看起来很棒,所以Apple收了30%的提成。这30%的提成,让很多开发者将成本转化到了用户或个人收款方身上。

然后再看看其严格的审核政策。对于用户来说,这种审核政策也提高了App Store的应用质量,而且有App Store审核约束开发者的行为很多时候对个人数据隐私来说是一件好事;但也一定程度上提高了开发及维护成本,阻碍了App的多样性。

最后是iOS的封闭式系统。事实上,审核政策是强制使用IAP的前提,而iOS的封闭式系统也是各开发者能够履行App Store审核政策的前提。这套封闭系统让App Store成为了用户和开发者的唯一选择,让Apple的生态环境能够完美地运转。但前面一直没提到的一点是,这套封闭系统所有优点的前提,是信得过设备制造商——苹果公司。

IAP的支付数据由Apple经手,App Store的审核政策及实际审核流程由Apple负责,这个公司很显然地控制了一切。当这个公司负责一切比交给用户自己做做得好时,这就是一个优秀的机制,用户会越来越多、越来越喜爱这个服务、愿意为其付费;但当这个公司信誉不佳、服务差、严重偏离用户意愿、甚至侵犯用户权利时,用户自然会不断流失。

所以,在正常的情况下,这称不上是什么“垄断”,因为用户还有自由选择的权利。足够信任时,选择使用这些服务;而不再信任时,拿着所有的数据选择退出。问题就在于,”迁移数据“看起来没有那么简单,而且用户也不见得希望放弃这个服务的好处。

还有一种情况,这个公司利用用户最初的信任,“温水煮青蛙”般一步步改变,在不断从中获取利益的同时利用既得用户不断发展,成为恐怖的“独裁者”。

没错,Apple及其封闭式机制,和独裁者及其政权,是同样的道理。一个真正有能力的独裁者,其政权很可能会超越相对自由民主的政权;而一个碌碌无为、能力低下的独裁者则明显不能比得过其它政权。

说到底,这些问题都是“集中式数据处理”和“分布式数据处理”的选择问题。如果不能保证“集中”的质量,恐怕“分布”是最好的选择。

你会接受封闭的iOS和App Store吗?

在macOS Mojave及更新版本中配置gdb

参考链接:https://segmentfault.com/q/1010000004136334

在网上很容易找到相关教程,然而新版本的macOS带来了更严格的安全限制。详细步骤请见以上参考链接。

简要步骤:
1. 在Keychain Access(钥匙串访问)中为gdb创建证书;
2. 对证书添加信任;
3. 如果是macOS High Sierra (10.13)或以下版本的系统,直接对证书签名(在终端执行codesign命令);
如果是macOS Mojave (10.14)或以上版本的系统,撰写额外的xml文件并对gdb进行dubugger签名,命令是

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

其中,gdb-entitlement.xml是撰写的xml路径,gdb-cert是刚刚创建的证书名称,$(which gdb)是gdb可执行文件路径。

如果gdb经常卡死,可以参见https://github.com/Homebrew/homebrew-core/issues/49631

解决macOS中某些App需要安装Java 6环境的问题

更新:推荐使用Jar2App打包,更为方便。
https://github.com/Jorl17/jar2app


以下为原本的答案(不推荐,兼容性不好且麻烦)

很多小型的Java应用使用JarBundler打包,这种应用的Contents/MacOS/内通常会有一个JavaApplicationStub的程序。当运行该App时,会弹出需要安装Java 6的通知。然而,如果Mac上装了新版本的Oracle Java,按照指示安装Java 6时会提示磁盘中已安装了更新版本的Java而无法安装。这里采用一个修改plist文件+手写运行jar程序的方式来解决问题。

准备工作

首先在Finder中找到打不开的App,在选单中点击显示包内容,并在包内某处找到.jar文件,记下路径(这里以Logisim为例,是Contents/Resources/Java/logisim.jar)。如果可以直接运行该jar,一般就可以继续使用下面的方法。

修改plist文件

用文本编辑器打开Contents/Info.plist文件。尝试将<key>Java</key>一项中的Java改为其它字串,并启动App。如果仍然无法启动,请继续下面的步骤,或尝试修改其它带有Java字样的key。

编写启动程序

Contents/MacOS中一般会有一个JavaApplicationStub的程序(可在Info.plist中的CFBundleExecutable项查看运行的是哪个程序),这个JarBundler项目已经很旧了,我们需要自己动手做一个运行jar的程序。注意,如果在终端中无法执行java命令,可能需要按照提示安装JDK

运行jar的命令是

java -jar PATH_TO_JAR/xxx.jar

这里使用C++(C)编写可执行文件。jar文件的路径需要按照实际修改。

#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <mach-o/dyld.h>

int main() {
  char path[1024];
  char cmd[100];
  strcpy(cmd, "java -jar ");
  uint32_t size = sizeof(path);
  if (_NSGetExecutablePath(path, &size) == 0) {
    strcpy(strrchr(path, '/'), "/../Resources/Java/logisim.jar");
    system(strcat(cmd, path));
  } else {
    printf("Error: Buffer too small. Size required: %u.\n", size);
  }  
}

编译后将可执行文件放到Contents/MacOS/下,再回到plist文件中,修改CFBundleExecutable项下方的值为可执行文件的名字(这里是runJar)。

<key>CFBundleExecutable</key>
<string>runJar</string>

保存plist,就可以运行App啦!

使用电脑访问手机微信端网页并模拟位置

很多网页借助微信的open.weixin.qq.com进行登录,那么要想在电脑端打开这些网站,需要进行一些稍稍复杂的操作。注意这个方法仍然需要在手机上登录。需要在电脑端安装Fiddler。

背景:辣鸡教学立方的课堂签到、课堂测验等功能都强制要求用微信端打开,极为不方便。

配置Fiddler

这里采用Fiddler抓手机端发出的包,再将Cookies倒入电脑浏览器的方式进行。首先,在电脑端中允许远程连接,并设置远程连接端口。启用了防火墙的电脑,需要在防火墙中允许该端口的连入。

同时,需要开启解析HTTPS流量(Decrypt HTTPS traffic)的功能。无需在电脑中安装Fiddler的https证书。

在手机上安装HTTPS证书

打开手机浏览器,访问电脑IP地址:远程连接端口(如192.168.1.100:6868,实际IP地址需要使用ipconfig ifconfig等命令或在路由器的管理后台等地查看,远程连接端口按刚刚设置的填写)。如果正常出现了Fiddler的网页,说明防火墙配置正常。点击安装Fiddler的HTTPS证书。iOS需要在设置中点击信任,并在General(通用) -> About(关于本机) -> Certificate Trust Settings中完全信任该证书。

在手机上设置代理

随手机系统不同而不同,一般在手机的Wi-Fi功能中进入当前Wi-Fi的高级选项,设置手动代理,填入IP地址与远程连接端口。注意,若要让Fiddler成功抓包,需要暂时关闭手机上VPN等软件。

在微信中打开要打开的网页

在手机微信中打开目标网页并成功登录以后,在电脑的Fiddler中就应该可以看到数据包了。找一个登录后产生的到该网站的数据包,找到Cookies一栏(可能需要点进Inspectors内)。

录入Cookies

打开要访问的网站链接(可以从包的headers中找到,如教学立方的移动端链接),在浏览器中打开开发者工具(一般为F12或Ctrl + Alt + I或Alt + Command + I),进入Applications选项卡,在侧边栏中展开Cookies(这里是Chrome的方式,其它浏览器同理)。将刚才Fiddler面板的Cookies数据录入(一般SessionID之类的Cookies需要录入,可具体试验需要录入哪些Cookies),只需填写名称和值。

刷新页面,登录成功!

模拟位置

正常赋予网页权限即可进行基于定位的签到操作,若不想提供真实位置,还可以借助各种浏览器插件完成。如Chrome中可以使用Location Guard插件,对目标网页设置成Fixed Location即可。

macOS Automator 自动化操作 PowerPoint(格式转换、生成PDF、文件提取)

利用macOS的Automator,可以在Finder菜单中快速对一个或多个PowerPoint文稿进行格式转换、生成PDF、文件提取等操作。此操作需要macOS中安装较新版本的Microsoft Office PowerPoint。

背景:要从物理课的.ppt文件格式的操作中提取出音频用以加速播放及调整进度条,而.ppt文件无法直接解压缩,需要转换为.pptx格式再解压缩后提取出音频。

开始编写Quick Action流程

打开Automator App(默认位于Launchpad的Other文件夹中),新建Quick Action。Quick Action是可以加入Finder菜单、Services菜单的一类Workflow流程。

在左侧查找Filter Finder Items拖入右侧流程中,对输入文件的后缀名称进行过滤。这里仅接受ppt后缀名的文件,若要对pptx pps ppsx等后缀名的文件进行处理,也可以将其加入过滤器中并将规则All改为Any。

开始编写Apple Script,打开PowerPoint文件

参考资料:https://apple.stackexchange.com/questions/217004/how-do-i-get-automator-actions-for-microsoft-powerpoint-and-word

在左侧寻找Run Apple Script,拖入右侧流程图中。下面的代码将ppt转为pptx并保存在同一文件夹中。若要接受更多格式的后缀名,需要修改makeNewPath部分(这里是将后三位ppt截掉,换成pptx)。

on run {input, parameters}
	set output_list to {}
	tell application "Microsoft PowerPoint"
		launch
		set theDial to start up dialog
		set start up dialog to false
		repeat with i in input
			open i
			set output_path to my makeNewPath(i)
			save active presentation in output_path
			close active presentation saving no
			set end of output_list to output_path as alias
		end repeat
		set start up dialog to theDial
		quit
	end tell
	return output_list
end run

on makeNewPath(f)
	set t to f as string
	return (text 1 thru -4 of t) & "pptx"
end makeNewPath

若要转换为PDF格式,则需将

save active presentation in output_path

一句改为

save active presentation in output_path as save as PDF

并修改makeNewPath的部分:

on makeNewPath(f)
    set t to f as string
    if t ends with ".pptx" then
        return (text 1 thru -5 of t) & "pdf"
    else
        return t & ".pdf"
    end if
end makeNewPath

至此,将ppt转为pptx或将ppt/pptx转为pdf的功能已实现完毕。如不需要文件提取,请向后跳到“调试和使用”一节。

编写Shell Script提取pptx中的文件

使用压缩软件打开.pptx文稿即可读取其内容。若要实现自动化处理,可以使用Automator的Run Shell Script模块。

下面是提取全部音频文件的代码,Run Shell Script设置为将输入传达到参数中。

for f in "$@"
do
  unzip "$f" -d "$f Files/"
  mkdir "$f Audio"
  for file in `ls "$f Files/ppt/media/"`
  do
    if [ "${file##*.}" = "wav" ]; then
      mv -f "$f Files/ppt/media/$file" "$f Audio/"
    fi
  done
  rm -rf "$f Files/"
  rm -f "$f"
done

这段代码将pptx中附着的音频文件拷贝到与pptx相同目录下的*.pptx Audio文件夹中,并将源文件删除。

调试和使用

由于在Automator中测试并没有文件读入,测试时可以在流程开始处拖入Get Specified Finder Items指定输入文件(正式在Automator外使用前要删掉)。

之后,按下Command+S保存脚本,输入一个名字,就可以在Finder右键菜单的Services项或是文件的预览栏中找到刚刚编写的脚本了。

.workflow文件的存储位置在~/Library/Services/下,对其重命名即可改变菜单中的名称。

此处有一个问题:在较高版本的macOS中实际执行时会出现读写磁盘权限不足的问题。这时需要对该脚本赋予Full Disk Access权限。打开System Preferences,在Security & Privacy中找到Full Disk Access,左下角解锁后点击加号,将执行该脚本的Finder加入进去并赋予权限。Finder.app的路径在/System/Library/CoreServices中。

可以用了!

Mind Fragments – Dec.31st, 2019

Mind Fragments Screenshot Dec.31st, 2019

转眼间,现在这个头像已经用了三年了。

前段时间觉得,这几年我已经改变了很多,虽然还是和这个头像里一样喜欢思考、喜欢仰望星空,但现在的我,少了一份脚下的安稳,更多地,也许是在迷雾中找寻自己的方向。

改动了一次又一次,却始终找不到适合用作头像的平衡:要么是背景太灰暗,要么是主体不明晰…总之没有做出像之前那样既画面美观一目了然、又有些深刻寓意与象征的图片。

今天再次打开,改成了一个Banner,放到Blog上,居然还挺和谐的。

2019年的最后一个月,我的播放列表只剩下了 Frozen 里的那些歌。开始是沉浸在 Some Things Never Change Love Is an Open Door 的美好与和谐中,而后被每首歌之中的艺术和细节处理所震撼,再被 Anna 的坚定乐观的人格所打动,最后考完微积分,终于知道了 Let It Go 的含义。

有些时候,真的要学会 Let It Go。因为,并不是每条路都为你准备。

Standing frozen,
In the life I’ve chosen
You won’t find me,
The past is all behind me,
Buried in the snow

— Let It Go (Single Version) by Demi Lovato

2020,希望我能找到自己真正的方向,让所有的追求朝着那束黑暗中的光前进。

就像这幅图一样,只有在合适的位置,才能焕发出独特的光芒。

Don’t you know there’s part of me that longs to go

Into the unknown?

出发,探索未知。

Mind Fragments – Dec. 18th, 2019

更新:图书馆事件有了新回应,可能不对公众开放,但我觉得学校的回应很有问题。下文是此回应之前所写。

继饮水机事件之后,南京大学的又一起置学校利益于学生利益之上的事情。这其中的“学校利益”其实范围很广、也非常复杂。回忆一下刚开学的饮水机事件,作为一个大一新生,在充满期待的新学期还没开始之前,就透过各种渠道从网上了解了这件纠纷。未经任何通知强制安装的新饮水机需要“安装应用”、“扫码添加饮水机”、“签约支付宝免密支付”、“每次喝水都要打开应用操作”,且还存在冷热水计费不均一、连接问题导致不出水等等情况,可谓漏洞百出。这件事在校内小百合论坛反映无果后,又被捅到了知乎上,也一时间争论得沸沸扬扬。而处理的结果是什么呢?学校表示和“水杯子”公司沟通,而“水杯子”公司则发出通告免费饮水,一个多月后才开始收费。但是饮水机设备上的问题,是没有得到一丁点解决的。

再来看这次的图书馆开放事件。几天前有学生在各个媒体上看到了南京大学与支付宝签约、建设“智慧图书馆”以及可以允许外界人士进入图书馆、借阅书籍的消息,这件事情传开之后一石激起千层浪,引来了很多学生忧虑和不满。学校公关在这件事情与饮水机事件的共同特点是:之前没有任何通告、事后解释苍白无力,没有实质上改善任何问题、减少担忧。就在传出这个消息的几乎同时,杜厦图书馆的门禁就立即开始更换工程,所谓“南大速度”。(更正:可能与本事无关)

至于之前的饮水机事件,由于没有太多详情透露,我们可以大致猜测一下学校要换新饮水机的理由。首先,这种饮水机免去了一些人工抄表的麻烦(有传言说之前有学生抄表时存在违规行为),同时还可能在水杯子公司处得到一些利益,更是“顺应科技发展,建设智慧校园”的象征,所以学校觉得这种饮水机很好,没考虑到使用中的难处,也没想到会有这么多学生反对。而安装完成实际使用被很多学生吐槽之后,已经不太可能将原来的饮水机换回去了。首先水杯子公司是不会出钱再付这一笔安装费的,而且学校应该已经签署了某种协议,再撕毁的代价有些大,所以最后采用免费一段时间的方式平息民怨。

这两件事情其实有一个区别,就是在饮水机事件中,如果学校提前发出通告征求意见,那么如果学生反对意见比较多,学校应该是不会继续更换饮水机的,也就是这件事情可以通过提前通告来避免。而图书馆事件,学校肯定是知道很多学生会对此有怨言的,而这件事又非做不可,所以任何“提前通知”只能给这件事平添阻力,学校巴不得悄无声息地签约开放。饮水机事件的利益在于“撤回代价”,而本次事件的利益就是纯粹的“拒绝代价”。

那么这种事情频发的根本原因在哪里呢?难道我们这些考进来交了学费的学生就应该和校外人士享受平等的资源吗?学生要为学校的“无奈之举”买单吗?

以下内容经删改,未删改原文放在墙外:https://t.me/MindFragments/79

这也许是民主缺失的一个微观体现。

第一点是民主意识薄弱。学校安装饮水机首先考虑的不是使用者学生,认为这是“学校的权力”而不是“学生的权利”。在学校领导者的眼中,没有政策需要依靠民主决定的概念和思想。

第二点是民主抗争不力。在这些事件中,学生的抗争手段局限于在校内论坛、表白墙、QQ群、知乎等地发表观点,或是向学校反映意见,而这些都是没有办法威慑到学校的。饮水机事件中,一个月的免费就几乎完全平息了所有舆论,罢饮水杯子、拔掉电源等情况只是零星地出现,并没有形成任何震慑性的威力。毕竟使用饮水机比自己烧水/买瓶装水要方便得多,所以大多数学生还是选择了继续使用。这次的图书馆事件,学生连这些有效且无风险的抗争手段都没有了,只能任由学校“发号施令”。学校感受不到学生的压力,自然也会更加肆意使用他们的权力。

第三点是民主体制缺失。“学生会”等组织更多地成为了学校的工具。当学生利益与学校利益发生冲突时,学生会的核心成员一般会选择“自保”,即保持沉默或顺从老师、学校。这点可以从各组织办的各种活动窥见端倪。学生组织找学校和学生之间的平衡并更偏重校方,并不是真正地“为学生发声”。更何况,如今大多数学生组织都是由团委管理的,贯彻各种“精神”也是不可或缺的。这个组织,或许已经失去了它最重要的功能。

不知不觉写了这么多,最后放一首诗吧。

起初他们…

起初,纳粹抓共产党人的时候,

我沉默了,因为我不是共产党人。

当他们抓社会民主主义者的时候,

我沉默了,因为我不是社会民主主义者。

当他们抓工会成员的时候,

我沉默了,因为我不是工会成员。

当他们抓犹太人的时候,

我沉默了,因为我不是犹太人。

最后当他们来抓我时,

再也没有人站起来为我说话了。

— Martin Niemöller

PotatoPlus 土豆教务网改善工程

前言

PotatoPlus 项目旨在为土豆教务网(南京大学教务系统南京大学选课系统Beta)提供升级服务。若有能力,请多多种植土豆来支持教务网。

GitHub: cubiccm/PotatoPlus

Chrome Web Store Badge Microsoft Store

安装指引

通过插件安装

Google Chrome

打开 Chrome 应用商店中的 PotatoPlus,再点击“添加至 Chrome”即可。需要访问国际互联网。

从 Chrome 扩展文件(.crx)安装的方法

请注意,如果你无法访问 Chrome 应用商店,此方法安装的插件可能仍无法自动更新。

首先下载 GitHub Releases 页面的 Chrome 扩展文件

点击 Chrome 右上方的“插件”按钮并选择“管理扩展”,或直接访问 chrome://extensions/。

打开右上角的“开发者模式”开关,并将刚刚下载的 .crx 文件拖入安装即可。

从源代码安装的方法

请注意,此方法安装的插件无法自动更新。

首先下载项目源代码(https://github.com/cubiccm/potatoplus/archive/main.zip)并解压。

然后,点击Chrome右上方的“插件”按钮并选择“管理扩展”,或直接访问 chrome://extensions/。

打开右上角的“开发者模式”开关,并选择左上方按钮“加载未打包的扩展”,选择刚刚下载的源代码文件夹即可。

Microsoft Edge

访问 Edge 外接程序中的 PotatoPlus,再点选“获取”即可。

从 Chrome 应用商店安装的方法

打开 Edge 右上方的菜单并选择“扩展”,或直接访问 edge://extensions/,之后打开左下角的“允许从其它商店获取扩展”开关。

访问 Chrome 应用商店中的 PotatoPlus,点击“添加至 Chrome”即可。

Mozilla Firefox

请访问 GitHub Releases 页面 并在弹出的提示框中点击“安装”。

Firefox 暂不支持 Manifest v3 的更新,若要使用源码安装,请删除 manifest.json 并将 manifest-v2.json 更名为 manifest.json。

Safari (macOS)

可使用 Xcode 对插件进行转换和签名后在 Safari 中使用,可参考 官方文档

其它浏览器

对于使用 Chromium 内核的浏览器,请使用与在 Google Chrome 或 Microsoft Edge 类似的方法安装。你也可以 在此处获取 最新的 .crx 扩展文件。

不支持 Internet Explorer 等较旧的浏览器。

通过Userscript脚本安装

需要在浏览器中安装 Tampermonkey 等可以执行 UserScript 的插件。

Tampermonkey 的安装方法

Chrome:请在 Chrome 应用商店 安装Tampermonkey。需要访问国际互联网。

Edge:请在 Edge 外接程序 安装 Tampermonkey。如果链接无法跳转,请在商店中搜索。

Firefox:请在 Firefox Browser Add-ons 中安装Tampermonkey。

Safari(macOS):需要在 Mac App Store 中购买 Tampermonkey 插件;或使用免费的替代插件,如“UserScripts”。

安装插件后,可 访问这里获取 PotatoPlus 的 Userscript 脚本(GitHub)
如果上方的链接速度慢或无法访问,也可以试试这个 校内源

意见与反馈

你可以在 GitHub Issues 讨论问题与缺陷、提出问题与建议。

当然,也可以直接发送邮件至 illimosity@gmail.com 反馈使用问题,或是与我分享你的想法!

同时真诚地邀请你加入 邮件列表 接收最新动态。

更新历史

Sep. 13th, 2022 v0.3.9
https://github.com/cubiccm/PotatoPlus/tree/v0.3.9
^ 现在可以自动保存课程时间筛选器的周历
^ 界面更新和错误修复

Sep. 12th, 2022 v0.3.8
https://github.com/cubiccm/PotatoPlus/commit/4c38a8f0b614c67fd32ebb64565c6b9f87535920
+ 基于远程服务器的验证码识别
^ 错误修复与界面更新

Sep.7th, 2022 v0.3.7
https://github.com/cubiccm/PotatoPlus/commit/6082ff9cc055ed11f3059ed7ad5493405a6a8550
+ 在 xk.nju.edu.cn 新增了欢迎页面
^ 在 xk.nju.edu.cn 上的兼容性修复
^ 更新 Material Design 至 v14.0.0
^ 错误修复与界面更新
– 删除了教务系统(旧)的专业选课功能

*已知问题:加载长列表时偶尔会出现“操作过快”的提示。

展开历史版本

Jul.15th, 2022 v0.3.6
https://github.com/cubiccm/PotatoPlus/commit/1df7b1ad3b04ff6d3be2f850e968926683c8462a
^ 界面更新和错误修复

Apr.9th, 2022 v0.3.4
https://github.com/cubiccm/PotatoPlus/commit/9b744db79d3cbcfcc5ff2aca266ed4bf34e39516
^ 迁移至 Manifest V3
仅提供了 Chrome Web Store 版本的更新。

Dec.2nd, 2021 v0.3.3
https://github.com/cubiccm/PotatoPlus/commit/1f742ead374b57410bd79726a01296cd4c1b1e2d
+ 现在可以在“全校课程”查询中自定学期编号
+ Frozen Quote 模块现在也会显示 All Too Well (10 Minute Version) 的歌词

Sep.24th, 2021 v0.3.2
https://github.com/cubiccm/PotatoPlus/commit/4d46d5f03dac16cac0d277fe95625027e20a76b8
+ 新生美育选课及补选 #14 #16
+ 新增筛选器菜单,现在可以将教师名字填充至搜索框
^ 改变了展开和收起课程的交互方式
^ 课程列表及筛选器的错误修复
^ 增加对新选课系统的适配(beta)

Sep.9th, 2021 v0.3.1
https://github.com/cubiccm/PotatoPlus/commit/10ecdca5a19bcd2f63036b31fd17afbf5ff763d0
+ 完善筛选器功能
+ 现在可在新选课系统中启用
^ 更为紧致的列表布局
^ 登录及验证码部分的错误修复和改进

Aug.28th, 2021 v0.3
https://github.com/cubiccm/PotatoPlus/commit/70244807b63cefbe2a0d040aee0693650297901e
+ 重新设计的登录界面
+ 聚合选课功能(Beta)和课程选择器预加载
^ 改进的课程列表及筛选器
^ Material Design 更新以及功能和体验改进

Feb.19th, 2021 v0.2.7
https://github.com/cubiccm/PotatoPlus/commit/bb4dedefa213379b14ec01bec45f2667e1005e59
^ 成绩查询改进

Nov.28th, 2020 v0.2.6.1
https://github.com/cubiccm/potatoplus/commit/de73d530e77c937c7a813d72c665370a46bf77e0
^ 修复了跨院系初选列表无法加载的问题

Nov.28th, 2020 v0.2.6
https://github.com/cubiccm/potatoplus/commit/681bf05d41e8cbc54cf482cee39a5a9b9ce3f6f3
+ 适配通识课初选及公选课初选
^ 现在会显示正确的各学期周数
^ 改善初选界面布局
^ 错误修复及细节更新

Nov.17th, 2020 v0.2.5
https://github.com/cubiccm/potatoplus/commit/68d8f325da4ad033e95c3ee8a7870ddd28f07eef
+ 首页快捷访问菜单
+ 课程地点信息和时间圆环
+ 可更新的公告
^ 针对课程列表和筛选器的布局更新
^ 大量界面和细节改善
– 移除“新生测试”模块

Sep.30th, 2020 v0.2.4.1
https://github.com/cubiccm/potatoplus/commit/17bb7911bf0fd074c0156f011b1c2de410484330
+ 浮动控制栏

Sep.29th, 2020 v0.2.4
https://github.com/cubiccm/potatoplus/commit/135b34f0c16319704553007375c425dc8a33d7ce
+ GPA计算器
+ 全部学期成绩查看
– 移除了 xk.nju.edu.cn 的数据集

Sep.26th, 2020 v0.2.3.2
https://github.com/cubiccm/potatoplus/commit/aea6c06b35d20eea73666d120f3ca6b84bc160a8
+ 现在可以查询从 xk.nju.edu.cn 获取的数据
注:此版本并未发布为GitHub Release,且只在部分平台进行了更新。

Sep.25th, 2020 v0.2.3.1
https://github.com/cubiccm/potatoplus/commit/a36426d1069d81e4bad17e451933a91129045247
^ 小改进

Sep.25th, 2020 v0.2.3
https://github.com/cubiccm/potatoplus/commit/2902a212d2eef73ee4921e606624e7827130a6c7
+ 界面及交互更新
^ 针对体育补选的优化
– 移除对通识课初选界面的支持

Sep.24th, 2020 v0.2.2
https://github.com/cubiccm/potatoplus/commit/d65dc027596a6f57a4bfd3f97dddb959d7549267
^ 课程列表现在可以在阅读课程补选页面正常使用了
^ 空余课程过滤器改进
^ 数项列表加载时的细节优化

Sep.23rd, 2020 v0.2.1.1
https://github.com/cubiccm/potatoplus/commit/c42e8fe8d6d9c60ca9ce9973f4c2768f3d9efc41
+ 新课程列表已经应用在悦读经典补选中
– 工具栏已从悦读经典补选中移除

Sep.21st, 2020 v0.2.1
https://github.com/cubiccm/potatoplus/commit/939c0c125f8f267f80412e141bc360d8cedabd38
+ 新课程列表已经应用在体育选课中
^ 界面改进和错误修复
– 工具栏已从体育选课中移除

Anniversary! 今天距离 v0.0.1 的发布已经过去了整整一年。

Sep.19th, 2020 v0.2
https://github.com/cubiccm/potatoplus/commit/49686308ddf15c78ab71e4ff27177dd9a4965ec6
+ 全新课程列表
+ 快速搜索功能
+ 浮动消息面板
^ 导航栏界面改进
^ 课程筛选器改进
^ 自动刷新模块改进
^ 课程号和课程详情查看的改进
^ 动态效果改进
^ 全校课程界面的专业和年级选择器改进
– 工具栏以从含有新课程列表的界面移除

Sep.7th, 2020 v0.1.4.7
https://github.com/cubiccm/potatoplus/commit/99825b17f0be5edace4b79e206cb5d91f3622c96
^> 错误修复

Aug.31st, 2020 v0.1.4.6
https://github.com/cubiccm/potatoplus/commit/685dc2c160b6d571bac66d96c82b25a6dc550efe
^> 错误修复

Aug.31st, 2020 v0.1.4.5
https://github.com/cubiccm/potatoplus/commit/dd2f9612b1bda6d6262014e1fdce47a59237f036
^> 错误修复及源更新

Aug.27th, 2020 v0.1.4.4
https://github.com/cubiccm/potatoplus/commit/ee1294ab83e332bd1742271d17d68cf70b7b5b1c
^> 令人愉快的小改进

Aug.25th, 2020 v0.1.4.3
https://github.com/cubiccm/potatoplus/commit/1da5bb6d5d67fbb304da8e87b32f0e9e4d8a23ea
^> 令人愉快的小改进

Aug.23rd, 2020 v0.1.4.2
https://github.com/cubiccm/potatoplus/commit/03bd0e8af3de4a991d8e599dce633c51aa28a42e
+> 可选的提交统计信息选项(统计版本更新情况,基于Google Analytics)
^> 成绩查询改进

Aug.21st, 2020 v0.1.4.1
https://github.com/cubiccm/potatoplus/commit/a4eb49cbf1efdf288f1f1fbd6b134fe8af6202b1
^> 工具栏改进

Aug.19th, 2020 v0.1.4
https://github.com/cubiccm/potatoplus/commit/cf3a181524ad556398b687b1fc9acb8468f9370e
+> 使用本地存储来记住登录信息及过滤器选项(Beta)
^> 优化验证码识别算法,以及跳过难以识别的验证码
* 本次更新还包含大量体验改善及代码结构更新

Jul.6th, 2020 v0.1.3
https://github.com/cubiccm/potatoplus/commit/397b25e3457d4ebc8f09e5c63b3c5755201c41d7
+> 查询专业课程时可以自动填充年级和专业
+> 查看成绩时,成绩将默认隐藏
+> 将教服平台首页的弹窗提醒移至工具栏
^> 细节优化与改善

Jun.24th, 2020 v0.1.2.1
https://github.com/cubiccm/potatoplus/commit/1aa506e00e7da22883ca52ffc0029386758fbd20
+> 支持查看2020-1新学期课程

Jun.22nd, 2020 v0.1.2
https://github.com/cubiccm/potatoplus/commit/f829c9e94aebcd6260fb2610bcdd5afc7b22f746
+> 增加登录时验证码自动识别功能

Feb.16th, 2020 v0.1.1.1
https://github.com/cubiccm/potatoplus/commit/3850907593f271ad5692fa0943fcd5a6d6cf9640
^> 过滤器“空余课程”功能错误修复

Dec.23rd, 2019 v0.1.1
https://github.com/cubiccm/potatoplus/commit/2c37b2bab2f5a6b52f450eb9d893b178dfea59fd
+> 现在可以在专业选课中预先选择年级和专业
^> 用户界面更新
^> 更新自动刷新频率机制,使刷新更为自然

Dec.23rd, 2019 v0.1.0.3
https://github.com/cubiccm/potatoplus/commit/4eb95e4e0b8a2a1cea99a4e64abc74b582c64b32
^> 修复专业选课的自动选课问题

Dec.23rd, 2019 v0.1.0.2
https://github.com/cubiccm/potatoplus/commit/2873b7302bb757ad132227223e3ca7102871b8bb
+> 增加自动刷新频率调整

Dec.22nd, 2019 v0.1.0.1
https://github.com/cubiccm/potatoplus/commit/97f42fe6640ad39dfdcfbba72c5c84f3b910cc40
^> 修复了脚本可能不在首页执行的问题
^> 修复了部分未启用功能可能已经显示的问题

Dec.22nd, 2019 v0.1 [Pre-release]
https://github.com/cubiccm/potatoplus/commit/7b7f11a3d0ea3d5cb331b93321d8893515bf314f
+> 增加专业选课功能,可以根据课程名和教师名设定过滤器
+> 现在可以按照教师名过滤课程
+> 增加校内网jQuery源备用
+> 增加主页工具栏
^> 修复了部分课程无法自动选课的问题
^> 工具栏界面更新,现在双击可以收起工具栏
^> 现在选到课后会自动停止自动刷新和自动选课
^> 视觉及操作细节更新

Note: 到这一版本,所有的选课基本功能都已经完成了,故将版本号升级为0.1。对于1.0版本的预期,应该是可以流畅应对所有情况并且有一个友好的外观和操作体验。

Dec.20th, 2019 v0.0.3.8
https://github.com/cubiccm/potatoplus/commit/a4da9db57dda8bd02d1b08dd73fa8e46ca1164e2
+> 增加“课程评估”页面自动五星好评功能

Dec.20th, 2019 v0.0.3.7
https://github.com/cubiccm/potatoplus/commit/d6c391ecdd867e5de8ac6fb273e8f064d586d8fa
+> 增加了在“全校课程”中查看一学期全部课程的功能
^> 优化了“全校课程”的使用体验

Dec.20th, 2019 v0.0.3.6
https://github.com/cubiccm/potatoplus/commit/50dcc259bcbbc94cf43786bda140fb3af77da471
+> 增加了在“全校课程”中查看 2019-2020学年第二学期课程的功能

Dec.19th, 2019 v0.0.3.5
https://github.com/cubiccm/potatoplus/commit/5447344f14bb767851d8c962d17ad8da6184722f
^> 修复了自动答题模块的问题

Dec.19th, 2019 v0.0.3.4 [Pre-release]
https://github.com/cubiccm/potatoplus/commit/db7d5a186c540253563a30f20c5d528392a37fa2
+> 增加新生测试自动答题模块

Sep.24th, 2019 v0.0.3.3
https://github.com/cubiccm/potatoplus/commit/06be921e590dd165ed42fdbab7d9354859fd7d06
^> 修复了上课时间过滤器显示不正确的问题
^> 修复了跨专业选课界面无法显示课程详情的问题
^> 修复了在其它教务平台地址无法使用插件的问题
^> 跨专业选课功能优化

Sep.24th, 2019 v0.0.3.2
https://github.com/cubiccm/potatoplus/commit/64cf5d584f8b9f474308eb5713445e5af6aecdcd
^> 修复了自动选课点击失败的问题
^> 自动刷新:调整了随机间隔函数,使频率更为自然,总体刷新频率减慢
-> 取消了自动选课与自动刷新的绑定

Sep.24th, 2019 v0.0.3.1
https://github.com/cubiccm/potatoplus/commit/efd35a63c9c0d6fa9ebc44ec7f96e3d9f4dea210
+> 支持跨专业选课

Sep.23rd, 2019 v0.0.3
https://github.com/cubiccm/potatoplus/commit/10680b61daa7c9643fad054a1ed6b9a7b7ddd512
+> 适配通识课、通修课、阅读课选课
^> 过滤器更新,增加课程名称过滤

Note: 真的更新了很多很多,虽然日志只有区区两条

Sep.22nd, 2019 v0.0.2.1
https://github.com/cubiccm/potatoplus/commit/70f04883dda410418937f99915588eb7455dbd29
^> 界面及细节更新

Sep.22nd, 2019 v0.0.2
https://github.com/cubiccm/potatoplus/commit/d3ee4293f23eea6a69a214832eb54c0ec2557738
+> 加入自动选课功能,可按照过滤器选课
^> 过滤器功能更新:增加上课时间过滤、增加过滤器设置窗口
-> 删除无脑选课功能

Sep.21st, 2019 v0.0.1
https://github.com/cubiccm/potatoplus/commit/9809039f68daa1826fca6217f77fb4e1d3fe447c
首个版本
+> 支持体育选课
+> 过滤器:可过滤满员课程
+> 自动刷新:以随机频率刷新课程列表
+> 无脑自动选课:自动选取课程列表中有空余的课程
+> 关闭所有提示框:关闭所有javascript弹窗,选课更加便捷

另请参阅:

Step by Step — Site Building Record

  1. Aug.6th 逛了一圈,最后决定在星光互联尝试购买了新的VPS,优惠码30%OFF+年付17%OFF还是很合适的。
  2. 等了半天的审核,通过了以后开始部署系统:
    (1)$ sudo apt upgrade,更新各种关键程序;
    (2)安装apache:$ sudo apt install apache2;
    (3)安装php7:$ sudo apt install php;
    (4)安装mysql;
    (5)安装php7.2-mysql;
    (6)安装certbot。
  3. 使用BBR拥塞控制算法加速TCP连接,参考: https://teddysun.com/489.html
  4. 配置Certbot,为服务器安装https证书。
  5. 配置Apache:
    (1)修改默认路径;
    (2)添加Allow from All、Require All Granted等语句开放访问;
    (3)在mods-enabled中添加php。
  6. 配置MySQL:
    (1)执行mysql_secure_installation,完成MySQL安全安装;
    (2)在MySQL终端执行 mysql > ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘【密码】’; 修改root密码;
    (3)$ apt install phpMyAdmin,并在/etc/apache2/apache2.conf处添加Include /etc/phpmyadmin/apache.conf。
  7. 开始配置wordpress,直接访问网站即可开始配置。
  8. WordPress额外的操作:
    (1)权限设定:$ chown -R www-data:www-data [FOLDER];
    (2)提升文件上传上限,修改.htaccess:
    php_value upload_max_filesize 64M
    php_value post_max_size 64M
    php_value max_execution_time 300
    (3)安装插件、主题。
  9. 磁盘扩容:$ sudo resize2fs [disk device name] 。
  10. 安装并部署NextCloud到/disk下,小技巧:将NextCloud安装到特定路径中或其它端口上