最初发布在我的blog
上您是自动或手动的吗?
hi all -
继续作为应用程序制造商对开发人员社区的贡献,今天我建议讨论如何有效地自动化任务。
所以...您每天要做几次重复的手动动作? 可能很多!ð
为什么...?因为使您的分散动作自动化是漫长而困难的。没有时间构建和自动化一个完整的过程?我也不是!
让我突出显示一种简单的方法,可以快速自动化动作而无需使用Znote的头痛。
该方法是:增量自动化。
将您的过程写入注释,然后开始编码任务的部分。因此,您可以在手动和自动操作之间交替。
我不认识您,但是个人我通过测试和原型进行学习更加自在。对我来说,实现这一目标的最佳方法是使用Markdown使用 JavaScript操场。
概念
我改编了Znote,就像Jupyter对Python所做的那样,但已转移到JS世界。加上节点和JS客户端以及NPM库的整个生态系统之间的超级平滑集成,可轻松查看代码,结果和在代码块之间进行注释。
多亏了这种体系结构,我能够逐渐且无痛地自动化整个过程。在多个应用程序中操纵数据。
您可以平稳地替代手动和自动操作,存储结果并解释要采取的动作,并根据需要将自动化推动。
回到我们的问题
现在让我们看看一个具体示例如何继续构建现成的自动化。最好的方法是开始解决自己的问题!因此,让我暴露我们的第一个用例。
我们的用例
当我有新的注册用户时,我必须定期
- 使用SSH连接到我的远程数据库,
- 用SQL查询手动提取用户
- 在本地复制结果并与现有用户进行比较。
- 一旦确定了新用户,
- 我向每个新成员发送了一封欢迎电子邮件以获取他们的反馈。
在远程数据库上进行SQL查询
1-进行SQL查询
async function getSQL(sqlQuery, host, port, user, password, database) {
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(user, password, database, {
dialect: "mysql"/* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
host: host,
port: port
});
sequelize.authenticate();
const [results, metadata] = await sequelize.query(sqlQuery);
sequelize.close()
return results;
}
2-使用SSH
进行SQL查询
async function getRemoteSQL(sqlQuery) {
const { spawn } = require('child_process');
// connect to server (don't forget to copy your ssh-key on the remote server)
const ssh = spawn('ssh', [
'-L', '3307:localhost:3306',
'user@XXX.ovh.net',
]);
await sleep(4000); // wait connection
// make SQL query (replace with your credentials)
const data = await getSQL(sqlQuery, "localhost", 3307, "USER", "PASSWORD", "DATABASE");
// quit
ssh.kill();
return data;
}
您现在只能在我的笔记中的任何地方做一个针对远程数据库的SQL查询
const users = await getRemoteSQL("select purchase_email from license;");
printJSON(users)
识别新用户
然后,我们想确定所有新用户,因为查询是最后一次运行。
function getNewUsers(incomingData, filename, key) {
const fs = require('fs');
let refData = [];
try {
refData = JSON.parse(fs.readFileSync(filename, 'utf8'))
.map(element => key(element));
} catch (err){}
const delta = [];
incomingData.forEach(obj => {
if (refData.indexOf(key(obj))===-1) {
delta.push(obj);
}
});
printJSON(delta);
return delta;
}
发邮件
最后,我们可以向每个新用户发送邮件。使用Google,您需要生成专用的凭据:https://support.google.com/accounts/answer/185833
function sendMail(recipients) {
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'XX@gmail.com', // your gmail
pass: 'XXX', // app credential here
},
});
const result = await transporter.sendMail({
from: '"Anthony" <XX@gmail.com>', // sender address
to: recipients, // list of receivers (,)
subject: "Just to know if everything is fine 😊", // Subject line
text: "Hi 👋, Being very concerned about the quality of Znote app, I thank you for any feedback you could give me, allowing me to improve my software!", // plain text body
html: "Being very concerned about the <b>quality</b> of Znote app, I thank you for any feedback you could give me, allowing me to improve my software!", // html body
});
printJSON(result);
}
将所有内容插入ð
仍然要通过调用不同的功能来描述我们的过程。
// get all users in remote database
const allUsers = await getRemoteSQL("select purchase_email from license;");
// show new users since last execution time
const newUsers = getNewUsers(allUsers, '/Users/alagrede/Desktop/users.json', it => it.purchase_email);
// write all users in file
fs.writeFileSync('/Users/alagrede/Desktop/users.json', JSON.stringify(allUsers));
// send mail
sendMail(newUsers.map(e=>e.purchase_email));
然后 !!
总结
您现在拥有一堆可重复使用的功能和一个自动化过程。由于可以在其他注释上重复使用功能,因此您可以利用现有的工作并继续创建其他流程。然后导出您的脚本,准备在cron中运行它。
感谢您阅读€!还有很多其他方法可以做得更好,但我希望这个示例能启发您。ð
走得更远
当您需要时,我将继续添加一些示例。
同时,开始将您的日常任务变成简单且可重复的事情,您的工作将变得更加有趣。 ð -
不要忘记检查我们的ðdocumentation网站。
如果您尚未下载Znote,它是ð下载此应用程序here