使用 node-excel-stream 来按行处理 Excel 数据

white printing paper with numbers

数据分析是一个非常常见的需求,而在实际的落地场景当中, Python 是使用最多的。不过我因为写了很久的前端,其实对于Python已经生疏了。当我开始启动项目时,就会选择执行 npm init 来初始化一个项目。既然如此,就试着使用 Node.js 来做数据分析。

在 Node.js 当中操作 Excel ,最好的便是 Exceljs。不过 ExcelJs 封装了大量的函数,对于绝大多数的数据分析场景来说,可能并不适用(也不一定,只是我比较喜欢用代码来描述逻辑,Excel 更多是一个导入导出)。

当明确了我只是需要一个简单的导入导出后,那么 node-excel-stream 就进入了我的视野。

读取 Excel 内容

和 Exceljs 不同,node-excel-stream 的封装相对简单,就是一个 Reader 和 Writer ,提供的方法也十分简单:读取文件、定义格式,按行处理内容;

需要注意的是,node-excel-stream 只支持 xlsx ,而不支持 xls,所以如果你用的是旧版,则需要重新保存成 xlsx 来进行处理。

let dataStream = fs.createReadStream('data.xlsx');
let reader = new ExcelReader(dataStream, {
    sheets: [{
        name: 'Users',
        rows: {
            headerRow: 1,
            allowedHeaders: [{
                name: 'User Name',
                key: 'userName'
            }, {
                name: 'Value',
                key: 'value',
                type: Number
            }]
        }
    }]
})
console.log('starting parse');
reader.eachRow((rowData, rowNum, sheetSchema) => {
    console.log(rowData);
})
.then(() => {
    console.log('done parsing');
});
Code language: JavaScript (javascript)

写入 Excel 内容

写入时和读取时相比,稍微复杂一点,需要将所有的输入使用 Promise.all包裹起来

let writer = new ExcelWriter({
    sheets: [{
        name: 'Test Sheet',
        key: 'tests',
        headers: [{
            name: 'Test Name',
            key: 'name'
        }, {
            name: 'Test Coverage',
            key: 'testValue',
            default: 0
        }]
    }]
});
let dataPromises = inputs.map((input) => {
    // 'tests' is the key of the sheet. That is used
    // to add data to only the Test Sheet
    writer.addData('tests', input);
});
Promise.all(dataPromises)
.then(() => {
    return writer.save();
})
.then((stream) => {
    stream.pipe(fs.createWriteStream('data.xlsx'));
});
Code language: JavaScript (javascript)

总结

如果你需要将 Excel 导入到 Js 当中进行处理,那么 node-excel-stream 是一个不错的选择。

warehouse — 一个简单易用的 JSON 数据库

black and yellow printed paper

在 Hexo 的 Github 组织下,有一个不明显,但却很有用的仓库 —— warehouse。

warehouse 是一个 JSON 数据库,基于 JSON 实现了各种类似于 SQL 的查询,可以帮助我们基于一个 JSON 文件来进行查询。在 Hexo 的静态生成过程中,warehouse 帮了大忙。

用官方的话来说,warehouse 就是 A JSON database with Models, Schemas, and a flexible querying interface.

在实际使用上,warehouse 确实如他所说的那边方便(虽然某些方法没有,但依然不影响他的使用很方便)。

Example

比如,如下代码就定义了 一个 Post 模型和对应的表。并实现了在这个表中插入一个新的数据。

var Database = require('warehouse');
var db = new Database();

var Post = db.model('posts', {
  title: String,
  created: {type: Date, default: Date.now}
});

Post.insert({
  title: 'Hello world'
}).then(function(post){
  console.log(post);
});
Code language: JavaScript (javascript)

如果你需要将这些数据保存为一个单独的文件,只需要修改初始化的参数,并执行 save 方法,就可以将 JSON 导出到指定的文件中

var db = new Database({
  path: "./test.json", // 将数据存储在 test.json 当中
});
db.save();
Code language: JavaScript (javascript)

类似的,如果数据已经构建好了,也只需要执行 load 方法,就可以加载数据。

var db = new Database({
  path: "./test.json", // 将数据存储在 test.json 当中
});
db.load();
Code language: JavaScript (javascript)

场景

如果你希望在内存当中对于 JSON 有一个更好的操作方式,那么 warehouse 是个不错的选择,不需要另外单独安装数据库,就可以实现类似于数据库的查询方式,体验还是非常好的。

如果你想了解更多,可以查看

如何判断一个颜色是什么颜色?

red yellow and green paper

当你看到这个题目的时候,你可能会有点迷惑:“一个颜色是什么颜色”,这个问题好无厘头。但如果我换个用法 ,你可能就能明白 — 人类是如何辨别出一个颜色是红色而不是绿色?

回想小时候,大家应该都听说过 —— 三原色。不同的人可能记得不同,有的人记得是红绿蓝(色光三原色),也有人记得是红青黄(美术三原色)。结果不一样,但并不影响。两种三原色都告诉你了 —— 一个颜色是可以由另外三种颜色组合而成。

这意味着,每一个颜色都对应着三个坐标。他们是 RGB 也好,还是其他也好,都是通过三个颜色的色码来确认是哪个具体的颜色的。我们的显示器也是如此制造的。

但三原色有个问题 —— 变量太多。假设我们在每个维度分 3 个不同的结果,三原色可以拼出 27 种不同的组合。如果我们在每个维度分成 10 阶,这个结果就是 1000 个不同的维度。按照 RGB的 0 ~ 255 ,一共 256 阶,则一共可以形成 16,777,216 个组合。如果你想要构建出一组用于判断的规则,就十分的困难。

因此,换一个坐标系会是更好的办法 —— 试试 HSL 描述方法。

HSL 是将 RGB 三维坐标转换为色相、饱和度、亮度(英语:Hue, Saturation, Lightness)组成的新维度坐标。

d2b5ca33bd970f64a6301fa75ae2eb22 2

当我们变为新的坐标系后,我们定义颜色的坐标就从过去的三个维度,变为了只需要色相(Hue)这一个坐标就可以定位的坐标。毕竟,如果一个蓝色不饱和饱和,都不影响他是个蓝色;同样的,一个蓝色的亮度不高,但依然是蓝色。

通过从 RGB 坐标系转变为 HSL 坐标系,我们就将过去的 16,777,216 个组合简化为 360 阶。从过去的三维坐标系,变为了全新的一维坐标系。

d2b5ca33bd970f64a6301fa75ae2eb22 3

这样我们就可以十分简单的来细分我们的不同的颜色,更好的来编写规则。比如Hue 在 15 ~ 45 时为橙色;在45 ~ 75 时为黄色;在 75 ~105 时为绿色等等。

在我们写代码的时候也会更加简单,我们只需要计算出具体的 Hue 的值,就可以得出对应的颜色的名字。

RGB to HSL 算法

如下算法来自 Wikipedia

https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

设 (rgb)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于rgb中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (hsl)值,这里的h ∈ [0, 360)是角度的色相角,而sl ∈ [0,1]是饱和度和亮度,计算为:14aa645507f35455bbc990e04ecc0907128c509a

fffb33944b2529ac9398bfb365968795a03b3ddc{\frac {1}{2}}\end{cases}}”>

l={\begin{matrix}{\frac  {1}{2}}\end{matrix}}(max+min)

h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(定义为灰色)时候而不是留下h未定义。

RGB to HSL Sample Code

function rgbToHsl(r, g, b) {
  r /= 255, g /= 255, b /= 255;

  var max = Math.max(r, g, b),
    min = Math.min(r, g, b);
  var h, s, l = (max + min) / 2;

  if (max == min) {
    h = s = 0; // achromatic
  } else {
    var d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

    switch (max) {
      case r:
        h = (g - b) / d + (g < b ? 6 : 0);
        break;
      case g:
        h = (b - r) / d + 2;
        break;
      case b:
        h = (r - g) / d + 4;
        break;
    }

    h /= 6;
  }

  return [h, s, l];
}
Code language: JavaScript (javascript)

延展阅读

https://www.december.com/html/spec/colorterms.html

2022 年 7 月月度总结

summary

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

KR1:投资收益达到 20000 元

之前跌掉的浮盈又双叒叕涨回来了。还是挺开心的。

KR2 :单篇稿费突破 6000 元

没有变化。不过看到了一个新的观点:

先报价,提供符合对应价格的产出;不断循环,并提供价值。

下个月试试看。

KR3 :达成年度预算,支出不超预算

换了新预算模型之后,并调整了计算后,发现我的 7 月的基本开支大概是在 8000 左右,看起来还是比较可控。目前的住房成本还是比较高的。后续继续观察。如果控制的好的话,一年成本也就是 10 万以内。

d2b5ca33bd970f64a6301fa75ae2eb22 1

KR4 :构建软件类现金牛业务,预期产生收益 10000 元人民币m

无进展。

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

KR1:前往 6 个城市旅行

疫情。。。不出门。

KR2:进行 20 次文娱活动

主要是在家看书,倒没怎么出门。

KR3:借助智能化设备,缩减在家务相关事务上耗费的时间

暂无进展

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

KR1:写 15 篇书评

本月两篇书评

KR2:输出关于加密货币的 Newsletter 12 封

暂无进展。但最近开始继续用 Heptabase,希望早日输出成功!

KR3 :完成计划中的三本图书的写作

暂无进展。

使用小程序的 Canvas 2D 提取特定点的颜色

6ee6df690137fd06bc6166adb63caca1

在小程序当中,我们可以通过在 Canvas 画布上绑定 Tap 事件,来获取到用户点击行为,当我们获取到点击行为对应的坐标时,就可以读取到对应位置的颜色。并根据我们的需求,将颜色转换成我们想要的 RBG 色值。

这就是我们常见的各种取色软件的最常见的实现方式。当然,落实到实际开发过程中,大家或多或少会有所不同(涉及到调色。我们拍照的颜色和我们所看到的颜色并不完全一样。不同的相机调色会有所不同。类似的,我们需要加入相应的逆向算法排除对应的相机自身调教的影响)。

在小程序的场景中具体实现方式可参考如下代码:

页面布局

<view>
  <view><button bindtap="chooseImage">1. 选择图片</button></view>
  <view><canvas id="myCanvas" bindtap="onCanvasTap" type="2d" style="background-color:gray;width: 100%;margin-top: 100rpx;"></canvas></view>
</view>
Code language: HTML, XML (xml)

对应的 JS

和在 在小程序中使用的 Canvas 2D API 绘制本地图片 一样,你需要提取到 Canvas 的 Ctx ,用于执行操作。当你通过 bindTap 拿到你的点击点相对于 Canvas 的 左上角的坐标后,就可以使用 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/getImageData">getImageData</a> 来提取具体范围的数据。因为我的目的是提取某个点的颜色,因此我的第三、第四参数都是 1 (取一个像素点的宽度和高度)。

提取出图片数据后,你可以在 data 当中提取一个 4 个元素的数组,按照顺序,分别是 RGBA 的四个值,你可以根据需要使用这个数据(比如放大展示在界面上)。

Page({
  data: {
    color: ''
  },
  onCanvasTap(e) {
    const query = wx.createSelectorQuery()
    query.select('#myCanvas')
      .fields({
        node: true,
        size: true
      })
      .exec((res) => {
        const canvas = res[0].node
        const ctx = canvas.getContext('2d')
        const data = ctx.getImageData(e.detail.x, e.detail.y, 1, 1).data;
        const [red,gree,blue,alpha] = data;
      })
  },
});
Code language: JavaScript (javascript)

在小程序中使用的 Canvas 2D API 绘制本地图片

6ee6df690137fd06bc6166adb63caca1

小程序自 2.9.0 起,不再推荐使用其自己封装的 Canvas Context,而是更加推荐大家使用标准的 Canvas 2D API 来完成相关操作。因此,对于开发者来说,需要将过去的 Canvas API 调整为新的标准的 API 。

刚好我最近也实现了类似的功能,将这部分逻辑分享给大家。

页面布局

<view>
  <view><button bindtap="chooseImage">选择图片</button></view>
  <view><canvas id="myCanvas"  type="2d" style="background-color:gray;width: 100%;margin-top: 100rpx;"></canvas></view>
</view>
Code language: HTML, XML (xml)

页面逻辑

Page({
   chooseImage(){
    // 创建一个 Query
    const query = wx.createSelectorQuery()
    // 选中 Canvas 对象
    query.select('#myCanvas')
      .fields({
        node: true,
        size: true // 提取 Node 信息
      })
      .exec((res) => {

        // 获取到 Canvas Node
        const canvas = res[0].node

        // 获取到 Context
        const ctx = canvas.getContext('2d')
        wx.chooseMedia({
          count: 1,
          success: function (res) {
            // 提取图片的基本信息
            wx.getImageInfo({
              src: res.tempFiles[0].tempFilePath,
              success: imgInfo => {
                // 使用 canvas.createImage 来创建一个图片
                const img = canvas.createImage()
                img.src = imgInfo.path
                img.onload = () => {
                  // 将图片画在画布上
                  ctx.drawImage(img, 0, 0, imgInfo.width, imgInfo.height)
                }
              }
            })
          }
        })
      })
   }
})
Code language: JavaScript (javascript)

参考文档

WordPress 出现 RedisException: OOM command not allowed when used memory > maxmemory 的报错怎么处理?

a computer screen with a bunch of text on it

早晨起来,想登录博客,记录下自己的灵感,突然发现死活登录不上 WordPress 后台。

登录到 VPS 后台,发现没有出现我之前常出的问题 — 硬盘满了。于是再次回到网页端登录,仔细研究后发现,我的登录应该是成功的,但登录完成后,又重新跳转回来,根据这个情况,我猜测可能是登录态出现了问题。

于是尝试切换到 Safari 、Chrome 的无痕模式登录,依然没有解决问题。因此可以排除掉客户端的问题导致的。

找到问题

接下来就是查看服务端问题。登录到服务器上,找到 WordPress 的日志,查看最近的几条日志,突然在众多 Notice 当中,看到了一个 Exception:

RedisException: OOM command not allowed when used memory > 'maxmemory'
Code language: JavaScript (javascript)

看到这个报错,突然明白了问题在哪了。

我的 WordPress 使用 Redis 作为缓存,而我过去一直配置的缓存空间是 128M,看报错,显然是因为 Redis 使用的内存空间大于 128M,而我过去没有配置逐出机制(默认是 noeviction),导致直接 OOM 爆掉了。

而我的登录态也使用了 Redis,没办法在缓存当中塞入新的 Key,自然登录也就失败了。

解决问题

找到问题之后,下一步便是解决问题。

解决问题并不复杂,为 Redis 调整内存空间大小,并配置逐出机制,就可以解决这个问题。

maxmemory 221000000
maxmemory-policy allkeys-lru

将 Redis 逐出机制设置为 allkeys-lru ,并将内存设置为 200M 后,重启 Redis ,果然我的 WordPress 可以正常登录了。

参考

allkeys-lru 表示对移除最近使用最少的 (least recently used)Key。

更多算法可以参考 Key Evicution

天下文功,唯真诚不破

df60e45f6bb619bb8596c1634d569c6e

作为一个博客博主,由于不依靠博客来吃饭,且个人文笔着实一般,我对于博客的文章的要求不如很多人那么高。

但我同样也希望我的文章被更多的人看到 —— 如何才能在没有华丽的文笔和词藻的情况下,依然赢得读者的心 —— 唯真诚耳

我写文章不追求一定是要给别人传达最全面的信息(当然,也看具体的情况,如果是某个场景,我确实打算写成全面的「干货」,那就会集数月之功,只为产出一篇文章),而是更多的传递出我对于这个世界的认知、看法。

所以我从不追求文章一定是干货,而更关注的是这篇文章传递了什么样的信息,表达了什么样的含义。

干货,就留给专职写作的同志们吧!

自我 PUA

person sitting on wooden dock over the lake during daytime

在身边的不少人眼中,我算一个很厉害的人 — 年纪轻轻就能获得超出自己这个年龄大多数人能做到的水平。

不过我自己知道,其实我并不是一个特别优秀的人 —— 我有着普通的出身,过着普通的生活,上着普通的学校,并没有什么不普通。即使是别人看来不错的成就,在我看来也不过是普通的成就 —— 那些聪明人轻轻松松就能获得的。

而如果问 —— 那为什么你能做到,别人做不到呢?我想,这可能源自于我很擅长自我 PUA。我会不断的给自己加上更多的压力,在压力的逼迫下不断的去调整自己的极限。

通过自我 PUA ,我的确一直在逼着自己变得更好 —— 不一定是比天之骄子做的好很多,但确实超越了曾经的自己。

不过,我也知道,其实这种状态不可持续,也不是真正的强大 —— 我总会有一天把所有的压力累积到爆炸,然后彻底重来。我也并不能做到和那些特别优秀的人一样,能够游刃有余的处理所有事情。

不过,好在我认识到了这一点,所以,放过自己,对于做不到的事情,坦然的接受我做不到。

裁员不稀奇

shallow focus photography of red and white for hire signage

最近裁员消息到处都是,看群里一个人提到 —— 公司裁员以后,发现业务正常运转。让我想起了一个梗 —— 不敢居家办公,怕公司发现离开了你业务照常运转。

对于很多小公司来说,由于公司规模小,所以每个岗位的员工都不可或缺。但对于存在裁员新闻当中的大公司 —— 员工体系的设计便是希望你们可以每个人都能被替换掉,每个人都是标准化的螺丝钉。因此,在这样的公司当中,裁员业务正常运转丝毫不稀奇。

不过,裁员也并非完全没有坏处 —— 裁员可能不会让业务停止运转,但大概率会降低业务运转的效率—— 毕竟过去两个人能做的事情,现在只有一个人做了,自然会按照优先级调整,优先安排高优事项。低优事情能做就做,不能做就等等再做。

希望我们的经济可以扛过这一波疫情的影响。

哎,兴,百姓苦;亡,百姓苦。天下皆苦。

保险很重要

428be18119fcba733c3990cf8afde346

人生走过三分之一,身边开始出现了水滴筹,再一次的提醒我保险的重要性。

d2b5ca33bd970f64a6301fa75ae2eb22

作为一个关注保险,且也在交保险的人,自然是能认可保险的价值 —— 付一笔小钱,用来对抗后续可能的大钱。不过,合理的保险配置确实是大部分人都没有关注过的。

大部分人应该只有医保,其中一部分的人购买了补充的商业保险。最近几年,各地城市开始推广城市惠民保开始让大家的城市配置率变得更高一些。

但我相信,配置保险依然是一个小众的行为 —— 当然,在我所在的互联网圈子里可能是个偏大众的选择。但对于更多的普通民众来说,这是一个小众的选择。

灵感 – 播客地推工具

person using black smartphone with gray and pink case

即刻有 JikePage 这样的能力,实现了诸如 Linktree 这样的产品能力。但这个部分其实还有可以更新迭代的方向,比如针对播客场景,提供更加适合地推 —— 破圈的能力。

在我的想象中,这个工具应该具备以下能力

  1. 以播客为维度创建独立的页面;
  2. 可以直接导入 Feeds 地址,选择展示哪些节目;
  3. 对于导入的内容, 默认可以展示 Shownotes ,但允许主播调整;
  4. 每一个节目有一个自己独立的 ID, 可以用于分享链接;
  5. 每一个节目都可以直接在浏览器里收听(不同于小宇宙 Web 版的点是可以选择其中的部分内容,用作破圈,可以选择基于 HTTP 的 Ranges 能力来实现)
  6. 能够生成二维码、分享卡片;
  7. 能够从节目跳转到播客介绍页面;
  8. (如果是小宇宙做的话)可以选择最热评论中的某几个展示在页面上;
  9. 能够跳转到具体的播客订阅页面;
  10. 支持开启播客互推(即如果开启互推,你的节目也会出现在别人的播客下方,作为猜你喜欢的实现;相应的,你的节目下方也会出现别人的播客)。

白宦成使用说明书 2022

two person using laptops

此文档已过期,最新版请参考 白宦成 使用说明书 2023

上次出说明书还是在 2021 年 4 月,如今一年有余,需要更新一下说明书,方便大家了解最新的动态。

适用范围

此说明书用于更好地和白宦成协作。

我感兴趣且长期关注的领域

我个人关注的领域较多,但底层的核心逻辑是我关注的领域大多和个人的自我实现有关。

在此基础之上,可以细分为:

  • Web3:Web3 作为现实中金融体系的无监管版本,对于我来说,是一个学习的好地方,并且可以和现实生活中的金融进行对比,更好的理解金融。
  • 内容创作产业:帮助更多人走上内容创作的道路
  • 面向中小开发者的开发者服务:帮助更多的人可以开发出自己的产品
  • 自动化工具:解放生产力,让每个人可以去做自己想做的事情。

我会长时间关注上述领域,如果你和我沟通上述领域的内容,我会非常高兴和你详细聊一聊。

今年重点项目

  • 和声网一起合作的 NGLab · 独立开发者孵化器
  • 自己的写作项目
  • 播客领域的 SaaS 产品

我的性格特质

  • 我的 MBTI 类型:INTJ

核心优势:善于分析拆解事物,并按照目的方向进行重新规划和安排。

  • 我的盖洛普优势 我的排名前10位的盖洛普优势才干为:理念、专注、行动、沟通、完美、搜集、积极、分析、关联、取悦。
  • 优势领域:建立影响力

我是什么样的人

我既可以与人沟通,也可以与自己沟通,且我大部分时间都与自己沟通。如果我们见面沟通,那么,我会希望你我可以有不一样的观点可以分享。

初次见面聊什么好?

我很喜欢和别人聊一些不一样的体验。如果是第一次见面,不妨聊一聊最近看的书,最近去过的地方,我都很有兴趣听你分享你的故事。

喜欢的合作伙伴

  • 比起同步沟通更喜欢异步沟通的人
  • 比起语音更喜欢文字的人
  • 有逻辑有条理的人
  • 不拖欠款项(特殊情况除外)

工作/学习偏好

  • 习惯深夜工作/学习
  • 习惯在安静的地方工作,或者自带白噪音的环境
  • 不喜欢在家工作(写代码时除外,因为需要双屏)

我喜欢的沟通模式

对于细节问题,我会更倾向异步的沟通方式,你可以将问题的细节整理好,发送邮件给我,我在看到邮件后会和你具体的沟通。

对于宏观问题,我会更倾向同步的沟通方式,我们可以在这种同步的沟通方式中,探索出新的可能。

喜欢的办公场所

  • 咖啡馆:小众咖啡厅最佳,在背景音下工作体验非常好。
  • 书店:聊完可以一起逛一下书店,带两本喜欢的书回去。

活跃时间

  • 9:00 AM ~ 12:00AM:读书时间,勿扰。
  • 2:00 PM ~ 9:00PM:阅读互联网信息/查收邮件,可联系。
  • 9:00 PM ~ 11:00PM: 读书时间,勿扰。

Base 地

天津市

不喜欢什么样的人

  • 不尊重专业的人
  • 抗拒将问题细节化的人

如何付费

我的咨询报价为 $400/h(折合人民币约 2697 元/小时).

开始咨询,你需要支付至少 1 小时的费用。实际费用按照小时为单位进行结算。

咨询时长按照向上取整计算。

你和我沟通过程中可能会遇到的问题?

  • 某条消息很久没有回你不一定是因为我不想回,很有可能是我没注意。现在看书比较多,所以看微信相对就会少一些。不妨再 Ping 我一次。

其他

如果你看了上述信息,仍然认为有必要与我建立联系,达成沟通,那么你可以扫描下方二维码和我取得联系。

0d5b1c4c7f720f698946c7f6ab08f687 1

白领凭什么比农民更赚钱

person in yellow jacket holding black soil

在 V2ex 看到这样一段话,想展开聊一聊。

d2b5ca33bd970f64a6301fa75ae2eb22 5

在我大学刚毕业的时候,我其实很喜欢小公司,觉得小公司可以提供更好的薪酬福利(小公司这么小,招人总要有点过人之处吧)。但当我去到大公司的时候,才意识到我错的有多么离谱。如果你希望更好的薪酬福利,那么一定要选择大公司。但如果你希望赌一个未来,那么小公司是你应该去的地方。

为什么大公司能够在提供更好的薪酬福利,本质上是因为大公司通过自己的规模效应,赚取了超额的利润,只是将其中的一小部分分润出来,就可以给员工带来极舒适的工作体验。而作为这个大公司中的每一个人,之所以能够拿到更好的薪酬福利,则是因为你作为个人的付出本身价值可能一般,但公司本身的规模效应,可以为这件事创建一个极大的乘数,所以最终得到了一个不错的收益, 公司也就愿意持续给你支付一个较高的薪水。

此外,这个回答里提到了农民,这部分还有另外一个原因:

我国的市场是一个看得见的手和看不见的手联合产生作用的市场,而农民的产出就属于政府宏观调控的范畴。一方面,政府需要确保农民能够吃得饱饭,不至于干不下去。另一方面,政府也需要更多的民众能够吃得其饭,不至于饿死。但政府本身不能产生价值,只能通过转移支付的方式来解决这个问题,所以就产生了我们发现农民赚不到钱,纷纷出来打工。而我们的粮食又能始终保持在一个低位的现象。

想要解决这个问题有赖于农业机械化和化肥的大量使用,通过这些方式,提升产量,降低人工成本,才能让农民真正赚得上钱。

歌手也看时代

close up photography of black turntable

最近周杰伦发新歌,一天就成为了数字专辑销量排行榜的榜首,并成为日销量、周销量、年销量和总畅销的排行榜榜首。

0d5b1c4c7f720f698946c7f6ab08f687
总销量排行榜

作为一个听周杰伦歌长大的人,自然是高兴这样的场景的,我所喜欢的歌手,依然是受到大家喜欢的歌手。

不过,高兴之余,也让我思考,为什么是这样?为什么一个歌手已经唱了 22 年的歌(第一张专辑《杰伦》发布于 2000 年,至今已经 22 年),还能够获得大众的喜爱?背后到底是有什么出色之处,能够让人持续的着迷于他。

当然,我认为周杰伦的唱功、创作能力等都不错,除了歌词时长听不清,别的没啥毛病。但这也不会是全部,新一代的歌手同样也有类似水平的人。

那到底是为什么?

仔细想了想,大概是周杰伦生对了时代。根据第六次人口普查数据,80后为2.28亿人,90后为1.74亿人,00后为1.46亿人。周杰伦是幸运的,他的歌曲影响了 80后、90后,影响了至少 4 亿人,再加上 00 后往往父母是 80 后那一代人,也会带着听一些歌,也会迁移默化影响一部分。4亿人的基数,自然是容易上榜首。而随着人口数量的下降,新一代的歌手,除非极其优秀,很难突破这种限制。人口所带来的数量级层面的差距,是无法比拟的。

当然,后续有这饭圈的文化来让销量提升,但这仅仅能解决歌手赚钱的问题,无法解决影响力的问题。 1 个人买 100 张专辑和 100 个人每个人买 1 张专辑,我相信歌手会更喜欢后者,因为后者才能让影响力持续的扩大。

不由感叹,即使你是天才,也依然需要时代的机遇。周杰伦无疑赶上了一个好的时代。

写博客, 工具重要么?

person typing on laptop computer

我写了快 10 年的博客,近 1000 篇,勉强算得上是个老人了,今天看到 Pin 的文章提到《只要用得習慣的都是好工具?》,刚好聊聊我自己的看法。

我从一开始使用 WordPress 写博客,再到后面折腾 Ghost、Typecho、EMlog、B3log、Hexo、Hugo 等一系列博客程序,一直到后来坚持在 WordPress 这个平台上持续写作。确实是有我自己的考量的。

对于我来说,确实不太需要工具来帮助我更好的产生一篇博客 —— 因为我满脑子都是灵感。但另一方面,我也认可工具是非常重要的 —— 就像我为什么现在坚持使用 WordPress 。

WordPress 作为动态程序,可以让我无时无刻的在任何一台电脑上写作 —— 我不只在 macOS 上写博客,还会在手机上写。而这些是 Hexo、Hugo 之类的产品无法做到的。

动态博客的 WordPress 释放了我写作的生产力,让我可以源源不断的产生灵感、记下灵感,并转变成文章。

另一方面,WordPress 的丰富的插件系统,也让我能够更好的写作:如果你细心,可能会注意到,今年我的博客几乎都有了题图 —— 主要得益于一个 WordPress 插件 Instant Images,让我可以直接在 WordPress 中搜索无版权图片作为头图。再配合上 USS Upyun 这个插件,来将我的图片放在对象存储上。

d2b5ca33bd970f64a6301fa75ae2eb22 6

当贴图变得简单了以后,自然也就愿意在文章当中给我的读者以更加丰富的形式。

你说工具不重要么?我不这么觉得。

当你不知道你想要什么的时候,工具或许是不重要,因为反正你没明确方向,效率并不重要。但当你明确了你想要什么的时候,工具就变得十分重要了。

《写作即疗愈》书摘

pile of assorted-title books

这本书我看了觉得还行,但确实也没什么可写的,所以就把我觉得还行的片段摘抄出来。贴在下方。

写作并不是专属于某一类天才的精英式活动。写作是一种交流、是自我发现、是创造、是灵性活动和自我表达。写作是我们用来寻找和练习理解内心声音的基本方法。很显然,写作也是人类的一种冲动。你究竟为什么要将自己排除在这种写作实践之外呢?

[美] 艾莉森·凡伦《写作即疗愈》

你付出的越多,你得到的回报就越多。写作对我们有很多帮助。 1.只有说出我们的经历,我们才能更充分地理解它。 2.用语言描述我们想要创造的未来,这样它就不会让人感觉模糊,而是开始变得可以实现。 3.在我们正在经历的现在和我们想要创造的未来之间建立一座桥梁(神经通路)。 4.用过去的经历来治愈我们和培养我们的韧性。 5.从正确的视角来看待生活中大大小小的挑战。 6.为老问题找到全新的解决方案。 7.建立我们的自信。 8.增强我们的工作记忆能力和整体认知能力。 9.培养更多的满足感和感恩之心。 10.为我们的决策提供清晰的思路。 11.提高我们对恋爱关系的满意度。 12.增强我们的免疫系统,帮助我们睡得更好。 13.对抗和抑制焦虑、压力和抑郁。 14.把我们周围善意的和批评的声音过滤掉,这样我们才能最终理解自己的想法。

[美] 艾莉森·凡伦《写作即疗愈》

你可以仅仅因为想写就去写——你觉得自己被一种力量推着去写作,即使你没有出版的愿望。

[美] 艾莉森·凡伦《写作即疗愈》

找到一个合适的词汇来准确定义我们的经历,将有助于我们避免过度夸大或低估一种经历。我们使用的词汇可以帮助我们更加清楚地看到问题,并诚实地去评估问题,这样一来,我们就有可能找到问题的解决方案。然而,这不是说任何文字都可以做到这一点。它们必须是正确的词语才行。不知道大家是否有这样一种经历:你想不出一个合适的词来形容一个特定的话题,直到你最终想出它。当你终于能用恰当的语言来形容你的感受或经历的事情时,你会感受到一种深深的如释重负的解脱感。 马克·吐温(Mark Twain)曾说:“用得正确的词语与差不多正确的词语之间的分别,等于闪电与萤火虫之间的分别。”这就是写作带给我们的启示——找到正确的词语。

[美] 艾莉森·凡伦《写作即疗愈》

这个术语,我能给出的最简单的定义是:表达性写作就是在纸上分享你对某一主题最深刻的想法和感受的行为。表达性写作涵盖了从散文到诗歌,到意识流,到情感词的罗列,再到关于某一主题的一系列想法等不同形式。这种类型的写作可以帮助你疗伤,并以一种新的方式了解自己。

[美] 艾莉森·凡伦《写作即疗愈》

当我们深入研究生活和写作之间的联系时,我们就会发现写作是生活中最美好的礼物之一:写作实践实际上就是一种生活实践。当我们从写作的困境中解脱出来,我们也就从生活困境中解脱出来了。

[美] 艾莉森·凡伦《写作即疗愈》

实际上,拥有一个属于自己的空间象征着更重要的东西—— 一个自己可以自由地思考、梦想、反思和进行创造的空间,以及为这个世界奉献自己力量的空间。

[美] 艾莉森·凡伦《写作即疗愈》

我的建议是每天坚持20分钟的写作。如果你无法做到,那就试试10分钟。如果对你而言10分钟似乎也太长了,那就坚持5分钟。

[美] 艾莉森·凡伦《写作即疗愈》

安排写作的两个最佳时间就是在你起床的时候或上床睡觉的时候。

[美] 艾莉森·凡伦《写作即疗愈》

在现实生活中,有太多的人就像那天站在教室里的我一样:等待着某个人出现,告诉我们下一步该做什么,为我们来回答人生中遇到的重大问题,给我们提供一套让我们感到安全的规则。我们始终追求安全和保障,但是创新和创造力却往往发生在安全和保障的边界之外。写作本身邀请我们进入这个过程之中。它邀请我们坐在创造力之桌的旁边,来到我们自己的人生之桌的旁边。

[美] 艾莉森·凡伦《写作即疗愈》

我们试图将精力聚焦在一件事情上的行为揭示了我们一直以来都受到外部事物的侵扰,总是会分心。

[美] 艾莉森·凡伦《写作即疗愈》

如果你打算用任何一种方式让自己保持在当下,与自己内心的声音保持一致——这个过程就如同把事情写在纸上一样,你就是在逆流而上。我们的世界并不是以一种有利于精力聚焦的方式来设计的。

[美] 艾莉森·凡伦《写作即疗愈》

人生的意义往往始于问题,而不是答案。

[美] 艾莉森·凡伦《写作即疗愈》

从更好的问题开始。我们提出的问题不断地推动我们去寻求答案。它们让我们在一个或多个这样的循环中不停地运动。

[美] 艾莉森·凡伦《写作即疗愈》

CBT模型假设我们生活中的事件、思想和感觉之间存在着一种自然的因果关系。这种因果关系可以表述如下。 1.我们的生活中总会发生一些事情。 2.我们对那些事情都会有想法。 3.我们对这些想法都有切身的感受。 4.这些感受导致我们以某种方式行事。 5.这些行为会导致某种结果。

[美] 艾莉森·凡伦《写作即疗愈》

“先写下来,然后再编辑”的价值不仅在于你能在纸上写下更多的文字,还在于你会在写作和生活中获得更多的乐趣。你将会享受这样的兴奋感:充满好奇和偶然性,在桌子上有创意地摆弄一个东西而不知道它到底是什么——你在第一次尝试时就不需要做到完美。

[美] 艾莉森·凡伦《写作即疗愈》

人类的精神不像人类的大脑那样追求生产力和效率。人类的精神渴望思想的深度,而不是宽度。人类的精神无法给出关于投资回报率的计算公式。人类的精神世界与思想贡献、文化遗产、影响力和价值有关。人类的精神更关注奉献而不是索取。人类的精神想知道自己是谁,为什么会在这里。

[美] 艾莉森·凡伦《写作即疗愈》

书评《金钱永不眠》&《金钱永不眠Ⅱ》

brown book on white table
d2b5ca33bd970f64a6301fa75ae2eb22 3
《金钱永不眠Ⅱ》
d2b5ca33bd970f64a6301fa75ae2eb22 4
《金钱永不眠》

最近读了香帅的《金钱永不眠》和《金钱永不眠Ⅱ》。总体来说,我认为她的这两本书不符合我们过去所熟悉的那些书的定义,或者说,这不是一本我们常见的书,而是一本文集 —— 香帅过去几年的金融文章的文集。如果你抱着课程的视角来读这些书,可能会比较失望,但如果你把它当作散文集来阅读,是一个不错的内容。对于金融几乎完全没有了解的我,也能管中窥豹,学到一些有意思的东西。


纯学术研究(尤其是学术发表)有其范式和目标受众,是一个极度细分的市场,对于纵向的深度有近乎苛刻的要求。而好的专栏需要全视野,在横向的广度上有延伸,同时要兼顾逻辑上的美感。专栏受众甚广,一定要用有趣、浅显的语言说清问题。

香帅《金钱永不眠》

这是我应该做到的,一个专栏应该拥有全视野,Newsletter 也是的。感受到了博客作者和专栏作家的不同。

信用、可交易证券,以及股份制有限责任公司——这几乎囊括了现代金融市场的全部基石。

香帅《金钱永不眠》

信用是我们所熟悉的信用卡、银行。可交易证券则是我们熟悉的股票 —— 它代表着企业的一部分权利。股份有限制公司,则是股票的基础。

尚在襁褓中的清王朝有着“万代基业”的梦想,一切民生、增长和经济的考量都在“秩序”面前沦为了傀儡和点缀。

香帅《金钱永不眠》

让我想起了 —— 黑猫白猫,找到老鼠的就是好猫。

成功的改革,其实是最朴素的世俗理性原则——“百姓日用即道”——的适用。

香帅《金钱永不眠》

消费品经久不衰便是如此,其他行业都可以死掉,唯独日常消费品不能死掉。

“民生”为第一要务。凡是能让老百姓过上好日子的政府、政策、举措都是可以权宜处理的。

香帅《金钱永不眠》

很多时候,民众对于政府的要求并不高。

大家都知道金融市场的监管机构叫“一行三会”,包括央行、银监会、证监会和保监会。银监会主管所有的银行、信托和其他金融机构的相关业务,证监会主管券商、基金等机构的相关业务,保监会主管保险机构相关业务。

香帅《金钱永不眠》

之前还真不知道一行三会,现在了解到了。

不确定也就是我们俗称的“风险”。金融学最基本的原则是:回报和风险从来都是唇齿相依。金融学中说“没有无风险的收益”,翻译成大白话就是“天下没有免费的午餐”。

香帅《金钱永不眠》

没有无风险的高回报投资品。

金融市场的本质是“不确定性”和“预期”。信息的透明有利于减少市场上的信息不对称,使得价格更准确地反映价值,从而更有效地指导资源配置。这也是为什么所有的金融市场都在强调“信息披露”的重要性。

香帅《金钱永不眠》

一个稳定的金融市场,应该是信息透明的、不确定性降低的、预期非常明确的。(一级市场投资没有这么多,所以并不适合每个人)。

通俗地说,股票的“杠杆化交易”就是指投资者通过借贷,进行投资的行为。杠杆的作用恰似放大镜,会将投资的收益和损失放大。它使我们的投资收益和损失都被扩大,杠杆率越高,这个放大的效果就越强。

香帅《金钱永不眠》

杠杆是把双刃剑, 可能会把让你一飞冲天,也会让你一秒挂掉。

金融市场的流动性枯竭意味着资产存在无法变现的风险(通俗地说,就是“炒成了永久股东”),这种巨大的不确定性会使得市场陷入更大的恐慌,导致投资者不计成本地出逃。

香帅《金钱永不眠》

NFT 就是一个典型的没有流动性的产品。

投资者买股票是为了盈利,而不是收藏。如果股票的“卖出”有困难,投资者一定在“买入”上很踌躇。现实中的市场就是这样的,有卖才有买,买和卖是市场价格决定的力量和机制。任何一环被限制,都会对价格和交易造成巨大伤害。

香帅《金钱永不眠》

赚钱就好。不要指望炒股炒成了股东。

在选美比赛中,人们选出的不一定是自己认为最美的女子,而是自己认为大众最喜欢的那个女子——这种非理性是人类的共性,在中国短期套利的市场氛围下更是如此。

香帅《金钱永不眠》

大家选出的是大众最喜欢的股票 —— 比如茅台。

在国内的大环境中,“韬光养晦”的发展战略始终是企业,尤其是民营企业发展的法宝。

香帅《金钱永不眠》

俗话说,闷声发大财。

90年代以前的大型国有企业的工人们,其实和企业之间有一种隐形的合同:极低的现金工资是和隐含的高福利(比如工厂的附属医院、教育、社保、住房等)相匹配的。

香帅《金钱永不眠》

其实现在也有,比如「体制内」。


个人与集体,领袖与信众,权力与权利,都是这个群体最容易踏入的塔西佗陷阱。

香帅《金钱永不眠2》

警惕陷入塔西佗陷阱。

金融的本质是突破人类社会面临的约束条件,帮助我们在不确定性的未来中追求更大程度的自由。

香帅《金钱永不眠2》

金融帮助我们放大现在的能力,从未来获取回报。

未来的资产世界也是一朵乌云,我们会进入“三高年代”——高波动、高估值、高分化。

香帅《金钱永不眠2》

高波动对于强者来说是好事,但对于弱者来说未必。

所以大家不要总想着搞平台、薅羊毛,而应踏踏实实开店,做好拳头产品。

香帅《金钱永不眠2》

搞平台需要时代的机遇。如果时代不需要平台,那就专心做好拳头产品。

人类历史的经济主题从来只有两个,一是增长,二是分配。当增长为主的时候,我们希望自由,不要管制,钟摆就荡到右边追求效率;当社会开始谈分配的时候,这个钟摆就荡到左边,追求公平。

香帅《金钱永不眠2》

我们现在应该是刚从增长转向分配。

知识创新是技术进步的动力,它通过投资的方式作用于经济增长,而且是累进的叠加的方式。

香帅《金钱永不眠2》

知识创新与投资相结合,发挥出更大的价值。

和高盛、摩根士丹利注重学历、血统的传统不一样,贝尔斯登奉行的是一种叫“PSD”的文化——P指贫穷(poor)、S指聪明(smart)、D指有强烈的(deep)赚钱欲望。

香帅《金钱永不眠2》

两类人,一类是高材生,一类是小镇做题家。