小米 AX1800 使用 ShellClash 科学上网

小米 AX1800 使用 ShellClash 科学上网 本文介绍如何在小米 AX1800 上使用 ShellClash 科学上网。 1 固件降级 小米 AX1800 1.0.336 版本固件 在 MiWiFi 后台的常用设置 -> 系统状态中点击手动升级,使用 1.0.336 版本的固件对路由器进行降级,整个过程不需要任何额外的操作。 完成后第一次进入后台配置时选择不自动更新,或在小米 Wi-Fi 手机 App 中关闭自动更新功能。 更新完成后路由器会重置为路由器底部贴条的设置。 2 解锁 SSH 首先登陆小米路由器后台 192.168.31.1,将浏览器地址栏中 stok= 后面的一部分的即为拷贝下来。 获取 SSH 权限 在浏览器中打开一个新页签,在地址栏中输入下面的链接,将其中 stok=...... 中后半部分的六个点换成刚才拷贝的内容,页面上显示 {"code":0} 即代表成功,这样就解锁了 SSH 到路由器上的权限。 http://192.168.31.1/cgi-bin/luci/;stok=....../api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B 修改 root 密码 在浏览器中打开一个新页签,在地址栏中输入下面的链接,将其中 stok=...... 中后半部分的六个点换成刚才拷贝的内容,页面上显示 {"code":0} 即代表成功,这样就将路由器上 root 账户的密码改为了 admin。 http://192.168.31.1/cgi-bin/luci/;stok=....../api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20echo%20-e%20'admin%5Cnadmin'%20%7C%20passwd%20root%3B 连接 SSH 打开 terminal 或者 powershell,ssh 到路由器的 root 账户上,密码是 admin。 ...

January 18, 2022 · 1 min

Kafka 入门

Kafka 入门 概述 Kafka 最初是为了解决 LinkedIn 数据管道问题应运而生的。它的设计目的是提供一个高性能的消息系统,可以处理多种数据类型,并能够实时提供纯净且结构化的用户活动数据和系统度量指标。 它不只是一个数据存储系统(类似于传统的关系型数据库、键值存储引擎、搜索引擎或缓存系统),还是一个持续变化和不断增长的流处理系统。现在 Kafka 已经被广泛地应用在社交网络的实时数据流处理当中,成为了下一代数据架构的基础。Kafka 经常会被拿来与现有的企业级消息系统、大数据系统(如 Hadoop)和数据集成 ETL 工具等技术作比较。 从发布和订阅消息流的角度来看,Kafka 类似于 ActiveMQ、RabbitMQ 或 IBM 的 MQSeries 等产品,其特点在于它以集群的方式运行,可以自由伸缩,处理大量的应用程序;其次,Kafka 可以按照要求持久化数据,即提供了数据传递的保证——可复制、持久化,保留多长时间完全可以由开发者决定。此外,消息系统只会传递消息,而 Kafka 的流式处理能力让我们只用很少的代码就能够动态地处理派生流和数据集。 1 基础概念 消息代理 在一个基于发布与订阅的消息系统中,数据消息的发送者不直接把消息发送给接收者,而是通过一个消息代理 message broker 传递消息,接收者订阅消息代理,并以特定的方式接收消息。Kafka 就是一个消息代理。 消息代理 message broker 是一种针对处理消息流而优化的数据库,它作为独立的中间服务运行,生产者和消费者作为客户端连接到消息代理服务,在使用消息代理的架构中主要有 3 种角色: 生产者将消息写入消息代理;生产者一般是异步架构的,当生产者发送消息时,它只会等待消息代理确认消息已经被缓存,而不等待消息被消费者处理 消息代理负责消息的存储,发送、重传等,一般会包含多个消息队列 message queue 消费者从消息代理接收消息并进行处理;消费者只依赖于消息代理,与生产者完全隔离 消息代理的优势主要有以下几点: 实现异步处理,提升性能 把消息处理流程使用消息代理异步化,不会阻塞生产者服务,生产者服务可以在得到处理结果之前继续执行,并提高其并发处理的能力。 提高系统的可伸缩性 生产者将大量消息推送到消息代理中,消息代理可以将这些消息分发给不同的消费者,使得多个消费者并行地处理消息,当消费者负载变化时,可以很容易地对消费者服务进行水平伸缩 削峰填谷 当生产者推送消息的速度比消费者处理消息的速度更快时,可以使用消息队列作为消息的缓冲,来削弱峰值流量,防止系统被短时间内的流量冲垮 应用解耦 使用消息代理后,生产者和消费者即可解耦,不再需要有任何联系,也不需要受对方的影响,只要保持使用一致的消息格式即可。 消息和批次 Kafka 的数据单元被称为消息,消息类似于关系型数据库里的一个数据行或一条记录;消息由字节数组组成,当消息以一种可控的方式写入不同的分区时,会用到 key,Kafka 会为 key 生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同 key 的消息总是被写到相同的分区上。 如果每一个消息都单独发送,会导致大量的网络开销。为了提高效率,消息会被分批次写入Kafka;批次 batch 是一组消息,这些消息属于同一个主题和分区;批次数据在传输时会被压缩,这样可以提升数据的传输和存储能力;单个 batch 的消息数量越大,单位时间内处理的消息就越多,但单个 batch 的传输时间就越长,因此需要在时延和吞吐量之间作出权衡。 主题和分区 Kafka 的消息通过主题 topic 进行分类,主题就好比关系型数据库的表,或者文件系统里的目录;同一个主题可以被分为若干个分区 partition,一个 partition 即一个提交日志,消息以追加的方式写入 partition,然后以先入先出的顺序读取。一个 topic 一般包含多个 partition,因此无法在整个 topic 的维度保证消息的顺序,只能保证消息在单个 partition 内的顺序。 ...

November 29, 2021 · 14 min

Prometheus 入门

Prometheus 入门 Prometheus 是一个开源的监控解决方案,也是云原生基金会 CNCF 的毕业项目,它能够提供指标数据的采集、存储、查询、告警等功能。本文主要介绍 Prometheus 的基础概念和应用中需要注意的一些问题。 1 监控系统 1.1 监控模式 监控系统执行监控检查的模式有两种,分别是 pull 和 push。Prometheus 采用了 pull 模式进行数据收集,同时也支持使用 Pushgateway 的 push 模式进行数据中转。 pull 方式的特点是有拉取间隔,不能及时获取数值的变化,因此需要进一步的数据处理;它的优点是在告警时可以按照策略分片,仅拉取需要的数据,并且支持聚合场景;缺点是监控的数据量庞大,对存储有较高的要求,切需要考虑数据的冷热分离。 push 方式的特点是由服务主动将数据推向监控系统,实时性更高;它的缺点是推送数据的不可预知性,因为当大量数据被推送到监控系统时,数据的缓存和解析会消耗大量资源,此时如果因为网络原因数据的收发没有得到确认,很容易产生数据的重发和重复,因此需要进行去重等操作。 pull 模式在云原生环境中更有优势,因为我们可以通过服务发现对所有需要进行监控的节点进行统一的数据拉取,如果使用 push 模式则需要在每个被监控的服务中部署上报数据的客户端,并配置监控服务器的信息,这会加大部署的难度。 1.2 Prometheus Prometheus 是一套开源的数据采集与监控框架,可以做后台服务器的监控告警,此处用来采集被测服务的性能指标数据,包括CPU占用比率、内存消耗、网络IO等。 特点 Prometheus 最主要的特点有 4 个: 通过 PromQL 实现多维度数据模型的灵活查询;这使得监控指标可以关联到多个标签,并对时间序列进行切片和切块,以支持各种查询和告警场景 定义了开放指标数据的标准,可以方便地自定义探针(exporter) 利用 Pushgateway 组件可以以 push 的方式接收监控数据 提供了容器化版本 架构 Prometheus 的架构主要由以下部分组成: Prometheus Server Prometheus 服务器主要包含了使用 pull 模式抓取监控数据,通过本地存储(本地磁盘)和远程存储(OpenTSDB, InfluxDB, ElasticSearch 等)保存数据,使用 PromQL 查询数据三大功能。 PromQL (Prometheus Query Language) 是 Prometheus 内置的数据查询语言,提供了对时间序列数据的查询,聚合和逻辑运算等操作的支持,被广泛地应用在数据的查询,可视化和告警中。关于 PromQL 的相关操作可以参考 探索PromQL。 ...

October 21, 2021 · 3 min

Python 源码学习(5):协程

Python 源码学习(5):协程 协程 coroutine 是一种用户态的轻量级线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程;Python中的生成器 generator 就是一个典型的协程应用,本文简单地对 Python 中生成器的实现进行分析。 1 生成器 如果 Python 中的函数含有 yield 关键字,那么在调用这个函数时,它不会如同普通的函数一样运行到 return 语句并返回一个变量,而是会立即返回一个生成器对象;以一个斐波那契数列生成函数为例: def FibonacciSequenceGenerator(): a, b = 0, 1 while True: yield a + b a, b = b, a + b if __name__ == "__main__": fsg = FibonacciSequenceGenerator() print(fsg) print(type(fsg)) $ python3 main.py <generator object FibonacciSequenceGenerator at 0x7fb4720b1ac0> <class 'generator'> 可以看到函数 FibonacciSequenceGenerator 返回了一个类型为 generator 的生成器对象 f;对于生成器对象,我们不能像操作普通函数一样直接进行函数调用,而是要使用 next() 或 fsg.send() 来进行函数切换,使得生成器函数开始或继续执行,直到 yield 所在行或是函数末尾再将执行权交还给调用方: for i in range(100): print(next(fsg)) $ python3 main.py 1 2 3 5 # ... 218922995834555169026 354224848179261915075 573147844013817084101 生成器的这种行为与线程切换非常类似,它包含了执行,保存,恢复上下文的步骤,用生成器来模拟线程的行为可以避免从用户态到内核态的切换,从而提升效率。 ...

August 4, 2021 · 5 min

Python 源码学习(4):编译器和虚拟机

Python 源码学习(4):编译器和虚拟机 Python 是一种解释型语言,一般在使用前我们会从 Python 官方网站上下载使用 C 语言开发编译的 CPython 解释器,本文用到的源码均来自 CPython。 Python 解释器(Python Interpreter)由 Python 编译器(Python Compiler)和 Python 虚拟机(Python Virutal Machine)两部分组成。当我们通过 Python 命令执行 Python 代码时,Python 编译器会将 Python 代码编译为 Python 字节码(bytecode);随后 Python 虚拟机会读取并逐步执行这些字节码。 1 Python 编译器 1.1 代码对象 Python 提供了内置函数 compile,可以编译 Python 代码并生成一个包含字节码信息的对象,举例如下: # test.py def Square(a): return a * a print(f"result:\t\t{Square(5)}") # main.py f = "test.py" code_obj = compile(open(f).read(), f, 'exec') exec(code_obj) print(f"code_obj:\t{code_obj}") print(f"type:\t\t{type(code_obj)}") $ python3 main.py result: 25 code_obj: <code object <module> at 0x7f052c156b30, file "test.py", line 1> type: <class 'code'> 可以看到生成的 code_obj 对象的类型是 class 'code',它在源码中对应的结构体是代码对象 PyCodeObject;代码对象是后续步骤中 Python 虚拟机操作的核心,它将字节码相关的参数个数、局部变量、变量名称、指令序列等信息包装成了一个结构体: ...

May 26, 2021 · 13 min