#378 武汉新型冠状病毒
时事 COVID19 2020-01-29具体的情况,网上不要太多,我说说我的经历和想法。
coding in a complicated world
具体的情况,网上不要太多,我说说我的经历和想法。
输入 help 之后,按照提示就会发现 MySQL 有一个主题树。
从头 help contents 开始:
Account ManagementALTER RESOURCE GROUPALTER USERCREATE RESOURCE GROUPCREATE ROLECREATE USERDROP RESOURCE GROUPDROP ROLEDROP USERGRANTRENAME USERREVOKESET DEFAULT ROLESET PASSWORDSET RESOURCE GROUPSET ROLEAdministrationBINLOGCACHE INDEXFLUSHHELP COMMANDKILLLOAD INDEXRESETRESET PERSISTRESTARTSETSET CHARACTER SETSET CHARSETSET NAMESSHOWSHOW BINARY LOGSSHOW BINLOG EVENTSSHOW CHARACTER SETSHOW COLLATIONSHOW COLUMNSSHOW CREATE DATABASESHOW CREATE EVENTSHOW CREATE FUNCTIONSHOW CREATE PROCEDURESHOW CREATE SCHEMASHOW CREATE TABLESHOW CREATE TRIGGERSHOW CREATE USERSHOW CREATE VIEWSHOW DATABASESSHOW ENGINESHOW ENGINESSHOW ERRORSSHOW EVENTSSHOW FIELDSSHOW FUNCTION CODESHOW FUNCTION STATUSSHOW GRANTSSHOW INDEXSHOW MASTER LOGSSHOW MASTER STATUSSHOW OPEN TABLESSHOW PLUGINSSHOW PRIVILEGESSHOW PROCEDURE CODESHOW PROCEDURE STATUSSHOW PROCESSLISTSHOW PROFILESHOW PROFILESSHOW RELAYLOG EVENTSSHOW REPLICA STATUSSHOW REPLICASSHOW SCHEMASSHOW SLAVE HOSTSSHOW SLAVE STATUSSHOW STATUSSHOW TABLE STATUSSHOW TABLESSHOW TRIGGERSSHOW VARIABLESSHOW WARNINGSSHUTDOWNComponentsCLONEINSTALL COMPONENTUNINSTALL COMPONENTUNINSTALL PLUGINCompound StatementsBEGIN ENDCASE STATEMENTCLOSEDECLARE CONDITIONDECLARE CURSORDECLARE HANDLERDECLARE VARIABLEFETCHGET DIAGNOSTICSIF STATEMENTITERATELABELSLEAVELOOPOPENREPEAT LOOPRESIGNALRETURNSIGNALWHILEContentsData DefinitionALTER DATABASEALTER EVENTALTER FUNCTIONALTER INSTANCEALTER LOGFILE GROUPALTER PROCEDUREALTER SCHEMAALTER SERVERALTER TABLEALTER TABLESPACEALTER VIEWCREATE DATABASECREATE EVENTCREATE FUNCTIONCREATE INDEXCREATE LOGFILE GROUPCREATE PROCEDURECREATE SCHEMACREATE SERVERCREATE SPATIAL REFERENCE SYSTEMCREATE TABLECREATE TABLESPACECREATE TRIGGERCREATE VIEWDROP DATABASEDROP EVENTDROP FUNCTIONDROP INDEXDROP PROCEDUREDROP SCHEMADROP SERVERDROP SPATIAL REFERENCE SYSTEMDROP TABLEDROP TABLESPACEDROP TRIGGERDROP VIEWFOREIGN KEYRENAME TABLETRUNCATE TABLEData ManipulationCALLDELETEDODUALHANDLERIMPORT TABLEINSERTINSERT DELAYEDINSERT SELECTJOINLOAD DATALOAD XMLPARENTHESIZED QUERY EXPRESSIONSREPLACESELECTTABLEUNIONUPDATEVALUES STATEMENTData TypesAUTO_INCREMENTBIGINTBINARYBITBLOBBLOB DATA TYPEBOOLEANCHARCHAR BYTEDATEDATETIMEDECDECIMALDOUBLEDOUBLE PRECISIONENUMFLOATINTINTEGERLONGBLOBLONGTEXTMEDIUMBLOBMEDIUMINTMEDIUMTEXTSET DATA TYPESMALLINTTEXTTIMETIMESTAMPTINYBLOBTINYINTTINYTEXTVARBINARYVARCHARYEAR DATA TYPEFunctionsAggregate Functions and ModifiersAVGBIT_ANDBIT_ORBIT_XORCOUNTCOUNT DISTINCTGROUP_CONCATJSON_ARRAYAGGJSON_OBJECTAGGMAXMINSTDSTDDEVSTDDEV_POPSTDDEV_SAMPSUMVARIANCEVAR_POPVAR_SAMPBit Functions&<<>>BIT_COUNT^|~Cast Functions and OperatorsBINARY OPERATORCASTCONVERTComparison Operators!=<<=<=>=>>=BETWEEN ANDCOALESCEGREATESTININTERVALISIS NOTIS NOT NULLIS NULLISNULLLEASTNOT BETWEENNOT INDate and Time FunctionsADDDATEADDTIMECONVERT_TZCURDATECURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPCURTIMEDATE FUNCTIONDATEDIFFDATE_ADDDATE_FORMATDATE_SUBDAYDAYNAMEDAYOFMONTHDAYOFWEEKDAYOFYEAREXTRACTFROM_DAYSFROM_UNIXTIMEGET_FORMATHOURLAST_DAYLOCALTIMELOCALTIMESTAMPMAKEDATEMAKETIMEMICROSECONDMINUTEMONTHMONTHNAMENOWPERIOD_ADDPERIOD_DIFFQUARTERSECONDSEC_TO_TIMESTR_TO_DATESUBDATESUBTIMESYSDATETIME FUNCTIONTIMEDIFFTIMESTAMP FUNCTIONTIMESTAMPADDTIMESTAMPDIFFTIME_FORMATTIME_TO_SECTO_DAYSTO_SECONDSUNIX_TIMESTAMPUTC_DATEUTC_TIMEUTC_TIMESTAMPWEEKWEEKDAYWEEKOFYEARYEARYEARWEEKEncryption FunctionsAES_DECRYPTAES_ENCRYPTCOMPRESSMD5RANDOM_BYTESSHA1SHA2STATEMENT_DIGESTSTATEMENT_DIGEST_TEXTUNCOMPRESSUNCOMPRESSED_LENGTHVALIDATE_PASSWORD_STRENGTHEnterprise Encryption FunctionsASYMMETRIC_DECRYPTASYMMETRIC_DERIVEASYMMETRIC_ENCRYPTASYMMETRIC_SIGNASYMMETRIC_VERIFYCREATE_ASYMMETRIC_PRIV_KEYCREATE_ASYMMETRIC_PUB_KEYCREATE_DH_PARAMETERSCREATE_DIGESTFlow Control FunctionsCASE OPERATORIF FUNCTIONIFNULLNULLIFGROUP BY Functions and ModifiersGTIDGTID_SUBSETGTID_SUBTRACTWAIT_FOR_EXECUTED_GTID_SETWAIT_UNTIL_SQL_THREAD_AFTER_GTIDSInformation FunctionsBENCHMARKCHARSETCOERCIBILITYCOLLATIONCONNECTION_IDCURRENT_ROLECURRENT_USERDATABASEFOUND_ROWSICU_VERSIONLAST_INSERT_IDROLES_GRAPHMLROW_COUNTSCHEMASESSION_USERSYSTEM_USERUSERVERSIONInternal FunctionsCAN_ACCESS_COLUMNCAN_ACCESS_DATABASECAN_ACCESS_TABLECAN_ACCESS_USERCAN_ACCESS_VIEWGET_DD_COLUMN_PRIVILEGESGET_DD_CREATE_OPTIONSGET_DD_INDEX_SUB_PART_LENGTHINTERNAL_AUTO_INCREMENTINTERNAL_AVG_ROW_LENGTHINTERNAL_CHECKSUMINTERNAL_CHECK_TIMEINTERNAL_DATA_FREEINTERNAL_DATA_LENGTHINTERNAL_DD_CHAR_LENGTHINTERNAL_GET_COMMENT_OR_ERRORINTERNAL_GET_ENABLED_ROLE_JSONINTERNAL_GET_HOSTNAMEINTERNAL_GET_USERNAMEINTERNAL_GET_VIEW_WARNING_OR_ERRORINTERNAL_INDEX_COLUMN_CARDINALITYINTERNAL_INDEX_LENGTHINTERNAL_IS_ENABLED_ROLEINTERNAL_IS_MANDATORY_ROLEINTERNAL_KEYS_DISABLEDINTERNAL_MAX_DATA_LENGTHINTERNAL_TABLE_ROWSINTERNAL_UPDATE_TIMEIS_VISIBLE_DD_OBJECTLocking FunctionsGET_LOCKIS_FREE_LOCKIS_USED_LOCKRELEASE_ALL_LOCKSRELEASE_LOCKLogical Operators!ANDASSIGN-EQUALASSIGN-VALUEORXORMiscellaneous FunctionsANY_VALUEBIN_TO_UUIDDEFAULTGROUPINGINET6_ATONINET6_NTOAINET_ATONINET_NTOAIS_IPV4IS_IPV4_COMPATIS_IPV4_MAPPEDIS_IPV6IS_UUIDMASTER_POS_WAITNAME_CONSTSLEEPSOURCE_POS_WAITUUIDUUID_SHORTUUID_TO_BINVALUESNumeric Functions%*+- BINARY- UNARY/ABSACOSASINATANATAN2CEILCEILINGCONVCOSCOTCRC32DEGREESDIVEXPFLOORLNLOGLOG10LOG2MODPIPOWPOWERRADIANSRANDROUNDSIGNSINSQRTTANTRUNCATEPerformance Schema FunctionsFORMAT_BYTESFORMAT_PICO_TIMEPS_CURRENT_THREAD_IDPS_THREAD_IDSpatial FunctionsGeometry ConstructorsGEOMCOLLECTIONGEOMETRYCOLLECTIONLINESTRINGMULTILINESTRINGMULTIPOINTMULTIPOLYGONPOINTPOLYGONGeometry Property FunctionsST_DIMENSIONST_ENVELOPEST_GEOMETRYTYPEST_ISEMPTYST_ISSIMPLEST_SRIDGeometry Relation FunctionsST_CONTAINSST_CROSSESST_DISJOINTST_DISTANCEST_EQUALSST_FRECHETDISTANCEST_HAUSDORFFDISTANCEST_INTERSECTSST_OVERLAPSST_TOUCHESST_WITHINGeometryCollection Property FunctionsST_BUFFERST_BUFFER_STRATEGYST_CONVEXHULLST_DIFFERENCEST_GEOMETRYNST_INTERSECTIONST_LINEINTERPOLATEPOINTST_LINEINTERPOLATEPOINTSST_NUMGEOMETRIESST_POINTATDISTANCEST_SYMDIFFERENCEST_TRANSFORMST_UNIONLineString Property FunctionsST_ENDPOINTST_ISCLOSEDST_LENGTHST_NUMPOINTSST_POINTNST_STARTPOINTMBR Functions->->>JSON_ARRAYJSON_ARRAY_APPENDJSON_ARRAY_INSERTJSON_CONTAINSJSON_CONTAINS_PATHJSON_DEPTHJSON_EXTRACTJSON_INSERTJSON_KEYSJSON_LENGTHJSON_MERGEJSON_MERGE_PATCH()JSON_MERGE_PRESERVE()JSON_OBJECTJSON_OVERLAPSJSON_PRETTYJSON_QUOTEJSON_REMOVEJSON_REPLACEJSON_SCHEMA_VALIDJSON_SCHEMA_VALIDATION_REPORTJSON_SEARCHJSON_SETJSON_STORAGE_FREEJSON_STORAGE_SIZEJSON_TABLEJSON_TYPEJSON_UNQUOTEJSON_VALIDJSON_VALUEMBRCONTAINSMBRCOVEREDBYMBRCOVERSMBRDISJOINTMBREQUALSMBRINTERSECTSMBROVERLAPSMBRTOUCHESMBRWITHINMEMBER OFST_ASGEOJSONST_COLLECTST_DISTANCE_SPHEREST_GEOHASHST_GEOMFROMGEOJSONST_ISVALIDST_LATFROMGEOHASHST_LONGFROMGEOHASHST_MAKEENVELOPEST_POINTFROMGEOHASHST_SIMPLIFYST_VALIDATEPoint Property FunctionsST_LATITUDEST_LONGITUDEST_XST_YPolygon Property FunctionsST_AREAST_CENTROIDST_EXTERIORRINGST_INTERIORRINGNST_NUMINTERIORRINGSWKB FunctionsST_ASBINARYST_ASTEXTST_GEOMCOLLFROMWKBST_GEOMFROMWKBST_LINEFROMWKBST_MLINEFROMWKBST_MPOINTFROMWKBST_MPOLYFROMWKBST_POINTFROMWKBST_POLYFROMWKBST_SWAPXYWKT FunctionsST_GEOMCOLLFROMTEXTST_GEOMFROMTEXTST_LINEFROMTEXTST_MLINEFROMTEXTST_MPOINTFROMTEXTST_MPOLYFROMTEXTST_POINTFROMTEXTST_POLYFROMTEXTString FunctionsASCIIBINBIT_LENGTHCHAR FUNCTIONCHARACTER_LENGTHCHAR_LENGTHCONCATCONCAT_WSELTEXPORT_SETFIELDFIND_IN_SETFORMATFROM_BASE64HEXINSERT FUNCTIONINSTRLCASELEFTLENGTHLIKELOAD_FILELOCATELOWERLPADLTRIMMAKE_SETMATCH AGAINSTMIDNOT LIKENOT REGEXPOCTOCTET_LENGTHORDPOSITIONQUOTEREGEXPREGEXP_INSTRREGEXP_LIKEREGEXP_REPLACEREGEXP_SUBSTRREPEAT FUNCTIONREPLACE FUNCTIONREVERSERIGHTRPADRTRIMSOUNDEXSOUNDS LIKESPACESTRCMPSUBSTRSUBSTRINGSUBSTRING_INDEXTO_BASE64TRIMUCASEUNHEXUPPERWEIGHT_STRINGWindow FunctionsCUME_DISTDENSE_RANKFIRST_VALUELAGLAST_VALUELEADNTH_VALUENTILEPERCENT_RANKRANKROW_NUMBERXMLEXTRACTVALUEUPDATEXMLGeographic FeaturesGEOMETRY HIERARCHYSPATIAL COLUMNSSPATIAL INDEXESMBRWKTHelp MetadataHELP_DATEHELP_VERSIONLanguage StructureFALSETRUELoadable FunctionsCREATE FUNCTION LOADABLE FUNCTIONDROP FUNCTION LOADABLE FUNCTIONPluginsPrepared StatementsDEALLOCATE PREPAREDROP PREPAREEXECUTE STATEMENTPREPAREReplication StatementsCHANGE MASTER TOCHANGE REPLICATION FILTERCHANGE REPLICATION SOURCE TOPURGE BINARY LOGSPURGE MASTER LOGSRESET MASTERRESET REPLICARESET SLAVESET SQL_LOG_BINSTART REPLICASTART SLAVESTOP REPLICASTOP SLAVEStorage EnginesTable MaintenanceANALYZE TABLECHECK TABLECHECKSUM TABLEOPTIMIZE TABLEREPAIR TABLETransactionsBEGINCOMMITLOCK INSTANCE FOR BACKUPLOCK TABLESRELEASE SAVEPOINTROLLBACKROLLBACK TO SAVEPOINTSAVEPOINTSET TRANSACTIONSTART TRANSACTIONXAUtilityDESCDESCRIBEEXPLAINHELP STATEMENTUSE多线程执行 MySQL 查询的时候会遇到 Packet sequence number wrong 错误。
Traceback (most recent call last):
File "/tmp/db.py", line 167, in _execute
rowcount = cur.execute(sql, args)
File "/usr/local/lib/python2.7/site-packages/pymysql/cursors.py", line 163, in execute
result = self._query(query)
File "/usr/local/lib/python2.7/site-packages/pymysql/cursors.py", line 321, in _query
conn.query(q)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 505, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 724, in _read_query_result
result.read()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1076, in read
self._read_result_packet(first_packet)
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1146, in _read_result_packet
self._read_rowdata_packet()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1180, in _read_rowdata_packet
packet = self.connection._read_packet()
File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 660, in _read_packet
% (packet_number, self._next_seq_id))
InternalError: Packet sequence number wrong - got 51 expected 178
多个查询共用连接,并发查询的时候,现在的 MySQL 网络传输机制无法判断这个返回属于哪个查询。
所以每个线程应该使用不同的连接,或者在 execute 之前加一个锁。
有同事排查 Python 项目问题的时候指出一处 open 没有关闭可能会导致句柄泄露 Handle Leak。
PS: 句柄泄漏的危害:大量资源占用可能导致性能下降,甚至由于可打开文件数达到极限,服务无法继续向外提供服务。
我看了之后告诉他,此处函数退出之后句柄会自动关闭,他还不信,下去自己研究了一会儿,可能是百度一下,过一会儿说好像确实是这样,不过他仍然很疑惑,那么 with open 的作用是什么呢?
一般我们常用上下文管理的方式(with open)来打开文件,这样可以自动关闭句柄,这是一个好的实践。
close 方法放在 finally 块中。进程退出时如果有没有关闭的句柄,
至少我看到 POSIX 中有相关规定,无论任何原因或任何方式的退出,都应该:
All of the file descriptors, directory streams, conversion descriptors, and message catalog descriptors open in the calling process shall be closed.
PS: 其中提到的:
后面三个是个啥?
参考: https://en.wikipedia.org/wiki/Comparison_of_command_shells
/bin/sh 都指向某一种兼容 Shell (一般是默认 Shell)所以可能使用最广泛的 Shell 是 ash 和 bash。
其他:MacOS 上曾经默认采用 bash, 后来专向了 zsh
Toy Story (1995)Toy Story 2 (1999)Toy Story 3 (2010)Toy Story 4 (2019)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__ 方法frozen 是否允许对字段赋值namedtuple。这意味着一旦实例化后,无法修改其中的属性值。match_argskw_only 是否仅关键词传参slots 是否生成 __slots__ 方法weakref_slot 是否添加 __wrakref__ 槽位(弱引用)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
“买办” 这个词偶尔见到,给我的感觉是只管赚钱,不爱国甚至损害国家利益和民族利益来牟利的商人。
买办是指在清代五口通商地区被西方公民雇佣并且参与其主要经营活动的中国人,原对应之葡萄牙文Comprar意译为“购买”的意思,英文则作Comprador。清代买办分为洋行买办、外商银行买办、轮船公司买办,多以广东和江浙出身。这类由外商雇用之商人通常外语能力强,一方面可作为欧美商人与中国商人的翻译,也可处理欧美国家商界与中国政府之双向沟通。除此,这类型商人还可自营商铺,因此致富者颇众。
著名买办
- 吴健彰
- 杨坊:早期任职于怡和洋行,英语极为流利,后成为上海最早的大买办,帮助华尔洋枪队筹集资金抵抗太平天国进攻上海。
- 陈廉伯
- 何甘棠
- 卢亚贵
- 冯明珊:有利银行。
- 郭甘章:广东香山县买办,1870年代初,名下有甘章船厂。
- 唐廷枢
- 张嘉璈
- 莫仕扬:莫仕扬家族。
- 吴炳垣 (阿伟)
- 何东
- 郑观应
从移民社会转型为定居社会以后,因为台湾1860年代开港通商,在传统的地主与郊商之外,买办成为台湾新兴的社会领导阶层:
- 李春生:台湾19世纪中期的富商。其买办身份,延续到台湾日治时期。
- 陈福谦:台湾打狗(今高雄)。
- 陈中和
维基百科的定义比较中性:帮助外国人与国内的企业和政府打交道,做生意。
由于在清末,一直到建国,一直存在着一个不小的买办阶层,他们甚至和政治势力结合,形成官僚买办阶层。
列强想瓜分中国,政府贪污腐败不作为,和他们纠缠在一起的买办自然也没有好名声,他们的生意肯定有很大一部分会损害国家和人民的利益。
总结一下:
只列出 6.0 之后的版本。按版本号排序。