<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Semejen]]></title><description><![CDATA[Daily life & developing journey]]></description><link>https://semejen.com</link><image><url>https://semejen.com/innei.svg</url><title>Semejen</title><link>https://semejen.com</link></image><generator>Shiro (https://github.com/Innei/Shiro)</generator><lastBuildDate>Wed, 15 Apr 2026 19:48:15 GMT</lastBuildDate><atom:link href="https://semejen.com/feed" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Apr 2026 19:48:15 GMT</pubDate><language><![CDATA[zh-CN]]></language><item><title><![CDATA[x-ui acme DNS API 模式下申请 SSL 证书失败处理]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/default/handle-ssl-cert-apply-failure-in-x-ui-acme-dns-api-mode">https://semejen.com/posts/default/handle-ssl-cert-apply-failure-in-x-ui-acme-dns-api-mode</a></blockquote><div><h1 id="">报错</h1><p>SSL 证书过期后，当使用 x-ui 的 <code>一键申请SSL证书</code> &gt; <code>方式2:acme DNS API mode</code> 时，出现如下报错：</p><pre class="language-text lang-text"><code class="language-text lang-text">[DEG] 你的域名设置为:xxx,正在进行域名合法性校验...
[ERR] 域名合法性校验失败,当前环境已有对应域名证书,不可重复申请,当前证书详情:
xxx
</code></pre>
<h1 id="">解决</h1><p>可执行如下命令:</p><pre class="language-shell lang-shell"><code class="language-shell lang-shell">rm -rf ~/.acme.sh 
</code></pre><p>脚本提供的证书申请成功后会保存在 <code>/root/cert</code> 目录下，卸载 x-ui 并不会卸载证书，请勿重复申请。</p><h1 id="">其他</h1><p>免费证书有效期 90 天。</p><h1 id="">参照</h1><p><a href="https://github-wiki-see.page/m/pwwq/x-ui/wiki/常见问题">x-ui 常见问题</a></p></div><p style="text-align:right"><a href="https://semejen.com/posts/default/handle-ssl-cert-apply-failure-in-x-ui-acme-dns-api-mode#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/default/handle-ssl-cert-apply-failure-in-x-ui-acme-dns-api-mode</link><guid isPermaLink="true">https://semejen.com/posts/default/handle-ssl-cert-apply-failure-in-x-ui-acme-dns-api-mode</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sun, 05 Oct 2025 12:25:29 GMT</pubDate></item><item><title><![CDATA[幸运之城: 纽约市赌博的引擎与帝国]]></title><description><![CDATA[<link rel="preload" as="image" href="https://media.newyorker.com/photos/6888dbba882d2bdb12ac232b/master/w_2240,c_limit/r46374.jpg"/><link rel="preload" as="image" href="https://media.newyorker.com/cartoons/6889184ffdcb18f815fc3ddd/master/w_1280,c_limit/a60748_rd.jpg"/><link rel="preload" as="image" href="https://media.newyorker.com/cartoons/68891851f93ce83e355954d6/master/w_1280,c_limit/a27819.jpg"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/newyorker/the-engines-and-empires-of-new-york-city-gambling">https://semejen.com/posts/newyorker/the-engines-and-empires-of-new-york-city-gambling</a></blockquote><div><blockquote><p>当一座新赌场的建设计划正在酝酿之时，通过四个关键人物的经历，可梳理出一段关于争斗与沉沦的往事，其中充斥着个性的碰撞与罪行的纠葛。</p></blockquote>
<p><img src="https://media.newyorker.com/photos/6888dbba882d2bdb12ac232b/master/w_2240,c_limit/r46374.jpg" alt="一名警察正在检查 1943 年突袭曼哈顿一间公寓时缴获的轮盘。Seymour Wally 摄/ NY Daily News 档案 / Getty 图片" height="1625" width="2048"/></p><p>解梦书是对梦境的剖析，每个梦境后都附有数字。一个多世纪以来，解梦书一直是纽约赌博界的圣经。这些神秘的作者——通常是女性，常自称来自加勒比地区——会将梦境与数字配对，而这些数字则被用于参与当地经营的彩票：</p><blockquote><p>棺材——梦见棺材预示你即将结婚……可选数字 9-49-50；坟墓——梦见身处坟墓之间表示婚事临近。可选数字 7-8-31。腹部——梦见自己腹部硕大预示将获得丰厚庞大的遗产。可选数字 10-11-22。</p></blockquote>
<p>解梦书以非理性来合理化非理性。无法控制的梦境被转化为可控的数字组合，这些数字可能成为中奖号码。赌博正是从这种希望与迷信的循环中滋生蔓延。</p><p>赌博有个不变的原则：人们喜欢通过猜测不可预测事件的结果来输钱。我们说服自己相信即将发生的事情——赛马的结果、纸牌的翻转——是可以在发生前被预知的，并且相信自己的预知能力能让我们从那些同样相信自己预知能力的人那里赢钱。当然，赌徒们认为自己不喜欢输钱；赌徒的信念自然是他们不会输，而是会赢。然而这种情况很少发生，以至于纽约历史上最伟大的赌博监管者都因赌债而丧生。</p><p>确实，在关于是否将赌场引入时代广场的公开听证会上反复强调的一个观点是——这场竞争可能很快就会有结果，很可能对内部领跑者凯撒娱乐集团有利——赌场是一种独特的生意。这不仅仅是支付服务费用的问题；其核心是一项旨在榨干你钱财的服务。正如有人在听证会上所言：&quot;不存在剧院匿名戒断会。没有餐厅匿名戒断会！从来不需要保护工薪阶层因观看百老汇演出而损失钱财。&quot;</p><p>尽管从长远来看，赌博终将导致毁灭，但在短期内，它却能带来虚幻的胜利时刻。神秘主义者追求完全活在当下的目标，狂热挥汗的赌徒身上的这种境界是常人难以企及的。纯种马在最后弯道的突然加速、骰子的最后一掷——这些时刻都充满了紧迫与辉煌。赌徒疯狂地猜测未来，却短暂地被赐予了&quot;此刻&quot;的礼物。</p><p>鉴于我们这座城市对&quot;当下&quot;的偏爱，纽约市历来成为全美非法赌博中心也就不足为奇了。正如盖伊·特立斯曾在谈话中指出的：&quot;纽约生活的本质就是一场赌博。这是座你前来寻求幸运的城市——因此也是你来遭遇不幸的地方。&quot;</p><p>随着城市新赌场计划的推进，我们可以追溯过去一个世纪纽约赌博业的四个主要时代。按时间顺序可称为：高额赌注时代、高期望值时代、暗室赌博时代以及大厅赌博时代。每个时代都有其主导者、独特的艺术形式，并且——毕竟这里是纽约——各自交织着不同族裔群体间的联盟与竞争关系。</p><hr/><p>19 世纪纽约的赌博活动虽本质上局限于地方，却颇为兴盛，以如今已被遗忘的法罗牌戏为核心。直到 1910 至 1920 年代，高额赌注才将这种人类普遍冲动与私酿烈酒相结合，将其转变为一项利润丰厚、犯罪性质且日益全国化的产业。</p><p>在这场变革的中心人物是阿诺德·罗斯坦。罗斯斯坦之于赌博，犹如霍迪尼之于魔术——即便对赌博毫无兴趣之人，也多半记得这个传奇名字。赌徒与魔术师之所以能产生如此相似的共鸣，部分源于时代契机：二者皆是二十年代的标志性人物，那正是地方传奇晋升为全国名流的时代黎明。罗斯斯坦的形象亦通过菲茨杰拉德《了不起的盖茨比》中的迈耶·沃尔夫山姆得以永存——尽管这个英伦风着装爱好者佩戴人牙袖扣的设定，与人物原型显得格格不入。</p><p>罗斯坦在禁酒令颁布前很久就已是个大人物。他后来被神化为&quot;被环境所迫走上犯罪道路的智者&quot;，这更多是好莱坞的杜撰而非历史事实。实际上，罗斯坦是个卑劣之徒，始终与信奉正统犹太教的父亲亚伯拉罕和正直的兄长哈里格格不入。他完美契合逾越节哈加达中&quot;邪恶之子&quot;的形象：蔑视家族传统，漠视宗教戒律，不仅娶了异教徒女子，更招摇地在外包养情妇。他在城中各处安置了齐格菲歌舞团的女友，但这些女子就像他的赛马或英式西装一样，不过是他这种地位男人的战利品与配饰。其妻卡罗琳回忆，即便在他拥有包括西七十二街费尔菲尔德酒店在内的多家产业后，他仍会深夜外出追讨最微小的债务。照片中的他竭力展现亲和力，但令人印象深刻的却是古怪的龇牙表情：几乎看不见的上唇紧抿着一排尖利的假牙。每张肖像中的他看起来都更像掠食者而非拉比。</p><p>尼克·皮莱吉——一位长期记录纽约黑帮历史的作家——称罗斯坦为“有组织犯罪史上的关键人物，既是迈耶·兰斯基也是幸运卢西亚诺的教父，是他教导了那些未经世故的意大利人。”理解罗斯坦的一种方式，是把他看作这座城市不断演变的种族接班战争中的一名玩家。他起初讨好——然后操纵——坦慕尼协会日渐衰落的爱尔兰老板们，这些人通过政客、警察和神职人员的复杂勾结统治着纽约。蒂姆·沙利文，曾是这座城市的主导老板，先是罗斯坦的庇护人，后来成了他的依附者，最终还向他借钱偿还赌债。</p><p>但罗斯坦的真正重要性在于其他方面。正如霍迪尼明白他真正的观众不在剧院而在全国媒体中，罗斯坦意识到纽约的赌博业可以扩大规模。他成为了“转注”的大师。从一开始，庄家的挑战很简单：如果太多钱押在热门上，庄家可能面临破产。解决方案是通过“调整赔率”来平衡投注，以鼓励对劣势方的下注。如果这仍然无效，热门仍然被过度押注，庄家会将多余的赌注“转注”给另一个庄家，本质上自己押注热门，以对冲风险。</p><p>自 1910 年代起并持续到 1920 年代，随着收购长岛一系列赌场，罗斯坦成为首位实现区域化乃至全国化&quot;风险对冲&quot;的赌场主。他洞悉了核心真相：所有人终将输光，因此真正的艺术不在于押中赢家，而在于拥有足够资金借给那些自以为能赢的人。他最著名的两个绰号——&quot;大脑&quot;与&quot;金库&quot;——实为一体两面，因为雄厚资金恰是智慧的证明。这笔资金还让他能通过调整不同庄家的赔率，捕捉微小的套利机会，从他人永不枯竭的幻想之潮中榨取利润。</p><p><img src="https://media.newyorker.com/cartoons/6889184ffdcb18f815fc3ddd/master/w_1280,c_limit/a60748_rd.jpg" alt="“好吧，这只蝉决定留下来了。” Cartoon by Victoria Roberts"/></p><p>随着罗斯坦业务的扩张，独立庄家成为其网络中的节点。他为&quot;有组织犯罪&quot;赋予了真正的组织性。下一代黑帮分子——那些将纽约划分为家族势力、将全国划分为单一委员会管辖区域的枭雄——继承了他这套赔率转移体系的规模与全国性基础设施。</p><p>然而罗斯坦的传奇得以流传，主要源于两个备受争议的谜团：1919 年世界大赛的造假案，以及 1928 年 11 月 6 日他被谋杀的事件。这两件事引发的文学创作远远超出了事件本身的卑劣程度，或许是因为每个谜团都蕴含着某种道德张力：它们证明了即使无懈可击者也可能垮台，任何事都能被操纵，任何人都可能丧命。</p><p>正如菲茨杰拉德笔下的沃尔夫舍姆以及多数早期历史记载所言，罗思坦是否操纵了世界大赛？律师威廉·兰姆近期严谨的学术研究指出，幕后主使其实是球员自身而非赌徒。备受看好的芝加哥白袜队当时因阶级分化——受过良好教育的常春藤盟校型球员瞧不起乔·杰克逊、奇克·甘迪尔这类文化程度较低的粗犷队友，而最终策划假球案的正是后者。如今看来，当时很可能存在两套独立的假球方案，而方案之间的混乱阴差阳错地揭发了整起事件。无论真相如何，罗思坦因世人<em>认为</em>他操纵比赛而获利颇丰。</p><p>他生命中的第二大谜团是其终结的方式，正如犯罪小说家尼克·托什斯所描述的“暗夜中不知从何而来的子弹，无声的石头与悲剧”。罗斯坦在一场由爱尔兰政治掮客兼赌徒乔治（汉普）·麦克马纳斯组织的扑克游戏中输掉了一大笔钱——按当时的标准堪称巨款。麦克马纳斯的兄弟恰巧一个是神父，一个是警察。11 月 4 日晚，在林迪餐厅与报人兼短篇小说作家达蒙·鲁尼恩进行了长达一小时的紧张交谈后，罗斯坦接到来自公园中央酒店的电话。他对林迪餐厅的夜间收银员阿贝·谢尔说：“我要去见麦克马纳斯。”（位于中城第七大道的公园中央酒店多年来诡异般地保持着原貌：后来阿尔伯特·阿纳斯塔西亚被谋杀的那家理发店仍在原地——当然，现在已成了星巴克。）一小时后，他被发现倒在公园中央酒店的员工入口处，腹股沟中弹，血流如注。</p><p>发生了什么？最可能的情况是，麦克马纳斯的枪意外走火——要么是在他威胁罗斯坦时，要么是他自己感到受威胁而拔枪。一位曾认识罗斯坦的记者在 1929 年的记述中提到，罗斯坦习惯将右手插在外套口袋里，手指指向口袋内，这一举动可能加剧了现场的恐慌。只开了一枪，枪被匆忙扔出窗外，落在一辆经过的出租车顶上——这些细节似乎排除了任何精心策划的阴谋。</p><p>真正的谜团在于，为何罗斯坦这位老练的职业赌徒会如此确信自己遭遇了骗局——这种怀疑连他的朋友都难以采信——并且愤怒到不愿像职业赌徒该做的那样耸耸肩妥协。然而最近，魔术师艾伦·佐拉·克罗内泽克在一本关于扑克骗局的冷门著作中，描述了可能发生的真相：一种名为&quot;街区撒网&quot;的诡计，即将密封的记号牌预先投放至潜在零售点。目标人物自以为聪明地购入并将牌带入牌局，在浑然不觉中落入圈套。在中西部小镇，整条街的商铺都可能被&quot;撒网&quot;；而在纽约，仅需一条街——或如本案中，一家酒店礼品店——便已足够。这一说法在魔术师约翰·斯卡恩上世纪五十年代私人印刷的笔记中得到了佐证。最终，罗斯坦这位织网大师，竟被一群技艺远逊于他的蜘蛛编织出的、比他自己更为精巧的罗网所捕获。</p><p>他最后的时光虽笼罩在阴影之中，却因与鲁尼恩的那场对话而染上了喜剧色彩——鲁尼恩将罗斯坦的最后一夜改编成了一段生动的奇谈，在经久不衰的故事《大脑回家》中，将这个阴险野心的人物塑造成了一个迷人的鲁尼恩式角色&quot;大脑&quot;，该故事后来被改编成广播剧。纽约有一种独特的倾向——这种倾向一直延续到特朗普时代——将喜剧与腐败如此紧密地交织在一起，以至于一方掩盖了另一方。一旦鲁尼恩的故事流传开来，人们就很难不将罗斯坦视为和蔼可亲的&quot;大脑&quot;，尽管他还在从事可卡因和海洛因贩运的副业。如今，在传记中，他常被草率地与鲁尼恩《红男绿女》中的内森·底特律相提并论，尽管实际上内森这个汗流浃背、小打小闹的骗子，一个有着舞女未婚妻的可爱失败者，与罗斯坦毫无相似之处。这种漫画式形象与犯罪的碰撞至今仍是纽约生活和丑闻的组成部分。</p><hr/><p>罗斯坦网络的崛起标志着纽约黑社会的一个转折点，根深蒂固的爱尔兰帮派头目与崛起的犹太和意大利辛迪加发生冲突。接下来的篇章中，哈林区新兴自信的黑人赌博机构与罗斯坦的市中心体系对抗。二十世纪二三十年代的彩票赌博，在哈林区几乎成了一种狂热——甚至替代宗教的存在。总的来说，这些赌博游戏是诚实的，有时能带来改变人生的结果：例如，科林 · 鲍威尔的父亲就用赢来的钱在皇后区买了家庭住宅。</p><p>在很长一段历史时期，彩票赌博不仅由地方控制，而且通常由黑人女性经营。政策赌博——彩票赌博的前身——涉及在旋转的鼓中抽取中奖号码，通常是在健身房或教堂地下室进行。而真正的彩票赌博则使用公开来源（如报纸）发布的三位数号码，这使得操作相对规范。历史学家拉肖恩·哈里斯（《性工作者、灵媒与彩票赌博经营者》一书的作者）指出：&quot;基本上，政策赌博流行于芝加哥，而彩票赌博则是纽约的特色。&quot;到 1930 年 12 月，彩票赌博庄家开始使用赛马彩池的投注总额——即某匹特定赛马的总投注额——来确定当天的中奖号码。那个时代的一个讽刺之处在于，一种赌博的中奖号码曾一度诚实地由另一种赌博的结果产生。</p><p>哈林区的数字赌博引发了焦虑的辩论——它夹在黑人&quot;体面&quot;政治的要求与普通美国式贪婪的诱惑之间。许多哈林牧师谴责这种非法勾当；另一些则心安理得地参与其中，就像市中心的天主教神父们对待宾果之夜一样。正如哈里斯所解释的：&quot;有些教堂能吸引人来，是因为牧师以提供幸运数字而闻名。如果你信教却仍玩彩票赌博，你可以去教堂获取一个宗教数字——比如马太福音 5 章或约翰福音 8 章。&quot;</p><p>在黑人教会之外，整个产业如雨后春笋般涌现——充斥着东方化的、通常带有模糊穆斯林背景的咕噜和法基尔，他们摆脱了教会的束缚，得以完全沉浸于神秘主义。这个世界催生了梦书出版的伟大时代，这是黑人创业出版史上非凡的一章。梦书提供预言、诗歌和人生目标——堪称彩票赌博游戏的世俗圣经。</p><p>正是在这个世界里，诈骗犯斯蒂芬妮·圣克莱尔于二十世纪二十年代初崭露头角，成为全市闻名的&quot;彩票女王&quot;。尽管她始终坚持自己的法国国籍，但她似乎是从瓜德罗普经由魁北克来到纽约的。她深谙引人注目的价值——居住在糖山最时尚的建筑之一埃奇库姆大道 409 号，经常身着皮草佩戴珍珠出现在摄影镜头中。</p><p>她究竟如何经营赌簿并保护其免受竞争对手侵害，至今仍是个谜。但到了二十世纪三十年代，她已拥有四五十名收注员和十名财务主管，外加保镖和女仆。作为哈林区最时尚女性的声誉堪称传奇；她的邻居、剧作家凯瑟琳·巴特勒·琼斯回忆说，圣克莱尔常穿着异域风情的长裙和色彩鲜艳的头巾，&quot;轻快地穿过&quot;公寓大堂。1930 年，圣克莱尔甚至以惊人胆量指控纽约警察局腐败行为，其证词导致十三名警官被停职。</p><p>倒霉的数字！1931 年 11 月一个决定命运的日子——就在罗斯坦遇害三年后，哈林区仍称之为&quot;黑色星期三&quot;——一大群松散联合的赌徒不约而同押注同一个数字：527。这个选择既代表即将到来的感恩节日期（11 月 25 日），又暗合该日期的数字之和（2+5）。灾难性的是，次日赛马会官方开出的中奖号码正是 527。圣克莱尔和其他哈林彩票庄家由于无法分散投注风险，顷刻间陷入破产——这个可能性早已被市中心罗斯坦的犹太与意大利人网络预料到。哈林的庄家们根本没有足够的资金池来承受这记重击。</p><p>于是，罗思坦的门徒之一达奇 · 舒尔茨——凭借着 “下注分流” 网络而手握大笔现金——开始以足以压垮对方的利率向哈林区的彩票庄家们放贷。圣克莱尔的帝国一夜之间便开始土崩瓦解。坊间传说（这个故事至少已经催生了一部电影）将圣克莱尔塑造成一位勇敢抵抗舒尔茨入侵的孤胆女王：她以一人之力，捍卫着兴旺的黑人产业，对抗白人匪帮的掠夺性攻击。但实际上，击垮她的并非只是一个匪徒的贪婪，而是一整个组织——也就是罗思坦犯罪帝国的继承者们。他们像所有大企业一样，精准地盯上了一家“夫妻店”式的（或者鉴于经营者是她，至少是一家“单亲妈妈店”式的）小本生意。（毫无疑问，舒尔茨对哈莱姆彩票业的这种强取豪夺，正是他的同伙们不久后派人将他枪杀的诸多原因之一。据传，圣克莱尔还往他医院的病床前发了一封电报，上面写着：“种瓜得瓜，种豆得豆。”）</p><p>正是在这几年里，圣克莱尔又一次高调行事，嫁给了哈莱姆区一个狂热教派的领袖——苏菲·阿卜杜勒·哈米德。据说哈米德有极其强烈的反犹情绪，可谓是路易斯·法拉坎的早期版本——报纸甚至称他为“哈林区的希特勒”。当她发现丈夫有外遇时，便上演了一出“弗兰基与约翰尼”（电影《现代爱情故事》）式的戏码，开枪射向他。他活了下来，而她则锒铛入狱。那个第三者原来是一位靠“解梦书”发家的女商人，自称为傅 · 法塔姆。讽刺的是，这位被视为理性冒险典范的哈林 “彩票女王”，竟发现自己和一个靠解梦书故弄玄虚的女人陷入了三角恋，随后她还在报纸上公开谴责法塔姆显而易见的骗术。</p><p>对于那个时代的神秘主义和各种自创的名号，历史学家们往往处理得相当审慎，这不难理解——毕竟，哈莱姆区的居民有权采用伊斯兰化的身份，正如与他们同时代的犹太复国主义者有权为自己取新的希伯来名字一样。尽管如此，这些浮夸的自我包装背后纯粹的无赖本质，以及围绕圣克莱尔最终败落的种种矛盾，都不应被忽视。她经营的生意类似一家私人银行，最终却被一个经典的结构性陷阱所击垮：市中心那些规模更大的黑帮银行实际上对她的业务拒绝贷款，导致她在危机来临时没有储备金可动用，唯一的选择只剩下掠夺性的高利贷。此外，正如罗斯坦因盲目自信于自己的小聪明而败落——骗人者终被骗——圣克莱尔也在她自己架设于神秘主义和物质主义之间的钢丝上失去了平衡。这些伪神秘主义者很快便侵入了她的私生活，将她推向暴力，并最终引向毁灭。至于哈米德和法塔姆，他们后来摇身一变成了佛教徒，开了一家所谓的 “顿悟寺”；而哈米德本人则在一场空难中早早丧命——这就留给自诩拥有透视能力的法塔姆一个难题：去解释为何未能预见这场悲剧。</p><hr/><p>罗斯坦与圣克莱尔代表了围绕纽约赌博业的两大犯罪组织核心——他们各自作为文化象征掌控着赌局。然而，纽约赌博业持续而强劲的心跳并非来自罗斯坦操纵的大型赌局，也非圣克莱尔经营的社区数字彩票，而是那些在公寓和密室里不断上演、数不胜数且未被记录的低调牌局与桥牌聚会。</p><p>例如，杰克·理查森曾是一位极具潜力的剧作家，却在第二大道传奇餐厅伊莱恩的后室里放弃戏剧创作，终日沉迷纸牌游戏。多年牌桌生涯中，他留下——或曰献出——一段浸透愤懑却充满诗意的独白：成书如今几被遗忘，字里行间却依然流光溢彩。</p><p>《赌徒回忆录》（1979 年）或许是纽约赌博世界中最杰出的文学作品。它讲述了一个 1934 年出生、在皇后区长大的男孩的故事，他顺应那个蓬勃向上的时代潮流，先是进入哥伦比亚大学，随后加入驻欧洲的陆军情报部门，并在此过程中养成了英伦风度。从书籍的防尘封面上凝视外界的他，长着一张马脸，身着花呢服装怒目而视——格子图案略显花哨，远远超出了罗斯坦的审美极限。他是那种朋友和情人都会原谅的人——至少直到最后一次背信弃义或最后一笔坏账为止。（理查森的第一任妻子、小说家安妮·罗伊夫在七十年代写了一部关于他们婚姻的令人震惊的影射小说《火炬之歌》，将他描述为具有各种情色异域风情，这在那时可能比现在更令人震惊，但至今仍相当骇人。）</p><p>1960年，理查森的处女剧作《浪子》一经首演，便轰动一时。该剧重述了阿特柔斯家族的传奇，将主角俄瑞斯忒斯塑造成一个类似（塞林格笔下的）佐伊·格拉斯式的人物：能言善辩、风趣幽默且叛逆不羁。他既与父亲阿伽门农的穷兵黩武思想相悖，也与继父埃癸斯托斯虚伪的虔诚格格不入。一时间，理查德森似乎有望成为戏剧界的一位重要人物，他的照片与爱德华·阿尔比和阿瑟·科皮特等名家一同见诸报端。</p><p>但他后期的剧作惨遭滑铁卢，而彼时赌博的狂热早已渗入他的灵魂。尽管在今日的纽约听来或许匪夷所思，他职业生涯中真正的王牌竟是与其名为伊莱恩 · 考夫曼的格林尼治村餐馆老板的友谊。1960年代初，当考夫曼把餐厅搬到上城区，来到当时还属于上东区北部 “无人地带” 的约克维尔时，理查德森成了她餐厅里最早的文学界常客。（正如尼克·皮莱基谈及那个时代时所言：“你无法想象东八十八街当年是何等荒凉。就连喜爱鸡外卖店都不愿跨过第八十六街以北配送。”）理查森是伊莱恩餐厅的宠儿，多年来，伊莱恩一直为他在餐厅里屋每晚的牌局坐镇。这张牌桌吸引了一批不断变化的阵容：导演罗伯特·奥特曼、偶尔光顾的好莱坞明星，以及最常见的牌友——他的作家同行布鲁斯·杰伊·弗里德曼。这可谓是在虚掷光阴中耗费尊严的奢靡。</p><p>小说家、传记作者兼剧集制作人大卫·布莱克——这位曾与理查森共享伊莱恩餐厅鼎盛岁月的伙伴，并给了他创作最后一部戏剧的机会，即受弗里茨·朗《M 就是凶手》启发的《迈阿密风云》中一集令人难忘的剧集——不久前在一家平庸的法式小馆共进午餐时谈起了他。这家餐馆如今坐落于昔日的伊莱恩餐厅旧址。尽管中央公园酒店诡异般地完好保存，但那家传奇作家餐厅已无迹可寻，如今在此服务的员工似乎对这个地方曾经的辉煌一无所知。正如当今纽约司空见惯的景象：实体的湮灭与代际的遗忘交织并存。</p><p>布莱克警惕地环顾四周，仿佛在提防着什么鬼魂魅影——也许是七十年代那些被预付稿酬束缚的小说家们，就像马利的鬼魂被钱袋锁住一般。他回忆起理查森那种高傲不凡、盛气凌人的派头：&quot;他会扬起一边眉毛，然后抬起下巴，那就是杰克，他在 ‘起舞’。&quot;他笑了起来。在伊莱恩餐厅的后厢房里，布莱克与理查森曾分享书籍、高谈阔论，以及——他懊悔地承认道——可卡因。&quot;他的结局终究是悲剧性的，&quot;他补充道，&quot;因为他几乎无所不知，精通你能想到的任何语言，而且他总是在谈论启蒙运动。伏尔泰、卢梭和狄德罗——他会说 &#x27;他们打了世界上最糟糕的赌注。若有上帝，我万劫不复；若无上帝，我直面虚无。&#x27;&quot;</p><p>在他的回忆录中，理查森将自己转向赌博归因于对那片虚无的一瞥，而这一瞥，体现在他接触哥德尔证明的经历中。当时他还是慕尼黑的一名哲学系学生，这位奥地利逻辑学家的论证让他大受震撼——即便是数学也是 “不完备” 的，缺乏稳固的基础，并隐藏着无法被证明的真理。在一个难忘的夏日，他写道：“当我凝视悖论时，我发誓，再也不对任何要紧事进行形式化思考，也无需再为自己是否有权去对这个容不下任何真诚 ‘谓词’ 的宇宙表达愤怒、并从中攫取相对的欢愉而忧心。”在这样一个荒谬的宇宙里，卑劣也就成了崇高。如果人生只是一次毫无意义的掷骰，那么唯一的意义就在于掷骰这一行为本身——尽管对于那些在家等着掷骰赢回来的钱买菜糊口的人而言，这种意义带不来任何慰藉。</p><p>许多人读过哥德尔之后，都因认识到确定性的局限而变得谦卑——但他们并没有像理查森那样，得出合乎逻辑的下一步就是终日打牌和狎妓的结论。（理查森是他那个时代的人，他并没有称她们为性工作者。）然而，他的回忆录——一部深受威廉·哈兹里特或托马斯·德·昆西精神影响、且堪与他们并驾齐驱的作品——探究了他如何一步步沉沦，陷入强迫行为之中。他的放浪形骸在剥离了光鲜之后，反而产生了一种别样的魅力：那是纯粹沉溺的魅力，是永不说“不”的诱惑。他辗转于纽约、拉斯维加斯、香港和澳门，一边试图取胜，一边又试图对输赢毫不在意，并与素不相识的女人们做爱。</p><p>在澳门，理查森声称他遇见了魔鬼——而据布莱克所言，无论这一幕有多大程度是可卡因催生的幻觉，理查森都对此深信不疑。在理查森的叙述中，魔鬼说，他和上帝一样都已经死了，而那种古老的、波德莱尔式的、通过机运寻求罪中狂喜的追求，如今也像神秘主义者追寻神之狂喜一样，注定要失败。魔鬼解释道：“那些兴奋、精力、喜悦、绝望、狂热和忧郁——简而言之，赌博带给你的那种生命高烧般的状态，或许曾是我的领地，但我向你保证，现在不再是了。我现在没兴趣去掂量那些灵魂能让地狱本身升温的人，因为我早就发现，绊倒一个凯撒或一个傻瓜，结果都毫无分别……你如此迫切地想要相信点什么，以至于你甚至愿意相信我。”</p><p><img src="https://media.newyorker.com/cartoons/68891851f93ce83e355954d6/master/w_1280,c_limit/a27819.jpg" alt="Cartoon by Roland High"/></p><p>当魔鬼本人对着你的私人深渊打哈欠，疲惫地耸耸肩拒绝购买你的灵魂时，你还能做什么呢？在书里，是为故事画上句号；在生活中，是回到伊莱恩餐厅继续打更多的扑克。&quot;如果灵魂找不到真正的行动，就只能以躁动为伴，&quot;理查森的回忆录如此结尾。在那个可卡因泛滥的时代，他是位杰出的表演者——阿诺德 · 罗斯坦暗地里贩毒生意的阴影如同长尾，最终反过来纠缠他表面上的赌博事业。</p><p>布莱克回忆道，在自己戒除毒瘾后，最终说服理查森也这样做。&quot;这是我做过最糟糕的事，&quot;布莱克反思道，“一具依赖可卡因的身体，在失去它之后是活不久的。”理查森在戒毒清醒后不久便心脏病发作，接着，心灰意冷的他又在从医院返回的出租车上再次发病，并于 2012 年离世。故地难觅故人影，但《浪子》值得重演，他的书值得重温。</p><hr/><p>理查德森的牌局或许是这座城市中最后一批保留着隐秘精致气息的场所之一。到了九十年代，曾经私密的堕落逐渐演变为公众奇观。原本冷门的德州扑克变种因扑克玩家（兼大屠杀幸存者）亨利·奥伦斯坦发明的&quot;底牌摄像头&quot;而风靡——这项技术让电视观众能窥见玩家的隐藏手牌。莫莉·布鲁姆犹如空降般闯入这个新兴领域，最终在曼哈顿经营起高额赌局——这段经历后来被记载于她的回忆录《莫莉的赌局》以及由艾伦·索金据此改编的同名电影中。</p><p>布鲁姆于 2009 年来到纽约，此前她在洛杉矶经营了一场明星云集的扑克牌局。这场牌局最初是她为一位可疑的老板管理，后来她接管了控制权，最终却一败涂地。在科罗拉多长大的她曾是一名奥林匹克滑雪运动员，拥有健康的成长背景。她发现纽约的扑克圈是“亿万富翁男孩俱乐部”型人物、华尔街巨头和老派赌徒的天下，仅入场费就可能高达 25 万美元。</p><p>布鲁姆在广场酒店包下一系列套房后，如同当年的罗斯坦和圣克莱尔一般，着手为赌博披上华丽的光环。她召集了一群年轻女性精心打造梦幻场景——让那些在租用酒店房间里彻夜打牌的金融精英们，恍惚间以为自己成了不拘常规的冒险家。</p><p>&quot;这就是我们的计划，&quot;近日布鲁姆在科罗拉多州的家中笑着回忆。风韵犹存的她如今已成为赌博心理的深度剖析者，&quot;赛前指导总是这句：<em>千万别和这些男人发生关系</em>。这份工作原本完美，一旦牵扯私情就全盘崩溃。你越是能在房间里抬高赌注档次——既要保持格调又不真正违法——就越让人仿佛踏入异度空间。&quot;她对自己编织的梦境有着清醒认知：&quot;有时男客会自以为对我动了真情，我不得不提醒：这不是真实生活！在这里，我是&#x27;反妻子&#x27;角色。真实婚姻里我会让你倒垃圾，而在这里我会说&#x27;你<em>永远</em>不需要倒垃圾&#x27;。&quot;</p><p>数月之内，布鲁姆和她的团队便掌控了曼哈顿的豪赌局。起初，她精明地扮演着天真无邪的庄家角色，仅靠玩家的小费维持生计——这属于合法报酬。诱惑以&quot;抽水&quot;的形式悄然降临，这笔微小的抽成逐渐将她从女主人转变为法外之徒。纽约的赌博法律与其道德准则如出一辙：允许为消遣而小赌怡情，但为牟利则严惩不贷。&quot;到最后，我和他们一样沦为了赌徒，&quot;布鲁姆坦言，&quot;我在赌自己能否智胜罪犯、竞争对手、联邦法规和债务清单。我以为自己拥有制胜法宝——人性心理。&quot;</p><p>赌局充斥着放纵与焦虑：财富在牌桌上流转，对冲基金奇才与电影明星及身份暧昧者并肩而坐，皆沉浸于广场酒店迷离的暮色之中。昔日运动员曾是易宰的肥羊，而今却高踞赌局生态链顶端。&quot;请来 A-Rod 或尼克斯队员能为赌局增添真正光彩，&quot;布鲁姆说道，&quot;那些金融巨鳄会瞬间变回痴迷明星的十二岁少年。&quot;</p><p>随着赌注的增加，风险也随之攀升。如同往常一样，帷幕在黎明前的敲门声、手铐和联邦起诉中落下。在布鲁姆的叙述中，留下的与其说是纸牌或现金的记忆，不如说是那场奢华盛宴本身——野心与欲望的交织。她从未对赌博本身产生过特别的兴趣，如今以超然的态度描述那段时期。“扑克不过是赶上了一时的风潮，”她说，“与我无关。换成钓鱼游戏也没什么区别。”</p><p>布鲁姆隐约感觉到，浮华博彩的时代正在走向终结。她指出，即便是休闲纸牌游戏也因&quot;量化玩家&quot;的涌入而彻底改变——这群精于数学的玩家深谙所有概率并依此下注。&quot;现在是戴着墨镜研究算法的人主宰牌桌，&quot;她说，&quot;这种人绝不可能出现在我的牌局里。我的牌局仍是狂野西部式的——人们互相揣测心理。看看世界扑克系列赛的决赛桌，早已不见戴牛仔帽的家伙，没有多伊尔·布鲁森那样的传奇，全是整天研究&#x27;完美扑克理论&#x27;的人。&quot;</p><hr/><p>毫无疑问，概率分析师的激增——他们能将每一手牌、每一个赌局拆解为最可能的结果——已经侵蚀了赌博的神秘感与刺激感。如今，二十多岁的博士候选人埋头于手机，运用统计学知识玩转完美扑克，追寻着罗斯坦当年不得不持枪强取的套利优势。</p><p>若说当今游戏有何惊人之处，那便是它们被&quot;破解&quot;得越彻底，其吸引力就越发衰减。棒球运动便是明证：当它被完美解构为三振、保送和本垒打这三大终极结果时，比赛便渐失魅力，触击、盗垒、自杀式抢分和牵制出局这些充满色彩与混乱的元素，反倒沦为华而不实的装饰缀边。</p><p>赌博如今也将世人划分为两类：一类深谙其道，觉得索然无味；另一类因感无趣而宁愿不去了解，却仍会参与并输掉赌局。正如令人兴奋的城市一样，刺激的赌局也因那些神秘的缺陷而繁荣：量化交易者苦苦寻觅以获取优势的微小市场异常，观察入微者能捕捉而他人无法察觉的破绽和馈赠。一旦一切都被洞悉，一切便失去了趣味。<em>赌博或许曾属于魔鬼，但我向你保证，如今已不再如此。</em></p><p>以赌场形式出现的有组织赌博的到来，甚至剥去了罗斯坦和圣克莱尔这类昔日恶棍身上早已褪色的魅力。当拟建的凯撒宫的详细效果图最终公布时，那些画面显得可笑地一本正经：图中没有成群的现代版 “马哈利” 和 “底特律的内森”，只有身着庄重黑衣、衣着优雅的男男女女，在扑克室里玩牌，而那地方看起来随时可以举办一场——嗯，关于哥德尔的研讨会。（唯一可以确定的是，凯撒宫（Caesars Palace）将沿用不带所有格撇号的写法——这是拉斯维加斯的一个传统，意在将罗马帝国的理想“平民化”。）</p><p>然而，无论最终如何实现，时代广场无疑会因赌场的到来而失色——那里将布满无休止的老虎机、赌桌和机械般冷漠的输钱游戏。赌场之所以背负投机名声有其原因：它们承诺带来经济增长，却往往沦为背信弃义的工厂，源源不断地 “加工” 出一列列失望的赌客。</p><p>赌博即猜测，而猜测未来事件实则寄托着对美好结局的期盼。当赌博沦为可被解析的算法集合，便彻底割裂了其卑微的浪漫憧憬，断绝了那不切实际却源自本初的期许——对天降横财的渴望。赌博如同历史，我们必须从既定事实回溯至最初梦想。否则，一切不过是数字游戏。♦</p><p><em>2025 年 8 月 11 日刊登于《纽约客》印刷版，标题为《幸运之城》。作者 <a href="https://www.newyorker.com/contributors/adam-gopnik">Adam Gopnik</a> </em></p><p><em>文章借助<a href="https://immersivetranslate.com/zh-Hans/">沉浸式翻译</a>、 <a href="https://www.deepseek.com">deepseek</a>  和 <a href="https://gemini.google.com/app">Gemini</a> 翻译</em></p></div><p style="text-align:right"><a href="https://semejen.com/posts/newyorker/the-engines-and-empires-of-new-york-city-gambling#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/newyorker/the-engines-and-empires-of-new-york-city-gambling</link><guid isPermaLink="true">https://semejen.com/posts/newyorker/the-engines-and-empires-of-new-york-city-gambling</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sat, 27 Sep 2025 08:25:54 GMT</pubDate></item><item><title><![CDATA[【转载】关于 Palantir 的思考: 一段八年历程的回望]]></title><description><![CDATA[<link rel="preload" as="image" href="https://substackcdn.com/image/fetch/$s_!6scQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71c4c9a8-1f82-4104-a90f-f1087fceb12b_2918x1462.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/default/reflections-on-palantir">https://semejen.com/posts/default/reflections-on-palantir</a></blockquote><div><div><p>Palantir 如今炙手可热。这家公司刚入选标普 500 指数，股价一路飙升，市值逼近千亿美元。风投机构争相追逐前 Palantir 创始人寻求投资机会。</p><p>对于公司的老员工和离职人员而言，这种盛况令人深感错位。尤其在 2016-2020 年期间，提及自己在 Palantir 工作会招致反感。当时公司被视作间谍技术机构、NSA 监控帮凶甚至更糟，办公室外常有抗议活动。即便是道德层面不反感的人，也认为这不过是伪装成软件公司的咨询机构，充其量是高端人才套利平台。</p><p>我于去年离职，但从未公开谈论过在公司的见闻。外界对这家企业的认知存在大量盲区。作为曾在此效力八年的亲历者，我将尝试阐释某些未被洞察的真相。</p><p><em>（注：本文以个人身份撰写，与公司已无正式关联。本人持有 $PLTR 多头头寸。）</em></p>
<h1 id="1-">1. 为何加入</h1><p>我于 2015 年夏季加入，最初在新开设的伦敦办公室工作，随后调往硅谷，最后驻守华盛顿特区——担任现场部署工程师。当时公司规模约 1500 人，在帕洛阿尔托（总部）、纽约、伦敦等地设有办公室。（如今员工数约 4000 人，总部迁至丹佛。）</p><p>加入原因何在？</p><p><strong>首先，我渴望在&quot;高难度&quot;行业解决真实且有意义的难题。</strong>出于个人原因，我特别关注医疗健康和生物科技领域——当时公司在这两个领域刚起步。公司提及将涉足医疗、航空航天、制造业、网络安全等重要但当时少有人深耕的行业。彼时热门领域是社交网络（Facebook、LinkedIn、Quora 等）和各类消费应用（Dropbox、Uber、Airbnb），但极少有企业触及经济体系中真正棘手的核心领域。若想既投身这些&quot;硬核&quot;经济领域，又享受硅谷工作文化，在相当长时期内，Palantir 几乎是唯一选择。</p><p>我的目标是创办一家公司，但我希望（1）先深入某个行业沉浸一段时间，掌握实际经验；（2）为美国企业工作并通过此途径获得绿卡。Palantir 同时满足了这两点需求，这让我毫不犹豫地选择了它。</p><p>其次是人才密度。我与医疗垂直领域的早期成员（尼克·佩里、莱坎·王和安德鲁·格文）交流后深感震撼。随后我又与首批商业运营和战略团队成员面试，他们的优秀程度更超预期。这群人既有全力以赴求胜的竞争者和真正信仰者，也有在业余时间研读哲学、坚持奇特饮食方式、以百英里骑行作为娱乐的古怪而迷人的个体。这种特质后来我才知道，是承袭自&quot;Paypal 黑帮&quot;的基因。Paypal 早期成员黄易山曾撰文强调极致专注的重要性：</p><blockquote><p><em>总的来说，当我开始调研更多初创企业时，我发现 PayPal 的人才水平在硅谷初创公司中并不罕见，但区别可能在于高层的投入程度：彼得·蒂尔和马克斯·列夫琴都是极其投入的人——极度竞争、勤奋工作且不愿接受失败。我认为这种领导力是将“标准”有才华的团队推向能够成就伟大事业的关键，并进而为后续的众多成就奠定了基础。</em></p></blockquote>
<p>Palantir 是个异常紧张又古怪的地方。我记得第一次与斯蒂芬·科恩交谈时，他办公室的空调设定在 60 华氏度（约 15.5 摄氏度），摆着几台造型奇特的设备用来降低室内二氧化碳含量，杯子里还堆着巨大的冰块。整个谈话过程中，他一直在嚼冰块。（据说这有助于提升认知能力。）</p><blockquote><p><em>我喜欢在没有任何背景资料的情况下与候选人会面：没有简历，没有初步讨论或职位描述，只有候选人和我在一个房间里。我会提出一个相当随机的问题，这个问题与他们将在 Palantir 从事的工作毫不相关。然后观察他们如何拆解这个问题，看他们是否理解看待同一事物的多种不同方式。我喜欢把面试时间控制在 10 分钟左右。否则，人们会进入他们习惯性的应答模式，你就无法了解他们真实的样子。</em></p></blockquote>
<p>我的面试经常完全无关工作或软件——有一次面试我们整整花了一个小时讨论维特根斯坦。值得注意的是，彼得·蒂尔和亚历克斯·卡普都是哲学专业毕业生。蒂尔的<a href="https://blakemasters.tumblr.com/peter-thiels-cs183-startup">讲义</a>不久前刚发布，其中讨论了莎士比亚、托尔斯泰、吉拉德（当时还默默无闻，现在已成陈词）等更多内容。</p><p>智慧上的宏大抱负与激烈的竞争氛围完美契合了我的个性。事实上，即便在今天，这种环境依然罕见——许多人模仿了“硬核”的工作文化和“这里是海军陆战队”的氛围，但很少有公司能营造出那种浓厚的知识氛围，那种置身于丰富思想体系中的感觉。这种氛围难以伪装——创始人和早期员工必须是真正有趣、富有智慧的思想家。如今能完美结合这两点的公司，我首先想到的是 OpenAI 和 Anthropic。难怪它们能成为人才磁铁<a href="#1"><sup>1</sup></a>。</p>
<h1 id="2-">2. 现场部署</h1><p>当我加入时，Palantir 将工程师分为两类：</p><ol start="1"><li>与客户直接对接的工程师，通常称为 FDE（现场部署工程师）。</li><li>核心产品团队（产品开发, PD）的工程师，他们极少拜访客户。</li></ol><p>FDE 通常需要每周 3-4 天驻场客户办公室工作，这意味着大量差旅安排。这种模式在硅谷公司中无论过去还是现在都极为罕见。</p><p>这种模式值得深入探讨，但其核心在于：通过深入理解复杂行业（制造业、医疗保健、情报、航空航天等）的业务流程，进而设计出真正解决问题的软件。PD 工程师随后将 FDE 的成果产品化，更广泛地说，是构建能提升 FDE 工作效率与速度的软件支撑体系<a href="#2"><sup>2</sup></a>。</p><p>Foundry 产品的雏形大致如此：现场工程师（FDE）前往客户现场，手动处理大量繁琐工作，而产品开发工程师则构建工具将这些繁琐工作自动化。需要从 SAP 或 AWS 导入数据？Magritte（数据摄取工具）应运而生。需要数据可视化？Contour（点击式可视化工具）随时待命。需要快速搭建网络应用？Workshop（类似 Retool 的网页应用构建界面）即刻可用。最终，围绕&quot;整合数据并实现价值转化&quot;这一松散主题，形成了一套极为出色的工具集群。</p><p>当时，让客户接触这些工具被视为激进的举措——它们尚未达到适用状态——但如今这驱动了公司 50%以上的收入，该平台名为 Foundry。从这个角度看，Palantir 实现了罕见的从服务公司向产品公司的转型：2016 年将其描述为硅谷服务公司并不完全错误，但到 2024 年这种说法已严重失实，因为公司成功运用早年经验构建了企业数据平台，这一点体现在毛利率上——2023 年毛利率达 80%。这是软件行业的利润水平。对比埃森哲：32%。</p><p>泰勒·考恩有句精辟的论断：&quot;情境即稀缺资源&quot;，这可谓是该商业模式的核心洞见。亲赴客户现场——创业教父史蒂夫·布兰克称之为&quot;走出办公楼&quot;——意味着你能获取他们工作方式的隐性知识，而非仅依赖企业软件通常采用的扁平化&quot;需求清单&quot;模式。这家公司对此理念的执着程度令人惊叹：经常出现的情况是接到一个电话，就得立即预订次日清晨最早航班飞往某个完全陌生的地方；&quot;先登机再问缘由&quot;已成为企业文化基因。这导致差旅费用长期失控（我们许多人都因此成为美联航 1K 级会员或同级会员），但也意味着经历了长达十年高强度学习周期，最终这一切都获得了回报。</p><p>我的第一个真正的客户合作是与飞机制造商空中客车公司进行的，我搬到图卢兹住了一年，每周四天在工厂与制造人员一起工作，帮助在那里构建我们软件的版本。</p><p>我在图卢兹的第一个月，因为空中交通管制员每个周末都在罢工，我无法飞离这座城市。欢迎来到法国。（我开玩笑的——法国很棒。而且，空中客车公司的飞机非常出色。这是一家真正以工程为核心的公司。CEO 总是受过训练的航空工程师，而不是什么 MBA。不像……算了。）</p><p>首席执行官告诉我们，他最大的问题是扩大 A350 的生产规模。因此，我们最终开发了一款软件来直接解决这个问题。我有时将其描述为“用于制造飞机的 Asana”。我们将不同的数据源——工作订单、缺失零件、质量问题（“不合格项”）——整合到一个友好的界面中，具备勾选工作、查看其他团队的工作进展、零件位置、生产计划等功能。还允许他们搜索（包括模糊/语义搜索）以往的质量问题，并查看这些问题的处理方式。这些看似都是基础的软件功能，但你也见识过企业级软件有多糟糕——仅仅将这些“最佳实践”界面应用到实际生产中，就能产生惊人的效果。最终，这帮助推动了 A350 的生产激增，成功将制造速度提升了四倍，同时保持了空客的高质量标准。</p><p>这使得软件难以简洁地描述——它不仅仅是一个数据库或电子表格，而是针对特定问题的端到端解决方案，通用性根本不在考虑范围内。你的任务是解决问题，不必担心过度拟合；而 PD（Palantir）的工作则是将你所构建的内容进行通用化处理，目标是在其他地方销售。</p><p><img src="https://substackcdn.com/image/fetch/$s_!6scQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71c4c9a8-1f82-4104-a90f-f1087fceb12b_2918x1462.png" alt="图卢兹的 A350 总装线。我大部分时间都在这里度过，令人叹为观止。截图自https://www.youtube.com/watch?v=Yutzg2NLwcU" height="1462" width="2918"/></p><p>现场部署工程师倾向于编写能快速完成任务的代码，这通常意味着——委婉地说——技术债务和临时解决方案。产品工程师编写的软件能够清晰扩展，适用于多种用例，并且不会崩溃。公司的一个关键“秘诀”在于，创造深厚且持续的企业价值需要两者兼备。业务开发工程师通常具备较高的忍耐力、嵌入外国公司并赢得客户信任所需的社交和政治技巧，以及高速度——你需要快速构建出能提供核心价值的东西，让客户意识到你是真正可靠的。客户对大多数软件承包商有着低得可笑的期望，这些承包商通常是 SAP 或其他类似软件的实施者，并按照长达数年的“瀑布式”时间表工作，这也有助于我们的成功。因此，当一支由 20 多岁的年轻人组成的杂牌军出现在客户现场，并在短短一两周内构建出人们可以实际使用的软件时，人们自然会注意到。</p><p>这种双管齐下的模式构成了强大的引擎。客户团队通常规模较小（4-5 人），行动迅速且自主；这样的团队数量众多，学习速度快，而核心产品团队的任务则是汲取这些经验，构建主要平台。</p><p>当我们被允许在组织内部工作时，这种方式往往效果显著。障碍主要来自政治层面。每当看到政府再次向德勤支付 1.1 亿美元合同，却建了个无法正常运行的网站，或是遭遇 healthcare.gov 式的惨败，又或是旧金山联合学区花费 4000 万美元推行——再次强调——无法正常运作的薪酬系统时，你目睹的正是政治压倒实质的例证。SpaceX 与美国国家航空航天局的对比亦是明证。</p><p>世界需要更多像 SpaceX 和 Palantir 这样的公司，它们以执行力取胜——实现目标成果，而非玩弄政治游戏或构建无法达成目标的狭隘解决方案。</p>
<h1 id="3-">3. 秘密</h1><p>FDEs 所做的另一项关键工作是数据整合——这个术语让大多数人昏昏欲睡。这（至今仍然是）公司的核心业务，但其重要性多年来被大多数观察者低估。事实上，直到人工智能兴起，人们才开始意识到企业拥有经过清洗、整理且易于访问的数据的重要性。（参见：AI 模型中的“它”指的就是数据集）。</p><p>简单来说，“数据集成”指的是：(a) 获取企业数据的访问权限，这通常需要与组织内的“数据所有者”进行协商；(b) 清理数据，有时还需进行转换，使其变得可用；(c）将数据存放在所有人都能访问的地方。Palantir 主要软件平台（Foundry）中的许多基础软件，正是为了使这一任务更简单、更快速而设计的工具。</p><p>为什么数据集成如此困难？数据通常以计算机难以分析的格式存在——PDF、笔记本、Excel 文件（天啊，这么多 Excel 文件）等等。但真正阻碍进展的往往是组织政治：某个团队或群体控制着关键数据源，他们存在的理由就是作为该数据源的守门人，并且通常通过充当这一角色（以及提供数据分析）来证明自己在公司中的价值<a href="#3"><sup>3</sup></a>。这种政治因素可能成为难以逾越的障碍，有时甚至导致荒谬的结果——比如一家公司购买了一个 8 到 12 周的试点项目，而我们却要花整整 8 到 12 周的时间来获取数据访问权限，最后一周才匆忙准备演示内容。</p><p>Palantir 早期发现的另一个“秘密”是，数据访问冲突部分源于真正的数据安全问题，而通过在平台数据集成层——所有层级——内置安全控制措施，可以缓解这一问题。这意味着基于角色的访问控制、行级策略、安全标记、审计追踪以及大量其他数据安全功能，这些功能至今仍是其他公司仍在追赶的目标。正因这些特性，部署 Palantir 往往使企业的数据更加安全，而非降低安全性<a href="#4"><sup>4</sup></a>。</p>
<h1 id="4">4.文化笔记</h1><p>这家公司的整体氛围更像是一个救世主式的邪教，而非普通的软件公司。但重要的是，批评似乎被高度容忍甚至欢迎——有人给我看了一封邮件链，其中一名初级软件工程师与公司的一位总监进行了公开且充满争议的辩论，而整个公司（约一千人）都被抄送。作为一个理性主义思维的哲学毕业生，这一点对我来说至关重要——我对加入一个不容批评的邪教不感兴趣。但一个由怀疑论者组成的团体，他们深切关心并热衷于争论世界的走向以及软件在其中如何存在——这对我来说很有意思。<a href="#5"><sup>5</sup></a></p><p>我不确定他们现在是否还这样做，但在我加入时，他们会寄给你一本《即兴表演》、《巨塔杀机》（关于 9/11 的书）、《用户访谈》和《搞定》。我还收到了后来成为雷·达里奥《原则》一书的早期 PDF 版本。这奠定了基调。《巨塔杀机》的意义显而易见——公司成立的部分原因是为了回应 9/11 事件，以及彼得认为随之而来的对公民自由的必然侵犯，这一背景很有价值。但为什么是《即兴表演》呢？</p><p>成为一名成功的现场部署工程师（FDE）需要对社交环境有着异乎寻常的敏感度——实际上，你需要与公司（或政府）的高层对应人员建立伙伴关系并赢得他们的信任，这往往需要玩转政治游戏。即兴表演在极客中颇受欢迎，部分原因是它将社会行为机械地分解开来。公司的词汇中充斥着即兴表演的术语——比如“角色分配”（casting）就是一个例子。约翰斯通讨论了同一个演员如何仅通过改变部分肢体行为来扮演“高地位”或“低地位”的角色——例如，说话时保持头部不动是高地位的象征，而频繁左右摇头则是低地位的体现。站得笔直且双手外露是高地位的标志，而懒散地站着、双手插在口袋里则是低地位的表现。诸如此类。如果你不了解这些，你在客户环境中很难取得成功。这意味着你不太可能整合客户数据或让人们使用你的软件。而这最终意味着失败。</p><p>这就是为何前 FDE（现场部署工程师）往往能成为杰出创始人的原因之一。（尽管谷歌员工数量大约是 Palantir 的 50 倍，但在每一届 YC 孵化项目中，前 Palantir 创始人通常比前谷歌员工更多。）优秀的创始人具备洞察氛围、把握群体动态与权力关系的本能。这一点虽不常被讨论，却至关重要：创立一家成功的企业，本质上就是参与一轮又一轮的谈判并取得（净）胜利。招聘、销售、融资——这些核心环节都是谈判。若缺乏对人类行为的这种直觉，就很难在谈判中游刃有余。这正是 Palantir 教会 FDE 的特质，也是其他硅谷公司难以传授的经验。</p><p>另一个方面是，现场部署工程师必须擅长理解事物。你的效率直接与你学习客户语言并深入理解其业务运作方式的速度相关。如果你与医院合作，你会迅速学会谈论容量管理和患者流量，而不仅仅是说“帮助您改善医疗保健”。药物研发、健康保险、信息学、癌症免疫疗法等领域也是如此；每个领域都有专业词汇，而表现出色的人往往擅长快速掌握这些术语。</p><p>泰勒·考恩的《天才》一书中，我最喜欢的见解之一是：最有才华的人往往会发展出自己的词汇和迷因，这些词汇和迷因是进入他们构建的整个知识世界的入口。泰勒本人当然是一个很好的例子。任何 MR 读者都能立刻说出 10 多个泰勒式表达——“模型化这个”、“稀缺的是背景”、“求解均衡”、“大停滞”都是例子。你还可以找到其他擅长此道的人，比如蒂尔，还有埃隆（“多行星物种”、“保护意识之光”等都是迷因）。特朗普、尤德科夫斯基、格温、SSC、保罗·格雷厄姆，他们都经常创造迷因。事实证明，这是衡量影响力的一个很好的指标。</p><p>这一洞见同样适用于公司，Palantir 就拥有自己庞大而独特的术语体系，其中一些术语晦涩到&quot;Palantir 究竟做什么？&quot;成了网络流行梗。&quot;本体论&quot;算是老牌术语，但还有&quot;impl&quot;、&quot;艺术家聚居地&quot;、&quot;复合增长&quot;、&quot;三十六房&quot;、&quot;节点&quot;、&quot;痛苦代谢&quot;、&quot;伽马辐射&quot;等等。重点不在于解释所有这些浓缩着丰富洞见的术语，而在于当你寻找值得加入的公司时，关注其是否具备能启发思考的丰富内部语言体系——这或许是个不错的选择。</p><p>每当提及 Palantir，大多数人会想到彼得·蒂尔。然而，许多核心理念实则源自早期员工，尤其是现任公司总裁希亚姆·桑卡尔。尽管在我任职期间彼得并未参与公司具体运营，他仍对公司文化产生深远影响。这份由乔·朗斯代尔撰写的文件原为内部资料，后公开披露，从中可窥见其文化原则的独特风貌。</p><p>（我认为）彼得提出的理念之一是不给员工设定头衔。在我任职期间，几乎所有人都拥有&quot;现场部署工程师&quot;这一头衔，除此之外只有五、六位总监和首席执行官。偶尔会有人自创不同头衔（我认识的一位同事自称&quot;特殊状况主管&quot;，我觉得这非常滑稽），但这些从未真正流行起来。这显然可以追溯到彼得的吉拉迪安信仰：如果设立头衔，人们就会开始觊觎这些头衔，最终导致公司内部产生竞争政治，破坏内部团结。不如让所有人都拥有相同头衔，使他们专注于目标本身。</p><p>对于“扁平化层级”立场已有诸多有力批评——《无结构的暴政》便是一篇杰作——这种模式在现代初创企业中似乎大多已过时，如今你会迅速看到 CEO、COO、副总裁、创始工程师等头衔。但我的经验是，在 Palantir 这种模式运行良好。虽然某些人比其他人更具影响力，但这种影响力通常建立在卓越成就之上，最关键的是没有人能对他人发号施令。因此无论对方是否位高权重或认为你的想法愚蠢，只要认定方向正确，你完全可以置之不理并付诸实践。更值得一提的是，公司文化崇尚这样的行为：常有工程师无视总监指令、独立构建出关键基础设施的轶事流传，这些故事被奉为值得效仿的典范。</p><p>为此付出的代价是，公司常常显得缺乏明确的战略或方向，更像是一个由聪明人构建各自小王国、朝随机方向发展的培养皿。但它极具创造力。从该公司涌现出的新颖用户界面概念和创意之多，实在被低估了。其中只有一部分如今有了非 Palantir 的对应产品，例如 Hex、Retool、Airflow 都包含了一些最初在 Palantir 开发的组件。该公司现在对人工智能也在做同样的事情——为大型企业部署 LLMs 的工具非常强大。</p><p>“无头衔”制度也意味着公司内部人员的声望起伏非常快。由于每个人的头衔都一样，你必须通过其他方式来衡量影响力，比如“谁现在和这位总监关系特别好”或者“谁在领导这个看似重要的产品计划”，而不是“这个人是某某副总裁”。结果就是大规模的个人声望过山车——某人可能会在一段时间内非常有影响力，然后神秘消失，几个月都不参与任何显眼的工作，而你永远无法完全确定发生了什么。</p>
<h1 id="5-">5. 蝙蝠信号</h1><p>我能追溯到彼得的另一件事是人才蝙蝠信号的理念。如今自己创业（目前还处于秘密阶段），我对此更加深有体会：招募优秀人才很难，你需要一个差异化的来源。如果你每年只是与 Facebook/Google 争夺同一批斯坦福计算机科学毕业生，你肯定会输。这意味着你需要一批（a）特别愿意加入你而非其他公司的人才，以及（b）一种大规模接触他们的方式。Palantir 拥有多个差异化的招聘优势来源。</p><p>首先，当时有一批支持国防/情报工作的人，在那个领域还不那么流行的时候，他们选择了这条路。这尤其吸引了来自中西部或红州的聪明工程师，以及许多曾在美国军队、中央情报局（CIA）或国家安全局（NSA）工作过的聪明人，他们既想为美国服务，又看到了在硅谷公司工作的吸引力。我入职的第一天，在团队内部迎新会上遇到了另一位看起来比我年长一些的同事。我问他之前在 Palantir 之前是做什么的。他面无表情地看着我的眼睛说：“我在那个机构工作了 15 年。”随后，我见到了我的第一位领导，他曾经是俄亥俄州的一名特警（！），还是一名退伍军人。</p><p>这类人才众多，其中不乏极具天赋者，而他们大多并未选择加入谷歌。对于这些人来说，Palantir 是唯一真正的“灯塔”。该公司高调宣扬支持军队、爱国等理念，尽管这在当时极为不合时宜。这形成了一种高效且独特的“蝙蝠信号”。（如今有了 Anduril 以及众多国防和制造业初创公司。）<a href="#6"><sup>6</sup></a></p><p>其次，你必须有点古怪才会想加入这家公司，至少在最初的炒作浪潮平息后（尤其是在特朗普执政期间，当时公司备受排斥）。部分原因在于当时罕见的激进“使命聚焦”型品牌塑造，同时公司也毫不避讳地宣扬员工需长时间工作、薪酬低于市场水平且需频繁出差。与此同时，由于与政府合作，我们被硅谷招聘会拒之门外。所有这些筛选出了特定类型的人：能够独立思考，且不会过度受负面新闻影响的人。</p>
<h1 id="6-">6. 道德</h1><p>道德问题引人深思。该公司毫不掩饰地亲西方，这一立场我大体认同——一个更倾向于中共或俄罗斯的世界在我看来并非好事，而这正是当前面临的选择。<a href="#7"><sup>7</sup></a>生活在自由国度时，批评自由国家很容易；但当你亲身体验过另一种体制（如我在压抑国家度过的童年岁月），就会明白其中的艰难。因此，即便我对军方的某些行为持有异议，也毫不反对该公司为军方提供协助。</p><p>但是军队有时不也会做坏事吗？当然——我就曾反对伊拉克战争。这触及了问题的核心：在这家公司工作并非百分之百道德高尚——因为我们有时会帮助那些目标我并不同意的机构——但也并非百分之百邪恶：政府做了很多好事，通过提供靠谱的软件帮助他们更高效地完成这些工作，是一件高尚的事。澄清道德问题的一种方式是将公司的工作分为三类——这些分类并不完美，但请耐心听我说：</p><ol start="1"><li><strong>道德中立</strong>。正常的公司工作，例如联邦快递、CVS、金融公司、科技公司等等。有些人可能对此有意见，但总体上人们对这些事情感觉良好。</li><li><strong>明确有益</strong>。例如，与疾病控制中心合作抗击疫情；与国家失踪与受虐儿童中心合作打击儿童色情制品等。大多数人都会认同这些都是值得从事的善举。</li><li><strong>灰色地带</strong>。我指的是那些涉及道德上棘手、难以抉择的领域：例如健康保险、移民执法、石油公司、军队、间谍机构、警察/犯罪等等。</li></ol><p>每位工程师都面临一个选择：你可以从事像谷歌搜索或 Facebook 新闻推送这样的工作，这些似乎都是略微有益的事物，基本上属于第一类。你也可以投身于第二类事务，比如 GiveDirectly 或 OpenPhilanthropy 等。</p><p>对 Palantir 的关键指控似乎是“你不应该从事第三类事务，因为这有时会涉及做出道德上不良的决定”。一个例子是 2016-2020 年间的移民执法，其中许多方面让很多人感到不适。</p><p>但在我看来，完全忽视第三类机构并与之脱离接触，同样是一种责任的放弃。第三类机构必须存在。美国是由持枪者保卫的。警察必须执行法律——根据我的经验，即使那些在道德上对某些警务方面感到不安的人，如果自己家被盗，也会迅速报警。石油公司必须提供能源。医疗保险公司必须不断做出艰难的决定。是的，这些事物中都有令人不快的方面。但我们是否就应该完全脱离所有这些机构，让它们自行解决呢？</p><p>我不认为对于是否应该与第三类客户合作有一个明确的答案；这需要具体情况具体分析。Palantir 对此的回应大致是：“我们会与大多数第三类组织合作，除非它们明显恶劣，并且我们相信民主进程会逐渐引导它们朝着好的方向发展。”因此：</p><ul><li>在移民和海关执法局（ICE）的问题上，他们在特朗普时代退出了执法和遣返行动（ERO），同时继续与国土安全调查局（HSI）合作。</li><li>他们与大多数其他第三类组织合作，理由是这些组织在世界上主要做的是好事，尽管也很容易指出它们所做的坏事。
<ul><li>我无法在此透露具体细节，但 Palantir 的软件在阻止多起恐怖袭击中发挥了部分作用。仅凭这一事实，我认为就足以证明这一立场的正确性。</li></ul></li></ul><p>对许多人来说，这是一个令人不安的立场，因为你无法保证自己始终在做百分之百的好事。在某种程度上，你受制于历史，并且你在赌（a）好事多于坏事（b）在场总比不在场好。这对我来说已经足够好了。其他人则选择另寻他路。</p><p>当然，这种立场的危险在于，它可能演变成一种完全通用的理由，为权力结构所希望的任何行为辩护。你只是在放大现有的流程。这就是“具体情况具体分析”发挥作用的地方：没有通用的答案，你必须具体问题具体分析。就我个人而言，我在那里的大部分时间都致力于医疗和生物领域的工作，我对自己的贡献感到满意。我相信那些阻止了恐怖袭击的人也会对自己的贡献感到满意，或者在疫情期间分发药物的人们也是如此。</p><p>尽管潮流已变，如今处理这些“棘手”领域变得时髦，但对技术专家而言，这些问题依然具有现实意义。人工智能就是一个很好的例子——许多人对部署人工智能带来的某些后果感到不安。也许人工智能被用于黑客攻击；也许深度伪造技术以各种方式让世界变得更糟；也许它会导致失业。但人工智能也带来了重大好处（达里奥·阿莫代伊在最近的一篇文章中很好地阐述了一些好处）。</p><p>与 Palantir 一样，从事人工智能工作可能并非百分之百道德高尚，也非百分之百邪恶。不参与其中——或呼吁暂停/停止，这纯属幻想——不太可能是最佳立场。即使你不在 OpenAI 或 Anthropic 工作，如果你有可能涉足人工智能相关领域，你或许仍希望以某种方式参与其中。有些简单的选择：构建评估体系、致力于对齐问题、研究社会韧性。但我的观点是，灰色地带也值得投入：参与政府的人工智能政策制定，将人工智能应用于医疗等领域。当然，这会很困难。但请勇往直前。<a href="#8"><sup>8</sup></a></p>
<h1 id="7-">7. 接下来呢?</h1><p>我是否仍然看好这家公司？是的。</p><p>本轮人工智能革命带来的巨大生产力提升，将出现在 AI 开始为这个时代的大型企业和商业体提供助力之时——涵盖制造业、国防、物流、医疗保健等行业。Palantir 已与这些企业合作长达十年。AI 智能体终将驱动众多核心业务流程，而这些智能体需要依赖对关键业务数据的读写权限。花费十年时间整合企业数据，正是为企业部署人工智能的关键基石。这一机遇无比巨大。</p><p>至于我，我正在执行期待已久的宏伟计划，接下来将创办一家公司。是的，其中会涉及政府业务。团队非常出色，并且我们正在招聘。有时我们甚至还会讨论维特根斯坦。</p><p><em>感谢 Rohit Krishnan、Tyler Cowen、Samir Unni、Sebastian Caliri、Mark Bissell 和 Vipul Shekhawat 对本文的反馈。</em></p><blockquote><p><em>文章转载自 <a href="https://nabeelqu.substack.com/p/reflections-on-palantir#footnote-8-150188028">关于 Palantir 的思考: 一段八年历程的回望</a>, 作者 <a href="https://substack.com/@nabeelqu">Nabeel S. Qureshi</a> 发表于 2024 年 10 月 16 日。</em></p></blockquote></div><footer><div id="1">1<!-- -->: OpenAI 和 Palantir 都需要富有且深信不疑的人士长期资助，即便多年未见明显突破（分别是埃隆/YC Research 和彼得·蒂尔）。Palantir 多年来步履蹒跚，在政府领域几乎未能取得实质性进展，且与“精益创业”理念背道而驰；而 OpenAI 在语言模型问世前的数年间，至少在炒作层面一直被 DeepMind 压制。正如萨姆·奥尔特曼所指出的:<br/><em>奥特曼告诉 Stripe 联合创始人、同为亿万富翁的约翰·科里森：“OpenAI 违背了所有 YC 的建议。”他滔滔不绝地列举道：“我们花了四年半时间才推出一款产品。我们将成为硅谷历史上资本最密集的初创公司。我们开发这项技术时，完全不知道我们的客户会是谁，也不知道他们会用它来做什么。” 周六，奥特曼在推特上表示：“ChatGPT 没有社交功能或内置分享机制，必须先注册才能使用，缺乏天然的病毒式传播循环等等。我对自己多年来给初创公司提供的建议产生了严重质疑。”</em><br/>这种关联性有其道理：通过将公司定位为超越盈利的目标（如公民自由；人工智能之神），从一开始就能吸引真正的信仰者，他们进而创造出高度生成性的知识文化，这种文化在公司最终取得成功后仍能持续存在。<br/>不过，这很难复制——你需要一位有远见的亿万富翁和一个被忽视的经济领域。人工智能/机器学习在 2015 年并不热门；政府科技在 2003 年也不热门。</div><div id="2">2<!-- -->: 泰德·马布里的这篇关于 FDE 模型的<a href="https://tedmabrey.substack.com/p/sorry-that-isnt-an-fde?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web">文章</a>写得很好</div><div id="3">3<!-- -->: 莎拉·康斯坦丁——同样曾是 Palantir 员工——在她出色的<a href="https://sarahconstantin.substack.com/p/the-great-data-integration-schlep?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web">文章</a>中对此进行了更详细的阐述</div><div id="4">4<!-- -->: 顺便提一下，媒体常常将该公司描述为“数据公司”，甚至更糟地称为“数据挖掘”公司或类似标签。据我所知，这其实是媒体方面的一个简单误解。Palantir 为企业提供数据整合服务，但数据的所有权属于企业本身，而非 Palantir。“挖掘”数据通常意味着利用他人的数据为自己谋利或进行销售。Palantir 并不这样做——客户的数据始终归客户所有。</div><div id="5">5<!-- -->: 正如伯恩·哈伯特在他对该公司极具洞察力的文章中所指出的，“邪教”只是“能够支付低于市场水平的薪资，却获得高于平均水平的员工留任率”的委婉说法。这一点也说得通——公司支付的薪资低于市场水平，但员工普遍会待上五年以上。话虽如此，由于股票的表现，大多数早期员工做得非常好。但我们当时并不确定自己会成功；我们中的大多数人已经在心理上放弃了股权的价值，尤其是在最艰难的几年里。我清楚地记得，有一本“解释股权价值”的小册子，展示了如果公司估值达到 1000 亿美元时股权的价值，我们一群人还嘲笑这种傲慢。而截至撰写本文时，该公司的市值已达到 974 亿美元。</div><div id="6">6<!-- -->: 顺便说一句，即便在当时，这家公司也并非什么极端右翼的反觉醒文化避风港。诚然，意识形态光谱上各端都有人，但大体上我记得绝大多数同事都是普通的中间派。</div><div id="7">7<!-- -->: 在我看来，大多数激进分子对于我们需要强大军队的必要程度存在错觉。我想知道在俄罗斯入侵乌克兰之后，他们中有多少人改变了看法——（事实上，Palantir 在乌克兰的应对中发挥了关键作用）。</div><div id="8">8<!-- -->: 保罗·克里斯蒂安诺是人工智能安全领域的一个典范——他进入政府部门，目前领导着美国人工智能安全中心。</div></footer></div><p style="text-align:right"><a href="https://semejen.com/posts/default/reflections-on-palantir#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/default/reflections-on-palantir</link><guid isPermaLink="true">https://semejen.com/posts/default/reflections-on-palantir</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sun, 24 Aug 2025 13:55:34 GMT</pubDate></item><item><title><![CDATA[格特鲁德·伯格，被遗忘的情景喜剧发明者]]></title><description><![CDATA[<link rel="preload" as="image" href="https://media.newyorker.com/photos/68406d03f596de893f457796/master/w_2240,c_limit/r46357.jpg"/><link rel="preload" as="image" href="https://media.newyorker.com/cartoons/683f36ad0c078f795ad144f0/master/w_1280,c_limit/a20861.jpg"/><link rel="preload" as="image" href="https://media.newyorker.com/photos/68406cf01d56c0f5feaf22d9/master/w_1600,c_limit/r46849.jpg"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/newyorker/the-forgotten-inventor-of-the-sitcom">https://semejen.com/posts/newyorker/the-forgotten-inventor-of-the-sitcom</a></blockquote><div><div><blockquote><p>格特鲁德·伯格 (Gertrude Berg) 的《戈德堡一家》(The Goldbergs) 曾是一部大胆描绘犹太家庭并备受喜爱的作品。然而，随后的黑名单事件却彻底摧毁了她留下的宝贵事业。</p></blockquote>
<p><img src="https://media.newyorker.com/photos/68406d03f596de893f457796/master/w_2240,c_limit/r46357.jpg" alt="伯格的节目始于 1929 年的广播，一经播出便大受欢迎。1949 年，该节目被搬上电视荧屏。/ Getty" height="2560" width="2080"/></p><p>1954 年 5 月 9 日，在 CBS 游戏节目《What&#x27;s My Line?》的录制现场，当周的&quot;神秘嘉宾&quot;从蒙眼评委团面前走过，在演播室观众的欢呼声中，她用粉笔在黑板上写下自己的名字：格特鲁德·伯格。这位体态丰腴的女士有着温暖传神的眼睛和圆润的鼻子，一身派克大道的时髦装扮——雍容的毛皮披肩搭配三串珍珠项链。屏幕上打出了她更为人熟知的称号：一个虚构角色的名字，二十五年来，这个角色如同格劳乔·马克思般具有标志性，又像米老鼠那样深受喜爱——她就是操着意第绪语口音、总爱用错词语的布朗克斯家庭主妇莫莉·戈德堡。这个令人无法抗拒的角色总爱对着公寓通风井（当时的社交网络)大喊&quot;有人在家吗？&quot;，成为一代人的集体记忆。</p><p>对时年 54 岁的伯格而言，过去一年颇为艰难。她的家庭剧《戈德堡一家》——原名《戈德堡家的崛起》——1929 年作为广播剧首播，几经转台后最终落户 CBS，引发全国轰动。经济大萧条和二战期间，伯格以惊人速度埋头创作，身兼制片、编剧、导演和主演，制作了上千集讲述犹太移民家庭奋斗故事的作品。借此她成为跨媒体大亨，开设&quot;妈妈谈心&quot;建议专栏，创作连环漫画，出版畅销食谱，甚至为丰满女性设计家居服系列。《好管家》杂志全国民调显示，伯格当选全美第二受敬仰女性，仅次于另一位自由派标杆人物埃莉诺·罗斯福。</p><p>1945 年，伯格的广播剧落幕——四年后，她将其改编为情景喜剧在哥伦比亚广播公司播出，当时电视行业尚处草创期，节目仍以直播形式呈现并由广告商主导。她与通用食品公司合作，以剧中角色莫莉的身份为桑卡无咖啡因咖啡代言，助推该品牌销量飙升；1951 年，她击败伊莫金·科卡、海伦·海斯与贝蒂·怀特，成为首位艾美奖最佳女主角得主。电视即将重塑文化格局，而伯格正蓄势待发，即将成为这个领域最耀眼的明星之一。</p><p>然而仅仅三年后，她毕生的事业就陷入了危机。1950 年，随着麦卡锡时代的降临，意识形态的牢笼笼罩了整个行业，令一群思想开明的创作者陷入恐慌，其中就包括在《戈德堡一家》中饰演茉莉丈夫杰克的演员菲利普·洛布。洛布的名字被列入了臭名昭著的反共告密手册《红色频道》。伯格为洛布抗争了一年半，拒绝赞助商要求解雇他的指令，但哥伦比亚广播公司最终停播了该剧，她不得不妥协。《戈德堡一家》转投边缘化的杜蒙电视网播出，更换了新赞助商和新任&quot;杰克&quot;。另一部家庭情景喜剧取代了伯格在 CBS 周一黄金档的位置——由&quot;电视第一夫人&quot;露西尔·鲍尔主演的《我爱露西》。</p><p>在《What&#x27;s My Line?》节目中，伯格丝毫未显露任何异常。当评委之一、女演员费伊·埃默森注意到伯格入场时经久不息的掌声并问道&quot;您是位家喻户晓的人物吗？&quot;时，伯格用上流社会婆罗门特有的尖细气声答道&quot;相当出名！&quot;引发全场哄笑。</p><p>&quot;您经常在电视上露面吗？&quot;埃默森追问道。</p><p>&quot;断断续续地演过，&quot;伯格回答。随后她几乎微不可闻地补了句俏皮话：&quot;这得看赞助商的心情。&quot;</p><p>是的，伯格说她登台演出过；还拍过电影。当被问及她塑造的角色是否以口音闻名时，她眼眸闪亮地点头承认。经过几轮错误猜测，主持人史蒂夫·艾伦突然喊出正确答案：&quot;是莫莉·戈德堡吗？&quot;欣喜若狂的评委们立即要求伯格来段即兴表演，听听她招牌的角色腔调。</p><p>&quot;亲爱的，你们想听我说什么呀？&quot;伯格咧嘴笑着用角色腔调反问。离场前，全体评委起立与她握手。在那一刻，格特鲁德·伯格依然是全美瞩目的焦点。</p><hr/><p>在美国人熟知的电视发展史中，一切始于五十年代——露西·里卡多在东六十八街的褐石公寓里哭喊&quot;哇啊啊&quot;的场景。家庭情景喜剧是这个大众媒介最原始的形式，既催生了《我爱露西》《蜜月期》这类张扬的婚姻闹剧，也孕育了《父亲最懂》《奥兹和哈里特的冒险》这类更温吞的作品，后者用方下巴的通勤族父亲和戴着珍珠项链吸尘的母亲，构建出白人郊区生活整齐划一的宁静幻象。每个十年都有新邻居搬进这个荧幕社区：七十年代的邦克家和布雷迪家，八十年代的科斯比家和康纳家。小荧幕化作一面镜子，让你的家庭得以窥见另一个家庭——他们同样坐在自家沙发上，面对着自家的电视机。</p><p>《戈德堡一家》是这类写照的首例。这部剧集温馨、犀利又略带感伤，背景设定在犹太移民的世界——成衣工人、热心肠的家庭主妇、挤满廉价公寓厨房的成群表亲和逐渐美国化的孩子们，煎锅里滋滋作响的犹太饺子。然而，尽管具有鲜明的文化特色，莫莉、杰克和他们的孩子罗莎莉与萨米（昵称萨梅莱）并未被塑造成异域风情的族裔符号或杂耍剧中的&quot;典型人物&quot;，而是作为爱国且情感上易于共鸣的普通美国人——这在犹太人普遍被视为局外人甚至颠覆分子的年代，无疑是个大胆的创见。</p><p>《戈德堡一家》停播后，伯格本人的传奇也随之湮没——这位电视史上首位不分性别的&quot;节目主理人&quot;，比奥普拉或玛莎·斯图尔特早半个世纪就成为了生活方式引领者。到 2013 年，关于伯格的记忆已彻底淡出公众视野，当美国广播公司推出同名新情景喜剧《戈德堡一家》时（由毫无血缘关系的亚当·F·戈德堡创作，讲述他八十年代在费城郊区的青春故事），几乎无人察觉这个名称的渊源。与同代许多犹太人一样——包括我那位被称为莫莉的祖母马尔卡，她在《戈德堡一家》电台首播那年通过埃利斯岛入境——伯格曾对美国怀有炽热的乐观信念，笃信文化进步与向新移民敞开怀抱的民主制度。但最终，伯格的人生印证了一个在特朗普时代重新显影的残酷真相：敞开的门扉也可能轰然紧闭。</p><p>近年来，人们曾数次尝试重新唤起对伯格的关注，包括格伦·D·史密斯 2007 年出版的学术传记，以及阿维娃·肯普纳 2009 年拍摄的生动深情的纪录片《呦吼，戈德堡太太》，片中采访了伯格的家人和同事。2021 年，詹妮弗·凯辛·阿姆斯特朗出版了佳作《当女性发明电视》，巧妙地将伯格的故事与其他三位被忽视的创新者交织在一起：肥皂剧创始人艾娜·菲利普斯、黑人爵士歌手兼杜蒙电视网主持人黑兹尔·斯科特，以及贝蒂·怀特（虽不算完全被遗忘，但鲜少有人知道她堪称电视脱口秀的开创者）。</p><p>然而，在一月凛冽的寒风中，当我在雪城大学翻阅伯格的档案时，她的故事却像一桩悬而未决的冷案——又像是中风后记忆的断层，集体回忆中的空白。为何同时代的同行们都化身为怀旧符号，成为那个更安全、更纯真年代的图腾，唯独她被世人遗忘？档案里厚重的圣诞贺卡剪贴簿中，满是各界名流的祝福——伯格显然深爱圣诞节。成堆的粉丝来信里，犹太与非犹太观众都亲切地称她为&quot;莫莉·戈德堡&quot;。更有一些私密信件写着她的本名蒂莉·埃德尔斯坦，纸张脆弱得在我指尖碎成齑粉，如雪花般飘落在档案页上。</p><p><img src="https://media.newyorker.com/cartoons/683f36ad0c078f795ad144f0/master/w_1280,c_limit/a20861.jpg" alt="“你知道我们能步行上班是多么幸运吗？” Cartoon by Michael Maslin"/></p><p>1899 年出生的蒂莉在哈莱姆区一个犹太社区长大，父亲杰克·埃德尔斯坦是个投机商人，经营着卡茨基尔山区一家名为弗莱施曼斯的破旧旅馆，母亲黛娜则是个溺爱孩子但体弱多病的女人。在伯格 1961 年的回忆录《莫莉与我》中，她将亲戚们描绘成一群乐观的自我神话制造者——比如她那逃离波兰迫害、私藏烈酒蒸馏器的白铁匠祖父莫迪凯——总爱把轶事添油加醋，使其更浪漫而非悲惨。伯格也继承了这种倾向：书中她只字不提七岁左右死于白喉的哥哥查尔斯，那场变故彻底击垮了她的父母（母亲精神崩溃，父亲至死都随身携带着宣告查尔斯死讯的电报）。她只专注于描绘在父亲旅馆度过的欢乐夏日：负责戏剧节目编排，雨天表演占卜师戏码，十四岁起就开始根据旅馆八卦编排小品。这些故事的主角是五十多岁的玛尔特克·塔尔尼茨基——一个丈夫糟糕透顶、官司缠身的女人（旅馆住客多是律师）。</p><p>在这些夏日宾客中，有位蒂莉未来的丈夫——英国化学工程师卢·伯格。他那考究的口音令蒂莉倾心不已（&quot;他会说&#x27;whilst&#x27;、&#x27;hence&#x27;和&#x27;shed-yule&#x27;呢&quot;，她在《莫莉与我》中惊叹道）。十九岁的她与二十九岁的他成婚后，在南方腹地度过了痛苦的三年——卢当时担任路易斯安那州甘蔗种植园的首席技术专家。令她庆幸的是，炼糖厂意外焚毁，夫妇俩便借机迁居纽约。1926 年次子出生后不久，伯格做出重大转变：她将名字改为格特鲁德——这个更显派克大道气质而非哈林区风格的名字，就此投身演艺事业。</p><p>在丈夫的支持下（他一生都在为她打印剧本），初出茅庐的格特鲁德·伯格四处奔波寻找工作，接了些零活，比如为面向犹太消费者的意第绪语圣诞饼干广告配音。她还卖出了自己首个广播剧《艾菲与劳拉》的四集剧本，这个系列剧讲述布朗克斯区两位女店员探讨人生意义的故事。这个大胆的创意堪称《拉维恩和雪莉》的前身——早在贝氏测试被提出前五十多年，它可能就已完美符合标准——但该剧给伯格上了关于权力的第一课。由于劳拉一句&quot;婚姻并非天作之合&quot;的讽刺妙语触怒了电台，节目仅播出一集便被腰斩。</p><p>所幸伯格当时正忙着打磨另一个剧本，这次的主角是个马尔特克式的女主人公，只是更年轻，在爱情上更幸运。据伯格常讲的一个故事，她手写的《戈德堡一家的崛起》剧本字迹难以辨认，于是有位高管让她读给他听——结果他被迷住了，坚持要她来演主角。（有一次她声称，这本来就是她的计划。）第一集在 1929 年股市崩盘一个月后播出，讲述一个家庭努力维持生计的故事，时机恰到好处。伯格每天六点起床写剧本，完善每个细节，连炉子上鸡蛋发出的滋滋声都要逼真。在十五年间，《戈德堡一家》扩展到包含约两百个角色，有诸如爱发牢骚的大卫叔叔这样鲜活的人物，他痴迷于自己当医生的儿子索利。这部连续剧在鼎盛时期每天多次播出，听众达到一千万。</p><p>该剧的核心是伯格饰演的莫莉——这位令人敬畏的角色既是个爱管闲事的唠叨鬼，也是剧中的道德楷模，总被他人的困境激发解决问题的热情。试播集中，裁缝师杰克需要资金自立门户，莫莉从壁橱里掏出藏钱的茶壶化解危机。这个充满爱心与智慧的角色，既是对伯格亲属的致敬，也是对其抑郁终生的母亲的补偿性幻想。现实中的伯格与莫莉截然不同：她不下厨、不做家务，甚至不认希伯来文（那则饼干广告的意第绪语台词是卢一字一句教她的）。作为崇尚世俗的高知女性，她读俄国小说、收藏毕加索画作；但对虚构家庭的过度投入损害了她与女儿哈丽特的感情。不过她和莫莉一样怀有深切共情的好奇心，带着外向者探索世界的冲动：为寻找新剧情，她曾化名混入下东区的妇女社团偷听谈话。</p><p>从一开始，莫莉·戈德堡这个角色就让部分听众感到不安。这种塑造是否像当时唯一收视率更高的广播剧《阿莫斯与安迪》那样，属于用粗鄙的黑脸方言制造笑料的滑稽戏？但如果说莫莉是种套路，她也是对早期刻板形象的修正——那种悲情自抑的&quot;意第绪妈妈&quot;：1927 年有声电影《爵士歌手》里圣洁的犹太小镇幸存者；索菲·塔克招牌歌曲《我的意第绪妈妈》中谦卑的老祖母；1938 年诗歌《路边有棵树》里忧心忡忡的母鸟，因害怕幼鸟冻僵而用层层围巾帽子压得它无法展翅。与这些受难姐妹一样，莫莉也节衣缩食、牺牲奉献。但她同时充满欢乐、欲望与主见；用意第绪语说，她更像个&quot;baleboste&quot;——全能的女当家。她昂首挺胸地存在，而非畏缩退让。</p><p>伯格也是如此——她左倾的政治立场正是这股力量的一部分。三十年代中期，她重新协商合同以获得更大的创作掌控权；渐渐地，她在节目对话中注入了支持工人、拥护新政的主题。当煽动者考夫林神父用反犹仇恨言论充斥电台广播时，伯格提供了对抗性节目。1933 年，伯格制作了一期堪称&quot;特别篇&quot;的节目：由真正的领唱者吟诵的完整逾越节家宴，其赞助商白速得同意不加插广告播出。这次公关举措取得了成效：一封电报写道：&quot;正如白速得能消毒杀菌，您的广播节目也消除了仇恨，让人类更紧密团结。&quot;六年后，伯格播出了更具针对性的逾越节特辑，剧中暴徒向戈德堡家窗户投掷石块——影射几个月前发生的&quot;水晶之夜&quot;。在家宴场景中，莫莉将解放思想比作风，一种无处不在、无法遏制的无形力量，即便面对法西斯主义也不例外。</p><p>犹太听众给她写来充满自豪的信件——有些人在自家逾越节家宴时也开着收音机。一位听众不无黑色幽默地开玩笑说，希望《戈德堡一家》不会助长她社区里&quot;希特勒分子&quot;的气焰。但非犹太裔粉丝同样以复杂的准社会亲密感给伯格写信，常常倾诉他们对她&quot;种族&quot;的感受。一位 W·D·阿雷纳太太写道，在科罗拉多旅行期间&quot;与他们相处&quot;后，她&quot;学会了高度尊重他们&quot;；有位女儿在医院工作的女士向伯格保证，贫穷的犹太患者是最懂得感恩的群体。一位特别多产的主教派超级粉丝 C·M·福尔克纳像现代剧评人般对剧情发表见解，并就犹太男性商业头脑的根源提出了几个令人毛骨悚然的理论。来自芝加哥的弗兰克·R·詹宁斯在附言中可爱地模仿了莫莉的口音：&quot;请原谅打字机，它今天不太舒服，别问我为什么，我也不知道为啥咧。&quot;</p><p>对这两类观众而言，这部剧由犹太人制作的事实至关重要。&quot;我相信你是真正的犹太人，&quot;一位观众热情地说道；另一位则描述了她与丈夫关于伯格族裔的争论，丈夫怀疑她可能是假装的。然而，真实性问题始终敏感：1933 年，当伯格辞退了一位临时顶替罗莎莉角色的非犹太裔女演员后，该演员的母亲向白速得公司投诉，导致八卦专栏作家沃尔特·温切尔公开谴责伯格：&quot;希特勒的受害者竟用希特勒的手段？可耻！&quot;</p><p>丑闻刺痛人心，负面舆论向来如此。在广播界，广告商拥有最终决定权。但伯格自有她的武器。尽管收视率居高不下，《戈德堡一家》仍多次面临停播危机：她的上司们（包括且常常尤其是犹太裔主管）始终对剧中直白的族裔表达和政治立场感到不适。每次危机时刻，伯格都凭借粉丝支持化险为夷：剧集播出初期，有次她因病缺席几集，数千封关切信件如雪片般涌来。正如媒体历史学家卡罗尔·斯塔比尔在 2008 年讲座《红色网络：女性作家与广播黑名单》中所写：&quot;正是听众群体的热爱——伯格本人也反复借此为节目辩护——才让它得以持续播出。&quot;</p><hr/><p>《戈德堡一家》于 1945 年停播，官方说法是因收视率低迷，但伯格家族怀疑政治因素才是主因——哥伦比亚广播公司内部曾流传一份备忘录，将曾为罗斯福助选的伯格列为总统支持者之一。此后伯格一度在演艺圈陷入沉寂，期间开发了其他项目，包括一档&quot;黑人秀&quot;和改编自漫画《佩妮》的剧集（讲述一位白人新教徒青少年的故事）。她此前还试水过《玻璃屋》，在剧中饰演截然不同的角色：卡茨基尔山区家族酒店经理贝茜·格拉斯，一位&quot;干练高效的现代典范&quot;。但彼时观众已难以接受她演绎莫莉以外的任何形象。</p><p>1948 年，伯格将百老汇戏剧《我和莫莉》搬上舞台后，随即带着情景喜剧版《戈德堡一家》的翻拍企划接洽新成立的电视网。当时电视机仍是昂贵的新奇玩意，观众群体规模有限且集中在都市；几乎所有电视节目都改编自广播、戏剧和杂耍表演。手握如此诱人的 IP，伯格自信能获得放行许可，但令她震惊的是，竟无人问津——连哥伦比亚广播公司也不例外。凭着莫莉式的胆识，她据理力争，坚持要与老上司威廉·S·佩利会面。佩利最终让步，而伯格几乎立刻就被证明是正确的：1949 年 1 月 10 日《戈德堡一家》电视首播便大获成功，通用食品公司随即签下赞助合约。</p><p>伯格在荧幕上散发着魅力，每集开场时她都会坐在莫莉公寓的窗口，直接向家庭观众倾诉桑卡咖啡的好处：&quot;睡眠都留在杯里啦！&quot;直播电视比制作广播节目更加惊心动魄——就像每周都要上演一部全新的百老汇戏剧——但长时间的付出终有回报，伯格帮助塑造了电视喜剧的关键元素，包括邻居们突然闯进门的情景。伯格与勒布之间迸发着动态火花，演绎出长久婚姻的温情，既带着怀疑又饱含柔情。意第绪语戏剧明星伊莱·明茨用尖细谄媚的嗓音饰演大卫叔叔，双手比划得令人眼花缭乱，而戈德堡家的孩子们则由非犹太裔演员扮演，包括可爱的阿琳（&quot;Fuzzy&quot;）·麦奎德饰演初中生罗莎莉——一个留着利落波波头的勤奋女孩。该剧的标志性镜头中，邻居们隔着通风井从各自窗口闲话家常，声音此起彼伏。这些场景凸显了莫莉&quot;从我们家到你们家&quot;（她常这么说）的说话天赋。</p><p>这些早期剧集中仅有少数几集得以留存，它们通过对着电视屏幕拍摄的显像管录像保存下来。其中一集于 1949 年 9 月播出，讲述了戈德堡一家遇到一位冷漠的新房东的故事。当莫莉和杰克争论如何应对问题时，怒气冲冲的杰克像挥舞指挥棒般晃动着手指，主张发起租金罢工——他撕毁租金支票，号召整栋楼联合抗议（激昂陈词时还蹦出莫莉式口误：&quot;无知占法律的十分之九！&quot;）。作为家中的温和派，莫莉主张把房东当&quot;人&quot;对待，甚至准备了生日蛋糕。这场戏以荒诞闹剧的形式呈现，大卫叔叔用电梯故障的挖苦打断莫莉的甜言蜜语，但政治隐喻昭然若揭。尽管莫莉的人文主义通常能力挽狂澜，但这次杰克确有道理：试图妥协的莫莉阴差阳错地把租金谈涨了两美元。</p><p>与那个时期的许多电视节目一样，整部作品洋溢着讨喜的业余感：有个滑稽桥段里，油漆工在墙上刷了一连串新颜色，这个笑点没能奏效（或许因为彩色电视还要五年后才问世）。但这集完美呈现了该剧层次丰富的基调——将疯癫喜剧与对工薪阶层日常烦恼的真挚关怀融为一体，正是这些琐碎戏剧构成了人生。节目对劳工权益的关注也延伸至幕后：伯格聘请了伯尔·艾夫斯、加森·卡宁等左翼风云人物客串演出，更在广播和电视上打破肤色界限，启用黑人女演员兼民权活动家弗雷迪·华盛顿。1950 年，《戈德堡一家》还带头发起技术人员罢工，迫使哥伦比亚广播公司临时更换节目。伯格本人已是百万富翁，坐拥公园大道豪宅与贝德福德山庄别墅。但她的作品却吸引着另一类人群：那些经常光顾格林尼治村种族融合夜店&quot;咖啡公社&quot;的波西米亚主义者。 四十年代末，当电视本身还是一面未经粉刷的白墙时，这些理想主义者仍觉得有可能定义这个媒介，讲述那些在好莱坞会遭审查的故事类型。</p><p><img src="https://media.newyorker.com/photos/68406cf01d56c0f5feaf22d9/master/w_1600,c_limit/r46849.jpg" alt="《戈德堡一家》的演员阵容。右侧的菲利普·洛布在被反共人士针对并迫使其离职后，始终未能恢复元气。乔治·卡格尔摄。 / Getty"/></p><p>这个艺术圈子里还有洛布，他是一位资深演员兼导演，曾在百老汇饰演过杰克一角。这位一战老兵曾参与创作过一部马克思兄弟的电影，同时也是工会运动的积极倡导者，致力于改善戏剧工作者的生活境遇。在四十年代末掀起的第二次红色恐慌——麦卡锡主义风潮中，他自然成为了靶子。这场运动由一群以&quot;美国商业顾问&quot;为名活动的前联邦调查局特工主导。1947 年，这些前政府探员开始发行名为《反击》的通讯刊物，实质上是针对电影行业的反共黑名单手册；理论上他们的目标是共产党员，但实际上打击范围扩大到所有支持黑人公民权利或工会组织的人士，任何被怀疑是同性恋或传播&quot;颠覆性&quot;思想的人都难逃罗网。当国会传唤这些目标人物到非美活动调查委员会（HUAC）作证时，以&quot;好莱坞十君子&quot;为代表的一批创作者拒绝&quot;告密&quot;。他们遭到行业封杀，并因藐视国会罪入狱。数百名艺术家逃往欧洲或隐姓埋名，用化名继续创作。</p><p>电视产业当时规模尚小，还未成为重要目标。事实上，1949 年当美国商业顾问公司向通用食品公司和哥伦比亚广播公司高管施压，威胁若不订阅《反击》刊物就曝光洛布的名字时，两家公司直接拒绝了。一年后，风云突变。彼时《戈德堡一家》正如日中天：伯格获得最佳女主角提名，剧组趁暑假在洛杉矶拍摄了衍生电影《莫莉》。随后厄运降临。六月，《反击》出版了《红色频道：广播与电视界的共产主义渗透报告》，封面赫然印着一只红色魔爪攥住黑色话筒的图案。这份粗制滥造的汇编将含沙射影的指控包装成事实，堪称当时的&quot;Libs of TikTok&quot; <a href="#1"><sup>1</sup></a>。书中列出了娱乐业 151 人的黑名单，其中多数供职于哥伦比亚广播公司——菲利普·洛布的名字赫然在列。</p><p>这份文件虽无法律效力，但影响立竿见影：突然之间，《红色频道》名单上的所有人及其关联者都陷入危险。九月，通用食品公司给伯格两天时间解雇菲利普·洛布。他拒绝接受遣散费——他告诉她，他要抗争——而她支持他，拥抱着他说：&quot;我会站在你这边。&quot;伯格坚守这个承诺长达一年半，通过拖延战术与电视台高层和赞助商周旋，期盼危机自行消散。就像过去常做的那样，她将忠实观众作为筹码，威胁发起全国抵制通用食品的运动。威胁虽见效，但喘息只是暂时的。</p><p>随着压力不断累积，伯格陷入了绝望。她曾一度求助于纽约最臭名昭著的权力掮客——弗朗西斯·斯佩尔曼枢机主教。这位著名的反共人士在黑名单时期兼任政治危机调解人，据传他曾为天主教徒电视主持人埃德·沙利文出面，帮助过莉娜·霍恩与哈里·贝拉方特。但伯格这次却碰了壁：斯佩尔曼只是用空话敷衍她。</p><p>当时 CBS 已停播《戈德堡一家》，换上了原本计划与伯格节目搭档播出的《我爱露西》。伯格转投 NBC，但没有赞助商愿意接受剧组里有洛布参演。最终在 1952 年 1 月，她妥协了。洛布获得优厚补偿——节目播出期间可领取原薪资的 90%，这笔钱对他至关重要，因为他是住在精神病院的患精神分裂症儿子的唯一经济支柱。他发表声明解除了伯格的责任；作为回应，她也发表支持性声明，表示从不相信他是共产主义者。但这仍是痛苦的决裂。失业的洛布寄居在好友兼同遭黑名单迫害的泽罗·莫斯特尔家中，陷入抑郁深渊。1955 年，他入住塔夫脱酒店后吞服过量药片自杀。</p><p>在《当女性发明电视》一书中，阿姆斯特朗描述了自己探访雪城大学档案馆的经历，那里仅存一个关于洛布的薄薄文件夹。她绞尽脑汁也想不出这个故事的更好结局，或是其他转圜余地。伯格本可以发起那场抵制行动，而非仅仅发出威胁？倘若她与其他受害者联手——比如咖啡馆协会的明星黑兹尔·斯科特（这位与众多黑人艺术家一样被列入《红色频道》名单，最终遭遇悲惨结局）——麦卡锡时代会提前终结吗？抑或《戈德堡一家》只会更快被停播？尤其是在曾经最开明的 CBS 电视台开始要求员工签署效忠誓言之后。阿姆斯特朗写道，洛布的黑名单事件成为&quot;电视业要求顺从的最早且最不祥的征兆之一&quot;。</p>
<hr/><p>当《戈德堡一家》在 1956 年播出最后一集时，伯格已深谙那个时代的生存法则。在该剧收官之年，她在《评论》杂志的采访中直白道出这种现实政治：&quot;亲爱的你看，我从不提及任何会让人不安的话题。这非常重要——工会、政治、募捐、犹太复国主义、社会主义、族群关系。我从不强调这些。说到底，这些不都是日常家庭生活的次要品吗？&quot;她解释道，戈德堡一家虽是犹太人，但对此既不会&quot;如临大敌&quot;，也非&quot;刻意强调&quot;自己的族裔身份。何况饰演罗莎莉和萨米的演员&quot;只是相貌普通的年轻人，并非犹太裔&quot;。尽管该剧曾名为《戈德堡家的崛起》，但男主角杰克永远不会像他的创造者那样飞黄腾达。&quot;我保持平凡，&quot;伯格坦言，&quot;不想失去朋友。&quot;</p><p>此时，《戈德堡一家》正在联合播出，因电视台的修改意见而变得平淡无味。这个家庭搬到了名为哈弗维尔的康涅狄格郊区，莫莉在那里看起来像个异族外人，连个通风井都没得喊话；杰克这个角色也换了新演员——先是哈罗德·J·斯通，后是罗伯特·H·哈里斯——他们散发出更冷淡疏离的气质，更接近《父亲最懂》里的爸爸形象。1952 年，报业专栏作家约翰·克罗斯比——那个时代对广播和电视最犀利的观察者——写了一篇尖锐的报道，将重启的剧集描述为&quot;极度压抑，吸金能力下降，男主角缺席，形式大改&quot;。克罗斯比对伯格令人烦恼的处境表示同情，但更同情洛布，他将洛布描绘成悲剧性的孤立者，被一个如此害怕争议以至于连解雇他的勇气都没有的行业抛弃：&quot;赞助商没有抗争；他们只是悄然退出，直到洛布出局。&quot;</p><p>在《戈德堡一家》的最后几年里，新主题开始渗透进剧情，其中包括一种将问题归咎于母亲的弗洛伊德式倾向。&quot;我们美丽的罗莎莉是只丑小鸭？是我给了她心理阴影，&quot;莫莉在一集关于女儿想整鼻子的剧情中哀叹。她惊恐地发现自己的&quot;唠叨、唠叨、唠叨&quot;可能导致女儿的&quot;潜意识心灵&quot;&quot;受到创伤&quot;，于是开始对罗莎莉大加赞美，并密谋与整形医生合作让女儿改变主意。这个俏皮曲折的情节充满了矛盾，最明显的是罗莎莉由麦克奎德饰演——她的鼻子小巧如纽扣。当莫莉反复追问&quot;罗莎莉的鼻子到底有什么问题？&quot;时，没人敢说&quot;它看起来太犹太了&quot;——在海弗维尔，有些话终究不能说出口。</p><p>伯格从未停止工作，始终在为自己的才华寻找新的舞台。1959 年，她在独立电视制作《肖洛姆·阿莱赫姆的世界》中饰演一位儿子遭遇反犹配额歧视的俄罗斯母亲，这部充满欢乐的作品由包括莫斯泰尔在内的黑名单艺术家执导并出演。同年，她在百老汇大获成功，凭借《多一票》赢得托尼奖，剧中她饰演一位与日本男子相恋的犹太寡妇。1961 年，伯格在电视剧《G 夫人上大学》中获得了最后一次电视演出机会——这部平淡无奇的剧集里，她饰演萨拉·格林，一个在清纯女大学生中显得格格不入的神秘犹太女性。同年，她与长期合作的儿子切尼合著出版了回忆录《莫莉与我》。书中她浓墨重彩地描述了与佩利的对峙，却对黑名单只字未提。关于洛布仅有一句描述，称其为&quot;百老汇和电影界的老兵&quot;。</p><p>此时，莫莉·戈德堡的生存空间已如裁剪过小的礼服般局促。电视行业充斥着性别与年龄歧视；《戈德堡一家》停播后，高管们对任何被视作&quot;太犹太&quot;的内容也充满抵触。正如大卫·祖拉维克在《黄金时段犹太人》一书中指出，直到 1972 年，黄金时段电视网才再次出现明确以犹太人为主角的剧集。伯格最受喜爱的创作被同化后的犹太精英视为老套的怀旧符号——建筑师弗兰克·戈德堡因妻子厌恶这个姓氏的联想，将名字改为了盖里。</p><p>与此同时，意第绪母亲以一种阴郁的新形象卷土重来。在伍迪·艾伦和菲利普·罗斯等犹太艺术家的作品中，她被简化为笑料——更糟的是，沦为龙套角色。到了二十世纪六十年代，犹太女性很少被塑造成主角，即便出现也常是刻板印象中的恶毒形象：被宠坏的公主、相貌平庸的丑女、阉割儿子的母亲。1965 年，美国非虚构类畅销书榜首是丹·格林伯格的讽刺自助手册《如何成为犹太母亲》，充斥着陈腐的笑话。伯格粉丝最后一次听到她的声音，是她在这本书的有声专辑里念着格林伯格的台词。该书的百老汇改编剧正在筹备中；1966 年伯格因心力衰竭去世后，意第绪剧院传奇人物莫莉·皮肯接演了这个角色。</p><p>我在 Spotify 上搜寻那张专辑时，偶然发现了伯格去世前不久接受的一次采访，这似乎是这位制片人与她最明显的历史同行露西尔·鲍尔之间唯一有记录的互动。当时还有几位开创性的女性节目制作人，比如佩格·林奇，她机智的情景喜剧《埃塞尔与阿尔伯特》在《戈德堡一家》播出后不久就登上了电视荧幕。但在一个教导女性将彼此视为竞争的文化中，团结并不容易实现：来自明尼苏达州、时髦且年轻有为的林奇不喜欢伯格，她觉得伯格在编剧协会会议上冷落了她，可能是因为林奇挖走了伯格的电视导演沃尔特·哈特来执导她的节目——又或者是因为拥有自己节目版权的林奇认为工会毫无用处。</p><p>因此，当听说伯格要与露西尔·鲍尔——这位在她之后大放异彩的喜剧天才——对谈时，我兴奋不已。采访当时，鲍尔正主演她的第二部情景喜剧《露西秀》，并在拍摄间隙录制一档名为《和露西聊聊》的轻松短篇广播节目，期间她采访了米兹·盖娜等明星。对话开始几分钟后，鲍尔误将嘉宾称为&quot;莫莉&quot;，随即意识到口误，但伯格宽慰说人人都会犯这种错。&quot;我几乎分不清哪个是角色，哪个是自己，&quot;伯格说道，&quot;知道三十二年前创造的角色至今仍活在人们心中，这非常令人欣慰，明白吗？这让我无比快乐。莫莉是个可爱的人儿。&quot;</p><p>聊完伯格在弗莱施曼斯镇的少女时光后，露西突然将话题转向家庭生活：&quot;格特鲁德，你现在的家庭生活是怎样的？&quot;伯格谈起她对旅行的热爱，以及去洛杉矶的旅程。她手头有部话剧在筹备，还有部音乐剧——日程排得满满当当。但不知何故，对话总是不由自主地绕回她们作为妻子与母亲的角色。</p><p>&quot;应该加强纪律性，&quot;伯格对鲍尔说道。</p><p>&quot;你认为丈夫应该成为家庭的绝对主宰吗？&quot;鲍尔以鼓励的口吻问道。</p><p>伯格给出了肯定的回答：&quot;我认为这会产生天壤之别。&quot;</p><p>她们是美国最富有、最具商业头脑的两位女性。伯格几乎以一己之力在大萧条前夕开创了家庭情景喜剧，并将其搬上电视荧屏；鲍尔则将该类型剧推向巅峰，协助制作中心西迁至洛杉矶，并首创了重播模式与三机位拍摄法。两人都塑造过标志性的主妇形象，不过莫莉与露西·里卡多形成鲜明对比：前者是问题解决者，后者则像爆竹般易怒，常因恶作剧般的暴脾气被乐队指挥丈夫打屁股管教。她们都挺过了麦卡锡时代：1953 年，鲍尔因 1936 年以共产党员身份登记选民而接受非美活动调查委员会问询，声称此举只为安抚信奉社会主义的外祖父。（其丈夫兼搭档德西·阿纳兹曾对现场观众说：&quot;露西身上唯一的红色是她的头发，就连这颜色都是染的。&quot;）</p><p>这些话题都没能进入对话。相反，鲍尔询问伯格是否和她一样认为&quot;许多男人已经放弃——甚至不是不情愿地——而是就这么...松开了缰绳&quot;。</p><p>&quot;哎呀，因为女人接管了啊！&quot;伯格说，&quot;女性都走出去了，职业女性都在社会上打拼——我觉得这有很大关系。现在女人说&#x27;我只是个家庭主妇&#x27;时都会觉得难为情！&quot;</p><p>&quot;她们不该这样！&quot;鲍尔说。</p><p>&quot;当然不该！&quot;伯格说，&quot;还有什么事业比养育一个家庭更伟大呢？&quot;</p><p>听着这段对话让我感到不安，近来我常有这种感觉。这像是一场表演，尽管很难说清表演对象是谁。可能是嫉妒她们成功的家庭主妇？掌控行业的男性？亦或是彼此之间？历史总是如此，而那些被历史遗漏的部分——那些在剪辑中被删减、在对话中被压制的真相。伯格的故事被淡忘有许多原因，包括她剧集的大部分内容未能重播。或许她只是英年早逝，来不及被下一代女性重新发现并奉为楷模。</p><p>但还有一个事实是，尽管伯格成就非凡，她的人生却难以被包装成温馨励志的故事——那种对纯真年代的怀旧，正如五十年代情景喜剧在数十年后被当作纪录片般对待，它们对美国家庭的狭隘描绘被保守派挪用，仿佛那真是人们共同的童年记忆。伯格在回忆录中删去了最不堪的片段，随着岁月流逝，她身边的人们也选择了遗忘。这又能怪谁呢？在黑名单最猖獗的时期，电视台高管怯懦退缩；赞助商毫不犹豫地撤资。如今这类事随处可见：大学、报社、律师事务所。艰难时世从不会留下轻松的史笔。但解放的思想如风，吹遍每个角落。♦</p><p><em>本文早期版本对沃尔特·温切尔谴责伯格时的政治立场描述有误。</em></p><p><em>刊登于《纽约客》印刷版，标题为《情景喜剧之母》。作者 <a href="https://www.newyorker.com/contributors/emily-nussbaum">Emily Nussbaum</a> 为《纽约客》特约撰稿人，2016 年荣获普利策批评奖。她著有《我爱看电视：在电视革命中思辨前行》与《阳光登场！真人秀的发明》两部作品。</em></p><p><em>文章借助<a href="https://immersivetranslate.com/zh-Hans/">沉浸式翻译</a>和 <a href="https://www.deepseek.com">deepseek</a> 翻译</em></p></div><footer><div id="1">1<!-- -->: Libs of TikTok 是一个由前房地产经纪人 Chaya Raichik 经营的各种极右翼和反 LGBT 社交媒体账号名称。</div></footer></div><p style="text-align:right"><a href="https://semejen.com/posts/newyorker/the-forgotten-inventor-of-the-sitcom#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/newyorker/the-forgotten-inventor-of-the-sitcom</link><guid isPermaLink="true">https://semejen.com/posts/newyorker/the-forgotten-inventor-of-the-sitcom</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sat, 19 Jul 2025 08:36:10 GMT</pubDate></item><item><title><![CDATA[Java Coding Tips]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/java/test2">https://semejen.com/posts/java/test2</a></blockquote><div><h1 id="java-coding-tips">Java Coding Tips</h1><h2 id="use-less-targetsetxxsourcegetxx">Use less target.setXX(source.getXX)</h2><pre class="language-java lang-java"><code class="language-java lang-java">// when you want to use less target.setXX(source.getXX), same name
BeanUtils.copyProperties(source, target)
</code></pre><h2 id="manipulate-array">Manipulate Array</h2><h3 id="copy-array">copy array</h3><pre class="language-java lang-java"><code class="language-java lang-java">//  most efficient(recommend)
void System.arraycopy(int[] srcArr, int srcBeginPos, int[] resArr, int resBeginPos, int length)
  
int[] Arrays.copyOfRange(int[] array, int start, int end)
  
// to increase array size, idle will be fullfilled with 0
int[] Arrays.copyOf(int[] srcArr, int newArrLength)
</code></pre><h3 id="array---list">array -&gt; list</h3><pre class="language-java lang-java"><code class="language-java lang-java">int[] ints = {1,2,3};
List&lt;Integer&gt; list = Arrays.stream(ints).boxed().collect(Collectors.toList());
</code></pre><h3 id="list---array">list -&gt; array</h3><pre class="language-java lang-java"><code class="language-java lang-java">String[] strings = list.stream().toArray(String[]::new);
Array&lt;Integer&gt; list = {0, 1, 2};
int[] array = list.stream().mapToInt(Integer::intValue).toArray()
</code></pre><h3 id="distinct-array">distinct array</h3><pre class="language-java lang-java"><code class="language-java lang-java">arr = Arrays.stream(arr).distinct().toArray();
</code></pre><h3 id="sort-object-array-in-descending-order">sort object array in descending order</h3><pre class="language-java lang-java"><code class="language-java lang-java">Integer[] cubes = new Integer[] { 8, 27, 64, 125, 256 }; Arrays.sort(cubes, Collections.reverseOrder());

Read more: https://www.java67.com/2016/07/how-to-sort-array-in-descending-order-in-java.html#ixzz8Greh6ggX
</code></pre><h3 id="sort-primitive-array-in-descending-order">sort primitive array in descending order</h3><pre class="language-java lang-java"><code class="language-java lang-java">Arrays.sort(arr);
int n = arr.length;
int temp;
for(int i = 0; i &lt; n/2; i++) {
    temp = arr[i];
    arr[i] = arr[n - i - 1];
    arr[n - i - 1] = temp;
}
</code></pre><h3 id="get-maxmin-of-an-array">Get max/min of an array</h3><pre class="language-java lang-java"><code class="language-java lang-java">Arrays.stream(arr).max().getAsInt();
</code></pre><h3 id="hashset-to-list">HashSet to List</h3><pre class="language-java lang-java"><code class="language-java lang-java">Set&lt;Integer&gt; set = new HashSet();
set.add(1);
set.add(2);
List&lt;Integer&gt; list = set.stream().collect(Collectors.toList());
// when specify the type of list use toCollection(ArrayList::new)
set.stream().collect(Collectors.toCollection(ArrayList::new));
</code></pre><h2 id="bit-manipulate">Bit Manipulate</h2><p>get highest int</p><pre class="language-java lang-java"><code class="language-java lang-java">Integer.highestOneBit(int n);
</code></pre>
<p>set k-th bit as 0</p><pre class="language-java lang-java"><code class="language-java lang-java">n = ~ (1 &lt;&lt; k) &amp; n;
</code></pre>
<p>traverse all possibilties of set bits</p><pre class="language-java lang-java"><code class="language-java lang-java">for (int submask = mask; submask &gt;= 0; submask = (submask - 1) &amp; mask) {
    // todo something
}
</code></pre><h2 id="use-optional-in-java">Use Optional in Java</h2><blockquote class="markdown-alert-tip"><header>TIP</header>
<ol start="1"><li>可以在返回值里使用 optional ，提醒调用方这里返回的值可能为空，包装成 optional 对象就是强制要求调用者对空值情况进行判断处理。</li><li>连续取值。比如你接到一个层级很复杂的 json 对象，将其转换成 map 结构，一层一层的 get 需要判断 null ，用 Optional 的话，就算是内嵌深度是 10 层，也能用一行 optional 解决，避免出现嵌套 10 层 if-else 判断</li></ol></blockquote>
<p>需要从一个对象连续获取值的时候</p><pre class=""><code class="">String username = Optional.ofNullable(people).map(People::getName).orElse(null);
</code></pre>
<h2 id="arithmetic">Arithmetic</h2><h3 id="ceil">ceil</h3><pre class="language-java lang-java"><code class="language-java lang-java">// both a and b &gt; 0, faster than
// res = x / y + (x % y != 0 ? 1 : 0);
res = (a + b - 1)/b

// more commonly, use 
(int)Math.ceil((double)a/b);
// or
(int)Math.ceil(a*1.0/y);
</code></pre>
<h2 id="operator-precedence-in-java">Operator Precedence in Java</h2><table><thead><tr><th> Level  </th><th> Operator                                               </th><th> Description                                                  </th><th> Associativity </th></tr></thead><tbody><tr><td> <strong>16</strong> </td><td> <code>()</code> <code>[]</code> <code>.</code>                                          </td><td> parentheses array access member access                       </td><td> left-to-right </td></tr><tr><td> <strong>15</strong> </td><td> <code>++</code> <code>--</code>                                              </td><td> unary post-increment unary post-decrement                    </td><td> left-to-right </td></tr><tr><td> <strong>14</strong> </td><td> <code>+</code> <code>-</code> <code>!</code> <code>~</code> <code>++</code> <code>--</code>                              </td><td> unary plus unary minus unary logical NOT unary bitwise NOT unary pre-increment unary pre-decrement </td><td> right-to-left </td></tr><tr><td> <strong>13</strong> </td><td> <code>()</code> <code>new</code>                                             </td><td> cast object creation                                         </td><td> right-to-left </td></tr><tr><td> <strong>12</strong> </td><td> <code>*</code> <code>/</code> <code>%</code>                                                </td><td> multiplicative                                               </td><td> left-to-right </td></tr><tr><td> <strong>11</strong> </td><td> <code>+ -</code> <code>+</code>                                              </td><td> additive string concatenation                                </td><td> left-to-right </td></tr><tr><td> <strong>10</strong> </td><td> <code>&lt;&lt; &gt;&gt;</code> <code>&gt;&gt;&gt;</code>                                          </td><td> shift                                                        </td><td> left-to-right </td></tr><tr><td> <strong>9</strong>  </td><td> <code>&lt; &lt;=</code> <code>&gt; &gt;=</code> <code>instanceof</code>                             </td><td> relational                                                   </td><td> left-to-right </td></tr><tr><td> <strong>8</strong>  </td><td> <code>==</code> <code>!=</code>                                              </td><td> equality                                                     </td><td> left-to-right </td></tr><tr><td> <strong>7</strong>  </td><td> <code>&amp;</code>                                                    </td><td> bitwise AND                                                  </td><td> left-to-right </td></tr><tr><td> <strong>6</strong>  </td><td> <code>^</code>                                                    </td><td> bitwise XOR                                                  </td><td> left-to-right </td></tr><tr><td> <strong>5</strong>  </td><td> <code>|</code>                                                    </td><td> bitwise OR                                                   </td><td> left-to-right </td></tr><tr><td> <strong>4</strong>  </td><td> <code>&amp;&amp;</code>                                                   </td><td> logical AND                                                  </td><td> left-to-right </td></tr><tr><td> <strong>3</strong>  </td><td> <code>||</code>                                                   </td><td> logical OR                                                   </td><td> left-to-right </td></tr><tr><td> <strong>2</strong>  </td><td> <code>?:</code>                                                   </td><td> ternary                                                      </td><td> right-to-left </td></tr><tr><td> <strong>1</strong>  </td><td><code>=</code> <code>+=</code> <code>-=</code> <code>*=</code> <code>/=</code> <code>%=</code> <code>&amp;=</code> <code>^=</code> <code>|=</code> <code>&lt;&lt;=</code> <code>&gt;&gt;=</code> <code>&gt;&gt;&gt;=</code> </td><td> assignment                                                   </td><td> right-to-left </td></tr><tr><td> <strong>0</strong>  </td><td> <code>-&gt;</code>                                                   </td><td> lambda expression arrow                                      </td><td> right-to-left </td></tr></tbody></table></div><p style="text-align:right"><a href="https://semejen.com/posts/java/test2#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/java/test2</link><guid isPermaLink="true">https://semejen.com/posts/java/test2</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sun, 06 Jul 2025 12:59:07 GMT</pubDate></item><item><title><![CDATA[A Thrilling Italian American Joint Points Backward and Forward]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/default/test">https://semejen.com/posts/default/test</a></blockquote><span>Memory is a powerful attractant, even if the memory isn’t our own. Something draws us inexorably to nostalgia, to the soft focus of hindsight, the comforting narrative completeness that can be found in the rearview. This is never more true than at a restaurant, where you sit inside the story, smell the story, eat the story. For all of its allure, though, nostalgia is a tricky element for a restaurant to trade in, and a risky thing to rely on. Storytelling can get people in the door, it can set the mood, but it’s not the same thing as substance: a restaurant has to be good as a restaurant, not just a set piece, to get you telling your friends about it, or to get you back a second time.</span><p style="text-align:right"><a href="https://semejen.com/posts/default/test#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/default/test</link><guid isPermaLink="true">https://semejen.com/posts/default/test</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sun, 06 Jul 2025 12:31:04 GMT</pubDate></item><item><title><![CDATA[Methods of TreeMap in Java]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/java/methods-of-treemap-in-java">https://semejen.com/posts/java/methods-of-treemap-in-java</a></blockquote><div><p>Java&#x27;s <code>TreeMap</code> class provides a variety of methods for managing and accessing key-value pairs in a sorted manner. Here are some of the key methods:</p><h1 id="basic-operations">Basic Operations</h1><ul><li><code>put(K key, V value)</code>: Inserts a mapping from the specified key to the specified value.</li><li><code>get(Object key)</code>: Returns the value associated with the specified key, or null if the key is not found.</li><li><code>remove(Object key)</code>: Removes the mapping for the specified key from the map.</li><li><code>containsKey(Object key)</code>: Returns true if the map contains a mapping for the specified key, false otherwise.</li><li><code>containsValue(Object value)</code>: Returns true if the map maps one or more keys to the specified value, false otherwise.</li><li><code>clear()</code>: Removes all mappings from the map.</li><li><code>size()</code>: Returns the number of key-value mappings in the map.</li><li><code>isEmpty()</code>: Returns true if the map contains no key-value mappings, false otherwise.</li></ul><h1 id="sorted-map-specific-methods">Sorted Map Specific Methods</h1><ul><li><code>firstKey()</code>: Returns the first (lowest) key currently in the map.</li><li><code>lastKey()</code>: Returns the last (highest) key currently in the map.</li><li><code>firstEntry()</code>: Returns a Map.Entry associated with the least key in the map.</li><li><code>lastEntry()</code>: Returns a Map.Entry associated with the greatest key in the map.</li><li><code>pollFirstEntry()</code>: Removes and returns a Map.Entry associated with the least key in the map.</li><li><code>pollLastEntry()</code>: Removes and returns a Map.Entry associated with the greatest key in the map.</li></ul><h1 id="navigable-map-specific-methods">Navigable Map Specific Methods</h1><p>(for range-based operations)</p><ul><li><code>lowerEntry(K key)</code> / <code>lowerKey(K key)</code>: Returns the entry/key associated with the greatest key strictly less than the given key.</li><li><code>floorEntry(K key)</code> / <code>floorKey(K key)</code>: Returns the entry/key associated with the greatest key less than or equal to the given key.</li><li><code>ceilingEntry(K key)</code> / <code>ceilingKey(K key)</code>: Returns the entry/key associated with the least key greater than or equal to the given key.</li><li><code>higherEntry(K key)</code> / <code>higherKey(K key)</code>: Returns the entry/key associated with the least key strictly greater than the given key.</li><li><code>subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)</code>: Returns a view of the portion of the map whose keys range from fromKey to toKey.</li><li><code>headMap(K toKey, boolean inclusive)</code>: Returns a view of the portion of the map whose keys are less than (or equal to, if inclusive is true) toKey.</li><li><p><code>tailMap(K fromKey, boolean inclusive)</code>: Returns a view of the portion of the map whose keys are greater than (or equal to, if inclusive is true) fromKey.</p><h1 id="view-methods">View Methods</h1></li><li><code>keySet()</code>: Returns a Set view of the keys contained in the map.</li><li><code>values()</code>: Returns a Collection view of the values contained in the map.</li><li><code>entrySet()</code>: Returns a Set view of the mappings contained in the map.</li><li><code>navigableKeySet()</code>: Returns a NavigableSet view of the keys contained in the map.</li><li><code>descendingKeySet()</code>: Returns a NavigableSet view of the keys contained in the map in descending order.</li><li><code>descendingMap()</code>: Returns a reverse order view of the mappings contained in the map.</li></ul></div><p style="text-align:right"><a href="https://semejen.com/posts/java/methods-of-treemap-in-java#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/java/methods-of-treemap-in-java</link><guid isPermaLink="true">https://semejen.com/posts/java/methods-of-treemap-in-java</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sat, 09 Nov 2024 08:37:40 GMT</pubDate></item><item><title><![CDATA[【转载】ZGC 收集器简介]]></title><description><![CDATA[<link rel="preload" as="image" href="https://celloo.synology.me:8407/2024/05/12_image-20240512171804313.png"/><link rel="preload" as="image" href="https://celloo.synology.me:8407/2024/05/11_image-20240511210631360.png"/><link rel="preload" as="image" href="https://celloo.synology.me:8407/2024/05/11_image-20240511220240490.png"/><link rel="preload" as="image" href="https://celloo.synology.me:8407/2024/05/12_image-20240512194448779.png"/><link rel="preload" as="image" href="https://celloo.synology.me:8407/2024/05/12_image-20240512194607676.png"/><div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/java/zgc">https://semejen.com/posts/java/zgc</a></blockquote><div><blockquote><p>ZGC 收集器是一款基于 Region 内存布局的，(暂时) 不设分代的，使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记 - 整理算法的，以低延迟为首要目标的一款垃圾收集器。</p></blockquote>
<h2 id="zgc">ZGC的内存布局</h2><p>与 Shenandoah 和 G1 一样，ZGC 也采用基于 Region 的堆内存布局，但与它们不同的是，ZGC 的 Page 具有动态性——动态创建和销毁，以及动态的区域容量大小。在 x64 硬件平台下，ZGC 的 Page 可以具有如下图所示的大、中、小三类容量：</p><ul><li>小型 Page (Small Page)：容量固定为 2 MB，用户放置小于 256 KB 的小对象。</li><li>中型 Page (Medium Page)：容量固定为 32 MB，用于放置大于等于 256 KB 但小于 4 MB 的对象。</li><li>大型 Page (Large Page): 容量不固定，可以动态变化，但必须为 2 MB 的整数倍，用于放置 4 MB 或以上的大对象。每个大型 Region 中只会存放一个大对象，这也预示着虽然名字叫做“大型 Page ”，但它的实际容量完全有可能小于中型 Page，最小容量可以低至 4MB。大型 Page 在 ZGC 的实现中是不会被重分配（重分配是 ZGC 的一种处理动作，用于复制对象的收集器阶段，后文将介绍）的，因为复制一个大对象的代价非常高昂。</li></ul><p><img src="https://celloo.synology.me:8407/2024/05/12_image-20240512171804313.png" alt="ZGC的堆内存布局" height="1146" width="1704"/></p><p>接下来是 ZGC 的核心问题——并发整理算法的实现。Shenandoah 使用转发指针和读屏障来实现并发整理，ZGC 虽然同样用到了读屏障，但用的却是一条与 Shenandoah 完全不同，更加复杂精巧的解题思路。</p><h2 id="zgc-">ZGC 并发整理算法的实现：染色指针技术</h2><p>染色指针技术（Colored Pointer）是 ZGC 收集器一个标志性的设计。从前，如果我们要在对象上存储一些额外的、只供收集器或者虚拟机本身使用的数据，通常会在对象头中增加额外的存储字段，如对象的哈希码、分代年龄、锁记录等就是这样存储的。这种记录方式在有对象访问的场景下是很自然流畅的，不会有什么额外负担。</p><p>但如果对象存在被移动过的可能性，即不能保证对象访问能够成功呢？又或者有一些根本就不会去访问对象，但又希望得知该对象的某些信息的应用场景呢？能不能从指针或者与对象内存无关的地方得到这些信息，譬如是否能够看出来对象被移动过？这样的要求并非不合理的刁难，先不去说并发移动对象可能带来的可访问性问题，此前我们就遇到过这样的要求——追踪式收集算法的标记阶段就可能存在只跟指针打交道而不必涉及指针所引用的对象的本身的场景。例如对象标记的过程中需要给对象打上三色标记，这些标记本质上就只和对象的引用有关，而与对象本身无关——某个对象只有它的引用关系能决定它存活与否，对象上其他所有的属性都不能影响它的存活判定结果。</p><p>HotSpot 虚拟机的几种收集器有不同的标记实现方案，有德把标记直接记录在对象头上(如 Serial 收集器)，有德把标记记录在与对象相互独立的数据结构上 (如 G1、Shenandoah 使用了一种相当于堆内存的 1/64 大小的，称为 BitMap 的结构来记录标记信息)，而 ZGC 的染色指针是最直接的、最纯粹的，它直接把标记信息记在引用对象的指针上，这时，与其说可达性分析时遍历对象图来标记对象，还不如说是遍历 “引用图” 来标记 “引用” 了。</p><p>染色指针是一种直接将少量额外的信息存储在指针上的技术，可是为什么指针本身也可以存储额外信息呢？在 64 位系统中，理论可以访问的内存高达 16 EB （2 的64次幂）字节。实际上，基于需求 (用不到那么多内存)、性能 (地址越宽在做地址转换时需要的页表级数越多) 和成本 (消耗更多晶体管) 的考虑，在AMD 64架构中只支持到 52 位 (4 PB) 地址总线和 48 位 (256 TB) 的虚拟地址空间，所以目前 64 位的硬件实际能够支持的最大内存只有 256 TB。此外，操作系统一侧也会施加自己的约束，64 位的 Linux 则分别支持 47 位 （128 TB）的进程虚拟地址空间和 46 位 (64TB) 的物理地址空间，64 位的 Windows 系统甚至只支持 44 位(16 TB) 的物理地址空间。</p><p>尽管 Linux 下 64 位指针的高 18 位不能用来寻址，但剩余的 46 位指针所能支持的 64 位内存在今天仍然能够充分满足大型服务器的需要。鉴于此，ZGC 的染色指针技术继续盯上了这剩下的 46位指针宽度，将其高 4 位提取出来存储四个标志位信息。通过这些标志位，虚拟机可以直接从指针中看到其引用对象的三色标记状态、是否进入了重分配集 (即被移动过)、是否只能通过 finalize() 方法才能被访问到，当然，由于这些标志位进一步压缩了原本就只有 46 位的地址空间，也直接导致了 ZGC 能够管理的内存不可以超过 4 TB (2 的 42 次幂)。</p><p>尽管染色指针有 4 TB 的内存限制，不能支持 32 位平台，不能支持压缩指针等诸多约束，但它带来的收益也是非常可观的， ZGC 的设计者 Per Liden 陈述了染色指针的三大优势：</p><ol start="1"><li><p>染色指针可以使得一旦某个 Region 的存活对象被移走之后，这个 Region 立即就能够被释放和重用掉，而不必等待整个堆中所有指向该 Region 的引用都被修正后才能清理。</p></li><li><p>染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量，设置内存屏障，尤其是写屏障的目的通常是为了记录对象引用的变动情况，如果将这些信息直接维护在指针中，显然就可以省去一些专门的记录操作。</p></li><li><p>染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据，以便日后进一步提高性能。</p><blockquote class="markdown-alert-note"><header>NOTE</header>
<p>现在 Linux 下的 64位 指针还有前 18 位并未使用，它们虽然不能用来寻址，却可以通过其他手段用于信息记录。如果开发了这 18 位，既可以腾出已用的 4 个标志位，将 ZGC 可支持的最大堆内存从 4 TB 扩展到 64 TB，也可以利用其余位置再存储更多的标志，譬如存储一些追踪信息来让垃圾收集器在移动对象时能将低频次使用的对象移动到不常访问的内存区域。</p></blockquote>
</li></ol><h2 id="x86-64-">x86-64上 染色指针应用的前提——内存映射技术</h2><p>Java 虚拟机作为一个普普通通的进程，这样随意重新定义内存中某些指针的其中几位，操作系统是否支持？处理器是否支持？这是很现实的问题，无论中间过程如何，程序代码最终都要转换为机器指令流交付给处理器去执行，处理器可不会管指令流中的指针哪部分存的是标志位，哪部分才是真正的寻址地址，只会把整个指针都视作一个内存地址来对待。这个问题在 Solaris/SPARC 平台上比较容易解决，因为 SPARC 硬件层面本身就支持虚拟地址掩码，设置之后其机器指令就可以忽略掉染色指针中的标志位。但在 x86-64 平台上并没有提供类似的黑科技，ZGC 设计者就只能采取其他的补救措施了，这里面的解决方法呢要涉及虚拟内存映射技术，让我们先来复习一下这个 x86 计算机体系中的经典设计。</p><h3 id="">虚拟内存映射技术</h3><p><strong>虚拟内存映射技术的历史沿革</strong></p><ol start="1"><li>远古时代 x86 计算机系统里面，所有进程都是共用同一块物理内存空间的。这样会导致不同进程之间的内存无法相互隔离，当一个进程污染了别的进程内存后，就只能对整个系统进行复位后才能得以恢复。</li><li>从 Intel 80386 处理器开始，提供了 “保护模式” 用于隔离进程。在保护模式下，386 处理器的全部 32 条地址都有效，进程可访问最高也可达 4GB 的内存空间，但此时已不同于之前实模式下的物理内存寻址了，处理会使用分页管理机制把线性地址空间和物理地址分别划分为大小相同的块，这样的内存块被称为“页”（Page）。通过在线性虚拟空间的页与物理地址空间的页之间建立的映射表，分页管理机制会进行线性地址到物理地址空间的映射，完成线性地址到物理地址的转换。</li></ol><p>不同层次的虚拟内存从物理内存的转换关系可以在硬件层面、操作系统层面或者软件进程层面实现，如何完成地址转换，是一对一、多对一还是一对多的映射，也可以根据实际需要来设计。</p><p>Linux/x86-64 平台上的 ZGC 使用了多重映射 (Multi - Mapping) 将多个不同的虚拟内存地址映射到同一个物理内存地址上，这是一种多对一映射，意味着 ZGC 在虚拟内存中看到的地址空间要比实际的堆内存容量来得更大。把染色指针中的标志位看作是地址的分段符，那只要将这些不同的地址段都映射到同一个物理内存空间，经过多重映射转换后，就可以使用染色指针正常进行寻址了，效果如图所示：</p><p><img src="https://celloo.synology.me:8407/2024/05/11_image-20240511210631360.png" alt="多重映射下的寻址"/></p><p>在某些场景下，多重映射技术确实可能会带来一些复制大对象时会更容易这样的额外好处，可从根源上讲，ZGC 的多重映射只是它采用染色指针技术的伴生产物，并不是专门为了实现其他某种特性需求而去做的。</p><h2 id="zgc-">ZGC 是如何工作的？</h2><p>ZGC 的运作过程大致可划分为以下四个大的阶段。全部四个阶段都是可以并发执行的，仅是两个阶段中间会存在短暂的停顿小阶段，这些小阶段，譬如初始化 GC Root 直接关联对象的 Mark Start，与之前 G1 和 Shenandoah 的 Initial Mark 并没有什么差异。是什么？ZGC 的运作过程具体如图所示：</p><p><img src="https://celloo.synology.me:8407/2024/05/11_image-20240511220240490.png" alt="ZGC运作过程"/></p><ul><li><p><strong>并发标记</strong>( Concurrent Mark): 与 G1、Shenandoah 一样，并发标记是遍历对象图做可达性分析的阶段，前后也要经过类似于 G1、Shenandoah 的初始标记、最终标记 (尽管 ZGC 中的名字不叫这些) 的短暂停顿，而且这些停顿阶段所做的事情在目标上也是相类似的。与 G1、Shenandoah 不同的是，ZGC 的标记是在指针上而不是在对象上进行的，标记阶段会更新染色指针中的 Marked 0、Marked 1 标志位。</p></li><li><p><strong>并发预备重分配</strong>（Concurrent Prepare for Relocate): 这个阶段需要根据特定的查询条件统计得出本次收集过程要清理哪些 Region，将这些 Region 组成重分配集 (Relocation Set)。重分配集与 G1 收集器的回收集 (Collection Set) 还是有区别的，ZGC 划分 Region 的目的并非为了像 G1 那样做收益优先的增量回收。相反，ZGC 每次回收都会扫描所有的 Region，用范围更大的扫描成本换取省去 G1 中记忆集的维护成本。因此，ZGC 的重分配集只是决定了里面的存活对象会被重新复制到其他的 Region 中，里面的 Region 会被释放，而并不能说回收行为就只是针对这个集合里面的 Region 进行，因为标记过程是针对全堆的。此外，在 JDK 12 的 ZGC 中开始支持的类卸载以及弱引用的处理，也是在这个阶段完成的。</p></li><li><p>并发重分配（Concurrent Relocate）：重分配是 ZGC 执行过程中的核心阶段，这个过程要把重分配集中的存活对象复制到新的 Region 上，并为重分配集中的每个 Region 维护一个转发表 （Forward Table），记录从旧对象到新对象的转向关系。得益于染色指针的支持，ZGC 收集器能仅从引用上旧明确的纸一个对象是否处于重分配集之中，如果用户线程此时并发访问了位于重分配集中的对象，此次访问将会被预置的内存屏障所截获，然后立即根据 Region 上的转发表记录将访问转发到新复制的对象上，并同时修正更新该引用的值，使其直接指向新对象，ZGC 将这种行为称为指针的 “自愈” （Self Healing) 能力。</p><blockquote class="markdown-alert-note"><header>NOTE</header>
<p>这样做的好处是：只有第一次访问旧对象会陷入转发，也就是只慢一次，对比 Shenandoah 的 Brooks 转发指针，那是每次对象都必须付出的固定开销（简单地说就是每次都慢），因此 ZGC 对用户程序的运行时负载要比 Shenandoah 来得更低一些。</p><p>还有一个直接的好处是由于染色指针的存在，一旦重分配集中某个 Region 的存活对象都复制完毕后，这个 Region 就可以立即释放用户新对象的分配(但是转发表还得留着不能释放掉)，哪怕堆中还有很多指向这个对象的未更新指针也没有关系，这些旧指针一旦被使用，它们都是可以自愈的。</p></blockquote>
</li><li><p>并发重映射(Concurrent Remap): 重映射所做的就是修正整个堆中指向重分配集中旧对象的所有引用，这一点从目标角度看是与 Shenandoah 并发引用更新阶段一样的，但是 ZGC 的并发重映射并不是必须要 “迫切” 去完成的任务，因为前面说过，即使是旧引用，它也是可以自愈的，最多只是第一次使用时多一次转发和修正操作。重映射清理这些旧引用的主要目的是为了不变慢  (还有清理结束后可以释放转发表这样的附带收益)，所以说并不是很“迫切”。因此，ZGC 很巧妙地把并发重映射阶段所要做的工作，合并到了下一次垃圾收集循环中的并发标记阶段里去完成，反正他们都是要便利所有对象的，这样合并就节省了一次遍历对象图的开销。一旦所有指针都被修正之后，原来记录新旧对象关系的转发表就可以释放掉了。</p></li></ul><h2 id="-or-">分代 or 不分代？</h2><p>相比 G1、Shenandoah 等先进的垃圾收集器，ZGC 在实现细节上做了一些不同的权衡选择，譬如 G1 需要通过写屏障来维护记忆集，才能处理跨代指针，得以实现 Region 的增量回收。记忆集要占用大量的内存空间，写屏障也对正常程序运行造成额外负担，这些都是权衡选择的代价。</p><p>ZGC 就完全没有使用记忆集，它甚至连分代都没有，连像 CMS 中那样只记录新生代和老年代间引用的卡表也不需要，因而完全没有用到写屏障，所以给用户变成带来的运行负担也要小得多。这是优势。</p><p>ZGC 的这种选择也限制了它能承受的对象分配速率不会太高。这是劣势。</p><blockquote class="markdown-alert-tip"><header>TIP</header>
<p>可以想象一下场景来理解 ZGC 这个劣势：ZGC 准备要对一个很大堆做一次完整的并发收集，假设其全过程要持续十分钟以上，在这段时间里面，由于应用的对象分配速率很高，将创造大量的新对象，这些新对象很难进入当次收集的标记范围，通常就只能全部当作存活对象来看待——尽管其中绝大部份对象都是朝生夕灭的，这就产生了大量的浮动垃圾。如果这种高速分配持续维持的话，每一次完整的并发收集周期都会很长，回收到的内存空间持续小于期间并发产生的浮动垃圾所占用的空间，堆中剩余可腾挪的空间就越来越小了。目前唯一的办法就是尽可能增加堆容量大小，获得更多喘息的时间。但是若要从根本上提升 ZGC 能够应对的对象分配速率，还是需要引入分代收集。让新生对象都在一个专门的区域中创建，然后专门针对这个区域进行更频繁、更快的收集。（继续引入分代收集的必要性）。</p></blockquote>
<h2 id="zgc">ZGC的性能</h2><p>ZGC 的性能表现相当亮眼，从官方给出的测试结果来看，用“令人震惊的、革命性的 ZGC“ 来形容都不为过。</p><p>在 ZGC 的 ”弱项“ 吞吐量方面，以低延迟为首要目标的 ZGC 已经达到了以高吞吐量为目标的 Parallel Scavenge 的 99%，直接超越了 G1。</p><p>而在 ZGC 的强项停顿时间测试上，它就毫不留情地与 Parallel Scavenge、G1 拉开了两个数量级的差距。不论是 95% 停顿、99% 停顿、99.9% 停顿，抑或是最大停顿时间，ZGC 均能毫不费劲地控制在了 10 毫秒以内，以至于把它和另外两款停顿数百近千毫秒的收集器放到一起对比，就几乎显示不了 ZGC 的柱状条。</p><p><img src="https://celloo.synology.me:8407/2024/05/12_image-20240512194448779.png" alt="ZGC的吞吐量测试"/></p><p><img src="https://celloo.synology.me:8407/2024/05/12_image-20240512194607676.png" alt="ZGC的停顿时间测试"/></p><h2 id="">结尾</h2><p>ZGC 原本是 Oracle 作为一项商业特性来设计和实现的，只不过在它横空出世的 JDK 11 时期，正好适逢 Oracle 调整许可证授权，把所有商业特性都开源给了 OpenJDK，所以用户对其商业特性并没有明显的感知。ZGC 有着令所有开发人员趋之若鹜的优秀性能，让以前大多数人只是听说，但从未用过的 “Azul 式的垃圾收集器” 一下子飞入寻常百姓家。相信在它完全成熟后，将会成为服务端、大内存、低延迟应用的首选收集器的有力竞争者。</p></div><p style="text-align:right"><a href="https://semejen.com/posts/java/zgc#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/java/zgc</link><guid isPermaLink="true">https://semejen.com/posts/java/zgc</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Sun, 12 May 2024 12:01:22 GMT</pubDate></item><item><title><![CDATA[Difference between Instance Method and Static Method in Java]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/java/difference-between-instance-method-and-static-method-in-java">https://semejen.com/posts/java/difference-between-instance-method-and-static-method-in-java</a></blockquote><div><p>In Java, the distinction between <strong>instance methods</strong> and <strong>static methods</strong> lies in their relationship with objects of a class. In simple terms, instance methods belong to an <em>object</em> (an instance of a class), while static methods belong to the <em>class itself</em>.</p><p>Here&#x27;s a breakdown of the key differences:</p><hr/><h2 id="instance-methods">Instance Methods</h2><p>Instance methods are the more common type of method in Java. They operate on the specific state of an individual object.</p><ul><li><strong>Association:</strong> Tied to a specific instance of a class.</li><li><strong>Invocation:</strong> You must create an object of the class before you can call an instance method.</li><li><strong>Access:</strong> Can access both instance variables (specific to each object) and static variables (shared among all objects).</li><li><strong><code>this</code> keyword:</strong> Can use the <code>this</code> keyword, which refers to the current object.</li></ul><h3 id="when-to-use-instance-methods">When to Use Instance Methods</h3><p>Use instance methods when the method&#x27;s logic depends on the individual characteristics of an object. For example, a <code>Car</code> class might have instance methods like <code>startEngine()</code> or <code>getSpeed()</code>, as these actions are specific to a particular car.</p><h3 id="example">Example:</h3><pre class="language-java lang-java"><code class="language-java lang-java">class Dog {
    String name;

    public void bark() {
        System.out.println(name + &quot; says woof!&quot;);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.name = &quot;Buddy&quot;;
        myDog.bark(); // Calling an instance method on a Dog object
    }
}
</code></pre>
<hr/><h2 id="static-methods">Static Methods</h2><p>Static methods, also known as class methods, are not tied to any specific object. They are associated with the class as a whole.</p><ul><li><strong>Association:</strong> Belongs to the class, not to any particular instance.</li><li><strong>Invocation:</strong> Can be called directly on the class name, without creating an object.</li><li><strong>Access:</strong> Can only access static variables and other static methods directly. They cannot directly access instance variables or instance methods.</li><li><strong><code>this</code> keyword:</strong> Cannot use the <code>this</code> keyword because there is no specific object to refer to.</li></ul><h3 id="when-to-use-static-methods">When to Use Static Methods</h3><p>Use static methods for utility functions that don&#x27;t rely on the state of a particular object. The <code>Math</code> class in Java is a great example; all its methods, like <code>Math.max()</code> and <code>Math.sqrt()</code>, are static because they perform calculations that are independent of any specific object.</p><h3 id="example">Example:</h3><pre class="language-java lang-java"><code class="language-java lang-java">class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int sum = Calculator.add(5, 3); // Calling a static method on the Calculator class
        System.out.println(&quot;The sum is: &quot; + sum);
    }
}
</code></pre>
<hr/><h2 id="summary-of-key-differences">Summary of Key Differences</h2><table><thead><tr><th style="text-align:left"> Feature </th><th style="text-align:left"> Instance Method </th><th style="text-align:left"> Static Method </th></tr></thead><tbody><tr><td style="text-align:left"> <strong>Invocation</strong> </td><td style="text-align:left"> Requires an object to be created </td><td style="text-align:left"> Can be called directly on the class </td></tr><tr><td style="text-align:left"> <strong>State</strong> </td><td style="text-align:left"> Operates on the state of a specific object </td><td style="text-align:left"> Does not depend on the state of an object </td></tr><tr><td style="text-align:left"> <strong>Access</strong> </td><td style="text-align:left"> Can access both instance and static members </td><td style="text-align:left"> Can only access static members directly </td></tr><tr><td style="text-align:left"> <strong><code>this</code> Keyword</strong> </td><td style="text-align:left"> Can use the <code>this</code> keyword </td><td style="text-align:left"> Cannot use the <code>this</code> keyword </td></tr></tbody></table><p>This video provides a clear and concise explanation of the difference between static and non-static (instance) variables and methods in Java, which can be very helpful for beginners.
<a href="https://www.youtube.com/watch?v=-Y67pdWHr9Y">Video Tutorial on Static vs Non-Static in Java</a></p></div><p style="text-align:right"><a href="https://semejen.com/posts/java/difference-between-instance-method-and-static-method-in-java#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/java/difference-between-instance-method-and-static-method-in-java</link><guid isPermaLink="true">https://semejen.com/posts/java/difference-between-instance-method-and-static-method-in-java</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Wed, 10 Jan 2024 13:19:25 GMT</pubDate></item><item><title><![CDATA[Remove Sub-Folders from the Filesystem]]></title><description><![CDATA[<div><blockquote>该渲染由 Shiro API 生成，可能存在排版问题，最佳体验请前往：<a href="https://semejen.com/posts/leetcode/remove-sub-folders-from-the-filesystem">https://semejen.com/posts/leetcode/remove-sub-folders-from-the-filesystem</a></blockquote><div><h2 id="question">Question</h2><p><a href="https://leetcode.com/problems/remove-sub-folders-from-the-filesystem/description/">remove sub folders from the filesystem</a></p><h2 id="analysis">Analysis</h2><h3 id="method-1-trieprefix-tree">Method 1: Trie(Prefix tree)</h3><ol start="1"><li>define trie node structure</li><li>insert all file into tree</li><li>using DFS traverse to collect parent node</li></ol><h3 id="method-2-sort">Method 2: Sort</h3><ol start="1"><li>sort by lexicographic order</li><li>add the first file into array ans, obviously</li><li>traverse remaining elements, determine whether the current element is a sub of the last element of the ans array</li><li>yes: ignore; no, add current element into array ans</li></ol><h2 id="timing">Timing</h2><p>NULL</p><h2 id="code">Code</h2><pre class="language-java lang-java"><code class="language-java lang-java">/**
* Trie
*/
public class Solution {

    private TrieNode root;

    public Solution() {
        root = new TrieNode();
    }

    public void insert(String folder, int refValue) {
        TrieNode current = root;
        String[] parts = folder.split(&quot;/&quot;);
        for (String part : parts) {
            if (!part.isEmpty()) {
                current = current.getChildren().computeIfAbsent(part, k -&gt; new TrieNode());
            }
        }
        current.setRef(refValue); // Store the folder reference
    }

    public boolean search(String folder) {
        return false;
    }

    public List&lt;String&gt; removeSubfolders(String[] folder) {
        for (int i = 0; i &lt; folder.length; i++) {
            insert(folder[i], i);
        }
        List&lt;String&gt; ans = new ArrayList&lt;&gt;();
        dfs(root, ans, folder);
        return ans;
    }

    private void dfs(TrieNode node, List&lt;String&gt; ans, String[] folder) {
        if (node.getRef() != -1) {
            ans.add(folder[node.getRef()]);
            return;
        }
        for (Map.Entry&lt;String, TrieNode&gt; entry : node.getChildren().entrySet()) {
            TrieNode childNode = entry.getValue();
            dfs(childNode, ans, folder);
        }
    }

    class TrieNode {
        private final Map&lt;String, TrieNode&gt; children = new HashMap&lt;&gt;();
        private int ref = -1;

        public Map&lt;String, TrieNode&gt; getChildren() {
            return children;
        }

        public void setRef(int ref) {
            this.ref = ref;
        }

        public int getRef() {
            return ref;
        }
    }
}


/**
* Sort
*/
class Solution {
    public List&lt;String&gt; removeSubfolders(String[] folder) {
        List&lt;String&gt; ans = new ArrayList&lt;&gt;();
        Arrays.sort(folder);
        ans.add(folder[0]);
        for (int i = 1; i &lt; folder.length; i++) {
            String curr = folder[i];
            int currLen = curr.length();
            String prev = ans.get(ans.size() - 1);
            int prevLen = prev.length();
            if (currLen &gt; prevLen &amp;&amp; curr.startsWith(prev) &amp;&amp; curr.charAt(prevLen) == &#x27;/&#x27;) {
                // current folder is a subfolder of the last added folder
                continue;
            }
            ans.add(curr);
        }
        return ans;
    }
}
</code></pre>
<h2 id="completixy">Completixy</h2><h3 id="trie">Trie</h3><p><strong>Time</strong>
O(nl), where n and l are the length of the array folder and the average length of a folder, respectively. This is the time required to construct the dictionary tree and the answer.</p><p><strong>Space</strong>
O(nl) is the space required by the dictionary tree.</p><h3 id="sort">Sort</h3><p><strong>Time</strong>
O(nl⋅logn), where n and l are the length of the array folder and the average length of the folder respectively. O(nl⋅logn) is the time required for sorting, and the time required for constructing the answer is O(nl), which is asymptotically smaller than the former.</p><p><strong>Space</strong>
O(l). When constructing the answer to compare prefixes, we used the string substring operation, so O(l) temporary space is required.</p></div><p style="text-align:right"><a href="https://semejen.com/posts/leetcode/remove-sub-folders-from-the-filesystem#comments">看完了？说点什么呢</a></p></div>]]></description><link>https://semejen.com/posts/leetcode/remove-sub-folders-from-the-filesystem</link><guid isPermaLink="true">https://semejen.com/posts/leetcode/remove-sub-folders-from-the-filesystem</guid><dc:creator><![CDATA[bayanbulak]]></dc:creator><pubDate>Wed, 08 Feb 2023 13:47:43 GMT</pubDate></item></channel></rss>