#360 玩具总动员

2020-01-06
  1. 正片 Toy Story (1995)
    巴斯光年,阿薛
  2. Toy Story Treats (1996) 电视剧
  3. 正片 Toy Story 2 (1999)
    公鸡人,翠丝
  4. Buzz Lightyear of Star Command (2000–2001) 电视剧
  5. Buzz Lightyear of Star Command: The Adventure Begins (2000)
  6. 正片 Toy Story 3 (2010)
    抱抱熊
    故事的最后,玩具们都送给了邦妮
  7. Toy Story Toons (2011–2012) 玩具们在邦妮家的故事
  8. Hawaiian Vacation 短片:夏威夷假期
  9. Small Fry 短片:小玩具
  10. Partysaurus Rex 短片:派对恐龙
  11. Toy Story of Terror! (2013) 短片:惊魂夜
  12. Toy Story That Time Forgot (2014) 短片:遗忘时光
  13. Forky Asks a Question (2019–2020) 电视剧
  14. 正片 Toy Story 4 (2019)
    邦妮害怕上学,叉叉
    胡迪最后跟宝贝走了
  15. Lamp Life (2020) 短片:牧羊女大冒险
  16. Pixar Popcorn (2021) 一分钟短片,其中有三部玩具总动员相关的短片。
    1. To Fitness and Beyond
    2. Fluffy Stuff with Ducky and Bunny: Love
    3. Fluffy Stuff with Ducky and Bunny: Three Heads
  17. Lightyear (2022)

参考资料与拓展阅读

#359 Python DataClass

2020-01-02

Python 3.7 新增了 dataclass,主要的好处是提供了一个类型定义模板,自动生成常见方法,减少一些常用的重复工作(__init____repr____eq____hash____lt__ 等方法)。

示例

import dataclasses

@dataclasses.dataclass
class User:
    user_id: int
    user_name: str
    first_name: str
    last_name: str
    age: int = 0

    def __post_init__(self):
        self.full_name = f'{self.first_name} {self.last_name}'

u = User(1, 'admin', 'Jim', 'Green')
print(u)
# User(user_id=1, user_name='admin', first_name='Jim', last_name='Green', age=0)
print(u.full_name)
# Jim Green
u.full_name = 'Han Meimei'
print(u.full_name)
# Han Meimei
print(dataclasses.asdict(u))
# {'user_id': 1, 'user_name': 'admin', 'first_name': 'Jim', 'last_name': 'Green', 'age': 0}
print(dataclasses.astuple(u))
# (1, 'admin', 'Jim', 'Green', 0)

相当于:

class User:
    def __init__(self, user_id: int, user_name: str, first_name: str, last_name: str, age: int = 0):
        self.user_id = user_id
        self.user_name = user_name
        self.first_name = first_name
        self.last_name = last_name
        self.full_name = f'{self.first_name} {self.last_name}'
        self.age = age

    def __str__(self):
        return f"{self.__class__.__name__}(user_id={self.user_id}, user_name='{self.user_name}', first_name='{self.first_name}', last_name='{self.last_name}, age={self.age}')"

    def asdict(self):
        return {
            'user_id': self.user_id,
            'user_name': self.user_name,
            'first_name': self.first_name,
            'last_name': self.last_name,
            'age': self.age,
        }

    def astuple(self):
        return self.user_id, self.user_name, self.first_name, self.last_name, self.age,

u = User(1, 'admin', 'Jim', 'Green')
print(u)
print(u.full_name)
u.full_name = 'Han Meimei'
print(u.full_name)
print(u.asdict())
print(u.astuple())

其他特性

@dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False,
    unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False,
    weakref_slot=False)
  • init 是否生成 __init__ 方法(默认)
  • repr 是否生成 __repr__ 方法(默认)
  • eq 是否生成 __eq__ 方法(默认)
  • order 是否生成 __lt____le____gt____ge__ 方法
  • unsafe_hash 是否生成 __hash__ 方法
    能 hash 的是不会变化对象,否则会出问题,需要谨慎使用。
  • frozen 是否允许对字段赋值
    可以使得数据类的实例变成不可变对象,类似于 Python 的 namedtuple。这意味着一旦实例化后,无法修改其中的属性值。
  • match_args
  • kw_only 是否仅关键词传参
  • slots 是否生成 __slots__ 方法
  • weakref_slot 是否添加 __wrakref__ 槽位(弱引用)
    指定 weakref_slot=True 而不同时指定 slots=True 将会导致错误。

dataclass__slots__ 的区别

dataclass 作为代码模板,作用是简化类的定义
__slots__ 的作用是优化内存使用(dataclass 可以通过 slots=True 自动生成 __slots__ 定义)

from dataclasses import dataclass

# 使用 dataclass
@dataclass
class Person:
    name: str
    age: int
    email: str = None

# 创建数据类实例
p = Person(name="Alice", age=30)
print(p)  # Person(name='Alice', age=30, email=None)

# 使用 __slots__
class PersonWithSlots:
    __slots__ = ['name', 'age', 'email']

    def __init__(self, name, age, email=None):
        self.name = name
        self.age = age
        self.email = email

# 创建带 __slots__ 的实例
p2 = PersonWithSlots(name="Alice", age=30)
print(p2.name, p2.age)  # Alice 30

#358 “买办” 是个啥?

2020-01-01

“买办” 这个词偶尔见到,给我的感觉是只管赚钱,不爱国甚至损害国家利益和民族利益来牟利的商人。

买办是指在清代五口通商地区被西方公民雇佣并且参与其主要经营活动的中国人,原对应之葡萄牙文Comprar意译为“购买”的意思,英文则作Comprador。清代买办分为洋行买办、外商银行买办、轮船公司买办,多以广东和江浙出身。这类由外商雇用之商人通常外语能力强,一方面可作为欧美商人与中国商人的翻译,也可处理欧美国家商界与中国政府之双向沟通。除此,这类型商人还可自营商铺,因此致富者颇众。

著名买办

  • 吴健彰
  • 杨坊:早期任职于怡和洋行,英语极为流利,后成为上海最早的大买办,帮助华尔洋枪队筹集资金抵抗太平天国进攻上海。
  • 陈廉伯
  • 何甘棠
  • 卢亚贵
  • 冯明珊:有利银行。
  • 郭甘章:广东香山县买办,1870年代初,名下有甘章船厂。
  • 唐廷枢
  • 张嘉璈
  • 莫仕扬:莫仕扬家族。
  • 吴炳垣 (阿伟)
  • 何东
  • 郑观应

从移民社会转型为定居社会以后,因为台湾1860年代开港通商,在传统的地主与郊商之外,买办成为台湾新兴的社会领导阶层:

  • 李春生:台湾19世纪中期的富商。其买办身份,延续到台湾日治时期。
  • 陈福谦:台湾打狗(今高雄)。
  • 陈中和

维基百科的定义比较中性:帮助外国人与国内的企业和政府打交道,做生意。

由于在清末,一直到建国,一直存在着一个不小的买办阶层,他们甚至和政治势力结合,形成官僚买办阶层。
列强想瓜分中国,政府贪污腐败不作为,和他们纠缠在一起的买办自然也没有好名声,他们的生意肯定有很大一部分会损害国家和人民的利益。

总结一下:

  1. 有一定规模
  2. 中介性质,在国外资本和国内市场之间活动
  3. 在我们的语境中,应该再加上一条:出卖国家和人民利益

#355 GNU/Linux 上如何快速创建一个大文件?「from StackOverflow」

2019-12-25

StackOverflow 上看到好些种快速创建文件的命令,逐个测试,在 Ubuntu 下可用的方法有以下几种:

time dd if=/dev/zero of=test.img bs=10M iflag=fullblock,count_bytes count=10G
# 0.00s user 0.45s system 1% cpu 39.144 total

# 在 xfsprogs 包中:
# -n 表示不写入数据
time xfs_mkfile -n 10g test.img
# 0.01s user 0.01s system 2% cpu 0.669 total

# 在 VBox 挂载的虚拟磁盘上执行时遇到 “不支持的操作” 错误
# 在 EXT4 磁盘上没有遇到问题,速度很快
time fallocate -l 10G test.img

time truncate -s 10G test.img
# 0.00s user 0.00s system 46% cpu 0.005 total

time dd if=/dev/zero of=test.img bs=1 count=0 seek=10G
# 0.00s user 0.00s system 77% cpu 0.002 total

最后看到的 dd seek 方案深得征信深得朕心。

根据这个思路,Python 创建 10G 的文件应该这么写(也是我一直以来的写法):

GB = 1 << 30
with open('test.img', 'w') as _file:
    _file.seek(10 * GB - 1)
    _file.write(chr(0))

#354 Systemd 相关命令

2019-12-21
apt-file list systemd | grep bin/
systemd: /bin/journalctl
systemd: /bin/loginctl
systemd: /bin/networkctl
systemd: /bin/systemctl
systemd: /bin/systemd
systemd: /bin/systemd-ask-password
systemd: /bin/systemd-escape
systemd: /bin/systemd-inhibit
systemd: /bin/systemd-machine-id-setup
systemd: /bin/systemd-notify
systemd: /bin/systemd-sysext
systemd: /bin/systemd-sysusers
systemd: /bin/systemd-tmpfiles
systemd: /bin/systemd-tty-ask-password-agent
systemd: /usr/bin/bootctl
systemd: /usr/bin/busctl
systemd: /usr/bin/hostnamectl
systemd: /usr/bin/kernel-install
systemd: /usr/bin/localectl
systemd: /usr/bin/resolvectl
systemd: /usr/bin/systemd-analyze
systemd: /usr/bin/systemd-cat
systemd: /usr/bin/systemd-cgls
systemd: /usr/bin/systemd-cgtop
systemd: /usr/bin/systemd-cryptenroll
systemd: /usr/bin/systemd-delta
systemd: /usr/bin/systemd-detect-virt
systemd: /usr/bin/systemd-id128
systemd: /usr/bin/systemd-mount
systemd: /usr/bin/systemd-path
systemd: /usr/bin/systemd-resolve
systemd: /usr/bin/systemd-run
systemd: /usr/bin/systemd-socket-activate
systemd: /usr/bin/systemd-stdio-bridge
systemd: /usr/bin/systemd-umount
systemd: /usr/bin/timedatectl
  • journalctl
  • loginctl
  • networkctl
  • systemctl
  • systemd
  • systemd-ask-password
  • systemd-escape
  • systemd-inhibit
  • systemd-machine-id-setup
  • systemd-notify
  • systemd-sysext
  • systemd-sysusers
  • systemd-tmpfiles
  • systemd-tty-ask-password-agent
  • bootctl
  • busctl
  • hostnamectl
  • kernel-install
  • localectl
  • resolvectl
  • systemd-analyze
  • systemd-cat
  • systemd-cgls
  • systemd-cgtop
  • systemd-cryptenroll
  • systemd-delta
  • systemd-detect-virt
  • systemd-id128
  • systemd-mount
  • systemd-path
  • systemd-resolve
  • systemd-run
  • systemd-socket-activate
  • systemd-stdio-bridge
  • systemd-umount
  • timedatectl
ps -ef | grep -E "systemd|systemd|dns|dhcp|udevd" | grep -Fv grep
root         333       1  0 10:00 ?        00:00:05 /lib/systemd/systemd-journald
root         419       1  0 10:00 ?        00:00:01 /lib/systemd/systemd-udevd
systemd+     546       1  0 10:00 ?        00:00:07 /lib/systemd/systemd-oomd
systemd+     547       1  0 10:00 ?        00:00:00 /lib/systemd/systemd-resolved
systemd+     548       1  0 10:00 ?        00:00:00 /lib/systemd/systemd-timesyncd
message+     573       1  0 10:00 ?        00:00:04 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root         680       1  0 10:00 ?        00:00:00 /lib/systemd/systemd-logind
root         682       1  0 10:00 ?        00:00:00 /usr/sbin/thermald --systemd --dbus-enable --adaptive
markjour     2508       1  0 10:05 ?        00:00:01 /lib/systemd/systemd --user
markjour     2523    2508  0 10:05 ?        00:00:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
markjour     5461    2508  0 10:11 ?        00:00:00 /usr/libexec/gnome-session-binary --systemd-service --session=ubuntu
root        6630       1  0 10:15 ?        00:00:00 systemd-tty-ask-password-agent --wall

#353 Systemd 子命令

2019-12-21
Unit Commands:
  list-units [PATTERN...]             List units currently in memory
  list-sockets [PATTERN...]           List socket units currently in memory,
                                      ordered by address
  list-timers [PATTERN...]            List timer units currently in memory,
                                      ordered by next elapse
  is-active PATTERN...                Check whether units are active
  is-failed PATTERN...                Check whether units are failed
  status [PATTERN...|PID...]          Show runtime status of one or more units
  show [PATTERN...|JOB...]            Show properties of one or more
                                      units/jobs or the manager
  cat PATTERN...                      Show files and drop-ins of specified units
  help PATTERN...|PID...              Show manual for one or more units
  list-dependencies [UNIT...]         Recursively show units which are required
                                      or wanted by the units or by which those
                                      units are required or wanted
  start UNIT...                       Start (activate) one or more units
  stop UNIT...                        Stop (deactivate) one or more units
  reload UNIT...                      Reload one or more units
  restart UNIT...                     Start or restart one or more units
  try-restart UNIT...                 Restart one or more units if active
  reload-or-restart UNIT...           Reload one or more units if possible,
                                      otherwise start or restart
  try-reload-or-restart UNIT...       If active, reload one or more units,
                                      if supported, otherwise restart
  isolate UNIT                        Start one unit and stop all others
  kill UNIT...                        Send signal to processes of a unit
  clean UNIT...                       Clean runtime, cache, state, logs or
                                      configuration of unit
  freeze PATTERN...                   Freeze execution of unit processes
  thaw PATTERN...                     Resume execution of a frozen unit
  set-property UNIT PROPERTY=VALUE... Sets one or more properties of a unit
  bind UNIT PATH [PATH]               Bind-mount a path from the host into a
                                      unit's namespace
  mount-image UNIT PATH [PATH [OPTS]] Mount an image from the host into a
                                      unit's namespace
  service-log-level SERVICE [LEVEL]   Get/set logging threshold for service
  service-log-target SERVICE [TARGET] Get/set logging target for service
  reset-failed [PATTERN...]           Reset failed state for all, one, or more
                                      units
Unit File Commands:
  list-unit-files [PATTERN...]        List installed unit files
  enable [UNIT...|PATH...]            Enable one or more unit files
  disable UNIT...                     Disable one or more unit files
  reenable UNIT...                    Reenable one or more unit files
  preset UNIT...                      Enable/disable one or more unit files
                                      based on preset configuration
  preset-all                          Enable/disable all unit files based on
                                      preset configuration
  is-enabled UNIT...                  Check whether unit files are enabled
  mask UNIT...                        Mask one or more units
  unmask UNIT...                      Unmask one or more units
  link PATH...                        Link one or more units files into
                                      the search path
  revert UNIT...                      Revert one or more unit files to vendor
                                      version
  add-wants TARGET UNIT...            Add 'Wants' dependency for the target
                                      on specified one or more units
  add-requires TARGET UNIT...         Add 'Requires' dependency for the target
                                      on specified one or more units
  edit UNIT...                        Edit one or more unit files
  get-default                         Get the name of the default target
  set-default TARGET                  Set the default target

Machine Commands:
  list-machines [PATTERN...]          List local containers and host

Job Commands:
  list-jobs [PATTERN...]              List jobs
  cancel [JOB...]                     Cancel all, one, or more jobs

Environment Commands:
  show-environment                    Dump environment
  set-environment VARIABLE=VALUE...   Set one or more environment variables
  unset-environment VARIABLE...       Unset one or more environment variables
  import-environment VARIABLE...      Import all or some environment variables

Manager State Commands:
  daemon-reload                       Reload systemd manager configuration
  daemon-reexec                       Reexecute systemd manager
  log-level [LEVEL]                   Get/set logging threshold for manager
  log-target [TARGET]                 Get/set logging target for manager
  service-watchdogs [BOOL]            Get/set service watchdog state

System Commands:
  is-system-running                   Check whether system is fully running
  default                             Enter system default mode
  rescue                              Enter system rescue mode
  emergency                           Enter system emergency mode
  halt                                Shut down and halt the system
  poweroff                            Shut down and power-off the system
  reboot                              Shut down and reboot the system
  kexec                               Shut down and reboot the system with kexec
  exit [EXIT_CODE]                    Request user instance or container exit
  switch-root ROOT [INIT]             Change to a different root file system
  suspend                             Suspend the system
  hibernate                           Hibernate the system
  hybrid-sleep                        Hibernate and suspend the system
  suspend-then-hibernate              Suspend the system, wake after a period of
                                      time, and hibernate

#352 Systemd 的问题

2019-12-20

开源中国上看到 Debian 正在投票是否支持非 systemd 初始化系统

  1. 2014 年素来混乱的 Debian 社区,经过了一番激烈争论之后(甚至是生命安全威胁),终于决定支持 systemd。
    PS: 这场争议导致部分核心人员离开,主要是对 Debian 社区的管理机制(混乱 “民主”)产生质疑。
  2. 2015 年 5 月发布的 Debian 8.0 (Jessie) 开始使用 Systemd 当默认的初始化系统。
    但是关于 Systemd 的争论从未停止,甚至有部分开发者独自维护了一个拒绝 Systemd 的分叉:Devuan

Systemd 真是闹出好大争议,和 GNOME3 一样。也正是有 GNOME3 的例子(社区总体来说,或者说大多数人,最后还是拥抱了变化,接纳 GNOME3),而且我只是一个实用主义的使用者,我觉得 Systemd 挺好的,能提升性能、使用又方便,为什么不呢。