可将最终 data.json 放在 COS 上进行 CDN 加速;也能继续放在 GitHub,视自己需求而定
自动清理过期日志
每次抓取后检查 logs/ 目录下 7 天之前的日志并删除,不用手工清理了
4. Go 生成的 JSON 和日志长啥样
4.1 RSS
抓取到的文章信息会按时间降序排列,示例:
{"items":[{"blog_name":"obaby@mars","title":"品味江南(三)–虎丘塔 东方明珠","published":"10 Mar 2025","link":"https://oba.by/2025/03/19714","avatar":"https://oba.by/wp-content/uploads/2020/09/icon-500-100x100.png"},{"blog_name":"风雪之隅","title":"PHP8.0的Named Parameter","published":"10 May 2022","link":"https://www.laruence.com/2022/05/10/6192.html","avatar":"https://www.laruence.com/logo.jpg"}],"updated":"2025年03月11日 07:15:57"}
由于Jekyll默认使用UTC时区,导致博客更新时间不准确。这里需要写入上海时间:timezone: Asia/Shanghai,但是我在本地调试时需要在配置内注释掉,不然就会报错
jekyll 3.9.3 | Error: No source of timezone data could be found.
Please refer to https://tzinfo.github.io/datasourcenotfound for help resolving this error.
上传到仓库 Github pages 不会出现这样的问题。老是注释调试挺麻烦的,Google搜出来的解决方案都是瞎扯淡,也不知道都是哪复制粘贴就发出来的。
gem install tzinfo-data
Gemfile 直接指定版本
gem 'tzinfo-data', '>= 1.2021a'
写入配置 timezone: Asia/Shanghai,确保调试的电脑时区也正常,开始运行
bundle exec jekyll serve
jekyll 3.9.3 | Error: No source of timezone data could be found.
Please refer to https://tzinfo.github.io/datasourcenotfound for help resolving this error.
今天换博客主要文字了,”仓耳今楷”,字体更美观更适合阅读。但是过程中遇到点问题
@font-face {
font-family: 仓耳今楷01-W04;
src: url("https://api.lhasa.icu/assets/font/tsanger01W04.ttf") format("truetype");
}
这段CSS写的是没有问题的,但是不生效,控制台报错跨域
has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
腾讯云COS跨域访问CORS配置如下:
配置好后又遇到麻烦了,字体太大了,一个字体文件17.9M!网站都脱垮了
这里做一下处理,取子集压缩文字,需要用到 FontSmaller 和 现代汉语常用3500汉字
取子集压缩之后字体文件大小为1.94M
变量的定义
package main
import "fmt"
func variableZeroValue() {
// var 关键字表示定义变量,定义变量时,名在前,类型在后
// int默认值为0,string为空字符串
var a int
var s string
fmt.Printf("%d %q\n", a, s)
}
func variableInitialValue() {
// Golang语法严格,定义的变量必须被使用,否则报错:declared but not used
var a, b int = 3, 4
var s string = "abc"
fmt.Println(a, b, s)
}
func variableTtypeDeduction() {
// 定义多个变量的同时,也可以给其定义类型
var a, b, c, s = 3, 4, true, "def"
fmt.Println(a, b, c, s)
}
func variableShorter() {
// : 冒号也表示定义变量,注意定义变量时才用!!!
packagemainimport"fmt"funcvariableZeroValue(){// var 关键字表示定义变量,定义变量时,名在前,类型在后// int默认值为0,string为空字符串varaintvarsstringfmt.Printf("%d %q\n",a,s)}funcvariableInitialValue(){// Golang语法严格,定义的变量必须被使用,否则报错:declared but not usedvara,bint=3,4varsstring="abc"fmt.Println(a,b,s)}funcvariableTtypeDeduction(){// 定义多个变量的同时,也可以给其定义类型vara,b,c,s=3,4,true,"def"fmt.Println(a,b,c,s)}funcvariableShorter(){// : 冒号也表示定义变量,注意定义变量时才用!!!a,b,c,s:=3,4,true,"def"// 若变量重复定义则会报错:no new variables on left side of :=b=5fmt.Println(a,b,c,s)}// 在函数内定义的变量,它作用域只在函数内,但函数外也可以定义变量// 不管函数内还是函数外都可以使用 var() 集中定义变量var(id=1user="achuan")// 需要注意的是,在函数外定义变量只可以用var关键字进行定义,不能使用冒号// 否则报错:syntax error: non-declaration statement outside function body//ges := 20// 注意上面定义的id,user变量,它们的作用域不是"全局变量",而是包内部的变量// Golang没有全局变量这个说法,只是包内部的funcmain(){fmt.Println("Hi achuan")variableZeroValue()variableInitialValue()variableTtypeDeduction()variableShorter()fmt.Println(id,user)}
packagemainimport("fmt""math")functriangle(){vara,bint=3,4varcint// 参数类型不一致报错:cannot use a * a + b * b (type int) as type float64 in argument to math.Sqrt// c = int(math.Sqrt(a*a + b*b))// 因为Sqrt参数要求float64类型,Golang语法严格,必须强制性转换c=int(math.Sqrt(float64(a*a+b*b)))fmt.Println(c)}funcmain(){triangle()}// 5
今天我在Github TranslatorX这个IDE汉化项目的Issues下看到有个JetBrains员工说关于中文包的事:
Hi, I’m a JetBrains employee, and we’re working on initial support for the Chinese language pack. If you’re interested in, feel free to contact me: ignatov@jetbrains.com
Cheers, Sergey.
然后前不久1-17号官方中文插件在2020.1的EAP版本已经推出了,相见恨晚啊!
然而朋友说中文IDE没有灵魂,这这这…
Chinese (Simplified) Language Pack
2020-05-08更新
在Plugins里面搜索Chinese,安装后重启即可。
Hi, I’m a JetBrains employee, and we’re working on initial support for the Chinese language pack. If you’re interested in, feel free to contact me: ignatov@jetbrains.com
# 查看磁盘分区的UUID$ sudo blkid -o list
# 5016CF88CCD20C21 就是我的UUID,同时要记录一下device和fs_type等会要用
device fs_type label mount point UUID
-------------------run----------------------------------------------------------------------------------------------
/dev/sdb1 ntfs File /run/media/achuan/File 5016CF88CCD20C21
# /dev/sdb1挂载点$ mkdir ~/File
# 打开fastab文件,看到以下文件内容$ sudo vim /etc/fstab
# /etc/fstab: static file system information.## Use 'blkid' to print the universally unique identifier for a device; this may# be used with UUID= as a more robust way to name devices that works even if# disks are added and removed. See fstab(5).## <file system> <mount point> <type> <options> <dump> <pass>UUID=8a9b74b7-c33a-413b-b654-80f3a16b5e12 /home ext4 defaults,noatime,discard 0 2
UUID=b23b3470-26c1-4b39-9358-43278c73763e / ext4 defaults,noatime,discard 0 1
UUID=ad103e33-78b7-4b33-8632-03c3fe6364fc /boot ext4 defaults,noatime,discard 0 2
UUID=b0d5e88d-136a-4fa6-b164-5d70e5073b5d /opt ext4 defaults,noatime,discard 0 2
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
# 从这个文件内容可以看出文件有6列
- 第一列file system选项是UUID
- 第二列mount point选项是挂载点
- 第三列type选项是所要挂载设备的文件系统或者文件系统类型
- 第四列options选项是挂载选项,常见参数如下
| 配置选项 | 选项说明
|-------------|-----------------------------------------------------
| async/sync | 设置是否为同步方式运行,默认为async
| auto/noauto | 当下载mount -a命令时,此系统是否被主动挂载,默认为auto
| rw/ro | 是否以只读或读写模式挂载
| exec/noexec | 限制此文件系统内是否能够进行“执行”操作
| user/nouser | 是否允许用户使用mount命令挂载
| suid/nosuid | 是否允许SUID的存在
| userquota | 启动文件系统支持磁盘配额模式
| grpquota | 启动文件系统对群组磁盘配额模式的支持
| defaults | 同时具有rw、suid、suid、dev、exec、auto、nouser、async等默认参数的设置
deepin-wine-wechat
- 第五列dump选项是文件系统备份选项。0备份,1备份
- 第六列pass选项是磁盘检查设置,其值是一个顺序,0不检查,1检查(根目录永远都为1)其它分区从2开始,数字越小越先检查,如果有两个分区的数字相同,同时检查
# 这是挂载/dev/sdb1的挂载配置,插入一行保存退出UUID=5016CF88CCD20C21 /home/achuan/File ntfs defaults 0 0
# 如果/etc/fstab配置不对,会导致系统无法启动!一定要检查一下是否能正确挂载!如果改挂了,找个U盘改回来就行了。$ sudo mount -a
常用软件
Vim配置
# Lightline$ git clone https://github.com/itchyny/lightline.vim ~/.vim/pack/plugins/start/lightline
# 更换 PaperColor_dark.vim$ mv-f ~/.vim/pack/plugins/start/lightline/autoload/lightline/colorscheme/PaperColor_dark.vim ~/.vim/pack/plugins/start/lightline/plugin/lightline.vim
# 编辑全局配置并写入以下配置 # 用户个人配置 ~/.vimrc$ sudo vim /etc/vimrc
" 语法高亮
syntax on
" 底部状态显示
set showmode
" 使用UTF-8编码
set encoding=utf-8
" 启用256色
set t_Co=256
" 开启文件类型检查,并且载入与该类型对应的缩进规则
filetype indent on
" 按回车后,下一行缩进自动同上
set autoindent
" 按TAB,Vim显示的空格数量
set tabstop=4
" 在文本上按下>>(增加一级缩进)、<<(取消一级缩进)或者==(取消全部缩进)时,每一级的字符数
set shiftwidth=4
" 由于 TAB 键在不同的编辑器缩进不一致,该设置自动将 TAB 转为空格
set expandtab
" TAB转为多少个空格
set softtabstop=4
" 显示行号
set number
" 光标所在当前行高亮
set cursorline
" 设置行宽,即一行显示多少个字符
set textwidth=80
" 自动折行,即太长的行分成几行显示
set wrap
" 只有遇到指定的符号(比如空格、连词号和其他标点符号),才发生折行。也就是说,不会在单词内部折行
set linebreak
" 是否显示状态栏。0 表示不显示,1 表示只在多窗口时显示,2 表示显示
set laststatus=2
" 在状态栏显示光标的当前位置(位于哪一行哪一列)
set ruler
" 搜索时,高亮显示匹配结果
set hlsearch
" 输入搜索模式时,每输入一个字符,就自动跳到第一个匹配的结果
set incsearch
" 搜索时忽略大小写
set ignorecase
" 如果有一个大写字母,则切换到大小写敏感查找
set smartcase
" 保存撤销历史
set undofile
" 出错时,发出视觉提示
set visualbell
" 保存Vim历史操作次数
set history=1000
" 打开文件监视。如果在编辑过程中文件发生外部改变(比如被别的编辑器编辑了),就会发出提示
set autoread
" 如果行尾有多余的空格(包括 Tab 键),该配置将让这些空格显示成可见的小方块
set listchars=tab:»■,trail:■
set list
" 命令模式下,底部操作指令按下 Tab 键自动补全。第一次按下 Tab,会显示所有匹配的操作指令的清单;第二次按下 Tab,会依次选择各个指令
set wildmenu
set wildmode=longest:list,full
Oh-My-Zsh
$ sudo pacman -S zsh
$ sh -c"$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"# 切换到zsh$ chsh -s /bin/zsh
# 安装3den主题$ sudo vim ~/.zshrc
ZSH_THEME="3den"
/home/achuan/.gem/ruby/2.7.0/gems/rb-inotify-0.10.1/lib/rb-inotify/watcher.rb:74:in `initialize’: No space left on device - Failed to watch “/home/achuan/github/achuanya.github.io/.jekyll-cache/Jekyll/Cache/Jekyll–Converters–Markdown/e6”: The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource. (Errno::ENOSPC)
本文转自当然我在扯淡
这段时间受到很多人的来信。他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”。天知道他们在哪里找到那么老的文章,真是好事不出门…… 我觉得我有责任消除我以前的文章对人的误导,洗清我这个“Linux 狂热分子”的恶名。我觉得我已经写过一些澄清的文章了,可是怎么还是有人来信问 Linux 的问题。也许因为感觉到“舆论压力”,我把文章都删了。
简言之,我想对那些觉得 Linux 永远也学不会的“菜鸟”们说:
1. Linux 和 Unix 里面包含了一些非常糟糕的设计。不要被 Unix 的教条主义者吓倒。学不会有些东西很多时候不是你的错,而是 Linux 的错,是“Unix 思想” 的错。不要浪费时间去学习太多工具的用法,钻研稀奇古怪的命令行。那些貌似难的,复杂的东西,特别要小心分析。
2. Windows 避免了 Unix,Linux 和 Mac OS X 的很多问题。微软是值得尊敬的公司,是真正在乎程序开发工具的公司。我收回曾经对微软的鄙视态度。请菜鸟们吸收 Windows 设计里
这段时间受到很多人的来信。他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”。天知道他们在哪里找到那么老的文章,真是好事不出门…… 我觉得我有责任消除我以前的文章对人的误导,洗清我这个“Linux 狂热分子”的恶名。我觉得我已经写过一些澄清的文章了,可是怎么还是有人来信问 Linux 的问题。也许因为感觉到“舆论压力”,我把文章都删了。
简言之,我想对那些觉得 Linux 永远也学不会的“菜鸟”们说:
1. Linux 和 Unix 里面包含了一些非常糟糕的设计。不要被 Unix 的教条主义者吓倒。学不会有些东西很多时候不是你的错,而是 Linux 的错,是“Unix 思想” 的错。不要浪费时间去学习太多工具的用法,钻研稀奇古怪的命令行。那些貌似难的,复杂的东西,特别要小心分析。
2. Windows 避免了 Unix,Linux 和 Mac OS X 的很多问题。微软是值得尊敬的公司,是真正在乎程序开发工具的公司。我收回曾经对微软的鄙视态度。请菜鸟们吸收 Windows 设计里面好的东西。另外 Visual Studio 是非常好的工具,会带来编程效率的大幅度提升。请不要歧视 IDE。要正视 Emacs,VIM 等文本编辑器的局限性。当然,这些正面评价不等于说你应该为微软工作。就像我喜欢 iPhone,但是却不一定想给 Apple 工作一样。
3. 学习操作系统最好的办法是学会(真正的)程序设计思想,而不是去“学习”各种古怪的工具。所有操作系统,数据库,Internet,以至于 WEB 的设计思想(和缺陷),几乎都能用程序语言的思想简单的解释。
Windows 技术设计上的很多细节,也许在早期是同样糟糕的。但是它却向着更加结构化,更加简单的方向发展。Windows 的技术从 OLE,COM,发展到 .NET,再加上 Visual Studio 这样高效的编程工具,这些带来了程序员和用户效率的大幅度提高,避免了 Unix 和 C 语言的很多不必存在的问题。Windows 程序从很早的时候就能比较方便的交换数据。比如,OLE 让你可以把 Excel 表格嵌入到 Word 文档里面。不得不指出,这些是非常好的想法,是超越“Unix 哲学”的。相反,由于受到“Unix 哲学”的误导,Unix 的程序间交换数据一直以来都是用字符串,而且格式得不到统一,以至于很多程序连拷贝粘贴都没法正确进行。Windows 的“配置”,全都记录在一个中央数据库(注册表)里面,这样程序的配置得到大大的简化。虽然在 Win95 的年代,注册表貌似老是惹麻烦,但现在基本上没有什么问题了。相反,Unix 的配置,全都记录在各种稀奇古怪的配置文件里面,分布在系统的各个地方。你搞不清楚哪个配置文件记录了你想要的信息。每个配置文件连语法都不一样!这就是为什么用 Unix 的公司总是需要一个“系统管理员”,因为软件工程师们才懒得记这些麻烦的东西。
再来比较一下 Windows 和 Mac 吧。我认识一个 Adobe 的高级设计师。他告诉我说,当年他们把 Photoshop 移植到 Intel 构架的 Mac,花了两年时间。只不过换了个处理器,移植个应用程序就花了两年时间,为什么呢?因为 Xcode 比起 Visual Studio 真是差太多了。而 Mac OS X 的一些设计原因,让他们的移植很痛苦。不过他很自豪的说,当年很多人等了两年也没有买 Intel 构架的 Mac,就是因为他们在等待 Photoshop。最后他直言不讳的说,微软其实才是真正在乎程序员工具的公司。相比之下,Apple 虽然对用户显得友好,但是对程序员的界面却差很多。Apple 尚且如此,Linux 对程序员就更差了。可是有啥办法呢,有些人就是受虐狂。自己痛过之后,还想让别人也痛苦。就像当年的我。
我当然不是人云亦云。微软在程序语言上的造诣和投入,我看得很清楚。我只是通过别人的经历,来验证我已经早已存在的看法。所以一再宣扬别的系统都是向自己学习的 Apple 受到这样的评价,我也一点不惊讶。Mac OS X 毕竟是从 Unix 改造而来的,还没有到脱胎换骨的地步。我有一个 Macbook Air,一个 iPhone 5,和一个退役的,装着 Windows 7 的 T60。我不得不承认,虽然我很喜欢 Macbook 和 iPhone 的硬件,但我发现 Windows 在软件上的很多设计其实更加合理。