月度归档:2022年03月

fan of 100 U.S. dollar banknotes

为什么我选择放弃生财有术?

今天,我想和你聊聊我从 2020 年开始加入生财有术,到 2021 年续费,再到 2022 年决定停止续费的心路历程。

心路历程

怀疑期(加入生财有术前)

在 2020 年之前,我其实是对生财有术不感冒的。和大多数人一样,我的理解是「既然有赚钱的事情,你为什么不留着自己做,而要分享出来」。

这也是生财有术在很长一个周期上在面对的外界的指责。

认可期(加入生财有术之后)

加入生财有术源自于一个契机,我朋友圈的老朋友,工程师,技术总监 —— 朱鹏飞同学在朋友圈发了生财有术的推广,于是乎我想了想,基于对他的信任,加入了生财有术。

我的目的也非常明确:我自己是一个工程师,是一个创造者。我擅长的是创造一个东西,而不是把一个东西推广的更好。生财有术中的经验贴可以帮助我看到别人是怎么思考同一个问题的,可以为我补充更多的信息。

于是乎,我在生财有术开始疯狂的了解信息,还参与了深圳和北京的活动,还因为一次轻享,获得了一颗龙珠,加入了龙珠群。

生财有术提供了我想要的信息,帮助我理解了不一样的世界,看到了不一样的选择。

在这个阶段,我也领悟出为什么有的人愿意分享自己的心得给别人,总的来说,其实是「我知道这个东西能赚钱,但是这个钱太少了,我懒得做,顺手发给你也行」

基于这个思路,我还启发了一个人做了保罗 · 格雷厄姆的中文站点

反思期(现在)

但到了 2022 年,我为什么开始选择离开?其实核心点在于我意识到,生财有术提供的价值对于我来说,开始逐渐发生了变化。以及价格的上涨对于我来说,意味着 ROI 不符合预期。

一方面,生财有术开始从提供信息,到提供更加丰富的活动和交互转变。虽然依然会有提供信息,但对于我来说,活动所带来的溢价对我没什么价值,我并不太需要持续参与一个活动。

另一方面,得益于知识星球的机制,即使我不再续费,我依然可以看到之前我买的内容。现有的 3000 多篇精华我都没看完,完全不着急续费。

从这个角度来看,知识星球真的不错。

不适合我,那适合谁?

在写这篇文章的时候,我也在想,既然不适合我了,那适合谁?毕竟,生财有术是一个社群,不可能适合所有人。

先说说为什么不适合我:我自己是有一些明确的标签的「工程师」、「创作者」,本身有在做个人品牌影响力方面的事情。对于我来说,我需要的是补充信息,丰富自己的品牌。当现有的信息已经无法处理的情况下,那么我完全没必要马上获得更多的新信息来满足自己 FOMO 的情绪。我需要的不是去发展更多的横向业务,而是让自己在纵向业务上发展的尽可能好。所以短时间来看,生财有术并不能提供我所需要的东西。

再说说适合谁:

  • 拥有自己业务的老板:我在生财有术的龙珠群里,里面有不少专家达人,如果你加入龙珠群,完全可以在其中达成一些合作,促进更好的业务的发展。
  • 没有自己形态的普通人:除了老板,绝大多数人是普通人,普通人的坏处是没什么特点,但好处是也有塑造的机会,而 2022 年生财有术会有不少的训练营和大航海、小航海,正适合普通人先抓住一个机会上车。

总结

唠唠叨叨这么多,总体来说,就是一句话 —— 不匹配了。但不匹配我,不意味着不匹配你,如果说上面我描述的这些你觉得符合你的诉求,那生财有术依然是一个符合你预期的社群。

如果看了这么多,你觉得生财有术适合你,那就大胆扫码加入吧!

woman in black and white zip up jacket sitting on black office rolling chair

关注用户的长期价值,而不是短期价值

在进行互联网产品设计时,常常会说,「我们要关注用户价值」,但似乎落实到现实中,大家都默认选择了一个更短时间的价值 —— 用户走过我的摊位,我要产生多大的交易额?用户访问了我的网站,给我产生了多少的收入?

多年「羊毛出在狗身上」的免费互联网模式,让我们下意识以为,我们只有「羊毛出在狗身上」才能够赚钱,我们不得不从流量大潮中分流出一部分,经过过滤,再将其回归到流量的大潮里。

这个思维有一个最大的问题是:我们提供给用户的价值是短暂的,是会停止的。但实际上,一个用户可能是会持续的使用你的产品的,在这个过程中,你是完全有可能在一个更长的周期产生出更大的价值。

不过这里也有一些问题在于,为什么过去的产品不会太过于关注这个问题?一方面是品牌建设并非绝大多数产品会考虑到的,甚至很多产品直到产品火了,才开始关注到品牌建设。另一方面是更长期的模式需要损失短期的收益,对于企业和产品来说,能否扛到看到长期收益是个问题。

不过,对于独立开发者而言,完全可以猥琐发育,直到看到产品的长期价值。

group of men running in track field

关于「竞争」,给年轻人的一些建议

很抱歉,虽然我年纪稍长,对于很多人来说,都还是一个小朋友,但依然要用一个非常老气横秋的口气来和你讨论关于「竞争」这个话题。因为有太多的人来问我关于竞争的问题。我不得不选择将我的观点和建议整理成一篇文章,以减少我重复介绍自己观点的次数。

竞争中的软门槛与硬门槛

在竞争中,常常被大部分人忽略的是,竞争并非是静态的。实际上,由于竞争中存在的软门槛和硬门槛的不同,使得竞争往往是动态的。

竞争中最常见到的是硬门槛,也是我们一般而言,给到新人的建议 —— 你必须去做某些事情,不然你就会付出极大的代价。比如,最常见的是,我们给到每一个年轻人的建议是你应该读完本科。如果你是专科,那就努力专升本。或者想办法走成人高考,获得一个本科的文凭。

应聘中的软门槛和硬门槛

硬门槛的意义在于它真的可能在关键问题上,阻止你进行下一步。比如说,对于航天科技的核心工程师来说,相关专业的文凭就是硬门槛,如果没有对应的文凭,相关的企业和单位是不敢录用你的,因为你完全可能为航天事业埋下后患。

除了硬门槛,被很多人忽视的就是软门槛,以及,很多人会把软门槛认知为硬门槛。和硬门槛不同,软门槛不会成为你能够完成某个职位工作的阻拦,但软门槛会成为别人筛选你时的重要标准。在你求职时,你有没有某个证书、你有没有某个认证,都只是你求职过程中的软门槛。不要将软门槛看作是硬门槛。硬门槛是用来筛掉不适合的 60% 的人的,而软门槛则是用来选出想要的 20 % 的人。剩下的 20% 的人,就是那些符合了硬门槛,但无法跨过软门槛的人。

竞争是全方位的,但也是局部的

对于绝大多数的人来说,面对的竞争往往都是全方位的。你并没有什么异于常人的特点,你和你的竞争者并没有什么不同。这个时候,你们并没有太大的差距。但倘若你拥有一个和其他人不同的优势, 这个优势就会成为提升你综合评分而获得选中的重要因素。

大家都相同的时候,你的竞争优势会帮你获得最终的成功

绝大多数的时候,竞争即会看你的所有竞争条件,希望尽可能选择一个足够好的候选人。另一方面,如果你在某些点上特别的突出,就能够让你自己成为被选中的佼佼者。

如果你的某个技能超出统一领域的其他人一个数量级的水平,那么即使你的其他能力不够强,依然可以获得青睐。但作为普通人的我们,应当有这样的自知之明,是否是这样的人。

数量级的差距可以让你获得青睐

高学历带来的不一定是竞争优势,也可能是竞争劣势

对于一般来说,我们都认为高学历带来的是更大的竞争优势。但是,高学历也会为你的选择来到沉没成本。这些沉没成本会让我们失去一些可能性和选择。

当然,失去的可能性未必是坏事,也可能是一件好事。但作为选择的人来说,确实会有可能担心庙小容不下大佛而不愿意选择,将你从当前的选择中踢出。换句话说,高学历意味着某些事情,你再也做不了了。

移除 Excalidraw 右上角的 Plus 连接

Excalidraw 是一个非常好用的手绘风格的绘图工具,我给自己部署了一个版本来降低自己写作配图的难度。如果你感兴趣,可以访问 draw.ixiqin.com 体验我自己维护的版本。

白宦成

Excalidraw 在右上角加入了他们的 Plus 版本服务的连接。不过我是自己使用,所以就不需要这样的导流连接,因此,可以通过修改 src/excalidraw-app/index.tsx 文件,将其中的代码进行替换,即可实现移除 Plus Link

原版

const PlusLinkJSX = (
  <p style={{ direction: "ltr", unicodeBidi: "embed" }}>
    Introducing Excalidraw+
    <br />
    <a
      href="https://plus.excalidraw.com/plus?utm_source=excalidraw&utm_medium=banner&utm_campaign=launch"
      target="_blank"
      rel="noreferrer"
    >
      Try out now!
    </a>
  </p>
);

移除后

const PlusLinkJSX = <></>;

自定义 Excalidraw 的字体大小

Excalidraw 是一个非常好用的手绘风格的绘图工具,我给自己部署了一个版本来降低自己写作配图的难度。如果你感兴趣,可以访问 draw.ixiqin.com 体验我自己维护的版本。

白宦成

Excalidraw 默认的字体整体比较小,对于我来说,习惯将图画的大一些,这样在不同的设备上,都可以方便的看清楚图片的内容。

修改 S、M、L、XL 对应的字体大小

Excalidraw 将字体大小的变化定义在 src/actions/actionProperties.tsx 当中,因此,你需要修改不同按钮具体的字体,则需要修改这里的配置。

字体大小修改工具

将下方代码中的 options 中 value 修改为你需要的值,即可实现不同的字体大小。

export const actionChangeFontSize = register({
  name: "changeFontSize",
  perform: (elements, appState, value) => {
    return changeFontSize(elements, appState, () => value, value);
  },
  PanelComponent: ({ elements, appState, updateData }) => (
    <fieldset>
      <legend>{t("labels.fontSize")}</legend>
      <ButtonIconSelect
        group="font-size"
        options={[
          {
            value: 20,
            text: t("labels.small"),
            icon: <FontSizeSmallIcon theme={appState.theme} />,
            testId: "fontSize-small",
          },
          {
            value: 28,
            text: t("labels.medium"),
            icon: <FontSizeMediumIcon theme={appState.theme} />,
            testId: "fontSize-medium",
          },
          {
            value: 36,
            text: t("labels.large"),
            icon: <FontSizeLargeIcon theme={appState.theme} />,
            testId: "fontSize-large",
          },
          {
            value: 50,
            text: t("labels.veryLarge"),
            icon: <FontSizeExtraLargeIcon theme={appState.theme} />,
            testId: "fontSize-veryLarge",
          },
        ]}
        value={getFormValue(
          elements,
          appState,
          (element) => {
            if (isTextElement(element)) {
              return element.fontSize;
            }
            const boundTextElement = getBoundTextElement(element);
            if (boundTextElement) {
              return boundTextElement.fontSize;
            }
            return null;
          },
          appState.currentItemFontSize || DEFAULT_FONT_SIZE,
        )}
        onChange={(value) => updateData(value)}
      />
    </fieldset>
  ),
});

修改默认字体大小

默认字体的大小被定义在 src/constants.ts,你可以修改其中的 DEFAULT_FONT_SIZE 来实现控制默认情况下的字体大小。

export const DEFAULT_FONT_SIZE = 28;

参考代码:https://github.com/bestony/excalidraw/commit/78d2d103b40c48bdccbecd7deb85f1fd0d6b4d2f

https://github.com/bestony/excalidraw/commit/14bca18aa6395280cfda15202beaf56dc966a401

解决 Vercel 在国内访问被墙的问题

Vercel 因为被大量使用,自然而然被墙掉了,不过好在 Vercel 官方提供了单独的 IP 和 CNAME 地址给大家,对于国内的用户来说,配置一下单独的解析,依然可以享受 Vercel 提供的服务。

A记录地址:76.223.126.88

CNAME 记录地址:cname-china.vercel-dns.com

来源:https://www.vercel-status.com/incidents/r758bhbklgfd

silver mercedes benz emblem on blue surface

OneInStack 下部署 WordPress Multisite 的 Nginx 转发规则

在 OneIn Stack 下如果需要配置一套 WordPress MU 的话,需要配置 Nginx 相应的转发规则。具体的规则如下:

 if (!-e $request_filename) {            
 	rewrite /wp-admin$ $scheme://$host$uri/ permanent;            
 	rewrite ^(/[^/]+)?(/wp-.*) $2 last;            
 	rewrite ^/[^/]+(/.*.php)$ $1 last;    
 }    
 location / {        
 	try_files $uri $uri/ /index.php?$args;    
 }

将上述规则放置在 /usr/local/nginx/conf/rewrite/wordpressmu.conf ,并在创建 VHost 时选择对应的主机即可。

ebook

电子书助手

我自己是一个很喜欢看书的人,所以买了很多平台的电子书会员(Kindle、微信读书、华章书院),但一直以来,都有一个问题在困扰我,就是如何确认一本书在哪个平台上有?

虽然下意识上我们认为不同的电子书平台上的书籍应该是相同的,但在实际的操作层面,确实是有所不同的。受限于版权、出版社合作关系等等,有些书可以在微信读书上找到,但无法在 Kindle 上找到;有些书可以在图灵社区找到而无法在 Kindle 找到。

这使得作为读者的我十分困扰,如何才能更加明确的知道我想看的那本书在那个电子书平台上能找到。

终于,现在有了这个工具 —— eBooks Assistant 油猴脚本

这个脚本通过自己实现的爬虫,爬取了各平台拥有的电子书数据,从而实现在你访问某个豆瓣电子书页面时,告诉你那些平台有对应的电子书,一键跳转到对应的平台进行阅读,降低搜寻电子书的成本。

脚本地址:https://greasyfork.org/en/scripts/412479-ebooks-assistant

脚本及服务器源码:https://github.com/caspartse/eBooksAssistant

person sitting on chair holding iPad

算法推荐与个人精选

一直以来,我其实对于人工智能赋能于个人十分关注。

信息流算法帮助我们获取到了更多的信息。但在体验信息流算法的时候, 也看到了算法推荐的另一个反面 —— 我们被算法控制,算法让我们相信它希望我们相信的东西。

为此,我开始抗拒算法推荐,开始使用一些更加传统的方式来完成我的信息获取 —— 使用 RSS 来阅读新闻;使用 Apple Music 来收听信息。实际上,近几年的 Newsletter 的复兴,也是一种对于算法推荐的对抗。

但这不过是我在时代的洪流之下的微弱的抵抗,并不能从根本上解决信息茧房的问题。也很难让自己得到满意的结果。究其原因,是因为现有的算法代表的是企业的利益,而不是个人的利益。现有的算法推荐都是由企业定义的,而非个人定义的。所以无法让算法真正意义上为个人服务。

我们的算法和 AI ,还需要更加的普适。

programming language

TailwindCSS 下的响应式设计

前言

我自己在最近的一段时间里,整体是比较喜欢 TailwindCSS 这类样式框架的,它可以非常灵活的定义样式,从而可以十分方便的进行创意类的 UI 设计,实现一些独特的 UI 特性。不过,由于我并非一个专业的前端,也不曾研究过响应式设计。这让我在进行前端开发过程中,吃尽了苦头。

痛定思痛,认真的学习了一下 TailwindCSS 下的响应式设计,为以后的开发做好准备。磨刀不误砍柴工嘛。

正文

设计理念

在进行 TailwindCSS 下的响应式设计时,需要考虑到其整个设计系统的基础 —— Mobile First(移动优先)。

基于移动优先的理念并不新奇,诸如 Bootstrap 之类的框架早已经教会我们移动优先。

Mobile first, responsive design is the goal.

Bootstrap

在这种设计理念上,我们应该做的是先设计移动端的样式,并根据屏幕的不断扩张,变成一个更加丰富的 UI 和界面。

这一点对于做研发的我来说,是一个非常反直觉的事情:在绝大多数场景下,我在开发产品的时候,都是看到的桌面端的样式 & 功能,我下意识的以为,桌面端才是应该首要设计的界面。但无论是 Bootstrap,还是 TailwindCSS,其实都是首要设计移动端的

理念的变化没有跟上,导致我对于 TailwindCSS 的类样式的理解不到位,在设计时会出现错误。

断点(breakpoint)的作用

在进行响应式开发的时候,断点是非常重要的,借助于 CSS 3 提供的 Media Query,我们得以在不同的样式尺寸下应用不同的样式设计。

而在 TailwindCSS 当中,根据最小屏幕宽度(为什么是最小而不是最大?因为默认应用在移动设备上,更大的尺寸使用 Media Query 来控制)默认提供了 5 组不同的断点,分别是 sm(640px)、md(768px)、lg(1024px)、xl(1280px)、2xl(1536px),以及不加任何断点情况下的 default 样式。

对于绝大多数的应用来说,处理好 default(手机)、md(平板)和 lg(PC),就已经足够,对于一些面向更 Geek 的场景(比如开发者),他们使用的设备性能和参数更高,可以再定向配置 xl 和 2xl 的样式。

自定义断点

在实际开发过程中,根据用户的场景的不同,TailwindCSS 的默认断点可能并不能满足你的诉求,这种情况下,你还可以根据自己的需要,修改默认的断点的配置(甚至是将其从移动优先调整为 PC 优先:将 min-width 模式调整为 max-width 即可)。

具体可以参考 TailwindCSS Customize Screen Size

总结

在 Tailiwind CSS 下进行响应式开发时,切记从小到大,而非从大到小,不然会让你调试样式的时候十分痛苦。

延展阅读