记录Git杂项命令合集
1 | $ git push origin --delete [branchname] |
1 | $ git branch -d [branchname] |
1 | $ git tag -l | xargs git tag -d |
注意
Windows
平台可能需要用git-bash
执行
1 | $ git show-ref --tag | awk '{print ":" $2}' | xargs git push origin |
1 | $ git checkout --orphan newbranch |
1 | $ git fetch --all |
1 | # https://doc.fastgit.org/ |
1 | # 全局项目 |
1 | 查看所有配置 |
1 | # 缓存时间 默认15分钟 --timeout 自定义时间 |
1 | # 操作 fixes fixed fix closes close closed |
1 | $ git rebase --root -i |
Git LFS 是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持
1 | curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash |
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
1 | 下载安装上述链接的文件后执行命令 |
使用前需要
git lfs install
开启功能
1 | 大文件追踪 |
END.
]]>安卓逆向分析中,一些必要清楚的字段。
字段 | 描述 | 组成 | 重复性 | 备注 | |
---|---|---|---|---|---|
Android ID | 安卓设备出厂生成的唯一设备ID | 16 位字符串 | 理论上有 36的16次方种组合,不易出现重复 | ROOT、刷机、恢复出厂设置时会被重置 | |
OAID | 移动安全联盟推出的匿名设备标识符 | 32 位字符 | 不易出现重复 | 可手动重置、可恢复出厂设置重置 、Android 10以上可获取 | |
IMEI | 国际移动设备识别码 | 15 位数字 | 不易出现重复 | 恢复出厂设置不会重置、但可软件伪造、Android 10以上不支持获取 | |
Mac | 设备唯一网络标识、全球唯一识别码、各厂商区别划分 | 48 位二进制数 | 理论上有 2 ^ 48(281474976710656) 次方种组合,不易出现重复 | 恢复出厂设置不会重置、但可软件伪造 | |
Serial | Android 序列号(硬件) | 16 位字母字符串 | 不易出现重复 | 与硬件信息同步 | |
DrmID(Media) | MediaDrm保护版权唯一ID | 长度根据各类算法不定长 | 不易出现重复 | 恢复出厂设置大概率不会被重置 | |
UUID | 随机序列码 | 32位 16 进制字符 | 不易出现重复 | 随机性较强、不易校验 | |
Band | 基带相关信息 | 根据各个OS不定长 | 随硬件变化 | 无 | |
Brand | 硬件手机品牌 | 根据各个品牌不定长 | 随品牌变化 | 无 | |
Model | 品牌下的细分型号 | 根据各个品牌不定长 | 随品牌变化 | 无 | |
Manufacture | 制造厂商 | 根据各个品牌不定长 | 随品牌变化 | 无 | |
Boot | 上次开机到当前时间 | Unix 时间戳(毫秒) | 随用户使用时长变化 | 无 | |
DeviceId | 设备的唯一ID | 不定长字符串 | 可能为IMEI、 MEID 或 ESN | 随手机环境变化 | 无 |
Sim Serial | Sim 卡的序列号 | 无 | 无 | 装有 Sim 卡时可用 |
END.
]]>一些博文阅读到一半的时候,会有个阅读全文的按钮。
点击后需要你关注公众号,获取密码或暗号或验证码。
本文只针对 该工具由 openwrite.cn 免费提供
相关的关键字。
blogId
关键字。1234-1612312341234-123
的值。1 | # 格式 |
END.
]]>记录一些树莓派4B的记录,使用的是树莓派爱好者基地64位系统2.0正式版(Debian)
的系统。
1 | $ new-item ssh -type file |
1 | $ vim wpa_supplicant.conf |
1 | country=CN |
1 | sudo apt update |
1 | sudo apt install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libffi-dev -y |
注意如果没安装
libffi-dev
的话可能会出现ModuleNotFoundError: No module named '_ctypes'
错误
1 | wget https://npm.taobao.org/mirrors/python/3.9.9/Python-3.9.9.tgz |
1 | --enable-optimizations(优化参数 自选) |
1 | alias pq3.9='sudo pip3.9 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com' |
1 | sudo rm /usr/bin/python |
1 | sh -c "$(curl -fsSL https://ghproxy.com/https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" |
End
]]>小米AX9000折腾记录, 官方固件版本为AX9000 1.0.108.bin
不是全量文章,整合流程,挑出部分重点,防止重复踩坑。
1 | # 比较重点的一个脚本 下面会用到 |
重点是将OPENWRT路由器ip设置为169.254.31.1, 然后关闭DHCP。不然会出现各式报错。
重点是热点改成OpenWrt,密码12345678。以及热点网络适配器去掉ipv4的勾选项目。
重点是
wireless-ax9000.sh
,也可以手动写入最上面的代码块。
1 | # 注意URL的参数,按实际情况替换。 |
xqsystem.lua
以上最好是都在2.4G频段进行。几个教程需要搭配使用,看重点,可以多阅读几遍。
请注意有变砖风险,可以跳过这部分。
1 | 提前备份(最好下载保存) |
参考教程:
小米ax3600/ax6000/ax9000/ax5/ax6获取root权限
ax9000永久获取ssh权限
1 | 1.这一部是设置env保证小米固件在分区rootfs里,为下一部把qsdk刷到rootfs_1做准备 |
这里刷完是两个分区,可以官方固件和openwrt来回切换。
注意如果要重新刷,需要先执行3到原版固件,再执行2写入固件。
参考教程:
1 | 1. AdGuardHome管理面板账号密码 root-admin 或者root-password |
AX9000默认的分区大小不足以正常使用软件,所以需要挂载U盘扩容空间
请注意要提前把U盘格式化成ext4
1 | 检测U盘是否插入 |
重启后浏览器登录luci界面,点击系统->挂载点。在挂载点的下方点击修改按钮。
挂载点选择作为外部overlay使用(/overlay)(不要选择其他选项),点击保存,再点击保存&应用。
在命令行输入reboot执行路由器重启。重启后路由器可能会恢复出厂设置。 重启后打开系统->软件包,可以看见空闲空间已经变大。
挂载完成,这里参考了
OpenWrt挂载U盘
OPENWRT | ESXI 下 OpenWrt扩容Overlay,增加安装插件空间
1 | root@OpenWrt:~# opkg print-architecture |
把返回的回显复制到opkg的设置里
倒数第二行加一行,修改后如下
1 | root@OpenWrt:~# opkg print-architecture |
但是因为ipq807x
并没有适配,所以一些包最好是手动下载安装,手动安装依赖。
1 | # 注意 19.07-SNAPSHOT |
1 | 软件包界面手动安装或者命令 |
1 | 或者写入/etc/profile |
1 | 安装用户相关 |
安装libcap libcap-bin
, 因为新版本变成了libcap-ng libcap-ng-bin
1 | 手动 |
给U盘分区,ext4格式。分两个或者多个以上,第一个分区要大,给Docker用的 ,第二个分区给/overlay。
注意要关闭docker
1 | 查看挂载的U盘分区 |
把分区好挂载到mount /sda3
1 | 如果报错不存在文件夹 可能需要手动创建/mnt/sda2 |
挂载检测是否完成
1 | ls /mnt/sda2 |
迁移Overly
1 | cd /overlay |
设置开机自动挂载1
2
3
4
5
6 /etc/rc.local
echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy
添加以下这句挂载命令
mount /dev/sda2 /overlay
exit 0
1 | 开启网卡混杂模式 |
以下大部分bash命令需要在ssh里操作
名称 | 路径 |
---|---|
网易 | http://hub-mirror.c.163.com |
中国官方镜像 | https://registry.docker-cn.com |
中国科技大学 | https://docker.mirrors.ustc.edu.cn |
阿里云镜像 | https://[xxx].mirror.aliyuncs.com |
1 | # Portainer UI界面 搜索并拉取 |
等待部署完成, 设置地址访问192.168.31.1:3000, 根据需求设置(可百度设置教程)。
1 | $ cd /tmp |
刷新页面即可
1 | # vim /etc/dnsmasq.conf 最后添加 |
重启后即可使用AdgHome,注意这里使用的是转发,所以Adg里的客户端显示的都是本地地址。
不要尝试使用Adg的53端口来替换dnsmasq的53,会有大问题。
也不要尝试再DCHP里设置DNS,会有大问题。
仅供参考
1 | bind_host: 0.0.0.0 |
1 | $ vim /etc/rc.d/S99turnoffled |
1 | !/bin/ash |
1 | $ opkg update |
1 | $ vi /etc/opkg.conf |
1 | # 注释掉这一行 |
除了文章中引用的项目,还有以下可能会用到的关联:
END.
]]>记录TensorFlow 中v2版本使用v1代码的各种问题
Question:
1 | from keras.utils import multi_gpu_model |
Answer:
1 | from keras.utils import multi_gpu_model |
Question:
1 | ValueError: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1) |
Answer:
1 | box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[::-1], K.dtype(feats)) |
Question:
1 | TypeError: Tensors are unhashable. (KerasTensor(type_spec=TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"))Instead, use tensor.ref() as the key. |
Answer:
1 | from keras import backend as K |
Question:
1 | ImportError: cannot import name 'BatchNormalization' from 'keras.layers.norm... |
Answer:
1 | from keras.layers.normalization import BatchNormalization |
END.
]]>记录下安装过程,以便日后查看。
以下操作都是基于ROOT权限下操作,如果不是或者权限不足,请在命令前添加 sudo
1 | # 备份 |
1 | # 看需求安装 有些包是编译PHP用的 懒得拆分了 有强迫症的可以试试 |
选择需要的版本下载
XZ Compressed source tabball
,下载速度慢可以考虑镜像下载。
1 | wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz |
以Python3.9.5
安装为例
1 | # 解包,解压缩 |
等待编译完成即可,如果没有什么其他的报错,应该就OK的。
使用
python3.9 xxx.py
和pip3.9 install xxxx
怎么喜欢怎么来
1 | root@de9bc33b1a58:~# pip3.9 -V |
1 | 清华:https://pypi.tuna.tsinghua.edu.cn/simple |
END.
]]>清一色的开篇,目的只为水一篇文章…
本次研究对象 和彩云网盘(mCloud)7.3.4
此记录更偏向于结果,只保证研究版本有效,去年分析的,今年才发,不保证有效
账密方式登录
1 | POST https://aas.caiyun.feixin.10086.cn/tellin/thirdlogin.do HTTP/1.1 |
观察以上登录请求发现加密的东西不少,请求头、请求体、响应体都有不同程度的加密
只写几个比较重要的,大部分可以为空或者默认值
1 | x-DeviceInfo: 1|10.0.3.15|1|7.3.4|Netease|MuMu|87AD2EDF19FFE5D7779D4191937FD5F0|08-00-27-e5-3d-e6|android 6.0.1|900X1600|zh||| |
包含的东西比较多,以|
分隔数据 ,下面表格按分割后的数据显示
原始数据 | 代表内容 |
---|---|
1(1) | 网络类型 |
10.0.3.15 | IP地址 |
1(2) | 固定默认 |
7.3.4 | SDK版本 |
Netease | MANUFACTURER |
MuMu | MODEL |
87AD2EDF19FFE5D7779D4191937FD5F0 | 生成UUID |
08-00-27-e5-3d-e6 | MAC地址 |
android 6.0.1 | ANDROID版本 |
900X1600 | 分辨率 |
zh | 默认值 |
空 | 空 |
空 | 空 |
1 | x-ExpRoute-Code: routeCode=18880886001,type=10 |
原始数据 | 代表内容 |
---|---|
routeCode | 手机号 |
type | 如果是手机号登录 默认值为10 |
内容组成为XML,大部分可以为空或者默认值
1 |
|
以下
sha-1()
、md5()
等代表加密方式 ,{}
代表字符串拼接填充
原始数据 | 代表内容 |
---|---|
secinfo | sha-1(fetion.com.cn:{password}) |
登录成功后,返回数据为一长串密文,需要搭配上下文的东西解密使用
1 | 8F5060F5F1158B1CD0C081BA51C02C12DAD4C8F839CE2E44954B1DFE5A7C0137F0FA3FEB366B23A7B9EB4535AC403D0CDF26EB5973C647B26BEB85EBDCA65595AFFC1149A6D387 |
1 | # 拼接字符串 |
算法为AES加密解密(ECB模式) , 解密秘钥为以上
clientkeyDecrypt
clientkeyDecrypt
为MD5后取前16位转大写 , ECB模式无填充解密即可
1 | <root> |
注意解密后数据尾部有N个
\x0f
or\x0b
or\x0c
or\x06
可能为其他不同的字符,最好写通用匹配方式去除
仓库地址 和彩云-内容加解密
代码逻辑比较简单,详情施工中…
该文章代码只为学习,麻烦未经允许禁止转载哦
END.
]]>清一色的开篇,目的只为水一篇文章…
这次是Bilibili Web端直播心跳API一个加解密算法
去年写的东西,放着一直没怎么使用,一直懒就没写…
以下所有数据都脱敏处理或者打码,不要作测试数据…
如果研究的朋友,可能都抓过包看过数据包的情况
有两个关键请求,分别为reportEnterRoom
和reportHeartBeat
两个请求在不同状态下带入一个加密参数 s
https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/E
E请求在心跳流程中只请求一次,进入房间
1 | # E 1 |
is_patch == 0 -> heart_beat == [] 一般直接使用这个
1 | # E 2 |
is_patch == 1 -> heart_beat == [**] 短时间内重复进出直播间触发
https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/X
X请求在心跳流程中按次循环,必须先E再循环请求X
1 | # X 1 |
参数注意数据规律,除了参数
s
,以下几个参数比较重要
NAME | DESCRIBE | REMARKS |
---|---|---|
ts | 请求时间 | null |
ets | 可从E->X*n依次从回显中取值 | null |
id | 大分区、小分区、轮次、长位直播间 | null |
secret_rule | 加密规则 | null |
heartbeat_interval | 请求之间的休眠 | null |
secret_key | 加密规则 | null |
设备、版本不同可能存在参数差异
这里只贴一下大概的流程,具体的细节可以看后面的代码
加密前明文主要是一些直播参数,以及dom
、’window’、document
加密部分是一个wasm
文件,带入参数以及secret_rule
等加密
加密后密文是一个128位的HASH值
解密过程就是一场艰苦的和JS玩捉迷藏的游戏
进入直播间和循环心跳
外层调用心跳以及计算SIGN
初始化Wasm
调用Wasm加密Spyder (加密不止一轮)
Spyder本体 (cargo-web)
深度可以看看wasm2wat demo
Demo
只是贴出大概步骤,跳转并只不是一个js文件里发生
仓库地址 哔哩哔哩 Web端直播加密心跳请求解析
代码逻辑比较简单,详情施工中
文章写的比较乱不全,会贴出加解密部分,剩下的东西自己分析了
该文章代码只为学习,麻烦未经允许禁止转载哦
靠别人写全部代码,不太可能,大家都是鸽子,咕咕咕!
END.
]]>博客也很久没水了,从日更周更到N月更,不知道写一些什么好…
这次是Bilibili客户端播放API的一个加解密算法,也折腾了我一段时间,
东西写好很久了,一直懒就没写…
如果研究的朋友,可能都抓过包看过数据包的情况
如图所示,播放计数的API,以及请求头、请求体、返回值
API:
https://api.bilibili.com/x/report/click/android2
请求头的数据还是比较正常,但是看到请求体部分,瞬间懵圈了
是一片乱码字符串,看了整个播放过程的API,只有这个是加密乱码的
如果不是某段时间出现的代码,我也不知道这个是什么算法。
NAME | VALUE | TYPE | DESCRIBE |
---|---|---|---|
AES_KEY | fd6b639dbcff0c2a1b03b389ec763c4b | string | null |
AES_IV | 77b07a672d57d64c | string | null |
SHA256_SALT | 9cafa6466a028bfb | string | null |
这只适用于安卓客户端,和ios客户端等是不通用的
解密,主要是为了解出请求参数有些什么,就不贴太多代码在博客上了
解密过程主要就是一个AES解密,暂时用不到Sha256 salt
图中红框内黑色部分数据就是加密的请求体,下面我们来解密参数
黑色部分数据Copy as Base64
(因为我的解密代码是基于Base64的)
拆分出来的一部分加解密代码放到了Github
哔哩哔哩-App客户端播放参数加解密
解密部分我就不多说了,秘钥等都贴出来了,能折腾的就慢慢折腾
我就直接直接贴出解出来的参数,参数比较多
这是登陆后的播放参数
NAME | VALUE | DESCRIBE |
---|---|---|
access_key | f3ae492*0c51 | null |
aid | 123456 | null |
auto_play | 0 | 可为0-2 |
cid | 654321 | null |
did | BT**4a | 和设备相关 |
epid | 0 | null |
ftime | 1558340481 | null |
lv | 4 | null |
mid | 1234 | null |
part | 1 | 分P |
sid | 0 | null |
stime | 1558416933 | null |
sub_type | 0 | null |
type | 3 | null |
sign | 22bb3**cdb01b9 | sha256加密 |
这是不登陆的播放参数
NAME | VALUE | DESCRIBE |
---|---|---|
aid | 123456 | null |
cid | 654321 | null |
did | BT**4a | 和设备相关 |
ftime | 1558416933 | null |
lv | 0 | null |
mid | null | 值为空 |
part | 1 | 分P |
stime | 1558416933 | null |
设备、版本不同可能存在参数差异
大概的加密过程
AES加密( 参数排序(para) + Sha256Hash+salt加密(sign) )
我就贴一下一部分代码,知道怎么用就好了
1 | data = { |
代码环境Python3,参数随便写的,还是得按照你自己的解密参数来
贴出来的代码只是一部分,基于github上的代码
1 | def hashlib_sha256(data, salt='9cafa6466a028bfb'): |
AES的就不贴了,有点长,可以自己去看
文章写的比较乱不全,只会贴出加解密部分,剩下的东西自己分析了
该文章代码只为学习,麻烦未经允许禁止转载哦
最后再贴一遍仓库地址 哔哩哔哩-App客户端播放参数加解密
靠别人写全部代码,不太可能,大家都是鸽子,咕咕咕!
END.
]]>很久没有水博客了,在运行一个Django
项目的时, 服务器版本大概Centos7.2
,新机器花了点时候安装完需要的环境和依赖,本想一发入魂直接成功的,昨天在Ubuntu上成功运行,
结果Centos就给我整个报错。
1 | ..... |
就是Django
查到的Sqlite
的版本不对,找到的是3.7.17,
但是对版本要求(version <= 3.8.3),爬了一下资料,
在Django版本说明中看到
1 | # SQLite的最低支持版本从3.7.15增加到3.8.3 |
这就得升级Sqlite3的版本了
选择需要的版本下载
Source Code -> sqlite-autoconf*
以写博客时的最新版安装为例
1 | # 下载 |
等待编译完成即可,如果没有什么其他的报错,应该就OK的。
如果是Centos7,yum更新了最新的Sqlite,默认的版本应该是3.7.17,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 备份默认的sqlite
$ sudo mv -v /usr/bin/sqlite3 /usr/bin/sqlite3.7.17
"/usr/bin/sqlite3" -> "/usr/bin/sqlite3.7.17"
# 复制新版本的sqlite文件夹
# 此时目录 sqlite-autoconf-3280000
$ sudo cp -v sqlite3 /usr/bin
"sqlite3" -> "/usr/bin/sqlite3"
# 查看一下文件是否成功
$ ls /usr/bin |grep sqlite
sqlite3
sqlite3.7.17
# 共享库
$ export LD_LIBRARY_PATH="/usr/local/lib"
# 如果登出后失效的,可以写进~/.bashrc 或 ~/.bash_profile
1 | # 版本查看 |
正常了,没有版本不匹配的报错了。
其实主要sqlite3是yum源的最新版本才3.7.17,别卸载它后再装(跳过坑),yum依赖sqlite,所以只有编译安装或者其他方式安装后替换文件目录。
另外要注意的是,
sudo python3.6 & python3.6
的执行结果是不同的。
sudo不一定能读到新版本的Sqlite,窝再去爬爬文章待补充。
文章比较乱,机器差异什么的或许有不同,仅供参考。
参考文章: Django2.2で開発サーバー起動時にSQLite3のエラーが出た場合の対応
END.
]]>Centos7.5/Python2.7
签到 —— 一个自动签到框架 base on an HAR editor
Centos1
2
3
4# 开发工具包
yum groupinstall "Development Tools" -y
yum install python-devel mysql-connector-python git -y
pip install tornado==4.5.3 u-msgpack-python jinja2 chardet requests pbkdf2 pycrypto
Ubuntu or Debian1
2apt-get install python-dev autoconf g++ python-pbkdf2
pip install tornado u-msgpack-python jinja2 chardet requests pbkdf2 pycrypto
克隆项目1
2git clone https://github.com/binux/qiandao.git
cd qiandao
1 | # 后台运行 |
成功的话访问http://ip:8923/
登陆注册设置管理员1
python ./chrole.py your@email.address admin
模板的话可以在主站下载,也可以自己做,都有教程的。
基本使用用ip访问就好,如果有要求域名的话,就使用反向代理吧1
2
3yum install nginx -y
systemctl start nginx
vim /etc/nginx/nginx.conf
conf配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15server
{
listen 80;
#替换域名
server_name domain.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:8923;
}
}
nginx -t
然后重启服务
1 | systemctl restart nginx |
开机自启1
systemctl enable nginx
这样就能通过域名访问了
教程很乱,当文档看吧,针对有基础的,很多小细节都没多写。
End…
]]>Python3.6.6/threading/threading.Event,如何给每个线程加一个控制开关。
在爬虫项目中,threading
模块的使用率还是很高的,
每个线程之间独立,如果一个线程成功完成了任务退出了,
其他的线程还要继续跑吗? 会造成资源浪费,如何给线程之间弄个信号源,
一个线程完成任务,其他线程及退出呢?当然可能有很多方法完成目的,
我只把自己使用过的方法做个记录。
test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46import random
import threading
class Calculation(threading.Thread):
def __init__(self, signal):
threading.Thread.__init__(self)
# 开关控制
self.singal = signal
def run(self):
self.test()
return
def test(self):
while True:
num = random.randint(0, 100)
print(threading.currentThread(), num)
# 如果其他线程完成任务打开开关,当前线程就退出
if self.singal.isSet():
print(threading.currentThread(), '其他线程已经完成任务,退出!')
break
# 如果随机数符合了条件,就把开关打开
if num == 66:
print(threading.currentThread(), '当前线程完成任务,退出!')
self.singal.set()
break
return
if __name__ == '__main__':
# 初始“开关” ,默认值 False
event_obj = threading.Event()
# 线程列表
threads_list = []
# 开始线程 5个线程
for thread in range(0, 5):
threads_list.append(Calculation(signal=event_obj))
for t in threads_list:
t.start()
# for t in threads:
# t.join()
看看输出结果,也没什么其他好说的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39# 数据太长,删过一部分,重要的流程还在
# \Pythonvenv\py3\Scripts\python.exe test.py
<Calculation(Thread-1, started 24500)> 1
<Calculation(Thread-1, started 24500)> 34
<Calculation(Thread-1, started 24500)> 60
<Calculation(Thread-1, started 24500)> 13
<Calculation(Thread-2, started 24400)> 36
<Calculation(Thread-2, started 24400)> 60
<Calculation(Thread-1, started 24500)> 80
<Calculation(Thread-3, started 13304)> 19
<Calculation(Thread-2, started 24400)> 87
<Calculation(Thread-1, started 24500)> 97
<Calculation(Thread-3, started 13304)> 36
<Calculation(Thread-2, started 24400)> 3
<Calculation(Thread-1, started 24500)> 2
<Calculation(Thread-4, started 18092)> 38
<Calculation(Thread-5, started 16736)> 62
<Calculation(Thread-3, started 13304)> 33
<Calculation(Thread-2, started 24400)> 20
<Calculation(Thread-2, started 24400)> 97
<Calculation(Thread-2, started 24400)> 58
<Calculation(Thread-2, started 24400)> 23
<Calculation(Thread-5, started 16736)> 37
<Calculation(Thread-3, started 13304)> 91
<Calculation(Thread-1, started 24500)> 13
<Calculation(Thread-4, started 18092)> 11
<Calculation(Thread-2, started 24400)> 16
<Calculation(Thread-2, started 24400)> 66
<Calculation(Thread-2, started 24400)> 当前线程完成任务,退出!
<Calculation(Thread-3, started 13304)> 64
<Calculation(Thread-1, started 24500)> 19
<Calculation(Thread-4, started 18092)> 92
<Calculation(Thread-5, started 16736)> 24
<Calculation(Thread-3, started 13304)> 其他线程已经完成任务,退出!
<Calculation(Thread-1, started 24500)> 其他线程已经完成任务,退出!
<Calculation(Thread-4, started 18092)> 其他线程已经完成任务,退出!
<Calculation(Thread-5, started 16736)> 其他线程已经完成任务,退出!
Process finished with exit code 0
1 | # 定义一个开关 |
End.
]]>Centos7.3/Python3.6.6|中文语言包的安装及中文支持
新系统配置Python环境,运行项目出现编码错误。
1 | UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128) |
遇事不决问百度,万裁难断询谷歌
一开始搜索发现大部分文章分析是代码编码问题,后来尝试无果。
后来猜测可能是编译Python时系统环境编码有问题,经过一通操作,果然解决了,
查询了一下,发现网络上果然有些朋友栽在这个坑里,就记录一下解决方案。
1 | # 包括了"zh_CN" |
查看一下是否安装成功1
2# 如果有"zh_CN"什么的,应该就成功了
locale -a |grep "zh_CN"
1 | vim /etc/locale.conf |
1 | # 查看系统语言变量 |
会出现好几个”zh_CN.UTF-8”就正常的
1 | # 查看语言包 |
如果没有出现错误,就表示中文已经安装成功了,
可以尝试一下在终端上操作一下安装删除等操作,
看能不能正常输出中文,如果出现错误就单独安装一下。
1 | # 只针对Centos7 , 6版本是不一样的 |
如果一切没有的问题的话,就可以重新编译一下Python3环境。
END.
]]>Python的threading
模块,没有提供线程退出的方法。
如果程序多线程是死循环,即使CTRL+C也没有任何效果。
1 | for t in thread_list: |
setDaemon(True)
:,是把子线程设置为守护线程,主线程和子线程会同时运行,主线程结束运行后,无论子线程运行与否,都会和主线程一起结束。
所以我们结束空循环的时候,子线程也会退出。
join()
:join函数会使得主调线程阻塞,直到被调用线程运行结束或超时,才执行主线程。
只需要设置守护线程,挂一个空循环就好了
End.
]]>Centos7.5/Python3.6.6,记录下安装过程,以便日后查看
1 | yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y |
选择需要的版本下载
XZ Compressed source tabball
以Python3.6.6
安装为例
1 | # 解包,解压缩 |
等待编译完成即可,如果没有什么其他的报错,应该就OK的。
怎么喜欢怎么来1
2ln -s /usr/local/python3.6.6/bin/python3.6 /usr/local/bin/python3.6
ln -s /usr/local/python3.6.6/bin/pip3.6 /usr/local/bin/pip3.6
使用
python3.6 xxx.py
和pip3.6 install xxxx
END.
]]>常用比较万金油的下载函数,记录方便下次调用。
1 | import requests |
**kwargs
允许你将不定长度的键值对, 作为参数传递给一个函数。
如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs
。
END.
]]>Centos7.4/Python3.6.6
安装Scrapy
时需要Twisted
依赖,使用pip3 install Twisted
安装,
但是报了一个错误。
1 | This is the last Twisted release where... |
遇事不决问百度,万裁难断询谷歌
经过一番搜索后,问题是Twisted
模块和高版本Python有兼容性问题,
可以选择在官网下载文件然后编译安装。
去官网下载对应的版本,我这里选一个目前最新版本,是支持Python3.6的
1 | # 下载 |
等待编译完成即可,如果没有什么其他的报错,应该就OK的。
END.
]]>记录一些Docker的使用
服务商 |
---|
阿里云 |
灵雀云 |
DaoCloud |
DockerHub |
add… |
1 | docker run -it -p local_port:container_port --name="example" -v local_path:container_path image_id /bin/bash |
1 | docker ps -a |
1 | CONTAINER ID| IMAGE| COMMAND| CREATED| STATUS| PORTS| NAMES |
1 | docker images |
1 | REPOSITORY|TAG|IMAGE ID|CREATED|SIZE |
1 | docker start 容器名或容器ID |
1 | docker stop 容器名或容器ID |
1 | docker rm 容器名或容器ID |
1 | docker rm `docker ps -a -q` |
1 | docker rmi 镜像名或者镜像ID |
1 | docker attach 容器名或 |
1 | docker exec -it 容器ID /bin/bash |
1 | docker logs 容器名或容器ID |
1 | docker top 容器名或容器ID |
1 | $ sudo mkdir -p /etc/docker |
End
]]>Bilibili客户端API的Sign验证算法
sign的拼接
md5加密( 参数排序(para) + App内置(appsecret) )
按key排序,
key1=value1&key2=value2&key3=value3
App内置的私钥,抓包可见
appsecret=ea85624dfcf12d7cc7b2b3a94fac1f2c
(栗子)
加密前应该是key1=value1&key2=value2&key3=value3ea85624dfcf12d7cc7b2b3a94fac1f2c
附上一个php的栗子1
2
3
4
5
6
7
8
9
10
11
12
13/**
* $data array
* $appSecret string
* return string
*/
function createSign($data,)
{
$appSecret = 'ea85624dfcf12d7cc7b2b3a94fac1f2c';
ksort($data);
$url_build = http_build_query($data);
return md5(http_build_query($data) . $appSecret);
}
END.
]]>