Jan 24, 2022
使用 gRPC 与前端交互
使用 gRPC 与前端交互。详细介绍了 gRPC-Gateway 和 gRPC-Web 项目,以及它们在实现 Server Streaming 的方法。另外,也对它们的场景进行了比较。
Jan 12, 2022
服务端实时"动画"渲染
实时"动画"渲染服务:使用 multipart/X-Mixed-Replace 实现服务端推送的 JPEG 动图,将实时更新的数据以 MJPEG 的形式展示在网页上。
Jan 01, 2022
在生产环境使用 gRPC
在本文中,作者总结了在使用 gRPC 时需要进行的工作,重点是在 Go 中展示 gRPC 的实践。主要内容包括:gRPC 兼容 HTTP/JSON 接口、在 gRPC 中定义 ProtoBuf RPC 接口映射、挂载 gRPC-Gateway、监听同一个端口、为前端提供接口等。
Dec 29, 2021
自定义即刻 Yellow Page 域名
通过 Cloudflare Worker 为即刻 Yellow Page 挂载自定义域名,实现反向代理。文章分析了 YP 的网页渲染过程,提出使用 Cloudflare Worker 的简单劫持方案,并提供了代码实践。Length: 47
Dec 20, 2021
尝鲜 Go1.18
Go1.18 beta1已发布,可以使用Go Version Manager安装。使用泛型相关的项目需要重新安装gopls以便vscode能够解析代码。
Dec 11, 2021
思考 ProtoBuf 中的可选与必选字段
思考 ProtoBuf 中的可选与必选字段 - 本文介绍了在 ProtoBuf 中可选和必选字段的区别和使用方法,以及不同语言对这些字段的实现方式。通过实验和总结,文章提出了所有字段均为可选的设计思想,并探讨了使用 oneof 和 google.protobuf.wrappers 两种方法实现 nullable 字段的方式。
Dec 03, 2021
对博客网页加载体积的一点优化
本文介绍了对博客网页加载体积的优化,通过减少引入的组件和优化代码,成功将网页的首次加载 JS 体积从 200+KB 降低到 70+KB。总结起来就是尽可能在编译期、服务端完成工作,尽量不要在 client side runtime 引入太多的组件。
Oct 25, 2021
理解 Go singleflight 中的异常处理
使用 Go singleflight 时要注意异常处理,本文对其进行了详细解释,包括源码以及异常处理的细节。
Sep 26, 2021
在 MacOS 上使用 Podman 代替 Docker
使用 Podman 在 MacOS 上代替 Docker,快速配置并启动容器,兼容 Docker 命令,无需付费,启动速度快,迁移学习成本低。
Sep 23, 2021
深入理解 Go Comparable Type
本文主要介绍了 Go 语言中可比较类型的定义和实现,包括 Go 内置类型的可比较性和有哪些类型是不可比较的,以及如何避免常见的陷阱和错误。
Sep 11, 2021
Go sync.Once 原理
sync.Once 用于确保一段任务仅执行一次。它的实现基于双检锁单例模式,使用 atomic 和 Mutex 来保证线程安全。通过前置检查 atomic 来快速判断是否已经处理完成,但在获取到锁执行前需要再检查一遍,以确保 done 没有被改写过。
Aug 29, 2021
gRPC 与『面向扩展编程』
使用 gRPC 开发,向后兼容性和可扩展性非常重要。在 proto3 中,所有字段都是可选的,这是因为 RPC 调用会产生任何可能的输入。另外,在实现 Server 的时候,需要内嵌 UnimplementedServer,以保证接口向后兼容。此外,每个 RPC 接口都需要专属的输入输出类型,以保证可扩展性。这些实践都是为了保证向后兼容性。
Aug 21, 2021
Go 的 String Interning
介绍了 Go 语言中的字符串池技术 String Interning,通过缓存热点字符串,降低大量动态字符串的内存占用和提高性能。实现了一个简单的 stringInterner,通过比较 []byte 作为缓存键,避免了大量的字符串复制和 GC 操作。最后,使用反序列化 JSON 的场景验证了 stringInterning 确实能够提高性能和降低内存占用。
Jul 31, 2021
在 Vercel 优雅地搭建 Go 微服务
在 Vercel 上部署 Go 微服务。通过 Vercel 云函数,可以将服务以云函数的方式部署在 Vercel 上,降低很多的维护成本。本文介绍了 Go 微服务的编写,自定义路由,monorepo,基础设施(RPC、定时任务、日志监控、数据库、Integrations)等内容。
May 29, 2021
Server-Side Events: 简单高效的服务端推送
本文介绍了一种基于 HTTP 的简单高效的服务端推送方案——Server-Side Events(SSE)。相比 WebSocket,SSE 更为轻量,适用于前端消息订阅等场景。
Mar 19, 2021
Go Echo 如何正确地处理错误
Go Echo 的错误处理方法。
Mar 01, 2021
Golang 在即刻后端的实践
本文是关于在即刻后端中使用 Golang 进行重构的实践。通过对即刻的推荐流和用户筛选服务进行重写,新版本的服务相较于旧版本的服务,在接口响应时长、内存占用和 CPU 占用等方面均有显著提升。文章详细介绍了重构的步骤和工程实践,以及持续集成和构建的相关内容。
Oct 31, 2020
Got a New Keyboard
这篇文章介绍了作者购买新键盘的经历。作者的需求是一款可以灵活切换蓝牙连接、键位接近标准60%的键盘。最终选择了 Niz 66 这款键盘。文章还列出了其他几款键盘的比较,并对它们的优缺点进行了讨论。
Jul 05, 2020
Use GSuite Like a PRO
本文介绍了如何使用 Google App Script 来进行 Google 办公套件的开发。介绍了 Google App Script 相比其他 SDK 的优势,并列举了 Google App Script 的局限性。最后,提供了一些解决方案和填坑的经验。
"Use GSuite Like a PRO" 是一篇关于 Google App Script 的开发经验分享,包含了诸多实用技巧。
May 01, 2020
对 Go 编程哲学的一点理解
对 Go 编程哲学的一点理解。Go 高度克制,让开发者保持最低心智负担。显式返回错误、严格区分指针和值类型、组合取代继承、不提供泛型,防止写出难以阅读的代码。
Apr 04, 2020
Go 中 struct 初始化
这篇文章介绍了 Golang 中 struct 初始化的方式与注意事项,包括值与指针初始化、内嵌结构体、引用类型等。通过实验,总结了 Go 中 struct 初始化的结论。
Oct 10, 2019
MongoDB 读写分离踩坑
MongoDB 读写分离问题的排查与解决
本文详细介绍了开发过程中遇到的 MongoDB 读写分离问题,以及排查和解决问题的过程。最终,作者提出了使用 Write-Concern 机制来解决主从复制延迟的问题。本文为 MongoDB 开发者提供了有益的经验和教训。
Sep 10, 2019
PlantUML as a document
PlantUML 是一种依赖于 DSL 来绘制 UML 图的工具。可以理解为类似 Markdown,使用特定的标记语言,来增强普通文本的可视效果。它支持很多类型图示,可以说是非常强大,而且可以直接在 Markdown 当中插入 PlantUML 并渲染。本文介绍了如何使用 PlantUML 来编写 UML 图和集成管理。
Sep 06, 2019
从 Google passports 换到 1Password
从 Google Passports 到 1Password,介绍了改变密码管理器的原因和体验。总结了 1Password 的优点和如何删除旧密码。
Aug 22, 2019
JWT 的一些思考
JWT是一种无状态的鉴权方式,AccessToken和RefreshToken需要进行权限隔离以保证安全性。AccessToken和RefreshToken应该使用不同的KeyPair进行加解密。拉黑一个用户或设备需要对RefreshToken进行处理。实现零延迟地强制下线需要将设备放入黑名单,通过通知推送的方式要求其进行refresh或直接下线。
Mar 14, 2019
使用 dotfiles 管理 Windows
如何使用 dotfiles 管理 Windows - 一个介绍如何使用 dotfiles 管理 Windows 配置的文章。包括使用 Git+软链接管理配置文件、哪些文件适合使用 dotfile 进行管理等。
Feb 08, 2019
个人项目架构的思考
在个人项目中,前后端分离和SOA架构可以保证整体项目的可扩展性,但对于简单的个人项目来说,这么做反而会带来不必要的麻烦和工作量。如果没有访问压力,可以考虑将前后端合并,将数据库作为缓存,消除服务间通信的网络延迟。在开发初期不要过度设计架构,等到真正需要扩展时再考虑。
Feb 06, 2019
优雅地分享即刻消息给 Telegram 好友
使用 Telegram Bot Jikeview,优雅地分享即刻消息给 Telegram 好友。解析即刻链接,支持动图、视频和多图,让分享更便捷。快来体验吧!
Feb 01, 2019
Surface Go 上手
"Surface Go 上手" 是一篇关于 Surface Go 的使用体验分享,主要介绍了选购经验、实际体检、使用技巧和总结。对于需要一台便携设备用于办公学习的人群,Surface Go 是一台非常值得购买的设备。
Jan 21, 2019
尝试实时渲染“截图“
实时渲染截图。如何通过 HTML 和 CSS 直接渲染图片,而不是使用图片。具有易于备份和更快的加载速度的优点。在实践中,可以通过内联样式、样式标签和 CSS 文件加载来渲染 CSS。这篇文章的主要内容是如何在 WordPress 上实现 HTML 和 CSS 渲染。
Jan 17, 2019
使用 Notion 搭建博客
使用 Notion 搭建博客,解决了使用其他平台遇到的大部分问题,如自定义域名、Google Analytics 集成和自定义界面等。通过 Notion 的组件,可以编写更加生动的页面。使用 Notion 的 API,可以将 Notion 当作与 Wordpress 一样的 CMS,来管理自己的博客。文章总结了 Notion 的 API 获取和编码、后端渲染、部署和优化等方面的内容。最后,作者使用 Notion 的表格管理文档,建立了一个视图,展示博客的内容。
Jan 09, 2019
谈谈「重构」
谈谈代码重构,重视代码设计,两个任务不能同时进行。开发功能和代码重构需要分别进行,避免代码混乱。代码重构就像运动,应该穿插在日常开发中。
Jan 08, 2019
记一次 Google Cloud 封禁
"记一次 Google Cloud 封禁",介绍了作者因为在项目中泄露了 GCR 的 json_key,导致 Google Cloud 项目被封禁的经历和体会。建议以后管理授权文件时,将所有授权文件存放在固定位置,通过配置全局变量来访问,以彻底杜绝将私钥放在项目目录中。长度:49字。
Jan 01, 2019
几个 2018 年喜欢的产品
2018 年喜欢的产品:WSL 和 Notion,前者能在 Windows 上快捷地使用 Linux 的命令和工具,后者是数字版手账,可集成 Gitbook,Trello 和 Evernote 的功能,极大地提高效率。
Nov 23, 2018
Bitbucket Pipeline + Docker + Gradle 自动部署实践
使用 Bitbucket Pipeline + Docker + Gradle 自动部署实践
Sep 12, 2018
浙大路由器配置指南
这篇文章介绍了如何在浙江大学校园网中使用路由器代理,以及如何通过模拟登录方式解决校园网登录时的弹窗问题。其中,作者提供了一份校网验证脚本,可以方便地实现登录和注销操作。
Aug 10, 2018
Github Pages 反向代理跨域实践
本文讲解在 Github Pages 上部署 web app 时遇到的跨域问题,并介绍了使用 nginx 反向代理的解决方案。同时,还介绍了如何配置 Https 跳转。
Aug 09, 2018
记一次 GitHub Pages 部署
介绍如何在 GitHub Pages 上部署 React 项目。包括使用 gh-pages 集成、配置主页地址和自定义域名以及 DNS 解析的问题。并列出了一些需要注意的坑点和解决方法。
Nov 16, 2016
RxActivityResult 原理浅析
RxActivityResult是一个使用RxJava简化startActivityForResult()流程的库。它通过启动一个代理Activity - HolderActivity来作为两个Activity之间数据交互的桥梁,通过回调方法将Activity Result传递给订阅者。
Sep 13, 2015
Xposed 开发指南
本文是 Xposed 开发指南,介绍了 Xposed 的工作原理、如何创建一个 Xposed 模块以及 Xposed API 的使用等。文章以创建一个红色时钟的样例为例,详细介绍了如何实现 Hook 和取代一个方法、在 AndroidManifest.xml 中添加 meta-data 等步骤。本文适用于想要学习如何创建一个全新的 Xposed 模块的读者。