作者归档:白宦成

关于白宦成

独立开发者, 自由职业者, 写作者

复盘:从 NESHouse 到商业版,我做对了什么和做错了什么?

复盘:从 NESHouse 到商业版,我做对了什么和做错了什么?

大家好,我是白宦成,在过去的这个春节里,Clubhouse 相信不少人都进去玩过,也体验过了。我也在这个春节中深入的体验了这个产品。

和大家不同的是,我除了体验,还做了一些事情,今天为大家复盘一下这次事件中我的得与失。

第一重思考:工程师脑中的 Clubhouse

当我知道 ClubHouse 的时候,找朋友要了个邀请码,就进去体验了一下。说实话,并没有什么太让我惊艳的功能,但马斯克的加入,让 Clubhouse 的使用体验极差,于是我便萌生了自己做一个出来的想法。于是,我便立了个 Flag ,要在 72 小时内复刻出来一个 Clubhouse。后面的事情,大家或多或少听到过,我在 55 小时内完成了开发,并被 CSDN 报道。

现在回过头来看这件事,体验到一个东西,觉得不够好,并想着做一个开源的版本出来,这是我的工程师脑给我带来的,他让我下意识选择了自己去实现一套类似工具的选择。

在这一重思考中,我总结出来了以下结论:

得:

  1. 我这次的行为,成功的一点是我不仅仅是憋在房间写代码,而是将写代码这件事直播出来,从一开始就吸引眼球,让别人从开始就在做传播
  2. 我这次的行为,开源和特定的风格帮了不少的忙,给我在后续做宣传的时候,自带了一些值得讨论的话题。
  3. 我这次的行为,联系了 CSDN 宣传,让我在研发完初期,快速获得关注,占领了最快完成的话语权,即使后续有了新的像素级抄袭的版本,媒体在宣传的时候,也会带上我,占了先机。

失:

  1. 我这次的时间搞得不太好,开发的第 30 ~ 48 小时几乎什么都没有做,一直在路上。下次如果能一直在一个地方,可能整个事情的运转效率会更高。
  2. 没有商业部署的意识,我在开源的版本中,选择了一个比较贵,但可以快速开发的技术方案,但是后续当我想直接从开源版进行商业化改造的时候,遇到了费用的问题,朋友提醒我,商业用户可能不太喜欢依赖过多的外部服务,最好换个方案。花费了不少的时间和精力在测试新的技术方案上。

第二重思考:商务脑中的 Clubhouse

当我完成了开源版以后,考虑到这个东西在国内一定会有他的市场,那么一定也会有一些企业想要去做相关的产品,因此,开发一个商业版本是一个不错的选择。因为有了开源版在前面立着,别人相信我可以做出这样的东西,剩下只是把产品打造出来,然后卖给需要的企业即可。但,因为一些原因,实际上错过了最佳的销售期,项目虽然开发出来了,但客户也流失了。

在这一重思考中,我总结出了以下结论:

得:

  1. 在商业行动中,快真的很重要,如果你足够快,那就可以在市场还处在混沌期的时候,快速完成变现。
  2. 在进行整体项目研究的过程中,应当尽量避免切换技术方案,以免造成较高的实现成本。

失:

  1. 家庭稳定很重要,我这次商业版开发速度比较缓慢一方面是商业版确实提供了更多的功能和价值。另外一个方面,我在家的几天,和我妈吵了几架,心神不宁,无法很好的编码。

第三重思考:生态脑中的 Clubhouse

当我完成了商业版的开发后,我又回过头来看 Clubhouse ,发现在 Clubhouse 生态中出现了一些很有意思的周边产品,比如专门为 Clubhouse 房间准备的提问工具:Ch.chat。这些工具不是完全复刻,而是围绕着生态提供价值,反而是一个不错的切入点。如果再有机会,这个方向也会是我尝试的点。

在这一重思考中,我总结出以下结论:

得:

  1. 我们在思考产品的时候,不能只盯着产品本身,还要学着去思考,在这个产品的生态中,他的上游是什么、下游是什么,中间有什么是我可以做的?相比于像素级抄袭一个产品,去围绕着产品周围做生态,也是一个不错的选择。

除了这些以外,这几天国内还出现了一些 Clubhouse 的类型产品,我说一些我自己在开发过程中的一些观点,

  1. Clubhouse 类应用的成本极高,大量依赖服务商虽然可以快速开发,但意味着高成本。
  2. 在国内如果要做 Clubhouse 类应用,可能会面临两大难题,一个是高成本,另一个就是监管。前者 Clubhouse 有投资,后者 Clubhouse 不需要关注。但国内的同款都会需要做这些东西,成本不菲。
  3. 国内只能预期一些大厂的产品能够成功(他们烧得起这个钱),对于中小企业,做公有域的流量转化很难,但作为工具还不错。

一些相关链接

https://mp.weixin.qq.com/s/mUGGkxdTIngLzd9zX96AeA

白宦成简史

白宦成简史

如何想要了解白宦成,你就需要了解他的成长历史。表面给你提供的内容寥寥,可能不足以你很好的对白宦成产生更加立体的形象。

2003 年

白宦成的父亲白玉信先生是一位公务员,得益于公务员的身份,可以接触到电脑。小时候的白宦成比较顽劣,但很喜欢电脑。借父亲工作之便利,可以接触到电脑,打游戏。

当年比较喜欢的游戏包括:红色警戒2 、暴力摩托

2005 年

2005年,白宦成一生中的一个很重要的伙伴 —— 赵晓冬带着白宦成去了一个很重要的地方,小学门口的电脑装机店。因为赵晓东的父亲与店主关系较好,赵晓冬和白宦成可以放学后在装机店呆着。

在装机店里,白宦成学习了如何组装家用电脑。后来,白宦成甚至一个暑假都呆在这个装机店里,学习如何维修电脑。(是的,白宦成真的会修电脑

2006 年

2006 年,梦幻西游进入白宦成的世界,白宦成开始玩游戏,疯狂的玩游戏。甚至半夜不睡觉,偷偷从家里跑出来,去家附近的网吧打游戏,再被父亲抓回去(屡次)。

2007 年

在家附近的旧书店购买到了 《电脑爱好者》、《黑客 X 档案》、《大众硬件》、《大众软件》、《电脑迷》,并对其中的《黑客X档案》特别感兴趣,开始研究成为炫酷的「黑客」。

并试着用《黑客X档案》学到的技术,在网吧成功的逃避了网费的支付(这可能白宦成离黑客最近的一次)

2008 年

白宦成在阅读《黑客X档案》的时候,开始对更加广袤的编程世界感兴趣,迫于英语不好,无法理解更复杂的编程逻辑,只能从「易语言」开始学起。

2009 年

白宦成进入初中开始学习,由于被选中作为纪律委员,开始试着与过去的自己告别,不再做那个屡次被叫家长的坏孩子。试着开始变成一个好孩子。

也受到地理老师的赏识,地理老师授予了办公室的钥匙,允许白宦成在放学后,留在办公室里浏览互联网。

感谢白宦成的地理老师 —— 董向才老师。

在这个阶段,白宦成开始试着用易语言编写一些简单的程序。

2010 年

白宦成开始和自己的同学慕沁阳一起订阅《电脑报》,购买《电脑迷》,两个人轮流购买,一周白宦成买,另一周慕沁阳买。

2011 年

准备开始中考,暂时将精力放在学习上。

2012 年

考上高中,并加入高中的《话剧社》,成为一名后期。经由学姐培训,掌握了基本的 Adobe Audition 的使用技巧。并在 2012 年,加入学校的《文学社》,使用易语言为文学社制作电子社刊。

2013 年

开始正式进入互联网的范畴,买了虚拟主机和域名,搭建自己的第一个博客(xqgz.info,域名早已不续费了)

并在同年折腾了很久的虚拟主机优化以后,决定购买了一个 VPS。第一个 VPS 是在淘宝买的, 28 一个月。

买了 VPS 以后,了解 lnmp.org 军哥的一键包,同年还研究了其他 VPS 上个人博客的各种优化。

后使用 AMH 面板(当年的帖子 http://amh.sh/bbs/post-803-1-1.htm)

同年开始使用阿里云,并和好友妙正灰(mf8.biz) 一同成为阿里云论坛的版主。

2014 年

经由 AMH 面板,开始初步涉猎 PHP 开发,并延展到更有价值的 WordPress 主题开发和插件开发领域。

同年,考上大学。

白宦成在大学加入了「新媒体研究会」,学习了解新媒体的事情,并在当时打下了写公众号的基础。

得益于大学的班助制度(程翔先生,很有才华的一个学长,他获得了我们学校的魅力学子,白宦成也在他离开大学那年,获得了魅力学子的荣誉称号),班助发现白宦成有搞新媒体的能力,便带着白宦成一起搞事情。

同年,得益于学长介绍,在 2014 年和另外一个学长合作,开始做外包项目。早期使用 DeDeCms 开发企业网站。

2014 年,加入 Linux.cn ,担任译者

2015 年

2015年,响应大学生创业的号召,白宦成前往红安县注册了企业「红安县稳云网络科技有限公司」,同年暑假,在红安县做外包项目赚钱。

同年,成为腾讯云论坛版主,并开始为腾讯云论坛制作视频教程。

同年,加入腾讯云校园布道师计划。

同年,在 Linux.cn 贡献项目和代码,逐渐深入组织。

2016 年

2016 年,小程序横空出世,白宦成使用昵称「西秦公子」为极客学院制作视频课程《微信小程序进阶实战之分答应用开发》、《微信小程序入门实战(仿V2EX)》

同年,得网易的领导尧漂海先生赏识,白宦成得以在 2016 年在网易实习。

2017 年

这一年,白宦成基本上都在上课 + 做外包项目赚钱,同时,还在学习小程序技术,并不断的产出视频教程。

同年,开发小程序「运维密码」

2018 年

这一年,白宦成开始进入知识付费领域,并在 GitChat 的支持下,写了自己的第一个专栏《人人都能学会的 WordPress 实战课》,该专栏现已全面开放 https://www.easywpbook.com/

同年 开发小程序「Linux」

2019 年

前往深圳,加入青寕信安科技,担任嵌入式工程师

同年在深圳 GDG、台湾 COSCUP 等多处活动分享

同年开发出自己的第一个爆款开源项目 —— logoly.pro

2020 年

加入腾讯云,担任云开发团队的产品运营。

2021 年至今

开发出自己的第二个爆款项目 —— NESHouse

自由职业者

工程师和码农

工程师和码农

我不止一次的在不同的场合表达我个人对于互联网技术从业者的分类:

互联网的研发岗位上有两种人,一种人是工程师,一种人是码农。前者因为喜爱而从业;后者因为钱而从业。如果你不区分这两种人就以一个简单的维度来归类研发岗位的人,难免有失偏颇。

白宦成

昨天我写了 Alpine.js 的 HOWTO 后,将其发布到了一些技术站点上,今天我收到了这样的回复。

我相信,有不少人都会持有类似的观点,甚至读到我博客的人中,也会有不少这样的人。但我还是要说,我不喜欢这样的人

对于我来说,一切以公司目标为指导,一切行动以钱为指导, 那就是码农的范畴

工程师相比于码农,一个很大的区别是他对于技术是有热情的,有热爱的。工程师会去主动学习、研究技术,而不是像码农一样,一切以公司的指标为准。

我之所以不喜欢码农,是因为码农是会让这个行业变得更不好的,因为他们只关注收入,不关注行业本身的变化,不在乎行业的前进方向。而且,如果是为了钱,那有了更好的,更赚钱的工作,他是不是就不干现在的工程师的工作了呢?

我不觉得工程师就比码农高贵多少,但我自己是不喜欢与码农共事的,太累。每个人和每个工种都有自己存在的价值,但码农的价值,我不太想要。

如果你要讨论互联网中的这些做研发的人,二者归为一谈就有失偏颇了,分开来讨论,才是更适合的。因为这两类人,是完全不同的两类人。

我看的动画

我看的动画

我除了一般意义上的动画片以外,也会在 Bilibili 看一些国创动画,列举一些我看过,还比较喜欢的动画:

如果你有别的不错的动画,欢迎你推荐给我。

此外,我近两年看的也不错的海外的动画

  • 怪诞小镇:很喜欢,可惜不更新了。
  • We Bare Bears:也不错,很温馨,好像也不更新了。
  • 飞出个未来:还不错,我还没看完。
  • 工作细胞:第一季看完了,第二季、Black 正准备看。
HOWTO: 如何学习 Alpine.js

HOWTO: 如何学习 Alpine.js

什么是 Alpine.js

Alpine.js 是由开发者 Caleb Porzio 开发的一款响应式前端框架。和过去人们所熟悉的 Vue.js、React、Angular 不同的是,Alpine.js 不需要你对于现有的应用进行高成本的改造,也没有 VDom 的概念,直接可以在现有的系统中加入并使用

快速学习指南

Alpine.js 在国内的使用并不多,因此,相应的学习内容大多是英文写就的,不过 Alpine.js 涉及到的概念不会像 Vue、React 之类那么多,你可以很轻松学会它。

推荐学习路线

Alpine.js 没有那么多的概念,因此,学习路线也非常简单,你只需要掌握以下一些内容就可以了

  1. Alpine.js 基础语法和使用;
  2. Alpine.js 的magic helper; (非必需)
  3. Alpines.js 的状态管理工具 Spruce(非必需)

基础语法的了解可以让你使用 Alpine.js 开发自己的应用。而后面两者可以简化你的整个开发工作流,提升自己的开发效率。

推荐学习文档

1. 查阅官方文档,学习基础语法

学习 Alpine.js ,首先离不开的是官方文档,Alpine.js 的官方文档在其项目主页

https://github.com/alpinejs/alpine

如果你的英语不够好,可以看中文版本的 Readme

https://github.com/alpinejs/alpine/blob/master/README.zh-TW.md

具体的语法层面,我建议你按照如下的逻辑来学习

第一梯队,学习:

  • x-data:教你如何组织你的 Alpine.js 代码
  • x-on:事件绑定
  • x-if:逻辑处理
  • x-for:列表渲染
  • x-bind:数据绑定
  • x-model:双向数据绑定

这六个语法让你可以基本开始使用 Alpine.js。

第二梯队,学习:

  • x-show:控制是否显示
  • x-spread:将 Alpine.js 对象属性绑定到 Object 上
  • x-text:控制元素内文字
  • x-html:控制元素内 Html
  • x-transition:控制转场渐变动画

这五个语法让你的 Alpine.js 项目拥有更多的功能

第三梯队,学习:

  • x-cloak:控制组件初始化完成
  • x-ref:绑定父组件对象
  • $el:获取元素
  • $refs:获取父组件对象中标注的 x-ref
  • $event:事件对象
  • $dispatch:触发事件
  • $nextTick:下次 DOM 更新
  • $watch:监听数据变化

上述这些语法可以让你更加深入的使用 Alpine.js,不过在很多场景下可能你都用不到,所以也无需担心。

2. 查看常用逻辑的实现方式,比对不同

Hugo 是 Alpine.js 的开发团队成员之一,除了开发以外,Hugo 还在自己的网站上给出了一个 Playground ,你可以在这里看到一些 Alpine.js 的常见用例,比如:数据绑定、 for 循环、抓取数据等。

你可以访问 https://alpinejs.codewithhugo.com/ 来查看 Hugo 准备的一些案例,从而快速的了解你熟悉的功能在 Alpine.js 中的应该如何实现。

3. 在线练习 Alpine.js

当你了解了一些基本的使用后,你就可以开始打开一个网页,开始自己练习使用了。

这里有两个可以在线使用的调试环境,你可以基于他们来进行练习,直接看到效果。

Alpine.js 作为一个工具,需要多练才能熟悉它的使用,配合前面看的文档和案例,现在你就可以在这两个练习环境中练习 Alpine.js 的使用。

4. 查看真实项目,了解 Alpine.js

一个工具从测试到落地到真实环境,需要的是来自真实项目的参考。而 Awesome 中就提供了不少这样的案例。

通过了解这些项目和工具,你可以看到别人是怎么使用 Alpine.js 的,从而学习 Alpine.js 的开发。

Alpine.js 的学习资源汇总

Alpine.js 的学习资源不多,但有一些比较适合国内开发者看的,我也再列举一下,具体如下:

视频教程

  • Building AlpineJS:由 Alpine.js 开发者 Caleb Porzio 开设在 Laracasts 上的一门课程,介绍如何从 0 打造一个 Alpine.js, 这个课程会让你对于 Alpine.js 更好更快的理解。

个人博客

  • Code With Hugo: Alpine.js 核心开发者的博客,会更新一些关于 Alpine.js 的技术文章
  • Alpine.js之一步一腳印:台湾同胞写的 Alpine.js 入门教程,有一个系列。完整的一共有30篇,可以一点点看看。

邮件列表

  • Alpine.js Weekly:Alpine.js Weekly 由 Alpine.js 的核心开发者 Hugo 维护,每周五发送一封邮件,介绍最新的 Alpine.js 社区的资源,十分值得订阅。

讨论区

一些常见问题

1. Alpine.js 依赖 Webpack / Alpine.js 不支持 Webpack?

答:并不是,Alpine.js 可以在 webpack 中使用,也可以不在 Webpack 中使用。即使通过 webpack 构建,Alpine.js 也会自动绑定对象,方便你使用。

2. Alpine.js 是为前端/后端设计的技术方案

答:Alpine.js 并不是为某一类人设计的技术方案。虽然在我看来,他对于后端十分友好,因为不需要 webpack 之类的前端构建工具就可以使用,但如果你是前端,且不太喜欢 React 的 JSX 或者是 Vue 的template ,那依然可以选择使用 Alpine.js。

3. Alpine.js 学习门槛如何?

Alpine.js 的学习只需要掌握一些核心的语法,就可以正式开始使用了。相比于 Vue、React, 我认为学习成本还是要低一些的。Vue 有完整的工具链,放平缓了学习曲线,但需要学习的概念依然不少,只是上手难度低而已。

我自己的使用感受

Alpine.js 在我看来,是对于后端开发者的利器。他的语法足够简单, 也不需要打包,因此对于后端开发者来说,可以十分方便的在系统中接入。同时,Alpine.js 可以很好的与传统的服务端渲染的逻辑结合,使用服务端渲染内容,使用 Alpine.js 来控制内容,从而可以很好的完成页面的构建,实现在不过多提升项目复杂度的同时,提升了页面的动态效果和逻辑编写难度,对于后端开发者来说,是一个不错的工具。

对于前端开发者来说,如果你厌恶了每次写项目都需要构建、打包,那么 Alpine.js 也是一个不错的选择。

开了一个 HOW-TO 目录

开了一个 HOW-TO 目录

HOW-TO 类目主要会介绍一些我自己熟悉/经常使用的技术栈,并将这些技术栈的学习路径等,整理出来,提供给需要的人。

HOW-TO 子目录放置在“技术“目录目录下,所以内容大体上是和技术有关的。如果有一些别的内容,可能也会分享出来。

比如我自己倒腾的一些硬件产品之类的。

屏蔽爬虫请求的四种方式

屏蔽爬虫请求的四种方式

在进行应用开发的过程中,难免会遇见爬虫爬取数据的。正常情况下,爬虫的数据爬取不应影响业务系统的正常运行。但毕竟都是人写的代码,难免会出现 Bug ,在 Bug 的情况下,爬虫可能会对业务系统发起超出日常水平的请求,从而使业务系统开始出现故障。在这种情况下,就需要对爬虫进行屏蔽。

屏蔽爬虫,由内而外,可以分为四个不同的方式来屏蔽。

1. 屏蔽 UA

爬虫一般而言,都会有特殊的 User Agent ,比如 Baiduspider 就是百度的爬虫;Googlebot 就是 Google 的爬虫。

在第一阶段,你可以针对 User Agent 进行屏蔽,这部分只需要在 HTTP Server 层面加入相应的屏蔽代码即可。

以最常用的反向代理服务器 Nginx 为例,你可以在站点的配置文件中添加如下代码来屏蔽百度和 Google 的爬虫访问。

if ($http_user_agent ~* "Baiduspider|Googlebot")
{
    return 403;
}

上述这段代码可以实现在 Nginx 检测到访问者的 User Agent 包含特定的字符的时候,返回 403 报错,拒绝访问服务。

2. 在主机层面屏蔽 IP

除了针对 User Agent ,有些时候是特定的来源的 IP 疯狂的访问,那也可以考虑针对 IP 进行封禁。

考虑到这部分,最常见的是使用主机自带的防火墙机制,来屏蔽来自特定来源的 IP。以 Linux 为例,可以通过 iptables 来完成相应的功能。

在 Linux 下,输入如下命令,来添加 iptables 屏蔽

iptables -I INPUT -s 8.0.0.1 -j DROP

上述命令,就可以在 iptables 中添加针对 8.0.0.1 的请求,所有来自 8.0.0.1 的请求都会被抛弃。

3. 在安全组层面屏蔽 IP

在如今的业务模式下,大家大多使用的是云服务器。如果你使用的是云服务器,则可以在用户的请求到达主机之前,直接在云服务商的内部网关层面直接丢弃。

你只需要在现有的安全组规则中新增一条屏蔽特定来源 IP 的规则,就可以实现在安全组层面上屏蔽特定的 IP。

4. 在 CDN 层面屏蔽 IP

现在我们的业务大多会使用 CDN 来完成数据的分发。在这种情况下,服务器获取到请求不是来自我们要屏蔽的 IP,因此,我们可以直接在 CDN 层面屏蔽掉爬虫的 IP。

现在的云服务商的 CDN 大多提供了 IP 白名单/黑名单的功能,你只需要将需要屏蔽的 IP 放在黑名单中,就可以实现在 CDN 层面屏蔽 IP。

总结

屏蔽爬虫的方式有多种多样,不过最为常见的主要就是这四种。当你找到了爬虫的特征,便可以很轻松的屏蔽它。

两代人的交锋

两代人的交锋

我和我妈的关系一直都不太好。

她年少时便好强,一直到现在,始终好强,万事喜欢比一比。

我也好强,18岁前唯唯诺诺,18岁后独立便喜欢万事靠自己。

我们两个人一样好强,父亲去世后, 没有了中间的缓冲,我们争论的的时候,也会更加的激烈。由于身份的限制,我并不能说出一些很过分的话,我们的地位天然不对等,所以,基本上每次争论,我都会无奈的放弃。但放弃,并不意味着我会顺从她的选择。

在上一次争论中,她提出:既然你认为自己很能, 那你以后每个月给我打 5000 块钱。

今天,她很轻描淡写的说,你以后每个月给我打 4000 块钱,就当你交房贷了。我说,

我可以理解,钱是她仅有的控制我的方法。当年,她也试图用这样的方式来控制父亲。但,我和父亲不同的地方是我更加的自由,也比父亲更加的冷血。

我已经做好了每个月给她打 5000 的准备,她希望用这 5000 来控制我,我同样希望使用这 5000 来堵她的嘴。

对抗,自此正式开始。

一个小技巧,提升你用 TailwindCss 写代码的效率

一个小技巧,提升你用 TailwindCss 写代码的效率

TailwindCSS 是我目前比较喜欢使用的 CSS 框架,组件优先的设计思路可以让我更好的完成产品原型的建设。

而 TailWindCSS 的一个问题就是对于文档十分的依赖,你需要对比着文档来写样式,才能够写出自己想要的样式,比较麻烦。不过,最近写代码的时候,我发现了一个好办法,可以很好的写出我们想要的样式。

这个办法就是,使用浏览器自带的 DevTools 中的「元素类」这个功能,来调试样式。

操作的路径也非常简单,打开浏览器的开发者工具,选择元素一栏,在其中找到你要调试的元素,并在右侧的属性列表中勾选开启元素类(.cls),你就可以在下方的样式元素类输入框中,输入关键词,来获取到当前页面支持的样式,从而可以查看不同的类会对组件产生的效果。

通过这样的技巧,你可以很轻松的完成样式的选择。在完成调试后,只要把你需要的样式写入到组件内,就可以将你调试好的样式固化到你的代码中,从而完成你的工作。

总结

借助浏览器自带的元素类功能,你可以很轻松的完成基于 TaildwindCss 的样式编写。

2021 年 1 月月度总结

2021 年 1 月月度总结

TLDR

这篇是 2021 年的第一篇月度总结,但写的很潦草,可能是因为整个一月份我都过的非常随意,每天醒了就上网,困了就睡觉。感觉这个状态有点问题。

下个月需要让自己忙起来。

定性分析

学习成长

本月没有太多显性的成长,不过本月去了一次上海,和即刻的产品经理 kyth 聊了一些,收获颇丰。

恋爱家庭

一切正常,没有变化。

职业发展

对于顾问的理解更加深刻,也更加自由。

理财投资

财务情况在不断恶化,在思考解决之道。这个月出现了收支不平衡。本月收入 9K,但支出还是不低,达到了16K。

主要问题是本月出去旅游了几天,旅游还是有一些开销的,再加上给一些常用的 软件续费,所以开支不小。

休闲放松

这个月出去旅游了,前往杭州 & 横店,和很久没见过面的妙正灰一起吃饭聊天。

杭州还不错,去了很多次,没有惊喜,但也没有失望。不过说起来,杭州的路好像比我16年实习的时候体验的更好,五年过去了,路也越修越好了。

社交人际

本月去上海,认识了 kyth、zac,有收获。

自我实现

本月在自我实现方面,没有太多新的进展。有点乐不思蜀了。

定量分析

本月内容输出总结

本月公众号几乎达到了日更。之所以说是几乎,是中间有几天没有写。但总的来说,本月博客写的量还是不错的,写了32篇文章。

点击归档去查看我的文章

本月收支总结

本月读书总结

本月读书 5 本,具体信息如下:

  • 《小岛区块链》
  • 《这就是软件工程师》
  • 《Unix 传奇:历史与回忆》
  • 《男人这东西》
  • 人类群星闪耀时(当改变命运的时刻降临,犹豫就会败北!易中天、冯唐推荐译本)(果麦经典)

本月学习总结

本月学习了 0 门课程,无进展

本月娱乐总结

本月看电影 7 部,影评如下:

年度回顾

  • Linux 中国的改造计划:0/2
  • 海外收入计划进度:0/$1000
  • 减肥计划:210/170
  • 优质文章产出:1/50
  • 1W stars 项目:0/10000
  • 年入 5000 的项目:0/5000
  • 收入结余:0/25K

Serverless 不是银弹

Serverless 不是银弹

这张图相信大家在互联网上或多或少都看过,说的很显示,如果你想要好且快的东西,那就是一分钱一分货。如果你想要快且便宜的东西,那必然会变得丑一些。

图源:Facebook劍心日劇廣告娛樂情報

作为互联网从业者,一个打工人,相信我的读者们都能够想明白这个点。

不过,大家似乎在看待别人的产品,特别是一些大厂的产品时,并不能够认清这个事实

产品方出于产品推广和运营的需要,必然会在产品推广和实际介绍的时候,宣称自己可以做任何东西。但作为真正使用的用户,你必须明确的知道,任何产品都具有自己的问题,没有一个产品可以满足你的所有诉求

我们以互联网产业中最为常见的问题来说,现在大型厂商一般都会推出自己的传统主机计算业务和 Serverless 云服务。

主机计算服务可以提供独立的主机给你使用,但相应带来的问题是你需要自己构建一整套基础环境,并进行基础的环境运维。

Serverless 服务则可以为你提供更高的弹性和更简单的环境配置,但相应的,也会带来更高的价格。 Serverless 服务在实际使用过程中,同等业务量的售价是会更高的。

你们一定要清楚不同的技术的优势和劣势。如果一个技术只有优势没有劣势,那他只能是个骗子了。

当你搞清楚技术的优势和劣势以后,反而你会对于技术的使用更加的得心应手。你不会在一个可能很大的项目中使用很低廉的技术方案。也不会在一个长期小而美的技术中,应用一整套互联网架构。

每一个产品都有自己的优势和劣势,你理解了优势和劣势,再根据实际情况选择方案,才能够不给自己挖坑,不给自己的长期运转留问题。

微信生态中的 openId、unionID和业务系统中的ID

微信生态中的 openId、unionID和业务系统中的ID

在进行微信生态相关的开发的时候,经常会遇到一个术语:openID。openID 在微信生态下几乎无处不在:

  • 你想要识别用户身份?需要 openID
  • 你需要给用户推送消息?需要 openID

除了 openID 以外,在开发时,还会有另外一个术语:unionID,当你思考多个微信生态下的应用互相协作之时,就会遇到 unionID。

此外,我们自己开发的业务系统中,还会有一个自己业务系统中的 ID,那如何理解这三个 ID 呢?

业务系统中的 ID

一般来说,我们会在自己的业务系统中存储一份用户信息,在存储用户信息的时候,用户信息会在数据库中有一个名为 ID 的主键,后续我们在进行各项开发的时候,都会使用这个 ID 来指代对应的用户。从而在开发过程中,随时可以获取到用户的一些信息。

我们会在这个 ID 对应的数据库记录中存储一些用户的数据,比如用户名、用户的头像、用户的昵称、用户的备注等等。

openID 微信应用中的用户唯一 ID

openID 是微信应用中的唯一 ID, 这里的微信应用指的是微信生态下的应用,不仅仅是小程序,也表示公众号、小商店等应用。

每一个用户在访问了某一个小程序后,就会获得自己在这个小程序中的唯一 ID。这个唯一 ID 和两个因素有关:是哪个小程序?是哪个用户?

也正是因为这两个因素,导致同一个用户在不同的小程序中的 openID 不同,所以说,openID 是微信应用中的用户唯一 ID,也仅在这个场景中有用。你在小程序拿到一个用户的 openID,意味着它只能在这个小程序中用于定位某个用户,你把这个 openID 拿到另外一个小程序/公众号中去使用,就无法定位到当前的用户。

unionID 微信应用群中的用户唯一 ID

微信生态下除了小程序,还有订阅号、服务号。你肯定希望自己的订阅号、服务号、小程序可以共用一套用户系统,这样用户在进入这三处地方,就可以获得一致的体验,比如订阅号的用户在进入小程序后,可以看到自己在订阅号中做过的事情。

这个时候,你就需要借助微信应用群中的用户唯一 ID —— unionID。

这里需要注意关键词「微信应用群」。你的公众号和你的小程序并不是天然成为一个微信应用群的。想要达成一个微信应用群,你需要在微信开放平台将你的公众号和小程序之间进行关联。在完成关联以后,微信就会在符合要求的情况下,给予每次请求赋予一个 unionID 的属性。

微信开放平台

具体的要求如下:

  1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
  4. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
  5. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
  6. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。

如何使用 openID、unionID 和 ID

如果你希望你的业务可以实现,在 A 中的操作,可以在 B 中看到,那么你就需要借助于 unionID,将不同的用户关联起来,在数据库设计方面,你可以在用户表中设定几个属性: application_a_openid 、application_b_openid 和 unionid。

在执行查询的时候,判断是否存在对应 unionId 的用户,并进行关联。

总结

微信开发生态中有不少的 ID,看似纷乱,但如果你可以把他们以某一个特定的场景来思考,就会更好理解。