技术

MP4Box.js 获取视频旋转信息

技术

MP4Box.js 获取视频旋转信息

2024年05月22日 声明:本文部分内容使用 ChatGPT 生成 序言 公司的一个项目中用到 MP4Box.js 在上传视频前去解析视频的宽高,并且根据宽高的比例做一些拦截,只允许 16:9 横屏的素材。后来发现一个问题,部分竖屏的素材也被提交上来了。经过研究,发现这类视频可能是由手机拍摄的,带了旋转信息,因此 MP4Box.js 中的原始宽高有问题。 什么是 MP4Box.js MP4Box.js 是一个支持在浏览器中处理 MP4 文件的 JS 库,可以实现获取 MP4 文件的元数据信息、分割文件、提取媒体样本等高级处理能力。 通过 MP4Box.js 可以从 videoTrack 中的 width 和 height 中获取视频的宽高,对于一般的视频都是

TimedRotatingFileHandler 不会自动清除旧日志的问题

Python

TimedRotatingFileHandler 不会自动清除旧日志的问题

2023年04月23日 话不多说,直接贴代码: file_handler = TimedRotatingFileHandler( "logs/log", when="midnight", backupCount=365, encoding="utf-8", ) file_handler.suffix = "%Y%m%d.log" file_handler.setFormatter(log_formatter) 这是我几年前写的一段写日志文件的代码,前几天发现并没有按照预期只保留 365 个日志文件。研究了一下,发现了问题所在。TimedRotatingFileHandler 中对于 midnight 的操作是这样的: elif self.when == 'D'

GitLab CI 配置自动化打包上传 Python 库

技术

GitLab CI 配置自动化打包上传 Python 库

2023年04月23日 自己之前有些 python 脚本类的项目,会用到一些通用的能力,如读取配置、打日志等,每次都 copy 一份 utils 目录有些不够优雅,于是撸了一个公共库,方便自己使用。 为了能配合 GitLab CI,setup.py 需要做一些小调整,版本号不需要手动输入了,直接读取 $CI_COMMIT_TAG,代码如下: import os import setuptools with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="yuanfen&

使用 GitLab CI 自动部署 Ghost 主题

CI

使用 GitLab CI 自动部署 Ghost 主题

> 2022年05月24日,居家隔离的第 N 天 今天收到了 Ghost 5.0 发布的邮件,第一时间更新了下,发现主题里有些功能已经不兼容了,于是准备对主题做下更新。在看 Ghost Integrations 的时候发现有个 GitHub 的插件特别好用,支持通过 GitHub Actions 自动部署你的主题。但是我自己的项目用的都是 GitLab,找了一圈,没有官方的插件。于是尝试自己通过 GitLab CI 来实现。 大致看了下基于 GitHub Actions 自动部署的实现方式,通过官方提供的一个 TryGhost/action-deploy-theme 的步骤,代码很简单,总共 40 行,我们来看下它做了什么: const path = require('path'

群晖 Let's Encrypt 配置多个泛域名 SSL 证书自动更新

群晖

群晖 Let's Encrypt 配置多个泛域名 SSL 证书自动更新

> 2021年01月08日 之前一直用的 syno-acme [https://github.com/andyzhshg/syno-acme] 配合群晖的计划任务实现泛域名 SSL 证书的更新,但是最近想切换域名,但是又要保持原有域名一段时间可用。syno-acme 的方案只支持默认证书的配置,群晖上多个证书的配置确实比较麻烦,几年前也折腾过。 不过调研了下发现,Let's Encrypt 支持将多个域名绑定到同一个证书里,于是找了下解决方案,果然有位兄弟基于 syno-acme 做了些修改 [https://10001blog.xslinc.com/?p=89],支持多个域名。不过这位兄弟是 Hard Code 的,不够通用化,于是对 syno-acme 做了些改进,并提交了 Pull request [https://github.com/andyzhshg/

fastboot FAILED (remote: Operation not permitted) 的问题

Android

fastboot FAILED (remote: Operation not permitted) 的问题

这两天买了台安卓测试设备,由于我们的项目需要系统签名,所以不得不重新刷系统。 在 fastboot flash system 的时候,每次都在最后要完成的时候报一个错误: target reported max download size of 536870912 bytes Sending sparse 'system' 1/4 (524284 KB)... OKAY [ 15.543s] Writing 'system' 1/4... OKAY [ 3.548s] Sending sparse 'system' 2/4 (524284 KB)... OKAY [ 15.483s]

基于 GitLab CI 和阿里云 k8s 的持续交付解决方案

DevOps

基于 GitLab CI 和阿里云 k8s 的持续交付解决方案

> 2020年12月27日 今年对于我个人而言,在 DevOps 上的最大收获,莫过于摸索了这套基于 GitLab CI 和 k8s 的持续交付解决方案,其实原理都很简单,在我去年的方案里又做了改进,实现了基于 git tag 的触发方式,并且把原先的本地打包推镜像改为在 GitLab Runner 上打包推镜像。 这套解决方案大致流程是这样的: 1. 推送代码,在代码中配置 gitlab-ci.yml 2. 推送 tag,触发 GitLab Runner 编译 docker 镜像,并推送至阿里云镜像仓库 3. 在阿里云 k8s 上基于镜像仓库创建应用,并创建重新部署的触发器,在镜像更新时触发该触发器 这样,以后每次推送新的 tag 上去,就可以实现自动打包&

安卓 WebView 图片离线缓存方案

技术

安卓 WebView 图片离线缓存方案

有这样一个项目,UI 渲染全部由 WebView 来完成,套个安卓的壳,壳子里面做一些和硬件交互的功能,例如摄像头、麦克风等。WebView 加载的页面走的本地打包的文件。不过 WebView 中的图片等资源走的是网络访问。 为了减少网络访问的流量,以及提升在弱网络或无网络情况下的体验,需要对网络访问的图片进行本地缓存。 原先采用的是 WebView 自带的缓存机制来实现,但并不可靠,于是需要通过拦截网络请求,通过本地缓存干预的方式来实现。具体原理如下: 1. 通过 shouldInterceptRequest 拦截请求,判断是否是访问网络图片,如果是则进行干预 2. 取请求地址的 md5 值加图片文件扩展名组成的文件名,拼接 cache 目录获得一个本地资源地址,判断该资源是否存在,若存在则直接返回该资源 3. 若该资源不存在,说明是首次访问,则将该网络图片下载到该地址下,并返回该资源 具体代码如下: import android.content.Context import

如何成为一名全栈开发工程师

技术

如何成为一名全栈开发工程师

什么是全栈开发工程师 “全栈”这个概念最早来源于 Facebook 工程师 Carlos Bueno 在 2010 年底写的一篇文章:The Full Stack [http://carlos.bueno.org/2010/11/full-stack.html]。 作者认为全栈是一个通才,能够自己创建不平凡的应用程序。 他也指出,没人能够熟悉所有方方面面,但作为一个全栈,能够看清每个栈的上下之间是如何运作的。 我们再看看百度百科的定义:全栈工程师是指掌握多种技能,胜任前端与后端,能利用多种技能独立完成产品的人。 百度百科的定义稍微有些狭义,全栈的技能远远不止前端与后端,但在大多数情况下,熟练掌握前后端就可以成为一名别人眼中的全栈。 在我的理解中,全栈开发工程师除了传统大家理解的前端、后端、移动端之外,还必须具备设计与运维的技能。若不具备这两项技能,还是没办法独立完成一个产品的,在设计与运维阶段,还是得依赖于其他人,或者说无法更独立、更高效地完成一个产品。 全栈开发工程师存在的意义 我们了解了什么是全栈开发工程师,那么,为什么会存在全栈开发工程师呢?

k8s 上利用 cert-manager 自动签发 TLS 证书

阿里云

k8s 上利用 cert-manager 自动签发 TLS 证书

> 2020年02月27日,天气晴 很多博主的 https 证书经常容易忘记更新,虽说证书过期前都会有邮件提醒,但是万一确实忙得没时间去处理,忘记了,就会出现证书过期的情况了。 之前在服务器上自己搭博客服务的时候,用 Let's Encrypt 来自动创建并续签证书,确实省了不少事。 在我的博客部署到 k8s 之后,就一直用的一年一签的免费证书,每年更新一次,也不算特别麻烦,但是总归不够高端,我又怀念起了 Let's Encrypt。 Let's Encrypt 是个好东西,k8s 也是个好东西,两个好东西怎么结合呢?搜寻了一番确实有方案,经过几天的尝试,终于弄好了。花了几天是因为第一天因为有个粗心导致的问题,导致搞了好久没成功,休息了几天再次尝试,才找到问题。 有关 k8s 的基础知识,这里不做赘述,网上教程很多,

批量修改阿里云 OSS 的 ACL 权限

技术

批量修改阿里云 OSS 的 ACL 权限

> 2020年02月15日 oss-browser 是个好工具,但是在修改 ACL 权限上比较蛋疼,只能单个文件设置,不支持批量设置,这在某些默认 ACL 权限为私有的 bucket 上,需要批量设置某个目录为公共读时,会比较不便。 经过搜索,阿里云官方的 ossutil 工具可以用来解决这个问题。 下载(以 Mac 系统为例) curl -o ossutilmac64 http://gosspublic.alicdn.com/ossutil/1.6.10/ossutilmac64 chmod 755 ossutilmac64 ./ossutilmac64 config # 按照提示填写相关配置,参考https://help.aliyun.com/document_detail/120075.html

Docker 同一域名下多个 Registry 保存凭证的方式

技术

Docker 同一域名下多个 Registry 保存凭证的方式

> 2019年12月01日,天气小雨 阿里云的容器镜像服务是个好东西,配合在阿里云上容器服务,速度非常快。 但是阿里云的容器服务不支持自定义域名,都是在同一个域名下,通过不同的 namespace 来实现的。当需要管理多个账户下的不同 namespace 的时候,Docker 默认的认证存储方式就不太适用了。默认的 ~/.docker/config.json 中的 auths 是根据域名来区分的,会出现登录了这个 namespace 之后,另一个 namespace 认证会失效的情况。经过一番搜索,发现可以通过 docker --config 来实现。 通过如下方式来创建一个名为 config-a 的配置 docker --config ~/.docker/config-a login --username=config-a-username registry.cn-hangzhou.aliyuncs.com 之后 push