Jellyfin

之前一直遇到困难,怎么在不同的设备上播录播能够同步。vlc是做不到的,只能做到播+弹幕。在纠结怎么把hexo转移到wordpress的时候,误打误撞打开了一个bro的博客,目前在用的一些Docker,发现了Jellyfin这个项目。

Jellyfin有很多版本,甚至有中国特供版(国内玩家自己魔改的)。我安装的是官方的镜像。

Docker

初步启动

对于这种应用,有docker肯定是跑docker了。首先要创建一些目录给它存数据。

根据文档的Docker Compose可知,我们需要手动创建两个目录:configcache。另外,存放用来远程观看的媒体文件的目录也要挂载进去,这里假设是/mnt/media。由于docker本身就提供了环境隔离,所以我就不指定用户了,直接用root就行。那么首先,mkdir上面的两个目录,得到以下目录结构:

1
2
3
4
~/docker/jellyfin/
|-- config/
|-- cache/
`-- docker-compose.yaml

docker-compose.yaml的内容是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.5'
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
network_mode: 'host'
volumes:
- ./config:/config
- ./cache:/cache
- "/mnt/media:/media:ro"
- "/mnt/media/font:/font:ro"
restart: 'always'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://example.com
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- "host.docker.internal:host-gateway"

可以看到,为什么比官方文件多挂载了个font目录呢?其实font目录里面放的是微软雅黑的ttf字体文件,由于很多弹幕录制器默认的字体都是微软雅黑,如果不提供这个备用字体,jellyfin渲染的弹幕就会变成方框。具体的看#弹幕是方框怎么办

Read More

vscode写C++的各种细节

ccls

报错找不到标准库的header

vscode的ccls插件需要配置ccls.misc.compilationDatabaseDirectory才能让它正常识别自定义header,需要根据cmake插件的build目录来设定,不过一般都是${workspaceRoot}/build

wrapper

根据wiki添加include,做个wrapper。

clang++ -xc++ -fsyntax-only -v /dev/null"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% clang++ -xc++ -fsyntax-only -v /dev/null
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple arm64-apple-macosx13.0.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -fsyntax-only -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mframe-pointer=non-leaf -fno-strict-return -ffp-contract=on -fno-rounding-math -funwind-tables=1 -fobjc-msgsend-selector-stubs -target-sdk-version=13.3 -fvisibility-inlines-hidden-static-local-var -target-cpu apple-m1 -target-feature +v8.5a -target-feature +crc -target-feature +lse -target-feature +rdm -target-feature +crypto -target-feature +dotprod -target-feature +fp-armv8 -target-feature +neon -target-feature +fp16fml -target-feature +ras -target-feature +rcpc -target-feature +zcm -target-feature +zcz -target-feature +fullfp16 -target-feature +sm4 -target-feature +sha3 -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=lldb -target-linker-version 857.1 -v -fcoverage-compilation-dir=/Users/sieve -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/14.0.3 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -stdlib=libc++ -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1 -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include -internal-externc-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -internal-externc-isystem /Library/Developer/CommandLineTools/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -fdeprecated-macro -fdebug-compilation-dir=/Users/sieve -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -no-opaque-pointers -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -fcolor-diagnostics -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -mllvm -disable-aligned-alloc-awareness=1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -x c++ /dev/null
clang -cc1 version 14.0.3 (clang-1403.0.22.14.1) default target arm64-apple-darwin22.6.0
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1
/Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
/Library/Developer/CommandLineTools/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.

提取出关键路径(注意,最后一个不包含括号的内容):

1
2
3
4
5
6
/usr/local/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1
/Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
/Library/Developer/CommandLineTools/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks

写成wrapper放到PATH包含的路径里:

1
2
3
4
5
6
7
8
9
#!/bin/sh
exec /opt/homebrew/bin/ccls --init='{"clang":{"extraArgs":[
"-isystem/usr/local/include",
"-isystem/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1",
"-isystem/Library/Developer/CommandLineTools/usr/lib/clang/14.0.3/include",
"-isystem/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include",
"-isystem/Library/Developer/CommandLineTools/usr/include",
"-isystem/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
]}}' "$@"

Read More

re2的cmake配置

不想用vcpkg,想直接集成re2到项目里,但是报错需要absl。把absl也添加进项目之后,还是报错,类似:

1
CMake Error: install(EXPORT ... requires target "absl_base" that is not in the export set.

试过了issue #225的添加set(CMAKE_POSITION_INDEPENDENT_CODE TRUE),没用。

还是从另一个repo的issue#12185才找到正确的设置项set(ABSL_ENABLE_INSTALL ON)。要把这个设置添加到add_subdirectory或者其他make available的功能前面:

1
2
3
set(ABSL_ENABLE_INSTALL ON)
add_subdirectory(ext/absl)
add_subdirectory(ext/re2)

Read More

2023年9月天津与北京

第一天

早上没睡醒就出门了,结果就是忘记带饼干袋子和大水壶。还好早上吃了两个烧卖,在火车上也基本上是在闭眼休息,所以勉强算是到天津也没有特别饿。在酒店放下东西之后,本来是打算去麦当劳吃的,但是既然都吃汉堡了,搜一下附近有汉堡王,就果断抛弃麦当劳难吃的汉堡跑去汉堡王去了。

火车上旁边座位是一个女孩子,也是从广州上车坐全程来天津的。大概是个学生吧,根据皮肤和手判断应该是;但是声音就属于出乎意料地比看起来老的那种,然而大学的时候也见过这样的女孩子,所以不能单纯凭借声音来判断。她中午吃的是速食拌面,晚上吃的是传统泡面,好香啊orz

途中经过湖南的时候好大的的雾,感觉已经很久没有见过这么纯正的雾了。

20230905-DSC_5892-1

即使到现在,高铁上的手机信号还是时断时续的,而且明显导致手机的电跑得非常快。一开始不知道两个座位中间就是插座,跑到洗手台那里想“偷电”,结果被乘务员发现了,告诉我座位上也有。续命了属于是。说出来可能不信,今天充了两次电……

从天津西站到酒店其实很快,半个钟左右就到了。酒店在和平路,属于繁华地段,附近商场确实多风格也偏高端,甚至旁边就是劳斯莱斯和宾利的专卖店。看了一下明天要去坐的城轨站也很近,走路20分钟就到了,路上还有麦当劳。

酒店本身有点岁月的痕迹了,但是胜在空间很大而且性价比还不错,220多一晚。

第二天

今天8点钟就起床了,一边走一边看12306,结果发现天津站的票已经没有了,这是出乎意料的。然后打开了携程,看到9点多还是有票的,就下单了。然而其实起床气没过,拿了麦当劳才发现这个票是天津西站的……赶紧坐地铁赶过去,重温了2019年的赶火车经历:过完安检进候车厅发现已经开始检票了。

Read More

openssh on windows

想要在Windows和Mac上都能顺畅地写博客,就得熟练地使用ssh。之前不喜欢用Windows开发,一方面是Windows确实有各种各样的阻碍(特别是char encoding相关的问题);另一方面就是Windows不能像MacOS和Linux那样登录就自动解锁ssh key,每次都要输入密码,就很烦。

但是我寻思,堂堂Windows会这么垃圾?于是不死心,今天又进行了一次摸索,结果还真搞定了。

Windows自己的文档只教了怎么生成key和把key添加到keychain里——实际上存储ssh key的东西名字叫ssh-agent——剩余的“怎么让git使用ssh-agent”和“怎么配置ssh_config”倒是没有交代。

生成

官方文档 User Key Generation 这一节教的就是生成并添加key进ssh-agent。其实这一步跟其他平台上用openssh是一致的:

1
ssh-keygen -t ed25519

根据提示先输入private key的存储路径,然后设置private key的密码(输两次),就会生成一对ssh key了。

在用户目录下的.ssh文件夹里现在应该有这样的两个文件(可能名字不同):

1
2
3
C:\Users\username\.ssh/
`-- example
`-- example.pub

ssh-agent

Read More

日记

今天把冰箱里的茄子拿出来按照网上的教学进行素炒,其实主要就是:把茄子去皮切块之后,先放进碗里撒盐把水给腌出来,放进冰箱里腌制半个钟,拿出来再用手抓一下把水尽量挤干,然后放锅里炒,酱料就蚝油+生抽就行。吃起来除了太咸之外,还挺好吃的。

Read More

去了一趟海边

上个星期黎突然说周末想出去玩,然后讨论了一下决定去海边玩。在网上找资料,点进了网页版抖音,被安利到“水鱼岛”(海陵岛),就决定去那里了。本来想的是星期六才出发,但是黎的妈妈说最好星期五下午出发,于是就提前错峰出行了。

星期五下午1点多开到4点多,一路很顺畅就到了酒店。酒店是保利的一个公寓小区,地下停车场比较抽象,找了很久才找到前台所在的4栋。住倒是住在6栋。这个酒店式公寓比较奇葩,没有洗衣机——这玩意属于我可以不用,但是你不能没有,毕竟你叫公寓——其他的设施也比较抽象:冰箱藏在柜子里,晾衣架是折叠式的放在叠在一起的椅子后面;梳妆台空间很小……好就好在隔音还算不错,毕竟是大厂家的楼。这个酒店附近就有海滩和吃饭的地方,所以晚上就走路过去那个饭馆集中的地方去吃。走路的时候发现路上基本都是摩托车,没有电动车——果然不禁摩的地方电动车就没什么生存空间。这一片都是公寓,多数都被酒店承包下来出租了,真正自己住的很少。去到吃饭的地方,黎一不小心没拉住,我就被一家饭店拉进去吃饭了。不过其实这家也不算差,198满满一桌子,吃完之后壳像山一样。吃饱之后沿着旁边黑漆漆的一条路走到海滩玩。

这边的海滩其实白天都要钱,但是晚上不让下水(应该说生死自负),所以晚上是可以随便逛的。海滩上基本都是烤吧、餐吧,没有比较正宗的小酒吧,真是遗憾。当时海边有搞团建的,围着篝火在整蛊。海滩上还有开着沙滩车推销烟花的,也确实有不少人在玩烟花。这场景简直就像回到小时候,条条规规还没有限制生活的方方面面。

第二天去的是北洛秘境,名字土得不行(倒是很符合旧景区的起名风格)。这个沙滩跟一个酒店是一起的,酒店住客可以免费玩——但是房费4000多——其他游客就要买票进场了。沙子确实很细,水质也很好,多年没下水的我呛了几次水都没有感觉很怪,属于传统海水的味道了。在海里跳浪确实好玩,充分认识到了鼻子和嘴巴是连通的这个道理——甚至因为“盐水”洗鼻让鼻炎都松了点。最大的坏处就是被一个三连浪打到在水里转圈,甚至可能有5秒,起来之后发现眼镜被冲掉了。惊了!虽然尽力在沙子里找,但是最终只找到了两副墨镜。旅游突然就结束了!只能让黎开车了。还好最终是有惊无险回到家里了。新配一副眼镜2000出头,都能够再去一次了,可恶!

Read More