首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
13,553 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,099 阅读
3
gradle-5.4.1-all.zip下载
9,059 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
7,933 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
6,909 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
626
篇文章
累计收到
624
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
450
篇与
的结果
2020-08-07
Linux修改系统时间为东八区北京时间(上海时间)
1. Linux时间# Linux的时间分为 System Clock(系统时间)和 Real Time Clock(硬件时间,简称RTC)。 系统时间:指系统内核中的时间。 硬件时间:指主板上的时间。2. 查看系统时间#date3. 查看硬件时间#hwclock4. 删除本地时间#rm -rf /etc/localtime5. 创建软连接#ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2020年08月07日
896 阅读
0 评论
0 点赞
2020-08-07
Apscheduler时间调度程序——python定时任务
1.简介APScheduler的全称是Advanced Python Scheduler。它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时,它还支持异步执行、后台执行调度任务。2. 安装 pip install APScheduler3. 基础组件APScheduler 有四种组件,分别是:调度器(scheduler),作业存储(job store),触发器(trigger),执行器(executor)。schedulers(调度器)它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。triggers(触发器)描述调度任务被触发的条件。不过触发器完全是无状态的。job stores(作业存储器)任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。executors(执行器)负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。""" date 触发器使用示例如下: date 触发器指在某一指定时间下执行脚本的方法 """ from datetime import datetime from datetime import date from apscheduler.schedulers.background import BackgroundScheduler def job_func(text): print(text) scheduler = BackgroundScheduler() # 在 2017-12-13 时刻运行一次 job_func 方法 scheduler .add_job(job_func, 'date', run_date=date(2017, 12, 13), args=['text']) # 在 2017-12-13 14:00:00 时刻运行一次 job_func 方法 scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text']) # 在 2017-12-13 14:00:01 时刻运行一次 job_func 方法 scheduler .add_job(job_func, 'date', run_date='2017-12-13 14:00:01', args=['text']) scheduler.start()""" interval 触发器 循环执行脚本任务的触发器 weeks (int) – 间隔几周 days (int) – 间隔几天 hours (int) – 间隔几小时 minutes (int) – 间隔几分钟 seconds (int) – 间隔多少秒 start_date (datetime|str) – 开始日期 end_date (datetime|str) – 结束日期 timezone (datetime.tzinfo|str) – 时区 """ import datetime from apscheduler.schedulers.background import BackgroundScheduler def job_func(text): print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]) scheduler = BackgroundScheduler() # 每隔两分钟执行一次 job_func 方法 scheduler .add_job(job_func, 'interval', minutes=2) # 在 2017-12-13 14:00:01 ~ 2017-12-13 14:00:10 之间, 每隔两分钟执行一次 job_func 方法 scheduler .add_job(job_func, 'interval', minutes=2, start_date='2017-12-13 14:00:01' , end_date='2017-12-13 14:00:10') scheduler.start()""" cron 触发器使用示例如下: 指定指定时间循环执行脚本的触发器 year (int|str) – 年,4位数字 month (int|str) – 月 (范围1-12) day (int|str) – 日 (范围1-31) week (int|str) – 周 (范围1-53) day_of_week (int|str) – 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun) hour (int|str) – 时 (范围0-23) minute (int|str) – 分 (范围0-59) second (int|str) – 秒 (范围0-59) start_date (datetime|str) – 最早开始日期(包含) end_date (datetime|str) – 最晚结束时间(包含) timezone (datetime.tzinfo|str) – 指定时区 """ import datetime from apscheduler.schedulers.background import BackgroundScheduler def job_func(text): print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]) scheduler = BackgroundScheduler() # 在每年 1-3、7-9 月份中的每个星期一、二中的 00:00, 01:00, 02:00 和 03:00 执行 job_func 任务 scheduler .add_job(job_func, 'cron', month='1-3,7-9',day='0, tue', hour='0-3') scheduler.start()参考链接:https://www.cnblogs.com/luxiaojun/p/6567132.html参考链接:https://www.cnblogs.com/ohyb/p/9084011.html参考链接:https://www.cnblogs.com/cool-fire/p/7449758.html参考链接:http://www.cnblogs.com/luxiaojun/p/6567132.html官方文档:https://apscheduler.readthedocs.io/en/latest/userguide.html#basic-concepts
2020年08月07日
1,204 阅读
2 评论
0 点赞
2020-08-07
OPQ机器人框架插件开发之Python模板
今天了解到还有个OPQ的框架似乎还不错,于是研究了一下,比酷Q还方便(因为我之前用的air版,图片都发不了)并且支持多平台,但是最新的版本居然阉割了Windows下的许多功能不过问题不大,满足我之前的需求了。于是参考了一下原本iot的python模板然后进行了修改,更加符合自己的用法习惯吧。然后就是代码:botConfig->configInfo.py(用于存放接口地址,以及机器人QQ)robotQQ = "{机器人QQ}" webapi = "{接口地址,后面无需加/}"botConfig ->botClass.py (用于存放一些对消息的解析类)import json import requests from .configInfo import * """ By : Lan Website : """ # 群组消息接受类 class GroupMess: def __init__(self, message): self.FromQQG = message['FromGroupId'] # 来源QQ群 self.QQGName = message['FromGroupName'] # 来源QQ群昵称 self.FromQQ = message['FromUserId'] # 来源QQ self.FromQQName = message['FromNickName'] # 来源QQ名称 self.Content = message['Content'] # 消息内容 self.MsgTime = message['MsgTime'] # 消息时间 # 私发消息接受类 class PrivateMess: def __init__(self, message): self.FromQQ = message['ToUin'] # 来源QQ号 self.ToQQ = message['FromUin'] # 目标QQ号 self.Content = message['Content'] # 消息内容 self.MsgType = message['MsgType'] # 消息类型 # 发送消息类 class SendMessage: def __init__(self, toUser=0, sendToType=0, sendMsgType='', groupId=0, content='', atUser=0, voiceUrl='', picUrl='', picBase64Buf='', voiceBase64Buf=''): self.data = { "toUser": toUser, # 欲发给的对象 群或QQ好友或私聊对象 "sendToType": sendToType, # 发送消息对象的类型 1好友 2群3私聊 "sendMsgType": sendMsgType, # 欲发送消息的类型 TextMsg、PicMsg、VoiceMsg "content": content, # 发送的文本内容 "groupid": groupId, # 发送私聊消息是 在此传入群ID 其他情况为0 "atUser": atUser, # At用户 传入用户的QQ号 其他情况为0 "picUrl": picUrl, # 发送图片的网络地址 "picBase64Buf": picBase64Buf, # 发本地送图片的buf 转 bas64 编码 "voiceUrl": voiceUrl, # 发送语音的网络地址 "voiceBase64Buf": voiceBase64Buf, # 发本地送语音的buf 转 bas64 编码 "fileMd5": "" } ''' 发送图片消息需要有:toUser sendToType sendMsgType picUrl ''' def send(self): print(self.data) requests.post(url=f'{webapi}/v1/LuaApiCaller?qq={robotQQ}&funcname=SendMsg&timeout=10', data=json.dumps(self.data)) return 200main.py (用于存放主文件)# coding=utf-8 import logging import time import socketio from botConfig.botClass import * from botConfig.configInfo import * sio = socketio.Client() """ By : Lan Website : https://gitlab.com/Vastsa/lanpicbed/-/raw/master/ """ def beat(): while True: sio.emit('GetWebConn', robotQQ) time.sleep(60) @sio.event def connect(): print('connected to server') sio.emit('GetWebConn', robotQQ) # 取得当前已经登录的QQ链接 beat() # 心跳包,保持对服务器的连接 @sio.on('OnGroupMsgs') def OnGroupMsgs(message): """ 监听群组消息""" data = GroupMess(message['CurrentPacket']['Data']) print(data) return @sio.on('OnFriendMsgs') def OnFriendMsgs(message): """ 监听好友消息 """ data = PrivateMess(message['CurrentPacket']['Data']) print(data) return @sio.on('OnEvents') def OnEvents(message): """ 监听相关事件""" print(message) def main(): try: sio.connect(webapi, transports=['websocket']) sio.wait() except BaseException as e: logging.info(e) print(e) if __name__ == '__main__': main()GitHub地址:https://github.com/vastsa/OPQBot-Pyhon
2020年08月07日
2,992 阅读
15 评论
0 点赞
2020-08-06
使程序在Linux下后台运行
一、为什么要使程序在后台执行我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼)2:不影响计算效率2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。二、怎么样使程序在后台执行方法有很多,这里主要列举两种。假如我们有程序pso.cpp,通过编译后产生可执行文件pso,我们要使pso在linux服务器后台执行。当客户端关机后重新登入服务器后继续查看本来在终端输出的运行结果。(假设操作都在当前目录下)方法1在终端输入命令: # ./pso > pso.file 2>&1 & 解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。 当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命令:#cat pso.file )。 方法2在终端输入命令:# nohup ./pso > pso.file 2>&1 &解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命令:#cat pso.file )。三、常用任务管理命令# jobs //查看任务,返回任务编号n和进程号# bg %n //将编号为n的任务转后台运行# fg %n //将编号为n的任务转前台运行# ctrl+z //挂起当前任务# ctrl+c //结束当前任务 注:如果要使在前天执行任务放到后台运行,则先要用ctrl+z挂起该任务,然后用bg使之后台执行。 附: 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh &对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:$ ./test.sh [1]+ Stopped ./test.sh $ bg %1 [1]+ ./test.sh & $ jobs -l [1]+ 22794 Running ./test.sh &但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)$ echo $$ 21734 $ nohup ./test.sh & [1] 29016 $ ps -ef | grep test 515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh 515 29713 21734 0 11:47 pts/12 00:00:00 grep test$ setsid ./test.sh & [1] 409 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 413 21734 0 11:49 pts/12 00:00:00 grep test上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:$ ./test.sh & [1] 2539 $ jobs -l [1]+ 2539 Running ./test.sh & $ disown -h %1 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 2542 21734 0 11:52 pts/12 00:00:00 grep test另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:$ (./test.sh &) $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 12483 21734 0 11:59 pts/12 00:00:00 grep test注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:$ screen -dmS screen_test $ screen -list There is a screen on: 27963.screen_test (Detached) 1 Socket in /tmp/uscreens/S-jiangfeng. $ screen -r screen_test
2020年08月06日
631 阅读
0 评论
0 点赞
2020-08-06
vue+axios实现评论留言板
效果如图这里的评论数据以及添加数据都是用的FastAPI,然后再用axios发送请求,获取评论以及添加评论。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>工程快捷报备系统——By:Lan</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <script src="https://cdn.jsdelivr.net/npm/vue"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <link rel="stylesheet" href="static/css/bootstrap.min.css"> <style> .content { margin-top: 1.5rem; } </style> </head> <body> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <ul class="nav nav-tabs"> <li> <a href="./index.html">健康报备</a> </li> <li> <a href="./who.html">谁没报备</a> </li> <li> <a href="./ele.html">电费查询</a> </li> <li class="active"> <a href="./comment.html">留言板</a> </li> </ul> <div class="content" id="box"> <form action="" role="form"> <div class="form-group"> <label class="col-sm-1 control-label">昵称</label> <div class="col-sm-11"> <input v-model='newNick' type="text" class="form-control" id="nikename" v-model='newComment' placeholder="请输入昵称"> </div> <div class="form-group"> <label for="content" class="col-sm-1 control-label">内容</label> <div class="col-sm-11"> <textarea id="content" v-model='newComment' class="form-control" rows="3"></textarea> </div> </div> <div class="form-group" style="text-align: center;"> <input type="button" name="" value="添加" @click='addcomment' class="btn btn-primary"> <input type="reset" name="" value="重置" class="btn btn-danger"> </div> </div> </form> <table class="table table-bordered table-hover"> <caption class="text-success"> <h4>评论列表</h4> </caption> <thead> <tr class="text-info"> <th class="text-center">昵称</th> <th class="text-center">内容</th> <th class="text-center">时间</th> </tr> </thead> <tbody> <tr v-for="(item,index) in list" :key="index" class="text-warning text-center"> <td>{{item.nick }}</td> <td>{{item.comment}}</td> <td>{{item.add_Time | fmtTime('-')}}</td> </tr> <tr v-if="list.length === 0"> <td colspan="3">暂无评论,快来评论吧!</td> </tr> </tbody> </table> </div> </div> </div> </div> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="./static/js/bootstrap.min.js"></script> <script> Vue.filter('fmtTime', function(sourceTime, sep) { sourceTime = new Date(sourceTime); let y = sourceTime.getFullYear(); let m = sourceTime.getMonth() + 1; let d = sourceTime.getDate(); let h = sourceTime.getHours(); let M = sourceTime.getMinutes(); return y + sep + m + sep + d + ' ' + h + ':' + M; }); var app = new Vue({ el: '#box', data: { newNick: '', newComment: '', list: [], searchVal: '' }, mounted() { this.getcomment(); }, methods: { getcomment() { axios.get('/get_comment/', { params: { page: 1 } }) .then(res => { this.list = res.data; }) .catch(err => { console.error('获取数据失败' + err); }) }, addcomment() { axios.get('/add_comment/', { params: { nick: this.newNick, comment: this.newComment } }) .then(res => { alert('添加成功'); // 添加成功之后,重新获取列表数据 this.getcomment(); this.newComment = ''; }) .catch(err => { console.error(err); }) } }, }) </script> </body> </html>
2020年08月06日
893 阅读
0 评论
0 点赞
2020-07-29
176. 第二高的薪水
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2 | 200 || 3 | 300 |+----+--------+例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。+---------------------+| SecondHighestSalary |+---------------------+| 200 |+---------------------+来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/second-highest-salary著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。官方答案:SELECT (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary我写的时候没有弄他为null的情况,今天逛力扣才发现还有sql查询语句的题目。SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1
2020年07月29日
791 阅读
0 评论
0 点赞
2020-07-25
按数字批量重命名文件
今天在网上看到一个壁纸压缩包,是滴是滴,就是壁纸,文件是这样的本着互联网的分享精神,准备做一个随机图片,但是人家名字都不一样,咱也不好写代码,于是花了几分钟敲了几行代码,一秒钟就命名了530张图片。结果就是这样滴。咳咳,代码如下 def plRename(): sourcename = os.listdir('./') for index, value in enumerate(sourcename): try: os.rename(value, str(index) + '.' + value.split('.')[-1]) except EnvironmentError: print(EnvironmentError) print(f'{value}失败') input('完成!')
2020年07月25日
951 阅读
0 评论
0 点赞
1
...
32
33
34
...
65