#610 Python 源码学习 08: dict

2021-09-02

类型定义

INIT_TYPE(&PyDict_Type, "dict");
SETBUILTIN("dict", &PyDict_Type);

PyTypeObject PyDict_Type 的定义在 Objects/dictobject.c 中。

Include/cpython/dictobject.h

typedef struct {
    PyObject_HEAD

    /* Number of items in the dictionary */
    Py_ssize_t ma_used;

    /* Dictionary version: globally unique, value change each time
       the dictionary is modified */
    uint64_t ma_version_tag;

    PyDictKeysObject *ma_keys;

    /* If ma_values is NULL, the table is "combined": keys and values
       are stored in ma_keys.

       If ma_values is not NULL, the table is splitted:
       keys are stored in ma_keys and values are stored in ma_values */
    PyObject **ma_values;
} PyDictObject;

成员方法

setdefault

#define DICT_SETDEFAULT_METHODDEF    \
    {"setdefault", (PyCFunction)(void(*)(void))dict_setdefault, METH_FASTCALL, dict_setdefault__doc__},

static PyObject *
dict_setdefault(PyDictObject *self, PyObject *const *args, Py_ssize_t nargs)
{
    PyObject *return_value = NULL;
    PyObject *key;
    PyObject *default_value = Py_None;

    if (!_PyArg_CheckPositional("setdefault", nargs, 1, 2)) {
        goto exit;
    }
    key = args[0];
    if (nargs < 2) {
        goto skip_optional;
    }
    default_value = args[1];
skip_optional:
    return_value = dict_setdefault_impl(self, key, default_value);

exit:
    return return_value;
}

static PyObject *
dict_setdefault_impl(PyDictObject *self, PyObject *key,
                     PyObject *default_value)
/*[clinic end generated code: output=f8c1101ebf69e220 input=0f063756e815fd9d]*/
{
    PyObject *val;

    val = PyDict_SetDefault((PyObject *)self, key, default_value);
    Py_XINCREF(val);
    return val;
}

#609 UMIDIGI 与 GPL 协议

2021-09-01

最近发生的一件事情挺有意思的,在得到 “上门自取” 的回复之后,有位美女替外国程序员依照 GPL 协议上门向国内的一家厂商索要内核代码。

深圳公司 UMIDIGI 生产安卓手机(联发科 Mediatek),面向海外用户。

波兰开发者 Patrycja (@ptrcnull) 想将移植 postmarketOS (基于 Alphine Linux) 到 UMIDIGI 的一款设备上,结果发现缺少 ft8719_dsi_fhdplus 屏幕驱动。

Patrycja 尝试联系 UMIDIGI,得到了以下回复:

Twitter

就是说,如果你要的话,你可以上门来取。我们可以认为这是想让 Patrycja 知难而退。

可是 Patrycja 八月 17 号在 Twitter 上抱怨之后,深圳科技博主 Naomi Wu 机械妖姬(@RealSexyCyborg,混 Youtube)主动提供帮忙,表示愿意代替 Patrycja 上门索取源代码。

然后机械妖姬 08/20 就拿着自拍杆勇闯 UMIDIGI 公司。
UMIDIGI 行政人员表示需要之前发邮件的 BEN 已经离职(我觉得很可能就坐在旁边看美女),然后提供源代码的事情需要先向老板请示,之后在相对友好的氛围下,机械妖姬离开了。

机械妖姬前往 UMIDIGI 公司

随后:

  • 08/25 UMIDIGI 向机械妖姬提供了相关文件。
  • 08/26 Patrcja 完成了系统移植,并向机械妖姬和 UMIDIGI 表示感谢。

这件事件我的评价是:

UMIDIGI 之前的邮件回复十分愚蠢,直接向法务部门咨询之后,通过合法的途径(可能涉及联发科的知识产权)将代码提供给他不就好了吗?
不过,如果不是事情闹大了,UMIDIGI 会不会提供源代码呢?这就不知道了,我们也不能以恶意揣度之。只能就事论事,在这次事件中,各方的表现都非常好。

#608 美国之声谈美国对阿富汗难民的帮助

2021-09-01

美国之声中文网 @VOAChinese

百万阿富汗难民主要流向巴基斯坦、伊朗,世界多国纷纷提供人道庇护,但并不包括中国。美国尚未宣布接受难民的确切数字,总统拜登批准了5亿美元应急资金,而美国北方司令部正为多达 5万阿富汗撤离人员提供交通、医疗、临时住房和其他支持,协助他们安顿到永久或临时设施中,多个州也参与到安置工作中。

瞧瞧这个 “并不包括中国”,cue 得多自然,值得我们的新闻工作者学习。

#607 vCard (.vcf)

2021-09-01

VCF 是 Virtual Contact File 的简写,虚拟通讯录文件
PS:.vcf 后缀还有一个含义是 Variant Call Format,用在基因生物学方面。

#606 SCO 与 IBM 之间的和解

2021-08-31

开源中国上看到一篇资讯:《18 年后,起诉 IBM 盗用 System V 源码的 SCO 选择以 1425 万美元和解》, 提到 SCO 将要和 IBM 和解,只需要 IBM 向 SCO 托管人(SCO 早破产了,只剩这点官司一直拖着没有结束,根据美国破产法,由托管人代理)支付 1425 万美元。虽然他们继续坚持自己的立场,但是最后都认为这一次的和解协议是符合双方最大利益的,实在是心累,不愿再继续到下一个十年。
这一次总算把这片狗皮膏药彻底给撕掉了,SCO 也可以安心的死去了,Linux 基金会也可以摆酒庆祝一下了。

开源界两件最大的纠纷就是 AT&T Unix 和和这次的 SCO Linux,并且这两个纠纷有很大的渊源。

前者源自 AT&T 管理层所做的一个愚蠢决定,为了一个自己根本不在乎的市场,向一个庞大用户群简单粗暴地发起一场战争。折腾十年(从 1984 年 AT&T 分拆之后向 BSD 提出版权要求,到 1994 年收购 AT&T Unix 资产的 Novell 与 BSD 和解)也没有获得任何好处,BSD 最后也只是做了一点简单的修改就算了事,而发起这场战争的 AT&T 却在官司结束之前,提前抽身去做别的事情去了。但这却直接导致了 Unix 市场长达十年的沉寂,以及 Linux 的诞生,或许 MS-DOS 以及后来 Windows 的诞生都与此有关(我相信如果有合法的、免费的 BSD 可用,IBM 不会选择 MS-DOS,微软可能也会作为一家 Unix 厂商继续经营自己的 Xenix)。

后者也是悬挂在 Linux 厂商头上的一柄达摩克利斯之剑。
SCO 发起诉讼的理由是,SCO 拥有 Unix 版权(可能是部分),IBM 向 Linux 贡献了大量代码,其中有一部分侵犯了 SCO 的版权(IBM 曾经和 SCO 联合开发 X86 架构的 Unix),从而 SCO 拥有 Linux 的部分版权。
不过时代变了,Linux 厂商与 SCO 的体量对比,相较于 AT&T 那会儿完全是反过来的。

SCO 先后多次发起对 Unix/Linux 厂商的诉讼,一旦获胜,就可以在巨大的 Linux 市场撕下来一块巨大的蛋糕。

  1. 最初的 SCO 是一家美国软件公司,因其 Unix 业务而知名。
  2. SCO 一开始是专注于 Unix 的 X86 架构移植
  3. Xenix 是微软开发的 Unix 系统,后来以技术入股的方式,将 Xenix 转让给了合作伙伴 SCO 公司(25% 股份)
  4. SCO 还收购了 UnixWare
  5. SCO 整合手上的 Unix 资源,开发了 SCO Unix,后来又改名为 SCO OpenServer(现在还活着,由 Xinuos 所有,改成基于 FreeBSD)。
  6. SCO 将 Unix 业务(可能包括 SCO 这个名字)出售给了 Caldera Systems,然后就改名了。
  7. 后来,Caldera 更名为 The SCO Group,破产之后又更名为 The TSG Group (后面再提到 SCO 都是指这家公司)。
  8. SCO 的主要业务就是像各大 Linux 厂商发起诉讼
    PS: 一度穷得差点没钱发起诉讼,微软立即宣布花 1300 万美元购买 SCO 许可

SCO 对很多大公司发起了诉讼,包括:

  1. SCO 起诉 IBM:IBM 向 Linux 贡献的代码是否侵权?
  2. Red Hat 起诉 SCO:红帽要求法院禁止 SCO 发起对 Linux 版权的诉讼,被驳回。
  3. SCO 起诉 Novell:Novell 曾经将 Unix 资产打包买给了 SCO,这次的争议是,那一次出售的范围是否包含 Novell 从 AT&T 那里获得的 Unix 版权。最后 SCO 败诉,法院判决 Novell 拥有他那一部分 Unix 版权(后来连带着 Unix 商标一同移交给了 The Open Group)。这个判决直接导致 SCO 在之后的其他官司中胜率大幅降低,可能美国的司法机关也有自己的倾向性,不希望 IT 界遭到重创。

参考资料与拓展阅读

#605 社会底层的话语权

2021-08-31

刘三姐

知乎上刷到一个视频《在国产剧中,穷人已经被消灭了》,其中心思想非常符合我的观点,让我产生想说几句的冲动。

在过去讲求阶级斗争的年代,中央对文艺工作的领导非常重视所谓社会主义文艺发展,文艺作品非常讲求 “人民群众” 这个点。毛泽东就曾批评文化部过于注重过去封建王朝和国外资本主义的作品,不如更名叫 “帝王将相部”、“才子佳人部”,或 “外国死人部”。改革开放之后,社会的发展从 “以阶级斗争为纲” 转向到以经济建设为中心。政府对文艺工作的领导也随着改革松绑了,市场化了。

但可能是受体制或者老一派文艺工作者的影响,我在以前中小学时期看过的一些电影、电视剧也很多都是关于普通人的生活。后来慢慢的,国产电视剧、电影中的主角好多都是是什么皇家、什么家族企业,至少也得是个公司高管,剧情也往往是是后宫争宠、王子夺嫡、家产或企业控制权争夺之类,一般都经常让我感觉和自己的生活没有多大关联(有少数拍的还是不错,看的挺开心)。

不管什么剧,里面的人生活都锦衣玉食、纸醉金迷的,看起来很富足。用上面说的那个视频中的话来说,编剧和导演好像失去了对底层生活的想象力,连剧中设定的穷人 —— 家境不好的都市白领和学生 —— 生活看起来都远超我理解的普通老百姓平均生活水平,都住大房子,打扮时髦,光鲜亮丽(我好像不经意联想到了新亮剑《雷霆战将》,一个个有型兼靓仔就算了,李云龙的团部都搬到了小洋楼)。

为什么没有管控之后,文化领域自动又重新转向了王侯将相、才子佳人视角?

我想了下,应该是人之本性。普通的生活本来就过于平淡,人们就想看看别的风云人物的生活,看看皇帝到底是不是白面馍吃到饱、是不是在用金锄头种地,让自己也能在工作之余幻想一下,放松放松心情。

文艺作品本身就是阶层话语权的一部分。就好像美国的霸主地位和其文化输出能力也有很大关系。
所以,这里面有一个隐藏的小问题:谁为底层说话?

以前,我还在读书,第一次看到毛泽东的那个观点时,非常震惊,就好像发现了新大陆一样。因为我细想想之后发现好像确实是这么回事。古代的书上从来都是帝王将相的那些事,最多就是在诗歌中有描述劳动者的辛苦,关于有血有肉的普通人的生活好像没有提过,除了《金瓶梅》(在比较有知名度的书里面;从这个意义上来看,它的价值应该超过四大名著)。

底层人民的生活是不是不具备传播属性,不配出现在文艺作品中?

我也不懂啥,我也不知道应该是怎样,就觉得社会肯定是会朝着的更加公正、更加平等的方向发展。普通人的话语权肯定会越来越大,像现在这样,文艺领域被上层阶级的权谋宫斗占据也绝对不合理。

其实,又何止是文艺作品,新闻中也只会出现人民群众生活日益富足的报道,连领导视察的贫困户都让不少人羡慕。宣布全面脱贫之后,以后可能贫困户的新闻都看不到了。

我突然想到一个:现在普通人还是有话语权的,抖音和快手就挺不错的。很多学生或者都市白领(新时代的农民工)容易产生一个误区,他们的意见代表了最广泛的人民群众,其实不是这样,如果经常回老家看看的话,你会发现最广泛的人民群众在哪里(如果不被视为愚昧和落后而刻意忽视的话)。抖音和快手是我看到除了微信之外,使用最为广泛的 App,除了少数在使用老年机的长辈之外,几乎人都在用,很多长辈还一直有发布视频,相比较而言,微博的传播度都算小众产品了。

Update @ 2021-09-05

写完后回头想想,小时候看的电视里的普通人其实也不普通,不提大头儿子或者别的动画片里面小朋友家都有独栋别墅,至少没有人需要面临乡里摊派、计生委抄家、城管和税务抢劫。前两者由于当时我的年纪比较小,印象淡,城管和税务收保护费式的黑社会作风我可亲眼所见,记忆犹新。当时只要是有个人夹一个包出现在家里(我家开个小卖铺),自称某个部门工作人员,然后家里立即弥漫起一种恐怖的氛围,然后就是谄媚、巴结、拉关系。这些我可从来没有在电视上看到过,更别提我还见过多次城管当街打砸抢。现在的城管还是运动式的检查和收东西,不过不知道态度咋样,以及后面的处理流程是否合理。
《家有儿女》中的刘星、夏雨、夏雪也不会经常被小流氓抢劫,我就有多次这样的经历。
我又想起来,就在前两年,我亲眼见到有小区门口摆地摊的小贩因为没有交钱被一些身份不明的人(可能是流氓地痞)驱赶,扫黑除恶之后,可能他们现在不需要面临这些了吧,希望。

可能有些跑偏了,我说这一段不是抱怨生活中不如意的地方,或者放大社会黑暗面,我说的这些也只是普通人生活的极小一部分,我们有血有肉,有爱情,有亲情,有不如意,也有很多好玩的事情,我只是感慨普通人的生活没有机会被真实的、完整的表达出来。

#604 wget 下载时使用正确的文件名

2021-08-31

wget use correct filename when download

因为使用 wget 下载文件总是会使用 URL 最后一串字符作为文件名,但这有时不是我们想要的,比如:

download?xxxxxxxxxxxxxxxxxx
index.html?xxxxxxxxxxxxxxxxxx

我查阅了 wget 的帮助文档,发现只有个 --trust-server-names 参数有点像,但是文档总说这个参数的作用是使用重定向 URL 的最后一段作为本地文件名,试验之后确实没啥变化。

然后仔细找了一下,发现了 --content-disposition,这个才对嘛,使用响应头的 Content-Disposition 字段作为文件名,试了一下,有效!

PS:不过文档中说这个选项是实验性的。
PS:我的 wget 版本是 1.21,根据官网上的信息,这是最新版本,不过我看到有一个命名为 wget2 的新版本正在开发中,支持 HTTP/2, HTTP compression, parallel connections, use of If-Modified-Since HTTP header, TCP Fast Open. 期待!!!

还有一个参数,有些时候或许有用:--restrict-file-names=windows,unix, 限制文件中出现操作系统禁止的特殊字符。mark 一下。

#603 Edge 语音朗读

2021-08-29

发现 Edge 浏览器邮件菜单中有一个 “大声朗读” 的选项,非常好用,读起来非常流利,远超我的想象,几乎不像是人工合成(之前那种水平的,磕磕绊绊的)。

在语音选项中可以看到,阅读中文的时候默认选中的是 Microsoft Xiaoxiao Online (Natural), 声音非常好听,爱了爱了。

Ctrl + Shift + U 就可以听到这个声音,太棒了!

我在 Chrome 92 中还没找到这个功能,但是我想应该有的,我记得看到有什么项目说是用到 Chrome 的语音引擎。

经过搜索我发现了原来有个 Web Speech 的东西,语音合成方面应该是在主流浏览器中都支持了,但 Chrome 为什么不像 Edge 一样把这个功能放在右键菜单中,方便朗读网页呢?
有两种可能:1. 调用操作系统模块有授权问题;2. Google 采用自家的网络服务方案,国内不可用。

W3C Web Speech API

参考资料与拓展阅读

#602 flatpak

2021-08-29

flatpak 和 snap 是目前轻量级 Linux 应用程序虚拟化的两个主流方案。
PS: 还有一个存在很久的方案: AppImage,一直不温不火的存在着。

所谓 Application Virtualization,就是给应用程序弄一个标准的执行环境,屏蔽下面各种发行版的差异。他们采用的技术或许有相通的点,也可能完全不一样,我也没有深入研究。

我感觉这是大趋势,最后可能会出现一个像类似 Google Play、 Apple Store, Windows Store 这种东西,统一 Linux 应用分发市场。当然,这会涉及了很大的利益,谁都想能获得这个市场的主导权,所以这里面的斗争可能很难出最后结果。

flatpak 来自红帽,snap 来自 Ubuntu,两种方式目前都没有能够有足够的话语权(可能他们都不能走到最后,被别的新方案淘汰)。我比较看好 flatpak,毕竟红帽的技术实力在那里,大部分技术都是红帽在推动,相比较而言,Ubuntu 多次想把自己的技术推广出来都是失败。

可能是因为我用的 Ubuntu 的缘故(默认就有一些应用是 snap 安装),感觉好像 snap 出镜率比较高,但我有几次使用 snap 的经历,每次都不是很舒服,最后都是狼狈的回退(和我尝试过 homedrew 体验一样糟糕)。flatpak 我这还是第一次使用。因为今天看到新闻说 GNOME 推出了 , 里面都是一些精选的 Flatpak。