This blog is rated 🔞, viewer discretion is advised

“中庸”的艺术 - 如跟需求方讨价还价

翻到一个神贴 How to make Product give a shit about your architecture proposal ,标题直译就是《如何让沙雕产品经理接受技术改造》

具体故事,原文非常值得一看。搞了这么多研发,产品经理各种水平的都遇到过一堆,最大的烦恼就是“我有个想法”,“今天就要”而全然不顾你当前技术架构的问题。到底是技术优先,还是业务优先?开发人员和销售非常普遍的冲突怎么处理?

产品经理,老板,甲方,销售,实际上是研发的衣食父母。他们所有的诉求:

  1. 产品不管你的技术问题,他们也不懂。他们只关心 产品 本身
  2. 产品需要的是一个 结果,而不是一个白板上巨复杂的分布式系统架构图
  3. 产品是人,产品为人服务。他们也能理解有工程方面的顾虑,这也是他们找开发的原因。他们是来“讨价还价”的!

开发是“乙方”,正如那个文章里的 水管工 故事一样,实际上是 “赢得信任” 的实施方。所以接下来的套路是:

  1. 你先不要 what about,先别反驳说 but 。先按照理想的条件,全部答应下来,
  2. 做一个理想化,全套,SSVIP,贵宾级别的报价,所谓 platinum package。内部需求就把人力、服务器、时间、排期等成本按最坏的估计全部算出来。
  3. 拿这套方案,给到需求方,一定要让他们很诧异的问出:“why” ,怎么这么麻烦啊!?
  4. 这就是让产品对你的技术问题关心的机会!接下来,开发需要有礼貌,不卑不亢的,有理有据的把你的处境讲出来,要展示你的专业能力和素养。
  5. 接下来需要让对方陷入自我怀疑,内心:“Do I really need all this? 是不是这要求有点过份!?”
  6. 最终结论,还是要做,换更经济的方式去做,要么不做。如果这件事是能挣钱的,那么的确投入人力物力时间去征服麻烦啊。

文章也讨论了,话也说回来,一个粗糙的结果,和没有结果,哪个更讨人厌?实际上是粗糙的结果。就好比故事里的水管工,你下水道漏了,又舍不得大修,就缝缝补补。结果过一段时间又漏了。这还不如不修。烦呐!

所以一般的经验是,要么不做,要么就把一个事彻底解决最好。不要交付半吊子工程!

当然,这个时候要思路灵活。水管坏了不一定要在原地修补啊,说不定换一个管线完全绕过以前的大坑呢?

所以就回到了这篇blog的主题:tradeoff

以前我不知道如何准确翻译这个词,一直把叫“妥协”。但是这似乎有点贬义。或许叫 折衷,取舍 更好?。

我觉得装逼的翻译是 —— 中庸。

成年人的世界哪有那么多“既要……又要”,乃至“……还要”。

以前上学的时候,就喜欢“中庸”,60分及格万岁,一个知识点了解个大概就行,平庸,和稀泥,不表态,无原则,优柔寡断。结果贻害无穷。一只吃亏到而立之年,发现中了孔老二的圈套。

对中庸最大的误会是它丫的压根就不应该是一个“方法论”,而是一个“对结果的欣然承认”态度;

作为方法论,我的心得是,才接触一个事,就要走极端。抓东西就从一个“抓手”入手,如果恰好能抓住“主要”矛盾那就最好不过,而且最好只抓一个。抓住,抓稳了之后,再去了解事物的全貌和corner case,这个时候事半功倍势如破竹。

就好比,以前打 CS 1.5,突然转角处出现两个敌人,你慌乱之中,既不向A也不朝B开枪,而是瞄准他俩的中间空隙biu~biu~biu~。然后就躺了。这种遭遇战就应该训练自己的下意思,必须集中火力,断其一指。

做事也一样,认准一个方向,全力推到超出它极限为止;然后再停下来,考虑有没有更好的方案,做到周全;其次考虑对方接受程度,该省省能砍砍;最后一看,嘿,也就一般般。

好吧。其实我也不懂中庸,也不想懂,更不想revision中庸,就是纯粹想附会,如果是个误会也无所谓。就这样吧。

Posted

stdin

Install mosh for macOS arm64 with Miniconda3

I always hate compiling and building. It's an error-prone path filled with riddles and unknowns.

mosh is a great tool replacing ssh in many cases, sadly it does not provide an arm64 binary download or installer for M1/M2/M3 MacBooks. Moreover I dont like XCode and protected /usr/bin shit so I prefer isolated envs like miniconda3.

Anyway, for such a detour, following the official mobile-shell build wiki, type these commands:

conda install autoconf automake libprotobuf pkg-config tmux
# use libncursesw 6.5 since  6.4 is buggy, rpath and dyld not load LC_RPATH shit
conda install conda-forge::ncurses
git clone --depth=1 https://github.com/mobile-shell/mosh.git`
cd mosh

./autogen.sh
./configure --prefix $CONDA_PREFIX
make check
make
make install

And it's done. All thanks to authors for open source project and butter-smooth build scripts.

Posted

stdout

javascript 节拍器

娃学琴,节奏感糊成一坨了。老师让抖腿打节拍,显然不work。码农特有的穷B气质让我舍不得买个实体的;去找个节拍器app,结果各大市场都是各种广告,怕给娃用不正经;甚至找了很多公众号版的,小程序版的,网页版的,普遍都是各种跳转诱导点击。

失望之余,想起来上次JS播放DTMF对 WebAudio 有点感觉,要不这次自己干脆再手搓一个。调研了一圈发现这玩意没那么容易,主要就是javascript在浏览器里 setInterval 是有时间抖动(jitter)的,不能保证节奏精确。如何才能做到精准采样打节拍呢?连续精心编排 AudioContext 时间轴!

搜了一圈发现一位叫 Grant James 已经写好放在 github 了。那还等什么直接拿来~~针对性的改进了:

  1. 无广告
  2. 去掉 .js .css 依赖,单文件更快
  3. 精简不必要的代码结构,方便以后魔改

改完之后发现两三个坑也跟着一起修补了:

  1. wakeLock 防止手机上使用息屏
  2. 突破固定的4拍子,加上可以增减的节拍控制
  3. 增减按钮禁止调到小于 0

最后成果就放在 https://lab.est.im/metronome/ 这里了。有需要的拿去用。协议 CC BY-NC 4.0

20240929更新:

  1. 支持了长按按钮一直增加减少bpm
  2. 禁止长按出现菜单
  3. 禁止双击缩放

Posted

stdout

Edge找回丢失的右上角Copilot侧边栏图标

右上角图标和侧边栏的官方截图:

如果不小心关掉了,找回办法:

  1. 打开 edge://settings/sidebar/appSettings?hubApp=cd4688a9-e888-48ea-ad81-76193d56b1be
  2. F12 或者 Opt+Cmd+I,找到第一个“Show Copilot”开关,把它改成关闭。
  3. 如果第二步不会搞,输入 document.querySelector('input[aria-label="Show Copilot"]').removeAttribute('disabled') 可破

为什么会有这个问题,因为政策的原因,Microsoft Copilot 不能在简中使用,于是右上角的按钮点一下会消失;但是开发或者集成测试的为了省事儿,就直接给隐藏掉,导致侧边栏无法点开

这串 hubApp 的id如何找到呢?新建一个浏览器profile,这个时候 Copilot 是有图标的。不要去点,去设置里翻 edge://settings/sidebar 就能看到 Copilot 的选项。

Posted

stdout

归属感

偶然看到一张图

The link between imagination and place is no trivial matter. The existential question, 'Where do I belong?' is addressed to the imagination. To inhabit a place physically, but to remain unaware of what it means or how it feels, is a deprivation more profound than deafness at a concert or blindness in an art gallery. Humans in this condition belong no where.
— Eugene Walter, Placeways, 1988

这句话比较难翻译,我尝试一下:

遐想与所在地的关系不可忽视。“我属于这里吗?”这一挑战存在感的问题,往往被归结于遐想。现实中,你住在一个地方,对其渊源、历史、意义等感受一无所知的话,就好比聋子听音乐会、瞎子看美术展。在这种状态的人,无家可归。

总感觉漏掉了点什么,或者想多了?展开一点的说:

  • 北京意义是一块八旗、南方贵族聚居的飞地,普通人的归属感不会超过骆驼祥子
  • 上海的渊源只有从租界开始,如果你的人生跟通商口岸没交集也很难找到归属感
  • 深圳的历史比大部分居民寿命短

Posted

stdin

创始人模式

外网的油爆爆,看了下,pg的文章,应该是受这个视频的启发

https://youtu.be/ia6Di_ytiSE?t=2792

Brian 说世界上每 $1500 交易中,就有 $1 是给了 airbnb,挺新鲜。他接着用了个”爬山“喻。创业就好比爬山,创始人好不容易爬上一个山头,这个时候你找一个职业经理人空降到团队,他有能力带领大家去攀登下一个山峰吗?

Brian 说得很有道理。很多人能进大企业,迅速掌握组织架构里的生存技巧,但是出来从 0 建立一套东西不是人人都会的。因为创业的本质就是打破陈见,敲碎现状,更需要说服拿工资老保们跟着一起去打破。

Brian 又说,创始人有三点无可替代:

  1. 是生理父母(不是抚养父母)。你亲自生出来的娃,就是你自己。这种母爱和对外部事物的喜欢有根本的不同
  2. 有permission。有些事跟外边小朋友不会讲,但是给自己娃会说。Brian比喻说如果有必要,他可以给公司改名字。职业经理人敢吗?
  3. 创始人既然创建了一件事,也能重建它。职业经理人能打理清楚,避免出岔子就不错了。Brian 又用了个精彩的比喻,只有创始人才知道公司的冰点和沸腾点。他随手拿起个杯子,说只有创始人才知道这杯子设计之初是啥样,这杯子怎么来的,比如铝合金从哪家订的。这不仅仅是管理问题,而是掌握如何建造的过程。

Brian 又说 创始人有2点不足:

  1. 不清楚如何把生意 scale 到大公司级别的管理
  2. 创始人精力和生命有限。如何接班?

Brian 又读了下他给 AirBNB 发的全员信。有句话很俏皮:

You must design the culture you want, otherwise, it'll be designed for you, you might not like what emerges

然后就开始喷 HR 部门。。。哈哈。那什么是culture呢?他说

Your culture is the shared way to do things (and often they're) based on the lessons you've learned ..... Your culture is the behaviour of the leaders that get mimicked all the way down every single person... The way a leader designes the culture is not by writing out list of values, it's by basically leading by example every single day.

culture 就是做事风格,随时表率,迭代更新的。


由于视频太长了我没继续看了。反过来我觉得 pg 看重的点,和 Brian 访谈里的不太一样。可能是我找错视频了?

pg 文章里核心的点是,manager 做事有一条潜规则:严禁越级报告。这个规则又导致,CXO们都是职场向上管理的老油条。

大厂出来的manager都喜欢把组织架构的子节点当成“黑箱”,然后只用跟直属同事(direct reports)做IO就能遥控功能。

pg 指出:

Whatever founder mode consists of, it's pretty clear that it's going to break the principle that the CEO should engage with the company only via his or her direct reports. "Skip-level" meetings will become the norm instead of a practice so unusual that there's a name for it. And once you abandon that constraint there are a huge number of permutations to choose from.

这个创始人模式,目前是什么大家都不清楚,但是无论如何,很明显核心就是要打破层级,做跨级(skip-level)沟通。但是创始人不可能在2000员工里的公司里也像20个人团队一样直接沟通,所以还是需要一定程度的托管。至于托管自治的边界在哪里,pg也不知道。他只说了看具体行业具体赛道具体阶段有不同。你越级管理过渡,还可能变成运输大队长那种“微操战神”。


founder vs manager 这个说法,我感觉可能太笼统了。这个模式可以进一步抽象为:无限兜底 vs 完成指定 的模式区别。

founder 知道哪些事能做,哪些不能做;manager 只能在划定好的职权内做事;

founder 做事是黑名单模式,除了某些选项排除掉,别的所有已知的未知的都得去对付,能动用全公司资源。manager则是白名单模式,一亩三分地,只管把业绩指标操完了事。甚至给下任挖坑。往往留下一下很 toxic 的实践,实践久了就成了习惯最后成了习俗。

这两种模式,归根结底在于,如何定义“事”,有些事和业务,跳出自身角色局限性,其实压根不存在,甚至可以更低成本解决。我个人体会,遇到的某些麻烦,隔壁部门明明稍微改进一下就能解决,但是这个因为不算对方绩效,就推不动,不上心。所以就得花额外高昂的成本。大企业病的所有问题都来源于部门和指责切分,业务是垂直的,但是技术和赋能最高效往往是水平的。

Posted

stdin

php是最好的……serverless

php是不是最好的语言先不说,但是如果从 serverless 的角度看php:

  1. 语法简单,功能丰富,10分钟就能学会
  2. 通过 FTP 之类的标准工具部署,而不是脑残的命令行
  3. 不用管理麻烦的服务器。基于非常成熟的 php-fpm 去做 scaling。也有大量巨型网站验证过这一方案
  4. 虽然不是 docker,但是 vhost 够用了。而且要容器化 vhost 也很容易
  5. 让人梦寐以求的“热更新”技术
  6. 超级便宜的月租。(还记得 dreamhost 吗?)
  7. 不会吊死在一颗树(vendor lock-in)上。全球遍地的厂商都支持

你就说好不好吧。同时评论在 Hacker News

Posted

stdout

2024年玩xml真是笑死了(xsl)

昨天大早上的6点就醒了,翻来覆去睡不着,就开始胡思乱想。忘记是什么缘起了,反正突然想到一个问题,博客这种静态站,又要输出html,又要输出rss。太冗余了。要不直接把内容存在RSS里。然后用js去fetch()。。。。

等等,死去的记忆突然攻击我。RSS不就是XML,XML似乎有个加皮肤的技术。于是就更睡不着了,起床一查,原来是 XSLT 转换成 HTML 然后就可以自由发挥了。

可行性没问题,准备找个前人的例子开抄。比如 2021年Nathan Clark的Styling an RSS Feed With XSLT2023年Darek Kay的Style your RSS feed

思路就很匹配,执行效果也不错。我想百尺竿头更进一步,把 XSL 给 inline 到 RSS 里,避免额外的加载,节省一次网络请求。吗,没想到这下麻烦大了,折腾到现在才有个初步结果。直接贴源码:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="#stylesheet"?>

<some_xml_root xmlns:shit="http://xxx">

<xsl:stylesheet xml:id="stylesheet" version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" doctype-system="about:legacy-compat" version="5.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
  <html>
    ...
  </html>

</xsl:template>
</xsl:stylesheet>

</some_xml_root>

这里的 href="#stylesheet" 方法,是官方推荐的 。但是要起效果,一定注意 type="text/xsl" 别抄成网上的 application/xslt+xml

主要浪费时间的坑点主要在根的 xmlns 上。这玩意把 xpath 给搞挂了。比如 sitemap你写

<xsl:for-each select="/urlset/url">

好好的,加上 xmlns 就得写成:

<xsl:for-each select="/*[local-name() = 'urlset']/*[local-name() = 'url']">

怪不得现在没人玩XML了。这破玩意没法直观的本地调试,还得靠各种第三方 validator,反人类啊。

于是把根的 xmlns 直接改成 tag namespace。也就是 xmlns:shit 。反正你namespace冲突了关我什么事?而且说实话,xmlns这玩意除了坑各种解析器不好写之外,并没有什么卵用。我以前写都是想办法去掉 xmlns 再解析。感觉这一块真的 over-engineering 了。 好像有点明白 namespace 是干嘛的了。这玩意主要解决一个sb需求:允许多个XML合并到一个文件里。这不就得考虑如何分清楚tag谁是谁的。。。。并且标准已经挖好坑了,一个XML有且只有一个root。。你把别的 tag 合并进来,那的确不容易区分。还有这样写不会造成文件体积膨胀吗?真是xsl笑死了。

接下来的问题就是如何生成一个规规矩矩的 html5 doctype。搜了下 doctype-system就可以了。本来其实可以在<xsl:template>后面加上

<xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>

但实际只加这个是不行的。

另外吐槽下 Chrome,默认的viewer把xml渲染成html了,在 devtool 里通过 $x() 无法直接调试xpath,还得靠别的第三方工具。(⊙﹏⊙)

这可能就是XSL的核心问题了——没法方便直观的调试,挂了就给你白屏。有点react那种白屏的 ptsd 感觉了。

Posted

stdout

大清卷王 和 骑士

看到个推:

蕨代霜蛟 @ferntrino 10:41 AM · Aug 13, 2024
杭州抗议骑手事件本身就不参与讨论了,难受的是自己的。但有一个细节真的非常黑色素幽默,那就是名单列表顶上的字段。系统命名时还真随手就把骑手的ID命名为Knight ID。
卧槽,Knight这么有历史感的单词竟然落魄卑贱到了这个地步。

Knight这单词让我想起一个往事:

先说一个公共假日:五一。之所以每年放假,这是因为国际劳动节

可能很少有人知道,这个洋节是该死的美国人发明的。具体来说是 1886年5月4号发生在北美 伊利诺伊州 芝加哥市 的 Haymarket Square;具体细节就不说了,打工人闹事,和暴力机关打了一架,死了人。更多的地方接着闹不消停。

被后来这事被称为 Haymarket affair 草市事件 ;重点来了,草市事件的组织者,发起者,名字全称 Noble and Holy Order of the Knights of Labor 高贵与神圣的劳工骑士团。简称 Knights of Labor (K of L),缩写KOL

看来骑士这名字,而且和劳动人民颇有渊源嘛。

而且KOL这缩写冲突了,哈哈哈。。。不过劳动人民应改理直气壮的当意见领袖,没毛病。

图:劳工骑士团 总瓢把子 大工长 Terence Powderly, Grand Master Workman of the Knights of Labor

无聊翻资料,发现一些有趣的细节

1886年5月1日这场运动是KOL在1884年筹备的,主要诉求是8小时工作制。注意国内很多厂家把中午吃饭小休的时间排除在8小时之外,这里显然扯蛋。当年8小时工作的完整表述是:8小时打工,8小时睡眠,其余8小时归自己管! 当年罢工这首颂歌 Eight Hour 就是这么唱的:

Eight Hours for work. Eight hours for rest. Eight hours for what we will

可以看下B站的搬运 【中英字幕】八小时之歌 Eight hours

草市事件是1877年以来 Great Upheaval (也称 Great Railroad Strike of 1877)系列罢工运动的高潮。

早年间的KOL骑士团,强调不分宗教、种族、性别互帮互助,主要成员是低技能体力劳动者、铁路工人、移民、和钢铁工人。但是排斥五类人: bankers, land speculators, lawyers, liquor dealers and gamblers 金融、地产、律师、酒精和赌博。因为这些从业者被认为不对社会产生价值。

当年骑士团吸纳了很多天主教/新教爱尔兰人。然后。。。。。。然后骑士团在还跟 chinese 干上了。据说是在北美西岸的Tacoma,这里1/10人口都是Union Pacific Railroad的铁路派遣工——来自东亚大清的卷王们。

大概经过:

在南北战争期间的1862年,美国总统林肯出台了《太平洋铁路法案》,给铁路拨出了大量的土地和财政资金。负责东段的联合太平洋公司是美国政府直接扶持的半国有企业,它所雇佣的劳工里,大部分是爱尔兰移民。在南北战争时期,爱尔兰正好在闹饥荒。当时北方缺少兵员,政府许诺参军的人可以获得金钱和土地,因此一些黑心商人就去爱尔兰忽悠了很多难民,来美国参战,以骗取政府许诺的参军费。爱尔兰人的加入确实进一步增强了北方的实力,但这种让别国难民当自己内战的炮灰的不人道做法,让美国遭到了来自欧洲各国的谴责。于是到后来,剩下还没有上战场的爱尔兰人就被改派往西部,到联合太平洋公司里去当筑路工人。这些爱尔兰人逃出了饿殍满地的故土,又避免了成为炮灰,都是感恩戴德,施工很卖力,因此联合太平洋公司这一边的工程进展很顺利。
眼看公司快要倒闭,修建横贯大陆的铁路这项伟大工程也要夭折,加州赶超纽约的梦想也要破灭了,这时,四巨头的另外一位,负责实际建造铁路以及人力资源管理的查尔斯·克罗克(Charles Crocker)向斯坦福提出:雇用来自中国的华裔。在19世纪的50和60年代,有大量的中国人,特别是沿海地区的广东人和福建客家人,来到了加州。他们中有的是前来淘金的,也有的是为了躲避太平天国的战火。这些华人中,大多数在加州扎根成家,到了1863年,加州已经有了大约五万名华人。他们勤劳朴素的特质,也是在加州众人皆知的,克罗克正是看上了这一点,才提议将华人们招进公司,去修筑铁路。

具体可以看《路上的美国史︱太平洋铁路:华工用汗水和鲜血浇灌的奇迹》。这篇文章可以看出阶级主义和民族主义叙事的差别。

骑士团要求罢工,大清卷王们不干,愈演愈烈,最后搞成了种族冲突,结局就是 Rock Springs massacre 石泉屠杀。1882年,骑士团支持了臭名昭著的 Chinese Exclusion Act。骑士团所谓的“不分种族、支持移民”口号都加上了“chinese除外”的标签

1886年5月的草市事件是KOL骑士团最大的成果,也是最后的辉煌,接着就迅速衰败了。被 American Federation of Labor 代替,原因是理念落后,熟练工和无技能功能的诉求差异,被天主教主教谴责导致占比很大的天主教徒离开。

1889年,在巴黎举行的第二国际第一次会议上,法国工会人士 拉维涅 Raymond Lavigne 提议将5月1日定为国际劳工节,以纪念草市事件,同时要求各国的劳工共同努力,为八小时工作制而奋斗。拉维涅的议案激励了美国和欧洲多数国家的劳工在1890年5月1日再次进行罢工。

1904年,第二国际在阿姆斯特丹的会议上号召“各国社会民主党组织和工会联合会都要在每年五月一日坚决要求从法律上规定八小时工作制,拥护无产阶级的阶级要求和拥护世界和平”。大会还责成“各国的无产阶级组织,凡在有条件于五月一日停工而无损于工人利益的地方,应当争取停止工作”

历史就是这么奇妙。。。或许国人在人挤人的五一这几天出游,早已忘记这个节日是怎么来的,诉求是什么,以及大清卷王如何被动在错位时代把劳动关系演变成种族冲突的。。。在如今996问题、失业问题夹杂的社会主义国家里,这种黑色幽默,交错神奇,恍如昨日。

Posted

stdin

两则故事:Intel Minnow,日本高分子化学

英特尔第二财季营收低于预期,第四财季暂停派息,公司将裁员超1.5万人,盘后股价大跌20%,如何解读?

老狼 2021 年度新知答主 雨花、yang元祐 等 946 人赞同了该回答
前大樱桃员工来回答一下个人的观点。Intel是个好公司,对员工的尊重和职业路径的培养,公司上下对技术的推崇,宽松的企业文化,可以说是绝大多数国内外公司所不能比拟的。尽管有很多人因为各种各样的原因离职了,也在各种前员工群里面各种吐槽,但都是小骂大帮忙,主要是哀其不幸,怒其不争,对Intel从心底还是希望它好的。这么个好公司,为什么越来越不行了呢?
Intel逐渐崩盘的开始点在于10nm的难产,从那以后就没有再好过,只有一蟹不如一蟹。病发于工厂(Fab),根子则是美国制造不行了。一个前美国同事告诉我,美国人丢失了“CAN DO”的精神,只能做高端的设计、娱乐、金融这种营生,苦哈哈的制造不愿意干了,逼着干也干不了。
曾经发生的一件事,可以一窥美国制造的窘境。我的团队和美国Peer团队一起合作了几个开源硬件项目,这对Intel非常重要,我们计划建立x86的类似树莓派硬件矩阵,但是更加开放,这个项目就是Minnow计划。Minnow的第二代Minnow Max(基于Baytrail)非常成功,其中一个很大原因,就是我们选取了ADI做硬件供应商,而ADI的产线在深圳,主板质量非常好,避免了一代老化测试没有做,生命周期太短的问题。我们打算趁热打铁,推出Minnow3,选择在当时颇有竞争力的APL CPU,价格看能不能做到100美金左右。
计划开始就不太顺利,硬件设计被美国team抢走了,他们非要选择一个美国小厂来生产。在付出了延迟半年的等待后,硬件工程师终于告诉我们下周就可以回板了,我们都非常兴奋。结果,又等了三个月,才正在拿到几片板子(首批应该拿到十几片),而且根本跑不到GOP驱动那里,感觉是高速总线信号有问题。开会时,美国的PM(韩国人)告诉我们一个惊人的消息,说那个小厂生产了一百片板子,没有一个可用,我们的硬件工程师(一个年轻的老美)被迫自己到产线上用焊枪手搓主板,这几片就是他几周手搓出来的!他的毅力让我佩服(手搓主板仙人?),但还是不能用啊,谁让你换美国小厂的?于是我们每次项目周会都会催他啥时候能给我们可用的主板,过了几周,他从此再也没有在周会上出现。
项目于是又停滞了几个月,我们催PM,PM告诉我们他找不到这个工程师了,就是他的经理也不知道他去哪里了,就差要报警了。就在我以为过一阵就要换个硬件工程师的时候,事情发生了令人瞠目结舌的转折。
各位看管,这里有一个好消息,和一个坏消息,你们想先听哪个?好吧,好消息是硬件工程师找到了,坏消息是硬件工程师将公司告了!说因为我们总是催他进度,导致他患上了严重的抑郁症,有工伤了,现在不能好好工作,一周只能去一天公司。我心里一万个草泥马跑过,我一周和颜悦色的问一下进度(我又不是他领导,也严厉不起来),从来没有投诉他,这都能搞成工伤,是不是温室里的花朵?
关键是他的工伤被认可了。从此,我和PM再也不能问他进行到哪里了,可笑的是,我们既不能把他踢出项目组,也不能换个硬件工程师,这个活还必须是他干,而且还不能另起炉灶,再成立一个项目组。按照律师的说法,必须Inclusive到他。他的经理也不能辞退他,更不能给低绩效,从此有个防弹衣。他的经理从此拖了一个油瓶,在此可怜他一秒。更重要的事,项目周会从之谈风花雪月,到没人记得参加。项目再延期一年后,迎来了它的结局,无疾而终,而我从此告别了开源硬件梦。
这是Intel的问题吗?不,是美国的体制问题,尽管美国还拥有全世界最顶尖的人才,美国制造也永远不可能回到过去的辉煌。Intel现在扛下了美国制造的脸面,必须负重前行,但我们都知道,在路的尽头,只有特朗普的白日梦。
编辑于 2024-08-03 23:15・IP 属地上海

日本企业是否已经整体夕阳西下了?

Osteroza 键盘侠,接盘侠,洗盘侠 1916 人赞同了该回答
我说一个可能化工行业的同仁们知道的趣事。
美国化学家 P J Flory 是高分子化学的大师级人物,他本人获得过1974年的诺贝尔化学奖。
然而,Flory在晚年的许多“成就”其实是大坑,特别是涉及晶体振荡领域,他的一些结论是错误的。
在六十到七十年代,不少日本化学家师从Flory。这些化学家日后成为了日本化学领域的大佬级人物,决定了日本高分子化学领域的研究方向。这些大佬们继承了Flory的研究成果,包括错误的部分。在他们的带领下,直到今天,日本化工界的许多研究,依然是沿着Flory的模型一路狂奔!
而欧美化学界早在90年代就开始批判Flory。在这位老大哥的家乡,美国,他在大分子晶体领域的学说被“全盘反思”,今天的美国化学界没有机构会继续沿着错误的理论搞科研。
然而,这不妨碍日本化学界,物理界和工业界,年复一年的派学者前来美国进修,重复着一位位前辈们的实验,佐证Flory派模型的正确。只要Flory模型是正确的,也就说明当代日本化学高分子界老师们的正确,也就是证明日本化学界自七十年代来所有前辈们的努力是正确的。
这个行为在我这个外行看来,可以有三种解读: 1,美国实验室知道真相但忽悠日本人,反正你自愿交钱来做实验。2,日本人很固执,死不认错。3,如果最终证明日本人是正确的,那么日本人就是逆行的孤勇者。
事情怎么发生变化的呢。在某次物理年会上,美国国家标准局和阿克郎大学发难,派了个年轻的博士后上场,说你们日本人前段时间又来做Flory模型的实验了,据说数据很完美,你们工业界也重复了实验,数据也很完美,是不是?
鉴于你们实验年复一年的数据都很完美,我们很好奇,所以也做了你们的实验,结果发现了不少的问题。现在我就一条条,一步步的列出来,你们的实验每一步都有哪些问题。我们初衷是同行们间的学术交流哇,大家好好讨论一下哦。
讨论结果是,日本人之后再也不来参加这个物理年会了。
我一位高中同学当时在Akron读博,他听说这事儿以后就问了他的美国导师,“我们是不是杀死了日本人的一个行业”。他的导师回答“不,我们是给一具尸体照了次镜子”。
而我另一位在日本留学读博的中学同学说“日本人每次参加学术会议都一大堆人,但通常只有大佬做关键发言,小辈们发言后都要加上点感谢大佬的致辞。米帝让一个三十几岁的小辈直接怼德高望重大佬们,大佬们恐怕心境上也很难接受吧。”
你们觉得日本人被打脸后,默默改正了错误吗?
虽然,但是,如此,然而,日本学界依旧每年派人来美国实验室刷数据,继续论证Flory的模型是正确的! 日本工业界也依旧以flory的模型为基础,孜孜不倦的推进研发工作。
发布于 2024-07-27 01:23・IP 属地英国

不知道是刚编的故事,还是真就这么草台。。。。

Posted

stdin

关于 cn.cyberIdentity.certification 的一些技术信息

搜索该app名字可以得到

https://apps.apple.com/cn/app/_/id1588080869

各大app市场都有隐私政策页,点击可以发现网址是:

https://cdnrefresh.ctdidcii.cn/w1/WHClient_H5/pages/secret.html

甚至有一个 apk 下载页面

https://cdnrefresh.ctdidcii.cn/w1/WHClient_H5/Install/InstallGuide.html

https://cdnrefresh.ctdidcii.cn/w1/version/cyberIdentity-android.apk

whois ctdidcii.cn 可以得到

Registrant: XX部第一研究所
Registrant Contact Email: songjie@anicert.cn

可以发现该公司官网

有限公司(以下简称“ZDAX”)是**部第一研究所下属全资子公司。
**部第一研究所以国家“互联网+”可信身份认证平台(简称“CTID平台”)核心技术为依托,致力于为各级政府部门、互联网运营商、各行业应用提供权威、可信、安全、便捷的身份认证服务,并开展相关业务创新。在**部的直接领导下,**办、国家发改委、科技部等部委的大力支持下,**部第一研究所积极开展居民身份证网上应用研究,组织承建CTID平台,助力新时代社会治理现代化。
2017年10月,**部第一研究所成立ZDAX公司,并授权ZDAX为CTID平台唯一合法的运营服务商,为各行业提供权威、可信、安全、便捷的网络身份认证服务,为我国“互联网+行动战略”提供强有力的支撑保障。

以及平台介绍说明

https://www.anicert.cn/platform.html

● 一次一码,超时失效
● 通过国密算法加密、签名防止数据泄露、篡改和伪造
根据相关行政许可设立的第三方签发、面向系统应用可作为司法采证使用的身份凭证,如电子认证服务提供者、CA机构等第三方签发的电子签名认证证书、eID等;

得出一个结论,这玩意不是eID换皮那么简单。

点开发展历程可以看到

2020.12 《基于可信数字身份的区块链应用服务白皮书》正式发布

上面提到的厦门公司,看上去是专门做 CDIT 运营的,搜了下官网是

https://easyctid.cn/about

其中有一张最重要的架构图

目前不知道这个 PID 是唯一的还是可变的。要实用还是得做类似微信那种 OpenID/UnionID 才行。因为技术对接SDK需要付费签协议才能拿到,细节就无从而知了。

Posted

stdout

Valid HTTP verbs

这里 想到,fetch/xhr 可以发起哪些 http verb 呢?

python -m http.server 随手测试了下,发现连 !$ 这种符号都可以作为 http verb,比如 fetch('/asdf', {method:"$"}) 这样的请求是能发起的。于是去 chromium 搜了下 "is not a valid HTTP method" 相关的解析放在 blink/renderer/platform/network/http_parsers.cc

// See RFC 7230, Section 3.2.6.
bool IsValidHTTPToken(const String& characters) {
  if (characters.empty())
    return false;
  for (unsigned i = 0; i < characters.length(); ++i) {
    UChar c = characters[i];
    if (c > 0x7F || !net::HttpUtil::IsTokenChar(c))
      return false;
  }
  return true;
}

bool HttpUtil::IsTokenChar(char c) {
  return !(c >= 0x7F || c <= 0x20 || c == '(' || c == ')' || c == '<' ||
           c == '>' || c == '@' || c == ',' || c == ';' || c == ':' ||
           c == '\\' || c == '"' || c == '/' || c == '[' || c == ']' ||
           c == '?' || c == '=' || c == '{' || c == '}');
}

原来如此,RFC 7230呀。于是把这些字符打出来:' '.join(chr(x) for x in range(0x20, 0x7f))

! # $ % & ' * + - . 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z | ~

那还搞个屁的 RESTful 啊。直接用特殊符号一把梭。不过各种服务端框架可能不是很容易做兼容。哈哈。

Posted

stdout

Cappy in a Haystack locations

For the mission from the beloved Fallout 4 Nuka-World DLC

coc DLC04KiddieKingdomFunHouse01; player.moveto 06015A94
coc NukaWorldWildWestExt02; player.moveto 06015A8A
coc DLC04BottlingPlant01; player.moveto 060445DF
coc DLC04BottlingPlant01; player.moveto 0604A812
coc DLC04GalacticZoneExt04; player.moveto 06015A8E
coc DLC04GalacticZoneExt04; player.moveto 0604AD3F
coc DLC04GalacticZoneExt08; player.moveto 06015A91
coc DLC04GalacticZoneExt08; player.moveto 0604AD40
coc DLC04KiddieKingdomFunHouse01; player.moveto 0604AD3D
coc DLC04WWMineCart01; player.moveto 06015A8B
coc DLC04WWMineCart01; player.moveto 0604AA39
coc KiddieKingdomExt06; player.moveto 06015A97
coc KiddieKingdomExt06; player.moveto 0604AD3E
coc NukaWorldNukaTownUSA06; player.moveto 0604A814
coc NukaWorldNukaTownUSA06; player.moveto 0604A813
coc NukaWorldWildWestExt02; player.moveto 0604A815
coc SafariAdventure03; player.moveto 06015A9A 
coc SafariAdventure03; player.moveto 0604AA3A
coc SafariAdventure07; player.moveto 06015A9D
coc SafariAdventure07; player.moveto 06015A9D
coc SafariAdventure07; player.moveto 0604AA3B

idk hope it works lol.

Posted

stdout

All Star Core locations in Fallout 4

Arent nobody got time for this shit.

Open FO4Edit, locate 604a053 and find all refs:

0601FAD1
060255A7
060255D2
06025774
060257F1
06026C7B
06026D23
06026D70
060278F7
06027917
0602791A
06027A3C
06027ACC
06027C0D
06027D5E
06027E43
06027E4C
060319E1
060319E2
060327BA
060327C4
060327D0
060327E2
06034EC6
06034F97
06034FD4
0603522E
06037CA7
060380CB
0603816F

And for external star cores, locate 0601F0E5 and 0601F0E6 for more refs:

coc NWJunkyardExt; player.moveto 060319D6;
coc NukaWorldWildWestExt03; player.moveto 06031995;
coc DLC04BottlingPlant01; player.moveto 060319CE;
coc DLC04Nukacade01; player.moveto 060319CF;
coc DLC04GalacticZoneExt07; player.moveto 060319E1;
coc NukaTownMarket01; player.moveto 06054CA8;

Just type player.moveto with the code above and you can grab all star cores, and return to console player.moveto 0601E359, so you get the Quantum X-01 power armor from Nuka-World DLC of Fallout 4.

Also there's coc TestCory01; 06044B4B; for testing purposes.

Posted

stdout

育儿成本的两座大山

仅个人观点

校园里的义务教育

首先,我支持义务教育的普惠性。现代各国的义务教育,也就是K12教育,可以覆盖从5-6岁的幼儿园(K)到高中(12年级)。教育当然是非常有必要的而且最好强制性的,但是一定要关起门来在封闭校园里受教育吗?

这套体系的义务性,源自于普鲁士的士官传统和军营教育。当年这事儿出发点没啥问题,但是到21世纪的大城市里,成为城镇居民育儿最大的负担。经费问题先不说,首先就是接送问题。上学、放学这个时间问题就至少要耗费一个成年劳动力脱产,校车制度和孩子自行出门回家基本看不到可行性。

如果你给孩子辅导过作业就会发现,现在的统编教材是反智、反自学、反人类的。老师每天发的各种填表、通知比学科本身问题还多。城镇的孩子早就高度个性化差异化成长了,学习进度反而非常僵硬死板。成绩差的跟不上,成绩好的无法掌握更高级的知识。整天都是一个流水线作业和非标件不适配的拉扯。

抱着「干不好就别干」的心态,在资讯如此发达的今天,我觉得应该把「义务」,改成 opt-out 模式。也就是对于有条件的家长,只要教育部门能把控最终毕业会考成绩就行,而不是必须按学籍在指定学校坐满9年板凳。的允许民间办学和home-school按照自己的节奏去学习和成长。到了法定年龄,不能通过会考的,做一些处罚或者补救措施。

当然有人会说了,这样搞,会不会乱套?不利于集体生活,不利于团结稳定。这样的问题当然存在,可以小范围试点,按地区不同政策嘛。归根结底这是ruling class需要考虑的事,各位要杠,我只能说京爷您说的对。

“童工”问题

我觉得,孩子要么纯学习,要么纯玩,这种二元生活持续整个童年是有害的。更好的方式是,在劳动中学习,在实践中收获回报和经验。说得好听点,支持“勤工俭学”。说的更通俗点难听点,就是应该允许“童工”。这个话题可能会造成很多人敏感和不适,但是先别急。童工的准确定义,是:

剥削性质的劳动导致孩子无法获得教育,或者精神/身体/社会/道德 上受到侵害。
the exploitation of children through any form of work that interferes with their ability to attend regular school, or is mentally, physically, socially and morally harmful

现在发达地区要找一个体力剥削活儿也不太可能了,重体力活儿,你身子板儿不行,雇主还会嫌弃你。

反而是儿童的心理、社会压力很大。其中一个原因就是青春期那股劲儿没地方释放。所有的回报和赏赐都来自老师或者父母。老师和父母是典型的绝对权威,从原理上来说就是不平等沟通,诉求有不可调和的矛盾。这种人造的依附关系是高高在上、理性铸就然而架空的幻觉,这座精心维护的象牙塔会在孩子毕业那一刻轰然倒塌。孩子真正进入社会会有一种「原来是这么回事」的幻灭感。如果说高考填自愿是几乎茫然的状态去碰运气,那么应届生选择岗位更像一场赌。

这个问题放在长远的人类历史压根就不是问题。自古以来,孩子都是跟着父母叔伯学习生存技能的,一个家庭本质就是一个小产业群体;脱产的学校,这玩意是近现代产物。龙生龙凤生凤,老鼠的儿子会打洞,子承父业这看起来是天经地义的事。现代很多职业分工是非常精细以至于达到变态的程度,孩子要直接上手父母的职业几乎不可能,更多依赖长久的教育和培养。

农村的孩子一般从下地就开始干农活儿,城镇的娃从小接触商业那也是理所应当,甚至是必须的。比如父母开了店,孩子在暑假帮忙照看一下是很常见的。这些显然不算「童工」。基于类似的道理,没开店的家庭,支持自己娃从事一些差事,能获得一点物质回报,经历一些at stake的挣钱、交易、谈判技能肯定比看电视傻笑强。

国内的例子就勤工俭学,国外也有 boy/girl scouts 卖饼干,糖水这样的活动。

可能你觉得这个想法不痛不痒也没啥毛病,那么问题来了:

你是否支持未成年人开通收款码、打赏账号,成为有限责任的自然人/法人?

你可以说,不支持,因为法律不允许。那么接下来的问题是:这样的「保护」立法放在21世纪今天是否依然是必须的?

孩子的自我

可能有人会问,除了获得一点收益,然后呢?之前跟一个朋友聊天,他吐槽说,马斯洛那套 「人最高的追求就是自我实现」 是假的,因为他研究这么多年,发现人其实没有自我。看到这问题,我想了下,回复他,重点不是自我,是实现。

这个姓马的可能功夫不如另一个姓马的。另一个姓马的26岁的时候,向全世界宣布了他的理论:人如果不打工,就会感觉不开心。

以前初中时,政治老师也这样照本宣科,说劳动是人的权利,是每个人的需要。估计现在绝大部分人看到这个理论,都会哈哈大笑:“这个权利谁想要我让给他,我希望有人能把这个权利给我剥夺了,我不想劳动!哈哈哈哈。。。”

这个话题叫「劳动的异化」。对这两位姓马的说法,我有一个最浅显的解释:

人,是闲不下来的。总得找点事来霍霍。

人要实现的不一定是自我,而是实现一个想法。这个想法可能睡一觉第二天就发现很蠢,但依然是昨天「自我」一方面的冲动。所以「自我」是否准确存在,不重要。重要的是你起了这个心思,然后干成了。

不得不说,劳动是人的本质特征,是人的"第一需要"。吃喝繁衍,那只是动物性。人性的体现是在「衣食足」之后,而知荣辱。

人在劳动中,是需要肯定自己的,而不是否定自己。人要通过劳动感到幸福,而不是折磨。是不断发挥自己的聪明才智,而不是受到打击和摧残。

学校高墙里的教育和考试,是不是也越来越异化呢?所以娃在学习之外的劳动,就显得非常有必要,而且长期缺失了。这里的劳动,也就是「做自己想做的事」。需要鼓励娃去尝试一些学科考试成绩之外的挑战,自我实现。如果这些兴趣恰好也能在成年之后从事相关的岗位,养活自己,那不就更好了?

结语

总的来说,未成年人强制去学校,和禁止劳动 这两大因素,加重了家长的负担,对娃也没啥好处。

Posted

stderr

Making subprocess async friendly in Python

It's been a while since i wrote something in English, mostly because there's nothing really interesting, until now.

Occasionally, when facing a long running task in Python, I would choose either a distrubuted tasks queue system, or for the convenience, just the subprocess module. It's built-in and well designed for grabbing outputs of a child process running for a short period of time.

But what if the child-process takes a really, really long time? In my case it's an expensive query, or some CPU/GPU intensive task, which needs to be launched from a running Web framework, like FastAPI.

Popen() fire and forget

if child-process's output, end state and the return code are irrelevant, a simple Popen would do

subprocess.Popen(..., stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

The problem is, after the child-process finishes, it will hang as a zombie, because the parents refused to claim its exit status. To fix this, add an extra parameter in Popen() like subprocess.Popen(..., start_new_session=True)

And write a simple loop periodically check for WNOHANG

while 1: try: chpid, retcode, res = os.wait3(os.WNOHANG) except ChildProcessError: break sleep(5) if chpid == os.getpid(): do_sth() break

This can be done using BackgroundTasks in FastAPI/Starlette.

In a way, the child-process hebaves like nohup or screen/tmux, running in a detatched fashion.

If you hate this many lines of code, just subprocess.run("blah.sh &", shell=True) and wrap your commands in blah.sh

Make .communicate() async

Sometimes I need to monitor and handle the stdout/stderr of a child-process, like forward the outputs as an EventSource response to the browser.

First I tried .communicate() it will block until the process quites.

Then I tried Popen.stdout.read(), it will also block. Eventually I found a great hack from Stackoverlow like this:

p = subprocess.Popen(
    cmd, bufsize=0, text=True, stdin=subprocess.PIPE,
    stderr=subprocess.PIPE,  stdout=subprocess.PIPE, close_fds=True)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)

Now p.stdout.read(1024) would return immediately, or with a TypeError bnecause internal messed up with None as non-blocking empty return.

Wrap it with try...except inside a loop, it worked fine as expected.

When the parent process crashes unexpectedly, the child-process is still working, to detect this, just check for BrokenPipeError carefully in child-process and gracefully shutdown.

Solved with asyncio

I tried harder reading the official Python docs, turns out the most easy solution is already there:

proc = await asyncio.create_subprocess_exec(
    sys.executable, '-c', code,
    stdout=asyncio.subprocess.PIPE)

# Read one line of output.
data = await proc.stdout.readline()
line = data.decode('ascii').rstrip()

# Wait for the subprocess exit.
await proc.wait()
return line

I guess another lesson learned today.

Posted

stdout

人声分离简单评测

娃要去表演唱歌,老师要求提供MTV。。 视频是这个,需要去掉人声部分

先用 ffmpeg 提音轨 ffmpeg -i v.mp4 -ac 1 1.mp3

微信小程序上的全是骗充值的,网上的服务:

  1. 没卵用 https://vocalremover.org/ 名气很大,搜出来第一就这个
  2. 没用 https://www.conversion-tool.com/karaoke/
  3. 卡死 https://www.songpeel.com/song-to-karaoke
  4. 要安装 https://github.com/adefossez/demucs
  5. 要6G显存 https://github.com/Anjok07/ultimatevocalremovergui
  6. 效果很好! https://tunebat.com/Vocal-Remover 推荐

看来人声分离,特别是童声,还是有点难。

最后把得到的 a.mp3 塞回去

ffmpeg -i v.mp4 -i a.mp3 -c:v copy -map 0:v:0 -map 1:a:0 new.mp4

btw 打了这么多网址,该不会被误认为SEO吧。囧。。。。

Posted

stdout

吐槽pynsq,另外给subprocess糊了一个异步

pynsq太烂了

起初是因为需要在 Web API 里消费一个消息队列(nsq),给浏览器返回 EventSource 做实时输出。但是没想到官方库pynsq居然写得这么渣:

def _handle_term_signal(sig_num, frame):
    logging.getLogger(__name__).info(
        'TERM Signal handler called with signal %r', sig_num)
    tornado.ioloop.IOLoop.current().stop()

def run():
    """
    Starts any instantiated :class:`nsq.Reader` or :class:`nsq.Writer`
    """
    signal.signal(signal.SIGTERM, _handle_term_signal)
    signal.signal(signal.SIGINT, _handle_term_signal)
    tornado.ioloop.IOLoop.current().start()

这都什么玩意儿?一个库何德何能也敢去乱劫持 signal?最他妈逗的是这个库的推荐写法:

import nsq
r = nsq.Reader(message_handler=handler,
        lookupd_http_addresses=['http://127.0.0.1:4161'],
        topic='nsq_reader', channel='asdf', lookupd_poll_interval=15)
nsq.run()

这个 r 莫名其妙的就能跑起来了。真是魔法。anyway,在Web API兼容这一坨是失败了,爆了一堆错,对付魔法的办法就是隔离,所以打算糊个脚本,通过多进程+PIPE来得到数据。

给 subprocess 加一个异步补丁

糊的时候发现,subprocess 模块的 .communicate() 方法是 blocking的, 居然不支持 async/await,于是只能继续糊:

import subprocess, fcntl, asyncio
p = subprocess.Popen(
    cmd, bufsize=0, text=True, stdin=subprocess.PIPE,
    stderr=subprocess.PIPE,  stdout=subprocess.PIPE, close_fds=True)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
buf = ''
while p.poll() is None:
    try:
        # read() with O_NONBLOCK might gets None thus TypeError
        buf += (p.stdout.read(1024) or '')
        contents = buf.split('\n')
        if len(contents) < 2:
            raise TypeError('Not enough')
    except TypeError:
        await asyncio.sleep(1)
        yield None
        continue
    buf = contents.pop(-1)
    for x in contents:
        yield x

p.terminate()

这里用 bufcontents 是因为直接调用消息队列,每个消息都是分割好的;但是通过管道来读。得自己去处理字节流如何分割的问题,也就是传说简中特供的「粘包」问题。

另外子进程可能因为Web框架的种种原因,不自觉退出或者变僵尸进程,需要向 stdout/stderr 做输出的时候检查一下 BrokenPipeError 处理后事主动退出即可。

还有子进程如果输出完毕,需要代码里调用一下 p.terminate(),才能回收,避免变zombie

试了一下,也不是不能用,成功!正觉得自己又行了的时候,发现官方:

https://docs.python.org/3.8/library/asyncio-subprocess.html

啊这。白忙活。

超长待机 subprocess

想起来之前还有个问题,一个API调用一个subprocess,然后等它执行,不想管。这个时候可以加一个参数 detach 模式:

subprocess.Popen(..., start_new_session=True)

然后在同进程用里跑一个后台检查循环去检查子进程的 WNOHANG

while 1:
    try:
        chpid, retcode, res = os.wait3(os.WNOHANG)
    except ChildProcessError:
        break
    sleep(5)
    if chpid == os.getpid():
        do_sth()
        break

想了下好像也搞复杂了。要不直接跑一个 sh -c "blah.sh &" 算了。

Posted

stdout

如何删除 C:\Windows\WinSxS 文件

天气热得心慌,看Win10不爽,决定删几个文件玩玩

  1. 首先你需要以 SYSTEM 用户启动 cmd.exe
    Win+R 敲入:
    "\\live.sysinternals.com@SSL\DavWWWRoot\tools\PsExec.exe" -i -s cmd.exe
    回车。确认当前身份敲入 whoami
  2. 夺权:takeown /F "C:\Windows\WinSxS\Backup" /A /R /D Y
  3. 授权:cacls "C:\Windows\WinSxS\Backup" /T /G SYSTEM:F /C
  4. 开删:rd /s /q "C:\Windows\WinSxS\Backup"

爽!

当然,你也可以让系统代替你清理:

Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

很老的磁盘清理工具 cleanmgr.exe 也可以试试,删不要的程序 appwiz.cpl

老黄家的 DXCache 也十分让人不解。这破玩意还存2个地方:

  1. %LOCALAPPDATA%\NVIDIA\
  2. %APPDATA%\NVIDIA

老夫当年给 C: 装了个最慢的SSD,失策。去年(2023)那一波M.2降价潮一直等等结果错过了,拍断大腿追悔莫及。

Posted

stdout