ChatGPT的话题在2023年2月格外火热,以聊天对话的形式,为人类提供大量的专业知识。
万能的神ChatGPTChatGPT 擅长产出符合逻辑的答案,人类的逻辑能力其实并不好作为一个开发工程师,我发现代码80%的BUG,都是程序逻辑有问题,即使是常年写码的工程师,也会写出逻辑有问题的程序,ChatGPT非常适合排查代码片段,辅助工程师写出逻辑正确的代码,在这方面, ChatGPT最大的竞品是Github Copilot。
Github CopilotChatGPT拟人化的问答模式,非常适合当老师学会一门知识,本身是枯燥的,如果把知识转换为ChatGPT问答的形式,将会极大提升课堂的趣味性,玩过RPG游戏的人,要进行大量的问答,这些问答往往是几个固定的问题,再给几个固定的选项,如果将知识转换为RPG游戏的形式,并给予极大的问答自由度,学生就变成了玩家。
ChatGPT适合仿制3A游戏,3A游戏需要大量的人力,海量的资金投入,巨长的开发周期;引入ChatGPT,游戏开发者只需定义玩法,ChatGPT就可以生成中规中矩的罐头游戏,罐头游戏并非贬义词,市面上绝大多数游戏都是没什么特色的罐头游戏,ChatGPT能生成罐头游戏,反而让开发者们,更有时间去研究特色玩法。
ChatGPT适合生成产品发布会,因为发布会的套路都是固定的;ChantGPT也适合做直播,因为直播的套路也是固定的;ChatGPT最适合做的是公务员,我们一直谈法制,但不好搞,ChatGPT代替法官来判案,代替律师来辩护,会让罪与罚更容易一一对应。
ChatGPT 会员终于开放了,支持万事达,Visa,每月20美元,开通后有两个模型可选,开通会员后,会默认使用提升回答速度的版本,当然也可以选择普通速度的Legacy版本。
ChatGPT会员可选两个模型买ChatGPT PLUS会员并不容易,需要用海外信用卡支付ChatGPT非常适合写脚本,但小概率会出现类型错误,变量名的语义和实际进行的操作产生了误差(命名不规范坑人也坑ChatGPT)
ChatGPT生成代码错误ChatGPT可以帮忙写很多前端样式,对汉语描述的理解非常到位,我们还可以不断追加要求,要求ChatGPT对代码进行改写,真的是理想的乙方
ChatGPT写样式
ChatGPT改写代码让ChatGPT用Node.js写一个同步脚本输入需求写一个基于rsync命令同步服务器目录(比如 /opt)到本地目录(比如 ~/cloud-backup/ )的Node.js每日定时备份脚本;
支持配置登陆用户, 和登录服务器信息, 服务器IP, 登录端口, 登录用户, 无需配置密码, 默认使用ssh key登录;每天的备份目录用YYYY-MM-DD日期格式命名,如果从服务器同步的文件夹为 `/opt/` , 则在本地的存放位置为 `
${用户目录}/cloud-backup/YYYY-MM-DD/opt/` ,传输速度限制为每秒100KB,如果同步失败, 则1分钟后自动重试, 只保留最近14天的备份, 过期的备份自动删除;如果本地文件夹不存在,则自动创建;
同步过程中, 打印同步文件进度的log; log同步输出到脚本同级目录下的log.txt文件, log.txt只保存最近14天的log, 过期的log自动删除;将功能点细分为函数, 便于后续扩展;列出以上脚本依赖包相关的 package.json
我需要使用pm2守护运行这个脚本,请给出pm2凌晨2点25分运行脚本的方法ChatGPT输出代码const { exec } = require("child_process");const { format } = require(
"date-fns");const fs = require("fs");const path = require("path");const { promisify } = require("util"
);const execAsync = promisify(exec);const SSH_KEY_PATH = process.env.SSH_KEY_PATH || "~/.ssh/id_rsa";
const SYNC_FOLDER = "/opt";const BACKUP_FOLDER = `${process.env.HOME}/cloud-backup`;const SSH_CONFIG = {
host: "example.com", port: 22, username: "example",};const MAX_SPEED = 100; // KB/sconst RETRY_INTERVAL = 60 * 1000; // 1 minute
const MAX_BACKUPS = 14;const now = new Date();const backupFolderName = format(now, "yyyy-MM-dd");const backupFolderPath = path.join(BACKUP_FOLDER, backupFolderName);
const logFilePath = path.join(__dirname, "log.txt");async functionsyncWithRetry() {let success = false
;while (!success) { try { await sync(); success = true; } catch (err) { console.error(err);
console.log(`Sync failed, retrying in${RETRY_INTERVAL / 1000} seconds...`); await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));
} }}async functionsync() { const command = `rsync -a --progress --max-size=${MAX_SPEED}K --delete -e
"ssh -i ${SSH_KEY_PATH}"${SSH_CONFIG.username}@${SSH_CONFIG.host}:${SYNC_FOLDER}${backupFolderPath}`;
console.log(`Syncing ${SSH_CONFIG.username}@${SSH_CONFIG.host}:${SYNC_FOLDER} to ${backupFolderPath}
...`); await execAsync(command); console.log("Sync finished.");}async functionremoveExpiredBackups() {
const backupFolders = await fs.promises.readdir(BACKUP_FOLDER); const expiredBackups = backupFolders
.filter((folder) => folder !== backupFolderName) .sort() .slice(0, -MAX_BACKUPS); await Promise.all(
expiredBackups.map((folder) => fs.promises.rm(path.join(BACKUP_FOLDER, folder), { recursive:
true, force: true }) ) );}async functionremoveExpiredLogs() { const logs = await fs.promises.readdir(__dirname);
const expiredLogs = logs .filter((log) => log.endsWith(".log") && log !== `${backupFolderName}.log
`) .sort() .slice(0, -MAX_BACKUPS); await Promise.all(expiredLogs.map((log) => fs.promises.rm(path.join(__dirname,
log))));}async functioncreateBackupFolder() { try { await fs.promises.mkdir(backupFolderPath, { recursive:
true }); console.log(`Created backup folder: ${backupFolderPath}`); } catch (err) {if (err.code !==
"EEXIST") { throw err; } }}async functionmain() { await createBackupFolder(); await syncWithRetry();
await removeExpiredBackups(); await removeExpiredLogs(); const logText = `Synced ${SSH_CONFIG.username}
@${SSH_CONFIG.host}:${SYNC_FOLDER} to ${backupFolderPath} at ${new Date().toISOString()}\n`; await fs.promises.appendFile(logFilePath, logText);
}main().catch((err) => console.error(err));如果输出中断,我们可以要求ChatGPT继续上次的输出,而不用重新生成
继续输出
内容输出然而,ChatGPT 还是漏了package.json的输出,我们可以要求ChatGPT对package.json内容重新输出
image-20230219152951399前面我们明确要求了ChatGPT进行函数式编程,如果我们需要优化某个函数的输出,可以直接让ChatGPT继续修改
继续修改运行ChatGPT修改后的脚本
运行结果修改后的脚本可以顺利完成同步任务,由于rsync可以自动跳过已同步的文件,当天,多次运行同步脚本,也可以快速进行增量同步。让ChatGPT推荐一些WordPress主题
WordPress主题推荐如果我们有自己的WordPress网站,个人服务器带宽有限,首屏打开速度不理想,也可以让ChatGPT给出一些轻量化主题推荐小结2023年,用中文在搜索引擎(Google, Bing, baidu)查点儿东西(凯恩斯陷阱),大概率都会指向知乎,但知乎产品又做的非常粪坑,强迫用户装App, App各种无厘头的弹窗广告,搞的推荐和热榜话题简直是兢兢业业的给用户喂shi
凯恩斯陷阱ChatGPT确实可以当搜索引擎来用,用中文问内容,几乎是有问必答,而且干净无废话,不懂还可以追问,一言以蔽之,搜索引擎本身也不生产内容,和ChatGPT一样,都是内容的搬运工,但ChatGPT和搜索引擎的用户体验简直是天壤之别,搜索引擎确实应该努努力了,不然真的会有大量用户流失。
亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。