OBS设置
- 设置,通用,语言,简体中文
- 设置,通用,主题,System
- 输出,串流,视频比特率 4000Kbps
- 输出,录像,路径,D:/OBS/
- 输出,录像,质量,近似无损的质量
- 输出,录像,格式,MP4
- 输出,录像,编码器,硬件
- 视频,基础分辨率,输出分辨率,都选择1920*1080
- 热键,开始录制,F1
- 热键,结束录制,F2
OBS设置
简单描述配置x86软路由的过程,我自己的笔记本电脑为Linux系统
步骤一、格式化SSD固态硬盘
设备, * 2.5英寸 USB3.0外置硬盘盒 1个 * 2.5英寸 120GB SATA接口的固态硬盘 1个 一般30GB的固态硬盘容量足够安装Openwrt,我这个是闲置的一块SSD,把SSD固态硬盘,通过外置的USB盒子连接到自己的电脑,打开终端,通过fdisk命令找到该盘的盘符 # fdisk -l 执行格式化的操作 # fdisk /dev/sda
步骤二、自己编译Openwrt的镜像或者下载网络上现成的镜像
图省事的,可以直接选用Koolshare固件,http://fw.koolcenter.com/
2021-9-23
当前的x86版本的固件下载地址 http://fw.koolcenter.com/LEDE_X64_fw867/openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img.gz
使用命令解压
gzip -d openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img.gz
// 自己编译Openwrt固件的教程,不在这篇文章里描述,将来另开章节
步骤三、将固件的image文件dd进硬盘
直接使用dd命令,进行镜像数据的写盘,最好用root用户执行dd,参考命令,其中/dev/sda,需根据实际的写。
root@pc:~# dd bs=1M if=./openwrt-koolshare-router-v2.37-r17471-8ed31dafdf-x86-64-generic-squashfs-combined.img of=/dev/sda 700+1 records in 700+1 records out 734527488 bytes (735 MB, 700 MiB) copied, 2.98561 s, 246 MB/s root@pc:~#
// bs 参数 是每次写入的块的大小,一般1MB可以了
// if 参数 是输入的文件,这里是镜像文件
// of 参数 是输出的设备,这里是我那块120G的固体硬盘,我这里是/dev/sda,你们根据实际的写。
步骤四、设备安装
将刚刚写入镜像数据的盘,从硬盘盒中取出,连接进软路由设备中,一般就是SATA数据和电源供电,两根线的连接,很简单。
步骤四、软路由的初始化配置
配置自己的电脑网口到192.168.1.10,用网线连接到软路由的LAN口,在软路由的离线状态,修改的内容如下,WEB登录192.168.1.1 默认用户root 默认密码koolshare
步骤五、软路由连接到光猫
软路由的WAN1 到联通光猫的LAN1
软路由的WAN2 到电信光猫的LAN1
软路由的LAN1 到千兆交换机的LAN
// 一般光猫,有的只有LAN1是千兆口,LAN2是IPTV,其他是缩配的百兆口
// 网线,推荐使用六类的网线,家用足够
开机,Power On,骑上我的小骆驼,高速稳定的家庭数据的核心,软路由就上线了。
一、Python3 的数据类型
数字 number
字符串 string
列表 list
元组 tuple
集合 set
字典 dict
asyncio 资料备忘
CPU Bound -- Multi Processing I/O Bound Fast I/O Limited Number of Connections -- Multi Threading I/O Bound Slow I/O Many Connections -- Asyncio
协程 coroutine
import asyncio import datetime async def getNow(): return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") async def getRuntime(): v = await getNow() print(v) asyncio.run(getRuntime()) # 使用async关键字 声明异步方法 # 使用await关键字 等待协程执行完成 # 使用asyncio.run(某个async方法) 执行
Python3 多线程 threading 备忘录
t.setDaemon(True) // 线程声明为守护线程,必须在start() 方法调用之前设置 t.start() // 开始线程活动 t.join() // 在子线程完成运行之前,这个子线程的父线程将一直被阻塞
方法与属性 描述 current_thread() 返回当前线程 active_count() 返回当前活跃的线程数,1个主线程+n个子线程 get_ident() 返回当前线程 enumerate() 返回当前活动 Thread 对象列表 main_thread() 返回主 Thread 对象 settrace(func) 为所有线程设置一个 trace 函数 setprofile(func) 为所有线程设置一个 profile 函数 stack_size([size]) 返回新创建线程栈大小;或为后续创建的线程设定栈大小为 size TIMEOUT_MAX Lock.acquire(), RLock.acquire(), Condition.wait() 允许的最大超时时间
对于Thread类,它的定义如下: threading.Thread(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None) # 参数group是预留的,用于将来扩展; # 参数target是一个可调用对象,在线程启动后执行; # 参数name是线程的名字。默认值为“Thread-N“,N是一个数字; # 参数args和kwargs分别表示调用target时的参数列表和关键字参数;
Thread类定义了以下常用方法与属性: 方法与属性 : 说明 start() : 启动线程,等待CPU调度 run() : 线程被cpu调度后自动执行的方法 getName()、setName()和name : 用于获取和设置线程的名称 setDaemon() : 设置为后台线程或前台线程(默认是False,前台线程)。如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止。如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程执行完成后,程序才停止 ident : 获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None is_alive() : 判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断这段时间内,线程是激活的 isDaemon()方法和daemon属性 : 是否为守护线程 join([timeout]) : 调用该方法将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。
Python在threading模块中定义了几种线程锁类,分别是: Lock 互斥锁 RLock 可重入锁 Semaphore 信号 Event 事件 Condition 条件 Barrier 阻碍
需求描述,
采集网络公开的shadowsocks线路,玩具类型,项目编号P1SS
技术分析
一般情况下,一个普通的shadowsocks文件如下 ss://YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3#US 1. ss://是协议标识 2. YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3是信息内容正文 3. #US是注释内容
将信息正文的内容转码
YWVzLTI1Ni1jZmI6MTIzNDU2IUAjJDpAMTAxLjc5LjU1LjIwMTo4MDg3 --> b'aes-256-cfb:123456!@#$:@101.79.55.201:8087' 可以发现是一个bytes类型的字符串
既然得到一个字符串,则可以对字符串,进行切割,获得其中的数据
// 最后一个@字符进行切分字符串 >>> s = 'aes-256-cfb:123456!@#$:@101.79.55.201:8087' >>> s.rsplit('@',1) ['aes-256-cfb:123456!@#$:', '101.79.55.201:8087'] // 可以切分得到1 加密算法:密码 // 可以切分得到2 IP:端口
// 切分 加密算法:密码 >>> s = 'aes-256-cfb:123456!@#$:' >>> s.split(':',1) ['aes-256-cfb', '123456!@#$:'] >>> // 切分 IP:端口 >>> s = '101.79.55.201:8087' >>> s.split(':',1) ['101.79.55.201', '8087'] >>>
通过3步的字符串的切分,即可以获取到需要的4个数据信息,校验一下,就可以进行入库的操作
采集源头,分类 1. ss list,一个包含JSON数据信息的列表 [ { "remarks": "NL1", "server": "5.253.207.85", "server_port": "49396", "method": "aes-256-gcm", "password": "BdRWC38L5JUDMTYNNxJGcUwB", "plugin": "", "plugin_opts": {} }, { "remarks": "NL2", "server": "5.253.207.86", "server_port": "49396", "method": "aes-256-gcm", "password": "BdRWC38L5JUDMTYNNxJGcUwB", "plugin": "", "plugin_opts": {} }, ... ] 2. ss sub,一个base64转码的字符串 base64encode( ss://238917498723...\n ss://238472938749...\n ... ) 3. ss content,一个字符串,其中包含一段ss://298739879287的字符
架构为 前/后/库 分离
数据库 <==> API服务器 <== invoker采集服务器 <==> 采集跳板 <==> 数据源1/2/3/... 数据库 <==> API服务器 <==> checker检测服务器 <==> 检测跳板 <==> 检测站CN1/US1 数据库 <==> API服务器 ==> publish发布服务器 <==> 发布跳板 <==> WEB站Web1/Web2
需要一个每日5万次的IP查询服务,目前市面上的IP查询服务,大多很贵,这个有2个办法可以解决。
本次使用ip-database项目,搭配纯真数据库的IP库,搭建可靠的本地IP查询服务,感谢纯真库,提供持久免费的更新。
项目地址 https://github.com/itbdw/ip-database
服务端操作系统 Debian 9
安装php服务
root@debian:~# apt-get install php
下载项目之后,随意测试一个IP,看是否可以运行 root@debian:~/ip-database-2.0.9/tests# php ip.php -i 101.84.1.1 {"ip":"101.84.1.1","country":"中国","province":"上海","city":"","county":"","isp":"电信","area":"中国上海电信"} root@debian:~/ip-database-2.0.9/tests#
纯真IP数据库 DAT文件更新 https://github.com/out0fmemory/qqwry.dat/archive/refs/heads/master.zip
把上面的封装到API里面,API地址为 http://198.211.9.196:41011/IPService ,参数为ip,封装的纯真数据库的版本v20210902,本地API文件run_IP_LOOKUP.py
请求示例1,请求一个国内IP地址的信息:
curl http://198.211.9.196:41011/IPService?ip=101.84.1.1 CN-上海-电信
请求示例2,请求一个海外IP地址的信息:
curl http://198.211.9.196:41011/IPService?ip=17.57.145.0
美国
请求示例3,请求一个错误的IP地址:
curl http://198.211.9.196:41011/IPService?ip=1.2.3.400
404
判断一个IP是否是归属于亚洲,https://ftp.apnic.net/stats/apnic/delegated-apnic-latest
2G网络制式
移动 :GSM
联通 :GSM
电信 :CDMA1X
3G网络制式
移动 :TD-SCDMA 国产标准
联通 :WCDMA 欧洲标准
电信 :CDMA2000
4G网络制式
移动 :TD-LTE
联通 :TD-LTE和FDD-LTE混合
电信 :TD-LTE和FDD-LTE混合
5G网络制式 三网一致,基站数量,覆盖,信号的频点不同而已