跳至主要内容

博文

Windows 调优 ffmpeg 转换视频

Windows 上给老掉牙的显卡更新了驱动,然后在 Gemini 的帮助下解决了一堆问题,总算是可以高效地处理视频文件的转换了。 以下命令用于将一个输入视频按照时间区块分段截取,并利用 CUDA 高效地转换尺寸为 720p 大小。老硬件上也效果飞起~ ```powershell Measure-Command -Expression { $ins="INPUT_FHD.mp4"; $ousprefix="output_720p"; ffmpeg -hwaccel cuda -hwaccel_output_format cuda -ss 00:01:02 -to 00:40:00 -i $ins -vf "scale_cuda=720:-2" -c:v hevc_nvenc -preset p4 -tune hq -rc vbr -cq 28 -b:v 0 -c:a copy "$ousprefix-part1.mp4"; ffmpeg -hwaccel cuda -hwaccel_output_format cuda -ss 01:08:56 -to 02:00:00 -i $ins -vf "scale_cuda=720:-2" -c:v hevc_nvenc -preset p4 -tune hq -rc vbr -cq 28 -b:v 0 -c:a copy "$ousprefix-part2.mp4"; } ```

程序员友好的 3D 建模工具 OpenSCAD

看到油管的一个博主介绍了他使用 OpenSCAD 来[定义模型](https://makerworld.com/en/models/1478585-fully-customizable-ikea-components-parametric#profileId-1543526),颇感兴趣。 [OpenSCAD](https://openscad.org/index.html) 是一款免费的工具,支持包括 Linux、Windows 和 MacOS 在内的主要操作系统。不同于常见的 3D 建模工具,它的侧重点在于 CAD 方面。更为有趣的事,它使用了[一种语言](https://en.wikibooks.org/wiki/OpenSCAD_Tutorial)来定义组件。 以下是 Google search 的 AI summary,总结了 OpenSCAD 使用的编程语言的特点——函数式编程,允许用户方便的定义几何形状并对其进行变换。 OpenSCAD uses a functional programming language that is used to define 2D and 3D models through a script. This script is a free-format list of action statements, allowing users to create and manipulate geometric primitives to build complex objects. While the syntax resembles JavaScript or C, it's not a general-purpose programming language but rather a declarative language focused on geometric descriptions. Key characteristics of the OpenSCAD language: - Functional Programming: OpenSCAD's syntax is influenced by functional programming principles, w...

Fedora 40 on my old laptop

由于去年CentOS RIP的事情,很多企业都改用了另一种发行版。自用的一台老旧的MBP (2012年)已经很久没有更新了,干脆装了Fedora Linux。 时隔多年又安装Fedora,实际上是去年底就用了38,中间升级到了39但是年初的时候不知为何kernel出了问题,grub也没法回退到可用的状态。前几周有时间干脆完全重装了Fedora 40。还刚好试了试 [Ventoy](https://www.ventoy.net/) 的 Multi ISO files 特性,挺好。 ## 已解决的配置 1. Yakuake terminal 习惯了使用快捷键来触发下拉式命令窗口,参考[搜索结果](https://fedoramagazine.org/use-a-drop-down-terminal-for-fast-commands-in-fedora/)试了试 Yakuake 还不错。它还是基于 Kconsole 的,用户不需要做太多改动,直接就可以上手。 2. 倒腾 Git Repo 遇到了小问题 为了速度转移一些 Git Projects,没有逐个 clone,而是直接从另一台笔记本弄了 tar.gz 过去。不知道是不是 MacOS 自带的 tar 命令与 GNU 的水土不服,过去之后,除了一致的额外隐藏文件 (ie .DS_Store) 居然Git还报了另一种问题 “index file is too small”! 仔细查找后总算是找到了[解决方法](https://joemaller.com/1283/git-error-index-file-is-too-small/)。 ``` git config repack.usedeletabaoffset false git repack -a -d ``` 3. 安装一些趁手的工具 `dnf install exa bat ripgrep fzf pass` 配上已有的 dot files 基本解决了问题。这套配置在 MacOS 和 Linux 差别度不大。 4. 外接显示器分辨率的设置 不知为何,外接显示器居然找不到应有的 ratio。参考[一篇博客文章](https://www.wenjinyu.me/solve-the-problem-of-gnome-des...

不可言说的知识

在看八叉老师的一门课,他引用了『庄子』 【外篇 天道】[末尾的一个故事](https://ctext.org/dictionary.pl?if=gb&id=42076&remap=gb)来解释什么是不可言说的知识。 > 桓公读书于堂上, > 轮扁斲轮于堂下, > 释椎凿而上, > 问桓公曰: > “敢问:公之所读者何言邪?” > 公曰:“圣人之言也。 > ”曰:“圣人在乎?” > 公曰:“已死矣。” > 曰:“然则君之所读者, > 古人之糟魄已夫!” > > 桓公曰:“寡人读书,轮人安得议乎? > 有说则可,无说则死。” > > 轮扁曰:“臣也以臣之事观之。 > 斲轮,徐则甘而不固, > 疾则苦而不入, > 不徐不疾,得之于手而应于心, > 口不能言,有数存焉于其间。 > 臣不能以喻臣之子, > 臣之子亦不能受之于臣, > 是以行年七十而老斲轮。 > 古之人与其不可传也死矣, > 然则君之所读者, > 古人之糟魄已夫!” 这段古文的意思大致如下: > 齐桓公在堂上读书,轮扁在堂下砍削车轮。他问齐桓公在读什么书。齐桓公说是圣人的书。轮扁说,那全是古人的糟粕!齐桓公就很不高兴,非要让他说出个道理。 > 轮扁说:我所从事的工作是砍削车轮。榫头做得过于宽缓,就会松动而不牢固,而做得太紧了,又会涩滞而难以使用。不宽不紧才可以。这个道理是我从工作中学会的,虽然能讲出来,但是没有办法教给徒弟或儿子。于是这么大岁数了我也只能自己削车轮。不可言传的道理跟随圣人一起死了,所以您读的书只能是古人的糟粕。 轮扁讲出的道理需要他的徒弟或儿子亲身在工作中学习,通过经验的增长,才能学会——这就是所谓的【不可言说的知识】。

顺手拷贝的一个 build.gradle.kts

Gradle 的 `build.gradle` 通常都是用 Groovy DSL 来编写的。随着 Kotlin 流行,Gradle 也慢慢开始支持 `build.gradle.kts`。 刚好看见一个简单的 sample,顺手放在这里 ```kotlin plugins { `java-library` "jacoco" } repositories { mavenCentral() } dependencies { implementation("jakarta.inject:jakarta.inject-api:2.0.1.MR") implementation("jakarta.ws.rs:jakarta.ws.rs-api:3.1.0") implementation("jakarta.servlet:jakarta.servlet-api:5.0.0") implementation(project(":home-made-lib")) testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") testImplementation("org.mockito:mockito-core:4.5.1") testImplementation("org.eclipse.jetty:jetty-server:11.0.9") testImplementation("org.eclipse.jetty:jetty-servlet:11.0.9") } tasks.withType () { useJUnitPlatform() } java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } ```

Ubuntu 安装和配置 NeoVim

最近想试试 NeoVim,在 Windows 10 WSL 的 Ubuntu (20.04) 里安装 neovim 是非常方便的,[用 Snap](https://askubuntu.com/questions/430008/how-to-install-neovim-on-ubuntu) 就可以了。 sudo apt install neovim 如果需要将 Neovim 设置为常用的编辑器,最好[利用系统的 Alternatives 设定](https://blog.aktsbot.in/vim-to-neovim.html),以取代常见的默认程序 (如 `/usr/bin/vim.basic`)。 ```bash $ sudo update-alternatives --install /usr/bin/vi vi /usr/bin/nvim 60 $ sudo update-alternatives --install /usr/bin/vim vim /usr/bin/nvim 60 $ sudo update-alternatives --install /usr/bin/editor editor /usr/bin/nvim 60 ``` [除了以上这几个命令之外,还有 ex, vi, vim, editor, view, vimdiff 等等](https://stackoverflow.com/questions/65889273/how-do-i-add-nvim-to-update-alternatives-when-using-snap-under-ubuntu),都可以使用类似的命令来替换。 值得一提的是,不像 `vim`,`neovim` 不再支持各种 alias commands,而是推荐直接调用 `nvim` 时传入相应的 args 来进入需要的模式,例如 `nvim -R` 就类似于 `view`;`nvim -d` 类似于 `vimdiff`。可以参考这两个 GitHub Issues: - https://github.com/neovim/neovim/pull/2008 - https://github.com/neovim/neovim/issues/1646

[Resources] Golang, Kotlin, JS and Misc

周末看的几篇文章提到了一些有用的资源,记录一下: - Golang 1. [awesome-go](https://github.com/avelino/awesome-go) 2. [Effective Go](https://go.dev/doc/effective_go) - Kotlin 1. [Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html) - JavaScript 1. [Prototype Chain](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain) - Web 1. [MS Restful API Guideline](https://github.com/microsoft/api-guidelines/blob/vNext/Guidelines.md) 2. [Hardening Your HTTP Security Headers](https://www.keycdn.com/blog/http-security-headers)

Requests Pipelining and Size Estimation

这两周刚好在看和 requests pipelining 有关的 Netty 代码,找到了挺有意思的文章: 1. [Pipelining requests](https://aphyr.com/posts/267-pipelining-requests) 2. [Estimate size of objects in OrderedMemoryAwareThreadPoolExecutor](https://aphyr.com/posts/269-reaching-200k-events-sec) 这里提到的 [Riemann](https://riemann.io/) 是一个分布式监控软件,用 Clojure 语言开发的(GitHub 代码库[地址](https://github.com/riemann))。

Create Symbolic Link using PowerShell

类似于 Linux 的 `ln -s` 命令,Windows PowerShell 也支持在文件系统中创建 SymbolicLink。 例如,为了方便在 Visual Studio Code中预览 Markdown 的图片,就可以建立软链接: ```PowerShell cd src\main New-Item -Path .\markdown\frontend\img \ -ItemType SymbolicLink \ -Value .\resources\frontend\images\ ```

WSL invalid option when executing shell script

有一个 bash script,在MacOS里执行的顺利无比,但是一到 WSL 里头就总是出问题。 : invalid option 一开始怀疑是 shebang 哪里写错了,后来发现不对,貌似和 '^M' 有关。最后在[这里](https://newbedev.com/bad-interpreter-bin-bash-m-code-example)看到了类似的提示,果然是linefeed要替换! sed -i -e 's/\r$//' $FILE.sh

"The Java Version Almanac"

看了看从 Java 8 到 17 的 changes。 从 [这篇文章](https://ondro.inginea.eu/index.php/new-features-in-java-versions-since-java-8/) 发现了个有意思的 [Java 年鉴](https://javaalmanac.io/),非常用心地将历代 API 的变化都标注了出来。 仔细看了看,该网站的作者之一 Cay Horstmann 就是当年俺初学 Java 时读的 Core Java 的作者。

SpaceVim with NeoVim in Docker

在Docker里玩了会儿neovim+spacevim。 ``` docker run --name nvim -it --rm spacevim/spacevim nvim ``` 版本是最新的 ``` NVIM v0.7.0-dev+792-gc46f7caad Build type: RelWithDebInfo LuaJIT 2.1.0-beta3 Compilation: /usr/bin/cc -DNVIM_TS_HAS_SET_MATCH_LIMIT -O2 -g -Og -g -Wall -Wextra -pedantic -Wno-unused-parameter -Wst rict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -fstack-protector-st rong -fno-common -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 - DNVIM_UNIBI_HAS_VAR_FROM -DMIN_LOG_LEVEL=3 -I/usr/src/neovim/build/config -I/usr/src/neovim/src -I/usr/src/neovim/.deps /usr/include -I/usr/include -I/usr/src/neovim/build/src/nvim/auto -I/usr/src/neovim/build/include Compiled by root@buildkitsandbox ``` 不过启动后老报错: ``` Error detected while processing BufEnter Autocommands for "*": E117: Unknown function: LaTeXtoUnicode#Refresh startify: Can't read viminfo file. Read :help startify-faq-02 `...

Powershell 批量抽取视频中的声音

是不是会从油管载几个音乐视频,为了方便转换为MP3,在Win10试了PowerShell,尚未完全批处理,分为步骤如下: 1. 搜集目录下近期下载的MV文件列表 ``` # List input file name Get-ChildItem -Path I:\YOUGET\MusicVideos\*.mp4 | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) } | Select Name ``` 2. 自定义输出的MP3文件名,将其与对应的输入文件名一起存放到一个字符串中,稍后转换为一个Hashtable结构。 ``` # Construct a hashtable, using Output MP3 name as key, and input file name as Value. $nmapping=@" mp3-file1 = ... mp3-file2 = ... mp3-file3 = ... "@ $hash = ConvertFrom-StringData $nmapping ``` 3. 遍历Hashtable的元素,执行 ffmpeg 命令来转换为MP3。 ``` # Loop the hash table, and run ffmpeg foreach ($h in $hash.GetEnumerator()) { $InputFileName = "I:\YOUGET\MusicVideos\" + "$($h.Value)" $OutputFileName = "I:\YOUGET\MP3\" + "$($h.Name)" + ".MP3" Write-Host "Convertign $InputFileName to $OutputFileName ..." ffmpeg -i "$InputFileName" -vn -ab 256k "$OutputFileName" } ``` 参考了以...

年末的剧集忽然多了起来

最近发现值得看的电视剧忽然多了起来。 先是『风起洛阳』,去年看了『长安十二时辰』后被马亲王的作品圈了粉,于是开始follow这一部。 昨晚发现『雪中悍刀行』居然也出了剧集,也是要看起来啊啊啊~

定制 Blogger 的页面模板以支持 Markdown 内容

换了一个新的页面模板,于是需要重新配置HTML template,否则博文中使用的markdown无法被正确显示在页面上。 幸亏谷歌的cached page还可以找到原本的解决方案, <!-- 2016.03: customize the page to use showdown.js (for markdown) and highlight.js (for code highlight), also utilise AngularJS directive for parsing <div data-markdown> --> <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js'></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/showdown/1.3.0/showdown.min.js'></script> <link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.2.0/styles/default.min.css' rel='stylesheet'/> <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.2.0/highlight.min.js'></script> 首先要添加几个脚本,包括 1. Showdown 用来将 Markdown 的脚本转换为 HTML。 2. Hightlight 用于高亮显示代码,不过这个功能貌似还没有怎么用到。 3. Angular (1.x) 如果不想要用像是 jQuer 这样的脚本来操作 DOM,可以依赖 Ng 的directive来自动识别 `markdown` attribute 直接替换 DOM 内的文本。 然后在末尾添加一段 `script` 脚本定义...

裁缝·高粱

在Netflix上看了一部2015年的电影,[The Dressmaker](https://www.imdb.com/title/tt2910904/)。剧情起伏挺巧妙,不错的黑色喜剧。 Tilly 一袭红衣霸气地站在小镇的 "Grand Final" 那尘土飞扬的赛场前,画面风格让人印象深刻。 谷歌了一下为什么Teddy第二次跳入谷仓会和前一次结果不同,原来“高粱结构不均匀,粒大,堆起来占地方,很虚,从高处跳进去会陷很深,造成压迫胸腔无法呼吸-------引用豆瓣解释的”。 > It's not wheat, Barney. It's sorghum. 新单词get —— **sorghum**

追剧【暑期】

一个项目从2020年头上开始一直忙到七月初,终于结束了初始阶段,在TSA结束前部署到了AWS。虽然不能说是「多亏了疫情导致的WFH」,但这一年多的工作时间明显是要比 COVID 之前多的……好在学到的东西也不少。 七月下旬借着「暑期」的名义(虽然实际的天气并非酷暑……)又开始了追剧,先是把去年攒下来的「半泽直树2」给看了,然后又看了今年出品的「龙樱2」。虽然没有看过第一部的龙樱,不过听说口碑还不错,看下来剧情也还行,中间穿插了他们备战高考的各种技巧,挺有意思的。 本打算看看国内有啥好看的剧集,暂无发现,反倒是LD居然对耽美剧「山河令」产生了兴趣…… 上周刚开始看「短剧开始啦」,熬过了第一集之后慢慢觉得有趣了起来。 另外,在油管下了几段小视频,结果意外的发现you-get将视频和音频分开来保存。貌似以前一直都是直接单文件保存的啊?研究后发现是因为格式化的macOS没有安装ffmepg导致的。参考了[这篇文章的命令](https://iitii.github.io/2019/05/01/1/)合并了一下就解决了。而且重新安装了 ffmpeg 之后you-get也恢复了正常。

写在 2020 的最后一天

今年无疑是难以令人忘记的一个年份…… 因为疫情的关系,从三月份开始WFH。 升降桌的使用率大幅提升,显示器支架也派上了大用场。 慢慢的把客厅的一角变为了“工作空间”,发现了部分家具布局的问题,逐渐开始调整。 网购了很多东西,也订阅了很多服务, 年末的时候找ISP解决宽带掉线的问题,NBN的技术人员上门换了新的Connection Box,接线口也都给换了,再配上新入手的无线路由器,嗯嗯,上网的稳定性带来了莫名的安全感。 再过不到100分钟就是新的一年了, 2021 新的希望~祝所有的人都身体健康

Roller Shutter 电路控制器需要的绝缘垫片

电动卷帘窗最近一直有问题,盘查下来应该不是电池本身的问题,因为另一扇窗户开关正常,而且更换了wall plate之后仍旧如此。 于是开始寻思是否是wall plate背后那根电线的接触不好,唯一可能的只有接头处的垫片,但如果需要重做的话需要有一个Wire Stripper Plier,而且还要找到对应的垫片型号。 上网搜索了一圈,发现大概是名为 Insulated Terminal 或是 Crimp Terminal 之类的东西,根据垫片的具体形状还分为很多类: * RV (Ring Terminal) * SV (Spade Terminal) * BV (Butt Connector) * FDD (Female Disconnector) * MDD (Male Disconnector) 我所需要的类型大概是 `fdd1.25-250` 之类的吧。

调整网络适配器的优先级

参考[这篇文章](https://www.windowscentral.com/how-change-priority-order-network-adapters-windows-10) 重置了几个网络适配器的优先顺序。 Powershell命令: ``` > Get-NetIPInterface > Set-NetIPInterface -InterfaceIndex 30 -AutomaticMetric enabled ``` 根据文章描述,也可以手动修改每个网络适配器对应的Metrics (跃点数),数值越低则优先级越高。