2024-10-28 17:23:24
最近经常用 Node.js 写一些本地运行的脚本,需要安全的读取一些密钥密码之类的敏感信息,业界通常的做法是这样:
对于环境变量模式,一般情况需要在本地文件系统明文保存一些关键的密钥信息。本质上还是不太安全,例如你的钱包私钥明文放在本地文件系统,容易在未来的某一天爆雷,这种模式本质上不是无密码(Keyless)的。
对于 KMS 模式,需要依赖各种在线 KMS 服务,整体方案比较重,不太适合在本地电脑上轻量化使用。
本文使用 1Password 和官方提供的 CLI,在本地以无密码方式读取敏感信息。
brew install 1password-cli
。具体可参考:https://developer.1password.com/docs/cli/get-started/
op account add
import { exec } from 'child_process'
import util from 'util'
const execPromise = util.promisify(exec)
// 使用内存缓存存储密钥
const secretCache = new Map<string, string>()
async function getSecretFromOnePassword(itemName: string, label: string): Promise<string> {
const cacheKey = `${itemName}:${label}`
// 检查缓存中是否已存在
const cachedSecret = secretCache.get(cacheKey)
if (cachedSecret) {
console.log('从缓存获取密钥')
return cachedSecret
}
console.log('从 1Password 获取密钥...')
try {
// 使用 op cli 获取 JSON 格式的 item 数据
/*
返回值示例:
{
"id": "xxx",
"section": {
"id": "add more"
},
"type": "CONCEALED",
"label": "secret-key",
"value": "xxx-value",
"reference": "op://xxx/secret-key"
}
*/
const command = `op item get "${itemName}" --fields label="${label}" --format json`
const { stdout } = await execPromise(command)
// 解析返回的 JSON 并返回值
const item = JSON.parse(stdout)
if (item && item.value) {
console.log('密钥获取成功')
// 存入缓存
secretCache.set(cacheKey, item.value)
return item.value
} else {
throw new Error(`label "${label}" not found in item "${itemName}"`)
}
} catch (error) {
console.error('从 1Password 获取密钥失败:', error)
throw error
}
}
在执行脚本时,系统会弹出 1Password 确认框,待你确认后,程序就可以获取到对应的密钥。
本文用 Node.js 示范了如何在本地以 Keyless 模式读取 1Password 里的密钥,实现原理本质上是包装调用了 1Password 官方的 CLI 程序,其他语言例如 Python、Java、Golang 之类的也可以很轻松的实现本文的逻辑。
要获得最佳阅读体验,请访问原文 https://baiyun.me/nodejs-keyless-read-1password-secrets
2024-10-28 16:59:03
本文主要聚焦在如何高效、优雅的观看你想看的任意 影视剧、体育、综艺等节目,尤其是一些国外的影视资源。只探讨技术,不提供任何无版权资源。
近些年海内外各大内容巨头均推出了自己的流媒体平台,对于用户来说面临一个问题:经常需要订阅很多家平台的会员才有可能看到自己想看的内容。
对于国内用户来说,还额外面临一些尴尬的问题,比如近些年广电总局的限外令,国外影视剧在国内以肉眼可见的速度减少,很多电影的出品方甚至会直接取消在国内院线上映,例如最近漫威的 雷神4,其他例如 花月杀手 这些均没有在国内院线上映。
即使好不容易在国内上映,很多情况也会面临删减、改台词等问题。
另外,国内主流的流媒体平台普遍还有几个大的现状:
国内主要是爱优腾三家,国外就非常多了。
平台 | 公司 | 简介 | 订阅用户数量 | 代表作 |
---|---|---|---|---|
Netflix | Netflix, Inc. | 全球最大的流媒体平台之一,以其丰富的原创内容和广泛的影视库而闻名。 | 超过2.3亿 | - 《怪奇物语》 (Stranger Things) - 《纸牌屋》 (House of Cards) - 《王冠》 (The Crown) |
Amazon Prime Video | Amazon.com, Inc. | 提供广泛的电影和电视剧集,并且拥有不少高质量的原创内容。 | 超过2亿 | - 《指环王:力量之戒》 - 《了不起的麦瑟尔夫人》 (The Marvelous Mrs. Maisel) |
Disney+ | The Walt Disney Company | 提供迪士尼、皮克斯、漫威、星球大战和国家地理的内容。 | 超过1.6亿 | - 《曼达洛人》 (The Mandalorian) - 《旺达幻视》 (WandaVision) - 《洛基》 (Loki) |
HBO Max | Warner Bros. Discovery | 提供HBO经典剧集以及Warner Bros.的电影和原创内容。 | 超过7700万 | - 《权力的游戏》 (Game of Thrones) - 《切尔诺贝利》 (Chernobyl) |
Hulu | The Walt Disney Company (majority stake) & Comcast (minority stake) | 提供丰富的电视剧集、电影和原创内容,主要面向美国市场。 | 超过4800万 | - 《使女的故事》 (The Handmaid's Tale) |
Paramount+ | Paramount Global | 提供派拉蒙电影公司、CBS、MTV、Nickelodeon等品牌的内容。 | 超过4600万 | - 《星际迷航:发现号》 (Star Trek: Discovery) - 《黄石》 (Yellowstone) - 《好妻子》 (The Good Wife) |
Apple TV+ | Apple Inc. | 苹果公司推出的流媒体平台,专注于高质量的原创内容,默认支持双杜比。 | 超过4000万 | - 《基地》 - 《人生切割术》 |
除了耳熟能详的 分辨率和帧率。真正显著影响视频质量的主要包括以下几点:
码率(Bitrate):码率是每秒传输的数据量,通常用kbps(千比特每秒)或Mbps(兆比特每秒)表示。码率越高,视频质量越好,但文件大小也会增大。常见的码率有2500kbps、5000kbps等。
动态范围(Dynamic Range):动态范围指视频中最亮和最暗部分的差异。高动态范围(HDR)视频能显示更多的亮部和暗部细节。
通俗的说,就是该亮的时候非常亮,例如聚光灯和日光、该暗的时候非常暗。同时确保细节依旧显示清晰。
业界主流的 HDR 格式:
音频格式:好的音频质量可以确保你听到更多细节,更加沉浸。
目前业界主流的高质量音频格式:
如果一些内容刚好这些流媒体平台都没有,这时候就有很多用户会使用 Bittorrent 协议以 p2p 的形式分享资源。
目前 BT 协议产生的流量依旧在全球流量占比中有接近 3% 的比例,比 Google 的流量还要高。
BT 协议是任何人都可以随时加入和离开的,它有一些缺点:
所以,PT 诞生了,PT(Private Torrent) 本质上还是 BT,只不过它的 Tracker 是私有的,只有白名单用户可以连接到这个 Tracker 进而下载内容。如果用户只下载不上传,或者上传比例太低,账号就会自动被 ban,这样确保了 PT 的用户体验在大部分情况下比 BT 好很多。
内容获取流程:
很多片源都会自带中文字幕,对于一些新的资源没有带字幕的,可以去 subhd 之类的字幕分享网站下载。
推荐方案是用 NAS,它相当于一台 24 小时开机、体积小巧、低功耗的电脑,厂商在设计上特地为内容存储做了优化,用户买回来插上硬盘就可以开箱即用。
大部分 NAS 上面都可以运行 Docker 容器,基于这个可以跑不少服务,且长期稳定运行。
NAS 品牌:群晖、威联通、极空间、绿联。对于喜欢折腾的用户来说推荐前两者,小白用户推荐后两者。
内容整理是指:自动从内容库识别这部影片的元信息(剧名、海报、剧照、卡司、分集信息)
Infuse 这款软件可以很高效实现内容整理、跨设备云端同步观看进度。以及正确播放几乎所有格式的视频,包括杜比视界。
Apple TV
Mac
iPhone
基于这套工作流可以让我们的观影体验变得纯净且高质量。
声音对于观影体验是至关重要的,相比于获得优质的视频画面,想要获得一个好的声音效果是更复杂的。
通常,优质的音响系统会让你感受到身临其境的沉浸感。相反,如果你能明显地感觉到声音来自某个特定方向,那就意味着声场质量很差。另外,一个常见的误解是声音并非越大越好,好声音的关键在于营造身临其境的空间感,同时保持扎实和清晰的层次。
选购音响系统首先要关注的是声道,不同声道的体验从普通到优秀排名如下:
这里小数点左边的数字表示音响数量,右边的 .1 表示一个独立的低音音响。例如 5.1 环绕声至少需要 5 个音响 + 一个独立的低音音响,前面放置三个作为左中右三个声道,后面放置两个作为后置的左右声道。
传统音响系统对于普通人的复杂之处在于:搞定复杂的布线、找到合适的摆放位置、了解不同房间布局对于声音的影响、了解声音校准,光搞清楚这些概念大部分人可能就要放弃了。
所以对于大多数人我的推荐有以下几种方案:
以上几种方案都通过无线技术大幅简化了布线和音响摆放位置的问题,且都自带校准功能(HomePod 是全自动的, Sony 需要在 App 里手动触发一次)。
在有选择的情况下,始终优先选择用多个分体音响组多声道,而不是用单个回音壁代替。
关于 HomePod 组立体声和传统 5.1 音响系统的效果对比可以查看这个视频:https://www.youtube.com/watch?v=DPZ11P6ojpE
要获得最佳阅读体验,请访问原文 https://baiyun.me/efficient-elegant-movie-watching-guide
2023-09-27 13:23:33
要获得良好的网络冲浪体验,DNS 设置是至关重要的。本文主要介绍如何使用 Surge 来提高 DNS 隐私和安全性,特别是在复杂的网络环境下,并分享一些经验,其中的原理也可以应用到诸如 Clash、Shadowrocket、Quantumult X 之类的软件。
Host 配置决定了你访问一个域名时 surge 如何解析这个域名的 DNS 记录,想获得高效安全的 DNS 解析体验,首先需要先根据你所处的网络环境配置合适的 Host 规则,先看一个配置示例:
[Host]
local.example.net = 127.0.0.1
local.xxx.net = 1.1.1.1
*xxxx-inc.com = server:system
*example*.com = server:system
*.* = server:https://223.6.6.6/dns-query
各种规则可以总结归类为三个梯队,优先级从上到下:
需要注意的是,只有 server:system 才会遵守本地 /etc/hosts 文件里的映射,以后如果遇到配置了 /etc/hosts 不生效,可以检查对应域名是否在 surge 里指定了其他服务器解析。
对于希望走代理的请求,应该尽量避免它们在本地触发 DNS 解析,最好将你常用的需要代理的网站加到 surge 的规则列表中,例如:
[Rule]
DOMAIN-SUFFIX,baidu.com,📡 Proxy
DOMAIN-SUFFIX,qq.com,📡 Proxy
如果你有大量域名需要代理,可以使用 Surge 提供的 rule-set 或者 domain-set 将这些规则和域名维护到单独的文件中,通过 URL 来引用和自动更新,例如:
# 自定义代理域名
RULE-SET,https://ruleset.example.com/proxy.txt,📡 Proxy
# GitHub 项目维护的代理域名
DOMAIN-SET,https://cdn.jsdelivr.net/gh/Loyalsoldier/surge-rules@release/proxy.txt,📡 Proxy
按照上述设置后,访问这些域名将不会在本地触发 DNS 解析,请求会直接发送到代理服务器,由它负责 DNS 解析,这样既可以提升隐私也可以获得更好的 DNS 解析结果。
好的 surge 配置应该尽量避免在前面的规则触发 DNS 解析,将需要触发 DNS 的规则尽量放置的末尾,下面是一个示例:
DOMAIN-SUFFIX,github.com,📡 Proxy
PROCESS-NAME,go-ipfs*,📡 Proxy
USER-AGENT,Figma,📡 Proxy
IP-CIDR,66.197.128.0/17,📡 Proxy,no-resolve
IP-CIDR,23.246.0.0/12,DIRECT
RULE-SET,LAN,DIRECT
GEOIP,CN,DIRECT
要获得最佳阅读体验,请访问原文 https://baiyun.me/surge-dns-optimization-guide
2023-04-07 11:21:38
工作中经常见到大量同事花名被打错的场景,本文分享了我近几年在用的输入法,完美解决了这个问题。
本文适合有以下需求的读者:
在接触到 RIME 之前,我用过很多款中文输入法,从最早的搜狗、到后来的百度、必应Bing输入法(后来改名叫微软拼音输入法)。其中 Windows 上最满意的是必应输入法,无奈 Mac 平台用不了。后来 Mac 上一直使用了好多年百度输入法,打字词库总是缺少一种称手的感觉,又找不到好的代替。
另外考虑到这类国内厂商的输入法基本毫无隐私和安全可言,它们都是免费产品,如果不是为了获取用户数据,那他们开发和持续维护这些输入法的目的是什么呢?
Rime(中州韵)是一个开源的输入法引擎,鼠须管是基于 Rime 构建的一款开源输入法,面向 macOS 平台。
我很早就听说过这款输入法的大名,也遇到很多人推荐它,但是被它繁杂的配置劝退了。最近,看到有人做了一套配置集合,整合了很多常用的功能,配合官方的配置管理工具让使用门槛一下子降低了好多。
接下来是一个简明指南,可以帮你快速安装和配置好一个开箱即用的输入法。
继续阅读需要的一些前置要求:
# 回到家目录,可选
cd ~
# 安装 plum,这是 Rime 官方的配置管理工具
git clone --depth=1 https://github.com/rime/plum
cd plum
# 安装 Rime 配置:雾凇拼音
bash rime-install iDvel/rime-ice:others/recipes/full
# 安装 鼠须管 Squirrel,安装之后需要登出系统重新登入才能添加输入法
brew install --cask squirrel
下面是雾凇拼音提供的功能概览图
鼠须管和默认配置安装好之后,其实已经可以正常使用了。本节的示例教你如何正确的做一些个性化配置。
执行 vim ~/Library/Rime/default.custom.yaml
,填入以下配置,下面的配置主要做了两个事情:
# Rime Patch settings
# encoding: utf-8
patch:
# 方案列表
schema_list:
- schema: rime_ice
# 中西文切换
#
# 【good_old_caps_lock】 CapsLock 切换到大写或切换中英。
# (macOS 偏好设置的优先级更高,如果勾选【使用大写锁定键切换“ABC”输入法】则始终会切换输入法)
#
# 切换中英:
# 不同的选项表示:打字打到一半时按下了 CapsLock、Shift、Control 后:
# commit_code 上屏原始的编码,然后切换到英文
# commit_text 上屏拼出的词句,然后切换到英文
# clear 清除未上屏内容,然后切换到英文
# inline_ascii 无输入时,切换中英;有输入时,切换到临时英文模式,按回车上屏后回到中文状态
# noop 屏蔽快捷键,不切换中英,但不要屏蔽 CapsLock
ascii_composer:
good_old_caps_lock: true # true | false
switch_key:
Caps_Lock: commit_code # commit_code | commit_text | clear
Shift_L: commit_code # commit_code | commit_text | inline_ascii | clear | noop
Shift_R: commit_code # commit_code | commit_text | inline_ascii | clear | noop
Control_L: noop # commit_code | commit_text | inline_ascii | clear | noop
Control_R: noop # commit_code | commit_text | inline_ascii | clear | noop
鼠须管有很多内置的主题,你可以直接将他们的名字填到下面配置的 color_schema 字段即可,我这里没有使用内置主题,而是从网络上找了两款接近 macOS 原生输入法的主题。
执行 vim ~/Library/Rime/squirrel.custom.yaml
,填入以下配置:
# Squirrel Patch settings
# encoding: utf-8
#
# 内置皮肤展示: https://github.com/NavisLab/rime-pifu
# 鼠须管配置指南: https://github.com/LEOYoon-Tsaw/Rime_collections/blob/master/鼠鬚管介面配置指南.md
# 鼠须管作者写的图形化的皮肤设计器: https://github.com/LEOYoon-Tsaw/Squirrel-Designer
patch:
style:
color_scheme: macos_light # 将皮肤名称输入在此处
color_scheme_dark: macos_dark # 暗色模式下的皮肤名称
# 皮肤列表
preset_color_schemes:
macos_light:
name: "MacOS 浅色/MacOS Light"
author: 小码哥
font_face: "PingFangSC" # 字体及大小
font_point: 16
label_font_face: "PingFangSC" # 序号字体及大小
label_font_point: 12
comment_font_face: "PingFangSC" # 注字体及大小
comment_font_point: 16
candidate_format: "%c\u2005%@\u2005" # 编号 %c 和候选词 %@ 前后的空间
candidate_list_layout: linear # 候选排布:层叠 stacked | 行 linear
text_orientation: horizontal # 行文向: 横 horizontal | 纵 vertical
inline_preedit: true # 拼音位于: 候选框 false | 行内 true
translucency: false # 磨砂: false | true
mutual_exclusive: false # 色不叠加: false | true
border_height: 1 # 外边框 高
border_width: 1 # 外边框 宽
corner_radius: 5 # 外边框 圆角半径
hilited_corner_radius: 5 # 选中框 圆角半径
surrounding_extra_expansion: 0 # 候选项背景相对大小?
shadow_size: 0 # 阴影大小
line_spacing: 5 # 行间距
base_offset: 0 # 字基高
alpha: 1 # 透明度,0~1
spacing: 10 # 拼音与候选项之间的距离 (inline_preedit: false)
color_space: srgb # 色彩空间: srgb | display_p3
back_color: 0xFFFFFF # 底色
hilited_candidate_back_color: 0xD75A00 # 选中底色
label_color: 0x999999 # 序号颜色
hilited_candidate_label_color: 0xFFFFFF # 选中序号颜色
candidate_text_color: 0x3c3c3c # 文字颜色
hilited_candidate_text_color: 0xFFFFFF # 选中文字颜色
comment_text_color: 0x999999 # 注颜色
hilited_comment_text_color: 0xFFFFFF # 选中注颜色
text_color: 0x424242 # 拼音颜色 (inline_preedit: false)
hilited_text_color: 0xFFFFFF # 选中拼音颜色 (inline_preedit: false)
candidate_back_color: 0xe9e9ea # 候选项底色
# preedit_back_color: # 拼音底色 (inline_preedit: false)
hilited_back_color: 0xD75A00 # 选中拼音底色 (inline_preedit: false)
border_color: 0xFFFFFF # 外边框颜色
macos_dark:
name: "MacOS 深色/MacOS Dark"
author: 小码哥
font_face: "PingFangSC" # 字体及大小
font_point: 16
label_font_face: "PingFangSC" # 序号字体及大小
label_font_point: 12
comment_font_face: "PingFangSC" # 注字体及大小
comment_font_point: 16
candidate_format: "%c\u2005%@\u2005" # 编号 %c 和候选词 %@ 前后的空间
candidate_list_layout: linear # 候选排布:层叠 stacked | 行 linear
text_orientation: horizontal # 行文向: 横 horizontal | 纵 vertical
inline_preedit: true # 拼音位于: 候选框 false | 行内 true
translucency: false # 磨砂: false | true
mutual_exclusive: false # 色不叠加: false | true
border_height: 1 # 外边框 高
border_width: 1 # 外边框 宽
corner_radius: 5 # 外边框 圆角半径
hilited_corner_radius: 5 # 选中框 圆角半径
surrounding_extra_expansion: 0 # 候选项背景相对大小?
shadow_size: 0 # 阴影大小
line_spacing: 5 # 行间距
base_offset: 0 # 字基高
alpha: 1 # 透明度,0~1
spacing: 10 # 拼音与候选项之间的距离 (inline_preedit: false)
color_space: srgb # 色彩空间: srgb | display_p3
back_color: 0x1f1e2d # 底色
hilited_candidate_back_color: 0xD75A00 # 选中底色
label_color: 0x999999 # 序号颜色
hilited_candidate_label_color: 0xFFFFFF # 选中序号颜色
candidate_text_color: 0xe9e9ea # 文字颜色
hilited_candidate_text_color: 0xFFFFFF # 选中文字颜色
comment_text_color: 0x999999 # 注颜色
hilited_comment_text_color: 0x999999 # 选中注颜色
text_color: 0x808080 # 拼音颜色 (inline_preedit: false)
hilited_text_color: 0xFFFFFF # 选中拼音颜色 (inline_preedit: false)
candidate_back_color: 0xe9e9ea # 候选项底色
# preedit_back_color: # 拼音底色 (inline_preedit: false)
hilited_back_color: 0xD75A00 # 选中拼音底色 (inline_preedit: false)
border_color: 0x050505 # 外边框颜色
wechat_light:
name: "微信浅色/Wechat Light"
author: 小码哥
font_face: "PingFangSC" # 字体及大小
font_point: 16
label_font_face: "PingFangSC" # 序号字体及大小
label_font_point: 13
comment_font_face: "PingFangSC" # 注字体及大小
comment_font_point: 16
candidate_format: "%c\u2005%@\u2005" # 编号 %c 和候选词 %@ 前后的空间
candidate_list_layout: linear # 候选排布:层叠 stacked | 行 linear
text_orientation: horizontal # 行文向: 横 horizontal | 纵 vertical
inline_preedit: true # 拼音位于: 候选框 false | 行内 true
translucency: false # 磨砂: false | true
mutual_exclusive: false # 色不叠加: false | true
border_height: 1 # 外边框 高
border_width: 1 # 外边框 宽
corner_radius: 5 # 外边框 圆角半径
hilited_corner_radius: 5 # 选中框 圆角半径
surrounding_extra_expansion: 0 # 候选项背景相对大小?
shadow_size: 0 # 阴影大小
line_spacing: 5 # 行间距
base_offset: 0 # 字基高
alpha: 1 # 透明度,0~1
spacing: 10 # 拼音与候选项之间的距离 (inline_preedit: false)
color_space: srgb # 色彩空间: srgb | display_p3
back_color: 0xFFFFFF # 底色
hilited_candidate_back_color: 0x79af22 # 选中底色
label_color: 0x999999 # 序号颜色
hilited_candidate_label_color: 0xFFFFFF # 选中序号颜色
candidate_text_color: 0x3c3c3c # 文字颜色
hilited_candidate_text_color: 0xFFFFFF # 选中文字颜色
comment_text_color: 0x999999 # 注颜色
hilited_comment_text_color: 0x999999 # 选中注颜色
text_color: 0x424242 # 拼音颜色 (inline_preedit: false)
hilited_text_color: 0x999999 # 选中拼音颜色 (inline_preedit: false)
candidate_back_color: 0xe9e9ea # 候选项底色
# preedit_back_color: # 拼音底色 (inline_preedit: false)
hilited_back_color: 0x79af22 # 选中拼音底色 (inline_preedit: false)
border_color: 0xFFFFFF # 外边框颜色
wechat_dark:
name: "微信深色/Wechat Dark"
author: 小码哥
font_face: "PingFangSC" # 字体及大小
font_point: 16
label_font_face: "PingFangSC" # 序号字体及大小
label_font_point: 13
comment_font_face: "PingFangSC" # 注字体及大小
comment_font_point: 16
candidate_format: "%c\u2005%@\u2005" # 编号 %c 和候选词 %@ 前后的空间
candidate_list_layout: linear # 候选排布:层叠 stacked | 行 linear
text_orientation: horizontal # 行文向: 横 horizontal | 纵 vertical
inline_preedit: true # 拼音位于: 候选框 false | 行内 true
translucency: false # 磨砂: false | true
mutual_exclusive: false # 色不叠加: false | true
border_height: 1 # 外边框 高
border_width: 1 # 外边框 宽
corner_radius: 5 # 外边框 圆角半径
hilited_corner_radius: 5 # 选中框 圆角半径
surrounding_extra_expansion: 0 # 候选项背景相对大小?
shadow_size: 0 # 阴影大小
line_spacing: 5 # 行间距
base_offset: 0 # 字基高
alpha: 1 # 透明度,0~1
spacing: 10 # 拼音与候选项之间的距离 (inline_preedit: false)
color_space: srgb # 色彩空间: srgb | display_p3
back_color: 0x151515 # 底色
hilited_candidate_back_color: 0x79af22 # 选中底色
label_color: 0x999999 # 序号颜色
hilited_candidate_label_color: 0xFFFFFF # 选中序号颜色
candidate_text_color: 0xbbbbbb # 文字颜色
hilited_candidate_text_color: 0xFFFFFF # 选中文字颜色
comment_text_color: 0x999999 # 注颜色
hilited_comment_text_color: 0xFFFFFF # 选中注颜色
text_color: 0xbbbbbb # 拼音颜色 (inline_preedit: false)
hilited_text_color: 0x999999 # 选中拼音颜色 (inline_preedit: false)
candidate_back_color: 0xbbbbbb # 候选项底色
# preedit_back_color: # 拼音底色 (inline_preedit: false)
hilited_back_color: 0x79af22 # 选中拼音底色 (inline_preedit: false)
border_color: 0x292929 # 外边框颜色
拷贝完之后,右上角输入法切换到 Squirrel 点击 Deploy 让配置生效。
上面我用的配置文件都是 *.custom.yaml 结尾,这种模式称之为打补丁模式,主要是为了避免修改原配置文件,这样以后输入法配置升级就很容易了。
使用鼠须管自带的用户数据同步功能配合 iCloud 之类的网盘,可以轻松将你的输入法配置和词库跨设备同步,对于多台设备,鼠须管会自动合并用户词库。
vim ~/Library/Rime/installation.yaml
# 本机的 ID 标志,默认是一串 UUID。生成的文件夹是这个名字,可以改成更好识别的名称
installation_id: "mbp16"
# 同步的路径,默认如没有设置此属性,则是在当前配置目录的 `sync/` 文件夹
sync_dir: "/Users/YOUR_NAME/Library/Mobile Documents/com~apple~CloudDocs/RimeSync"
Sync user data
即可完成数据同步,之后改动配置后需要再次重复此操作。目前官方没有提供自动触发同步的功能,因为在同步用户数据期间,输入法会处于不可用状态。RIME 的同步功能是 配置单向同步 + 用户词库双向同步,举个例子:A 设备开启同步功能后,B 设备并不会自动获得相同的配置,这两个设备只会自动合并用户词库(也就是你的自造词)。
如果你觉得经常手动同步用户数据比较麻烦,也可以配合 sleepwatcher 在电脑休眠和唤醒的时候自动触发同步,具体做法如下:
brew install sleepwatcher
touch ~/.sleep
chmod +x ~/.sleep
编辑 ~/.sleep 文件,填入以下内容:
#!/usr/bin/env bash
# 触发鼠须管同步用户数据
/Library/Input\ Methods/Squirrel.app/Contents/MacOS/Squirrel --sync
配置好之后,重启 sleepwatcher
brew services restart sleepwatcher
这时候可以休眠电脑等10秒再唤醒,检查 sync_dir 里面的 rime_ice.userdb.txt 文件修改时间是否变了。如果不生效,请检查 ~/.sleep 脚本是否正确,可以手动执行看下效果,以及重启 sleepwatcher.
上面的 ~/.sleep 脚本是在电脑休眠之前执行,根据你的需要还可以定义一个 ~/.wakeup 脚本在唤醒后执行。
前面我们用的预设配置是 雾凇拼音 这个项目提供的,后续可以通过下面的命令更新配置以获得新功能和 Bugfix。
更新雾凇拼音:所有配置和词库(更新前建议先备份 ~/Library/Rime 目录,更新后所有非 .custom.yaml 结尾的配置文件会被覆盖)
# 先回到 plum 安装目录,如果你将 plum 安装在了其他目录,这里需要修改
cd ~/plum
bash rime-install iDvel/rime-ice:others/recipes/full
更新雾凇拼音:所有词库文件
cd ~/plum
bash rime-install iDvel/rime-ice:others/recipes/all_dicts
如果你用下来感觉挺好的没啥问题,那建议只更新词库就行了。
对于自定义的补丁配置文件,尤其是 *.custom.yaml 和自定义字典,建议将其备份到自己的 git 仓库保存,防止配置意外被覆盖或丢失。
RIME 有些很有用的使用技巧新手刚开始不仔细研究可能发现不了,这里我罗列一些非常好用的技巧。
打字久了很容易在不经意间产生一些错误的自造词,这时候如果不处理就很容易在后续的输入过程中继续使用这些错误的自造词。
要删除不想要的自造词,你可以使用方向键选中要删除的候选词,再按下 Fn+Shift+Delete 即可删除。
手册原文:只能夠從用戶詞典中刪除詞組。用於碼表中原有的詞組時,只會取消其調頻效果。
当你打了一段话,发现前面的拼音打错了,或者想单独修改前面的某个字,这时候不用狂按退格键,你可以直接按 Tab 键或 Shift + Tab 在拼音中前后切换光标到对应的拼音。
按照上面的步骤操作下来你已经入门了,这时候如果你想让 RIME 输入法更顺手更符合你的习惯偏好就需要了解进阶概念了。
如果你想调整一些自定义的设置,可以先查看以下两个文件,可以对整体配置有个概念:
cat ~/Library/Rime/default.yaml
这是 Rime 输入法引擎的默认配置文件,大部分跟输入有关的核心配置都在这里# Rime default settings
# encoding: utf-8
#
# 小狼毫似乎不支持 Control+Shift 开头的快捷键,可自行修改成别的。
# 鼠须管在 Sublime Text、Telegram 等个别软件中也无法使用 Control+Shift+数字 的快捷键,可暂时用方案选单切换。
config_version: '2023-03-03'
# 方案列表
schema_list:
- schema: rime_ice
- schema: double_pinyin
- schema: double_pinyin_flypy
# 菜单
menu:
page_size: 5 # 候选词个数
# alternative_select_labels: [ ①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩ ] # 修改候选项标签
# alternative_select_keys: ASDFGHJKL # 如编码字符占用数字键,则需另设选字键
# 方案选单相关
switcher:
caption: 「方案选单」
hotkeys:
# - F4
# - Control+grave
# - Alt+grave
- Control+Shift+grave
save_options: # 开关记忆,从方案选单(而非快捷键)切换时会记住的选项,需要记忆的开关不能设定 reset
- ascii_punct
- traditionalization
- emoji
fold_options: true # 呼出时是否折叠,多方案时建议折叠 true ,一个方案建议展开 false
abbreviate_options: true # 折叠时是否缩写选项
option_list_separator: ' / ' # 折叠时的选项分隔符
# 中西文切换
#
# 【good_old_caps_lock】 CapsLock 切换到大写或切换中英。
# (macOS 偏好设置的优先级更高,如果勾选【使用大写锁定键切换“ABC”输入法】则始终会切换输入法)
#
# 切换中英:
# 不同的选项表示:打字打到一半时按下了 CapsLock、Shift、Control 后:
# commit_code 上屏原始的编码,然后切换到英文
# commit_text 上屏拼出的词句,然后切换到英文
# clear 清除未上屏内容,然后切换到英文
# inline_ascii 无输入时,切换中英;有输入时,切换到临时英文模式,按回车上屏后回到中文状态
# noop 屏蔽快捷键,不切换中英,但不要屏蔽 CapsLock
ascii_composer:
good_old_caps_lock: true # true | false
switch_key:
Caps_Lock: clear # commit_code | commit_text | clear
Shift_L: noop # commit_code | commit_text | inline_ascii | clear | noop
Shift_R: noop # commit_code | commit_text | inline_ascii | clear | noop
Control_L: noop # commit_code | commit_text | inline_ascii | clear | noop
Control_R: noop # commit_code | commit_text | inline_ascii | clear | noop
# punctuator 和 recognizer 由具体方案指定了
punctuator:
full_shape:
half_shape:
symbols:
recognizer:
patterns:
# 快捷键
key_binder:
# 以词定字(上屏当前词句的第一个或最后一个字)
select_first_character:
select_last_character: "grave"
bindings:
# Tab/Shift+Tab 切换光标至下/上一个拼音
- { when: composing, accept: Shift+Tab, send: Shift+Left }
- { when: composing, accept: Tab, send: Shift+Right }
# Tab/Shift+Tab 翻页
# - { when: has_menu, accept: Shift+Tab, send: Page_Up }
# - { when: has_menu, accept: Tab, send: Page_Down }
# 翻页 - =
- { when: has_menu, accept: minus, send: Page_Up }
- { when: has_menu, accept: equal, send: Page_Down }
# 翻页 , .
# 需要额外注释掉方案中 recognizer/patterns 下的 url_2 选项(这个会覆盖掉句号的行为)
# - { when: paging, accept: comma, send: Page_Up }
# - { when: has_menu, accept: period, send: Page_Down }
# 翻页 [ ]
# - { when: paging, accept: bracketleft, send: Page_Up }
# - { when: has_menu, accept: bracketright, send: Page_Down }
# numbered_mode_switch:
# - { when: always, accept: Control+Shift+1, select: .next } # 在最近的两个方案之间切换
# - { when: always, accept: Control+Shift+2, toggle: ascii_mode } # 切换中英
- { when: always, accept: Control+Shift+3, toggle: ascii_punct } # 切换中英标点
- { when: always, accept: "Control+Shift+4", toggle: traditionalization } # 切换简繁
# - { when: always, accept: Control+Shift+5, toggle: full_shape } # 切换全半角
# key_binder 按键速查 https://github.com/LEOYoon-Tsaw/Rime_collections/blob/master/Rime_description.md
cat ~/Library/Rime/squirrel.yaml
这是鼠须管输入法的配置,包含主题配色之类的设置# Squirrel settings
# encoding: utf-8
#
# 内置皮肤展示: https://github.com/NavisLab/rime-pifu
# 鼠须管配置指南: https://github.com/LEOYoon-Tsaw/Rime_collections/blob/master/鼠鬚管介面配置指南.md
# 鼠须管作者写的图形化的皮肤设计器: https://github.com/LEOYoon-Tsaw/Squirrel-Designer
config_version: '2023-02-27'
# options: last | default | _custom_
# last: the last used latin keyboard layout
# default: US (ABC) keyboard layout
# _custom_: keyboard layout of your choice, e.g. 'com.apple.keylayout.USExtended' or simply 'USExtended'
keyboard_layout: default
# for veteran chord-typist
chord_duration: 0.1 # seconds
# options: always | never | appropriate
show_notifications_when: appropriate
# ascii_mode、inline、no_inline、vim_mode 等等设定,可参考 /Library/Input Methods/Squirrel.app/Contents/SharedSupport/squirrel.yaml
app_options:
# com.apple.Spotlight:
# ascii_mode: true # 开启默认英文
# com.microsoft.VSCode:
# ascii_mode: false # 关闭默认英文
style:
# 选择皮肤,亮色与暗色主题
color_scheme: purity_of_form_custom
color_scheme_dark: purity_of_form_custom
# 预设选项:(可被皮肤覆盖;如果皮肤没写,则默认使用这些属性。)
text_orientation: horizontal # horizontal | vertical
inline_preedit: true
corner_radius: 10
hilited_corner_radius: 0
border_height: 0
border_width: 0
line_spacing: 5
spacing: 10
#candidate_format: '%c. %@'
#base_offset: 6
font_face: 'Lucida Grande'
font_point: 21
#label_font_face: 'Lucida Grande'
label_font_point: 18
#comment_font_face: 'Lucida Grande'
comment_font_point: 18
# 皮肤列表
preset_color_schemes:
# 对 purity_of_form 略微调整颜色,让色彩更柔和点,补全其他选项和注释
purity_of_form_custom:
name: "純粹的形式/Purity of Form Custom"
author: 雨過之後、佛振
font_face: "" # 字体及大小
font_point: 18
label_font_face: "Helvetica" # 序号字体及大小
label_font_point: 12
comment_font_face: "Helvetica" # 注字体及大小
comment_font_point: 16
candidate_list_layout: stacked # 候选排布:层叠 stacked | 行 linear
text_orientation: horizontal # 行文向: 横 horizontal | 纵 vertical
inline_preedit: true # 拼音位于: 候选框 false | 行内 true
translucency: false # 磨砂: false | true
mutual_exclusive: false # 色不叠加: false | true
border_height: 0 # 外边框 高
border_width: 0 # 外边框 宽
corner_radius: 10 # 外边框 圆角半径
hilited_corner_radius: 0 # 选中框 圆角半径
surrounding_extra_expansion: 0 # 候选项背景相对大小?
shadow_size: 0 # 阴影大小
line_spacing: 5 # 行间距
base_offset: 0 # 字基高
alpha: 1 # 透明度,0~1
spacing: 10 # 拼音与候选项之间的距离 (inline_preedit: false)
color_space: srgb # 色彩空间: srgb | display_p3
back_color: 0x545554 # 底色
hilited_candidate_back_color: 0xE3E3E3 # 选中底色
label_color: 0xBBBBBB # 序号颜色
hilited_candidate_label_color: 0x4C4C4C # 选中序号颜色
candidate_text_color: 0xEEEEEE # 文字颜色
hilited_candidate_text_color: 0x000000 # 选中文字颜色
comment_text_color: 0x808080 # 注颜色
hilited_comment_text_color: 0x808080 # 选中注颜色
text_color: 0x808080 # 拼音颜色 (inline_preedit: false)
hilited_text_color: 0xEEEEEE # 选中拼音颜色 (inline_preedit: false)
# candidate_back_color: # 候选项底色
# preedit_back_color: # 拼音底色 (inline_preedit: false)
# hilited_back_color: # 选中拼音底色 (inline_preedit: false)
# border_color: # 外边框颜色
碰到你想修改的配置项,有两种修改方案:
修改配置文件后记得重新 Deploy。
cat ~/Library/Rime/custom_phrase.txt
查看现有短语和配置说明对于拼音输入法来说,不管是全拼还是双拼,都面临一个问题:重码。相同的拼音对应多个发音类似的词语,如果第一屏候选词没出现用户想要的词,就会严重影响输入效率。
一款输入法好不好用,在很大程度上是看这款输入法的字典好不好用,字典不是越大越多越好,而是要契合用户的使用场景,越大的字典重码率通常会越高,越容易让用户感觉首屏候选词经常出现不了自己想要的词。
根据自己的日常使用场景来挂载对应的词库,并在平时逐步定制积累自定义词库是一个不错的选择。
本文使用的雾凇拼音已经默认做了很多输入优化和字典优化,如果你使用一段时间后想实现更好的打字效果,制作你的自定义字典是个不错的选择(当然你多次重复输入一个词语也会自动造词的)
举个例子,一些大公司喜欢让员工起花名,随着时间推移员工人数飞速增长,起两个字的中文花名就是个很困难的事情,所以经常能看到许多新员工的花名奇奇怪怪,生僻字和谐音很常见。这时候你用拼音输入法打同事的花名就非常麻烦和难受。针对这种情况就可以用自定义字典很好的解决,后续输入同事的花名效率就会非常高。
要制作自定义字典,请先切换到 Rime 的用户配置目录:cd ~/Library/Rime
先查看雾凇拼音的默认字典配置:cat rime_ice.dict.yaml
# Rime dictionary
# encoding: utf-8
---
name: rime_ice
version: "2023-03-04"
import_tables:
- cn_dicts/8105 # 字表
# - cn_dicts/41448 # 大字表(按需启用)
- cn_dicts/base # 基础词库
- cn_dicts/sogou # 搜狗流行词
- cn_dicts/ext # 扩展词库
- cn_dicts/tencent # 腾讯词向量(大词库,部署时间较长)
- cn_dicts/others # 一些杂项
# 建议把扩展词库放到下面,有重复词条时,最上面的权重生效
# 下面两个是我自己加的自定义字典
- cn_dicts/names # 自定义人名词库
- en_dicts/my_en_ext # 扩充英文词语
...
编辑自定义字典:vim cn_dicts/names.dict.yaml
,这里的 names.dict.yaml 要改成你自己的字典名称。
内容是这样的:
---
name: names
version: "1"
sort: by_weight
...
维恩 wei en 100
步鲁斯 bu lu si 100
这里需要格外注意字典内容的缩进,正确的示例如下,用 Tab 分割不同的列,用空格分割拼音:
拼音 pin yin 1234
拼音<Tab>pin<Space>yin<Tab>1234
最好不要直接复制这段配置(制表符被转换为空格了),RIME 解析字典要依赖制表符识别不同的列,在编辑字典文件的时候记得先将编辑器缩进模式设置为 Tab 模式,建议先查看雾凇拼音的文档:编写词库,如果字典里的词没出现在首屏,可以增加权重,例如:1000000,默认建议先设置 100 就可以了。
通过几分钟时间你可以快速配置出一个好用、安全、隐私、轻量的输入法,它可以充分按照你的习惯和需求去定制,而且 RIME 有一个不错的用户手册可供你参考。如果你在意以上这些特点,那 RIME 可能是目前最好的选择。虽然它并不是完美的,也有一些小毛病,就看你怎么取舍了。
如果你想在 iOS 上也使用和 Mac 相同的词库,可以试一试 iOS 上的一款 Rime 实现:仓输入法。我自己实测下来直接将 Mac 端 Rime 配置导入到 iOS 端的仓输入法可以正常使用,不过得手动同步有些低效。
要获得最佳阅读体验,请访问原文 https://baiyun.me/rime-simple-tutorial
2023-03-03 21:40:24
很多开发者都会全局设置 Git 用户名和邮箱,这样会导致所有 Git 仓库的 Commit 信息默认都使用全局用户名和邮箱配置。推荐的做法是工作相关项目用工作邮箱,个人相关项目用个人邮箱。
我们可以使用 Git 的 includeIf 功能为不同的 Git 仓库设置不同的电子邮件地址,并实现自动化。这个功能可以根据 Git 仓库的路径自动加载指定的配置文件。
以下是具体步骤:
首先创建不同的 Git 配置文件。例如,可以在你的家目录中创建两个文件 .gitconfig-personal
和 .gitconfig-work
,并分别为个人项目和工作项目设置不同的用户配置。可以使用以下命令创建这些文件:
touch ~/.gitconfig-personal
touch ~/.gitconfig-work
使用 vim 编辑以上两个 Git 配置文件:
[user]
name = Your Name
email = [email protected]
将 "Your Name" 和 "[email protected]" 替换为你要用的名称和邮箱地址。
最后编辑 ~/.gitconfig
文件,将以下代码添加到文件的末尾:
[includeIf "gitdir:/path/to/personal/"]
path = ~/.gitconfig-personal
[includeIf "gitdir:/path/to/work/"]
path = ~/.gitconfig-work
在上面的代码中,/path/to/personal/
和 /path/to/work/
分别是个人项目和工作项目的所处的目录,可以根据你的实际情况替换。
这些代码的作用是在匹配到 Git 仓库的路径时自动加载相应的配置文件。例如,如果进入个人项目的 Git 仓库目录,Git 将自动加载 ~/.gitconfig-personal 文件,并使用其中定义的用户名和邮箱地址。
以上,你已经为不同的 Git 仓库设置了不同的邮箱地址,并实现了配置自动化生效。
最后从安全角度推荐使用 ssh 协议和 git 仓库交互。
要获得最佳阅读体验,请访问原文 https://baiyun.me/set-different-emails-for-git-repos
2022-10-02 11:27:37
钱包是进入加密世界的入口,现在市面上的钱包软件玲琅满目,其中不乏有些鸡鸣狗盗之徒。所以对于新手来说选择一个安全可靠且趁手的钱包是至关重要的。
关于如何选择,我建议优先考虑以下几个点:
下面是我个人的一些推荐,排名越靠前越推荐新手使用
注意下载来源,尤其是安卓和 PC 用户,下载钱包我都推荐用 https://google.com 搜索钱包名称,通常第一个就是官网(注意不要点广告)。再次强调:安卓用户非常不推荐在国产应用商店里下载钱包。
可以,主流钱包软件都遵循 BIP 协议规范,所以助记词在这些钱包之间是通用的。
要获得最佳阅读体验,请访问原文 https://baiyun.me/how-to-choose-a-crypto-wallet