Plex 内嵌的 SQLite 数据表字段解析

Plex Media Server 是一个媒体服务器,可以用来管理和串流电影、电视剧、音乐、照片等等媒体格式。

因为 Plex Media Server 运行在本地,所以几乎所有的信息都在本地的一个 SQLite 中,包括了 Library 的信息,多媒体的 meta 信息等等。

Plex Database 的位置

在 Linux 上(包括 NAS):

$PLEX_HOME/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db

在 Debian/Ubuntu 下 Plex 数据在

/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/

在 macOS 上:

~/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db

Windows 上:

"%LOCALAPPDATA%\Plex Media Server\Plug-in Support\Databases\com.plexapp.plugins.library.db"

Plex SQLite3

分析的时间是在 2022 年 10 月 8 号,未来 Plex 可能对表名和表结构有所改变,请注意。

目前一共有 81 张表,7 张虚拟表。有一些表可以通过名字猜测出来,比如 accounts 表就是 Plex 登录账号的表。

accounts # 登录的账户
activities # Plex 活动记录,比如更新 metadata, scanning
blobs
cloudsync_files # 看起来像是很多年前 Plex 就关闭了的 Cloud Sync 功能遗留下来的表
devices  # 记录 Plex 登录的设备,包括 Chorme,Phone 等等
directories # Plex 能够扫描的文件夹列表
external_metadata_items
external_metadata_sources
fts4_metadata_titles_docsize
fts4_metadata_titles_icu_docsize
fts4_metadata_titles_icu_segdir
fts4_metadata_titles_icu_segments
fts4_metadata_titles_icu_stat
fts4_metadata_titles_segdir
fts4_metadata_titles_segments
fts4_metadata_titles_stat
fts4_tag_titles_docsize
fts4_tag_titles_icu_docsize
fts4_tag_titles_icu_segdir
fts4_tag_titles_icu_segments
fts4_tag_titles_icu_stat
fts4_tag_titles_segdir
fts4_tag_titles_segments
fts4_tag_titles_stat
hub_templates
library_section_permissions
library_sections # 仓库的设置
library_timeline_entries
locatables
location_places
locations_node
locations_parent
locations_rowid
media_grabs
media_item_settings
media_items
media_metadata_mappings
media_part_settings
media_parts    # 包含了重要的媒体文件的路径
media_provider_resources
media_stream_settings
media_streams
media_subscriptions
metadata_item_accounts
metadata_item_clusterings
metadata_item_clusters
metadata_item_setting_markers
metadata_item_settings
metadata_item_views
metadata_items
metadata_relations
metadata_subscription_desired_items
play_queue_generators
play_queue_items
play_queues
plugin_permissions
plugin_prefixes
plugins
preferences
remote_id_translation
schema_migrations
section_locations
spellfix_metadata_titles_vocab
spellfix_tag_titles_vocab
sqlite_master
sqlite_sequence
sqlite_stat1
statistics_bandwidth
statistics_media
statistics_resources
stream_types
sync_schema_versions
synced_ancestor_items
synced_library_sections
synced_metadata_items
synced_play_queue_generators
synchronization_files
taggings
tags
versioned_metadata_items
view_settings

几张重要的表

专辑的打分,单曲的打分。

metadata_items

metadata_items 记录了所有媒体文件的 metadata 信息

表结构:

create table metadata_items
(
    id                      INTEGER not null
        primary key autoincrement,
    library_section_id      integer,
    parent_id               integer,
    metadata_type           integer,
    guid                    varchar(255),
    media_item_count        integer,
    title                   varchar(255),
    title_sort              varchar(255) collate NOCASE,
    original_title          varchar(255),
    studio                  varchar(255),
    rating                  float,
    rating_count            integer,
    tagline                 varchar(255),
    summary                 text,
    trivia                  text,
    quotes                  text,
    content_rating          varchar(255),
    content_rating_age      integer,
    "index"                 integer,
    absolute_index          integer,
    duration                integer,
    user_thumb_url          varchar(255),
    user_art_url            varchar(255),
    user_banner_url         varchar(255),
    user_music_url          varchar(255),
    user_fields             varchar(255),
    tags_genre              varchar(255),
    tags_collection         varchar(255),
    tags_director           varchar(255),
    tags_writer             varchar(255),
    tags_star               varchar(255),
    originally_available_at dt_integer(8),
    available_at            dt_integer(8),
    expires_at              dt_integer(8),
    refreshed_at            dt_integer(8),
    year                    integer,
    added_at                dt_integer(8),
    created_at              dt_integer(8),
    updated_at              dt_integer(8),
    deleted_at              dt_integer(8),
    tags_country            varchar(255),
    extra_data              varchar(255),
    hash                    varchar(255),
    audience_rating         float,
    changed_at              integer(8) default 0,
    resources_changed_at    integer(8) default 0,
    remote                  integer,
    edition_title           varchar(255)
);

metadata_item_settings

metadata_item_settings 表中记录了媒体文件的打分 (rating),播放次数(view_count),播放位置(view_offset),最后一次播放时间(last_viewed_at)。1

对于音乐库,专辑的 rating 在 metadata_items 表中,对于单曲的打分才在这张 metadata_item_settings 中。

SELECT mi.title, mi.rating album, mis.rating track
FROM metadata_item_settings mis
JOIN metadata_items mi on mis.guid = mi.guid
WHERE mi.parent_id = (SELECT id FROM metadata_items WHERE title LIKE '%<partial album title here>%');

用例

查看 playlists

metadata_type = 15 的时候表示该记录是 Playlist。

select title from metadata_items where metadata_type = 15;

查看某一个播放列表中的文件路径:

select file from media_parts as p left join media_items mi on mi.id = p.media_item_id 
    left join play_queue_generators as pqg on pqg.metadata_item_id = mi.metadata_item_id 
    left join metadata_items on metadata_items.id = pqg.playlist_id
  where metadata_items.title = 'Playlist title';

查看所有条目

SELECT library_sections.name AS Libary, metadata_series.title as Series, metadata_season.'index' AS Season, metadata_media.title AS Title FROM media_items
INNER JOIN metadata_items as metadata_media
ON media_items.metadata_item_id = metadata_media.id
LEFT JOIN metadata_items as metadata_season
ON metadata_media.parent_id = metadata_season.id
LEFT JOIN metadata_items as metadata_series
ON metadata_season.parent_id = metadata_series.id
INNER JOIN section_locations
ON media_items.section_location_id = section_locations.id
INNER JOIN library_sections
ON library_sections.id = section_locations.library_section_id;

2022-09-02 plex , media-server , homelab , sqlite

富兰克林自传 读书笔记

怎么知道的这一本书

已经被不止一遍的推荐过,[[芒格]] 非常喜欢这本书,在《穷查理宝典》里面推荐过,巴菲特也曾推荐过,在之前看过的 [[法官能为民主做什么]] 中也能读到美国最高法院法官对富兰克林的尊敬,再到国内,罗辑思维也在视频中推荐过。上一本读过的 [[新教伦理与资本主义精神]] 中[[马克思 韦伯]] 也列举了 [[富兰克林]] 作为例子,有意思的是我在我的笔记库中搜索的时候,一本讲述德州扑克的树中作者也援引了富兰克林的观点,可见富兰克林在美国人心中的地位。

而我对富兰克林的印象停留在了那个雷雨天放风筝的小孩,以及 100 美元上的人物了,其他零星的记忆就是看美国建国那段历史的时候偶然出现的形象。所以正好借由这一本自传来完整地了解一下富兰克林。

关于作者

富兰克林的自传,自然作者就是富兰克林,全名是本杰明•富兰克林,打开他的维基百科,能看到不少的头衔,除了我们熟悉的科学家,政治家,他同样还是杰出的外交家,发明家,出版商,记者,作者等等,甚至在心理学上也有建树。作为政治家,共同起草了独立宣言,作为外交家,结盟法国,赢得了独立战争。

几句话总结书的内容

这是一本富兰克林所写的自传,写于 1771 年。

全书共分为 4 个部分,正传,正传续篇,续传和补编,但观看的过程中明显能感觉到在正传部分花的篇幅比较多。从家庭,青年事情开始写起,尤其是富兰克林的青年时期令人印象深刻。

启发或想法

读书的习惯

在书中都知道富兰克林是一个印刷商人,但也能从中看到富兰克林对书的痴迷,在 17 岁时就读了洛克的[[人类理解论]],波特洛亚尔派的会员们所著的《思维的艺术》,从小就接受了不同的哲学思想。不仅自己有着良好的阅读习惯,也在之后成立图书俱乐部,名之曰“讲读俱乐部”,成立图书馆,通过书让更多人获益。

尽可能多的读书,书籍是智慧的源泉。

「图书馆使我得以有恒地研习增进我的知识,每天我停留在里面一两个钟头,用这个办法相当地补足了我失掉的高等教育」

学习写作

富兰克林在书中写道,「散文写作对我的一生十分有用,而且还是我走向成功的重要手段之一」,有意思的是,富兰克林是在和别人「吵架」中意识到自己的行文不足的,「但在辞句优雅、条理明晰方面我却不如对方。在这些方面,他举出几个例子使我信服。我知道他的意见是公平的,从此对于文体更加注意,且决心努力改进。」

学习写作的方法:

  • 模仿,「如果可能的话,我还很想模仿它。抱着这个念头,我取出其中的几篇,把每句的大意摘要录出,放置几天以后,再试着不看原书,用自己想到的某些合适的字,就记下的摘要加以引申复述,要表现得跟原来的一样完整,把原篇重新构建完成。」
  • 学习不同的表达,「因为为了合律和协韵,写诗常常需用意义相同而长短不同、声调不同的字,这样就会把我摆到继续不断搜求大量词汇的需要下,也会帮助我记住它们而能运用自如。」

写作的另外一个长处便在富兰克林之后的人生中起了很大的作用,撰文倡导自己的政治主张,通过印刷品影响人民进而影响议会,书中提到的纸币增发议案就是一典型的案例。

广交好友

从和哥哥交恶,富兰克林离开波士顿,独自一人前往费城,在书中能看到富兰克林结交的朋友并非都是善人,那个为人热情的威廉总督,空给人了希望,将富兰克林骗到伦敦。但大部分的朋友都在人生的不同阶段给过富兰克林帮助。

当具备一定的阅历、智慧并坚持学习思考,人就会像超重体一样,吸引更多的有思想有价值的人来到你的身边。

做一个可行的自我提高计划,如何坚持并实施它

人的一生所经历的大多数事情是无法预知的,即使这样,计划也是必须的。因为,只要坚持执行计划,未知的事情会围绕着计划发生。

为人谦逊

「因为要巩固商人的信用和声望,我不但注意到勤劳和节俭的实际情形,也要避免那种趾高气扬的形象。我穿得很朴素,从来不在消闲的娱乐场所出现。我从不出去钓鱼和打猎。」

这一段文字立即让我想到了韦伯的 [[新教伦理与资本主义精神]],书中也恰恰列举了富兰克林作为例子。

这也是 13 条道德中的最后一条。

谁应该看这本书

所有人都应该看一看。

印象深刻的句子

  • 想要说服别人,要诉诸利益而非诉诸理性。
  • 在获得第一桶金之后,再去获得第二桶就容易多了。因为钱是可以生钱的。

13 条道德原则

  1. 节制:食不过饱,饮不过量
  2. 沉默:于人于己不利之言不谈,避免闲言碎语
  3. 秩序:放东西各归其位,办事情各按其时
  4. 决断:决定做你该做的事,做好你决定做的事
  5. 节俭: 不花于己于人没有益处的闲钱,杜绝浪费
  6. 勤奋:珍惜时间,做有用的事,弃掉一切不需要的举动
  7. 诚信:不害人,不欺诈,勿思邪念,言必信,行必果
  8. 正直:不作恶,不要以德报怨
  9. 中庸:避免走极端,忍让化冤仇
  10. 清洁:身体、衣着、居所,不许不洁
  11. 平静:不可为小事、常事或难免之事搅乱了方寸。
  12. 贞洁:少行房事,除非为了身体健康或传宗接代,不做一味,衰弱或者损害自己或别人的安宁和名誉
  13. 谦卑:效法耶稣和苏格拉底。

2022-08-22 autobiography , reading , reading-2022 , reading-2022q3

Rust 编写的代码编辑器 Zed

Zed 是一款使用 [[Rust]] 编写的轻量、可协作的编辑器。是 Atom 编辑器团队在 Atom 关闭之后新起的项目。主打协作能力。

文本编辑器大战中又迎来了一员大将。

不过当前仅支持 Python, Rust, TypeScript, C/C++, JSON。1 支持列表可能之后还会增加。

前有 Visual Studio Code,后有 JetBrains 在积极开发 [[Fleet]],


2022-08-18 zed , rust , editor , atom

介绍一款支持 WebDAV 的网盘 teraCLOUD

teraCLOUD 是一家日本云存储服务提供商,提供基于云端的文件存储、同步和分享功能。用户可以使用 teraCLOUD 上传、下载、同步和分享文件,这些文件可以随时随地在各种设备上进行访问,包括电脑、手机和平板电脑等。

teraCLOUD 提供了多种存储计划,用户可以选择合适的存储空间和价格方案。除了基本的文件存储和同步功能外,teraCLOUD 还提供了一些高级功能,如文件共享、文件夹共享、外部链接共享等,方便用户与他人共享文件和合作工作。

teraCLOUD 采用了高度安全的技术保护用户数据的安全性和隐私。所有文件都会经过加密处理,同时,teraCLOUD 也提供了多种身份验证方式和安全设置,以确保用户数据的安全性和保密性。

teraCLOUD 是一款功能强大且安全可靠的云存储服务,适用于各种个人和商业用途。

但是在所有的特性中 teraCLOUD 的独特之处在于支持 [[WebDAV]]。

什么是 WebDAV

WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP 协议的扩展协议,用于在 web 服务器上进行文件管理和协同编辑。WebDAV 可以让用户在 web 服务器上读取、写入和修改文件,并提供了一些高级功能,如文件锁定、版本控制、属性管理等。

通过 WebDAV,用户可以像在本地计算机上编辑文件一样在 web 服务器上编辑文件,这使得 WebDAV 成为一种非常方便的远程协作工具。例如,用户可以通过 WebDAV 在多个地点访问、编辑和共享文件,这对于团队协作、文件共享和远程访问非常有用。

使用场景

teraCloud 支持了 WebDAV 之后就诞生了很多的使用场景,比如可以作为配置文件的存储,可以编程直接访问 WebDAV,也可以直接在系统中挂载网盘当作一个本地硬盘使用。

在 macOS Finder 中添加 WebDAV

打开 Finder,然后按下 Cmd+k (或者菜单栏 Go-> Connect to server),然后在弹出的对话框中填入 TeraCLOUD 的连接内容。点击连接之后,输入 TeraCLOUD 后台提供的用户名和密码(注意这里不是 TeraCLOUD 的登录密码)。然后就可以直接在 Finder 中像本地挂在的磁盘一样使用 TeraCLOUD。 mac finder webdav

Referral

注册完成之后,可以访问 My Page 在其中输入我的邀请码 NDMSQ ,可以活得额外的 1GB 空间。

teracloud referral


2022-08-17 teracloud , cloud-drive , webdav , finder , macos

PlanetScale 云端 MySQL 数据库使用记录

[[PlanetScale]] 构建在 Vitess 之上。[[Vitess]] 是一个可以扩展的 MySQL 集群,集合了很多MySQL特性和NoSQL 的扩展能力。 Vitess 创建于 2010 年,主用用于解决 YouTube 团队面临的 MySQL 扩容问题。

Vitess 是一个分片的非 ACID SQL 数据库(ACID 是原子性、一致性、隔离性和持久性的缩写)。

在 MySQL 中,FOREIGN KEY 约束的实现方式会 影响在线 DDL

Vitess 通过分片方式扩展 MySQL 数据库,数据在水平方向分区,Vitess 根据分片将查询路由到适当的 MySQL 实例上。Vitess 的连接比 MySQL 轻,可以轻松支持数千个连接。

PlanetScale 就是一个运行在云上的 MySQL,有一个 Web 管理界面,还有一个 CLI 工具。

价格

PlanetScale 对于入门的使用是免费的,它的免费套餐提供

  • 5 GB 存储
  • 1 billion row reads/mo
  • 10 million row writes/mo
  • 1 production branch
  • 1 development branch
  • Community support

超出此套餐的存储每 GB 收费 $2.50/mo ,1 billion row read 收费 $1/mo,而 1 million row written 收费 $1.5/mo。

如果有更多的资源使用,也可以 升级套餐

使用

PlanetScale 令人心动的一个功能就是可以给数据库 拉分支 ,PlanetScale 允许用户像代码一样从主库中拉出一个一模一样结构的 development 或 staging 的数据库环境,可以在这个环境中开发,测试。所有的数据都是隔离的。

当完成开发之后,可以创建 deploy request,PlanetScale 会自动对比创建出差异的 Schema diff,然后开发者可以 review 需要部署生效的内容。同意通过之后 deploy 到线上库中。整个部署变更的过程不会产生停机时间。

不过需要注意的是,PlanetScale 为了实现扩容,舍弃了一些 MySQL 的特性,比如 PlanetScale 不支持 FOREIGN KEY1,并且也要求每一个表都有一个唯一且不为空的主键2

监控

  • 可以使用 [[Checkly]] 监控数据库延迟
  • 可以使用 [[Datadog]] 更详细的记录分析数据库的状态

当然 PlanetScale 后台也提供了简单的监控,包括每秒读写。

导入数据

因为 PlanetScale 可以直接使用 MySQL 命令行连接,所以可以直接命令行导入:

sudo mysql -h xxx.ap-northeast-2.psdb.cloud -u inxxxxxxx -ppscale_xxxxxx --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/cert.pem < ~/database.sql

注意这里的证书位置,我是在 macOS 下执行,所以证书在 /etc/ssl/cert.pem,如果是 Linux,证书在 /etc/ssl/certs/ca-certificates.crt1

导入数据包包含 0000-00-00 00:00:00 数据

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1292 (22007) at line 383: vttablet: rpc error: code = InvalidArgument desc = Incorrect datetime value: '0000-00-00 00:00:00' for column 'update_time' at row 1 (errno 1292) (sqlstate 22007) (CallerID: planetscale-admin): Sql: "insert into tb_dy_resource values (:vtg1, :vtg2, :vtg3, :vtg4, :vtg5, :vtg6, :vtg7, :vtg8, :vtg9, :vtg10, :vtg11, :vtg12, :vtg13, :vtg14, :vtg15, :vtg16, :vtg17, :vtg18, :vtg19, :vtg20, :vtg21, :vtg22, :vtg23, :vtg24, :vtg25, :vtg26, :vtg27, :vtg28, :vtg29, :vtg30, :vtg31, :vtg32, :vtg33, :vtg34, :vtg35, :vtg3

查了一下 PlanetScale 似乎无法修改 sql_mode 字段,那就只能手动修改 SQL 了。

sed -i 's/0000-00-00 00:00:00/2022-01-01 00:00:01/g' gagays.sql

Client

因为 PlanetScale 是兼容 MySQL 的,所以任何 [[MySQL客户端]] 都可以使用。

这里推荐 JetBrains 的 [[DataGrip]]。

在调研的过程中还发现了一款新型的 SQL 客户端,叫做 [[Arctype SQL Client]],主打同步,感兴趣也可以试试。

  • [[Bytebase]] 是一个面向 DBA 和研发工程师的数据库 Schema change/migration 和版本控制工具。
  • [[MySQL InnoDB 存储引擎提供的在线 DDL]]

reference


2022-08-16 mysql , planetscale , vitess , acid , sql , scale

新教伦理与资本主义精神 读书笔记

怎么知道的这一本书

在了解 [[马克思 韦伯]] 的时候,不管是介绍其人,或者是他的传记作品中都不断提及这一部巨著。

我希望读过这一本书之后可以回答如下的问题:

  • 资本主义在世界的很多地方都诞生了,但为什么只有西方的资本主义会占领全世界?
  • 资本主义和宗教之间有没有关联?
  • 使得资本主义文明得以发展的必要条件是什么?

为什么 100 多年之后还要去读这一本 [[新教伦理与资本主义精神]]?

科学,专业领域有很多大问题,有很多的专家可以解答,但是同样有很多的大问题,关乎人生,关乎社会,关乎时代的大问题,并不能由某一个领域的专家来回答。

关于作者

[[马克思 韦伯]] 德国社会学家,哲学家,经济学家。我已经忘记了什么时候第一次了解到韦伯,但是我记得在 [[刘擎西方现代思想讲义]] 中读到 [[工具理性]] 和 [[价值理性]] 的概念的时候再一次加深了对韦伯的印象,于是在前年 2020 年韦伯逝世 100 周年的时候再一次读了一本关于他的传记 [[马克思韦伯 跨越时代的人生]],进一步了解了他的生平和家庭。

几句话总结书的内容

  • 韦伯认为西方的清教徒中禁欲思想对现代资本主义的发展起到了推动作用

什么是伦理?

伦理,Ethic,区别于伦理学(Ethics) ,伦理学又被称为道德哲学,是对日常的伦理寻找根基,分析论证的学问。但是韦伯所指的伦理指的是人们在日常生活中正在运用的,但是对这些伦理缺乏必要的反思的一套规范。

什么是资本主义精神?

韦伯对[[资本主义]]进行新的诠释,他认为资本主义并不是对财富的贪欲,反而是对这种非理性欲望的一种抑制或者至少一种理性的缓解。“在现代的经济秩序下,只要合法赚钱,就可以被看做是一种遵守天职的美德的结果和发挥天职能力的表现。”用更简单的话去概括就是「赚钱光荣」。

「营利变成了目的本身,而不再是为了满足人的物质生活需求的手段。」

而在此之前,更多人的认为赚钱是一种手段,赚钱是可耻的。赚来的钱会立即用掉。韦伯借用了[[富兰克林]] 的例子,富兰克林不仅是一个政治家,同样还是一位了不起的科学家,作家,出版商和商人。他之所以能出现在 100 美元的纸币上,也与他卓越的贡献以及踏实、勤奋的为人有关。

韦伯的资本主义精神并不是不惜一切赚钱,而是要合法合理的赚钱。

  • 勤勉劳动
  • 信用,信守承诺会赢得他人信任,就能获得更多的合作机会
  • 节俭,因为拥有钱就可以生钱

禁欲主义是什么?

加尔文宗教、虔信教、循道教和浸礼宗诸派的教义,通过他们的宗教观念来了解“宗教信仰和宗教活动所产生的心理约束力的影响,这些影响转而指导日常行为并制约个人行动。

宗教观念中的禁欲主义表现出来的行为方式就是,有条理的工作方式、对中产阶级节制观念的鼓励、对暴发户的鄙视、对勤劳美德的赞颂,都成为后来资本主义精神的观念基础,而这样的精神对资本主义财富的积累是相当重要的。

韦伯指出禁欲主义的观念会促使人们有意识地节制地使用财富,并且勤劳地在本职工作上工作,而勤劳必然会导致财富的增加,因而禁欲主义的强制财富储蓄就会导致资本的形成——-提供了投资的资本。

而最后作者指出当前资本主义的实际状况—-资本主义不再需要禁欲主义的支撑,而作为同样对禁欲主义产生重要影响的启蒙运动,其影响力也在日益下降,这样“职业行为”和精神本性中的最高文化价值不在联系起来了,这样后果就是“最后的人”的境况。

回答我之前的疑问

为什么资本主义从西方蔓延到全世界

阅读历史,我们可以知道世界的各个地方都出现过资本主义,但是唯有西方的资本主义成为了现代经济的主流。韦伯在书中论证只有在西方才出现了现代资本主义精神,而这个资本主义精神正是来源于清教徒的禁欲思想。禁欲思想促使人们勤劳工作、有意识地节制地使用财富。而这样精神在进入现代社会之后不再需要禁欲主义的支撑,但是这样的精神促进了资本主义的发展。

  • 「职业」这一词来源于宗教,即上帝安排的任务。在宗教改革时路德在翻译《圣经》时使用了这一词汇,韦伯认为,在新教中,上帝不是要人们以苦修的禁欲主义超越世俗道德,而是要以个人完成在现世里所处地位赋予他的责任和义务。新教伦理就形成了职业道德的概念。
  • 在禁欲主义的新教伦理下,劳动成为了禁欲的一种途径,虚耗时光和不劳动被认为是不道德的。传统的观念认为财富使人懈怠,但是在禁欲主义下,工作是虔诚的表现,富人即使拥有财富也必须工作。这样追求财富只要不用于挥霍就是合理的就成为了一种新教伦理。

韦伯进一步区分了两种类型的资本主义:

  • 「传统的」资本主义,传统的资本家关心盈利,但是理想是谋取社会地位,不会为了赚钱而不停奋斗。舒适的贵族生活方式才是目标,经商是为了尽可能容易获取这种生活方式。
  • 「现代的」或「理性的」资本主义,理性资本主义并不是以奢侈贸易,而是以大规模生产日常生活必需品为基础的。现代资本主义的驱动力不是高价格与巨额利润,而是合理价格与大批量稳定销售。推动现代资本主义的并不是产业革命和新技术发明,而是:随着大规模日用品市场的出现而使用大规模生产技术。

但韦伯也说,宗教伦理、禁欲思想并不是资本主义形成的唯一因素,在西方独特的环境之下,下面的这些因素同样影响了资本主义的发展:

  • 生产经营与工业资本主义发展之前的家政经营分离,在西方比其他地方更加先进
  • 城市的发展。西方在后中世纪之后,城市共同体达到了高度的政治自治,使得市民社会中农业封建制度下脱颖而出。而东方,亲属网络阻断了城乡分化
  • 罗马法的传统,提供了比其他地方更完整、更发达的司法实践理性化
  • 而司法制度又使得民族国家以及全职官僚制度官员行政成为可能。理性的法律体系
  • 复式记账的发展
  • 而这一系列的变化,为形成「自由的」,以市场上出卖劳动力为生的劳动力大军做好了准备

这一些因素全部糅合到一起才促成了资本主义。唯有区别与其他地方的资本主义精神和这种资本主义组织形态的发展,才使得近代西方和东方走向了两条截然不同的发展道路。

启发或想法

韦伯在文末说出了自己的忧虑,基于[[功利主义]]的「实用理性」生活方式,再加上刻板的官僚化工作场所,最终可能会产生一个对个人既缺乏崇高理想又缺少个人主义的社会。而我们如今的生活不恰恰正被韦伯言中了吗?当这一点成为现实的时候,那就不再可能培育出个人行为的伦理责任感,最后,如果没有了伦理价值,同情心、慈善心和博爱之心如何才能存在?清教徒式的为事业献身是不是正在消失,取而代之的则是追求享乐的功利主义计算?而现代资本主义所崇尚的「理性计算」是否会把一切伦理价值统统弃之不顾呢?

谁应该看这本书

  • 知道韦伯,并且想进一步理解韦伯的人
  • 想知道这个世界另一个马克思思想的人

2022-08-15 max-weber , capitalism , ethic , philosophy

谣言 世界最古老的传媒 读书笔记

在阅读上一本 [[法国大革命前夕的舆论和谣言]] 的时候接触到了这一本《谣言:世界上最古老的传媒》,作者让-诺埃尔-卡普费雷(Jean-Noël Kapferer)系统地剖析了什么是谣言,为什么会存在谣言,谣言的传递遵从什么样的规则,我们能不能消灭谣言等等。作者收集了世界上曾经流行的种种谣言,引用了诸多社会心理学实验,去阐述了这些谣言的来源,人们为什么会相信这些谣言,人们又是如何利用谣言来达成自己的目的。

什么是谣言 ?

奥尔波特和波斯曼认为,谣言是一个「与当时事件相关的命题,是为了使人相信,一般以口头媒介的方式在人们之间流传,但是缺乏具体的资料以证实其确切性」。

纳普认为,谣言是一种「旨在使人相信的宣言,它与当前时事有关,在未经官方证实的情况下广泛流传」。

彼得森和吉斯特对谣言的定义是,谣言是一种「在人们之间私下流传的,对公众感兴趣的事物、事件或问题的未经证实的阐述或诠释」。

最著名的谣言的定义是美国社会学家特·希布塔尼,谣言是一群人议论过程中产生的即兴新闻。

通过上面不同学者对谣言的不同定义,可以归纳初谣言的共性:

  • 谣言是一种信息,是与现实中的人或物相关,这一点与传说不同
  • 谣言是为了使人相信,这与童话或故事不同
  • 谣言是未经证实的信息

我们为什么相信谣言

  • 谣言通常宣称自己有可靠的信息来源
  • 我们之所以相信人, 是因为他们经常告诉我们一些被证明是事实的事情, 人在这里充当了中转站
  • 传播谣言的人通常不会和自己切身利益相关,传播谣言似乎只是在利他主义的考虑下才做的
  • 一个似乎是真的信息
  • 科学技术的发展使得一切知识都是可以怀疑的,一切确定性都是不可能的.当公众对一切都无法相信时,他们就会相信一切.
  • 谣言的出现与时代环境是联系在一切的
  • 谣言传到身边时,总是伴有证据
  • 谣言是一种诠释系统.越异想天开,越是钻牛角尖,人们越喜欢
  • 重复的力量
  • 谣言是一个我们愿意相信的信息
    • 相信谣言的愿望
    • 共鸣

谣言能够消灭吗?

二战时期的纳普曾经提出过制止谣言流传的五条建议:

  • 公众对官方传播媒介(报纸、电台、电视)无保留地信任
  • 公众绝对信仰领袖
  • 事件发生后,尽快播发尽可能多的信息
  • 确保所有人都能接受到这些信息
  • 避免人们太过空闲

在二战的背景下,纳普的建议似乎是合法可行的,但是在和平时期重读这些建议时,就好像是在描述一个极权国家。

纳普的功勋在于明确地指出了偏见的根源。谣言并不妨碍人,因为谣言是「虚假的」,如果真的是这样,那么任何人都不会把谣言放在心上。然而,谣言之所以有人相信,正因为谣言经常最终被发现是「真实的」。

作者自己在书中的第四部分用了整整四分之一的篇幅去论述谣言可以被消灭吗?答案当然是否定的。

[[波普尔|卡尔 波普尔]] 认为,一个理论命题只有当它详细说明它的试验程序时才能上升为一个科学命题。然而往往有一些谣言是无法证明的。 相信辟谣与相信谣言本身所遵循的是同一个逻辑。两种情况下,都是凭口头说的就信以为真。扑灭谣言的问题归根到底还是一个人的问题:「相信什么」取决于「谁来说」。没有一个可靠的发言人,反谣言的战斗必然失败。

但找到可靠的发言人就可以反击谣言吗?说起来容易,其实非常难。谣言的扩散常常显示出一种对官方渠道消息的不信任,甚至对政府本身就缺乏信任。在实行新闻管制的国家,谣言便盛行起来,能指望什么样的官方公报来减少谣言呢?

当代社会心理学创始人 S·阿施给出了一个方法。他的思想可以概括为:人们不会改变对一个事物的认识,而是认识的对象在变化。换句话说,就是公众舆论的突变,只能来自谣言自身的变化。于是我们就可以通过改变谣言的面貌来抑制谣言:

  • 寻找谣言中的漏洞,但这种方式并不能百分之百解决问题
  • 向公众解释为什么他们相信谣言。

认识心理学已经证明,为了认识,我们利用的是外在、明显的信号。我们如何判断我们自己是否喜欢某一个事物?我们怎么知道自己是否有才能去做某件工作呢?这两个问题涉及同一个问题,那就是,我们自己对自己的看法。外在的信号会改变我们自己,进而改变我们的认知。

虽然我们没有办法根除谣言,但是依然可以通过一些方法防患于未然。增加透明度就是一个方法。增加消息来源的可靠性也是一个方法。另外也需要注意的是在谣言扩大之前就通过公开透明的信息来防止谣言。一旦谣言扩散出去了,那么再公开透明的信息也难以阻止了。

结论

直到今天,对谣言的研究还被一种负面的观念支配,认为谣言必定是虚假的、臆造的或荒谬的。总有人想要防止谣言。然而,这个世界上只存在一种防止谣言的办法,那就是堵住人的嘴。

只让可靠的消息流传,这表面上看来是合理的操作,但是直接控制消息会导致言论控制,传播媒介成为了官方消息的唯一提供者。于是除了官方消息便再没有了其他消息。

谣言存在的根本原因在于,谣言并不一定是虚假的,而与此同时,谣言必定是非官方的。怀疑官方的事实,于是旁敲侧击,从反面提出其他事实,这就是大众传播媒介未能消除谣言的原因。

谣言从反面提出了另一种价值观,只有不受约束的信息交流才是好的,哪怕其可靠性受到了影响。换一种说法便是,「虚假」的谣言是有根据的谣言必须付出的代价。

当我读到这一段的时候,想起了[[密尔]] 对于言论自由的论述,在 [[论自由]] 中密尔说我们不应该压制任何言论,因为被压制的言论可能包含部分的真实,只有通过充分的讨论才能让我们逼近真实。而这些可能错误的言论是我们获取真理必须要付出的代价。

而从[[认识论]]的角度看,「我们为什么相信我们信以为真的事物?」 我们带着思想、观点、形象、信念生活在这个世界,而思想、观点、形象和信念往往从口传媒介,道听途说而获取。我们往往意识不到这个获取过程,因为这个过程非常缓慢,并且偶然且不易察觉。

作者通过对谣言的研究获得的片刻清醒证实了[[知识]]的脆弱。也许我们所获得的知识中的一大部分是毫无根据的,而我们并没有意识到。

谣言提醒我们一个明显的事实:我们并不是因为我们的知识是真实的、有根据的或被证实的便相信它们。而情况恰恰相反,因为我们相信它们,它们才是真实的。谣言再一次证明,如果有必要的话,任何可靠性都是社会给予的,我们隶属的那个社会群体认为是真实的东西才是真实的。这句话初听起来可能比较晦涩,但我们仔细去回想宗教。社会是建筑在信仰,而不是证据的基础之上的。

谣言最佳的例子不就是宗教吗?它不就是在传播一句由上帝之口说出的话吗?宗教与谣言一样,是一种有传染力的信仰,人们希望徒凭一句话就相信,希望他赞同人们告诉他的事实。并不是存在上帝的证据创造了信仰,而是人们信仰了,才产生上帝。


2022-08-04 rumour , reading , reading-2022 , reading-2022q3 , media

在 IntelliJ IDEA 中使用 reset frame 回退 Debug

在 IntelliJ IDEA 中调试的时候,如果不小心断点跳过了,如果可以往前跳转就可以省去很多时间。搜索一下之后发现,在 IDEA 中叫做 Reset Frame(之前叫做 Drop Frame)。

在启动调试之后,在调试 Debugger 窗口中有 Frames ,其中就是调用堆栈。

idea debugger reset frame

点击其中的某一条,然后右击就可以看到菜单,选择想要跳转回去的 Frame,然后 Reset。

不过需要注意的是这个操作只会重置局部变量,全局变量的状态不会重置。

reference


2022-08-02 intellij , intellij-idea , idea , java , debug , debug-tips , reset-frame , drop-frame

字幕编辑软件 Aegisub 简单使用

前段时间非常感兴趣字幕制作,起因是因为现在已经逐渐可以脱离字幕来看韩影,而有些时候在一些国外的网站上能到制作非常精良的英文字幕,马来西亚字幕,日语字幕,但唯独缺少了中文字幕,想来一方面版权制作方也并没有在华语地区发行也没有制作中文字幕的必要,另一方面国内的字幕组大部分只会发布硬字幕压制的影片,并且随着这两年借口版权法对字幕组的打击,大量的字幕组都转到地下,曾经一度非常辉煌的人人字幕(美剧),猪猪字幕组(日剧,日影,日综),TSKS(韩剧,韩影,韩综),要不就是关站,要不就是解散,更甚至字幕组的运营人员都被判刑。但在没有完善版权法保护,并且又没有完善的方式引进优秀外国作品的当下,字幕组成为了大量中国人了解外国文化的唯一入口。所以在过去的很多年里在内心还是非常感激这些无私的字幕组的。 在这样的背景下,一方面本着学习的态度,另一方面想了解一下字幕组的运行方式,于是就花了一点时间了解了一下字幕制作的完整过程。

字幕格式和字幕制作工具还是挺多的,这里就直接介绍我调研过程中发现的 [[Aegisub]],完全符合我对软件选择的所有要求,开源,跨平台,并且可以支持非常多的字幕格式,虽然有点丑,但好在功能强大。

Aegisub 是一款开源、跨平台的开源字幕编辑软件。它可以轻松、高效地完成时间轴的制作,并利用内置的各种实用工具来调整字幕的样式,还可以进行实时的视频预览。

支持的字幕文件格式有:

  • ass
  • ssa
  • srt
  • ttxt
  • sub

字幕制作过程

如果只有单纯视频,那么需要经过

  • 打轴,将字幕出现的时间标注出来
  • 听写,将音频内容打到时间轴上
  • 翻译,将字幕内容翻译到目标语言
  • 校对
  • 导出

如果是基于其他语言的字幕,那么就可以节省打轴和听写的步骤,直接进行翻译了。

界面

导入视频后界面如下:

aegisub ui

音频

在 Audio 菜单中可以选择,频谱或者波形,根据个人爱好选择。

推荐开启音频下方的:

  • Automatically commit all changes
  • Automatically go to next line on commit
  • Auto scroll audio display to select file

打时间轴

在音频轨道上使用鼠标左键选择一段内容,红色线条为开始,蓝色为结束。还可以使用左键点击标记开始,右键点击表示标记结束。这样就生成了一个红线和蓝线框住的区域。

可以使用「空格」来预览选中的音频。

  • Q 键,开始前 500 ms
  • W 键,播放结尾后 500 ms
  • S 键,播放区域内音频
  • D 键,播放结尾前 500ms,确认所有声音
  • G 键,提交轴
  • A/F 移动音频
  • Z/X 上一个/下一个时间段

一般开头贴近音频,但是结尾一般留长 100 ~ 300 ms,避免说完话,字幕立即消失的情况。

一般小于 500ms 的句子,也会拉长至 500 ms

最后保存成 ass 格式。

打时间轴是一个非常重复的体力劳动,所以还有一些自动化的工具。

  • [[Subtitle Edit]] 是一个 C# 编写的开源字幕编辑器,其自带一个自动生成时间轴的功能,可以使用 Subtitle Edit 自动生成时间轴,然后导出成 srt 导入到 Aegisub 来调整编辑。
  • autosub 是一个 Python 编写的命令行工具,可以用来从音频视频中生成字幕,[[autosub]] 甚至可以调用外部语音识别接口自动识别音频内容生成字幕文件,或者调用翻译接口来生成对应语言的字幕。

相关脚本

字幕渲染的插件 VSFilter

压制

在字幕制作完成之后,可以通过很多方式将字幕压制到视频内容中,因为本文的主角是 Aegisub ,所以压制的内容等有机会再分享。压制也是一门大学问。

Aegisub 的不同版本

因为官方版本已经很久没有更新,所以有爱好者自行维护发布了一些版本。

版权

最后来聊一聊「字幕」的版权。

如果宽泛地讲,制作,发布和使用电影字幕都是违法的,都是侵犯版权的行为。

电影是有版权的 ( 17 U.S. Code § 102(a) )

17 U.S. Code § 106(2) 给予了版权所有者独占的权利,以及授权基于版权物的衍生品的独占权利。

17 U.S. Code § 101 定义了什么是衍生品(derivative work)

a work based upon one or more preexisting works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which a work may be recast, transformed, or adapted….

所以我们可以看到版权所有者拥有对授权翻译的独占权利。但这个独占的权利受到 fair use 的限制 ( 17 U.S. Code § 107 ):

criticism, comment, news reporting, teaching (including multiple copies for classroom use), scholarship, or research

如果这些字幕文件不是 fair use 目的(比如引述)那么这些翻译内容就是侵权的。

107 项提供了如下的方法判断是否是 fair use1

(1) the purpose and character of the use, including whether such use is of a commercial nature or is for nonprofit educational purposes; (2) the nature of the copyrighted work; (3) the amount and substantiality of the portion used in relation to the copyrighted work as a whole; and (4) the effect of the use upon the potential market for or value of the copyrighted work.

其他工具

  • [[Subtitle Edit]]
  • [[Arctime Pro]]
  • pyTranscriber 调用 Google 语音识别文字。

2022-08-01 aegisub , subtitle , fansub , 字幕组 , 字幕

从 mkv 文件中提取字幕文件

mkv 是一种容器,可以包含视频,音频流,也可以包含字幕等等文件,如果要从 mkv 文件中提取字幕,可以使用一款叫做 mkvtoolnix 的命令行工具。

mkvtoolnix

macOS 下:

brew install mkvtoolnix

在 Ubuntu 下:

sudo apt install mkvtoolnix

mkvtoolnix 使用

查看文件内容:

mkvmerge -i path/to/video.mkv

提取字幕文件:

mkvextract tracks path/to/video.mkv 3:file1.srt 4:file2.srt

假设有很多个字幕文件提取,从轨道 3 开始:

for file in *.mkv; do
  sub=$(echo $file | sed 's/\.mkv$/.srt/'); 
  mkvextract tracks "${file}" 3:"${sub}"; 
done

ffmpeg

使用 [[FFmpeg]] 也可以提取字幕。

首先查看文件内容:

ffmpeg -i video.mkd

查看输出的内容中 Stream #<stream number>(eng): Subtitle: subrip 其中 <stream number> 就是字幕的轨道。比如 0:2

然后使用如下命令提取:

ffmpeg -i video.mkv -map <stream number> subs.srt

比如:

ffmpeg -i video.mkv -map 0:2 subs.srt

另外一种更复杂一些的写法可以

ffmpeg -i video.mkv -map 0:s:0 subtitle.srt

这个地方 -map 0:s:0 中的第一个 0 表示的是输入文件的序号,因为这个地方只有一个输入文件 video.mkv 所以就表示这个文件。

reference


2022-07-31 mkv , subtitle , cli , mac , linux

电子书

本站提供服务

最近文章

  • 从 Buffer 消费图学习 CCPM 项目管理方法 CCPM(Critical Chain Project Management)中文叫做关键链项目管理方法,是 Eliyahu M. Goldratt 在其著作 Critical Chain 中踢出来的项目管理方法,它侧重于项目执行所需要的资源,通过识别和管理项目关键链的方法来有效的监控项目工期,以及提高项目交付率。
  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。