使用 ffmpeg 批量转换 xcode 全尺寸 App icon

#!/bin/bash input_image="1.png" sizes=(16 32 64 128 256 512 1024) for size in "${sizes[@]}"; do output_image="${size}.png" ffmpeg -i "$input_image" -vf scale=${size}:${size} -c:v png -pix_fmt rgba "$output_image" done

2024-07-10 · 1 分钟 · 26 字

could not import "xx": open : no such file or directory

Issue 今天在运行 golangci-lint run 时报了标题的错误,完整的错误信息如下: ERRO [linters context] typechecking error: # github.com/xx/xx/internal/domains/protection_product [github.com/xx/xx/internal/domains/protection_product.test] internal/domains/protection_product/product.go:4:2: could not import "context": open : no such file or directory Diagnosis 很明显问题并不出在 context,这是一个系统库,不可能不存在。 找了一圈 google,百度,ChatGPT 都没找到答案。 最后搜索到这个 link 类似的问题,为了快速验证,我把该包下的 test 文件注释掉,果然能够通过 lint 了。 然后经过排查,果然 test 文件存在一个较深的循环依赖调用。要解决这个循环依赖比较麻烦,所以在 test 文件的原始包名后面加上 _test 后缀,解决了问题。 By the way 上面那个报错其实是 go list 报的,golang-ci 会调用 go list。如果需要快速验证是否还存在上述报错,可以直接这么调用: go list -e -json -compiled=false -test=true -export=true -deps=false -find=false ./... >/dev/null

2023-02-15 · 1 分钟 · 66 字

自动化批量修改 Github 的 repo

好久没有写博客了,今年才写了 2 篇,但并不是说我在创作方面懒惰了,反而今年写了一个还算不错的开源项目(后面会写一系列文章记录我在做这个开源项目遇到的技术问题和一些人文)。可能空闲时间的精力倾斜到开源项目,导致博客投入不多吧。Anyway,本文也是我先发在公司 notion 的,先抄自己一篇,不那么费神。 背景 One day,公司要求所有的 repo 都要在 Jenkins 打开 sonar 的配置,这需要我们给 repo 的 Jenkins 文件添加多一个配置,然后提 PR。天呐,我们 team 有 7-80 个 repo ,简直是噩梦。所以,我们需要自动化。automizely! Flow 先来看看我司的 git flow,就是标准的 github flow。下图所示的 1 - 4 步骤的自动化都比较好实现,不涉及到复杂的逻辑。比较复杂的在于 clone 到本地后,需要自己写代码来批量修改每个 repo 的文件。对于后者,每次的逻辑都不太一样,自行实现即可。 步骤 1. 准备 repo list 文件 我们将需要处理的 repo 放到一个文件里,例如 all-repo.txt ,每行是一个 repo 名。 repo-name1 repo-name2 repo-name3 2. 将 all-repo.txt 复制一份为 all-repo-cur.txt , 等会我们的脚本就用这份 cur ,目的是等会处理过程中可能会因为中间有个 repo 意外失败,需要重新跑,我们就可以把已经成功的 repo 从 cur 文件中移除。注意 cur 文件最后一行必须是空行,避免 shell 命令读取不到最后一行的 repo ...

2022-09-04 · 3 分钟 · 488 字

免费申请 JetBrains 全家桶 License

JetBrains 允许用户通过多种途径免费申请 license,例如用于学术研究、参与开源项目等。本文介绍的是参与开源项目这种途径。 谁可以申请 拥有一个开源项目,或者是该项目的核心贡献者 在过去三个月内,你有定期贡献代码 该开源项目不能有付费版本 该开源项目尚未接收商业公司或组织的资助 鉴于申请资格随着时间发展可能会发生变化,可以参考 官网说明 据网上各网友的情况来看,JetBrains 不关心你的 repo 有多少 stars,用的什么语言。所以只要满足它的要求,都可以通过。 但希望不要滥用,因为 JetBrains 的初衷是支持开源项目,我们 respect 它。 License 说明 有效期:1年。到期可以再次申请 仅能用于开发非商业开源项目 不能和他人共享该 License 申请流程 申请网址:https://www.jetbrains.com/shop/eform/opensource 接下来是填各种信息。因为要求是最近三个月有在积极贡献代码,所以我选择了一个 GitHub 插件项目。原本还担心这个 repo 比较简单,会不会无法通过,但后面证明是我多虑了。 填完之后点击提交即可 通过申请 大概3个工作日后,我收到了来自 JetBrains 的 邮件。 附件是 License 的订单凭证。Email 中提到如果我愿意的话,希望我可以将 JetBrains 作为项目支持者展示在 repo 主页。Sure, I would. 激活 License 点击邮件的 Take me to my license 链接,然后会看到有一个待激活的 License 躺在列表里,选择 assign 给指定人,我填了自己的邮箱。勾选了将 offline code 作为邮件内容的一部分发到我邮箱。 然后,我收到了邮件,附件是两份离线 license code (分别使用在 2018.1 前后的产品) ...

2022-01-22 · 1 分钟 · 79 字

用 ripgrep 替换 grep

grep 在 *nix 系统都有预装,也是程序员日常工作经常用到的工具。我最近的工作,涉及到很多大文本处理,grep 处理得不是很快。于是就用到了 ripgrep,这个工具跑起来快很多。本文主要摘录自己平时可能会用到的用法 安装 在 GitHub Repo 的指引下找到你对应的系统命令安装即可,一行命令。 安装完之后,ripgrep 的可执行命令是 rg 常用参数 一般搜索 rg str sample.txt 默认,标准输出会高亮你的搜索词,并且每行前面会有行号。不过请放心,重定向到另一个文本时,是不包含行号的。 如果你不想要输出行号,使用 -N rg str sample.txt -N 统计行数 rg str sample.txt -c # 相当于 grep str sample.txt | wc -l And 条件 A ha, 现在还不支持,老早就有很多用户提这个需求了。看看固执的作者什么时候允许加上。可以关注这个 Issue。 只能管道后再次筛选了, --color always 是为了第一个搜索词也能被高亮 rg str sample.txt --color always | rg str2 Or 条件 使用多个 -e 参数 作为条件。只要匹配到任何一个搜索词,都会被匹配到 rg -e 'str1' -e 'str2' -e 'str3' sample.txt 匹配到N条结果就停止 很多情况下,我们知道只有 N 条匹配项,为了节约时间,希望匹配到足够数量就不要往下搜索了。 ...

2022-01-22 · 1 分钟 · 138 字

实用 shell

文本处理 清除每行头&尾部的空白符 awk '{$1=$1;print}' ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file 在一个文本随机选取若干行 // macos 则先 brew install coreutils,然后用 gshuf shuf foo.txt | head -n 100 cat foo.txt | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- | head -n 100 ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file 截取每行的前几个字符 cut -c 1-3 file // 前三个字符 ref: https://stackoverflow.com/questions/19869511/how-to-restrict-length-of-string-present-in-a-line-using-linux

2021-12-20 · 1 分钟 · 48 字

用 CDN 加速 WordPress

写在前面 如果你觉得这篇文章对你有所帮助,并且想要使用又拍云,可以通过我这个 -> 链接 <- 注册,你我都能得到 不要白不要的 奖励。(注意,又拍云绑定的域名需要是备案过的) 如果你已经有 CDN ,可以跳过 又拍云 部分,直接看插件配置部分。 本篇文章对所有 CDN 都适用,这里以 又拍云 为例子作说明 又拍云更香? 上周在 V 站 发了个帖,安利了我写的一个 Alfred 插件,该插件可以方便地将图片上传到七牛云,顺便向大家安利了七牛。马上有 V 友跳出来说又拍云更香,免费流量比七牛云多 5 G,HTTPs CDN 流量也是算在免费套餐里边的。 趁着周末有点时间,去白嫖下又拍云。 又拍云联盟 没错。小标题 是 又拍云对开发者的白嫖活动的名字。我们加入这个联盟就能获得: 10 GB 免费存储 每个月 15 GB 免费 CDN 流量(HTTP[s] 都可以) 流程很简单。注册账号、在你的网站页脚添加又拍云的链接;填申请表。我是周六申请的,1个小时左右就收到了审核通过的通知。 Update(2022/12/02): 大家要留意一年的到期时间,快到期的时候去 联盟页面 申请续期。否则欠费就不好了,我就迟了几天,欠费 2 分钱 :) 审核通过后,会发放一年份的代金券给你,到期再次申请即可。 CDN 配置 系统设计 不想看我啰嗦的同学,可以跳过系统设计这部分。配置部分以 又拍云 为例子叙述 从上图的设计可以看出,我把文件分为三类: 动态接口/文件:例如 WordPress 中的 php 接口。这类请求是动态的,不适合放到 CDN 缓存中(一直回源,没有意义)。域名使用 foamzou.com ,该域名解析到我的服务器里,执行 WordPress 程序 适合短期缓存的文件:指的是短时间不会发生变化,但仍然有可能变化的文件。例如 WordPress 的系统库文件 域名使用:cdn.foamzou.com,该域名做个 cname 解析到 CDN 服务 当 CDN 未命中资源,则回源到 cdn.foamzou.com ( IP: 回源设置的 IP ) 适合长期缓存的文件:指的是几乎不会发生变化的资源文件。例如图片、第三方 css、js资源 域名配置同 2 给 CDN 配置一个对象存储桶 配置指定的路径从桶里取资源,没取到再回源到服务器 从服务器取到数据,存储到桶里 好处有 2 点 减少回源次数(毕竟对于同一个文件只会回源 1 次),节省服务器带宽 回源速度快(我在又拍云创建了个对象存储桶,CDN 和 存储 在同一个区域,速度当然比跨个公网访问我服务器快) 创建 CDN 服务 到 创建页面 : ...

2021-11-21 · 2 分钟 · 299 字

优化 WordPress emoji (s.w.org) 速度

怎么可以这么慢 今天给我的博客加了 CDN ,绝大部分文件都很快被加载。唯独有一片 emoji 文件列表响应在 400+ ms,怎么能忍。 官方的 emoji built-in 方案成了负担 貌似从 4.2 版本开始,WordPress 官方提供 emoji 的自支持方案。详细可查看 《WordPress 4.2 Emoji Performance》,这篇文章分析了官方方案的原理和弊端。 WordPress 的 js 脚本会把 html 中的 emoji code 替换成 WordPress 站点的 emoji 图片。目的应该是为了让那些尚不支持 emoji 的网站能够正常展示 emoji。 就我看来,这更多是自作多情了,毕竟现代浏览器还有多少是不支持 emoji 的?另外,这个方案是一刀切的,不管当前浏览器是否支持 emoji 都自动 fallback 到它的 build-in 方案。 这给浏览器带来了额外的网络请求,增大了网页的加载速率。在一些无法很好访问 s.w.org 站点的地区,更是直接被暴击。 不清楚 WordPress 后面的版本是否有做优化,anyway,让我们来干掉它吧。 解决方案 方案一:直接禁用(推荐) 本博客采用了这个方案,因为我不需要照顾 不支持 emoji 的浏览器用户。 下载这个插件(disable-emojis), 上传到 /wp-content/plugins/ 目录下,解压。到你的 plugin 管理后台,启用它即可。 世界瞬间清爽了,浏览器直接渲染 emoji ,再也不需要另外去请求网络获取图片文件。 方案二:替换为本地文件 如果你的站点希望照顾到 不支持 emoji 的浏览器。 ...

2021-11-20 · 1 分钟 · 76 字

用七牛云作图床并配置 SSL

背景 一年前我写过《使用 CloudFlare/百度云加速做免费SSL》,里面提到了:因为 Chrome 的最新安全限制, https 站点无法正常加载 http 的图片和其他静态资源,这使得我不得不给我的图床加上 SSL。 前几天发现我的博客里的图片无法被正常加载,观察控制台后发现 图床的 SSL 证书出问题了。到百度云加速控制台看,才发现上次申请的一年 SSL 证书已经到期了,并且需要付费才能继续申请证书。好吧,白嫖的快乐没有了。 那就不用百度云加速了,SSL CDN 也用七牛云的吧。 七牛云 前提:你需要有一个已备案的域名,否则只能使用七牛的临时测试域名,是有有效期的 免费套餐 从 2016 年白嫖七牛云存储至今,本文就当做给七牛打回广告吧。 先说结论: 如果你只用 http 访问文件,每个月不超过 10G 流量的话,那么用七牛云相当于白嫖,一分钱都不用花 如果需要使用 https 则需要花费一些费用(0.28 元/GB),一般博客小站,每个月最多不超过 1 块钱吧。等过段时间,我有了一定数据再回来更新这个数值。 对于个人用户来说,有 10G 的免费存储,每个月 10G 的流量已经非常足够了。具体的资费可以参看 官网价格 。PS. 从价格表会看到 外网流出流量 会被收费,这点不用担心,我专门查了下官方说明: 如果使用了七牛测试域名或者融合 CDN 域名访问资源,是不会计算外网流出流量的 也就是说,你绑定一个域名回源到七牛云的对象存储,每个月不超过 10G 则不收费。 创建一个 bucket 在七牛云对象存储 管理后台,创建一个bucket: 存储区域选国内的都行;访问控制设置为公开,毕竟我们要将其用作图床 绑定域名 创建成功后,会提示你绑定一个域名。该域名将作为 CDN 域名,通过该域名访问你的文件时,会尝试在 CDN 节点找缓存;缓存未命中再回源到你上边创建的 bucket。 我们添加一个域名,该域名必须是经过备案的。 通信协议:如果你不需要 HTTPS,那么选择 HTTP 就足够了 ...

2021-11-14 · 1 分钟 · 152 字

我为什么写日记

引子 前几天 v 站有个帖子《V 友们有没有写日记的习惯?》,大家有在上边回帖,我也有表达一些自己的观点。 回帖的大概有以下几类同学: Just 发个梗,“正经人谁写日记啊” 没有坚持下去的,“日记写着写着,变成了周记,,慢慢变成了月记,然后就是年记,,最后成了回忆” 认为没有必要的,“主要是大多人的生活全都两点一线,没有必要记录” 也有在坚持写的,“重要事情会写 三四年写满了好多的笔记本 有时候回头看看 真不错” 我&日记 我为什么写日记 先点一下题,我之所以写日记,是想要用文字记录我的生活以及当时的所思所想。这样,我可以在很多年以后,翻过来看看当时的我在做些什么,想些什么。实在是很有趣的。就像我翻以前 qq 空间的说说一样,虽然觉得有些很 SB,但同时也觉得挺可爱的。但我也有看过有人因为过去过于幼稚,想把过去的说说删掉。这类同学可能就不太适合写日记吧。 我属于坚持在写日记的那部分群体,从2013年12月13日开始到现在,写了快 8 年了。从有道云笔记到为知笔记,从大二到六年社会人。 偶尔流水账碎碎念,偶尔思考未来感叹人生;有时洋洋洒洒 1 千字,有时寥寥几个字: 今天好忙。 我写日记纯粹是为了记录自己的生活与当时的所思所想。 若我喜欢,我可以翻到过去的某一天,看看我又做了什么得意的,有趣的,无聊的,愚蠢的事。 也可以回忆起,大学去哪几个省参加比赛,顺道看了熊猫当做旅游;和朋友们去 hk 爬山,带车厘子被海关抓包;跟风玩起了费鞋的一起来捉妖;有个同事中了彩票一等奖,大家纷纷买起了彩票;娱乐圈谁谁谁又出事了,感叹贵圈真乱。 若干年后,我已经忘记的事情还有地方能够记起,真好。 PS. 有同学对于日记的第一印象是秘密日记,其实大部分不是在写秘密啦,哪有那么多秘密写,我们又不是朱朝阳。 缘起 今天开始使用有道云笔记来记录我的日记。记得以前从来没有写过自己内心的日记。除了以前老师布置的作业——官方日记。好的,从今天开始,想起来就会来这里写写。没有什么排版风格。只要不写错字就OK,标点符号什么的,随意啦~~~狂写~~走起!!!! 上边是我2013年12月13日写的第一篇日记的开头。具体的缘由已经不记得了,我当时竟然没有记录下来。隐约记得当时是在知乎上看到某个关于日记的回答,大致是说,想写什么就写什么,不需要有任何拘束。嗯,然后我就尝试着坚持写了。 如何把日记进行下去 管它什么内容,先写再说 兄弟们,`不要有任何拘束 这个很重要,是坚持写日记的重要观念。这意味着无论是内容,还是形式上都可以随心所欲。 举个🌰,你觉得今天啥事也没做,上班下班累死了,写日记也不知道写啥,玩会手机就准备睡觉吧。此时,其实你可以在今天的日记里写,“今天啥事也没做,上班下班累死了,写日记也不知道写啥,玩会手机就准备睡觉吧”。 What the hell, 你可能会想这样有什么意义。其实还真有意义,第一层意义,未来的你知道那天你过得很无聊,又是日常的一天。更重要的是,这可以让你坚持写日记。因为大部分人的每一天大概率是三点一线,周而复始的。当你在判断今天该不该写日记的时候,很有可能就是不值得写,因为在你看来,今天又是上班下班,稀疏平常的一天,等真正发生有意思的事情再写吧。拜托,等到那个时候,我猜你也不会写的,因为写日记这件事对你来说太麻烦了。 所以,哪怕今天很平常,也可以敲下几个字,“今天又是平常的一天”。这样做的目的其实是在强迫你对今天进行一个回忆和思考。你总不可能每天打开日记本就写一样的话吧,哈哈。当然,你累了的时候,也可以今天的日记就写一个字,“累”。这也是我上边提到的,不要在意内容写得怎么样。偶尔偷下懒还是可以的。 最后再点下小标题。很多朋友在写日记,开始下笔时想到今天发生的事情,不会马上写下来,而是会先构思整个叙事框架。这个无形中会带来记录成本,我个人推崇的是,想到哪写到哪,咱写日记又不是为了锻炼文笔和语言组织能力,纯粹记录而已。当然,偶尔哪天想要写正式点也是可以的,随你啦,开心就好。 补日记 说实话,我写了这么多年,也并没有做到把 “写日记” 变成一个习惯(那些说坚持 21天、3个月做一件事就能成为习惯的真是瞎说),我到现在偶尔还是会抗拒、懒得写日记。可能有些朋友会比较诧异,坚持了这么多年的事,难道不是像喝水那么简单吗?还真不是,就是这么真实。 所以,我偶尔也会有偷懒的时候,今天太累可能就不写了。但我会在第二天或过几天把今天的日记给补上,这也算是一种休息、缓冲的方式。给自己一个暗示,能够补回去的就不算断。 但是,拖更的天数不能太长,一旦中断的时间超出一定阈值,这件事就真这么断了。所以我一般不会超过3天。 片段记录 一天中发生的事,到晚上记录时总会有想不起来的时候,哪怕这件事你当时觉得非常有趣,晚上一定要记录下来。 因此,当发生有趣的事时,你可以先把它记录下来。例如拍个照片,或者在备忘录、微信文件传输助手等地方简单写一些关键字。这样,你在记录的时候,就可以捡起这些片段了。 如果你也想写日记 很多朋友有时候会冒出想记录生活的想法,发朋友圈、拍照无疑也是记录的一种方式,但我们记录的内容有一些是不太方便给到他人去看的,此时写日记就是比较方便的形式啦。 日记的载体,我个人推荐云笔记(方便电脑 /手机都可以写),最好带有加密功能。 实体的本子的确比较有 feel,但在存储、记录方面还是比较麻烦。 最后,行动起来吧,非常有趣。

2021-09-19 · 1 分钟 · 66 字