site logo

Keep doing what you want, never give up.

推荐文章
文章配图

Google SEO 通过 HTTP 410 永久移除某个URL索引

我们可以通过Nginx配置来实现Google SEO,永久删除那些已经被Google收录但却是错误的url网址,比如网址被谷歌收录后又做了变更改变了原来的url地址。 又或者移除Google之前收录的非HTTPS协议网址等。 按如下方式在Nginx的server段内返回HTTP 410状态码即可: location /path/to/deleted/article { return 410; } HTTP状态码说明: HTTP 410 Gone 说明请求的目标资源在源服务器上已经不存在了,并且是【永久性】的丢失。 如果不清楚是【永久丢失】还是【临时丢失】,则应该使用404状态码。
文章配图

运行Github上Go包中example示例的正确姿势

日常开发中我们经常会使用到第三方Go包,而很多Go包中默认都包含了一些example示例代码来帮助用户直观的感受产品运行效果,那我们应该怎么运行这些代码呢? 以前都是一股脑儿的git clone整个仓库然后切换到example目录运行相关代码来看效果,除了这种方法外,我们还可以使用Go为我们提供的go list工具链命令来实现同样的效果。 这里以github.com/gorilla/websocket这个Web Socket包为例,官方示例代码如下: 1 go get github.com/gorilla/websocket 2 cd `go list -f '{{.Dir}}' github.com/gorilla/websocket/examples/chat` 3 go run *.go 这里主要解释下第二行代码的含义: # cd反引号(``)表示命令替换,它会先执行反引号中的命令,然后将命令代码的返回结果替换到命令行中 cd `命令代码` # go list命令的作用是列出包的相关信息 go list github.com/gorilla/websocket/examples/chat 给go list加上 -f ‘{{ .Dir }}‘参数是指定了go list的输出格式,这里使用了Go模版语法,’{{ .Dir }}‘表示输出包的目录路径 # go list命令的作用是列出包的相关信息 go list -f '{{ .Dir }}' github.com/gorilla/websocket/examples/chat 所以,这段代码整体的作用就是获取github.com/gorilla/websocket/examples/chat这个Go包的目录里路径,并切换到这个目录下,然后可以直接在改目录下运行相关go代码了。
文章配图

我用Tailwind CSS写了一个程序员简历模版

对于一个后端程序员来说,Tailwind CSS无疑是构建前端UI页面的大杀器,其简洁的语法和所见即所得的实时预览效果极大的提高了前端页面的开发效率,让你用写HTML的方式书写CSS的核心思想简直如行云流水般丝滑。 如下便是用Tailwind CSS构建的一个简历模版,最终效果如下图: 更多手写Tailwind CSS模版可见 此处 ,后续会持续更新。
文章配图

MongoDB聚合查询aggregate之group分组

MongoDB中并没有类似MySQL关系型数据库中Left Join这种连表查询,但是它提供了一个称为aggregate的聚合管道查询语法来让我们实现类似MySQL那样的关联查询。其大致思路就是将多个查询语句按顺序逐一执行,然后汇总结果。 假设我们有两个集合,一个用户集合用来存放用户信息名字叫user,另外一个集合名叫photo用来存放用户的照片信息。 用户集合user ------------------------- | uid | name | |-----------|-----------| | 100000 | A | | 100001 | B | | 100002 | C | ------------------------- 照片集合photo ----------------------------- | uid | photo | |-----------|---------------| | 100000 | A的照片一 | | 100001 | B的照片一 | | 100000 | A的照片二 | | 100002 | C的照片一 | ----------------------------- 现在的需求是查出user表中所有用户的照片集合,相同用户的照片需要合并在一个数组中: 查询结果 ------------------------------------------------- | uid | name | photo | |-----------|---------------|-------------------| | 100000 | A | A的照片一,A的照片二 | | 100001 | B | B的照片一 | | 100002 | C | C的照片一 | ------------------------------------------------- 这时我们就可以联合aggregate语句的$lookup、$unwind、 $project以及$group语法得出想要的结果,查询语句如下:
文章配图

如何解决Nginx无法按天记录访问日志的问题?

Nginx的map指令用于将一个变量的值映射给另外一个变量。它就像是一个“查字典”的工具,根据输入的值来查找和返回对应的输出值,我们可以用它来配置一些复杂的规则以简化Nginx配置的条件判断。 一个典型的map应用案例便是用它按日期(通常是按天)来切割Nginx的访问日志,相关的配置网络上已经有很多说明了,也都一样像下面这样配置即可: # 指定Nginx工作进程的用户或组 user nobody bobody; user nobody; # 定义日志记录的内容格式 log_format main '$remote_addr [$time_iso8601] $request ' '$status $body_bytes_sent $http_referer ' '$http_user_agent $http_x_forwarded_for $request_time'; # 将Nginx内置时间变量 $time_iso8601 的值映射到新定义的 $logday 变量 map $time_iso8601 $logday { '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found'; } # 在日志文件名中加入 $logday 日期 access_log logs/access-$logday.log main; 但不一样的是,可能即使你按照上面的配置修改并重启了nginx,但发现nginx并没有像我们希望的那样按日期生成日志,如果你删除之前logs目录中已存在的日志文件并成功执行nginx -s reload后甚至会出现压根就没有生成任何日志文件。 而之所以出现这种现象的原因其实是因为生成日志的nginx进程权限不够,缺少对logs目录的写权限。 知道了原因,那解决方法也非常简单,给logs目录赋予相应的写权限即可: sudo chown -R nobody:nobody sudo chmod -R 755 logs 有了正确的权限Nginx便能像我们期望的那样按天记录日志了。
文章配图

Hugo静态站点部署最佳实践之稀疏检出public静态目录

一个完整的Hugo静态站点目录往往都包含了各种各样的目录,如content内容目录、themes主题目录等等,既然是静态站点,那我们部署最终的代码时最好只将Hugo生成的静态内容部署到生产服务器,也就是public目录。 假设我们本地的Blog目录结构如下所示: /Blog /archetypes /assets /content /Go /Swift /HTML /data /layouts /public /static /themes /GopherLoveApple 我们一般会将Blog目录下的所有内容一并提交到同一个git仓库以防内容丢失或备份,这种情况下我们就可以利用git的稀疏检出(sparse checkout)功能来实现只检出public目录,从而达到只将public目录下的内容部署到线上服务器。 操作也比较简单,具体git命令如下: mkdir www.example.com cd www.example.com git init #在www.example.com空目录下先初始化一个git仓库 git remote add origin <[email protected]:用户名/仓库url地址.git> #添加远程仓库地址 git config core.sparseCheckout true #开启稀疏检出 echo "public" >> .git/info/sparse-checkout #配置要检出仓库下哪个子目录 git pull origin master 经过上面的配置后当你使用git pull origin master命令拉取代码时就只会拉取public目录下的内容了。
文章配图

Linux免密Clone不同的Github仓库代码

个人和小微企业由于资金紧张,所以大部分都只有一台服务器来跑所有的服务,如果不同的服务是存储在不同的github仓库的话,那就需要将不同的github仓库代码clone到同一台服务器的不同目录。 要实现这样的需求其实我们只需要实现将服务器ssh公钥添加到github仓库的Deploy Key中即可,但是一个ssh key只能被添加一次,如果你将同一个key添加到不同仓库的Deploy Key中github会提示“Key is already in use” 解决办法就时我们生成多个ssh key密钥对,然后让git克隆不同仓库的代码时使用不同的公钥即可,操作步骤如下: 1、生成多个ssh密钥对(为简单起见我们生成两个,一路回车即可): ssh-keygen -t rsa -f ~/.ssh/id_rsa_仓库1 ssh-keygen -t rsa -f ~/.ssh/id_rsa_仓库2 2、添加不同公钥到对应仓库的Deploy Key中: cat ~/.ssh/id_rsa_仓库1.pub cat ~/.ssh/id_rsa_仓库2.pub 3、告诉git工具不同的仓库要使用不同的公钥,这需要通过修改 ~/.ssh/confg文件来实习: Host github-仓库HOST别名1 HostName github.com User git IdentityFile ~/.ssh/id_rsa_仓库1的私钥 Host github-仓库HOST别名2 HostName github.com User git IdentityFile ~/.ssh/id_rsa_仓库2的私钥 最后就可以使用git进行免密操作了(注意git@后面的主机名其实是上面在~/.ssh/confg中添加的别名): git clone git@github-仓库HOST别名1:username/仓库1.git git clone git@github-仓库HOST别名2:username/仓库2.git
文章配图

面试官:Go module目录名中为什么有叹号!特殊字符

如下图,为什么有的Go module目录名包含叹号!这个特殊字符? 在Go官方文档中有提到说module路径是采用的操作系统OS的方式来识别的,但是我们不能依靠文件系统将 rsc.io/QUOTE 和 rsc.io/quote 分开。因为Windows 和 macOS 不这样做。 换句话说就是操作系统不区分目录大小写,于是Go团队就想出了一个使用!叹号替换大写字母的解决方案,具体替换方案是将大写字母替换为一个!叹号和这个大写字母对应的小写字母,比如如下截图中的Abirdcfly目录就被替换成了 !abirdcfly
文章配图

利用Markdown语法给Hugo站点添加点击图片查看原图功能

为了提高网站的响应速度,我们通常会在列表页或详情页显示缩略图,用户点击图片后再展示原图。这种设计即满足了网站的快速响应也满足了用户查看原图的需求,那么在Hugo中我们应该如何实现这样的功能呢? 我们知道Markdow文档中的超链接语法格式为: [超文本](超文本url链接) 我们还知道Markdow文档中的图片语法格式为: ![图片文本描述](图片url链接) 那我们就可以将这两个特性结合起来从而实现点击图片查看原图的功能,点击图片查看原图的两个核心点一个是点击,一个是原图,结合上面超文本和图片的语法我们直接在Markdown中这样写即可: [![图片文本描述](缩略图片url链接)](原图url链接) 如果你没有在Hugo中启用缩略图功能,那上面的 缩略图片url链接 和 原图url链接 也可以是同一个url。 最终效果如下:
文章配图

大厂面试 - 腾讯:Go中defer语句的作用及其执行顺序

在Go中,defer语句用于延迟函数的执行,通常用于在函数运行结束前执行一些清理工作。 一个函数中可以存在多个defer语句,当函数中存在多个defer语句时,它们的执行顺序是后进先出,即函数中最后一个defer语句会被最先执行,第一个defer语句则会最后才执行。 在Go中,defer语句中的“代码片段”会按它们在函数中出现的顺序先后被压入一个栈中,当函数执行结束时(return之前),这些被压入栈的“代码片段”会按照后进先出的顺序逐一被执行。