Logo

site iconSeven | 小柒

Java 程序员,热衷自动化。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Seven | 小柒 RSS 预览

善用 MVP 思维,5 天时间零成本搭建小报童排行榜

2024-07-20 21:03:00

前言

你好,我是小柒。
Java 程序员,热衷自动化。

前段时间花了 5 天左右,借助 Notion + CloudFlare + Github Actions 零成本搭建了一个支持一键分销的小报童排行榜: https://xiaobot.osguider.com。在这里复盘一下过程,希望能够对你有所启发。

善用 MVP 思维,用最小的成本最快地实现最核心的功能,尽早触达用户,尽早获取反馈,不断迭代,不断升级。

什么是小报童排行榜?

小报童排行榜是一个罗列了(几乎)所有小报童专栏的导航网页。可以帮助你一键分销所有小报童专栏

小报童排行榜-最近更新专栏

为什么要做小报童排行榜?

  • 主要是因为小报童官方没有公开的专栏索引列表,但这个痛点确实是在的。既然有需求未被实现,机会不就来了?
  • 实现足够简单,成本足够低,做这个游刃有余。
  • 折腾副业,没自己的产品始终感觉没底气。所以,小报童排行榜可以是我的产品支撑,也可以是我向外链接的突破口。
  • 能给我带来收益:哪怕是最基础的小报童分销,也能带来一些收益。且不说后面依据这个产品的放大升级。

小报童排行榜给我带来了什么?

  • 我能做成一件事的信心
  • 和我一起做事的朋友
  • 借助小报童排行榜,链接到了更多朋友
  • 副业生态的起点
  • 一点点小钱

一些有趣的统计数据

  • 迄今为止我收录了 308 位作者的 403 个小报童专栏。其中:
    • 有 26 位作者的 38 个专栏订阅数量超过 3000,占比 9%。只要订阅数量超过 3000 就能跻身前 10%。
    • 有 50 位作者的 72 个专栏订阅数量在 1000 和 3000 之间,占比 18%。只要订阅数量超过 1000 就能跻身前 30%。
    • 有 97 位作者的 105 个专栏超过 1 年没有更新,算是已完结的状态。有人入场,有人离场。机会、永远都在那里等你,剩下的、就是你能否主动抓住它了。
    • 15 亿国人,你的竞争对手只有 308 位。其实只要开始,就已经是成功了。
  • 有很多数据不太好看的专栏(订阅数量为 0),其中绝大部分是订阅制而非买断式。因为小报童展示的订阅数=当前仍在订阅状态的用户数,当用户订阅到期不再续订时,这个数量就会减少。所以单从数据好看的角度考虑,买断式的专栏会更好一点。
  • 上线至今,小报童排行榜分销佣金收入 371.61 元,给朋友们定制一键分销系统(扣除返现后)收入 210 元。对于在互联网上流浪多年的我和 Huazi,这个正反馈极佳

我把手上已有的小报童专栏排名数据整理成了一个 Excel 表格,如果你想要自己做一些数据分析,可以通过 osguider 微信我领取。

搭建一个小报童排行榜,可以有多简单?

按照我以往程序员的思维,如果想要做一个小报童排行榜,至少要经历以下步骤:

  • 需求分析
  • 概要设计
  • 数据库设计
  • 爬虫&业务代码编写
  • 前端代码编写
  • 部署上线

带着完美主义的思维,最后可能是因为设计配色不满意、可能是因为前端代码没写好,也可能是爬虫做不出来……从而不了了之,前功尽弃。

这件事情,真的需要这么复杂吗?

需求分析

需求分析需要考虑两个层面:我想做什么?我能做什么?其中:

我想做的事情很简单:把所有小报童专栏汇聚到一个网页,供用户查阅和订阅。
我能做什么主要取决于我能从小报童官方拿到什么样的信息。经过简单的分析,我可以从小报童官方获取到以下信息:

  • 专栏名称
  • 专栏作者
  • 专栏介绍
  • 专栏订阅数量
  • 专栏内容数量
  • 专栏价格
  • 专栏分销比例
  • 专栏分销链接
  • 专栏创建时间
  • 专栏更新时间

小报童排行榜的核心功能是列举出所有的小报童专栏信息,Notion 数据库可以完美实现这个功能!说干就干!

数据库搭建

按照可以从小报童官方获取到的信息搭建 Notion 数据库,这个过程就像是给 Excel 添加多个列字段,非常简单。
这里不再赘述 Notion 的使用,如果你对 Notion 感兴趣,可以通过这几个链接学习。中文用户指南 | Notion Academy | Notion Help Center

一条 Notion 数据库记录长这个样子:

notion数据库记录-生财有术

汇总的列表长这个样子:

notion database-table-小报童专栏


Notion 极其强大!支持任意的页面嵌套,支持把任意页面发布为公网可以访问的网页,甚至可以给同一个数据库定制不同的视图!
那么依据这个功能,我们实际上已经完成了最简单的 MVP:手动收集小报童专栏信息,并通过 Notion 展示。

小报童排行榜的第一个 MVP 长这个样子:

小报童排行榜 Notion Site

数据爬取

作为一个程序员、作为一名 RPA 教练,手动录数据多少有点说不过去了吧?

我们来看几个小报童专栏分销链接:

  • 生财有术项目精选:https://xiaobot.net/p/shengcaiyoushu?refer=6f4ecc2b-70e9-4f58-82de-71e5b1f357ee
  • IP合伙人·八年成事(百问百答):https://xiaobot.net/p/IP10?refer=6f4ecc2b-70e9-4f58-82de-71e5b1f357ee

稍加比较就能发现,分销链接由以下几个部分组成:

  • 域名:https://xiaobot.net/
  • 小报童专栏 ID: shengcaiyoushu / IP10
  • 分销标识:refer=6f4ecc2b-70e9-4f58-82de-71e5b1f357ee

其中:域名是不变的,分销标识只跟发起分销的用户有关系,所以在收集专栏信息的时候,我们只需要收集小报童专栏 ID 即可。这一个步骤,现在确实是手动收集和录入的。
但在这之后,我们可以通过拼接域名和小报童专栏 ID 得到指定小报童专栏的页面地址。访问专栏页面,可以获取到我们需要的几乎所有信息,通过 RPA/写代码 手段轻松获取(这里我的方案是通过 CloudFlare Workers 调用小报童接口获取数据,再使用 Notion API 写入数据库)。
请适当控制 RPA 运行频率,保护服务器负载。

小报童专栏主页-生财有术项目精选

到这里,内容的自动爬取和更新也搞定了。

页面编写 & 自动发布

Notion 也有缺点。毕竟是海外的产品,国内访问速度非常不稳定,根据我自己的测试,Notion Site 在极端情况下需要 10-20 秒才能加载出来,这个速度用户肯定是无法忍受的。在我的认知体系内,写一个静态页面是比较好的解决方案。

在看过我自己写的丑得不能再丑的 HTML Table 之后,我的设计师伙伴 @Huazi 终于还是忍不住亲自上场了。他负责页面样式,我负责内容填充,完美配合。

技术选型大概是这样的:

  • 页面样式:HTML + CSS + JavaScript + Tailwind CSS
  • 内容渲染:通过 JavaScript 脚本调用 Notion API 获取数据,再使用 eleventy 把数据渲染到 HTML。
  • 自动化:通过 Github Actions 每天定时执行内容渲染逻辑,然后自动发布网页到服务器。

至此,第二版小报童排行榜问世:小报童排行榜

小报童排行榜-最近更新专栏

赋能

前面的小报童排行榜只能帮助我自己分销所有小报童专栏,分销佣金也只能我自己拿,怎么让别人愿意帮我推广小报童排行榜呢?最简单的方法当然是让利!
通过给别人定制一键分销网页,页面里所有小报童专栏全部改成别人的分销链接。这样别人也可以通过自己的一键分销网页分销小报童专栏获取收益,我收取一定的技术维护费用,各取所需,各享其利。

实现也很简单,增加一个 Notion 数据库记录分销商信息:

Notion数据库-分销商

通过 Cloudflare Workers 读取 Notion 分销商数据库信息,然后通过 eleventy 渲染子页面并发布即可。这里有几个一键分销页面,可供参考:

  • https://xiaobot.osguider.com/osguider/
  • https://xiaobot.osguider.com/HeyHuazi/
  • https://xiaobot.osguider.com/76718400/
  • https://xiaobot.osguider.com/whyvincent/
  • https://xiaobot.osguider.com/Help000000/
  • https://xiaobot.osguider.com/fxm99960/
  • https://xiaobot.osguider.com/LSL021102/
  • https://xiaobot.osguider.com/yzhm111/
  • https://xiaobot.osguider.com/baojie_xmg/
  • https://xiaobot.osguider.com/liuliuzaish/
  • https://xiaobot.osguider.com/yi25390/
  • https://xiaobot.osguider.com/HX1747023971/
  • https://xiaobot.osguider.com/595683079/
  • https://xiaobot.osguider.com/1738407610/

未来的计划

  • 表单提交自动收录:小报童专栏作者填写金数据表单,cloudflare workers 自动爬取专栏信息并收录到 Notion 数据库。
  • 表单提交自动生成一键分销链接:想要构建一键分销系统的朋友填写金数据表单,cloudflare workers 自动构建一键分销页面。
  • 知识星球绑定销售:做一个知识星球强化个人 IP,小报童排行榜作为赠品而不是单独销售。这样可以把认可产品的朋友带入到我的 IP 圈,逐渐影响,让他们认可我这个人,进而创造更多合作的机会。

后话

当然,现在的小报童排行榜并不完美。
比如现在还不支持分页,比如现在只能用 Ctrl + F 做检索,比如不支持用户自定义要分销的专栏列表。
如果你也觉得有些不爽的地方,欢迎找我聊聊,万分感激。

致谢

感谢我的队友 @Huazi,没有他,小报童排行榜不会如此美观,不会如此受人欢迎。

关于我

重新认识一下。
你好,我是小柒,微信 osguider
Java 程序员,热衷自动化。生财有术 RPA 航海教练(23 年 12 月)。


小报童排行榜 作者,支持一键分销所有小报童专栏,也可以给你定制专属分销链接,欢迎体验。


开源服务指南主理人,依托 Notion 搭建了完整的自动化工作流和图文生成体系,这个后面也会写复盘。

目前实现了:

  • 每天自动从 Github 爬取开源项目信息
  • 自动调用 ChatGPT 开源项目简介
  • 手动审核 ChatGPT 生成的简介并标记审核状态
  • 借助 Pipedream 和 Notion 把已审核的开源项目自动汇总成 Markdown 格式的文章
  • 借助 mdnice 把 Markdown 文章自动转为微信公众号图文
  • 手动分发(等后面抽出时间这里可以用 Automa 做自动分发)

了解开源服务指南:

  • 官网
  • 微信公众号:开源服务指南

做过一个不起眼的导航网站:看见导航 收藏了很多我见过且觉得值得推荐的网页和工具,可能会对你有所帮助。


写过一写 Java 开发工具的使用经验:Intellij IDEA 最佳实践


也欢迎访问我的个人博客:Seven’s blog


给 eleventy(11ty) 添加 sitemap.xml 和 robots.txt

2024-06-14 10:09:55

配置过程

  1. 添加数据文件 _data/site.json,写入以下内容,定义站点信息和 sitemap 中的一些默认值:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "baseUrl": "https://xiaobot.osguider.com",
    "robots": "/robots.txt",
    "sitemap": {
    "path": "sitemap.xml",
    "changefreq": "daily",
    "priority": 0.5
    }
    }
  2. 添加 sitemap 模板文件,写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ---
    permalink: "{{ site.sitemap.path }}"
    eleventyExcludeFromCollections: true
    ---
    <?xml version="1.0" encoding="UTF-8"?>

    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    {% for page in collections.all %}
    {% unless page.data.sitemap.ignore %}
    <url>
    <loc>{{ site.baseUrl }}{{ page.url | url }}</loc>
    <lastmod>{{ page.date | date: '%Y-%m-%dT%H:%M:%S.%LZ' }}</lastmod>
    <changefreq>{{ site.sitemap.changefreq }}</changefreq>
    <priority>{{ page.data.sitemap.priority | default: site.sitemap.priority | default: 0.5 }}</priority>
    </url>
    {% endunless %}
    {% endfor %}
    </urlset>
  3. 【可选】配置不同页面的 sitemap 表现:

    • 如果不希望某些页面在被包含在 sitemap 文件中,在页面元数据中添加 sitemap.ignore: true 即可;
    • 可以对不同的页面设置不同的 sitemap 优先级,在页面元数据中添加 sitemap.priority: 0.5,取值范围 0-1;
    • 对于分页数据,要设置 pagination.addAllPagesToCollections: true 才会在 sitemap.xml 文件中包含每一个分页页面。
  4. 添加模板文件 src/robots.txt,写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ---
    eleventyComputed:
    permalink: "{{ site.robots }}"
    eleventyExcludeFromCollections: true
    ---
    Sitemap: {{ site.baseUrl }} {{ site.sitemap.path }}

    User-agent: *
    Disallow:

重新编译,over!

参考文档

  • How to create sitemap.xml
  • Sitemap xml
  • liquid
  • sitemap format

开源服务指南博客文章自动生成

2024-04-21 18:09:55

  1. GitHub Actions 可以添加运行参数。我只需要设置 filepath 和 content 两个参数,然后配合 shell 脚本就可以自动生成和提交博文到 GitHub 仓库,进而触发自动构建和发布。

  2. GitHub Actions 提供了 REST API 来触发前面的工作流,这样我就可以通过 HTTP 请求来自动生成和发布博文。

  3. 开源服务指南数据库现在是建立在 Notion 上的,Notion 也提供了 REST API 的交互方式。所以我只需要定时扫描 Notion 数据库,获取状态刚变更为 “已发布” 的博文,提取文章内容,通过第 2 步中提到的 REST API 来触发第 1 步中提到的 GitHub Actions 即可自动生成和发布博文。这里我使用了 Cloudflare Workers 实现。

  4. 怎么监测 Notion 数据库文章状态变动呢?想要监测状态“变动”,我们需要知道变动前的状态和变动后的状态,进而需要有数据库缓存变动前的状态,能做,但麻烦。所幸,pipedream 帮我们做好了这个事情。它能够监测 Notion 数据库变动,并且触发工作流执行。


所以,最后的工作流程就是:

  • Pipedream 监测开源服务指南 Notion 文章数据库变动,提取状态为“已完成”的文章,把文章 id 通过 HTTP 请求发送给 Cloudflare Workers;
  • Cloudflare Workers 根据文章 id 查询文章内容,把文章路径和文章内容作为参数,发送请求给 Github Actions;
  • Github Actions 把文章内容写入文章路径,提交文章源文件到 Github 仓库;
  • Github Actions 监听代码提交,持续集成和发版;

嗯,云服务挺好用。

置于为什么不直接用 Pipedream 提取参数触发 Github Actions 工作流,个人主观意愿影响比较多:Pipedream 代码编写体验略差,稳定性欠佳,所以在逐步往 Cloudflare Workers 迁移。这个回头细讲。


附录:

  • Github Actions 文档
  • Cloudflare Workers 文档
  • Pipedream 文档
  • 第 1 步中提到的 Github Actions 代码:
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
name: Create Post

on:
workflow_dispatch:
inputs:
path:
description: 'File path'
required: true
content:
description: 'File content'
required: true

permissions:
contents: write

jobs:
create-file:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Create Post
run: |
cat << EOF > ./content/post/${{ github.event.inputs.path }}
${{ github.event.inputs.content }}
EOF

- name: Commit and push changes
run: |
git config user.name "username"
git config user.email "[email protected]"
git add ./content/post/${{ github.event.inputs.path }}
git commit -m "add post: ${{ github.event.inputs.path }}"
git push
  • 第 2 步中提到的 HTTP 请求:
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
import axios from 'axios';

const filePath = 'daily/daily-01.md';
const fileContent = 'Hello World';

const owner = "osguider";
const repo = "blog";
const workflow_file = "create-post.yml";
const url = `https://api.github.com/repos/${owner}/${repo}/actions/workflows/${workflow_file}/dispatches`;
const headers = {
'Authorization': `Bearer ${process.env.GITHUB_REPO_PAT_BLOG}`,
'Accept': 'application/vnd.github.v3+json',
'Content-Type': 'application/json'
};
const data = {
'ref': 'main',
'inputs': {
path: filePath;
content: fileContent;
},
};

axios.post(url,
data,
{ headers: headers })
.then((response) => {
console.log('GitHub Action dispatched successfully!');
})
.catch((error) => {
// TODO 错误通知
console.log(`Failed to dispatch GitHub Action: ${error}`);
});

IC卡、ID卡、CPU卡、RFID 和 NFC 的区别与联系

2024-01-02 23:28:13

RFID 卡

是指非接触式类电子卡片/标签,包括有ID卡、IC卡和NFC卡以及其它等电子卡/标签。他们主要的区别在于工作频段。

NFC

NFC,全称是Near Field Communication,“近距离无线通信”,NFC本质信息双向交换。

NFC和RFID都是基于位置相近的两个物体之间的信号传输,NFC技术增加了点对点(P2P)通信功能,NFC设备彼此寻找对方并建立通信连接。P2P通信的双方设备是对等的,而RFID通信的双方设备是主从关系。

NFC 的工作频率是 13.56Mhz,所以只能读取和模拟 13.56Mhz 的 IC 卡。

ID 卡

全称身份识别卡(Identification Card),低频(频率有125Khz、250 Khz、375 Khz、500 Khz等)。
只能读卡,不可写入、不可存储、不可加密的感应卡,(卡面)含固定的编号,出厂时固化了ID。

  • 特点

    卡面上有 10 位或者 8 位数字(卡号)。

  • 安全性

    安全性较低,ID 卡不可存储,所以卡片持有者的权限、功能操作要完全依赖于网络系统。
    很容易复制

  • 应用

    门禁系统、企业工牌

IC 卡

全称集成电路卡(Integrated Circuit Card),也称智能卡(Smart Card)。
可读写数据、容量大、有加密功能、数据记录可靠、使用更方便,如一卡通系统、消费系统等。

  • 网络依赖性

    IC 卡可记录用户资料,可脱离网络使用

  • 安全性

    IC 卡的加密和反复读些的特性,使其安全性远大于 ID 卡

  • 应用

    门禁卡、地铁、校园一卡通。
    二代身份证属于 type B 射频 IC 卡

CPU 卡

如果不强调的话CPU卡也是IC卡的一种,是高级版的IC卡,CPU卡有信息处理的功能,优点是存储空间大、读取速度快、支持一卡多用功能等特点 。如果不强调无线的话,电话卡中SIM卡就是典型的CPU卡。

  • 安全性

    CPU卡内含有随机数发生器,硬件加密算法等,配合芯片上的OS系统,达到金融级的安全级别,防止重复卡、仿制卡、卡上数据非法修改

  • 应用

    金融、保险、交警、政府行业等多个领域,小额支付行业
    SIM 卡

参考资料

  • IC卡、ID卡、CPU卡、RFID和NFC的区别
  • ID / IC 卡基本原理介绍与门禁卡 DIY

MySQL 数据库数据同步方案调研

2024-01-02 23:28:13

名词

  • CDC(Change Data Capture): 数据变化捕获
  • ETL(Extract Transform Load):数据提取、转换、载入

工具

特色 Canal mysql_streamer go-mysql-transfer Maxwell Databus DataX
开源方 阿里巴巴 Yelp - zendesk LinkedIn 阿里巴巴
开发语言 Java Python Golang Java Java Java
活跃
高可用 支持 支持 支持 - 支持 -
文档 详细 还行 详细 详细 详细 还行
数据源 Mysql Mysql Mysql Mysql Mysql
Oracle
MySQL
Oracle
OceanBase
SQLServer
PostgreSQL
DRDS
ALL_RDBMS
ODPS
OSS
OTS
Hbase0.94
Hbase1.1
Phoenix4.x
Phoenix5.x
MongoDB
Hive
Cassandra
TxtFile
FTP
HDFS
TSDB
TDengine
OpenTSDB
接收端 编码定制 Kafka等(MQ) Redis
MongoDB
Elasticsearch
RabbitMQ
Kafka
RocketMQ
HTTP API
后续支持更多
stdout
Kafka
Kinesis
Nats
Google Cloud Pub/Sub
Google Cloud Bigquery
RabbitMQ
Redis
SNS
编码定制? MySQL
Oracle
OceanBase
SQLServer
PostgreSQL
DRDS
ALL_RDBMS
ODPS
OSS
OTS
Hbase0.94
Hbase1.1
Phoenix4.x
Phoenix5.x
MongoDB
Hive
Cassandra
TxtFile
FTP
HDFS
TSDB
TDengine
ADS
OCS
Elasticsearch
全量数据初始化 不支持 支持 支持 支持(maxwell-bootstrap) - 支持
数据格式 编码定制 Json(固定格式) Json(规则配置)
模板语法
Lua脚本
Json (固定) 编码定制? -
备注 需要写代码定制接受端 可扩展性更强,但是上手难度更高 数据同步非实时
实际使用配合 datax-web 体验更佳

alibaba/canal | 文档 | Docker

基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

canal-work-flow

由Java开发,分为服务端和客户端,拥有众多的衍生应用,性能稳定,功能强大;canal 需要自己编写客户端来消费canal解析到的数据。

Yelp/mysql_streamer | 文档

wj596/go-mysql-transfer | 文档

zendesk/maxwell | 官网 | 文档

linkedin/databus | 文档

Databus是一种低延迟变化捕获系统,已成为LinkedIn数据处理管道不可或缺的一部分。Databus解决了可靠捕获,流动和处理主要数据更改的基本要求。Databus提供以下功能:

源与消费者之间的隔离
保证按顺序和至少一次交付具有高可用性
从更改流中的任意时间点开始消耗,包括整个数据的完全引导功能。
分区消费
源一致性保存

上手难度较高。

alibaba/DataX | 简介 | WeiYe-Jing/datax-web | qlangtech/tis

DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。

配合 DataX-Web 可视化配置任务。

osheroff/mysql-binlog-connector-java | Maven

在 Java 中消费 Mysql Binlog。

参考文档

  • MySQL数据 实时同步到Kafka –Binlog canal、Maxwell、Kafka Connect 实现MySQL增量同步
  • 实时数仓 | mysql的binlog实时同步工具对比