mirror of https://github.com/Nofated095/blog
update tags
This commit is contained in:
parent
dbf37cf21b
commit
aac93b3970
|
@ -27,13 +27,13 @@ toc: true
|
|||
|
||||
最后还是郑老师出的招,人工收集帖子然后发到他小号朋友圈。一开始我不是很喜欢这个方法,但是确实没有什么自动化的功能,考虑到那时候我觉得可能树洞项目会和我的博客评论一样冷清,于是便麻烦郑老师去手动转。
|
||||
|
||||
# 前端设计
|
||||
## 前端设计
|
||||
|
||||
后端是采用的 *Waline*,在事后的角度出发,当时选择他切切实实是没错的。但是前端设计将会怎样呢?
|
||||
|
||||
最开始我想的是直接用 *Waline Example*,也就是他部署完在根目录默认会提供的一个评论区示例。这个方法使用了一段时间我的眼睛就受不了了,又是默认英文,还有各种不顺眼的地方,而且空空荡荡,过于简洁,无法自定义其他内容,属实令人难蚌。
|
||||
|
||||
![]()
|
||||
![Waline Example]()
|
||||
|
||||
所以到最后,还是我出手写了前端,也不能算前端吧,就是一个 HTML 5 的页面,这样通过引入就可以实现固定内容 + 评论区这样的排版了。
|
||||
|
||||
|
@ -45,210 +45,28 @@ toc: true
|
|||
|
||||
有意思的是, 20 号夜里郑老师在动漫社微信群里水了一下树洞的开发情况,说明了要大年初一上线后,一大群同学们听说~~表白墙~~搞完了,纷纷提出要~~内测资格~~。而且真的想体验的人还很多,于是乎,~~迫于无奈,~~ 郑老师官宣了树洞的网址,大家可以在微信里内置浏览器里直接发帖。
|
||||
|
||||
## 分析与修改代码
|
||||
## 非同凡响的热度
|
||||
|
||||
[Clansty/Q2TG](https://github.com/Clansty/Q2TG) 的最新版本 `v3`,也就是 `rainbowcat` 是基于 *TypeScript* 开发的。那就开始吧!但是从哪里开始呢?在随意翻看了几个文件后,我将视线锁定在了 `tgUser` 这个变量上。~~因为写的真的太明显了,简直就是一眼丁真。~~
|
||||
在地址开放之后,好多同学纷纷来到树洞~~来测试、表白、发癫~~。在写前端的时候,我在上方的说明部分添加了一个统计信息的栏,来统计访问次数和评论数量,这样能很直观地看到访问量相关的数据。
|
||||
|
||||
于是我尝试在 GitHub 搜索了一下,没想到就可以直接开始肝了(
|
||||
>确实是“非同凡响”,为之震撼的使用量。
|
||||
|
||||
![](https://imgsrc.baidu.com/super/pic/item/377adab44aed2e739f6b04e9c201a18b86d6fa71.jpg)
|
||||
非同凡响可能有点偏主观,但是我盯着树洞前端刷新了几次,评论数量和访问量真的是增长的很快,这是最开始开放时同学们表达的最强烈的时候。
|
||||
|
||||
### ❌ 脑瘫思路 —— Undefined
|
||||
当天晚上,评论就已经有 150 多条了,因为我基本上不需要再做什么调整,所以满怀着激动,安心了下来。
|
||||
|
||||
分析了一下之后,我就打算开始着手删掉 `tgUser` 相关的内容。但在删到快一半的时候,我突然~~脑溢血地~~想到,如果我们在功能实现的部分保留所有的 `tgUser`,但是我们让他 `Undefined`,会不会就能直接非常方便地 disable 掉 User Bot 呢?(逃
|
||||
![数据库统计的上线当天的评论总数]()
|
||||
|
||||
然后我就真的大智若愚(大若智)地去试了。
|
||||
令人捧腹的是,因为评论的数量太多,亲爱的郑老师非常崩溃地复制粘贴,工作量巨大。并且因为是一条评论一个朋友圈,所以他小号还顺便朋友圈刷屏了(笑。
|
||||
|
||||
很容易猜到 `tgUser` 应该是在机器人第一次配置的时候就被定义了,所以我就打算去 `SetupControlers.ts` 看看能不能在这里动动手脚,跳过里面地 User Bot 登录过程。
|
||||
![郑老师崩溃瞬间(乐]()
|
||||
|
||||
```ts SetupControlers.ts>folded
|
||||
import Telegram from '../client/Telegram';
|
||||
import SetupService from '../services/SetupService';
|
||||
import { Api } from 'telegram';
|
||||
import { getLogger, Logger } from 'log4js';
|
||||
import { Button } from 'telegram/tl/custom/button';
|
||||
import setupHelper from '../helpers/setupHelper';
|
||||
import commands from '../constants/commands';
|
||||
import { WorkMode } from '../types/definitions';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
import { md5Hex } from '../utils/hashing';
|
||||
import Instance from '../models/Instance';
|
||||
import db from '../models/db';
|
||||
## 评论监测与审核
|
||||
|
||||
export default class SetupController {
|
||||
private readonly setupService: SetupService;
|
||||
private readonly log: Logger;
|
||||
private isInProgress = false;
|
||||
private waitForFinishCallbacks: Array<(ret: { tgUser: Telegram, oicq: OicqClient }) => unknown> = [];
|
||||
// 创建的 UserBot
|
||||
private tgUser: Telegram;
|
||||
private oicq: OicqClient;
|
||||
由于树洞的特殊性,只是排除黄赌毒的内容并不够,需要再排除各种开盒、水贴、不尊重老师的内容。这个时候单靠自动审核(其实也没有)就远远达不到目的,必须引入人工审核。
|
||||
|
||||
constructor(private readonly instance: Instance,
|
||||
private readonly tgBot: Telegram) {
|
||||
this.log = getLogger(`SetupController - ${instance.id}`);
|
||||
this.setupService = new SetupService(this.instance, tgBot);
|
||||
tgBot.addNewMessageEventHandler(this.handleMessage);
|
||||
tgBot.setCommands(commands.preSetupCommands, new Api.BotCommandScopeUsers());
|
||||
}
|
||||
最开始所有网页端的评论都是我审核、删除,郑老师把控微信朋友圈那边的。流量不大,我审核起来也很轻松。后来又有两个好朋友过来,想要帮忙审核,我就让他们注册账号,提拔他们为管理员权限,他们就也来帮我审核了,也很轻松,因为 *Waline* 前端写的很容易操作。
|
||||
|
||||
private handleMessage = async (message: Api.Message) => {
|
||||
if (this.isInProgress || !message.isPrivate) {
|
||||
return false;
|
||||
}
|
||||
似乎我的工作到这里就完了,~~只要看着数据库会不会爆炸就行了。~~但实际上并没有完。因为很快便有用户提出了新的问题。
|
||||
|
||||
if (message.text === '/setup' || message.text === '/start setup') {
|
||||
this.isInProgress = true;
|
||||
await this.doSetup(Number(message.sender.id));
|
||||
await this.finishSetup();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
private async doSetup(ownerId: number) {
|
||||
// 设置 owner
|
||||
try {
|
||||
await this.setupService.claimOwner(ownerId);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('Claim Owner 失败', e);
|
||||
this.isInProgress = false;
|
||||
throw e;
|
||||
}
|
||||
// 设置工作模式
|
||||
let workMode: WorkMode | '' = '';
|
||||
try {
|
||||
while (!workMode) {
|
||||
const workModeText = await this.setupService.waitForOwnerInput('欢迎使用 Q2TG v2\n' +
|
||||
'请选择工作模式,关于工作模式的区别请查看<a href="https://github.com/Clansty/Q2TG#%E5%85%B3%E4%BA%8E%E6%A8%A1%E5%BC%8F">这里</a>', [
|
||||
[Button.text('个人模式', true, true)],
|
||||
[Button.text('群组模式', true, true)],
|
||||
]);
|
||||
workMode = setupHelper.convertTextToWorkMode(workModeText);
|
||||
}
|
||||
this.setupService.setWorkMode(workMode);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('设置工作模式失败', e);
|
||||
this.isInProgress = false;
|
||||
throw e;
|
||||
}
|
||||
// 登录 oicq
|
||||
try {
|
||||
let uin = NaN;
|
||||
while (isNaN(uin)) {
|
||||
uin = Number(await this.setupService.waitForOwnerInput('请输入要登录 QQ 号'));
|
||||
}
|
||||
const platformText = await this.setupService.waitForOwnerInput('请选择登录协议', [
|
||||
[Button.text('安卓手机', true, true)],
|
||||
[Button.text('安卓平板', true, true)],
|
||||
[Button.text('iPad', true, true)],
|
||||
[Button.text('macOS', true, true)],
|
||||
]);
|
||||
const platform = setupHelper.convertTextToPlatform(platformText);
|
||||
let password = await this.setupService.waitForOwnerInput('请输入密码', undefined, true);
|
||||
password = md5Hex(password);
|
||||
this.oicq = await this.setupService.createOicq(uin, password, platform);
|
||||
this.instance.qqBotId = this.oicq.id;
|
||||
await this.setupService.informOwner(`登录成功`);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('登录 OICQ 失败', e);
|
||||
this.isInProgress = false;
|
||||
throw e;
|
||||
}
|
||||
// 登录 tg UserBot
|
||||
if (this.instance.userSessionId) {
|
||||
await this.setupService.informOwner('userSessionId 已经存在,跳过');
|
||||
}
|
||||
else
|
||||
try {
|
||||
const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot,请输入你的手机号码(需要带国家区号,例如:+86)');
|
||||
await this.setupService.informOwner('正在登录,请稍候…');
|
||||
this.tgUser = await this.setupService.createUserBot(phoneNumber);
|
||||
this.instance.userSessionId = this.tgUser.sessionId;
|
||||
await this.setupService.informOwner(`登录成功`);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('创建 UserBot 失败', e);
|
||||
this.isInProgress = false;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private async finishSetup() {
|
||||
this.tgBot.removeNewMessageEventHandler(this.handleMessage);
|
||||
this.isInProgress = false;
|
||||
await this.setupService.finishConfig();
|
||||
this.waitForFinishCallbacks.forEach(e => e({
|
||||
tgUser: this.tgUser,
|
||||
oicq: this.oicq,
|
||||
}));
|
||||
}
|
||||
|
||||
public waitForFinish() {
|
||||
return new Promise<{ tgUser: Telegram, oicq: OicqClient }>(resolve => {
|
||||
this.waitForFinishCallbacks.push(resolve);
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
可以很清楚看到 *99 - 144* 行是注册 Telegram User Bot 的部分,那我们简单修改一下。
|
||||
|
||||
```diff 99 - 144
|
||||
// 登录 tg UserBot
|
||||
if (this.instance.userSessionId) {
|
||||
await this.setupService.informOwner('userSessionId 已经存在,跳过');
|
||||
}
|
||||
- else
|
||||
- try {
|
||||
- const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot,请输入你的手机号码(需要带国家区号,例如:+86)');
|
||||
- await this.setupService.informOwner('正在登录,请稍候…');
|
||||
- this.tgUser = await this.setupService.createUserBot(phoneNumber);
|
||||
- this.instance.userSessionId = this.tgUser.sessionId;
|
||||
- await this.setupService.informOwner(`登录成功`);
|
||||
- }
|
||||
+ else {
|
||||
+ await this.setupService.informOwner('Telegram User Bot 创建过程跳过');
|
||||
+ }
|
||||
catch (e) {
|
||||
this.log.error('创建 UserBot 失败', e);
|
||||
this.isInProgress = false;
|
||||
throw e;
|
||||
}
|
||||
```
|
||||
|
||||
非常好,不是吗?于是我就乐呵的跑了 GitHub Actions 构建 Docker Image,然后发现居然还真构建成功了!于是我就更乐呵的去 `/setup` 我的机器人,没想到也正常跳过了!
|
||||
|
||||
当然这么改别的肯定是寄的,测试了一下转发功能完全废的。为什么相比也很清楚。~~你 `Undefined` 别的文件肯定不服会罢工啊!~~
|
||||
|
||||
### ✔️ 正确的打开方式 —— 扬了 tgUser
|
||||
|
||||
在经历了全程脑瘫的过程后,我终于稍微清醒和安分了一点,开始着手去删 `tgUser` 和与其相关的部分。
|
||||
|
||||
当然这里要非常感谢 [凌莞](https://github.com/Clansty),看着亲爱的代码真是赏心悦目,如看代码眼暂冥,~~简直就是天籁~~。
|
||||
|
||||
在修改时,我发现 `personal` 代表个人模式,再结合 `tgUser` 的分布情况,可以很轻松的注释掉大部分有关代码,遇到与个人模式有关的部分都可以直接注释掉,只要符合语法就不会对群组模式产生奇奇怪怪的影响。
|
||||
|
||||
你可以在 [这里](https://github.com/Clansty/Q2TG/compare/rainbowcat...Nofated095:Q2TG:rainbowcat?expand=1) 找到我对 *Q2TG* 所有的修改。
|
||||
|
||||
## 功能测试
|
||||
|
||||
在构建 Image 完成后,我激动地~~关掉了 `v1` 的 Container~~ 在服务器上拉取并部署。
|
||||
|
||||
![部署过程](https://imgsrc.baidu.com/super/pic/item/b58f8c5494eef01fa2599500a5fe9925bd317da2.jpg)
|
||||
|
||||
![正常工作的瞬间](https://imgsrc.baidu.com/super/pic/item/4e4a20a4462309f7af2920d7370e0cf3d6cad6b5.jpg)
|
||||
|
||||
~~真是感动到让人落泪~~。
|
||||
|
||||
![文件转发](https://imgsrc.baidu.com/super/pic/item/2cf5e0fe9925bc31c1e08c5d1bdf8db1ca1370b2.jpg)
|
||||
|
||||
## 后记
|
||||
|
||||
这篇文章写于部署成功后的几天。经过了几天的功能测试,除了机器人无法检测 *Telegram* 删除的消息,需要用户对发出的消息编辑或回复 `/rm` 才能删除和撤回消息,但整体来看功能都是正常可以使用的,而且完全去除了 User Bot。
|
||||
|
||||
需要注意的是,去除了 User Bot 后,个人模式几乎无法工作。更多关于去 User Bot 的 Q2TG 项目的内容(包括部署方法、注意事项等)请查看 [Nofated095/Q2TG](https://github.com/Nofated095/Q2TG)。
|
||||
## 用户反馈与优化
|
||||
|
|
|
@ -1,121 +0,0 @@
|
|||
---
|
||||
title: Gridea 魔改使其支持 Gitee Pages
|
||||
cover: https://pic.rmb.bdstatic.com/bjh/0d9eb92f67ba93b514f2555a70eacebe.png
|
||||
date: 2020-05-09
|
||||
tags:
|
||||
- Gridea
|
||||
- 博客
|
||||
categories:
|
||||
- 写 BUG 日常
|
||||
- 野生技术协会
|
||||
---
|
||||
Gridea 是一款很好用的博客写作软件。它功能全面但可惜部署不支持国内的 Gitee 代码储存仓库。本篇文章将对 Gridea 进行源码上的修改使其支持 Gitee Pages。
|
||||
<!--more-->
|
||||
{% raw %}<article class="message is-info"><div class="message-body">{% endraw %}
|
||||
这篇文章中对 Gridea 的修改已经合并到 Gridea 再 GitHub 仓库的主分支,所以没有必要再进行下面的处理。
|
||||
你可以去 Gridea 的 [Releses](https://github.com/getgridea/gridea/releases/latest) 中下载 Gridea 的最新构建。
|
||||
Gitee Pages 的支持在 [v0.9.3](https://github.com/getgridea/gridea/releases/tag/v0.9.3) 中被加入。
|
||||
{% raw %}</div></article>{% endraw %}
|
||||
|
||||
## 教程
|
||||
|
||||
### 克隆源代码
|
||||
|
||||
```
|
||||
# Github 官方
|
||||
git clone https:/github.com/getgridea/gridea.git
|
||||
|
||||
# Gitee 镜像
|
||||
git clone https://gitee.com/mirrors/gridea.git
|
||||
|
||||
# Gitee
|
||||
git clone https://gitee.com/fehey/gridea.git
|
||||
```
|
||||
|
||||
以上四个仓库都是可以的。你可以自行选择。
|
||||
|
||||
```
|
||||
# 进入 Gridea 的目录
|
||||
cd gridea
|
||||
```
|
||||
|
||||
## 修改源码
|
||||
|
||||
``` diff src/server/deploy.ts >folded
|
||||
this.platformAddress = ({ // 18行
|
||||
github: 'github.com',
|
||||
coding: 'e.coding.net',
|
||||
+ gitee: 'gitee.com',
|
||||
} as any)[setting.platform || 'github']
|
||||
|
||||
const preUrl = ({
|
||||
github: `${setting.username}:${setting.token}`,
|
||||
coding: `${setting.tokenUsername}:${setting.token}`,
|
||||
+ gitee: `${setting.username}:${setting.token}`,
|
||||
} as any)[setting.platform || 'github']
|
||||
|
||||
this.remoteUrl = `https://${preUrl}@${this.platformAddress}/${setting.username}/${setting.repository}.git`
|
||||
```
|
||||
|
||||
``` diff src/server/events/deploy.ts>folded
|
||||
ipcMain.removeAllListeners('remote-detected') // 17行
|
||||
|
||||
ipcMain.on('site-publish', async (event: IpcMainEvent, params: any) => {
|
||||
+ console.log(platform)
|
||||
const client = ({
|
||||
'github': deploy,
|
||||
'coding': deploy,
|
||||
+ 'gitee': deploy,
|
||||
'sftp': sftp,
|
||||
} as any)[platform]
|
||||
|
||||
|
||||
const client = ({ // 38行
|
||||
'github': deploy,
|
||||
'coding': deploy,
|
||||
+ 'gitee': deploy,
|
||||
'sftp': sftp,
|
||||
} as any)[platform]
|
||||
|
||||
const result = await client.remoteDetect()
|
||||
event.sender.send('remote-detected', result)
|
||||
})
|
||||
```
|
||||
|
||||
``` diff src/views/setting/includes/BasicSetting.vue >folded
|
||||
<a-radio-group name="platform" v-model="form.platform"> // 5行
|
||||
<a-radio value="github">Github Pages</a-radio>
|
||||
<a-radio value="coding">Coding Pages</a-radio>
|
||||
+ <a-radio value="gitee">Gitee Pages</a-radio>
|
||||
<a-radio value="sftp">SFTP</a-radio>
|
||||
</a-radio-group>
|
||||
</a-form-item>
|
||||
<a-input v-model="form.domain" placeholder="mydomain.com" style="width: calc(100% - 96px);" />
|
||||
</a-input-group>
|
||||
</a-form-item>
|
||||
- <template v-if="['github', 'coding'].includes(form.platform)">
|
||||
+ <template v-if="['github', 'coding', 'gitee'].includes(form.platform)">
|
||||
<a-form-item :label="$t('repository')" :labelCol="formLayout.label" :wrapperCol="formLayout.wrapper" :colon="false">
|
||||
<a-input v-model="form.repository" />
|
||||
</a-form-item>
|
||||
export default class BasicSetting extends Vue {
|
||||
|
||||
|
||||
&& form.branch // 134行
|
||||
&& form.username
|
||||
&& form.token
|
||||
- const pagesPlatfomValid = baseValid && (form.platform === 'github' || (form.platform === 'coding' && form.tokenUsername))
|
||||
+ const pagesPlatfomValid = baseValid && (form.platform === 'gitee' || form.platform === 'github' || (form.platform === 'coding' && form.tokenUsername))
|
||||
const sftpPlatformValid = ['sftp'].includes(form.platform)
|
||||
&& form.port
|
||||
```
|
||||
|
||||
## 测试与编译
|
||||
|
||||
``` 需要安装 yarn 和 electron
|
||||
yarn
|
||||
# 测试
|
||||
yarn electron:serve
|
||||
# 生成
|
||||
yarn electron:build
|
||||
```
|
|
@ -1,9 +1,10 @@
|
|||
---
|
||||
title: 开发树洞有感
|
||||
title: 记一次探索班级小管家 API 的过程
|
||||
date: 2023-01-22
|
||||
cover: https://pic.rmb.bdstatic.com/bjh/a5a79c32320475bd69aed54f5371065a.png
|
||||
tags:
|
||||
- 总结
|
||||
- 网络
|
||||
- API
|
||||
categories:
|
||||
- [写 BUG 日常, 野生技术协会]
|
||||
- [日常生活, 学业, 高中]
|
||||
|
|
|
@ -3,8 +3,8 @@ title: B 站外嵌视频播放器防踩坑
|
|||
date: 2020-09-21
|
||||
cover: https://pic.rmb.bdstatic.com/bjh/c6d5d344aef87ec4511ff2521dd304bd.jpeg
|
||||
tags:
|
||||
- HTML5
|
||||
- Bilibili
|
||||
- 网络
|
||||
- API
|
||||
categories:
|
||||
- 写 BUG 日常
|
||||
- 野生技术协会
|
||||
|
|
|
@ -4,32 +4,31 @@ date: 2022-03-13
|
|||
cover: https://pic.rmb.bdstatic.com/bjh/b091de2c1d546bbf6311fe5ca744014a.png
|
||||
tags:
|
||||
- Windows
|
||||
- WinToGo
|
||||
- 总结
|
||||
categories:
|
||||
- 写 BUG 日常
|
||||
- 野生技术协会
|
||||
toc: true
|
||||
---
|
||||
折腾 WinToGo 路上踩过的坑。
|
||||
折腾 Windows To Go 路上踩过的坑。
|
||||
<!--more-->
|
||||
> 为了方便,这篇文章中的 Windows To Go 将统一表示为 WinToGo。本人为 WinToGo 轻度使用用户,也不是折腾类型的人,下面内容仅供参考。
|
||||
> 本人为 Windows To Go 轻度使用用户,也不是折腾类型的人,下面内容仅供参考。
|
||||
|
||||
## 硬盘
|
||||
|
||||
我觉得 WinToGo 最重要的部分就是硬盘的选择,并不是所有的储存设备都能跑 WinToGo。如果你没有读写效率比较高的固态盘那我并不建议你去制作并使用 WinToGo——卡得不成样子,非常让人难受,所以不要指望你那小小的移动硬盘能用柔弱的身躯带 WinToGo。比如我,目前使用的是联想(thinkplus)移动固态闪存优盘,系统整体使用感觉非常好,制作起来也很快很方便。
|
||||
我觉得 Windows To Go 最重要的部分就是硬盘的选择,并不是所有的储存设备都能跑 Windows To Go。如果你没有读写效率比较高的固态盘那我并不建议你去制作并使用 Windows To Go——卡得不成样子,非常让人难受,所以不要指望你那小小的移动硬盘能用柔弱的身躯带 Windows To Go。比如我,目前使用的是联想(thinkplus)移动固态闪存优盘,系统整体使用感觉非常好,制作起来也很快很方便。
|
||||
|
||||
## 系统
|
||||
|
||||
这也是 WinToGo 相当重要的一部分。一般来说,我会推荐 Windows 21H2 LTSC 版本。企业版带给人清爽、愉快的操作系统使用体验。并且镜像体积略小于 Windows 10 / 11 的零售版,可能如果 U 盘体积小的可以考虑。
|
||||
那 Windows 7 / 8.1 是否合适去制作 WinToGo 呢?我认为并不合适。虽然这两个系统带来了光辉岁月,但他们已经比较过时了。Windows 7 本质上不支持 UEFI 的安全启动,而且硬件厂商正在缩小这些老系统的存活率,这些老系统在一些老机子上跑肯定是没问题的,但放在技术不断发展的今天,用老系统制作 WinToGo 并不是一个合理的选择。
|
||||
这也是 Windows To Go 相当重要的一部分。一般来说,我会推荐 Windows 21H2 LTSC 版本。企业版带给人清爽、愉快的操作系统使用体验。并且镜像体积略小于 Windows 10 / 11 的零售版,可能如果 U 盘体积小的可以考虑。
|
||||
那 Windows 7 / 8.1 是否合适去制作 Windows To Go 呢?我认为并不合适。虽然这两个系统带来了光辉岁月,但他们已经比较过时了。Windows 7 本质上不支持 UEFI 的安全启动,而且硬件厂商正在缩小这些老系统的存活率,这些老系统在一些老机子上跑肯定是没问题的,但放在技术不断发展的今天,用老系统制作 Windows To Go 并不是一个合理的选择。
|
||||
|
||||
## 制作软件
|
||||
|
||||
市面上可选的 WinToGo 制作软件并不少,DISM++,Refus 等等都是不错的选择。但我认为最好的是萝卜头IT论坛里的 WTGA,因为它操作起来相当简洁,和其他许多软件一样,它也适用系统自带的 DISM 镜像部署功能。并且可自定义度高,也很绿色无公害。并且许多软件并不把我的固态 U 盘当作 U 盘,只有 WTGA 没有这个毛病。
|
||||
市面上可选的 Windows To Go 制作软件并不少,DISM++,Refus 等等都是不错的选择。但我认为最好的是萝卜头IT论坛里的 WTGA,因为它操作起来相当简洁,和其他许多软件一样,它也适用系统自带的 DISM 镜像部署功能。并且可自定义度高,也很绿色无公害。并且许多软件并不把我的固态 U 盘当作 U 盘,只有 WTGA 没有这个毛病。
|
||||
顺便提一句,现在 Legacy 启动的主板越来越少,制作 UEFI 单启动也是一个合理的选择。当然,对于接触不同型号电脑比较多的我还是选择 Legacy + UEFI 双启动的模式。
|
||||
|
||||
## 系统使用体验
|
||||
|
||||
往往制作 WinToGo 并不难,给不同电脑打补丁往往才是最蛋疼的部分。往往 Windows Update 可以解决这个问题,但请注意,Windows Update 往往也有固件方面的更新,请谨慎进行更新和升级,以免刷坏固件,这样可就不好玩了。
|
||||
不同人使用 WinToGo 有不同的意图。比如我主要以打游戏、写程序和更新文章为主。所以 Office 啥的我都不需要,主要是为了给并不充裕的空间留下更多的地方来以备不时之需。对系统空间使用要尽可能把握好,尽量不要留下一些可有可无的冗余软件。
|
||||
往往制作 Windows To Go 并不难,给不同电脑打补丁往往才是最蛋疼的部分。往往 Windows Update 可以解决这个问题,但请注意,Windows Update 往往也有固件方面的更新,请谨慎进行更新和升级,以免刷坏固件,这样可就不好玩了。
|
||||
不同人使用 Windows To Go 有不同的意图。比如我主要以打游戏、写程序和更新文章为主。所以 Office 啥的我都不需要,主要是为了给并不充裕的空间留下更多的地方来以备不时之需。对系统空间使用要尽可能把握好,尽量不要留下一些可有可无的冗余软件。
|
||||
|
|
Loading…
Reference in New Issue