Drift 是一个可以自行架设的 Gist 代替。使用 [[Next.js]] 13 和 React Server Components 编写。
Drift 发布了一个官方的 Demo
分享的文件页面内容
目前官方还没有发布编译好的 Docker 镜像,需要自己编译部署。但是也非常简单。
拉取官方的代码
git clone https://github.com/MaxLeiter/Drift.git
cd Drift
docker-compose build
目前为止因为项目还在开发过程中,编译过程可能会出现一些问题。
编译完成直接运行下面的命令即可。
docker-compose up -d
虽然我把其他服务陆陆续续从 Google 迁移出来,但 Google Analytics 一直都运行良好所以也没有怎么管,但 Google Analytics 到今年年中的时候会强行升级 GA4,看了一下升级的过程和 Google Analytics 的操作实在太复杂,就诞生了迁移出 Google Analytics 的想法。简单地了解了一下目前的 Google Analytics 的代替品,收费的,自行架设的还很多选择。这篇文章就简单地对比一下。
主要还是分成两个部分来划分搜罗的产品,可以自行托管的,和商用的。看过我之前文章的小伙伴应该知道,我个人会偏向于开源,可自行托管的服务。即便这个服务还在初始阶段可能还比不上某个商业化的服务,但我依然会选择开源的那个,比如我会选择 [[Wallabag]] 更甚于 [[Pocket]] 和 [[Instapaper]],我会选择 [[miniflux]] 更甚于我过去常常推荐的 InoReader。如果实在找不到合适的开源的,我会优先选择数据归属权在于个人的服务(比如数据不联网,存在本地,可以使用纯文本或有格式的类型导出数据),比如 Obsidian 更甚于 [[Notion]] 和 [[Roam Research]] 以及一切基于网页的笔记应用。
可 Self-hosted:
不可自架,闭源
下面就重点介绍一下我准备去试试的几个服务。
Umami 是一个可以自托管的数据统计服务,可以用来代替 [[Google Analytics]]。 “Umami”,源于 “Umai”,在日语里是“美味、鲜味”的意思。
Matomo (原名 Piwik)是一款使用 PHP 编写的网站访问统计分析工具,开源,可自行架设,可以很好的代替 [[Google Analytics]] ,Matomo 使用 PHP 和 MySQL 实现,已经被超过 100 万网站所使用 。
Matomo 非常强大,并且只需要一来 PHP 和一个数据库,并且其报表分析非常强大。
Fathom Analytics 是一个 [[Google Analytics]] 的代替。Fathom Analytics 是一个基于加拿大的团队推出的服务。
Fathom Analytics 是一个官方推出的 SaaS 平台,是一个收费的商业服务。如果不想使用官方的,也可以利用 Fathom Lite 自己搭建服务。
Fathom Lite 主要是使用 Go 语言 和 JavaScript 编写。Fathom Lite 和 Analytics 的区别可以参考这里。
Plausible 是一个简单的 [[Google Analytics]] 代替。Plausible 是使用 [[Elixir]] 语言编写的,我最早知道这个服务是在 Twitter 上偶然之间看到了创始人分享如何想要找到一个 Google Analytics 代替,然后自己做,最后到如何打造成为一个 SaaS 产品,支撑自己的全部生活的成功故事。
shynet 是一款使用 Python 编写的网站流量分析工具。
Ackee 是一个关注隐私的开源(基于 MIT 协议)网页分析工具,采用轻量级的 Node.js 和 MongoDB 架构,接口使用 [[GraphQL]]。
Ackee 界面简洁美观,采用匿名数据采集的方式,分析你网站的流量并在最小的界面中提供有用的统计信息。对于不需要像 Google Analytics 或 Matomo 这样的全功能营销分析平台的个人来说,是一款非常不错的工具。
除了浏览了一下官网和 GitHub 页面,没有对这些产品更进一步的了解了,但是我个人感觉 Umami 还不错,页面简洁,功能也满足我的使用。然后后端数据库支持 PostgreSQL 和常用的 MySQL,并且浏览了一下帮助文档,发现还支持 PlanetScale ,并且资源消耗也比较小,所以立马 Docker 搞起,创建数据库连接字符串,然后直接拉取镜像就能起来,配合 HestiaCP 申请一个 SSL 证书很快就搞定了。
it-tools 是一个使用 [[Vue.js]] 和 TypeScript 编写的常用 IT 工具的集合。
it-tools 项目中集成了如下的工具:
使用 Docker 镜像可以很快的安装上。更加具体的 docker-compose.yml
可以见这里
git clone https://github.com/einverne/dockerfile.git
cd dockerfile/it-tools
docker-compose up -d
it-tools 也可以作为一个很好的学习 Vue 和 TypeScript 的项目,给这个项目贡献一个常用的工具库,用 Vue 绘制界面可以很好的上手 Vue 的使用。
EV Hosting 上线了域名注册服务,现在可以在 EV Hosting 选购超过 20 种的域名后缀,包括了常见的 .com, .org, .me, .info 等,还上线了 .fun, .life, .studio, .store 等等新的顶级域名。域名的价格在不同时期会略有不同。
在目前阶段,.fun, .pw, .life, .shop, pics, .studio, 等等域名只需要 20~30 元不等就可以购买一年。但是域名的续费一般会比较贵,可以酌情考虑不同的域名后缀。EV Hosting 也会在不同时间提供最优惠的域名注册服务。
请注意购买域名之前,保证自己的注册邮箱是能够接收邮件的,在注册完成之后会受到一封验证邮件,域名注册局在第一次购买时需要验证该邮箱的使用。
在下一个页面中进行支付。
完成付款之后在「我的域名」中就能看到购买的域名。
在 EV Hosting 中,点开对应的域名,可以在侧边栏中修改 NS 名称服务器(Name Server)。
本站提供的四个名称服务器可以在这里 查看(仅注册用户可见)。
更推荐将域名添加到 Cloudflare 后台进行管理,访问 Cloudflare 后台,然后将域名添加到 Cloudflare。使用 Cloudflare 可以免费享受其提供的 CDN,还能隐藏背后服务器的 IP 地址。现在就介绍一下如何将 EV Hosting 购买的域名添加到 Cloudflare 。
首先要有一个 Cloudflare 的账号,进入账号之后,点击 「Add a site」,然后输入自己购买的域名。
然后再下一步中选择 Free,使用免费套餐。然后 Cloudflare 会自动对域名进行扫描,自动找到域名的 DNS 记录,点击导入。然后 Cloudflare 会给出两个 Name server 的地址,将这两个服务器配置到 EV Hosting 域名管理后台的名称服务器中。
完成配置之后,等待一段时间 NameServer 生效,点击页面中的 「Done,check nameservers」。Cloudflare 会自动检查 DNS 是否生效,如果检查通过,会发一封邮件到 Cloudflare 的邮箱中。
添加到 Cloudflare 之后就可以使用 Cloudflare 的 DNS 管理,添加 [[A 记录]], [[TXT 记录]], [[CNAME 记录]] 等等了。
[[Ansible]] 是使用 Python 开发的自动化运维工具。它可以配置管理,部署软件并编排更高级的任务,例如持续部署或零停机滚动升级。Ansible 可以用来管理 crontab。[[Crontab]] 是一个用于在 Unix 和 Unix-like 操作系统上执行定期任务的工具,它允许用户在预定的时间间隔内自动运行命令或脚本。Crontab 是 Cron Table 的缩写,Cron 是一个用于定时执行任务的守护进程。
Crontab 使用一个称为 crontab 文件的特殊文件来定义定期任务的计划。每个用户都可以拥有自己的 crontab 文件,其中包含一系列命令或脚本以及与之关联的时间规则。更加详细的 cron 使用可以参考之前的文章
借助 Ansible,用户可以轻松地创建、修改和删除 crontab 条目,自动化 Crontab 任务的管理。
在没用使用 Ansible 之前,都是通过 crontab -e
手动对 cron 任务进行管理,通常的任务就是备份与同步。但是随着要管理的机器和需要定义的脚本内容越来越复杂,手工编辑 crontab 就无法维护了。
另外在学习 Ansible 之后,了解了「Infrastructure as Code」概念,通过配置文件来定义所有的配置修改是一个不错的解决方案。这样一方面不用自己备份所有的脚本内容,也不用每一次都临时创建。在系统初始化的时候,直接通过 Ansible 就能纳入管理。
首先,确保你的系统上已经安装了 Ansible。你可以使用包管理器来安装它。例如,在 Ubuntu 上,你可以运行以下命令:
sudo apt update
sudo apt install ansible
下面是一些使用 Ansible 管理 crontab 的常见任务示例:
使用 Ansible 创建 crontab 条目非常简单。你可以编写一个 Ansible playbook 文件,其中定义了你要创建的 crontab 条目。以下是一个示例 playbook 文件的内容:
---
- name: Manage crontab
hosts: your_target_hosts
tasks:
- name: Add crontab entry
cron:
name: "rsync backup"
minute: "0"
hour: "2"
job: "/path/to/your/backup_script.sh"
在这个示例中,your_target_hosts
是你要管理 crontab 的目标主机的列表。name
字段是 crontab 条目的名称,minute
和 hour
字段是定时任务的执行时间,job
字段是要执行的脚本或命令。
保存以上内容到一个 YAML 文件(比如 crontab.yml
),然后运行以下命令来执行 playbook:
ansible-playbook crontab.yml
将在目标主机上创建一个新的 crontab 条目。
要修改或删除现有的 crontab 条目,你可以使用 Ansible 的 cron
模块的 state
参数。以下是一个示例 playbook 文件,演示如何修改和删除 crontab 条目:
---
- name: Manage crontab
hosts: your_target_hosts
tasks:
- name: Modify crontab entry
cron:
name: "My cron job"
minute: "30"
hour: "3"
job: "/path/to/your/updated_script.sh"
state: present
- name: Remove crontab entry
cron:
name: "My cron job"
state: absent
在这个示例中,state: present
表示修改 crontab 条目,state: absent
表示删除 crontab 条目。保存以上内容到一个 YAML 文件,然后运行 ansible-playbook
命令来执行 playbook。
Stock Event 是一款投资组合追踪器,股票市场和股息追踪器,Stock Event 可以追踪的内容包括股票、ETF、加密货币、指数、外汇、大宗商品、各地交易所等等。Stock Event 最亮眼的一个功能就是可以追踪公司的分红日期,通过图表视觉化的追踪给用户提供了最详细的分红数据。另外加入 Pro ,就可以查看包括各地失业率在内的更多数据。同样使用 Pro 可以解锁无限制的关注数量,可以自定义收藏,并且连接个人日历,获取即将上市的 IPO 信息。
在首页中非常清晰地绘制了当前持仓的涨跌幅,以及投资组合的股息。
在四个标签中的最后一个「收藏」中能看到 Stock Event 给出的一些组合,可以点进这些分类然后关注。
在首页的收藏中 Stock Event 提供了几种分类,包括:
时间线界面中展示了当前用户关注列表中的公司(标的)的重大新闻时间线。
虽然我个人并不喜欢这样大面积留白的设计,我觉得信息展示的效率太低了,但至少也还能做一下参考。
第三个标签页是搜索和新闻的界面,可以在这个界面里面寻找自己关心的标的添加关注,也可以在这个界面中查看相关的新闻。
第四个标签页就是最基本的关注列表。基础账号最多可以添加 15 个关注,如果使用我的链接 注册,可以再永久获得 5 个关注位置。
界面简洁,非常适合我这样不经常进行交易,只想快速在几秒钟的时间内了解一下当下行情的人。Stock Event 适合作为交易所软件的一个补充,交易软件比如 富途,老虎,华泰,长桥等,通常在交易软件中就会不自觉地进行操作(买卖),但是大部分的股票我是不会进行短期的买卖的,但如果常常打开股票交易软件就会控制不住自己的手。这个 Stock Event 就只是作为一个追踪器,并且可以在一个应用中查看股票,加密货币,就大大操作。Stock Event 操作起来也比交易所软件简单很多。
Stock Event 所提倡投资方法其实在其应用的设计中就能体现出来,Stock Event 将高股息,除息日都设计得非常直观,并且 Stock Event 还会推荐[[市盈率]]比较低的标的,让我们可以快速地获取价值投资中说的那样,找到高价值低价格的内容,然后长期持有。
如果看到这里了,那么可以使用我的邀请链接 注册,你我都可以在免费版的基础上增加 5 个关注列表。另外我还有一个专门写投资的博客,如果关注港股,美股和加密货币,也可以去看看。
Hestia Control Panel ([[HestiaCP]]) 是一个免费开源的 Web 服务器控制面板,它提供了一个易于使用的 Web 界面来管理 Web 服务器和网站。Hestia CP 支持多种 Linux 发行版,包括 Ubuntu、Debian、CentOS 等,可以安装和配置 Apache 或 Nginx、PHP、MySQL 等常见的 Web 服务器和数据库软件。Hestia CP 还提供了一些额外的功能,如邮件服务器、防火墙、文件备份和恢复等。
open_basedir
是 PHP 的一个安全特性,用于限制 PHP 脚本能够访问的文件系统路径。它指定了一个或多个目录的列表,PHP 将只允许访问这些目录中的文件。这可以帮助防止恶意脚本访问系统中的敏感文件。
open_basedir
最主要的功能就是隔离站点能访问的内容,而从不至于让站点之间相互影响。
如果要禁用这个功能,需要修改 PHP 的配置,访问
cd /usr/local/hestia/data/templates/web/php-fpm/
文件夹下有安装的 PHP 版本不同的配置。比如说 PHP 8.0 的配置模板文件,就是 PHP-8_0.tpl
打开该文件,然后找到下面一行
php_admin_value[open_basedir]
然后在这一行前面加上 ;
注释。
;php_admin_value[open_basedir]
或者如果熟悉命令行的话,可以直接使用 sed -i
行内替换
sed -i 's/php_admin_value\[open_basedir\]/;php_admin_value\[open_basedir\]/g' /usr/local/hestia/data/templates/web/php-fpm/PHP-8_0.tpl
修改文件之后需要重启 PHP 8.0 的服务
/etc/init.d/php8.0-fpm restart
完成设置之后,就可以使用 phpinfo.php
来查看 open_basedir
的设置,应该会看到 no value
的字样。
CrossBox 是一个 All-in-One 的,可自行架设的,的通信套件,包含了及时通信,邮件,文件存储等等组件。CrossBox 致力于为托管/电子邮件提供商提供一体化的、100%自托管的通信套件。它允许服务提供商利用现有的基础设施,为客户提供通常仅在 Gmail、Outlook 和其他大型 SaaS 平台上可用的通信功能(并且完全符合 GDPR 规定)。
最值得注意的功能就是 CrossBox Cluster。它使服务提供商能够为不同服务器上的所有客户提供单一的入口点。其中包括统一的 Webmail URL,统一的 IMAP,SMTP,POP3 主机名以及统一的 MX。在更复杂的线上环境中,提供商还可以选择构建高可用性,负载均衡和地理分布式设置 - 使得它可以轻松实现 100%可用性,水平扩展以及来自世界不同地区的用户获得快速访问。
CrossBox 集成了超过 40 多个工具和功能,包括了邮件,即时通信,音频和视频通话,会议,屏幕分享,文件存储分享,等等。可以从官方页面的介绍中了解更多。或者直接试用线上版本 进行体验。
CrossBox 的 White-label Add-on 也可以让服务提供商自定义应用的名字,Logo,主题颜色,登录地址,[[webmail]] 域名,IMAP/SMTP/POP3 hostnames,MX 等等细节。更甚至服务提供商可以利用 在线的应用构建程序 直接生成 Android/iOS 的应用。
CrossBox 还提供了 [[DirectAdmin]],[[cPanel]],[[Plesk]] 控制面板的集成。服务提供商一键接入即可,无需任何的修改。1
现在 EV Hosting 也上线了自定义域名邮箱服务,如果你想要一个可以自己控制的域名邮箱,欢迎订购使用,现在使用 EV_MAIL_INIT 可以享受年付 5 折优惠。
很偶然的机会在 Twitter 上看到有人分享了读书笔记,于是就加入了待看书单。
大卫-鲁宾斯坦 David Rubenstein 是彭博一个备受欢迎的财经访谈节目主持人。出于对历史的热爱,他还主持了一档历史节目。作为亿万富翁,他是著名的私募股权公司凯雷集团(The Carlyle Group)的联合创始人。他曾是职业律师,并担任过政府官员。
这是作者以主持人身份采访了一批当今大师级投资者后写的。试图总结出这批人的投资风格、思维模式、行为方式和人生态度等多方面共性。 而作者的经历也体现出富翁们的共性:高度的职业精神。
作者写作本书的目的是要向几十年前的《金钱大师》(The Money Masters)致敬。当年那本经典著作总结了 9 位大师的投资之道。而本书的重点并不是投资的干货,而是努力观察 23 位现在很活跃的投资家共同的特点。
在阅读的过程中,我脑海中一直会跳跃出 [[Naval Ravikant]] ,[[芒格]] 等等人的形象,好的投资人都有一些共同的技能和特点,我一直都认为好的投资一定是做对了什么,而这些投资家看待事情的角度,做对事情的过程,以及内在的思维模式,往往就隐藏着他自己的思考。他们所拥有的「技能」,「思想」,「习惯」,都是值得我们普通人去学习和借鉴的。在书中可以看到的是,这些投资家大多数来自于普通的家庭,往往并不是金融领域的,并且可能还遭遇过很多的失败。但是他们从来不因此而放弃,也从来不跟随市场,他们愿意承担自己的做出的选择所带来的后果,并且愿意承担错误的后果,能够及时地纠正自己的错误,谦虚低调。
最后我想说的是,投资是一门手艺,投资的经验是不可代替的,我们不应该期望通过阅读成功投资者的采访来成为更好的投资者,就像我们不应该期望通过阅读 NBA 球员的采访来成为更好的篮球运动员一样。但是我们要看到成功者身上独特的闪光点:
对投资感兴趣的人。
在使用 [[ChatGPT]] 的时候总是对它一个字一个字的出结果感到焦急,虽然也知道 AI 生成内容的时候确实是一个字一个字计算出来的。OpenAI 使用这样的一个打字机效果也确实符合这个使用场景。但是当我想要自己去实现这样的效果的时候就突然遇到了我的知识盲区,观察 Chrome DevTools,我原本还以为是用 Web Socket 实现的,但是观察了一番发现并没有 Web Socket 的连接。再观察 https://chat.openai.com/backend-api/conversation
接口,发现 content-type: text/event-stream; charset=utf-8
,于是就有了这篇文章。
Server-sent Events (SSE) 是一种服务器推送技术,利用该技术可以让服务器通过 HTTP 连接向客户端推送通知,消息,事件。SSE 通常用于向浏览器客户端发送消息更新或连续数据流,通过称为 EventSource 的 JavaScript API 来增强本机跨浏览器流媒体,客户端通过请求特定 URL 来接收 Event Stream。 SSE 的 media type 为 text /event-stream
。
当我们开发需要数据实时更新的项目时,通常有一个问题,就是「如何从服务端向客户端发送消息/更新」,通常情况下有三种处理方式:
客户端以固定间隔向服务端轮询查询更新。这个技术不是很新,实现比较简单。但这种技术只能算作准实时。
Websocket 是一个流行的技术,用来提供客户端和服务端的双向数据传输。
Websocket 不是基于 HTTP 协议的,所以需要额外的安装和集成,开发和实现难度稍微比 Client Polling 复杂一些。
Server-Sent Events 是一个最新的技术,基于 HTTP,提供从服务端到客户端的异步消息通讯。几乎所有的浏览器都支持 SSE,除了 Internet Explorer。
SEE 使得服务器可以不依赖任何 polling 或 long-polling 的机制来发送消息给客户端。
GET /api/v1/live-stream
Accept: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
text/event-stream
表示客户端会从服务端等待事件流。no-cache
表示禁止缓存。
这个请求会开启一个长连接,服务端可以将实时的内容发送给客户端。Events 发送的内容是 UTF-8 编码的文本内容。
Microsoft 提供了 fetch-event-source 这个库来实现了 POST 请求的 EventSource。