惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
NISL@THU
NISL@THU
S
Securelist
O
OpenAI News
S
Security Affairs
Cyberwarzone
Cyberwarzone
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
L
LINUX DO - 最新话题
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
SecWiki News
SecWiki News
S
Secure Thoughts
GbyAI
GbyAI
I
Intezer
AWS News Blog
AWS News Blog
F
Fortinet All Blogs
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
Google Online Security Blog
Google Online Security Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
A
About on SuperTechFans
S
Schneier on Security
P
Proofpoint News Feed
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
小众软件
小众软件
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
V
V2EX
L
Lohrmann on Cybersecurity
Security Latest
Security Latest
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
H
Hacker News: Front Page
Cisco Talos Blog
Cisco Talos Blog
Webroot Blog
Webroot Blog
T
Tenable Blog
MyScale Blog
MyScale Blog
博客园 - 司徒正美
S
SegmentFault 最新的问题
Y
Y Combinator Blog
腾讯CDC
Hacker News: Ask HN
Hacker News: Ask HN
M
MIT News - Artificial intelligence
G
GRAHAM CLULEY

极客兔兔

Go sync.Cond | Go 语言高性能编程 Go 死码消除与调试(debug)模式 | Go 语言高性能编程 Go sync.Once | Go 语言高性能编程 Go 逃逸分析 | Go 语言高性能编程 2020 年终总结 | 极客兔兔 Go struct 内存对齐 | Go 语言高性能编程 Go 空结构体 struct{} 的使用 | Go 语言高性能编程 控制协程(goroutine)的并发数量 | Go 语言高性能编程 | 极客兔兔 如何退出协程 goroutine (其他场景) | Go 语言高性能编程 如何退出协程 goroutine (超时场景) | Go 语言高性能编程 Go 语言陷阱 - 数组和切片 | Go 语言高性能编程 减小 Go 代码编译后的二进制体积 | Go 语言高性能编程 Go Reflect 提高反射性能 | Go 语言高性能编程 读写锁和互斥锁的性能比较 | Go 语言高性能编程 | 极客兔兔 for 和 range 的性能比较 | Go 语言高性能编程 切片(slice)性能及陷阱 | Go 语言高性能编程 | 极客兔兔 字符串拼接性能及原理 | Go 语言高性能编程 | 极客兔兔 pprof 性能分析 | Go 语言高性能编程 benchmark 基准测试 | Go 语言高性能编程 Go 语言高性能编程 | 极客兔兔 Go 接口型函数的使用场景 | 极客兔兔 Python 简明教程 | 快速入门 | 极客兔兔 Go 语言笔试面试题(代码输出) | 极客面试 | 极客兔兔 动手写RPC框架 - GeeRPC第七天 服务发现与注册中心(registry) | 极客兔兔 动手写RPC框架 - GeeRPC第六天 负载均衡(load balance) 动手写RPC框架 - GeeRPC第五天 支持HTTP协议 | 极客兔兔 动手写RPC框架 - GeeRPC第四天 超时处理(timeout) | 极客兔兔 动手写RPC框架 - GeeRPC第三天 服务注册(service register) 动手写RPC框架 - GeeRPC第二天 支持并发与异步的客户端 | 极客兔兔 动手写RPC框架 - GeeRPC第一天 服务端与消息编码 | 极客兔兔 7天用Go从零实现RPC框架GeeRPC | 极客兔兔 Go 语言笔试面试题(并发编程) | 极客面试 | 极客兔兔 Go 语言笔试面试题(基础语法) | 极客面试 | 极客兔兔 Go 语言笔试面试题汇总 | 极客面试 | 极客兔兔 Go Context 并发编程简明教程 | 快速入门 Go Mmap 文件内存映射简明教程 | 快速入门 动手写ORM框架 - GeeORM第七天 数据库迁移(Migrate) | 极客兔兔 动手写ORM框架 - GeeORM第六天 支持事务(Transaction) | 极客兔兔 动手写ORM框架 - GeeORM第五天 实现钩子(Hooks) | 极客兔兔 动手写ORM框架 - GeeORM第四天 链式操作与更新删除 | 极客兔兔 动手写ORM框架 - GeeORM第三天 记录新增和查询 | 极客兔兔 动手写ORM框架 - GeeORM第二天 对象表结构映射 | 极客兔兔 动手写ORM框架 - GeeORM第一天 database/sql 基础 SQLite 常用命令 | 速查表(Cheat Sheet) 7天用Go从零实现ORM框架GeeORM | 极客兔兔 动手写分布式缓存 - GeeCache第七天 使用 Protobuf 通信 动手写分布式缓存 - GeeCache第六天 防止缓存击穿 | 极客兔兔 动手写分布式缓存 - GeeCache第五天 分布式节点 | 极客兔兔 动手写分布式缓存 - GeeCache第四天 一致性哈希(hash) | 极客兔兔 Go Mock (gomock)简明教程 | 快速入门 动手写分布式缓存 - GeeCache第三天 HTTP 服务端 动手写分布式缓存 - GeeCache第二天 单机并发缓存 | 极客兔兔 Go Test 单元测试简明教程 | 快速入门 7天用Go从零实现分布式缓存GeeCache | 极客兔兔 Go WebAssembly (Wasm) 简明教程 | 快速入门 Go RPC & TLS 鉴权简明教程 | 快速入门 Go Protobuf 简明教程 | 快速入门 Go语言动手写Web框架 - Gee第七天 错误恢复(Panic Recover) WSL, Git, Mircosoft Terminal 等常用工具配置 Rust 简明教程 | 快速入门 | 极客兔兔 Go语言动手写Web框架 - Gee第六天 模板(HTML Template) 百宝箱 - 值得收藏的工具网站 | 极客兔兔 Go语言动手写Web框架 - Gee第五天 中间件Middleware | 极客兔兔 Go语言动手写Web框架 - Gee第四天 分组控制Group | 极客兔兔 Go语言动手写Web框架 - Gee第三天 前缀树路由Router | 极客兔兔 博客折腾记(七) - Gitalk Plus | 极客兔兔 Go语言动手写Web框架 - Gee第二天 上下文Context | 极客兔兔 Go2 新特性简明教程 | 快速入门 | 极客兔兔 博客折腾记(六) - 不要为了流量忘记了初心 | 极客兔兔 Go语言动手写Web框架 - Gee第一天 http.Handler | 极客兔兔 7天用Go从零实现Web框架Gee教程 | 极客兔兔 Go Gin 简明教程 | 快速入门 Go 语言简明教程 | 快速入门 | 极客兔兔 机器学习笔试面试题 11-20 | 极客面试 | 极客兔兔 机器学习笔试面试题 1-10 | 极客面试 | 极客兔兔 机器学习笔试面试题汇总 | 极客面试 | 极客兔兔 TensorFlow 2 中文文档 - RNN LSTM 文本分类 TensorFlow 2 中文文档 - TFHub 迁移学习 TensorFlow 2 中文文档 - 卷积神经网络分类 CIFAR-10 TensorFlow 2 中文文档 - 保存与加载模型 TensorFlow 2 中文文档 - 过拟合与欠拟合 TensorFlow 2 中文文档 - 回归预测燃油效率 TensorFlow 2 中文文档 - 特征工程结构化数据分类 TensorFlow 2 中文文档 - IMDB 文本分类 TensorFlow 2 中文文档 - MNIST 图像分类 TensorFlow 2 / 2.0 中文文档 TensorFlow 2.0 (九) - 强化学习 70行代码实战 Policy Gradient 博客折腾记(五) - 友链这件事,没那么简单 | 极客兔兔 博客折腾记(四) - 原创资格是争取来的 | 极客兔兔 TensorFlow 2.0 (八) - 强化学习 DQN 玩转 gym Mountain Car TensorFlow 2.0 (七) - 强化学习 Q-Learning 玩转 OpenAI gym TensorFlow 2.0 (六) - 监督学习玩转 OpenAI gym game 博客折腾记(二) - 对搜索引擎的理解 | 极客兔兔 博客折腾记(一) - 极致性能的尝试 | 极客兔兔 Pandas 数据处理(三) - Cheat Sheet 中文版 TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) TensorFlow入门(四) - mnist手写数字识别(制作h5py训练集) | 极客兔兔 TensorFlow入门(三) - mnist手写数字识别(可视化训练) | 极客兔兔 Pandas 数据处理(二) - 筛选数据 | 极客兔兔 Pandas 数据处理(一) - DataFrame 与 Series
博客折腾记(三) - 主题设计、彩蛋与阅读量翻倍 | 极客兔兔
2019-06-23 · via 极客兔兔

博客折腾记(三) - 主题设计、彩蛋与阅读量翻倍

geektutu_cnzz

人均浏览页面翻倍

这周六,博客主题作了一个比较大的调整,周日CNZZ的统计数据显示我的人均浏览页面几乎翻倍了,立竿见影,记录下整个过程的思考。

我一直在追求一个极简的主题。之前的主题,图片很少,首页只展示所有文章的日期和标题。期望通过标题吸引感兴趣的童鞋来阅读,标签和归档页也是如此。我从六月份开始使用CNZZ站长统计来分析我的博客流量,平常的时候流量大部分来自于必应Google,也有从域名直接访问的。每次最新的文章发布到聚合平台上,当天会出现访问高峰,今天有730的PV,很多流量就来自于聚合平台。对于分享头条这件事,我变得小心谨慎了,一般是发现Google收录了之后再分享,这样就能证明我是原创了。

CNZZ的数据上,有一个指标我一直很关注,人均浏览页数。之前基本是1点几页,也就是说,别人进我的博客来,看完一篇文章,就走了。这其实也满符合直觉的。比如你搜一个关键字,点进一个网页,找到了想找的东西,目标达到了,没必要继续呆着了。这对于独立博客来说,其实是一件很蛋疼的事情。独立博客和聚合平台不一样,聚合平台有账号体系,可以点关注,这样会有持续稳定的阅读量,但是独立博客你希望别人记住你的域名或者你的博客名,这样下次才能找到你。如果人均浏览页数低,就说明你的博客 “不重要”,自然也不会花精力来记住你了。

那怎么才能提高人均浏览页数呢?可能你的博客里有很好的文章,成体系的分享,但是别人没有机会发现。基于此我尝试改了几个细节的地方。

强化专题

大部分博客,都是给自己的文章打标签,其实很多不相关的文章都会打上同一个标签,比如Python,不管是数据分析的,机器学习的,或者Web相关的,只要用Python这门语言都可以打上这个标签,那其实内容风马牛不相及。所以我在很多细节上强化了专题这个概念。因为专题范围很明确,可以写一个系列,比如写博客从入门到放弃(一),一直写到九十九。成体系的思考是很难得的,对读者和博主都是有好处的。读者可以读到完整的内容,而不是碎片化的知识,而总结的人,可以顺着这个专题挖掘出更深的思考,更快地成长。

这是我改的几个地方:

1) 导航栏

首先,我将标签导航栏移除了,变成了专题

2) 专题框

每篇文章开头,加了一个专题框,呈现该文章所属专题的所有文章。一开始就提醒读者这是一个系列,是成体系的分享,下次可能还有用。

3) 侧边栏

专题框加在文章开头最大的问题是,文章读到最后,估计就懒得回到开头继续看了。所以放在侧边栏,而且总是悬浮在右侧,就容易顺着把同专题的文章一篇一篇地看完了。我改的第一版,默认展示文章目录,后来觉得,如果别人对你的文章感兴趣,而且文章不长的情况下,目录可能没那么重要,后来默认展示专题合集。如果想切换到文章目录也是可以的。借助浏览器的localStorage记录了tab的值。页面切换,切换的状态不会受到影响。

效果如图红框部分:

series-container

增加图片与推荐

每篇文章要不要加上一张图片?这个问题我一直很纠结,加上后,主题看上去就复杂了。

我最近一直在刷mediummedium每篇文章下都有三个推荐,每个推荐都有一张图作为背景。好的图片经常能抓住我的注意力,并吸引我点进去。我借鉴了这个思路,给自己的每篇文章加上了一张图,而且有些是动图。比如介绍TensorFlow Gym的那篇文章,我把最终的游戏效果录制了一个动画,游戏动画本身就有吸引力。如果展示在文章标题前面,必然能吸引眼球。

为此,我将文章首页改成了卡片式的瀑布流,左边是方形的图片,右边是文章的简介。

另外,每篇文章下方添加了三个推荐,这个推荐与主页的卡片是一致的,这一点借鉴了medium。读完一篇文章还能被下面的推荐吸引进去的话,人均浏览页面自然能上来了。而且这一点也很关键,在移动端,侧边栏是不显示的,这几个推荐在移动端很可能是文章刷到最下面唯一的流量入口了。

因为是基于Hexo搭的静态博客,所以也没办法做智能推荐,推荐都是随机生成的。但是每次发布新文章,整站会重新生成,所以只要更新频率快,大家会有推荐在变化的感觉。

recommend

增加二维码

每篇文章加了一个二维码,放到了文章最末端。微信扫一扫可以继续在手机上阅读,也很方便地分享给别人,算是一个比较贴心的细节吧。

记得有一次,我想把我的博客分享给同事,无奈只能在微信上手敲网址,就做了这个功能。

矛盾的彩蛋

点击屏幕的大部分区域会有彩蛋,随机弹出点个赞,留个言这类的词,颜色也是随机的。这个功能只花了30+行JavaScript代码,代码直接贴在最后了。我之前看到过这样的设计,忍不住点了好几次,觉得蛮有意思。第二天有朋友告诉我,他看我文章的时候,觉得彩蛋过于骚扰了。我仔细想了下,阅读文章的时候点击屏幕的概率不高,加个彩蛋无伤大雅。不过我最后还是将很多区域的彩蛋给去掉了,比如评论区和跳转链接。这些区域点击概率比较高,总是弹彩蛋,的确容易反感。

效果怎么样,既然实现了,先保留一段时间吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

<script>
(function (window, document, undefined) {
var hearts = [];
var keywords = ["点个赞", "留个言", "赞赏一下"];
function randomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
window.addEventListener('click', createWord)

function createWord(e) {
var d = document.createElement("span");
d.style.position = 'fixed';
d.style.zIndex = 9999;
d.style.color = 'rgb(' + [randomInt(255), randomInt(255), randomInt(255)].join(',') + ')';
d.innerHTML = keywords[randomInt(keywords.length)];
d.onselectstart = function () { return false; }

hearts.push({ el: d, x: e.clientX - 5, y: e.clientY - 5, alpha: 1, scale: 1 });
document.body.appendChild(d);
}
(function gameloop() {
for (var i = 0; i < hearts.length; i++) {
heart = hearts[i];
if (heart.alpha <= 0) {
document.body.removeChild(heart.el);
hearts.splice(i, 1);
continue;
}
heart.y -= heart.alpha < 0.5 ? 2 : 1;
heart.scale += 0.002;
heart.alpha -= 0.013;
heart.el.style.transform = 'scale(' + heart.scale + ')';
heart.el.style.left = heart.x + 'px';
heart.el.style.top = heart.y + 'px';
}
setTimeout(gameloop, 10)
})();
})(window, document);
</script>

专题: 建站经历

本文发表于 2019-06-23,最后修改于 2026-02-23。

本站永久域名「 geektutu.com 」,也可搜索「 极客兔兔 」找到我。


上一篇 « TensorFlow 2.0 (六) - 监督学习玩转 OpenAI gym game 下一篇 » TensorFlow 2.0 (七) - 强化学习 Q-Learning 玩转 OpenAI gym