之前写过一篇文章如何搭建自己的 AdGuard Home 去广告,过去很久了,现在在一台新的 Ubuntu 设备上再次安装 [[AdGuard Home]],再次记录一下如何解决 53 端口被占用的问题。
因为 AdGuard Home 要通过 53 端口提供 DNS 解析的功能,但是默认情况下 Ubuntu 的 systemd-resolved 会占用 53 端口来提供本地的 DNS 解析缓存服务。
使用 sudo lsof -i :53
或者 netstat 命令查看
编辑配置文件
sudo vim /etc/systemd/resolved.conf
修改文件
[Resolve]
DNS=1.1.1.1
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
DNSStubListener=no
#ReadEtcHosts=yes
将其中的 DNS 和 DNSStubListener
字段做如上修改。
然后重启服务
sudo systemctl restart systemd-resolved.service
再次查看 53 端口,没有被占用,之后就可以启动 AdGuard Home 了。
systemd-resolved 是 systemd 中提供的一个 DNS 解析器服务。它可以自动管理 /etc/resolv.conf 文件,并提供一些额外的功能,例如:
systemd-resolved 默认情况下是启用的。如果启用了 systemd-resolved,它会将 /etc/resolv.conf 文件配置为指向一个符号链接,该符号链接指向 systemd-resolved 管理的 stub-resolv.conf 文件。stub-resolv.conf 文件包含了 systemd-resolved 提供的 DNS 服务器信息。
如果您想要手动配置 /etc/resolv.conf 文件,需要先禁用 systemd-resolved 服务。您可以通过以下命令禁用 systemd-resolved 服务:
sudo systemctl disable systemd-resolved
禁用 systemd-resolved 服务后,/etc/resolv.conf 文件将不再被自动管理。您可以直接编辑 /etc/resolv.conf 文件,并重启网络服务使更改生效。
Hono 是一个运行在边缘节点的 JavaScript Edges Web 框架,可以在任何支持 JavaScript 运行的服务上,包括 Cloudflare Workers,Fastly Compute@Edge,Deno,Bun,Vercel,Netlify,Lagon,AWS Lambda,Lambda@Edge 和 Node.js。
Hono 的特点就是简单,轻量,快。
hono/tiny
只有 14kB,零依赖下面是一些具体的使用 Hono 的产品
创建项目
pnpm create hono my-app
我创建了一个项目,接受上传图片,并生成一个随机的图片名称,然后上传到 Cloudflare R2。代码见GitHub。
然后配套 uPic 直接上传到 R2,然后获取 R2 的直接链接。
Head
Content_Type: multipart/form-data
Authorization: Bearer my-secret-token
采用 form-data
上传,文件 key 是 file。
因为时不时需要有打印和复印的需求(日本政府总有一些奇怪的手续需要提供纸质的材料),之前看到有人出家用打印机就用 3000 JPY 买了一台,这是一台 Canon TS3330。下面记录一下我自己的初始化过程以及更换墨盒的过程,以备自己后续查看。
佳能打印机 A4 喷墨多功能 PIXUS TS3330 白色 Wi-Fi 兼容。
墨盒
canon ts3330 説明書
或者访问 https://ij.start.canon 访问,然后查询型号,查看交互式教程。
或者直接访问 TS3330 的手册。
以防万一,我也做了一个备份。
首先将打印机连接电源,然后按下电源键启动。等待启动完成,将打印机前部分的往下拉开。
然后就能看到墨盒的位置
左边是彩色的,右边是黑白的。
安装的时候有一定的倾角。
安装的时候需要有一个向上的按压操作。
直至两边对齐
访问 https://ij.start.canon 下载桌面版的应用,根据应用上的提示完成 WiFi 初始化。
当完成 WiFi 连接之后,打印机在本地网络中就会存在一个 IP 地址,直接通过浏览器访问这个 IP 地址,可以对打印机进行一些管理。比如
今天在浏览 LinkedIn 的时候,突然看到日本公司的 JD 中对语言的要求其中出现了一个关键字 CEFR C1 / B2 。好奇心使然,让我想了解一下这个我没有见到过的英语能力等级是什么。
在中文的语境中经常会看到 CET-4,CET-6,或者 TOEFL,ITLTS,甚至前不久还看到了 [[Duolingo]] 推出的英语能力测试,Duolingo 的英语能力测试因为能通过在线获取,所以在疫情期间还得到了很大的发展。
CEFR 是 Common European Framework of Reference for Languages 的缩写,即欧洲语言共同参考框架。它是一个由欧洲委员会制定的语言能力分级系统,用于描述语言学习者在不同水平上的语言能力。
CEFR 将语言能力分为六个级别:A1、A2、B1、B2、C1 和 C2。C1 是第五个级别,属于高级水平。
CEFR C1 水平的语言学习者能够:
CEFR C1 水平的语言学习者可以胜任以下任务:
在我调查的过程中发现了一个网站 EF SET 这个网站也有对于 C1 的具体介绍,这个阶段,是能够熟练应用英文进行交流,对大部分的事物都可以给出具体准确的描述而不需要提前准备。
最后分享一下我进行的 15 分钟的测验,希望明年能上到 90% 以上吧。
这一期的 21 天计划中,我将了解和学习 React 并使用 React 制作一个简单的网站列入了计划,和之前学习了解 [[Lavarvel]] 一样,我在笔记里面制作了一个短期的学习计划,并看了一些官网的教程和书籍的目录,制定了几大块的知识点。这是这个系列的第一篇文章。
[[React]] 是一个用来构建用户界面的 JavaScript 库,用于构建 UI 界面,起源于 Facebook 的内部项目,用来构建 Instagram 的网站,于 2013 年 5 月开源。React 拥有较好的性能,代码逻辑简单,现在已经有很多项目使用 React 来实现,并且占据了当前前端开发的市场,另外一大山脉 [[Vue]] 等有时间再看看吧。
和之前 [[Laravel]] 一样,主要的目的是为了可以快速实现一些小的想法,之前有很多想法都停留在 Todo-List 里面,如果有一个顺手的工具,就可以快速实现。另外一个目的就是为了看懂现在的开源代码,以及一些感兴趣的项目。初步的目的只是为了能看懂,并且能在此基础上做一些小的改动吧。
为什么要学 React
React 会在内存中创建 Virtual DOM,React 会首先将修改应用到内存的 Virtual DOM 中,然后再将修改反应到浏览器的 DOM 中。React 只会去渲染需要修改的内容。
每一次学习新的东西,最开始就是要了解概念,React 中有一些非常核心的概念,这里先列举一下,之后还会展开。
下面的方法定义了一个最基本的组件,包括了一个叫 name 的状态。
function MyComponent() {
const [name, setName] = useState("John Doe");
return (
<div>
<h1>Hello, {name}</h1>
<button onClick={() => setName("Jane")}>Click here to set name</button>
</div>
);
}
因为我使用 asdf ,所以直接安装 Node.js 即可。
asdf install nodejs 20.10.0
TypeScript 是一种向 JavaScript 代码添加类型定义的常用方法。TypeScript 天然支持 JSX——只需在项目中添加 @types/react
和 @types/react-dom
即可获得完整的 React Web 支持。
要使用 React,首先需要 npm 和 Node.js 环境。
通过 npm 安装, 使用 create-react-app
构建一个 React 开发环境,这个环境包括了常用的工具比如 [[Webpack]],ESLint 等。
npx create-react-app my-react-app
运行代码
npm start
JSX 是一种 JavaScript 语法扩展,用于将 HTML、JavaScript 和 CSS 代码混合在一起。JSX 使 React 开发人员能够以更简洁的方式编写代码。
JSX 语法简化了 React 的开发,在编译时会自动转化为 JavaScript 代码,并编译成输出 HTML。
可以来看一个简单的例子
const MyComponent = () => {
return (
<div>
<h1>Hello, world!</h1>
<button onClick={() => console.log("Hello, world!")}>Click me</button>
</div>
);
};
return (
<div>
<h1>Hello World!</h1>
<p>This is my first React component.</p>
</div>
)
className
而不是 class
<div className="my-class">This element has a CSS class.</div>
<div>{myVariable}</div>
<button onClick={handleClick} className="btn">Click me!</button>
<div></div>
<img src="my-image.jpg" alt="My Image"/>
前不久介绍了一个 面向开发者的垂直搜索引擎 devv.ai,通过 AI 的加持,搜索结果通常比较精确。今天又发现了一款相似的产品 phind,主要使用的语言是英语。同样是经过训练的面向开发者的文档,所以结果更加精确。
phind 由大语言模型驱动,因为专门使用高质量的语料库进行训练,所以在技术文档,计算机方面的检索和质量要相对精确一些。
phind 的使用非常简单,相较于通用性的 ChatGPT,phind 可以给出更加精确的编程问题答案。相对于需要注册 ChatGPT,phind 打开就能用。
phind 的使用非常简单,只有一个输入框,和通用搜索引擎一样使用即可。
大语言模型的出现,让我自己产生了非常大的惰性,以往如果要查询一个非常专业的问题,我通常会自己去更换不同的关键字进行搜索,有些时候往往就是一个关键字的问题就会出现很不一样的结果,通常用比较精确的文字查找效率会高很多。
但是自从有了 [[ChatGPT]],[[Bard]] 一类的产品,我就变得非常懒惰,直接使用日常的语言进行搜索,而这个时候往往 AI 也能够给出一个相对比较具体的方向,然后继续这个方向追问,基本上也能找到我需要的内容。
尤其是最近使用 JetBrains 的 AI Assistant ,以及 GitHub Copilot Chat,在选中部分代码作为上下文的情况下,给出的答案基本上都是需要的,非常精确。
日常遇到编程相关的问题,不妨试试 phind,或者 devv.ai 这样的垂直类搜索引擎,也还可以借助编程工具,辅助解决问题。
Navidrome 是一个现代的音乐服务器,兼容所有的 Subsonic/Airsonic 客户端。
Navidrome 后端使用 Go 语言编写,前端基于 React,界面风格采用 Material UI,串流音乐的接口兼容 [[Subsonic]],所以支持 Subsonic 的客户端都可以使用。
Navidrome 是什么呢,引用官网的原话:
Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device.
Navidrome 是一个自托管的开源音乐服务器和流媒体。它让您可以自由地从任何浏览器或移动设备收听您的音乐收藏。
特点:
缺点:
我从 2014 开始使用网易云音乐,几乎很长时间没有变过,但是大家也知道网易云音乐前几年的「变化」,我歌单中的内容就一天天变得不可用(变灰),直接导致产品体验直线下降,虽然还可以使用网易提供的 2T 云盘来解决一部分版权问题,但是还是一些不方便。
于是之后买入了 Plex Pass 之后就将我的音乐库迁移到了 [[Plexamp]],在 Plexamp 下也用了很长一段时间,虽然中间也接触了 Funkwhale 等等,但简单的尝试之后还是停留在了 Plexamp 中,但是最近发现 Plexamp 存在了一些致命的问题让我不得不考虑切换,就是我使用 Syncthing 同步我的音乐库,但是 Plex 扫描的时候经常无法发现我新添加的歌曲,虽然我按照官方的文档无数遍修改文件目录,但依然无法添加到 Plex 中,这个问题困扰了我很久,我不清楚是 Plex 支持的文件格式有限,还是哪个地方设置不对,反正就是添加不了,于是我发现了 [[Navidrome]],大致地看了一下官方网站的介绍,支持的文件格式非常齐全,扫描速度非常快,并且还提供了一个 Web UI,即使不安装客户端也可以在线听歌,兼容 Subsonic 客户端,这就使得我可以有非常多的音乐客户端选择。
官方文档提供了非常多的安装方式,个人还是比较喜欢 Docker Compose 来安装启动,配置可以参考我的 dockerfile。
git clone https://github.com/einverne/dockerfile.git
cd navidrome
# create and modify .env
docker-compose up -d
# check log
docker-compose logs -f
因为我个人使用 [[Nginx Proxy Manager]] 来反向代理 Navidrome 实例,所以里面多配了一些 Nginx 代理的选项,可以根据自己的需要配置。如果不配置 Nginx 代理,可以直接使用端口来访问。
panic: chi: routing pattern must begin with ‘/’ in ‘”“/auth’
如果安装的过程中遇到这个报错,那么查看一下 docker-compose.yml 文件中的 ND_BASEURL
,如果留空就会抛出上面的错误。
比如,安装完成之后访问 http://your-vpsip:4533/,首次登录会要求创建管理员账户,和密码。
一旦完成安装,就会发现 Navidrome 在扫描音乐库了。登录后台,进行个性化的配置,比如修改语言,对接 Last.fm,ListenBrainz 等等。至此,Navidrome 音乐服务端已经安装完成。
等路自己的 Last.fm 帐号
访问 https://www.last.fm/api/account/create 创建一个 API 账户,填写应用程序名称。获取 API Key 和 Shared Secret。
然后将值分别放到 Docker
ND_LASTFM_ENABLED=true
ND_LASTFM_APIKEY
ND_LASTFM_SECRET
ND_LASTFM_LANGUAGE
配置好重启容器之后,在后台记得开启 Scrobble to Last.fm 。
首先创建一个免费的 Spotify 账户,然后访问开发者面板 填写表单,创建。获取 Client ID 和 Client Secret。
添加 Spotify 有一个好处就是可以显示歌手艺术家的照片,图像从 Spotify 获取。
ND_SPOTIFY_SECRET
官方文档上提供了非常多的 客户端 选择。
客户端
个人推荐
brew install --cask sonixd
macOS 下的 Sonixd
Navidrome 的安装教程就到这里,如果你只是想要开箱即用的 ,如果想要了解 Navidrome 的进阶设置,可以收藏订阅本网站。
时隔多年,我再安装了一次 [[NextCloud]],很早之前 就在我的 QNAP TS 453B mini 上安装并使用了多年,这两年也一直在跟随着官方的版本升级 ,但是 QNAP 毕竟在局域网内,虽然可以使用 Tailscale,ZeroTier 等等工具来组件局域网,但毕竟还是不方便,最近入手一台还不错的 VPS,所以想着再搭建一个公有 IP 的 NextCloud,一方面备份一下自己的相册,另一方面也补足一下我自己使用 Syncthing时没有在线预览的页面,导致常常有些时候想访问自己的笔记而找不到。
在调研的时候发现 NextCloud 现在有两个比较常用的镜像,一个是我之前一直使用的 nextcloud 镜像,调查了一下才发现原来这个镜像是社区维护的,官方还推出了一个 All-in-One 的镜像,集成了 NextCloud 所依赖的组件,包括数据,Web 服务器等等。因为我个人还是对原来的那个 nextcloud 镜像比较熟悉,所以还是用来原来的那个镜像,一来镜像比较小,而来比较轻量,可以自己选择需要的组件,搭配 MySQL (Maria) 还是比较好维护的。
NextCloud 的 Docker 镜像有两个:
一个是社区维护的,一个是包含了其他依赖组件的多合一镜像。如果非要说区别,就是 nextcloud 镜像比较小,只包含了 Nextcloud 自身,需要用户自己准备数据库,Web 服务器等。而 All-in-One 镜像则包含了数据库,Web 服务器等等,但是镜像的提及也比较大。All-in-One 的镜像中包含了 Apache,Database,Nextcloud,Notify Push,Redis,Collabora,Talk,Imaginary 等等组件。
通过环境变量来配置 SMTP
SMTP_HOST
(not set by default): The hostname of the SMTP server.SMTP_SECURE
(empty by default): Set to ssl
to use SSL, or tls
to use STARTTLS.SMTP_PORT
(default: 465
for SSL and 25
for non-secure connections): Optional port for the SMTP connection. Use 587
for an alternative port for STARTTLS.SMTP_AUTHTYPE
(default: LOGIN
): The method used for authentication. Use PLAIN
if no authentication is required.SMTP_NAME
(empty by default): The username for the authentication.SMTP_PASSWORD
(empty by default): The password for the authentication.MAIL_FROM_ADDRESS
(not set by default): Use this address for the ‘from’ field in the emails sent by Nextcloud.MAIL_DOMAIN
(not set by default): Set a different domain for the emails than the domain where Nextcloud is installed.搭建之后使用系统的检查,建议使用 Redis 来做缓存,所以又加上了 Redis。
REDIS_HOST
(not set by default) Name of Redis containerREDIS_HOST_PORT
(default: 6379
) Optional port for Redis, only use for external Redis servers that run on non-standard ports.REDIS_HOST_PASSWORD
(not set by default) Redis passwordNautilus File Manager
davs://example.com/nextcloud/remote.php/dav/files/USERNAME/
KDE Dolphin File Manager 中
webdav://example.com/nextcloud/remote.php/dav/files/USERNAME/
https://cloud.YOURDOMAIN.com/remote.php/dav/files/USERNAME/
https://example.com/nextcloud/remote.php/dav/files/USERNAME/
可以通过 https://data.einverne.info/settings/admin/serverinfo 来查看当前 PHP 支持的最大上传大小。
默认情况下是 512MB 大小。
修改 Docker 的环境变量
PHP_MEMORY_LIMIT=2048M
PHP_UPLOAD_LIMIT=2048M
然后就可以得到
当然如果你使用 All-in-One 的 NextCloud 镜像,那就不用担心这个问题了,默认就是 10GB,应该能满足 99%的需求了。
检查的时候遇到如下的问题:
The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips ↗.
直接在 [[Nginx Proxy Manager]] 中启用 HSTS 即可。
如果遇到如下的问题
The database is used for transactional file locking. To enhance performance, please configure memcache, if available. See the documentation ↗ for more information.
然后安装 Redis,然后配置 Redis 即可。
Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add “default_phone_region” with the respective ISO 3166-1 code ↗ of the region to your config file.
对应此问题,在 NextCloud 的 config 配置中添加 sudo vi ~/nextcloud_data/config/config.php
'default_phone_region' => 'JP',
然后重启容器即可。
需要修改 sudo vi ~/nextcloud_data/config/config.php
,然后添加
'overwriteprotocol' => 'https',
最终:
'dbtype' => 'mysql',
'version' => '27.1.3.2',
'overwriteprotocol' => 'https',
之前我都一直使用 [[Plex]] 来同步看视频,基本上可以做到秒级别的共享观看。今天看 GitHub 的时候发现一款叫做 SyncTV 的应用,也是可以通过同步的方式了共享观看视频流,那这样就可以一起看视频,看直播了。原来 Plex 的因为放在了一台欧洲的服务器上,在国内播放的时候总是会出现卡顿,一来是带宽限制,二来是经常发现有转码,所以常常需要我预先转码为低码率的视频才能流畅播放,出现的这个 SyncTV ,我可以搭配一台地理位置比较好的,比如日本的机器,然后通过代理的方式播放,不知道会不会提升一下使用体验。
SyncTV 使用同步的功能,确保了观看视频的人都在同一个时刻,并且可以暂停,回退,快进,每一个人的状态也都是同步的。SyncTV 也支持直播流。SyncTV 也提供了一个私密的 Theater,可以在其中进行聊天,实时交流。
SyncTV 是一个可以让用户远程一起观看电影或者直播的程序,SyncTV 使用 Go 语言编写。它提供了同步观看,在线聊天的功能。使用 SyncTV 可以与朋友和家人一起观看视频和直播。
SyncTV 可以保证所有观看的人都在同一个时间点上,这意味着暂停、回退或者快进视频都可以同步到其他人,SyncTV 不仅可以添加视频流,还添加直播流。
功能:
[[SyncTV]] 因为是 Go 语言实现,所以可以直接通过脚本二进制安装,我这里则使用 Docker 安装,详细的配置可以参考我的 dockerfile。
安装完成之后可以通过 [[Nginx Proxy Manager]] 或其他工具反向代理端口。
因为我安装的时候把目录映射到了 ~/synctv
下, 所以可以修改该目录下的配置文件来配置 SyncTV。
可以简单看一下默认的配置文件
❯ cat ~/synctv/config.yaml
log:
enable: true
# can be set: text | json
log_format: text
# if it is a relative path, the data-dir directory will be used.
file_path: log/log.log
# max size per log file
max_size: 10
max_backups: 10
max_age: 28
compress: false
server:
http:
listen: 0.0.0.0
port: 8080
# enable http3/quic need set cert and key file
quic: true
cert_path: ""
key_path: ""
rtmp:
enable: true
listen: "" # default use http listen
port: 0 # default use server port
jwt:
secret: rN
expire: 48h
database:
# support sqlite3, mysql, postgres
type: sqlite3 # default: sqlite3
# when type is not sqlite3, and port is 0, it will use unix socket file
host: ""
port: 0
user: ""
password: ""
# when type is sqlite3, it will use sqlite db file or memory
db_name: synctv # default: synctv
# mysql: true, false, skip-verify, preferred, <name> postgres: disable, require, verify-ca, verify-full
ssl_mode: ""
# when not empty, it will ignore other config
custom_dsn: ""
# sqlite3 does not support setting connection parameters
max_idle_conns: 4
max_open_conns: 64
conn_max_lifetime: 2h
conn_max_idle_time: 30m
oauth2:
providers:
github:
client_id: 55a
client_secret: 3ea33
redirect_url: ""
google:
client_id: 2382
client_secret: GOC
redirect_url: ""
plugins: []
rate_limit:
enable: false # default: false
period: 1m
limit: 300
# configure the limiter to trust X-Real-IP and X-Forwarded-For headers. Please be advised that using this option could be insecure (ie: spoofed) if your reverse proxy is not configured properly to forward a trustworthy client IP.
trust_forward_header: false # default: false
# configure the limiter to use a custom header to obtain user IP. Please be advised that using this option could be insecure (ie: spoofed) if your reverse proxy is not configured properly to forward a trustworthy client IP.
trusted_client_ip_header: ""
vendor:
# default use local vendor
bilibili: {}
默认使用 sqlite3 作为数据库,自己用也差不多可以了。
启动之后,进入网页,非常简洁,因为配置了使用 GitHub OAuth2,所以直接使用 GitHub 登录。
登录之后可以创建房间,然后在设置中添加播放的地址,视频直链,或者直播源,或者 Bilibili 视频,因为 B 站视频最简单,我就尝试了一下,但是发现 SyncTV 只能解析 480P 的视频源,还是有一些影响观感的。
如果不想看了依旧可以左下角删除房间,这些操作需要房主才可以操作,其它人只能播放或者暂停。
如果要添加视频直链,可以考虑一下使用 [[AList]] 或者直接 Nginx 共享一个出来。
Coolify 是一个可以自托管的,类似 [[Heroku]] / [[Netlify]] / [[Vercel]] 的 [[PaaS]] 服务。
用户只需要在后台点击就可以托管应用,数据库,或其他开源服务。
Coolify 是一个开放源代码的项目,但是如果你觉得 Coolify 很棒,也可以通过付费,或者捐赠来支持作者。
为了安装 Coolify 需要满足最低的资源要求
在 root 下,一键安装脚本
apt install curl wget git jq jc
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
上述一键安装的脚本,会安装 Docker 并做一些配置,并启动 Coolify 容器。
注意容器启动之后会使用 8000 端口,注意在防火墙中放行。Coolify 还会用到如下的端口
需要注意的是如果使用 Coolify 自带的应用安装,可能有一些应用需要提供域名,单纯的使用 IP 和端口无法正常访问。
安装之后,第一个注册的用户就是管理员,可以查看部署所有的资源,应用等等。
因为 Coolify 是基于 Docker 的,所以也可以选择手动安装。
之后每个注册的用户都拥有自己的团队,资源,只能访问自己的资源。
服务列表
支持服务列表包括并不局限于如下:
sslip.io is a DNS server that maps specially-crafted DNS A records to IP addresses (e.g. “127-0-0-1.sslip.io” maps to 127.0.0.1).