最新

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 中获取视频的宽高,对于一般的视频都是

群晖 DSM7.2 Web Station 网页服务重复无法删除的问题

群晖 DSM7.2 Web Station 网页服务重复无法删除的问题

今天遇到一个问题,记录一下,解决方案参考:https://community.synology.com/enu/forum/1/post/161835?reply=502868 问题截图如下(当时忘记截图了,该截图摘自上述文档): 解决方法: 1. ssh 登录群晖 2. 执行 sudo synopkg stop WebStation,停止 Web Station 服务 3. 删除 /usr/syno/etc/packages/WebStation/Service.json 中需要删除的服务(注意记录一下 service_id,下一步需要用到) 4. 删除 /usr/syno/etc/

三件小事

三件小事

2023-09-09 于家中 讲一下最近发生的三件小事。 第一件事情是昨晚回到家准备打游戏时,耳机戴到头上感觉很松,拿下来发现,我一千多的雷蛇新款梭鱼THX空间音效双模无线耳机一侧的旋转轴断掉了。淘宝找了半天零件,只有梭鱼 X 的,没有我这款的零件可以买下来更换。联系客服想问问怎么修,让我走公众号自助报障,填了一堆信息,拍了很多照片,最后申请结果认定是人为损坏,不予受理。 想了想,可能是时候告别游戏了。毕竟已经是 30 多岁的人了。而且这几年在游戏上所能获得的快乐也越来越少了。自己越来越菜,一起玩的朋友也越来越少。一直想做一些能够提升自己快乐的事情,而游戏已经是一个对我来讲 ROI 比较低的事情了,需要花很多精力,经常玩到凌晨两三点,透支健康;还会被老婆说;而且从中所获得的快乐和成就感也在日益降低。一直以为我可以一直玩游戏玩下去,但总有那么几个时刻,脑海中会闪现出这样的念头,是时候“告别”游戏了。当然,我所指的告别,也不是说一点都不玩,而是说不再像以前一样,每天投入几个小时去玩。 第二件事,是今天中午,也就是刚才去星巴克点了杯美式,啡快的口令是:

关于成长的思考

关于成长的思考

2023年07月28日 最近参加了公司的一个管理培训计划,上了很多次课,也做了很多课堂及课后作业,也参加了导师对于最后演讲答辩的指导,以及最后的导师点评和分享环节。 给我最大的收获,并不是课堂上学到的一些理论知识,也不是关于管理培训课程本身所带来的目标、团队、文化等主题能力的提升。当然,这些知识本身都会有一定的吸收,于我而言,这些内容并不是什么新鲜的内容,从工作至今,也参加过大大小小很多次类似的培训了。参加这次培训,给我最大的收获是,我重新认识到了阅读的意义。 近些年来,于我自己而言,随着娱乐生活的丰富,很少再去花精力阅读。日常的阅读基本停留于知乎热榜里的内容、工作所需的专业知识、长/短视频里零碎的信息等。我这些阅读更多的是技能和信息的获取,很少真正去「阅读」,去获得更加沉淀的精华内容。变得更加功利化,只获取表面的、需要的信息。而其余的时间更多用来娱乐了。 但我越来越发现,那些我生活中遇到的我所「崇拜」的管理者,几乎每一个的阅读量都非常大。在听他们讲话的时候,每每都能感受到他们阅历的丰富,常常都能够旁征博引,举出很多历史上的例子,或者一些名人的话。先不论这些阅读

上海居转户落户完整经历

上海居转户落户完整经历

上海居转户落户完整经历 2023年05月08日 万里长征,终于到了最后一步,是时候把历时3年多的上海落户的经历记录下来了,帮助后人。 有史可证最早开始准备落户这件事情,是在2020年7月7日,当时所在 HX 公司的一个同事居转户成功了,找他打听了解了一下,才发现上海落户这件事情并不是那么遥不可及。5年3倍这个渠道,对于我们计算机行业的人来说,还是很容易实现的。 由于早些年加入创业公司以及后来自己创业时,都是按很低的标准交的社保,实际达到3倍社保标准是从2019年4月开始。5年3倍渠道要求近4年累计有36个月达到3倍社保基数,也就是到2022年3月之后,才能满足落户要求。小孩2023年报小学,所以当时定的计划是2023年完成上海落户,考虑到2022年3月就可以满足要求,留了这么多 buffer,应该可以赶得上。 理想是美好的,现实是残酷的,中间发生了不少插曲,回过头来看,最终只差几天,刚好错过小学入学信息登记的时间点。 当时为了达成2023年上海落户的目标,我设计了3个计划: * Plan A,正常居转户 * Plan B,自己之前创业的公司还一直

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

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 主题

使用 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'

回顾2021 展望2022

回顾2021 展望2022

> 2022年01月07日~2022年01月19日 又到一年回顾时,慵懒的周五下午,从柜子中翻出已经落灰的 QC35-II,打开 QQ 音乐,听着「重温50首不朽的经典英文老歌」,换了下桌面背景以便清晰显示 QQ 音乐的歌词,打开 Typora,完成各项准备工作。 回顾 2021 年,大致有这些大事: * 换了工作,从红星来到喜马,回到互联网公司,进入 WLB 的生活 * 提前还完了房贷的商业贷款部分,公积金贷款部分每月公积金还完之后还有盈余 * 上线了「星际战区」,作为自己的独立项目 * 虚拟货币回了一些本,并彻底退出了 * 猿奋的 20 万高新补贴到账 2021 年初定下的目标完成情况: * [x] 一年不安装抖音、知乎 APP * [ ] 发表 12 篇博客 * [x] 小工具集扩充 5

群晖 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) 的问题

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]

2021 年伊始

日志

2021 年伊始

> 2021年01月03日 多事之秋的 2020 年终于结束了,这一年最大的关键词可能就是“新冠疫情”了,全民抗疫果真成为了常态,戴口罩也成了大家出门的一种习惯。 回顾一下年初的目标: * [ ] 去 15 个不同的城市 * [ ] 去健身房 100 次 * [ ] 减脂至 70kg 以下 * [x] 完成 10 篇文章 / Vlog * [x] 收入 > 支出 * [ ] 平均睡眠时间 7 小时 年初定下的目标,只完成了两项,其他的都没能完成,倒是年初疫情在家办公的时候,有大把的时间,把前年的目标「荒野大镖客」通关了。去年完成的这两项,疫情也有功劳,没完成的目标或多或少也可以甩锅给疫情。不管怎么样,今年的疫情,给了我们很多的借口,工作中我也看到很多人拿疫情当借口:“今年因为疫情的影响,业绩没能达到目标”;“因为疫情的影响,

基于 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

白香词谱

诗词

白香词谱

白香词谱 (清)舒梦兰 > 《白香词谱》是清朝嘉庆年间靖安人舒梦兰编选。词谱选录了由唐朝到清朝的词作品共一百篇,凡一百调。这些调式都是较为通用的,小令、中调、长调均有。为便于初学者,每调还详细列注平仄韵读,成为真正的词谱。 《白香词谱》同时又是一本简明词选。所选的词都是比较著名的或者艺术性较高的,好些是历久传诵不衰的名作。它兼收并蓄,不主一家,既收婉约,也收豪放,是一本不可多得的好选本,也是一本较佳的词学入门读物。 整理于 2008年8月 【○平声;●仄声;⊙可平可仄;△平韵;▲仄韵】 一、菩萨蛮·闺情 李白 平林漠漠烟如织,寒山一带伤心碧。暝色入高楼,有人楼上愁。 ⊙○⊙●○○▲,⊙○⊙●○○▲。⊙●⊙○△,⊙○○●△。 玉阶空伫立,宿鸟归飞急。何处是归程,长亭更短亭。 ⊙○○●▲,⊙●⊙○▲。⊙●●○△,⊙○⊙●△。 二、忆秦娥·思秋 李白 箫声咽,秦娥梦断秦楼月。

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

技术

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

什么是全栈开发工程师 “全栈”这个概念最早来源于 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 的基础知识,这里不做赘述,网上教程很多,

有生之年系列之『荒野大镖客』

游戏

有生之年系列之『荒野大镖客』

> 2020年02月16日 去年我玩这个游戏的时候,还是看到人想干就干,看到能搜刮的财物就搜刮。但是玩到后面,到了第六章的时候,突然想让亚瑟做个好人,能不干人就不干人,欠债的也都免除了,帮别人做事,别人给你的传家宝也拒绝了。 大镖客这部游戏,刚出来的时候,媒体评价非常高,几乎所有游戏测评机构都给的满分的评价,我当时买 PS4 也是为了玩大镖客才买的。买回来之后玩了一段时间后,公司项目一直很忙,没有大把的时间沉浸其中去玩,偶尔陆陆续续上去骑骑马、打打猎、钓钓鱼,主线基本没有动力再推进下去。再后来大约有一年的时间,连 PS4 都懒得打开了,几乎弃坑。 直到这次的肺炎疫情,让我有大把的时间在家,一口气玩了几天,白天儿子会干扰我,只能等他睡着了玩,在他睡午觉的时候玩一会儿,晚上睡着后熬夜玩,大概每天到三四点。终于完成了 2019 年未能完成的目标:通关「荒野大镖客」。 在第六章的末尾,和艾比盖尔辞别之后,That's The

批量修改阿里云 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

2019 年总结暨 2020 年展望

小结

2019 年总结暨 2020 年展望

> 2019年12月31日 凌晨 2 点 不知不觉,又独自在电脑前工作到深夜。 肚子早已咕噜噜在叫,容我先去搞点吃的。 没有什么管饱的东西,冰箱里找了两杯味全的酸奶。 终于忙完了手头的工作,把之前自己的一些外包项目全部迁移到 K8S 上了,阿里云即将停止对 Swarm 的支持,最后一刻完成了迁移。 又到年底,是时候写点小结了,虽然这会儿的时间点有些晚,但也只有这个时候,夜深人静,才得空。 回顾去年底定下的 19 年目标,完成了大半: * [x] 出国旅游一次 * [ ] 锻炼减肥,目标减到 70kg 以下 * [ ] 荒野大镖客通关 * [x] 平均睡眠时间达到 6 小时 * [x] 完成 10 篇可发布的文章 出国旅游的目标,19 年超额完成了,去了趟泰国,去了趟韩国,花了不少钱。

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