#411 “锟斤拷” 到底是个啥?

2020-11-01

img

手持两把锟斤拷,
口中疾呼烫烫烫。
脚踏千朵屯屯屯,
笑看万物锘锘锘。

开发者经常这样调侃编码问题:手持两把锟斤拷,口中疾呼烫烫烫。

程序员都知道字符编码,比如 ASCII,GBK,UTF-8,那肯定能理解这些神奇的 “乱码” 出现的原因,肯定是某些地方没有正确处理编码。

那为什么总是能看见 锟斤拷烫烫烫呢?其背后隐藏更深的原因是啥?

#410 Golang 数据类型

2020-10-31

基础类型:

  • Boolean types (bool)
  • Numeric types
  • String types (string)

复合类型:

  • Array types ([len]Type)
  • Slice types ([]Type)
  • Struct types (struct)
  • Map types (map[KeyType]ValueType{})

特殊类型:

  • Pointer types (*Type) 指针
  • Function types (func) 函数
  • Interface types (interface) 接口
  • Channel types (chan) 通道

引用类型

基础类型 + Array + Struct 不是引用类型,其他几种(Slice + Map + Pointer + Function + Interface + Channel)都是引用类型,函数传参的时候需要记住这一点。

数值

uint8       the set of all unsigned  8-bit integers (0 to 255)
uint16      the set of all unsigned 16-bit integers (0 to 65535)
uint32      the set of all unsigned 32-bit integers (0 to 4294967295)
uint64      the set of all unsigned 64-bit integers (0 to 18446744073709551615)

int8        the set of all signed  8-bit integers (-128 to 127)
int16       the set of all signed 16-bit integers (-32768 to 32767)
int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)

float32     the set of all IEEE-754 32-bit floating-point numbers
float64     the set of all IEEE-754 64-bit floating-point numbers

complex64   the set of all complex numbers with float32 real and imaginary parts
complex128  the set of all complex numbers with float64 real and imaginary parts

byte        alias for uint8
rune        alias for int32

// 实现相关:
uint     either 32 or 64 bits
int      same size as uint
uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value

声明

var foo int

var foo int = 1

foo := 1

const foo = 1

const foo int = 1

注意:只有基础类型可以声明为常量。

#409 常见药品名称

2020-10-30

经常使用,或者在书本上、网络上、电视广告上,或其他日常生活场景中,经常接触到的药品。

#408 RQ 任务队列

2020-10-19

RQ (Redis Queue) is a simple Python library for queueing jobs and processing them in the background with workers. It is backed by Redis and it is designed to have a low barrier to entry. It can be integrated in your web stack easily.

翻译:RQ (Redis Queue)是一个简单的 Python 库,用于将作业排队并在后台与 worker 一起处理它们。它由 Redis 支持,其设计具有较低的进入门槛。它可以很容易地集成到您的 web 堆栈中。

This project has been inspired by the good parts of Celery, Resque and this snippet, and has been created as a lightweight alternative to existing queueing frameworks, with a low barrier to entry.

示例

启动 worker 进程:

rq worker
rq worker --url redis://:secrets@example.com:1234/9

项目中添加任务:

from redis import Redis
from rq import Queue

# 队列
q = Queue(connection=Redis())

# 添加任务
from my_module import count_words_at_url
result = q.enqueue(count_words_at_url, 'http://nvie.com')

# 关于重试
from rq import Retry
# 失败之后立即重试
queue.enqueue(say_hello, retry=Retry(max=3))
# 失败之后间隔指定时间重试
queue.enqueue(say_hello, retry=Retry(max=3, interval=[10, 30, 60]))

获取结果:


参考资料与拓展阅读

#407 Python 删除文件

2020-09-27

平时删除文件都是 os.unlink 和 os.remove 中随便选一个,今天突然想看看这两个方法有什么不一样。

remove 和 unlink 实际上来自 Modules/posixmodule.c
可以看到这两个方法实际上相同。

/*[clinic input]
os.remove = os.unlink
Remove a file (same as unlink()).
If dir_fd is not None, it should be a file descriptor open to a directory,
  and path should be relative; path will then be relative to that directory.
dir_fd may not be implemented on your platform.
  If it is unavailable, using it will raise a NotImplementedError.
[clinic start generated code]*/

static PyObject *
os_remove_impl(PyObject *module, path_t *path, int dir_fd)
/*[clinic end generated code: output=a8535b28f0068883 input=e05c5ab55cd30983]*/
{
    return os_unlink_impl(module, path, dir_fd);
}

Python 3 的 Path 对象中也有一个 unlink 方法(pathlib.Path.unlink):

def unlink(self, missing_ok=False):
    """
    Remove this file or link.
    If the path is a directory, use rmdir() instead.
    """
    try:
        os.unlink(self)
    except FileNotFoundError:
        if not missing_ok:
            raise

顺便对删除目录做一个整理:

# os.remove(path: StrOrBytesPath, *, dir_fd: int | None = ...)
# os.unlink(path: StrOrBytesPath, *, dir_fd: int | None = ...)

os.mkdir(path: StrOrBytesPath, mode: int = ..., *, dir_fd: int | None = ...)
os.rmdir(path: StrOrBytesPath, *, dir_fd: int | None = ...)

os.makedirs(name: StrOrBytesPath, mode: int = ..., exist_ok: bool = ...)
os.removedirs(name: StrOrBytesPath)

pathlib.Path.rmdir -> os.rmdir

shutil.rmtree(path, ignore_errors=False, onerror=None, *, dir_fd=None)

#404 林觉民:与妻书

2020-08-25

全文

意映卿卿如晤:吾今以此书与汝永别矣!吾作此书时,尚是世中一人;汝看此书时,吾已成为阴间一鬼。吾作此书,泪珠和笔墨齐下,不能竟书而欲搁笔,又恐汝不察吾衷,谓吾忍舍汝而死,谓吾不知汝之不欲吾死也,故遂忍悲为汝言之。

吾至爱汝,即此爱汝一念,使吾勇于就死也。吾自遇汝以来,常愿天下有情人都成眷属;然遍地腥云,满街狼犬,称心快意,几家能彀?司马青衫,吾不能学太上之忘情也。语云:仁者 “老吾老,以及人之老;幼吾幼,以及人之幼”。吾充吾爱汝之心,助天下人爱其所爱,所以敢先汝而死,不顾汝也。汝体吾此心,于啼泣之余,亦以天下人为念,当亦乐牺牲吾身与汝身之福利,为天下人谋永福也。汝其勿悲!

汝忆否?四五年前某夕,吾尝语曰:“与使吾先死也,无宁汝先我而死。”汝初闻言而怒,后经吾婉解,虽不谓吾言为是,而亦无词相答。吾之意盖谓以汝之弱,必不能禁失吾之悲,吾先死,留苦与汝,吾心不忍,故宁请汝先死,吾担悲也。嗟夫!谁知吾卒先汝而死乎?

吾真真不能忘汝也!回忆后街之屋,入门穿廊,过前后厅,又三四折,有小厅,厅旁一室,为吾与汝双栖之所。初婚三四个月,适冬之望日前后,窗外疏梅筛月影,依稀掩映;吾与并肩携手,低低切切,何事不语?何情不诉?及今思之,空余泪痕。又回忆六七年前,吾之逃家复归也,汝泣告我:“望今后有远行,必以告妾,妾愿随君行。”吾亦既许汝矣。前十余日回家,即欲乘便以此行之事语汝,及与汝相对,又不能启口,且以汝之有身也,更恐不胜悲,故惟日日呼酒买醉。嗟夫!当时余心之悲,盖不能以寸管形容之。

吾诚愿与汝相守以死,第以今日事势观之,天灾可以死,盗贼可以死,瓜分之日可以死,奸官污吏虐民可以死,吾辈处今日之中国,国中无地无时不可以死。到那时使吾眼睁睁看汝死,或使汝眼睁睁看吾死,吾能之乎?抑汝能之乎?即可不死,而离散不相见,徒使两地眼成穿而骨化石,试问古来几曾见破镜能重圆?则较死为苦也,将奈之何?今日吾与汝幸双健。天下人不当死而死与不愿离而离者,不可数计,钟情如我辈者,能忍之乎?此吾所以敢率性就死不顾汝也。吾今死无余憾,国事成不成自有同志者在。依新已五岁,转眼成人,汝其善抚之,使之肖我。汝腹中之物,吾疑其女也,女必像汝,吾心甚慰。或又是男,则亦教其以父志为志,则吾死后尚有二意洞在也。幸甚,幸甚!吾家后日当甚贫,贫无所苦,清静过日而已。

吾今与汝无言矣。吾居九泉之下遥闻汝哭声,当哭相和也。吾平日不信有鬼,今则又望其真有。今是人又言心电感应有道,吾亦望其言是实,则吾之死,吾灵尚依依旁汝也,汝不必以无侣悲。

吾平生未尝以吾所志语汝,是吾不是处;然语之,又恐汝日日为吾担忧。吾牺牲百死而不辞,而使汝担忧,的的非吾所忍。吾爱汝至,所以为汝谋者惟恐未尽。汝幸而偶我,又何不幸而生今日中国!吾幸而得汝,又何不幸而生今日之中国!卒不忍独善其身。嗟夫!巾短情长,所未尽者,尚有万千,汝可以模拟得之。吾今不能见汝矣!汝不能舍吾,其时时于梦中得我乎?一恸。

辛未三月廿六夜四鼓,意洞手书。

家中诸母皆通文,有不解处,望请其指教,当尽吾意为幸。

相关信息

林觉民(1886年—1911年),字意洞,号抖飞,又号天外生。
福建闽县人。
十四岁进福建高等学堂,1907年日本留学,入庆应大学文科攻读哲学,后参加同盟会,从事革命活动。
1911年回国参加广州起义,4月27日,与方声洞等领先袭击总督衙门,负伤被捕,数日后从容就义。为黄花岗七十二烈士之一。

 

1911年5月3日(清宣统三年五月二日),林觉民在广州天字码头被枪杀,年仅24岁。

 

1911年,林觉民受同盟会第十四支部派遣回闽,联络革命党人,筹集经费,招募志士赴广州参加起义。
他依依不舍地告别家人,率第一批义士从马尾港上船赴香港。
广州起义(又称黄花岗起义)的前三天,即4月24日,林觉民与战友在香港滨江楼同宿。
待战友们入睡后,他想到自己的弱妻稚子,他和妻子的婚姻虽然是父母包办,但两人感情深厚、琴瑟和鸣。
对于即将到来的生死未卜,林觉民在一块白方巾上给妻子陈意映写下这封最后的家书。
在写《与妻书》的同时,林觉民还给他叔父林孝颖先生写了一封不到40字的信。
起义失败后,有人秘密将这两封信在半夜里塞进林觉民家门缝里,第二天清晨家人才发现这两封信。

林觉民的养父林孝颍是晚清名士。
写给叔父的信又被称之为《禀父书》:

不孝儿觉民叩禀:父亲大人,儿死矣,惟累大人吃苦,弟妹缺衣食耳。然大有补于全国同胞也。大罪乞恕之。

陈意映(1891—1913)比林觉民小 5 岁。

林觉民牺牲后,陈意映无法承受丧夫之痛的沉重打击,一度意欲轻生。在林觉民的父母跪求下,她才强忍悲伤、痛苦地活下来,但终因悲伤过度,在1913年病逝,年仅22岁。

其他:

  1. 北洋时期的政治家林长民是林觉民的堂兄。
    著名才女林徽因就是林长民的女儿。
  2. 林觉民有二子一女,长子林依新夭折,次子林仲新(1911-1983),女儿林暖苏(1908-2001)。
    1959 年,林仲新捐赠 “与妻书” 给福建博物馆

影视作品

  1. 百年情书》 台湾演员王柏杰
  2. 辛亥革命》 胡歌

参考资料与拓展阅读

#402 转载:五种常见的 PHP 设计模式

2020-08-06

注:这是我在很久以前收藏的一篇文章,来自 IBM Developer,整理资料的时候被翻出来,贴出来算了。
设计模式只是为 Java™ 架构师准备的 —— 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非常有用?本文解释了这些问题。