页面元素选择
python pickle 实践
k3s 安装加速
FFmpeg 使用总结 1. 提取音频 # 提取 mp3 音轨 ffmpeg -y -i input.mp4 -write_xing 0 output.mp3 2. 音频转码 # mp3 转 pcm ffmpeg -y -i input.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16k ouput.wav
Systemd 教程 1. systemd 管理 autossh 创建 autossh.service 文件, 配置服务: [Unit] Description=Auto SSH Tunnel After=network-online.target [Service] User=root Type=simple ExecStart=/usr/bin/autossh -p 22 -M 23 -NR 'localhost:23:localhost:22' root@remote.com ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=always [Install] WantedBy=multi-user.target WantedBy=graphical.target 执行命令, 运行 autossh : apt update && apt install autossh -y chmod 644 autossh.service cp autossh.service /lib/systemd/system/ systemctl enable systemd-networkd-wait-online systemctl enable autossh systemctl start autossh
mysql 1366 错误解决 问题描述 在配置某个服务时,使用到 mysql docker 服务。启动服务出现错误, 查看日志, 发现操作 mysql 时出现如下错误提示: Error 1366: Incorrect string value: '\xE8\x8A\x9D\xE9\xBA\xBB...' for column 'Code' at row 1 解决方案 检索后,得知,是 mysql 服务端与客户端 编码不匹配造成的。 客户端使用 utf8mb4 编码。 mysql 启动 docker 时,没指定服务端编码,通过在 mysql 启动命令中增加 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 重启 docker 后,问题解决。 mysql docker-compose.yml配置 如下: mysql-server: image: mysql:5.7 container_name: mysql-server hostname: mysql-server volumes: - db-mysql:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=data123 - MYSQL_DATABASE=data - MYSQL_USER=data - MYSQL_PASSWORD=data123 command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci'] networks: - data-network
docker-compose 笔记
sqlite 使用总结 SQLite官方文档 Appropriate Uses For SQLite 指出: SQLite does not compete with client/server databases. SQLite competes with fopen(). SQLite的竞争对手是fopen(相当于 python 中的 open)。 1. 存储文本数据集 存在一个大规模的文本数据集, 以 (index/int, hash/str, content/str)的形式存储,使用方式仅是通过搜索 index 或 hash, 获取文本信息。此外, 该数据集的读取,都在一个进程中执行。 在这种特殊的应用场景中, 如果将数据集存储到诸如 mysql, mongo 等数据库中, 会造成资源的浪费。这时候, sqlite 便可以派上用场。 import logging import os import sqlite3 from collections import namedtuple TextModel = namedtuple("TextModel", field_names=["index", "hash_id", "content"]) _cur_dir = os.path.dirname(__file__) class SqliteTextDao(object): def __init__(self, db_file: str, logger: logging.Logger = None): self.db_file = db_file self.logger = logger or logging.getLogger(self.__class__.__name__) def search(self, index_list: [int]) -> [(int, str, str)]: """ 搜索 """ conn = self._get_connect() try: args = list(set(index_list)) sql = "SELECT INDEX, HASHID, CONTENT from TEXTDB where ID IN ({})".format(",".join(["?" for _ in range(len(args))])) cursor = conn.cursor().execute(sql, args) return [(row[0], row[1], row[2]) for row in cursor] except Exception as e: self.logger.error(e) def insert(self, hash_id: str, content: str, index: int): """ 插入数据 """ conn = self._get_connect() try: sql = "INSERT INTO TEXTDB(INDEX, HASHID, CONTENT) VALUES (?, ?, ?)" conn.cursor().execute(sql, (index, hash_id, content)) conn.commit() except Exception as e: self.logger.error(e) return None finally: conn.close() def _get_connect(self): """ 创建模型 """ if not os.path.exists(self.db_file): conn = sqlite3.connect(self.db_file) c = conn.cursor() c.execute('''CREATE TABLE TEXTDB (INDEX INTEGER PRIMARY KEY, HASHID CHAR(32) NOT NULL, CONTENT TEXT);''') conn.commit() conn.close() return sqlite3.connect(self.db_file) def list_instance_by_index(self, index_list: [int]) -> [TextModel]: """ 根据 index 返回 数据模型 列表 :param index_list: :return: :rtype: list of TextModel """ index_list = [int(_index) for _index in list(set(index_list))] # numpy 来源的 index 可能类型不一样 instance_dict = {} for index, hash_id, content in self.search(index_list=index_list): instance_dict[int(index)] = TextModel(index=int(index), hash_id=hash_id, content=content) result_list = [] for index in index_list: result_list.append(instance_dict.get(index)) return result_list 2. sqlite sql 用例参考 2.1 list instance # uid in uid_list "SELECT UID from DB1 where UID IN ({})".format(",".join(["?" for _ in range(len(uid_list))])) # uid in uid_list && has_detail "SELECT UID from DB1 where UID IN ({}) AND DETAIL != '' ".format(",".join(["?" for _ in range(len(uid_list))])) # uid in uid_list && !has_detail "SELECT UID from DB1 where UID IN ({}) AND DETAIL = '' ".format(",".join(["?" for _ in range(len(uid_list))])) 2.2 insert only uid not exists # UID 是 CHAR(32) UNIQUE NOT NULL 'INSERT OR IGNORE INTO DB1 (ID, UID, VALUE) values (NULL, ?, ? ) '
百度网盘命令行工具 bypy 最近收集一些公开的数据集。遇到需要将大文件直接在服务器上传百度云盘的需求(主要是赌百度网盘已经有这个文件,直接利用文件指纹秒传)。 houtianze/bypy刚好能实现我的需求。 1. 安装 # 下载项目 git clone https://github.com/houtianze/bypy # 安装 cd bypy && python -m pip install . # 测试 bypy help 2. 百度网盘授权 首次授权 执行 bypy list 拷贝 输出中的授权链接, 在浏览器打开,进行百度网盘授权;接着 将百度网盘提供的授权码,复制到 当前命令行中。 使用其他机器的授权信息 假设机器A已经获取授权,机器B希望直接使用机器A的授权,可以这样做: 将机器A中的 ~/.bypy/目录下的所有文件,复制到机器B中的~/.bypy/下 在机器B中执行bypy list即可知道是否成功 3. 使用 上传文件:如果文件已经存在百度网盘中,即可实现秒传 bypy upload xxx.tar.gz 其他所有命令, 可以通过 bypy help 获取。
阿里云 PAI-EAS 试用报告 阿里云提供了PAI-EAS模型推理部署方案。官方介绍: 在线推理是将算法模型应用至实际业务的重要环节。为了帮助用户更好的实现一站式端到端的算法应用,PAI平台针对在线推理场景提供了PAI EAS(Elastic Algorithm Service)在线预测服务,支持基于异构硬件(CPU/GPU)的模型加载和数据请求的实时响应。您可以通过多种部署方式将您的模型发布成为在线的restful API接口,同时我们提供的弹性扩缩、蓝绿部署等特性可以支撑您以最低的资源成本获取高并发、稳定的在线算法模型服务。 作为模型部署的候选方案, 我写了一个简单的试用报告,并提供一个公网调用的示例, 方便其他人上手。 准备工作 开通 DataWorks 开通 PAI-EAS 开通 api 网关服务(如果要公网调用,必须开通此服务) 部署示例 实现目标: client(python) -> 公网(API-GateWay) -> PAI-EAS(tensorflow) 。 完整代码见aliyun-PAI-EAS。 步骤: Step1 训练模型并导出 SavedModel格式 git clone https://github.com/frkhit/aliyun-PAI-EAS cd aliyun-PAI-EAS # install env python -m pip install -r requirements.txt # train python train.py train # export demo_simple python train.py simple # export demo_complex python train.py complex Step2 PAI-EAS 部署模型 将 demo_simple.zip 及 demo_complex.zip 分别上传到 PAI-EAS, 并命名为 demo_simple, demo_complex。 模型运行情况如下: 在打开模型的 调用信息, 在公网调用地址中,绑定公网。 Step3 本地调用 PAE-EAS 推理服务 分别获取两个模型的公网访问地址及授权码, 复制到demo.py中。 远程调用 PAI-EAS: python call_pai_eas.py。