moviepilot
站点
- 必须配置一个认证站点
配置认证站点
以 HDFans 为例。

需要设置三个环境变量。
1 | AUTH_SITE=hdfans |
获取 UID
UID 是数字的用户 ID,点击用户名,跳转到用户信息页面,有 UID 一行。

获取 PASSKEY

一般在站点的设置页面的设置首页,这里的 密钥 就是 PASSKEY。
媒体服务
获取 Plex 的 API 密钥
找到一个媒体,点击这里的更多。

再点击获取信息。


再点击 查看 XML。

在最后有一个 X-Plex-Token,把等号后面的字符串填到 API 密钥那里。

注意
- MoviePilot 使用三方工具下载内容(比如 Transmission),并通过工具的 API 调用,需要注意的是,下载路径是 MoviePilot 指定的下载路径,如果 Transmission 在另外的容器里面,要确保下载路径在 MoviePilot 和 下载工具的映射是一致的。
辅种
MoviePilot 版本 2.1.9-1。辅种原理是,通过种子的 HASH 数据,确认相同的种子,再从其他站点下载种子,只要 HASH 校验通过即可。
- 注册 IYUU 获取 Token(微信关注后发送 Token)。
- 下载插件 IYUU 站定绑定
- 下载后,在已安装点击插件
- 输入 IYUU Token,点击保存,关闭插件配置
- 再次点击插件,选站点,输入密钥、UID,点击保存
- 查看日志校验是否成功,如果不成功可尝试绑定其他站点

- 下载插件 IYUU 自动辅种
- 启用插件
- 输入 IYUU Token
- 选择下载器
- 选择站点
- 保存即可

cmake troubleshoot
Cmake 工程测试不通过
错误信息
1 | Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output: |
解决方案
ninja-build 版本低
升级 ninja-build 版本,从 1.7.2 升级到 1.11.1 后问题解决。最新版,从这里下载。
使用其他 GCC 库
比如,使用 /opt/scylladb/bin 下的 gcc,需要同步设置 LD_LIBRARY_PATH 和 LIBRARY_PATH。
1 | PATH=/opt/scylladb/bin:$PATH |
以免出现以下错误。
1 | libstdc++.so.6: version `GLIBCXX_3.4.20' not found |
这是因为使用的 g++ 版本和最终链接的 libstdc++ 库不一致导致的。
CMake Error: install(EXPORT “tgt” …) includes target “tgt” which requires target “dep_internal” that is not in any export set
1 | add_library(tgt ...) |
报错
1 | CMake Error: install(EXPORT "tgt" ...) includes target "tgt" which requires target "dep_internal" that is not in any export set |
原因
dep_internal 是工程内依赖,且不想安装和 export。在安装和导出 tgt 时,由于依赖项目内定义的库 dep_internal,且是 PRIVATE link,又没有 export,因此出现冲突。
解决
使用 $<BUILD_INTERFACE:{target}>,仅在编译时引用 target。
1 | target_link_libraries(tgt PRIVATE $<BUILD_INTERFACE:dep_internal>) |
如果被其他库依赖。
1 | add_library(tgt ...) |
Some (but not all) targets in this export set were already defined.
1 | CMake Error at cmake-build-debug/vcpkg_installed/x64-linux/share/tcmalloc_minimal_static/tcmalloc_minimal_staticConfig.cmake:42 (message): |
一个项目内有多个目标 TargetA 、TargetB。两个目标共同依赖 InternalLibA。
1 | install(TARGETS TargetA InternalLibA EXPORT TargetA ...) |
如上述导入后,如果在其他项目引入。
1 | find_package(TargetA CONFIG REQUIRED) |
则会报如下的错。
1 | Some (but not all) targets in this export set were already defined. |
原因是在 find_package TargetB 时,出现重复的目标,Project::InternalLibA,在 find_package TargetA 时第一次定义。出现命名冲突。
解决办法,修改 install EXPORT 的 NAMESPACE,避免命名冲突。
1 | install(TARGETS TargetA InternalLibA EXPORT TargetA ...) |
使用。
1 | find_package(TargetA CONFIG REQUIRED) |
possibly undefined macro: AC_PROG_LIBTOOL
1 | configure.ac:94: error: possibly undefined macro: AC_PROG_LIBTOOL |
1 | 安装 libtool |
vs code 使用
快捷键
多行编辑
1 | 选取多行 |
其他
搜索框输入换行
Ctrl + Enter 输入换行
推荐系统 - 模型
推荐系统中的模型
双塔模型
双塔模型(Dual Tower Model)是一种在自然语言处理中用于生成式任务的模型架构。该模型的核心思想是将输入序列分别传递给两个独立的编码器,称为「内容塔」(Content Tower)和「控制塔」(Control Tower),以实现更好的生成效果。
具体来说,双塔模型包含以下几个关键组件:
- 内容塔(Content Tower):内容塔负责捕捉输入序列的语义信息和表示。它通常基于预训练的语言模型(如BERT、GPT等)或其他编码器来对输入进行编码,并输出一个表示输入内容的向量序列。
- 控制塔(Control Tower):控制塔负责生成输出序列,并指导生成过程。它可以从内容塔的输出中获取输入的语义信息,并根据任务要求生成合适的输出。控制塔可以采用不同的机制,如循环神经网络(RNN)、注意力机制(Attention)等,来实现生成过程。
- 连接层(Connector Layer):连接层用于将内容塔的输出和控制塔的输入进行连接,以建立二者之间的联系。可以通过简单的拼接、加权相加等方式实现连接。
- 解码器(Decoder):解码器是控制塔的核心组件,用于根据控制塔的输入和先前生成的内容来生成下一个输出。解码器可以基于不同的方法进行设计和训练,以满足特定任务的要求。
使用双塔模型的主要优势在于将表示学习和生成过程分离,充分利用内容塔和控制塔各自的优势。内容塔能够捕捉输入序列的语义信息,而控制塔能够利用这些信息进行更加准确和鲁棒的生成。通过有效地协同工作,双塔模型可以取得较好的生成结果。
需要指出的是,双塔模型的具体实现方式可能因任务需求和研究者的选择而有所差异。该模型的结构和组件可以根据具体情况进行调整和扩展,以适应不同的生成式任务。
适用阶段
- 召回
- 排序(通常是粗排)
Socket 编程
Basic

Code
epoll
methods
1 | epoll_create(...) // 创建 epoll |
steps
socket()bind()listen()- epoll
epoll_create()epoll_ctl(): Add server socket to epoll instanceepoll_wait()
accept()epoll_ctl(): Add client socket to epoll instanceread()write()
Reference
IO 模型
IO 模型分类
常见的 IO 模型分为以下五类。
- 同步阻塞 IO(BIO)
- 同步非阻塞 IO(NIO)
- IO 多路复用
- 信号驱动IO
- 异步非阻塞 IO(AIO)
客户端连接模式
从客户端角度,可以分为短连接、连接池、单连接,后两者属于长连接。对于单连接实现起来相对复杂,Server 端通常要实现 IO 多路复用,通常提供异步非阻塞 API,同一链接可以被多个线程使用。连接池的方式实现起来相对简单,通常提供阻塞式 API。
同步、异步、阻塞、非阻塞
参见 这里。
PORT 复用
以 seastar 框架为例。首先,监听端口,并设置端口复用。
服务端
监听
1 | // int port = 80; |
等待
调用框架 accept 方法,等待连接。
1 | keep_doing([this] { |
当有新链接创建时,返回 accept_result。
1 | /// The result of an server_socket::accept() call |
处理
1 | handle_connection(seastar::accept_result &&ar) { |
回写数据
1 | send(seastar::accept_result &ar, seastar::net::packet &&pack) { |
客户端
创建连接
1 | engine().net().connect(make_ipv4_address(ipv4_addr{server_addr})) |
发送数据
和 server 端回写数据一致。
1 | send(seastar::accept_result &ar, seastar::net::packet &&pack) { |
读取响应
1 | read(seastar::connected_socket &&fd) { |
QA
是否并发处理请求
是的,server 端监听端口,有连接创建时,保存连接,并按顺序读取 header 和 body,读取一个完整请求后,交由 background 线程处理。
如何保证 request 和 response 一一对应
server 端不保证按请求顺序返回相应,由客户端根据响应信息进行路由(比如 request_id 或自增的 request_number)。
BRPC - 自定义
自定义协议
对于绝大多数线上服务,服务间的 RPC 都是通过 TCP/IP 协议,brpc 同样是基于 TCP/IP 协议封装的 RPC 框架,支持自定义协议,来兼容多种服务端的调用。实现了部分常用的协议,也可以自定义适用于特定场景的协议。
这里是 BRPC 添加协议的官方文档。
工作效能 - OKR
OKR(Objectives and Key Results)目标与关键成果法,是一套明确和跟踪目标及其完成情况的管理工具和方法。
编写 OKR
Objective
- 描述目标时要具体且有方向性
- 制定目标时要有挑战性
1 | 要具体且有方向性 |
Key Result
- KR 要能支持目标实现
- 定量或定性地描述 KR
1 | 定量或定性 |