逃离豆瓣之豆瓣代替服务

这篇笔记新建的时间是 2020 年 12 月 29 号,想来从那个时间点开始我就一直想着怎么离开豆瓣了。过去一年时间里面陆陆续续也发现了不少不错的网站,甚至有一些比豆瓣都要好用。这里就再整理一下。

豆瓣让我不能忍受的便是对词条的删减,以及对用户笔记,影评,书评的肆意审查,基本导致了现在豆瓣陷入不可用的状态。

我也曾经说过,我离不开豆瓣的几个理由:

  • 我过去几千条的标注
  • 豆瓣关注的有趣的灵魂
  • 还有无数的有价值的影评,书评

豆瓣电影 剧集

NeoDB

NeoDB 是一个建立在 federated network (联邦网络)中的用来标记书籍、电影、音乐和游戏的网站。

NeoDB 目前只能通过 [[Mastodon]] (或[[Pleroma]]/Friendica/PixelFed)实例的账号来登录。

我的页面:https://neodb.social/users/einverne@m.gtk.pw/

themoviedb

themoviedb 简称为 TMDB ,是一个从 2008 年开始的电影,剧集数据库。拥有非常全的数据库。

TMDB 也开放了编辑入口,所有的注册用户都可以贡献,和当年的豆瓣非常相似,官方也有非常详细的 贡献指南

themoviedb

看网站的设计,词条的界面,数据也非常详细,设计也不错。

themoviedb movie item

Trake.tv

[[trakt]] 是一个电视剧和电影媒体资源订阅追踪平台,电视界的 IMDB。可以认为是一个电视剧的数据库,有每个电视剧的元数据,至少包括剧名、首播时间、是否完结、长度、季、集、语言、国家、简介、类别、演员,链接到官网,IMDB,TMDB,TVDB,Wiki 等的链接等等。而且这些数据是公开的,有非常多 App 在使用他作为基础数据提供其他服务。

Trakt 相较于豆瓣更好的地方在于可以和第三方的应用交互,比如在 Plex 中看完一集之后可以自动同步到 trake。

Trakt 还支持 [[Kodi]], [[Plex]], [[Emby]], [[Netflix]], [[Infuse]], [[Jellyfin]], [[MediaPortal]], [[MrMC]], [[Stremio]], [[Serviio]], [[VLC]] 等等。

trakt-vip

Trakt 还提供了 VIP 增值服务,包括了如上的功能。个人 30$ 一年起步,还有另外一个是 60$ 一年。

LetterBoxd

LitterBoxd 是另一个可以标记看过电影的网站。不过 LetterBoxd 只支持电影。

首页:

letterboxd

词条页面

letterboxd item

TVDB

TBDB 是专注在剧集的网站。

IMDB

IMDB 就不用多说了,老牌的电影资料站。

豆瓣读书

Google Books

https://books.google.com

  1. 支持图书目录预览,支持标题,ISBN 搜索,支持浏览记录等等
  2. 支持标注想读(To read),在读(Reading now),读过(Have read),支持打分,甚至也是 1-5 分,支持填写 review
  3. 支持一键链接到网络商城购买,支持跳转到 Google Play 购买电子版

Google Book 的 API 文档:

google book search

Goodreads

Amazon 收购而来的网站,和 Kindle 搭配使用。

thestorygraph

可以用来追踪阅读进度,以及管理看过书籍。

豆瓣音乐

本人不怎么使用豆瓣音乐,所以没怎么整理,不过 Last.FM 已经存在很多年了。数据也比较全。


2022-05-12 douban , movie , book management , personal-data , track , 豆瓣 , douban

Proxmox 扩展 VM 虚拟机磁盘容量

之前在 Proxmox 上给 Ubuntu 划分了 64GB 的空间,运行一段时间之后磁盘空间剩余不多,就抽时间扩展一下。本文就记录一下给 Proxmox VE 的虚拟机扩展的过程。其实之前的文章里面也略微提到过一些,但是没有完整记录。

本来想着是这一篇文章把虚拟机的扩展和缩减空间一并整理了,但写着写着篇幅就比较大了,本文最后还是集中在扩容部分,缩减(shrink) 部分有机会再整理吧。

扩容之前

在扩容之前,为了防止发生错误,请先备份虚拟机,然后关闭虚拟机操作。

关于备份的操作可以参考: Proxmox VE 下备份和恢复虚拟机

虚拟机磁盘扩容

在 Proxmox VE 管理后台,点击虚拟机,在 Hardware 中选中 Hard Disk,然后在菜单栏中就能看到 Resize disk

proxmox resize vm disk

不过需要注意的是,这里的只能给虚拟机的磁盘增加容量,而不能缩小容量,关于缩小容量的操作以后有机会再写。

图中可以看到原始的虚拟机磁盘分配了 64GB,我又扩容了 64GB。

扩容之后启动虚拟机,SSH 登录,然后执行 df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  1.5M  1.6G   1% /run
/dev/sda2        63G   38G   23G  63% /
tmpfs           7.9G  4.0K  7.9G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/loop0       56M   56M     0 100% /snap/core18/2344
/dev/loop2       62M   62M     0 100% /snap/core20/1434
/dev/loop1       56M   56M     0 100% /snap/core18/2409
mergerfs        5.4T  4.6T  510G  91% /mnt/storage
/dev/loop3       68M   68M     0 100% /snap/lxd/22753
/dev/loop6       44M   44M     0 100% /snap/snapd/15177
/dev/loop7       62M   62M     0 100% /snap/core20/1405
/dev/loop5       45M   45M     0 100% /snap/snapd/15534
/dev/loop4       68M   68M     0 100% /snap/lxd/22526
/dev/sdd1       1.8T  1.6T  196G  89% /mnt/sdb1
/dev/sdb1       1.8T  1.6T  117G  94% /mnt/sdd1
/dev/sdc1       1.8T  1.6T  198G  89% /mnt/sdc1
tmpfs           1.6G     0  1.6G   0% /run/user/1000

可以看到系统分区的容量 /dev/sda2 并没有扩展。

然后检查一下分区,执行 sudo lsblk

❯ sudo lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 55.5M  1 loop /snap/core18/2344
loop1    7:1    0 55.5M  1 loop /snap/core18/2409
loop2    7:2    0 61.9M  1 loop /snap/core20/1434
loop3    7:3    0 67.8M  1 loop /snap/lxd/22753
loop4    7:4    0 67.9M  1 loop /snap/lxd/22526
loop5    7:5    0 44.7M  1 loop /snap/snapd/15534
loop6    7:6    0 43.6M  1 loop /snap/snapd/15177
loop7    7:7    0 61.9M  1 loop /snap/core20/1405
sda      8:0    0  128G  0 disk
├─sda1   8:1    0    1M  0 part
└─sda2   8:2    0   64G  0 part /

可以看到系统的分区 sda2 确实是没有完全占用全部的磁盘(sda)。这个时候我们只需要扩展一下系统分区即可。

我们可以使用很多种方式扩展分区,这里我们就使用 growpart 命令。

在 Debian 和 Ubuntu 下 growpart 命令在 cloud-guest-utils 包中。

sudo growpart /dev/sda 2

结果:

❯ sudo growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=134211584 end=134215680 new: size=268431327 end=268435423

然后执行:

sudo resize2fs /dev/sda2

执行结果:

❯ sudo resize2fs /dev/sda2
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 8, new_desc_blocks = 16
The filesystem on /dev/sda2 is now 33553915 (4k) blocks long.

之后在查询 df -h 就看到空间完美的被使用了。

reference


2022-05-10 proxmox , pve , linux , vm , virtual-machine

使用 lux 下载哔哩哔哩视频

Lux 是一个使用 Go 语言编写的视频下载命令行工具,支持的平台很多,提供了包括 macOS、Windows、Linux 等等平台的命令行支持,安装和使用非常简单的。Lux 原来的名字是叫做 Annie(安妮),对标的是 macOS 上一款非常著名的视频下载软件叫做 Downie(唐尼)。但后来改名成了 Lux。

Lux 支持非常多的视频网站:抖音、哔哩哔哩、半次元、pixivision、优酷、YouTube、爱奇艺、芒果TV、Tumblr、Vimeo、Facebook、斗鱼视频、秒拍、新浪微博、Instagram、Twitter、腾讯视频、网易云音乐、音悦台

项目地址:https://github.com/iawia002/lux

Installation

macOS 下:

brew install ffmpeg
brew install lux

或者从 Release 页面下载,手动安装。

curl "https://github.com/iawia002/lux/releases/download/v0.14.0/lux_0.14.0_macOS_64-bit.tar.gz"

Ubuntu 下安装

sudo apt install ffmpeg
wget "https://github.com/iawia002/lux/releases/download/v0.14.0/lux_0.14.0_Linux_64-bit.tar.gz"
tar zxvf lux_0.14.0_Linux_64-bit.tar.gz
sudo mv lux /usr/local/bin
lux --help

使用

直接下载

Lux 的使用很简单,在终端:

lux "https://www.youtube.com/watch?v=QJXPS0gQ6Eg"
lux "https://www.bilibili.com/video/BV1ZJ411h713"

视频链接给的是播放列表里的第二个视频。如果用youtube-dl下载会自作主张地下载播放列表的第一个视频。在对付B站播放列表方面,Annie比较乖一点。

Annie不仅可以下载视频,如果给的是图片的网址,它就下载图片。

给播放列表的链接就下载播放列表:

下载不同分辨率

首先使用 -i 参数查看可供下载的视频分辨率,-i 参数可以一次添加多个视频链接,空格分隔。

❯ lux -i "https://www.bilibili.com/video/BV1ZJ411h713"

 Site:      哔哩哔哩 bilibili.com
 Title:     【中字】金世正 talk演唱会 全场 非常治愈的谈话
 Type:      video
 Streams:   # All available quality
     [64-7]  -------------------
     Quality:         高清 720P avc1.640028
     Size:            122.36 MiB (128300684 Bytes)
     # download with: lux -f 64-7 ...

     [32-12]  -------------------
     Quality:         清晰 480P hev1.1.6.L120.90
     Size:            108.75 MiB (114028043 Bytes)
     # download with: lux -f 32-12 ...

     [64-12]  -------------------
     Quality:         高清 720P hev1.1.6.L120.90
     Size:            108.57 MiB (113847391 Bytes)
     # download with: lux -f 64-12 ...

     [16-7]  -------------------
     Quality:         流畅 360P avc1.64001E
     Size:            86.10 MiB (90287066 Bytes)
     # download with: lux -f 16-7 ...

     [32-7]  -------------------
     Quality:         清晰 480P avc1.64001F
     Size:            67.43 MiB (70708693 Bytes)
     # download with: lux -f 32-7 ...

     [16-12]  -------------------
     Quality:         流畅 360P hev1.1.6.L120.90
     Size:            67.40 MiB (70670783 Bytes)
     # download with: lux -f 16-12 ...

然后使用 -f 来指定要下载的分辨率:

lux -f 64-7 https://www.bilibili.com/video/BV1ZJ411h713

下载列表

使用 -p 来下载视频列表。

如果要指定列表中的位置,可以使用如下几个选项:

  • -start 从视频列表的第几个开始下
  • -end 下载到几个
  • -items 指定要下载哪几个,比如 1,5,6,8-10
  • -eto B站独有的参数,用于没有标题只有文件名的播放列表

从文件中读取下载链接

可以使用 -F 参数,从包含视频 URL 的文本文件中下载视频:

lux -F /path/to/links.txt

这里也可以用参数-start、-end和-items。

按住ctrl+c可以中断下载,可以续传。

B站上可以用av和ep加数字下载视频,比如:

annie -i ep198381 av21877586

还有三个参数也很有用:

指定保存路径

可以使用 -o 参数后面接路径,来指定将视频保存到该路径下:

lux -o ~/Videos/ URL

使用 -O NAME 来指定输出的名字。

输出 JSON

可以使用 -j 输出 JSON 格式结果。

  • 最出名的 [[youtube-dl]] 还有升级版的 [[yt-dlp]]
  • 适配比较多国内的 [[视频下载工具 you-get]]
  • Go 语言写的视频下载命令行工具 [[lux]]

2022-05-01 lux , bilibili , annie , video

图片压缩工具 Squoosh 离线版

Squoosh 是 Google 推出的一个图片压缩工具。之前整理macOS 初始化设置 的时候就说过,基本上算是必不可少的一个压缩工具了。

如果要大批量压缩图片,之前也介绍过 jpegoptim 和 optipng

如果要实现更加高阶的图片操作,比如 resize, blur, crop, despeckle, dither, drow on, flip, join, re-sample 等等,也可以了解一下 [[ImageMagick]]。

但使用 Squoosh 的过程中有一点不方便的就是 Google 只提供了在线版,之前也在 issue 中提过,官方回复是本来这个工具就是命令行的一个在线化,没有必要再搞一个离线的版本。

但最近发现 GitHub 上有人做出了一个离线版本的 Squoosh。

离线版本的 Squoosh 基于 Electron,并使用了 GoogleChromeLabs 之前开源的在线版。


2022-04-28 macos , linux , application , squoosh , google , electron , google-chrome , image , image-compress

每天学习一个命令:umask 命令简单介绍

在使用 LinuxServer 的 Docker 镜像的时候经常会需要设置 umask 值,这个值的具体作用一直不太清楚,正好整理一下。

什么是 umask

在 Linux 或 Unix 操作系统中,所有的新文件都有默认权限的。umask 命令行允许用户设置文件的 creation mask, 这决定了新创建的文件或目录的权限。

这个配置会被 mkdir, touch, tee 等等一些命令。

在深入了解 umask 之前,首先再来解释一下 Linux 的权限模型。在 Linux 中,每一个文件都三个类别用户组:

  • file owner
  • Group members
  • Everyone else

每一个类别都有三个权限:

  • read
  • write
  • execute

这使用用户可以决定哪些用户允许读、写、执行这个文件。

使用 ls -l dirname 来查看:

drwxr-xr-x 12 einverne users 4.0K Apr  8 20:51 dirname
|[-][-][-]    [------] [---]
| |  |  |        |       |       
| |  |  |        |       +-----------> Group
| |  |  |        +-------------------> Owner
| |  |  +----------------------------> Others Permissions
| |  +-------------------------------> Group Permissions
| +----------------------------------> Owner Permissions
+------------------------------------> File Type

第一个字幕表示文件的类型:

  • d 表示目录
  • - 文件
  • l symbolic link

之后的九位,每三位一组:

  • 第一组,是拥有者的权限
  • 第二组是组权限
  • 第三组是所有人的权限

权限有两种表示方法:

  • Symbolic
  • Numeric

Symbolic annotation

字母 rwx 分别表示读(read),写(write),执行(execute),而 - 表示没有权限。

Numeric

权限还可以使用数字来表示,r 可以使用 4 来表示, w 是 2,x 是 1。

比如 rwxr-xr-x 使用数字表示则是 755.

再回到 umask,在 Linux 系统中,默认的创建文件权限是 666,默认给 user, group, others 读和写的权限。目录的权限是 777。

umask 可以用来查看或改变新文件或目录的权限。umask 只会影响当前 shell 环境。在大部分的 Linux 发行版中,默认的系统级别的 umask value 一般在 pam_umask.so 或者 /etc/profile 中。

直接执行 umask 来查看输出,在我本机输出是 002

umask 值包含了新创建的文件或目录不拥有的权限。

上面提到过,默认的新文件的权限是 666,如果 umask 值是 002 则,新创建的文件权限就是 666-002 结果是 664

用户也可以使用 umask -S 来查看 symbolic notation:

❯ umask -S
u=rwx,g=rwx,o=rx

设置 umask

/etc/profile 中可以设置 umask 值。比如不想要其他用户有任何权限,umask 就要设置为 027.

umask 027

reference


2022-04-26 linux , umask , permission

使用 Mailcow 自建邮件服务器

Mailcow 是一个可以使用 Docker 容器化部署的邮件服务器。

GitHub: https://github.com/mailcow/mailcow-dockerized

Mailcow 的优点

Mailcow 相较于 Mailu 整体比较完整,功能相对比较丰富。

  • 支持二步验证,甚至支持 macOS 指纹验证
  • Webmail 使用 SOGo
  • 支持给每个域名增加管理员
  • 有良好的日志查看系统
  • Sync job 功能可以快速、简单地迁移到另外的提供商
  • Web 界面上可以下载 profile,快速在 macOS 和 iOS 中配置使用

缺点

  • 内存占用比较大,只是部署了 Mailcow 就占去了 3G 内存,如果禁用 Solr 和 ClamAV 可以节省内存,日常占用在 1G~2G,但就丧失了搜索和病毒扫描
  • 用的组件比较多,整体使用体验比 Mailu 慢

安装

Mailcow 整体的搭建过程比较简单,如果之前搭建过 Mailu,实际上,参考官网的教程,并没有太多需要再强调的,甚至如果在同一台机器上,从 Mailu 上迁移过来,只需要修改 [[DKIM]] 记录即可。

提前的 DNS 设置可以参考官网

安装:

git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

然后执行:

./generate_config.sh

交互命令中输入自己的 MAILCOW_HOSTNAME,比如 mail.example.com

然后启动:

docker-compose pull
docker-compose up -d

然后使用配置好的域名 mail.example.com 登录,用户名 admin 密码 moohoo

配置 SSL

编辑 mailcow.conf 然后配置 HTTP_BIND=

编辑 data/conf/nginx/redirect.conf:

server {
  root /web;
  listen 80 default_server;
  listen [::]:80 default_server;
  include /etc/nginx/conf.d/server_name.active;
  if ( $request_uri ~* "%0A|%0D" ) { return 403; }
  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }
  location / {
    return 301 https://$host$uri$is_args$args;
  }
}

重启:

docker-compose up -d
docker-compose restart nginx-mailcow

使用

进入后台之后,在 Configuration->Mailboxes 添加域名。

客户端设置

几个端口:

Service Encryption Port
IMAP STARTTLS 143
IMAPS SSL 993
POP3 STARTTLS 110
POP3S SSL 995
SMTP STARTTLS 587
SMTPS SSL 465

reference


2022-04-23 mailcow , mail , email , email-server , linux , docker , smtp , spf

使用 Husky 来管理 git hook

今天在 GitHub 上看到一个 repo,在其根目录中包含了一个 .husky 的文件夹,好奇之下就去搜索了以,于是发现了 husky 这个项目,这是一个使用 JavaScript 实现的用来管理 Git hooks 的工具。

GitHub: https://github.com/typicode/husky

什么是 Git hook

首先要先了解一下 Git hooks,对于 git 已经是现代开发中必不可少的一个工具了,大家应该都比较熟悉,但是可能很多人在项目中并没有使用过 Git 的 hooks。

Git 的 hooks 允许用户在特定的时机执行用户自定义的脚本。

比如非常常见的,在提交之后自动对代码内容进行一些常规检查,如果失败则不允许提交等等。常用的 hook 有 pre-commit, commit-msgpre-push 等。

Git hooks 是基于事件的,Scott Chacon 在 Pro Git 书中将 hooks 分成几个类型:

  • 客户端 hook,在使用者自己的本地环境中被调用。
    • 代码提交相关的 hook,在提交动作前后,通常用于检查完整性,生成提交信息,校验,发出通知等等
    • Email 相关的 hook,主要用于 Email 提交的代码。像 Linux 内核使用 Email 提交补丁会使用到。工作方式和提交类 hook 相似
    • 其他类,包括代码合并,check-out,rebase,rewrite,clean 等等
  • 服务端 hook,一般在服务器端执行,用于接受推送,部署在 git 仓库的服务器上
    • 触发类,在服务器接收到一个推送之前或之后执行动作,前触发用于检查,后触发用于部署
    • 更新,类似前触发,更新的 hook 是以分支作为作用对象,在分支更新通过之前执行

hook 列表:

hook 名称 触发命令 描述 参数个数描述
applypatch-msg git am 编辑 commit 时提交的 message,通常用于验证或纠正提交的信息以符合项目标准 包含预备提交信息的文件名
pre-applypath git am 变更 commit 之前,如果以非 0 退出,会导致 uncommit 状态,用于 commit 之前的检查  
pre-applypath git am commit 完成提交之后,主要用于通知  
pre-commit git commit 获取 commit message 之前,非 0 退出会取消本次 commit,检查 commit 自身,而不是 commit message  
prepare-commit-msg git commit 接收默认 commit message 之后,启动 commit message 编辑器之前。  
commit-msg git commit message 提交之后修改 message 的内容或退回不合格的 commit  
post-commit git commit commit 完成之后调用,主要用于通知  
pre-rebase git rebase 执行 rebase 时,可用于中断不想要的 rebase  
post-checkout git checkoutgit clone 更新工作树后调用 checkout 时,或执行 git clone 后,主要用于验证环境、显示变更、配置环境  
post-merge git merge or git pull 合并之后调用  
pre-push git push 推送远程之前  
pre-receive 远程 repo 进行 git-receive-pack 远程 repo 更新刚被 push 的 ref 之前调用,非 0 会中断本次  
update 远程 repo 进行 git-receive-pack 远程 repo 每一次 ref 被 push 的时候调用  
post-receive 远程 repo 进行 git-receive-pack 远程 repo 所有的 ref 更新之后  
post-update git-receive-pack 所有 ref 被 push 后执行一次  
pre-auto-gc git gc --auto 用于在自动清理 repo 之前做一些检查  
post-rewrite git commit --amendgit rebase git 命令重写 rewrite 已经被 commit 的数据时调用  

.git 这个隐藏的文件目录下,有一个 hooks/ 文件夹,下面通常会有一些 sample 文件。如果要使其生效,去掉后缀 sample 即可

目录下的每一个文件都是可执行的文件,脚本通过文件名调用,内容的第一行必须有 Shebang #!,引用正确的脚本解析器,比如 bash, perl, python, nodejs 等。Git hooks 使用的脚本语言是没有限制的。

比如在 pre-commit 中执行代码检查:

#!/bin/sh
npm run lint

# 获取上面脚本的退出码
exitCode="$?"
exit $exitCode

什么是 Husky

通过上面的简单了解也可能看到本地的 git hook 是保存在本地的 .git 文件夹中的,本地的 git hook 是不会被提交到版本控制中的。这就存在了一个问题,便是如何在项目中管理 Git hooks,这个时候就需要 Husky 登场了。

目前已经有非常多的项目在使用 husky 了,包括:

  • webpack
  • babel
  • create-react-app

Husky 的原理就是在项目的根目录中使用一个配置文件,然后在安装 Husky 的时候把配置文件和 Git hook 关联起来,在团队之间共享。

安装

安装:

npm install husky --save-dev

在项目中安装:

npx husky install

配置 Husky

使用 Husky 之前确保安装了 npm

npm install husky -D

Husky 支持如下几种格式配置:

  • .huskyrc
  • .huskyrc.json
  • .huskyrc.yaml
  • .huskyrc.yml
  • .huskyrc.js
  • husky.config.js

.huskyrc 为例:

{
  "hooks": {
    "pre-commit": "git restore -W -S dist examples/dist && eslint ."
  }
}

这一个例子就是每次执行 git commit 之前把 distexamples/dist 中的修改撤掉,不提交到仓库中,然后执行 EsLint。

Husky 原理

Husky 做了两件事情:

  • 创建 ~/.husky 目录
  • husky install 时设置 ~/.husky 目录为 git hooks 目录。

创建 Hook

使用 husky add:

npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

卸载还原 Husky

npm uninstall husky
// 删除.husky文件夹,并且重置core.hooksPath
rm -rf .husky && git config --unset core.hooksPath

Husky 注意事项

Husky 不支持服务端 hooks。

包括 pre-receiveupdatepost-receive

如果想跳过所有的 hooks,可以使用:

HUSKY_SKIP_HOOKS=1 git rebase ...

不使用 Husky 同步 Git hooks

在 git 2.9 中引入了 core.hooksPath 配置,可以手动配置 git hooks 所在的目录。这也就使得我们可以在另外的目录中创建 Git hooks,然后手动设置 Hooks 目录来实现 hooks 脚本的同步。

reference


2022-04-15 husky , git-hook , git

每天学习一个命令:tail 输出文件的最后部分内容

tail 命令是一个日常查看日志非常常用的命令,用来在终端显示文件的最后部分内容。

用例

tail 不加任何参数的情况下,默认显示文件最后 10 行内容。

tail /path/to/file.log

显示文件追加的内容

通常业务系统中以文件形式记录日志时会一直追加到文件末尾,可以使用 -f 来显示新追加的内容:

tail -f /path/to/file.log

显示文件结尾 100 行

tail -100 mail.log
tail -n 100 mail.log

显示文件第20行至末尾

tail -n +20 mail.log

显示结尾10个字符

tail -c 10 mail.log

2022-04-12 linux , tail , log

Laravel 学习笔记:部署到生产环境

在本地开发调试的时候使用了 Laravel 提供的 Sail 依赖本地的 Docker 环境,Sail 提供了 Nginx,MySQL,Redis,等等容器,还提供了一个用于测试的 SMTP mailhog,但是生产环境可以使用更加稳定的组件。

Requirements

Laravel 应用需要一些基础的系统依赖,需要确保Web 服务器有如下的最低要求:

  • PHP >= 8.0
  • BCMath PHP Extension
  • Ctype PHP Extension
  • cURL PHP Extension
  • DOM PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PCRE PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

Nginx

Web 服务器就用 Nginx。

记住 Web 服务器所有的请求都会先到 public/index.php 文件,千万不要将此文件放到项目的根目录,或者 Web 服务器的根目录,如果 Web 服务器可以访问项目根目录会造成带有敏感信息的配置文件泄漏。

server {
    listen 80;
    server_name example.com;
    root /srv/example.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

部署过程

这里使用 [[aapanel]] 来新建一个站点。

然后将代码 push 到 GitHub,然后到机器上 push 来下。

cp .env.example .env

根据自己的配置,修改数据库、Redis、SMTP 相关的配置。

执行:

sudo composer install

注意将站点的所有者修改为 www:

sudo chown -R www:www .

然后执行:

sudo php artisan key:generate
sudo php artisan migrate

禁用 php 方法:

  • proc_open
  • symlink
  • pcntl_signal
  • pcntl_alarm

Composer

安装 Composer:

wget https://getcomposer.org/download/1.8.0/composer.phar
mv composer.phar /usr/local/bin/composer
chmod u+x /usr/local/bin/composer
composer -V

自动加载优化:

composer install --optimize-autoloader --no-dev

优化配置加载,将配置文件压缩到一个缓存中

php artisan config:cache

优化路由加载:

php artisan route:cache

优化视图加载

php artisan view:cache

问题

如果遇到如下问题:

PHP Fatal error:  Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php:101
Stack trace:
#0 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Status.php(59): Composer\XdebugHandler\Process::setEnv()
#1 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/XdebugHandler.php(99): Composer\XdebugHandler\Status->__construct()
#2 phar:///usr/local/bin/composer/bin/composer(18): Composer\XdebugHandler\XdebugHandler->__construct()
#3 /usr/local/bin/composer(29): require('...')
#4 {main}
  thrown in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php on line 101

Fatal error: Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php:101
Stack trace:
#0 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Status.php(59): Composer\XdebugHandler\Process::setEnv()
#1 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/XdebugHandler.php(99): Composer\XdebugHandler\Status->__construct()
#2 phar:///usr/local/bin/composer/bin/composer(18): Composer\XdebugHandler\XdebugHandler->__construct()
#3 /usr/local/bin/composer(29): require('...')
#4 {main}
  thrown in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php on line 101

需要禁用 php 的 putenv 方法。


2022-04-07 laravel , php , laravel-deploy

Laravel 学习笔记:本地化

通过 Laravel 的样例项目也应该能看到 Laravel 对本地化多语言的支持代码了。

观察一下项目的目录结构就能猜出来语言文件在 resources/lang 中。目录结构需要按照 ISO 15897 标准来命令,简体中文 zh_CN

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

可以看到所有的语言文件都是返回一个 key-value 结构。

JSON 文件

Laravel 还可以定义 JSON 文件,存放在 resources/lang 下,如果是中文则是 resources/lang/zh_CN.json 文件:

{
    "welcome": "欢迎来到 EV 的 Blog"
}

配置 Locale

config/app.php 中可以配置网站语言。

使用翻译

可以使用 __ 辅助函数来从语言文件中获取翻译。

echo __('welcome')

在 Blade 模板引擎中,可以直接在 `` 中使用:


如果翻译字符不存在,则直接返回字符串。

翻译占位符

如果翻译字符串中有需要变动的变量,可以使用 : 来将其定义为占位符:

'welcome' => 'Welcome, :name',

然后在获取的时候传入一个数组用于替换:

echo __('welcome', ['name' => 'laravel']);

2022-04-06 laravel , localization , php , learning-note , learning-note

电子书

最近文章

  • 逃离豆瓣之豆瓣代替服务 这篇笔记新建的时间是 2020 年 12 月 29 号,想来从那个时间点开始我就一直想着怎么离开豆瓣了。过去一年时间里面陆陆续续也发现了不少不错的网站,甚至有一些比豆瓣都要好用。这里就再整理一下。
  • Proxmox 扩展 VM 虚拟机磁盘容量 之前在 Proxmox 上给 Ubuntu 划分了 64GB 的空间,运行一段时间之后磁盘空间剩余不多,就抽时间扩展一下。本文就记录一下给 Proxmox VE 的虚拟机扩展的过程。其实之前的文章里面也略微提到过一些,但是没有完整记录。
  • 使用 lux 下载哔哩哔哩视频 Lux 是一个使用 Go 语言编写的视频下载命令行工具,支持的平台很多,提供了包括 macOS、Windows、Linux 等等平台的命令行支持,安装和使用非常简单的。Lux 原来的名字是叫做 Annie(安妮),对标的是 macOS 上一款非常著名的视频下载软件叫做 Downie(唐尼)。但后来改名成了 Lux。
  • 图片压缩工具 Squoosh 离线版 Squoosh 是 Google 推出的一个图片压缩工具。之前整理macOS 初始化设置 的时候就说过,基本上算是必不可少的一个压缩工具了。
  • 每天学习一个命令:umask 命令简单介绍 在使用 LinuxServer 的 Docker 镜像的时候经常会需要设置 umask 值,这个值的具体作用一直不太清楚,正好整理一下。