https://packagist.org/packages/opis/closure
mongo 简单数据分析
背景:
user_last_access 用户最后访问时间集合
statistics_users:activeUserData(3天内登录),silentUserData(3~7天内登录),lostUsersData(7天以前登录)
目的:
statistics_users 中统计的用户集合 是 user_last_access 的全部数据
#准备测试集合 db.testIds.drop() db.testIds.insert({"_id":1,ids1:[],ids2:[]}) #设置所有的userId - str1 var ids = db.user_last_access.find({},{_id:0,media_owner_id:1}) ids.forEach( function(i){ db.testIds.update({"_id":1},{$push:{ids1:i.media_owner_id}}) } ) #设置所有统计的userId - str2 var ids = db.statistics_users.aggregate([{"$match":{endTime:'2021-02-23 00:00:00'}},{"$project":{_id:0,union:{$setUnion:["$activeUserData","$silentUserData","$lostUsersData"]}}}]) ids.forEach( function(i){ db.testIds.update({"_id":1},{$set:{"ids2":i.union}}) } ) #查看差集 db.testIds.aggregate([{'$project':{diff:{$setDifference:["$ids1","$ids2"]}}}]) #查看所有未进去的用户 db.user_last_access.find({media_owner_id:{$in: [] }})
python pandas 导出大数据到excel
import pandas as pd import pymysql import zipfile def getDb(): try: conn = pymysql.connect( host='xxx', # 参数host:连接的mysql主机,如果本机是'localhost'或者127.0.0.1 port=3306, # mysql端口3306 user='xxx', # mysql用户名 passwd='xxx!@#', # mysql密码 db='xxx', # 数据库名 charset='utf8mb4' # 数据库编码 ) return conn except Exception as e: print(e) else: print('成功连接数据') def main(): conn = getDb() cur = conn.cursor() #导出数据库 dbname = "res_account" exportFile = dbname + ".zip" #获取列名 cur.execute("desc "+dbname) fields = cur.fetchall() fs = [] for f in fields: fs.append(f[0]) limit = 10000 id = 0; with zipfile.ZipFile(exportFile, 'w') as zf: while True: row_count = cur.execute("select * from "+dbname+" where id > %s limit " + str(limit), id) if row_count == 0: break; results = cur.fetchall() filename = r"filename" + str(id) + "-" + str(id + limit) + ".xlsx" df = pd.DataFrame(results, columns=fs) with zf.open(filename, 'w') as buffer: with pd.ExcelWriter(buffer) as writer: df.to_excel(writer, index=None) id = results[row_count - 1][0] print(id) if __name__ == '__main__': main()
yii2 使用mongodb 扩展,查询结果按数字类型排序
/** * @var \yii\mongodb\Query $query */ $query->addOptions(['collation' => ['locale' => 'en_US', 'numericOrdering'=>true]]);
命令行光标控制
在写命令行脚本的时候,为了监控脚本执行进度,往往需要输出一些数据,来确认脚本是否正在执行。而处理大数据文件时,大量的输出,又不容易看到输出日志,于是需要进行命令行光标控制,使光标固定到特定位置。需要 VT100 控制码定义终端显示。如下:
其中格式分下列两种:
1.数字形式。
\033[<数字>m
2.控制字符形式。
\033[字母
VT控制码归类有如下:
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m —- \033[37m 设置前景色,0-7为 黑 红 绿 黄 蓝 紫 青 白
\033[40m —- \033[47m 设置背景色,0-7为 黑 红 绿 黄 蓝 紫 青 白
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
跨域访问设置方式
header('Access-Control-Allow-Origin: *');//允许跨域域名 header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, OPTIONS, DELETE');//允许跨域方式 header('Access-Control-Allow-Headers: *');//允许header header('Access-Control-Expose-Headers: *');//某些header无法传递,须要指明header白名单(content-type 就在此列)
js ISO-8859-1 转中文
fetch 获取的 header 内容如果是中文(多子节),则会转译成 ISO-8859-1 编码格式,需要转编码转换
var str = “ç\u0088±æ\u0088\u0091ä¸\u00ADå\u009B½”; var utfstring =decodeURI(escape(str))//先编码再解码 //或者 utfstring =decodeURIComponent(escape(str))
decodeURIComponent 和 decodeURIComponent 区别具体看这里。encodeURI 自身无法产生能适用于HTTP GET 或 POST 请求的URI,例如对于 XMLHTTPRequests, 因为 “&”, “+”, 和 “=” 不会被编码,然而在 GET 和 POST 请求中它们是特殊字符。然而encodeURIComponent这个方法会对这些字符编码
参考
fetch 下载流文件
前后端分离的项目,前端大部分使用fetch调用接口,遇到下载的时候,服务器接口一般直接返回流文件(链接本身就是一个文件)
const getExport = async (url) => { let options = _headerOptions('GET') let response = await fetch(config.apiHost+url,options) response.blob().then((blob) => { const a = window.document.createElement('a'); const downUrl = window.URL.createObjectURL(blob);// 获取 blob 本地文件连接 (blob 为纯二进制对象,不能够直接保存到磁盘上) const filename = response.headers.get('Content-Disposition').split('filename=')[1].split('.'); a.href = downUrl; a.download = `${decodeURI(escape(filename[0]))}.${filename[1]}`; a.click(); window.URL.revokeObjectURL(downUrl); }); return []; }
curl命令上传文件
curl 'http://xxxxxx' -F "theFile=/Users/xxxx/Downloads/1.jpg;filename=xxxx"
后台接收到的信息
var_dump($_FILE); /* array(1) { ["theFile"]=> array(6) { ["name"]=> string(7) "xxxx" ["tempName"]=> string(14) "/tmp/phpnk5HXI" ["tempResource"]=> array(0) { } ["type"]=> string(0) "" ["size"]=> int(36) ["error"]=> int(0) } } */
使用 certbot 安装免费的安全证书
sudo apt-get install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot python-certbot-nginx certbot certonly --webroot -w /xxx -d www.ivhong.com -d ivhong.com -w /xxxx -d www.ivhui.com -d ivhui.com --agree-tos --email xxxx@163.com --------------参数解释 : * certonly 只获取证书 * --webroot 以webroot插件去获得证书 * -w 需配合--webroot参数一起使用,用来指定网站根目录 * -d 指定域名 * --agree-tos 用意ACME用户协议(如果省略此项,则在命令执行过程中会询问是否同意) * --email 指定邮箱用来接收一些通知(如果省略此项,则在命令执行过程中会要求填写) * (如果有多个域名,则按照一个 -w /var/www/example 后接一个 -d example.com 的形式继续输入。) #使用docker或类似webroot 不在本地的 certbot certonly --standalone -d www.ivhong.com -d ivhong.com -d xxx -d xxx.com --agree-tos --email hong350@163.com #自动更新shell,vim refreshssh.sh,写入下面内容 #!/bin/sh /usr/bin/docker stop ivhong_nginx_1 /usr/bin/certbot renew --force-renew cp -rf /etc/letsencrypt/live/www.ivhong.com /[docker nginx]/www.ivhong.com /usr/bin/docker start ivhong_nginx_1 #添加crontab 35 3 * */2 * /root/refeshssh.sh
nginx 配置:
listen 443 ssl; listen 80; server_name ivhui.com www.ivhui.com; index index.html index.htm index.php default.html default.htm default.php; root /home/ivhong/www/ivhui/web; # ssl on;//这里如果是on的话,http访问网址将会出错 ssl_certificate /etc/letsencrypt/live/www.ivhong.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.ivhong.com/privkey.pem; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on;
来源:https://blog.csdn.net/qq_35751770/article/details/78018613