
「转」西二旗折叠:蜂巢经济学启示录
原文:微信公众号「重远投资观」 一)操盘手的鬼牌 这篇文章大概写的是西二旗程序员们吃饭穿衣都会选最便宜的,然后把所有剩余的钱都拿来买房。 然后朋友也问我了,说在房价下跌的2023年,你怎么看。 这让我想起了我小时候,家里的阳台上,曾养过的一箱蜜蜂。因为我家靠近公园,有足够的花可以作为蜜源。所以在我的记忆中,家里从来不缺蜂蜜吃,因为家里人会定期戴着防护面罩开箱,把蜜取走。 不过我们每次取蜜,都会留下一些蜂蜜给蜜蜂过冬,如果收割得太狠,蜜蜂活不下去,就没有长久的蜂蜜吃了。不能涸泽而渔。 小学的语文课本里,一直在歌颂蜜蜂的勤劳,可我一直有一个疑问,是不是正因为蜜蜂的勤劳,才使得它们变成了我们的绝佳收割对象。 也许,在蜜蜂的认知中,蜂箱蜂巢就是他们最大的资产,但在更高一维度的养蜂人眼中,把蜂箱视为最大资产的蜜蜂,才是养蜂人最大的资产。 所以呢? 生活中极尽节俭,并把房子视为最大资产而背负房贷的西二旗人,会不会是更高维度的操盘手眼中的最大资产呢? 财富收割的链条 一个年薪百万的西二旗程序员,交掉社保个税后,到手大概70万,然后公司还要额外缴纳十几万的社保。 也就是,一个西二旗程序员每创造110多万的财富,在第一次分配环节,大概还能剩70万。然后,因为他们吃饭穿衣都极为节省,所以这70万,可能又有五六十万投入了楼市。自己还剩下十几万用于生活。 投入楼市的这五六十万,可能有40多万作为土地出让金交给了操盘手,剩下付给了开发商和上下游供应商。 这么看起来,似乎程序员每赚100块钱,就有80多块以社保个税土地出让金等方式回流到了操盘手的手中。自己只剩下十几块用于生活。 但这里其实是有个问题的,西二旗人可以不买新房的。如果他向老北京人买二手房,他的这笔巨大支出,不就回流到了老北京人手中,而没有回到操盘手的手中吗? 操盘手的解法三步曲 零成本选址 操盘手首先要选一块只有很少居民的土地,最好土地上没有老北京人的房子。一块荒地那就是最好了,这样就能实现零拆迁成本征用所有土地。 我们看到,北京西二旗,上海张江唐镇,杭州未科,成都天府新区,几十年前,可能都是比较荒的,也几乎都是这个套路。 引入科技公司入驻 有花才能引来蜜蜂,有工作机会才能引来年轻人。所以如果能有一些政策优惠啥的,把科技大企业引来入驻,也就等同于,引来了大批期待高薪工作的年轻人。 于是,北京西二旗后厂村路成了程序员宇宙中心,上海张江唐镇成为高科技园区。杭州未科变身未来科技城…… 开始售卖科技公司周边的土地 当年轻人开始在科技公司上班,就会就近选择可购买的房子。但附近所有的土地,都在操盘手的手中。所以,操盘手拥有绝对的定价权。于是,年轻人以未来的收入为背书,借债购买房产,支付房产的土地出让金。并开始定期还贷。 二)谁是蜂王,谁是工蜂 在一个蜂群巢穴,是有着明确的分工的。 一个巢穴的蜜蜂分为三种,蜂王,雄蜂,和工蜂。 工蜂是雌蜂但无生育能力,只负责采蜜工作和照顾小蜜蜂 蜂王不采蜜,只接受工蜂的养料,专职生小蜜蜂 雄蜂也不采蜜,唯一的工作就是,和蜂王交配 也就是说,让每个蜂种,都只从事自己最擅长的工作。 这似乎给了我一些启示。 虽然京沪的总和生育率已经降到了0.7,是全球最低。但这并不可怕,其实是有解法的。 生育效率的战争推演 方向一:用最少的钱,激励出最多的生育 从这个方向看,显然,钱应该花在三四线城市。给一线城市居民补贴50万,可能人家也不愿意生,毕竟房价生活成本高。但如果是四线城市,可能给20万,人家就愿意生了。毕竟养育成本低。 方向二:激励同样生育成果的前提下,花费最小的代价 如果一个985高学历,年薪百万的女性,辞职生二胎照顾孩子,每年会损失百万财富的创造。但如果是一个大专学历,年薪5万的女性辞职生二胎照顾孩子,每年只损失5万财富的创造。 三)北京西二旗和上海张江男的终极宿命 最后一个问题,西二旗程序员,为啥心甘情愿在吃穿上拼命节省,而把大笔的钱投入楼市呢? 答案是,他们认为房子是核心资产! 但问题在于,任何资产,或者说财富,其本质,都是对他人劳动的索取权。也就是说,世间的一切资产,不论是房子,股票,货币,黄金,它最终要能兑换成人的劳动,才有意义。 可问题就在于,2020年之后的生育率断崖式下跌了。未来所有的人,都会盯着这仅有的少数年轻人的劳动价值。 四)后记 本文无意得罪张江和西二旗的程序员,因为文中所说的逻辑,其实适用于所有在科技新区安家的一二线城市中产。但因为我自己是一个前支付宝的程序员。想想还是自嘲下自己这个群体吧。 不过我在考虑的一个点是,如果在一线城市这么累,大部分的劳动成果要被转移支付出去,结果自己连多生一个孩子的压力都承受不了,那我们为什么还要在一线城市苟且下去呢? 看似一线城市的花很多,很适合蜜蜂采,但如果采回的蜜大部分要被转移支付,那这些花(工作机会)似乎也没有什么特别大的意义。

难得空明
朋友圈看到中学老师的书法作品。 版本比较多,找了一个类似的。 《志公和尚万空歌》 【梁】志公和尚(宝志禅师) 撰 南来北往走西东,看得浮生总是空。 天也空来地也空,人生渺渺在其中。 大地本来无寸土,人生劳碌一场空。 日也空来月也空,来来往往不留踪。 日月星辰常运转,人亡千载永无踪。 山也空来水也空,随缘变化体无穷。 青山绿水依然在,为人一死不相逢。 田也空来地也空,换了多少主人翁。 世间多少穷后富,也有多少富后穷。 金也空来银也空,死后何曾在手中。 万两黄金拿不去,为他一世受牢笼。 生也空来死也空,生死如同一梦中。 生如百花逢春好,死如黄叶落秋风。 夫也空来妻也空,大限到了各西东。 夫妻本是同林鸟,可怜死后不相逢。 男也空来女也空,黄泉路上难相逢。 贵子贤孙休贪爱,人因痴爱堕牢笼。 幻化空身虚变现,空是色来色是空。 空手来了空手去,到头总是一场空。 朝走西,暮走东,人生恰似采花蜂。 采得百花成蜜后,一场辛苦一场空。 夜深听得三更鼓,翻身不觉五更钟。 从头仔细想一想,便是南柯一梦中。 不信但看桃李树,花开能有几时红。 任你做到公卿相,死后还归泥土中。 身归土,气归风,一片顽皮裹臭脓。 败坏不如猪狗相,何不当初问志公。 生有一,死无二,休向人前夸伶俐。 生前置下田万顷,死后只得三步地。 宽八尺、长丈二,仔细思量真个是。 若人死后带得去,志公与你亲书契。
Ubuntu Clean
清理 /boot 目录 查看内核版本 uname -r 列出所有的内核 dpkg --list 'linux-image*' | grep ^ii 卸载没有使用的内核 sudo apt-get remove linux-image-VERSION 清理不再使用的包 sudo apt-get autoremove 更新内核列表 sudo update-grub 清理 /lib/modules 目录 查看已安装的内核版本 apt list --installed linux-image 删除未使用的内核版本对应的目录 sudo rm -rf 5.15.0-70-generic/ 清除未使用的 snap 包 #!/bin/sh LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $3}' | while read pkg revision; do sudo snap remove "$pkg" --revision="$revision" done
Porto
Porto (Software Architectural Pattern) Welcome to Porto Introduction Getting Started Layers Overview 1) Ship Layer 2) Containers Layer Containers Sections Components 1) Main Components 1.1) Components Interaction Diagram 1.2) Request Life Cycle 1.3) Main Components Definitions & Principles Routes Controllers Requests Actions Tasks Models Views Transformers Exceptions Sub-Actions 2) Optional Components Typical Container Structure Porto Quality Attributes Implementations (Built with Porto) Feedback & Questions Introduction Porto is a modern software architectural pattern, consisting of guidelines, principles and patterns to help developers organize their code in a highly maintainable and reusable way....
ApidocJs apigroup Support Chinese
如题 apidoc 的 @apiGroup 值如果是中文的时候没办法进行分组。官方仓库提了好多这样的 issue,貌似韩文也不支持。 有人提了 pr,但是被拒绝了,不知道为什么。 可以临时根据这个 pr 修改文件来支持中文分组,node_modules/apidoc/lib/core/workers/api_group.js 文件中的: group = group.replace(/^[^a-z]+|[^\w:.-]+/gi, ''); 替换为: group = encodeURI(group).replace(/^[^a-z]+|[^\w:.-]+/gi, ''); 这样如果线上部署生成的话就不太方便了,可以在生成文档的脚本文件中添加一行替换的代码,在生成文档前强行替换: sed -i 's/group = group.replace/group = encodeURI\(group\).replace/' node_modules/apidoc/lib/core/workers/api_group.js
int(10)里面的10是什么意思?
crud 惯了,从来没深入研究过这些(一直以为是能存储的字节数)。 查了一下官方文档:Numeric Type Attributes。 MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits. This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. (That is, this width is present in the metadata returned with result sets....
5-3 会话
会话 会话是一个进程组,或是多个进程组的集合。 一个会话可以至少有一个控制终端(物理终端,伪终端) 一个会话至少有一个前台进程组(前台就是指能输入的 bin/bash ),其它就是后台进程组 一个会话如果连接了一个控制终端,就叫控制进程 因为这个会话首进程 /bin/bash 是连接控制终端(伪终端设置驱动程序+tcp/ip 对端的ssh client) 的,所以创建的子进程,也会继承 bin/bash 的控制终端(0,1,2标准输出,标准输入,标准错误) 在终端的输入会影响前台进程组,ctrl+c (会终止前台进程)。 会话的创建 使用 posix_setsid() / setsid(2)创建。 不能使用组长进程调用 setsid 函数,硬要调用会报错 一般先创建一个子进程,让父进程exit,由子进程调用 setsid 调用 setsid 之后,该进程会变成组长进程,同时也会变成会话首进程 同时该进程没有控制终端(没有终端了,可以认为它没有连接显示器,没有连接键盘) 它没有控制终端了,你在终端里输入任何数据都没有反应的 phpdemo19.php <?php function showPid() { $pid = posix_getpid(); fprintf(STDOUT, "pid=%d,ppid=%d,pgid=%d,sid=%d\n",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid)); } showPid(); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } if (-1 == posix_setsid()) { echo 'error'.PHP_EOL; $erro_no = pcntl_errno(); echo pcntl_strerror($erro_no).PHP_EOL; } else { echo '会话创建成功'....
5-2 进程组
进程组,就是一个或是多个进程的集合,每一个进程都有个标识「组ID(PGID)」,表示该进程属于哪个进程组。 bash 进程启动之后,它会自己 setsid 把自己设置为会话首进程,也会设置自己为组长进程。 进程:正在执行的程序,这个程序是在 bin/bash 进程里启动的。 进程启动之后(通过 execve 函数启动),它会继承一些属性比如说组ID,会话ID,同时也会继承父进程已经打开的文件描述符(伪终端里的):0/标准输入,1/标准输出,2/标准错误,通过 pts、ptmx 模拟出来的。 demo17.php $pid = posix_getpid(); fprintf(STDOUT, "pid=%d,ppid=%d,pgid=%d,sid=%d\n",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid)); 查看当前 bash 进程 PID $ echo $$ 1031235 另外一个 SSH 连接,追踪上一个 bash 进程 $ strace -f -s 65500 -o demo17.log -p 1031235 在 bash 进程 1031235 中,执行代码 $ php demo17.php pid=1032568,ppid=1031235,pgid=1032568,sid=1031235 demo17.log # bash 进程 clone 一个子进程 1032568 1031235 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2c4847ba10) = 1032568 1032568 getpid() = 1032568 ... # 子进程将自己设置为组长进程 1031235 setpgid(1032568, 1032568) = 0 ....
2021-03-25 「PHP架构师」面试准备
岗位信息 职位:PHP架构师 工作职责: 负责应用类产品后端架构设计、开发与优化 负责业务整体设计,具有良好的维护性和扩展性 参与需求分析与评审,了解业务,从技术角度推进业务的安全、稳定运行 任职要求: 掌握微服务开发,拆分,saga事务模型 掌握消息队列 熟悉其他的语言 掌握docker,k8s 熟悉TCP、UDP、http协议 熟悉 linux 基础命令,了解如何排查系统性能瓶颈 熟练掌握mysql数据库的性能优化,表拆分 熟练掌握php,了解PHP的优势 统招全日制本科及以上学历,理工科专业。 知识点 saga 事务模型 概念 saga 是啥? 咱可没听过呀。 《传奇》是由布莱恩·K·沃恩(Brian K. Vaughan)撰写并由菲奥娜·斯台普斯(Fiona Staples)绘制的史诗般的太空歌剧/奇幻漫画系列,由美国公司Image Comics每月出版。该系列作品深受《星球大战》(Star Wars)的影响,并基于沃恩(Vaughan)既是孩子又是父母的想法。 —— saga 呃,貌似对找工作没啥帮助,既然是漫画先收藏起来。 再搜找到了以下相关的介绍: 1987年普林斯顿大学的 Hector Garcia-Molina 和 Kenneth Salem 发表了一篇 Paper Sagas(点这里可以看原文),讲述的是如何处理 long lived transaction(长活事务)。Saga 是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。 —— 10分钟说透Saga分布式事务 The Saga design pattern is a way to manage data consistency across microservices in distributed transaction scenarios. A saga is a sequence of transactions that updates each service and publishes a message or event to trigger the next transaction step....
5-1 Bash进程与终端
什么是终端 能实现数据输入、输出的统称为终端。 物理终端:传统显示器、键盘,通过 VGA、HDMI、USB 等连接。 软件终端(虚拟终端/伪终端):通过 TCP/IP 协议实现的终端,能模拟出来一个实现「数据输入、输出」的终端,比如:ssh、telnet … 这篇博客介绍的比较详细:「转」彻底理解Linux的各种终端类型以及概念。 伪终端的连接过程 在linux中有物理终端,有虚拟终端(伪终端)。 sshd 服务会打开一个 [dev/ptmx],这个文件是一个伪终端主设备文件。 bin/bash 会打开一个 dev/pts(0,1…), 是一个伪终端从设备文件。 ptmx/ptsx 它们通过伪终端设备驱动程序模拟出输入和输出的功能。 bin/bash 进程就可以实现数据读取和数据写入。 ssh客户端 ——————> 远程服务器的一个进程 ——-> ssh客户端。 输入单元(ssh客户端)——–> /bin/bash进程————–> 输出单元(ssh客户端)。 bin/bash 启动之后,对终端数据的读取和写入就是通过 pts 实现的(能实现标准输入,标准输出)。 dev/pts0 0 1 2 标准输入,标准输出,标准错误。 通过 strace 命令查看sshd服务: strace 前进程关系: ├─sshd,9408 │ └─sshd,2888142 │ └─bash,2888170 │ └─pstree,2889779 -ap strace 中: $strace -f -s 65500 -o sshd.log -p 9408 # strace 查看系统调用,进行一个新的 SSH 连接 strace: Process 9408 attached strace: Process 2888330 attached strace: Process 2888331 attached strace: Process 2888336 attached strace: Process 2888342 attached strace: Process 2888343 attached strace: Process 2888344 attached strace: Process 2888345 attached strace: Process 2888346 attached strace: Process 2888347 attached strace: Process 2888348 attached strace: Process 2888349 attached strace: Process 2888350 attached strace: Process 2888351 attached strace: Process 2888352 attached strace: Process 2888353 attached strace: Process 2888354 attached strace: Process 2888355 attached strace: Process 2888356 attached strace: Process 2888357 attached # 新的SSH连接 strace: Process 2888358 attached strace: Process 2888359 attached strace: Process 2888360 attached strace: Process 2888361 attached strace: Process 2888362 attached strace: Process 2888363 attached strace: Process 2888364 attached strace: Process 2888365 attached strace: Process 2888382 attached ^Cstrace: Process 9408 detached # 终止信号 strace: Process 2888330 detached strace: Process 2888357 detached 新的 SSH 连接以后的进程关系:...