Summary

2022 年 1 月月度总结

TL;DR

2022 年的第一个月过去了,也是我正式采用 OKR 来记录自己的第一个月,整个一月,各项事情没有变得更好,但也没有变得更差。

开始有一些新的变化(比如投资、比如视频观看),但也有一些没变的(比如预算的执行)

持续获取现金流,并构建未来收益的现金牛

收支

本月收入稳定,没有什么大的变化,但确实发现了自己在开支上有很大的改进空间。日均开销达到了 1000 ,理论上是可以优化的。还是需要尽可能的优化自己的开支。

投资

本月开始了更加多样化的投资之旅:

  1. 开启了美股投资之旅,正式用上了我自己很早就注册的富途牛牛。
  2. 开启了一级市场的股权投资,在一级市场进行了定向的股权投资。虽然不多,但也是人生第一次,希望能有个好的结果。
  3. BTC/ETH 暴跌带来的投资机会,进行了一些买入,不过量不是很大,主要的原因是一级市场股权投资消耗了我的本金。
  4. 货币基金投资

可以看到,目前其实进行了比较多样化的资产配置(但其实还不够多样化,比如没有房产、没有实体的企业)。而且,我发现似乎我目前做的投资整体是高风险的(一级市场高风险、BTC/ETH高风险、美股高风险),而低风险资产相对较少(只有货币基金)。

在新的下个月的投资过程中,需要调整自己的资金投入,往更加平衡的方向调整。

当前累计净收益:-7082.66 元(主要波动在 BTC/ETH 上,预期内)

预算控制

2022 年预算执行情况如下,可以看到,本月在交通、教育、电子设备和旅行预算的执行上整体符合预期,而宠物预算、云服务预算、略微超出预期,后续微调即可。

租房预算因为是按季进行房租交费,所以会有超出的情况,但符合预期,无需调整和优化;人情预算因为今年去了女朋友家,帮女朋友家更换了一系列设备之类的,执行的较多,但符合预期,无需 Review。

需要重点关注和 Review 的是软件预算、餐饮预算,这两项不太符合预期。

d2b5ca33bd970f64a6301fa75ae2eb22

新增长

在新增长方面,2022 年将会构建一个 SaaS 产品,目前已经确定具体的执行方向 & 在和一些投资人朋友确认市场是否有价值。

提升生活基础设施,构建未来生活好基础

旅行

本月原本准备回家过年,奈何疫情,放弃了回家过年,也放弃了因此而可能产生的一系列途中旅行。

2022 年规划目的地:

  • 澳门
  • 济南
  • 丽江
  • 西安
  • 济南
  • 大同

文娱

视频观看

本月看了不少的电影/纪录片,还是有一些收获的,比如 Vox 推出的两款解码的纪录片,以及我在抖音上看到的飞出个未来的大电影,都在传统的视频平台上完整的看了一遍,挺好。

  • 《Sex, Explained》:性解码,Netflix
  • 《Money, Explained》:金钱解码,Netflix
  • 《飞出个未来大电影1:班德大行动》
  • 《飞出个未来大电影4:绿色狂想》
  • 《阴阳镇怪谈》

智能化

本月重新启用了之前买的 Homepod Mini,并配上新买的香炉,焚香看书,非常不错。

此外,本月还启用了之前买的小米香氛机,书房和卧室都常有香味,让人生活更加舒服。

开拓视野,打造多元行业人才

阅读

本月阅读不多,主要是读了适兕老师的《开源之谜》,还认真的写了书评。

写作

本月几个预定的主题还没写完,不过整个一月没少写,写了 22 篇文章, 连续更新了 16 天。

点击链接看我的一月文章

全年OKR

person using MacBook pro

云计算的增长在 SaaS

我一直以来,都很喜欢诸如 LeanCloud、Firebase、云开发这样的产品,这背后的逻辑是「随着云计算的成本不断下降后,下一步发展起来的是各样的 SaaS 产品」。

这些 SaaS 产品的建设,和过去相比,基础设施的发展使得开发一个 SaaS产品变得比以前简单太多了。

如果你需要服务器,无论是阿里云,还是腾讯云,甚至是面向全球的 AWS、Azure,都是你只需要花钱就可以买到的。

如果你需要邮件系统,SES、Mailgun、Postmark,各种不同的产品,让你的开发变得无比的简单。

你需要做的,只是找到你自己的 niche,然后针对这个 niche ,开发一款产品,并将你的产品推出,并发布上市,将你的产品售卖给你的客户。

很多时候,我们在看云计算的市场的时候,如果我们关注的是 IaaS,基础设施,我们就会发现,我们面对的往往是那些旧有的,已经存在的市场,他们会使用我们的产品,来替代曾经的产品。但同样的,我们的产品也会被成本更低的 IaaS 产品所替代。

我们要的是旧有的产业,还是那些新的产业?面向一个已经存在的百亿市场,还是一个未来会爆发的千亿市场?

black flat screen tv turned on near green plant

为什么你应该自建图床?

我最近对博客做了个整体架构优化(或者其实说是重建了一次),在重建完成后,为了确保我的重建是成功的,我安装了 Broken Link Checker 来进行网站链接检查。经过插件的检查后,发现了不少我在迁移的时候出现问题的点。不过,在这个过程中,也注意到了我过去自己的问题。

首当其冲的是我在早期大量的应用了来自微博的图床,但随着后续微博图床的失效,我无法再使用这些图片,在读者访问的时候,就会相应的出现错误。我不得不针对这些图片一个个手动处理。

d2b5ca33bd970f64a6301fa75ae2eb22 22

好在是后来 iPic 的出现,我得以从新浪图床迁移到如今自建的又拍云图床中。

d2b5ca33bd970f64a6301fa75ae2eb22 23

而随着 WordPress 插件生态的丰富,如今我在 WordPress 上写作插图更加的方便。

自建图床和自建博客、自建网站等等的原因几乎是一样的 —— 只有你自己维护的,才是真正属于你的,别人维护的,都有可能在某个时刻不让你使用。那个时候,你的成本会骤增。比如现在的我,就在苦逼的一个个的修改图片的地址。

一个切实可行的复杂系统势必是从一个切实可行的简单系统发展而来的。一个一开始就设计复杂系统永远无法运行,也无法通过修补使其工作。你必须从一个简单的系统开始。

ef40166b49d33480283739fdc5bb384f

为什么大咖愿意将机会共享给你?

我在「生财有术」的星球呆了差不多三年了,在里面看到了不少有意思的赚钱的方法和机会。不过,过去的很多时间里,我其实都无法理解,为什么大家愿意把自己赚钱的方法介绍出来。

前些日子和芦笋的创始人晓力在线下聊天的时候,我才真正意识到「为什么大咖愿意将机会共享给你」

我们两个人在聊天时,提到了我之前做的一件事,当时是我发现了格雷厄姆的博客可以被翻译,我就发了一个朋友圈说,大家可以自己注册一个格雷厄姆的域名,并对格雷厄姆的文章进行翻译,将自己的链接发送给格雷厄姆,请他帮忙加上对应的链接。

我们在讨论的过程中,我们有共同的意识,可以看到这件事背后的价值,比如:

  1. 你和格雷厄姆有了沟通,甚至是有了合作,本身是比较难得的。
  2. 你通过这个翻译和建站的过程,证明了你自己的能力,完全可以联系出版社,去进行更加正规的出版工作。
  3. 你可以在后续的求职过程中,将这个网站作为一个个人项目进行展示。
  4. 你可以阅读格雷厄姆的内容,并写出你自己的内容。

我们可以看到,我们都能看到这些优势和这个事情所带来的收益,但对于年轻人来说,这个可能就是他们看不到的机会和方式。

而这个事情放在我和晓力身上,就是不会去做的事情,因为这个事情虽然我们看起来值得做,收益也还不错,但问题在于这个收益对于现在的我们来说,是没有价值的,我们需要用我们的时间做更多更有价值的事情。

而从这个逻辑去推断,我们当然可以认为是「没有人会分享自己的赚钱的机会」,但换个角度来看,这也可能是你和他们的差异实在太大,你无法理解他们对于你所看重的东西其实根本不在意。

视野不同,使我们患得患失。我们看重的,可能是那些前辈所无视的。

b29692084bbb

WordPress 的静态化缓存和动态化缓存应该如何选择?

在我发出了 为 WordPress 加入 Redis 缓存提升访问性能 的文章后,有不少朋友给了建议,主要有以下几个:

  1. 可以在前面套一层 CDN ,使用 CDN 来完成缓存。
  2. 可以配置 Nginx 缓存。
  3. 可以给文章生成静态的。

在我看来,这些都是很好的建议,对于很多新人的博客主而言,都是不错的选择。不过就我自己的需求而言,这个并不是好的选择。

从网站性能的提升而言,他们所提供的建议确实是不错的,通过对网站进行静态化处理,从而实现访问的提速,用户直接访问静态的缓存是不错的选择。

不过,对于我来说,倒也不仅仅是给读者一个更加舒服的阅读体验,对于我自己而言,更加舒适的写作体验也是极为重要的。

引入了 Redis 作为缓存后,所有的 MySQL 查询会进行一定的缓存,从而让网站的整体使用体验变得更好,对于我来说,是一个更好的选择。

0dbb4980acb58d4396e9a2055bf2176e

为 WordPress 加入 Redis 缓存优化访问性能

在之前的文章我是如何优化博客的本站在用的一些WordPress插件中我提到,我是使用了 WP-Optimize这个插件来进行博客优化的。

d2b5ca33bd970f64a6301fa75ae2eb22 11
WP Optimize

WP-Optimize 为用户提供了开箱即用的缓存方式,可以将你的 WordPress 文章加入文件缓存,从而减少在 MySQL 中查询的次数。

不过,文件缓存的问题是性能受限于你所使用的磁盘,而我使用的是阿里云的标准云磁盘,性能一般,所以访问速度并不能算快。

过去在我还愿意折腾 WordPress 的时候,我是会在 WordPress 上加入一些别的缓存的,比如 Redis、Memcached。不过,随着时间的流逝,我折腾的意愿变得越来越弱,就远离了这些。

直到最近刚好有空,于是开始研究起了 Redis 缓存。

其实在古早时代(比如我刚开始折腾个人博客的时候,2012年),WordPress 的 Redis 功能并不是特别好用,需要自己手动下载 object-cache.php 放在对应目录中,然后修改配置文件手动来开启,甚至还需要替换掉 index.php 文件来让请求通过缓存进行。

这次的折腾,让我感受到,时代在进步,配置缓存也变得简单了许多。

Requirements

在这篇博客中我并不打算介绍 Redis Server 的安装和调试过程,你可以在搜索引擎中找到各种各样的教程引导你如何完成安装的过程,因此,请自行完成 Redis Server 的安装,后续的各项操作会默认你已经完成了 Redis Server 的安装调试。

需要注意的是,如果你不打算修改配置文件,则需要在安装 Redis 之后,设置为空密码。而空密码是不安全的,建议你通过 iptables、安全组策略等方式,屏蔽掉 6379 端口的外部请求,只允许本地请求。

安装 Redis 缓存

我这次安装 Redis 缓存选择了 Redis Object Cache 这个插件。

d2b5ca33bd970f64a6301fa75ae2eb22 12
Redis Object Cache

和你在别的网站上看到的教程相比,这个插件提供了一个可视化的查看和管理的方式,对于懒得手动操作和编辑代码的人来说,更加友好。

安装插件后,启用插件,你可以在设置中的「Redis」设置页面找到如下的界面:

d2b5ca33bd970f64a6301fa75ae2eb22 13
设置页面

点击 Enable Object Cache,就会开启 Redis 的 Object Cache 。

如果你已经在之前配置好了 Redis Server,则会直接看到如下左图的界面。但如果你的 Redis Server 还没有配置或配置了密码,就会显示如下右图的界面,就需要你检查你的 Redis Server 是否配置成功。

d2b5ca33bd970f64a6301fa75ae2eb22 15
配置成功的情况
d2b5ca33bd970f64a6301fa75ae2eb22 14
配置失败的情况

当你看到如上左图的界面后,就说明你已经开启了 Redis 的 Object Cache 了,后续涉及到文章内容、菜单等各项基本配置的查询时,会优先使用 Redis 的缓存,而不是查询 MySQL,从而降低了 MySQL 的查询压力,提升了查询的诉求。

至此,你的 Redis 就配置好了,可以打开你的网站首页,享受飞一样的速度。

d2b5ca33bd970f64a6301fa75ae2eb22 17
开启前的 TTFB 为 2.29 秒
d2b5ca33bd970f64a6301fa75ae2eb22 16
开启后的 TTFB 为 673.49 毫秒

FAQ

1. 如何使用非本地 Redis Server 或如何使用带密码鉴权的 Redis Server?

如果你需要使用非本地的 Redis Server(比如云 Redis),那么你需要在你的 wp-config.php 中加入如下代码来进行配置。

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
// define( 'WP_REDIS_PASSWORD', 'secret' );
define( 'WP_REDIS_TIMEOUT', 1 );
Code language: JavaScript (javascript)

2. 如果我一个服务器上有多个 Redis ,如何配置使数据不会混淆呢?

有两种方式,

第一种方式是可以给你的不同站点配置不同的 Redis DB,只需要在你的 wp-config.php 文件中加入如下的配置,即可实现不同的站点使用不同的 Redis 数据库,你可以从 0 开始,向上递增设定不同的 Redis 数据库。

define( 'WP_REDIS_DATABASE', 0 );
Code language: JavaScript (javascript)

第二种方式是你无法控制 Redis,必须使用同一个数据库,那么你可以通过给其添加不同的 salt 来实现即使使用同一个数据库,数据也不会产生混淆。

define('WP_CACHE_KEY_SALT', 'www_ixiqin_com_');
Code language: JavaScript (javascript)

3. Metrics 怎么理解?

在 Redis 设置页面,你可以看到另外有一个 Metrics Tab,这个 Tab 你可以看到你的插件的工作情况,方便你随时进行查询 & Debug。

第一个 Time 是指 Redis Object Cache 和 Redis 沟通,获取数据所需的时间,可以看到,我这里的查询时间大概是在 12ms,耗时不多。需要注意,你第一次看可能会注意到,这里有一个 Object Cache Pro ,灰色的 Object Cache Pro 其实是官方在推广其自家的付费插件,付费插件 $99/月,可以提供更好的 Redis 查询性能。

d2b5ca33bd970f64a6301fa75ae2eb22 18

第二个 Bytes 则是 Redis Object Cache 从 Redis 获取到数据的大小,当有人访问你的文章的时候,这个数据就会出现一个增长,访问结束后就会消失。

d2b5ca33bd970f64a6301fa75ae2eb22 19

第三个 Ratio 则是缓存的命中率,基本上保持在 99% + ,说明缓存的命中率还不错。

d2b5ca33bd970f64a6301fa75ae2eb22 20

最后一个 Calls 则是调用次数,免费版不会批量获取数据,因此,调用次数会很高,而在付费版,会一次性拿多个数据,从而获得更少的查询次数。不过我目前对于这个速度已经很满意了,就不再购买付费的版本了。

d2b5ca33bd970f64a6301fa75ae2eb22 21

延展阅读

b29692084bbb

WordPress 5.9 + 2022 主题,如何修改主题代码?

如果你使用了最新的 WordPress 5.9 以及其自带的 WordPress 2022 主题,你会发现有个问题:

修改主题代码去哪了?

d2b5ca33bd970f64a6301fa75ae2eb22 9

虽然提供的编辑器可以满足绝大多数需求,但对于一些特定场景下的开发需求(比如在 functions.php 中加入特定的逻辑,依然是需要修改代码的。

在当前的 5.9 版本中,主题的代码编辑器和插件的代码编辑器入口被移动到了「工具」当中,你需要到「工具」当中寻找对应的功能。

d2b5ca33bd970f64a6301fa75ae2eb22 10
b29692084bbb

对 WordPress 2012 主题的一些改动

在上一篇文章当中,我介绍了我为什么要迁移到 2012 这个主题,在这篇文章中,我将会向你介绍一下我对其做的一些修改。

加入广告信息

之前我接受了来自芦笋的广告赞助,作为权益,我答应为芦笋提供相应的广告展出,因此,我需要通过一些代码的修改,来实现对这部分内容的修改。

具体的修改方式是修改了 WordPress 2012 主题中的 content.php 这个文件,在合适的位置加入如下的代码

<!-- ads code start -->
<?php if(is_single()){ ?>
<a target="_blank" href="https://lusun.com/invite/20143" style="padding-bottom:10px"><img src="http://ixiqin.test/wp-content/uploads/2022/01/800498db4ecc3ecade82c7dfb0aaded5.png" class="wp-block-image" alt="白宦成邀请你注册芦笋,并赠送你 30 天高级版特权" style="max-width:100%"></img></a>
<?php }?>
<!-- ads code end -->
Code language: HTML, XML (xml)

文章页面的广告便是如此加上去的。

而侧边栏中的广告代码,则是通过 WordPress 自带的「小工具」功能来实现的,插入图片,并加入对应的链接即可。

首页显示摘要,而非全文

从阅读体验上来讲,在列表页面能看完所有内容自然是不错的,不过因为我的文章比较喜欢插入代码和图片,如果直接在文章页面展示所有内容,会导致页面看起来非常的混乱,所以我修改了对应的代码,将其调整为在首页展示摘要,而在内容详情页展示全文。

这里 2012 主题并未加入相对应的功能的开关,因此需要自行代码实现相应的功能。

原代码如下:

<?php if ( is_search() ) : // Only display excerpts for search. ?>
<div class="entry-summary">
	<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
<?php else : ?>
<div class="entry-content">
	<?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentytwelve' ) ); ?>
	<?php
	wp_link_pages(
		array(
			'before' => '<div class="page-links">' . __( 'Pages:', 'twentytwelve' ),
			'after'  => '</div>',
		)
	);
	?>
</div><!-- .entry-content -->
<?php endif; ?>
Code language: HTML, XML (xml)

新的代码如下:

<?php if (is_search()): // Only display excerpts for search.
?>
        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
        <?php
else: ?>
        <?php if (is_single()): ?>
    <div class="entry-content">
            <?php the_content(__('Continue reading <span class="meta-nav">&rarr;</span>', 'twentytwelve')); ?>
            <?php
        wp_link_pages(array('before' => '<div class="page-links">' . __('Pages:', 'twentytwelve'), 'after' => '</div>',));
?>
        </div><!-- .entry-content -->
<?php
    else: ?>
<div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
<?php
    endif; // is_single()
?>
        <?php
endif; ?>
Code language: HTML, XML (xml)

通过上述的代码实现,来控制了在首页 & 列表页面只显示摘要,而在具体的内容页面,展示全部内容。

摘要显示超过默认长度的数量

WordPress 默认的摘要长度是 55 ,而我写的内容如果只是默认的 55 ,可能看起来会比较奇怪,所以我会通过代码,将其调整为 100

function custom_excerpt_length( $length ) {
    return 100;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
Code language: PHP (php)

加入面包屑展示

加入面包屑展示,有助于读者更好的在站内进行不同的导航,因此,借助于 All in One SEO 插件自带的面包屑功能,加入了面包屑。

<div id="aioseo_breadcrumbs" style="padding: 10px 0px;">
<?php if( function_exists( 'aioseo_breadcrumbs' ) ) aioseo_breadcrumbs(); ?>
</div>
Code language: HTML, XML (xml)