#405 转载:邮件的 Return-Path 头是什么

2020-07-31

We can all agree that email communication is essential for successful businesses. However, for your emails to be successful and produce conversions, they have to land in the inbox. 
我们都同意电子邮件通信对于成功的企业至关重要。但是,要使您的电子邮件成功并产生转化,它们必须进入收件箱。

But what happens when emails don’t make it to the inbox? Where do they go when they bounce? How are they processed?
但是,当电子邮件没有进入收件箱时会发生什么?当它们反弹时,它们会去哪里?它们是如何处理的?

Enter return-path.
使用 Return-Path 。

Return-path is a hidden email header that indicates where and how bounced emails will be processed. This header, also referred to as a bounce address or reverse path, is an SMTP address that is separate from your original sending address, and is used specifically for collecting and processing bounced messages.
Return-Path 是一个隐藏的电子邮件标头,指示处理退回电子邮件的位置和方式。此标头(也称为退回地址或反向路径)是独立于原始发送地址的 SMTP 地址,专门用于收集和处理退回的邮件。

Having a clear return-path system in place is incredibly important for your email program. It acts as a safeguard, protecting senders by providing a separate location for processing bounced emails. Your original sending inbox isn’t crowded by those “failed delivery” emails and that bounced messages are kept organized and together. Having a clear, organized return-path for bounced messages can also help your email deliverability and maintain your sending reputation.
拥有清晰的 Return-Path 系统对于您的电子邮件程序非常重要。它作为一种保护措施,通过提供单独的位置来处理退回的电子邮件来保护发件人。您的原始发送收件箱不会被那些“传递失败”的电子邮件所拥挤,并且退回的邮件保持井井有条并在一起。为退回的邮件提供清晰、有组织的 Return-Path 还有助于您的电子邮件送达率并保持您的发送声誉。

Why is return-path important?(为什么 Return-Path 很重要?)

Return-path is an important tool to have at your disposal, especially for mass email sends. Let’s say you’re sending an email blast about an offer your company is promoting to your entire email list. While we don’t want to see bounced emails, the reality is that messages can and do bounce for a variety of reasons. 
Return-Path 是您可以使用的重要工具,尤其是对于群发电子邮件。假设您正在向整个电子邮件列表发送一封关于您的公司正在推广的优惠的电子邮件爆炸。虽然我们不希望看到退回的电子邮件,但现实情况是,由于各种原因,邮件可以并且确实会退回。

When you’re sending to large groups, you can get tens, maybe even hundreds of bounced messages depending on the size and nature of your campaign. These “failed delivery” messages then come back to haunt and crowd your original sending inbox. Instead, by having an established return-path, those messages are processed and stored separately in their own specified inbox.
当您向大型群组发送邮件时,您可能会收到数十甚至数百封退回的邮件,具体取决于广告系列的规模和性质。然后,这些“传递失败”消息会再次困扰并挤占您原来的发送收件箱。相反,通过建立 Return-Path ,这些邮件将单独处理并存储在其自己指定的收件箱中。

Return-path also helps with your deliverability and sending reputation by helping to validate your identity as a sender (i.e. whether or not you’re sending spam). Because return-path is a SMTP address, it can be used by servers and inbox providers to decide how or if they want to filter your messages. Having a properly set-up return-path can help provide credibility for your messages and subsequently you, the sender, which in turn boosts your sending reputation.
Return-Path 还有助于验证您作为发件人的身份(即您是否发送垃圾邮件),从而帮助您提高送达率和发送信誉。由于 Return-Path 是 SMTP 地址,因此服务器和收件箱提供商可以使用它来决定如何或是否要过滤您的邮件。正确设置 Return-Path 有助于为您的消息提供可信度,进而为您(发件人)提供可信度,从而提高您的发送声誉。

How return-path works(Return-Path 的工作原理)

Return-path works by directing where bounced messages should go when they cannot be delivered. It is usually set up by a developer or email platform provider, but can be customized using the Domain Authentication doc in our Knowledge Center
Return-Path 的工作原理是指示退回的邮件在无法传递时应去哪里。它通常由开发人员或电子邮件平台提供商设置,但可以使用 我们知识中心的域身份验证文档进行自定义。

When a server or inbox provider receives your message, they validate your identity as a sender as well as your sending reputation before pushing you through to your intended recipients’ inboxes. 
当服务器或收件箱提供商收到您的邮件时,他们会验证您作为发件人的身份以及您的发送信誉,然后再将您推送到目标收件人的收件箱。

In this validation process, DMARC and return-path work together to get you through these filters. DMARC examines your message to confirm that the domain provided in the “sent from” field matches the domain provided in the return-path field, which helps to validate your identity as a sender. Once these domains have been confirmed and matched by DMARC, you’ll have an easier time getting through filters set by servers and inbox providers.
在此验证过程中,DMARC 和 Return-Path 协同工作,帮助您通过这些过滤器。DMARC 会检查您的邮件,以确认“发件人”字段中提供的域与 Return-Path 字段中提供的域匹配,这有助于验证您作为发件人的身份。一旦DMARC确认并匹配了这些域名,您就可以更轻松地通过服务器和收件箱提供商设置的过滤器。

There are two types of bounced emails: hard bounces and soft bounces. Hard bounces occur when there are permanent issues with a recipient, including an invalid email address or typo in your mailing list. Soft bounces are more temporary and usually occur when there’s a problem with a recipient’s inbox, including file size or attachments issues or the possibility of a recipient having a full inbox. 
退回电子邮件有两种类型:硬退回邮件和软退回邮件。当收件人存在永久性问题(包括邮件列表中的电子邮件地址无效或拼写错误)时,就会发生硬退回。软退回邮件是临时性的,通常在收件人的收件箱出现问题时发生,包括文件大小或附件问题,或者收件人的收件箱可能已满。

When a message hard bounces, the general best practice is to check that there are no typos in the recipient’s address. If there are none, you should remove the address from your mailing list. Keeping email addresses that hard bounce can damage your reputation as a sender and affect your deliverability in the long run. 
当邮件被硬退回时,一般的最佳做法是检查收件人的地址中是否有拼写错误。如果没有,您应该从邮件列表中删除该地址。保留硬退回的电子邮件地址可能会损害您作为发件人的声誉,并从长远来看影响您的送达率。

When an email soft bounces, you have a little bit more wiggle room than with a hard bounce. Email addresses that soft bounce can be kept in your mailing list for future campaigns, but you’ll want to watch them to see if they bounce again. If they continue to bounce, they should be removed from your mailing list.
当电子邮件软退回时,与硬退回相比,您有更多的回旋余地。软退回的电子邮件地址可以保留在您的邮件列表中,以备将来的广告系列使用,但您需要观察它们,看看它们是否会再次退回。如果它们继续反弹,则应将其从您的邮件列表中删除。

#403 高效搜索日志

2020-07-22

即便上了 ELK,也不可能所有日志往里面塞,搜日志是程序员的日常工作之一。

grep log by time efficiently 为关键词搜到 SO 上的这个问题: What is the most efficient way to extract logs between two time stamps?

要求:

  1. 能够过滤出指定时间段日志
  2. 效率,保证即便是大日志也不至于等太久,减少对服务的不良影响

提问的人自己提出来的方案:

grep -a -A 1000000 "03/09" fileName.txt | grep -a -B 1000000 "03/10"

他认为不好,因为有点慢,而且有时会漏掉一些日志。
漏掉日志可能和他的日志格式有关,这倒应该问题不大,主要是这个方案看起来就确实效率不行。
PS:如果不用模式匹配,可以加上 -F,应该可以提高效率。

# 2020/07/22 10:00:00,100 INFO [main] com.example.LoggingApplication - Starting Application
awk '$2>="16:30:00"{s=1} s; $2>="17:00:00"{exit}' event.log

这个看起来很牛逼,主要是有一个 exit

#402 Shell 转义

2020-07-21

这篇文章不是要记录那些乱七八糟的转义规则,而是讲怎么借助工具避开它。

GitHub 上偶然看到一个仓库 chrissimpkins/shellescape,做了些实验之后,发现非常好用。
别看就几行代码,真的感觉世界都清静了。
PS:代码我没细看,人生短暂,我不想去记这些没用的知识点。

import re

_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search

def quote(s):
    if not s:
        return "''"
    if _find_unsafe(s) is None:
        return s
    return "'" + s.replace("'", "'\"'\"'") + "'"

示例:

commands = """
grep -F '"userId": "1"' /tmp/test.log
grep 'aaa.bbb.$100.*' /tmp/test.log
""".strip().splitlines()
for command in commands:
    print(quote(command))

#401 Shell 小技巧

2020-07-20

快速输入上一行命令的最后一个参数

touch nihao.txt
code !$

创建目录并进入

take xxx # oh-my-zsh

mkdir xxx && cd $_

重命名

for i in {0..100}; do touch aaa_bbb_$i.jpg; done
rename 's/_bbb//' aaa_*.jpg

# for zsh
autoload zmv
zmv -n '(*)_(*).jpg' '$2_$1.jpg'

#400 阅读:作为一个开发者

2020-07-19

除了开发文档,我好像很少花时间看书。看书的时候也就是挑选一点内容浏览一下,就像查字典一样。可能这就叫碎片化阅读的时代。

我现在的阅读都转到的网上,内容一般都是来自:

  1. 阮一峰的博客(主要是科技爱好者周刊,每周五更新,必看)
  2. 开源中国 (动弹功能和周一乱弹被关闭真是一个很大的遗憾)
  3. 开发者头条 (toutiao.io)
  4. 知乎,刷知乎已经成瘾了
  5. 微信公众号
  6. 高性能服务器开发
  7. 架构师之路
  8. 开发内功修炼
  9. ...
  10. 抖音
  11. 澎湃新闻
  12. 博客园(已经去的少了,偶尔去看看列表页面有没有感兴趣的内容)
  13. GitHub(看代码也算吧,还有搜索一些关键词,了解一下热门项目)
  14. StackOverflow 没有它我就不会编程 😵

2021 年的变化:

  1. 开源中国的动弹功能(大概就类似发推,之前还是很热闹的)已经被阉割掉了,甚至很长时间评论功能都关闭了。
    现在也去的少了。
  2. 博客园也由于整改,好多页面都不能访问,还在逐渐解封中。

2021/07/23:

  1. GitHub Copilots 也开始变成我工作的好搭档了,不管是写文档,还是写代码,我觉得它的输出也可以当做一个阅读源。
    虽然它现在可能看起来还有点呆,写代码也没见提出很好的建议,但是和它一起工作还是很开心。
    尤其是感觉我在训练它写作或者编程,让它成为更好的自己,心里有一丝丝成就感油然而生。

#399 Git 分支管理

2020-07-16

创建分支:

git branch <new-branch-name> <commit-id>
git checkout -b <new-branch-name> <commit-id>

删除远程分支:

git push --delete origin dev0404

删除远程已经不存在的分支:

git remote prune origin -n
git remote prune origin

已经合并到指定分支的分支:

git branch --merged master
# -r, --remote
git branch -r --merged master

创建独立分支(空白分支):

git checkout --orphan newbr

合并无关分支:

git merge newbr --allow-unrelated-histories

#398 大明御制皇陵碑

2020-07-10

安徽凤阳,朱元璋老家有一个明皇陵,为朱元璋父母、兄嫂所建。皇陵碑文由朱元璋亲自撰写,讲了一些幼年时的事情,以及起义的经历。

朱元璋简介

朱元璋(1328年10月21日—1398年6月24日),濠州钟离(今安徽凤阳东北)人,幼名重八,参加农民起义军后改名元璋,字国瑞,元末农民起义军首领,明朝开国皇帝(1368年—1398年在位),史称明太祖,卓越的军事家、战略家、统帅。

朱元璋幼时贫穷,曾为地主放牛。1344年(元至正四年),入皇觉寺,25岁时参加郭子兴领导的红巾军反抗元朝,1356年(至正十六年)被部下诸将奉为吴国公。同年,攻占集庆路,将其改为应天府。1368年(至正二十八年)朱元璋击破各路农民起义军后,在应天府称帝,国号大明,年号洪武。后结束了蒙元在中原的统治,平定四川、广西、甘肃、云南等地,最终统一中国。

朱元璋在位期间,下令农民归耕,奖励垦荒;大搞移民屯田和军屯;组织各地农民兴修水利;大力提倡种植桑、麻、棉等经济作物和果木作物、他还徒富民,严惩贪官污吏,抑豪强;下令解放奴婢等等。经过洪武时期的努力,社会生产逐渐恢复和发展了,史称洪武之治。1380年(洪武十三年),朱元璋废丞相,设承宣布政使司、提刑按察使司、都指挥使司三司分掌权力,进一步的加强了中央集权。

1398年(洪武三十一年),朱元璋病逝于应天,享年71岁,庙号太祖,谥号开天行道肇纪立极大圣至神仁文义武俊德成功高皇帝。葬南京明孝陵。

  1. 明太祖朱元璋制定整肃贪污的纲领——《大诰》 和《醒贪简要录》。
    近两年时间编纂的《大诰》一书是他亲自审讯和判决的一些贪污案例成果的记录,书中还阐述他对贪官态度、办案方法和处置手段等内容。朱元璋下令全国广泛宣传这本书;他还叫人节选抄录贴在路边显眼处和凉亭内,让官员读后自律,让百姓学后对付贪官。
  2. 允许民间百姓上访。
  3. 明朝还有一项较为独特的制度,允许百姓扭送不法官吏。如果明朝官吏在征收税粮以及摊派差役作弊曲法,百姓既可以向上级官吏举报,也可以直接扭送。
    对于封建时代的百姓而言,完全打破了一贯“只许州官放火不许百姓点灯”的传统惯例。赋予百姓直接查送官吏的权力,是中国几千年法治史中破天荒的政治创举。
    上访,在明朝,受到了朝廷的保护,不仅如此,对于应当接访而没有接访处理的上级官员,亦要依法论处。
  4. 此外,朱元璋在午门外特设“鸣冤鼓”,民间百姓若有冤情在地方讨不回公道,可上京击鼓直接告御状。

明太祖朱元璋最重要的功绩是驱逐胡虏,除暴乱,拯救汉民族,平定天下,成功复国,废除了蒙古人制定的种族等级及压迫政策,恢复了中华,带领华夏复兴。[31] 他从天灾人祸和饥寒交迫的钟离村,一直到南京登基,和他的文臣武将所走的这条道路,不仅仅是为私人和某个阶级的利益,如同他的自述——我本淮右布衣,天下于我何加焉。

历史评价

朱元璋是中国历史上最杰出的君主之一。一生勤于政事,建树颇多,特别是创设了大量的制度典章,不但打下了明朝近三百年基业,还影响到清朝。自明到清,中央集权的政治统治和统一的多民族国家的行政管理制度渐趋完备。

朱元璋最重要的功绩是驱逐胡虏,除暴乱,拯救汉民族,平定天下,成功复国,废除了蒙古人制定的种族等级及压迫政策,恢复了中华,带领华夏复兴。他从天灾人祸和饥寒交迫的钟离村,一直到南京登基,和他的文臣武将所走的这条道路,不仅仅是为私人和某个阶级的利益,如同他的自述——我本淮右布衣,天下于我何加焉。

朱元璋胸怀韬略,深谋远虑,善于驾驭战争,掌握主动权。注重招贤纳士,广采众议,严格治军,完善军制,练兵育将,强调将领要识、谋、仁、勇兼备。主张寓兵于农,且耕且战,保持一支强大的武装力量。

史书评价

《明史》“赞曰:太祖以聪明神武之资,抱济世安民之志,乘时应运,豪杰景从,戡乱摧强,十五载而成帝业。崛起布衣,奄奠海宇,西汉以后所未有也。惩元政废弛,治尚严峻。而能礼致耆儒,考礼定乐,昭揭经义,尊崇正学,加恩胜国,澄清吏治,修人纪,崇凤都,正后宫名义,内治肃清,禁宦竖不得干政,五府六部官职相维,置卫屯田,兵食俱足。武定祸乱,文致太平,太祖实身兼之。至于雅尚志节,听蔡子英北归。晚岁忧民益切,尝以一岁开支河暨塘堰数万以利农桑、备旱潦。用此子孙承业二百余年,士重名义,闾阎充实。至今苗裔蒙泽,尚如东楼、白马,世承先祀,有以哉。”

明太祖朱元璋,起身寒微,他是个放牛娃,上无片瓦,下无立锥之地,两手雪白,行乞丐,做和尚,凭着忠义仁勇,严惩贪官恶霸,恩泽惠及百姓,视百姓为天,用忠诚良将,勤俭敬业,富国强兵,开创了近300年的大明王朝,上无先例。他没有什么文化,完全靠他的聪明才智,是他个人努力奋斗的结果。可以说他是中国历代皇帝中成功的一个典范。

伟大领袖毛主席在评价朱元璋时这样感慨:可不要看不起老粗,一些老粗能办大事。自古能君无出李世民之右者,其次则朱元璋耳。这个评价可是相当高的。

御制皇陵碑

在明皇陵。碑高20余尺,宽约6尺,有碑文二十六行,每行五十六字。文为楷书,额篆“大明皇陵之碑”。洪武十一年,命江阴侯吴良督工新造皇堂,朱元璋嫌原皇陵碑记皆儒臣粉饰之文,恐不足为后世子孙戒,乃亲撰碑文,重立新碑,叙述他的家庭出身、本人经历、元末农民起义和他参加起义军的情况、以及东渡大江,统一全国的简略过程。文字通俗易懂,感情丰富,脍炙人口。此碑是研究朱元璋的重要历史资料,也是一件具有重大历史价值的珍贵文物。原有碑亭,今已圮。

位于安徽省滁州市凤阳县境内明朝开国皇帝朱元璋为其父母和兄嫂而修建的明皇陵内。御制皇陵碑位于皇陵神道南端西侧,东50米外为无字碑(无字碑是朱元璋认为自己成就的帝业是父母累善积德所至,无上伟大,无法用文字表达)。皇陵碑通高6.87米,碑首四周浮雕六条大螭,刻工精湛。

中下部篆书《大明皇陵之碑》,下为云朵。碑文系明太祖朱元璋亲撰,记述了他自己艰辛的身世,戎马生涯和夺取大明江山的全过程,阐明昌运兴盛的道理,全文1105字,文字通俗易懂,感情丰富,脍炙人口。

朱元璋在元末农民战争中屡屡出奇制胜、转危为安,最终夺取天下,他自认为是因为祖坟风水好保佑的结果。称帝后他回到家乡,第一件事就是拜祭祖坟,立《御制皇陵碑》,特意记述自己艰难的身世,让后人明白朱家是怎样一步步走向昌盛的。

原文

孝子皇帝元璋谨述:洪武十一年夏四月,命江阴侯吴良督工新造皇堂。予时秉鉴窥形,但见苍颜皓首,忽思往日之艰辛。况皇陵碑记皆儒(臣)粉餙之文,恐不足为后世子孙戒,特述艰难、明昌运,俾世代见之。其辞曰:

昔我父皇,寓居是方,农业艰辛,朝夕旁徨,俄尔天灾流行,眷属罹殃:皇考终於六十有四,皇妣五十有九而亡,孟兄先死,合家守丧。田主德不我顾,呼叱昂昂,既不与地,邻里惆怅。忽伊兄之慷慨,惠此黄壤,殡无棺椁,被体恶裳,浮掩三尺,奠何肴浆。既葬之后,家道惶惶,仲兄少弱,生计不张,孟嫂携幼,东归故乡。值天无雨,遗蝗腾翔,里人缺食,草木为粮。予亦何有,心惊若狂,乃与兄计,如何是常?兄云去此,各度凶荒。兄为我哭,我为兄伤,皇天白日,泣断心肠,兄弟异路,哀恸遥苍。

汪氏老母,为我筹量,遣子相送,备醴馨香,空门礼佛,出入僧房。居未两月,寺主封仓,众各为计,云水飘飏。我何作为,百无所长,依亲自辱,仰天茫茫,既非可倚,侣影相将,朝突炊烟而急进,暮投古寺以趍跄,仰穷崖崔嵬而倚碧,听猿啼夜月而凄凉,魂悠悠而觅父母无有,志落魄而佒佯。西风鹤唳,俄淅沥以飞霜,身如飘蓬逐风而不止,心滚滚乎沸汤,一浮云乎三载,年方二十而强。时乃长淮盗起,民生攘攘,於是思亲之心昭著,日遥盻乎家邦。已而既归,仍复业於觉皇,住方三载而又雄者跳梁。初起汝颖,次及凤阳之南厢。未几陷城,深高城隍,拒守不去,号令彰彰。

友人寄书,云及趋降,既忧且惧,无可筹详,傍有觉者,将欲声扬。当此之际,逼迫而无已,试与知者相商,乃告之曰:果束手以待罪,亦奋臂而相戕?知者为我画计,且祷阴以默相,如其言往卜去,守之何详。神乃阴阴乎有警,其气郁郁乎洋洋,卜逃卜守则不吉,将就凶而不妨,即起趋降而附城,几被无知而创。少顷获释,身体安康,从愚朝暮,日日戎行,元兵讨罪,将士汤汤,一攫不得,再攫再骧,移营易垒,旌旗相望。已而解去,弃戈与枪,予脱旅队,驭马控缰,出游南土,气舒而光。倡农夫以入伍,事业是匡,不逾月而众集,赤帜蔽野而盈冈,率度清流,戍守滁阳。思亲询旧,终日慨慷,知仲姊已逝,独存驸马与甥双。驸马引儿来我栖,外甥见舅如见娘。此时孟嫂亦有知,携儿挈女皆从傍,次兄已殁又数载,独遗寡妇野持筐:因兵南北,生计忙忙,一时会聚如再生,牵衣诉昔以难当。

於是家有眷属,外练兵钢,羣雄并驱,饮食不遑。暂戍和州,东渡大江,首抚姑熟,礼仪是尚。遂定建业,四守关防,砺兵秣马,静看颉颃。羣雄自为乎声教,戈矛天下铿锵;元纲不振乎彼世祖之法,豪杰何有乎仁良。予乃张皇六师,飞旗角亢,勇者效力,智者赞襄。亲征荆楚,将平湖湘,三苗尽服,广海入疆。命大将军,东平乎吴越,齐鲁耀乎旌幢,西有乎伊洛崤函,地险河湟,入胡都而市不易,肆虎臣露锋刃而灿若星鋩。已而长驱乎井陉,河山之内外民庶咸仰。关中即定,市巷笙簧,玄菟乐浪,以归版籍,南藩十有三国而来王。倚金陵而定鼎,托虎踞而仪凤凰,天堑星高而月辉沧海,钟山镇岳而峦接乎银潢。

欲厚陵之微葬,卜者乃曰不可,而地且藏。於是祀事之礼已定,每精洁乎蒸尝,惟劬劳罔极之恩难报,勒石铭於皇堂,世世承运而务德,必彷佛於殷商。泪笔以述,难谕嗣以抚昌,稽首再拜,愿时时而来飨。

洪武十一年,岁次戊午,七月吉日建。

译文(节选)

当年我父亲寓居在这里,从事艰辛的农业劳动,朝不保夕。不久天灾流行,眷属遭殃。父亲终年64岁,母亲终年59岁。长兄已早逝,这时合家守丧,地主置我等于不顾,反而大声呼叱。我们得不到葬地,邻里都为我们伤心。忽有慷慨郑兄,以此片土相赠。然而出殡却无棺椁,只能以破旧的衣裳包裹着,掩以三尺黄土,哪里还有菜肴做祭奠?

既葬之后,家道凄凉。二哥年少体弱,苦无生计;大嫂带着孩子回了娘家。恰值无雨,飞蝗遍野,当地人没有粮食,以草木充饥。我家一无所有,心中惊惶,近于疯狂。乃与兄长计议,这样哪里是长久之计?兄长说不如离开此地,各自去度饥荒。兄弟二人各自为对方伤心痛哭。青天白日之下,哭断肝肠,然后各奔东西。连上苍都为我们哀痛。

汪家的老大妈给我出了一个主意,让她儿子带着礼物送我到寺庙出家。没过两个月,寺内断粮了。寺主封仓,遣散僧众。我们各自为计,象云水一样四处飘流。我没学过任何手艺,一无所长,要想依附亲友,也不过自求其辱,只能仰望苍天。自顾无所依靠,只有自已的影子相陪伴。 早晨看着哪里有炊烟我就急匆匆地赶过去化缘,到了晚上,看到古寺就跑过去投宿。有时候,仰望着参天高崖而倚靠在崖壁上,听着猿猴在夜月下哀鸣而觉得无比凄凉。魂魄悠悠,父母不在,失魂落魄,四处徜徉,西风鹤唳,飞霜淅沥。我象飞蓬一样被风吹得飘摇不定,心里就象沸腾的汤水一样难受······

白话文译文

孝子皇帝我,朱元璋诚惶诚恐的向九泉之下的父母表述:洪武十一年夏四月,这块碑我让江阴侯吴良监工新造的,我现在在皇宫中常常拿镜子照见自己容貌,只看到虚乏苍白,垂垂老矣,忽然想起往日无比的痛苦与艰辛,况且皇陵碑很多都是那些什么风浪都没见过的书生写的阿谀奉承,文过饰非的文章,都不足以留给后代子孙作为劝诫,所以我自己来讲述当年之艰难,以指明昌盛之道,让世代都见到,文章内容是:

昔日,我的父亲朱五四,搬迁到这个地方定居,每日辛苦的务农种地,从早到晚像个陀螺连轴转,紧接着天灾瘟疫四起,饥荒肆虐,父母亲人不幸遇难,父亲朱五四死时六十四岁,母亲那年死时五十九岁,而我那年才十七岁,大哥朱重四也先走一步,死去了,全家都在忙碌这几位亲人的丧事。我们家的雇主---地主刘德连理都不理我们,反而大声的斥责怒骂,我的父母大哥给他种了一辈子地,到死,他也不给一块荒地来埋葬我的亲人,邻居们都为我们忧伤惆怅。后来多亏地主刘德的哥哥刘继祖突发善心,送我们一块地以供埋葬,至于丧礼,连棺椁都没有钱买,寿衣也没有,亲人们只好穿着破衣衫下葬,草草的只掩埋三尺深,更别说有什么菜肴酒浆拿来祭奠。埋葬了父母大哥之后,家里的生活就完全过不下去了,二哥朱重六年少体弱,混不到吃的,大嫂当了寡妇,带着儿女,往东回了娘家。这个时候,我们这地方又遇到大旱灾,蝗虫又从天而降,损毁了所有农作物,我们周围地区的人全部没饭吃,所有的野草树木都啃进去,我十六七岁,束手无策,只能在死亡的恐惧中近乎疯狂。无奈何,跟二哥商量着怎样才好,二哥说,四弟啊,我们离开这里吧,各自分开去度过这气势汹汹的灾年,二哥为我哭泣,我为二哥悲伤,青天白日的,我们哭断肝肠,兄弟一别,没想到天人永隔,悲恸得能让遥远的苍天颤抖

我们这附近有个汪老太太,为我寻了个栖身之处,让他儿子携礼物和香火去讨好大和尚,推荐我去寺庙里面试当和尚,遁入空门,吃斋念佛,出入僧房,以为这下至少有口基本的饭吃了,没想到仅仅不到两个月,寺庙里的大和尚把仓库一关,对不起,老子养不起你们了,你们这些和尚自己出去谋生吧。可是这放眼天下,浩浩荡荡,我能做些什么呢?我除了会吃饭,没学过任何手艺,一无所长啊。去投靠那些尖酸刻薄的亲戚,那是自取其辱,无奈望天际茫茫,可是老天爷是靠不住的,我只好去流浪,一路上跟僧侣乞丐结伴而行,早上看到哪里有炊烟,我就赶紧过去讨一口饭吃,傍晚赶紧赶路找个古寺熬过一个夜晚,有时候无处投宿,就躺在荒凉的悬崖峭壁下靠着碧绿的树木,但你们不要以为我是去野餐或自助游的。睡在野外,晚上听着人猿泰山的歌喉,看着茫茫月色,小情侣们会说:好浪漫哦,但对于今天不知道能不能见到明天太阳的我,心中只有说不出的凄凉与彷徨啊!魂不守舍,晃晃悠悠,梦境中寻寻觅觅回忆慈爱的父母双亲,猛然惊醒,才想起他们都已惨死,不在了!不在了!!我那时内心是多么落魄,多么凄惶啊。一阵阵深秋的西北风呼啸的掠过我瘦弱而单薄的身体,接着天气预报说霜冻灾害降临,刺骨的寒意穿透我性感的破衣烂衫,我的身体如同船帆追逐风的脚步流浪,而不知何时才是终止,我的心里啊,万般愁绪交集,如同桑拿里滚滚沸水。就这样恍惚过了三年,我终于二十岁了,身心在摧残中却略显茁壮。谁知道祸不单行啊,这时候长江淮河一带活不下去的人转行当盗贼,全部起来四处劫掠,民生就更别提了,压根不让人活。于是,我想这地方呆不下去了,加上想念亲人,每天对故乡魂牵梦萦,好吧,坐11路公交,敢问路在何方,路在脚下,我朱重八又回去了,继续去先前的皇觉寺上班,这样又过了三年,我23岁了,这时候外面的世界发生了巨变,不是无组织的抢劫了,而是有组织的农民武装起义了,开始时从汝南一带开始,很快就打到我们凤阳的南厢,一下子攻陷了城市,他们占据了城市很久不撤走,在这地方声势浩大,口号也很响亮

就在这时,少年时一起放牛的汤二愣子寄了一封书信给我,其中提到让我去他的起义军部队工作,我很犹豫,也没有谁值得商量,但是很不幸,我还在犹豫的时候旁边有个不厚道的家伙知道了我和起义军书信来往的事并且准备告发,操,到这时候了,我也被逼无路了,于是就试着跟比较有道行的半仙周德兴商量,我跟他讲,我是束手就擒呢,还是真的也去造反,周半仙你帮我看看,于是周半仙就喊太上老君附体,王母娘娘显灵,算了一卦,结果是留在这里不行,逃到别处也不好,不如横下一条心,真跟着汤二愣子他们部队一起造反。人家说秀才造反三年不成,我是和尚,说干就干,马上去投郭子兴的部队,结果差点被他部队里的小兵当奸细给砍了,不过还好,过了一会儿,他们就把我放了,没啥大碍,我就这样跟着这群不懂战略战术的傻B起义军每天没头苍蝇似的到处乱打乱砍,也不是一无所获,这期间我拐走了郭子兴的义女马姑娘,乱跑之余,泡个妞算是缓解压力吧。不过郭子兴的部队实在是没什么前途,于是我扔掉武器,脱离了他们队伍,带着亲信和马老婆往南走,办起了农民讲习所,倡导农民运动,号召他们武装起义,不到一个月,聚集了很多兵马,哗哗的一片,好家伙,我们的旗帜盖满了整个山岗,于是我率领队伍迅速的渡河夺取了滁阳,暂时稳定下来,就开始思念亲人,询问一些亲友下落,于是得知了二姐已经去世了,二姐夫李贞带着我外甥李文忠来投奔我,因为我胸肌发达,外甥看到我就像见到娘亲一样,这时,当年带孩子回娘家的大嫂也得知我现在割据了滁阳,带着我的侄儿侄女也来投靠我了,接着还知道当年分别后不久,二哥就死去了,只剩下二嫂寡妇在野外拿着箩筐捡猪粪,跟着各种乱军南北流浪,过得凄惨,这时候,我们大家又聚到一起,如同重见天日啊,纷纷相互扯着衣裳诉说当初的苦难。

于是,这样我们家人又团聚了,我有了归属感,事业马上处于上升期,手下部队人马装备不断壮大,和天下豪杰并驾齐驱,不敢有些少放松,又攻下了和州,接着渡江往姑苏一带争地盘,我手段比较高明,崇尚礼仪,有明主气象。攻下了南京(建业),高筑墙,广积粮,缓称王,巩固经营已有的根据地,不断的扩大军事实力与政治影响。景观市局变化,这个世道纷纷扰扰,四处都是割据势力,都是手握重兵的大军阀。蒙古鬼子的元朝已经风雨飘摇。但是这些军阀哪里懂得仁义良心,我就懂,我就充分的表现出一代明主的仁义。我们的军队纵横天下,人们纷纷加入我们。就这样,我率领着军队,在鄱阳湖用二十万军队灭掉了拥有六十万精锐水师的陈友谅,占据了他的根据地湖南湖北一带,连苗人们都归服于我,南边的疆界贯穿到两广海岸,率军又在东边把另外一个大军阀张士诚给灭了,接着挥师北上,打败了元朝残余军队,收复了属于我们汉人的华北,西北大片地区,我们的军队军纪良好,攻进元朝首都元大都时,城里的商店都还正常贸易,没有扰乱他们的秩序。接着我们扩大战果,全面收复了自唐朝以来丢失的广大幽云地区,在北方打下了大片区域,把元朝的侵略者们远远的赶到北方大漠去放羊。版图空前巨大,朝鲜摇头摆尾的认我们大明当爹,南海有十三个国家向我们称臣纳贡。我们朱家发达了,我在南京定都称帝,这里风水很好,于是我想起当年落魄时爹妈草草埋葬,应该回去好好大修下坟墓,以慰在天之灵,但风水先生说不行,这个墓地的风水一改就会破坏,于是我只好准备厚厚的祭礼,精细整洁的祭品酒浆来报答父母无尽的养育之恩啊,故而刻了这个碑立在父母陵墓的明堂中。望世世代代都要不忘根本,信奉仁义道德,效仿上古之殷商,泪水已经模糊我的视线,思念亲人的泪珠夺眶而出,沾满了满是深情的文稿,连续磕几个头,希望父母能够时时来享受子孙的祭祀蒸尝。

洪武十一年,岁次戊午,七月吉日建。

#397 阿里巴巴 16 条设计规约

2020-07-10
  1. 【强制】存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档。
    说明:有缺陷的底层数据结构容易导致系统风险上升,可扩展性下降,重构成本也会因历史数据迁移和系统平滑过渡而陡然增加,所以,存储方案和数据结构需要认真地进行设计和评审,生产环境提交执行后,需要进行 double check。
    正例:评审内容包括存储介质选型、表结构设计能否满足技术方案、存取性能和存储空间能否满足业务发展、表或字段之间的辩证关系、字段名称、字段类型、索引等;数据结构变更(如在原有表中新增字段)也需要进行评审通过后上线。
  2. 【强制】在需求分析阶段,如果与系统交互的 User 超过一类并且相关的 User Case 超过 5 个,使用用例图来表达更加清晰的结构化需求。
  3. 【强制】如果某个业务对象的状态超过 3 个,使用状态图来表达并且明确状态变化的各个触发条件。
    说明:状态图的核心是对象状态,首先明确对象有多少种状态,然后明确两两状态之间是否存在直接转换关系,再明确触发状态转换的条件是什么。
    正例:淘宝订单状态有已下单、待付款、已付款、待发货、已发货、已收货等。比如已下单与已收货这两种状态之间是不可能有直接转换关系的。
  4. 【强制】如果系统中某个功能的调用链路上的涉及对象超过 3 个,使用时序图来表达并且明确各调用环节的输入与输出。
    说明:时序图反映了一系列对象间的交互与协作关系,清晰立体地反映系统的调用纵深链路。
  5. 【强制】如果系统中模型类超过 5 个,并且存在复杂的依赖关系,使用类图来表达并且明确类之间的关系。
    说明:类图像建筑领域的施工图,如果搭平房,可能不需要,但如果建造蚂蚁 Z 空间大楼,肯定需要详细的施工图。
  6. 【强制】如果系统中超过 2 个对象之间存在协作关系,并且需要表示复杂的处理流程,使用活动图来表示。
    说明:活动图是流程图的扩展,增加了能够体现协作关系的对象泳道,支持表示并发等。
  7. 【推荐】需求分析与系统设计在考虑主干功能的同时,需要充分评估异常流程与业务边界。
    反例:用户在淘宝付款过程中,银行扣款成功,发送给用户扣款成功短信,但是支付宝入款时由于断网演练产生异常,淘宝订单页面依然显示未付款,导致用户投诉。
  8. 【推荐】类在设计与实现时要符合单一原则。
    说明:单一原则最易理解却是最难实现的一条规则,随着系统演进,很多时候,忘记了类设计的初衷。
  9. 【推荐】谨慎使用继承的方式来进行扩展,优先使用聚合/组合的方式来实现。
    说明:不得已使用继承的话,必须符合里氏代换原则,此原则说父类能够出现的地方子类一定能够出现,比如,“把钱交出来”,钱的子类美元、欧元、人民币等都可以出现。
  10. 【推荐】系统设计时,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护。
    说明:低层次模块依赖于高层次模块的抽象,方便系统间的解耦。
  11. 【推荐】系统设计时,注意对扩展开放,对修改闭合。
    说明:极端情况下,交付的代码都是不可修改的,同一业务域内的需求变化,通过模块或类的扩展来实现。
  12. 【推荐】系统设计阶段,共性业务或公共行为抽取出来公共模块、公共配置、公共类、公共方法等,避免出现重复代码或重复配置的情况。
    说明:随着代码的重复次数不断增加,维护成本指数级上升。
  13. 【推荐】避免如下误解:敏捷开发 = 讲故事 + 编码 + 发布。
    说明:敏捷开发是快速交付迭代可用的系统,省略多余的设计方案,摒弃传统的审批流程,但核心关键点上的必要设计和文档沉淀是需要的。
    反例:某团队为了业务快速发展,敏捷成了产品经理催进度的借口,系统中均是勉强能运行但像面条一样的代码,可维护性和可扩展性极差,一年之后,不得不进行大规模重构,得不偿失。
  14. 【参考】系统设计主要目的是明确需求、理顺逻辑、后期维护,次要目的用于指导编码。
    说明:避免为了设计而设计,系统设计文档有助于后期的系统维护,所以设计结果需要进行分类归档保存。
  15. 【参考】设计的本质就是识别和表达系统难点,找到系统的变化点,并隔离变化点。
    说明:世间众多设计模式目的是相同的,即隔离系统变化点。
  16. 【参考】系统架构设计的目的:
    确定系统边界。确定系统在技术层面上的做与不做。确定系统内模块之间的关系。确定模块之间的依赖关系及模块的宏观输入与输出。确定指导后续设计与演化的原则。使后续的子系统或模块设计在规定的框架内继续演化。确定非功能性需求。非功能性需求是指安全性、可用性、可扩展性等。