为什么是天津,一个是离得近往返方便,另一个是没有去玩过,想去好好转转,两天时间能玩个大概吧。

天津卫由来

去之前,对于天津的了解只知道是个直辖市,书本上的了解早已忘干净了。去了才知道天津又称天津卫,其中的『津』意为渡口,『天』意为天子,是明成祖朱棣赐的名,为『天子的渡口』含义。『卫』是明朝的军事建制,当时天津设有天津卫、天津左卫、天津右卫,是这个称呼的由来。

解放桥、世纪钟

解放桥和旁边的世纪钟👇

出了城际站做了一站天津地铁,也是因为不熟,绕了个小弯,出了地铁站就看到了解放桥,解放桥对面是世纪钟。解放桥旧城万国桥,始建于 1927 年,是天津标志性建筑之一,看历史挺波折的,和世纪钟挨着,有兴趣可以去了解一下。

九国租界的事

到了天津才知道战乱时期曾设立过九国租界,对天津的建筑风貌产生很大影响,而天津政府对于这些建筑风貌一定程度上进行了保留,所以在天津经常看到一个外国风貌建筑的背影是现代高楼。

意式风情街

到了天津一定要去的地方,保留了大量的意式风情建筑和名人故居,里面有一个免费的天津历史介绍展馆,可以了解一下天津的历史变革和人文风貌。然后是里面的几个景观建筑,但丁广场和马可波罗广场。再有就是逛了一下梁启超故居,里面介绍了梁启超的生平和贡献。其中的意大利兵营应该是某个部门的办公单位,只是在外面观望了一下。整个意式风情区不需要门票,可以骑着单车在里面随意闲逛,时不时会看到一些名人故居,意大利风情建筑在这里融为一体,颇有一些浪漫氛围,拍婚纱照可以来这里。

马可波罗广场👇

梁启超故居👇

意大利兵营👇

1919

出发前一天晚上看着《爱因斯坦传》入睡的,正好看到了,1919 年发生了一件事,使得几年前爱因斯坦在广义相对论中的预测得到了证实,从此爱因斯坦被推上神坛,想了解可以去看一下。同年梁启超参加巴黎和会,然后巴黎和会上中国外交的失败引发了五四爱国运动。发现今年恰好是这两个事件一百周年之际。

天主堂的故事

接下来的行程是计划去古文化街,在旁边看到一个天主堂,正赶上在看西方哲学故事,便进去听修女讲了一段耶稣受难的故事。

古文化街

古文化街也是网上推荐的打卡地,是一个天津著名小吃街,有着很浓厚的商业气息,就像北京王府井的小吃街,不约而同的都听到过是本地人基本不去的小吃街。在这里我觉得去看一下就行了,个人觉得东西不咋地,吃的也很难吃。

金汤桥的历史

金汤桥和解放桥一样也是架在海河之上的大型铁桥之一。建于清光绪年间,1949 年在平津战役中,解放军分为东西两个突击团对天津守敌发起总攻,在金汤桥胜利会师,所以称为了解放天津的标志性建筑。

站在金汤桥上拍海河👇

天津之眼

我想每个来过天津的人都会推荐去做一下天津之眼,它是一座跨河建设的摩天轮,推荐晚上去做可以欣赏整个天津的夜景,排队一个半小时,坐摩天轮半小时一圈,适合情侣去。
做完摩天轮可以去附近的码头做轮渡欣赏海河夜景,可惜的是人家关门早,没赶上。

海河夜景👇


瓷房子

瓷房子原来是一个座法式洋楼,后来才经人设计贴满了瓷片。里面有讲解主要说的是瓷房子的设计理念和寓意,也是为了弘扬中华文化。初次去看整个瓷房子很惊艳梦幻,因为对瓷器不懂,也只是作为一个门外汉草草欣赏了一番,其实里面有很多细节和故事可讲,也不知从何了解。

五大道

对于五大道的游览仅限于做了一趟观光马车,听了一遍讲解。看里面的景色和建筑很有异国风情,差不多也快百年历史了吧,春天适合情侣们来拍照。里面的建筑大部分都被一些公司租下来用来办公了。

西开教堂

西开教堂是天津最大的罗马式建筑,从外面看上去气势恢弘,说道这里,其实也想去通过天津了解各国的建筑风貌,但是并没有从当地的讲解中了解到,也是一个遗憾吧。对于建筑的讲解大部分还是偏向于外观独特地,比如瓷房子之类的,这样也许更适合游客的接受。

高达宏伟的西开教堂👇

劝业场

买买买,类似于北京的西单商业街,各种一二线衣饰品牌。

交通

上面所说的几个景点基本都挨着很近,所以整个游玩并没有做地铁,而是骑地随处可见的电助力车,可以走走停停自由把握节奏,当然也可以做公交。总之交通是很方便,比起偌大的北京城,可以很快的在景点之间切换。

最初规划要去的地方👇

关于吃这可就难到我了,古文化街的小吃真心不建议了,景点的东西贵倒无所谓,主要是不好吃。地道的小吃又找不到,所以也无法推荐,据说天津人特别重早餐,越小摊做的小吃越地道,可以去试一下,注意要避开景点附近。

这次的天津游玩,更偏重于了解城市文化和历史吧,吃上没怎么下功夫,玩上适合两个人春暖花开来拍照。单单了解一个城市两天肯定是不够的,这次也只是把课本上的历史一部分变成了身边的故事,至于剩下的故事,不知何时再去了解了。

最后附上一张🤳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class BaseMetaClass(type):
___sub_class = {}

def __iter__(self):
for item in BaseMetaClass.___sub_class.itervalues():
yield item

def __repr__(cls):
return cls.__name__

def __new__(mcs, name, bases, attrs):
new_cls = super(BaseMetaClass, mcs).__new__(mcs, name, bases, attrs)
if object not in bases:
BaseMetaClass.___sub_class[new_cls.__name__] = new_cls
print mcs, name, bases, attrs, new_cls
return new_cls


class NotifyManager(object):
__metaclass__ = BaseMetaClass

def __iter__(self):
yield self.__metaclass__


class TestA(NotifyManager):

@classmethod
def notify(cls):
return cls.__name__


class TestB(NotifyManager):

@classmethod
def notify(cls):
return cls.__name__

TOTP

基于时间的一次性密码算法:TOTP 是一种根据预共享的密钥与当前时间计算一次性密码的算法。TOTP是散列消息认证码(HMAC)当中的一个例子。它结合一个私钥与当前时间戳,使用一个密码散列函数来生成一次性密码。由于网络延迟与时钟不同步可能导致密码接收者不得不尝试多次遇到正确的时间来进行身份验证,时间戳通常以30秒为间隔,从而避免反复尝试。

有限状态机(FSM)

有限状态机又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

  • 米利型有限状态机是基于它的当前状态和输入生成输出的有限状态自动机。
  • 摩尔型有限状态机是指输出只由当前的状态所确定的有限状态自动机。

Kata (programming)

A code kata is an exercise in programming which helps programmers hone their skills through practice and repetition.

联机分析处理(OLAP)

需以大量历史数据为基础配合上时间点的差异并对多维度及汇整型的信息进行复杂的分析。

ETL

在抽取、变换和装入(ETL)过程中,数据是从各种数据源抽取而来,通过编码的业务规则进行转换和规范化,然后装入数据集市的事实表和维表。

MapReduce

是Google提出的一个软件架构,概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

基本记录,没有系统性整理,只是作为一个重温知识点用,不具有阅读参考价值。

注解(Inherited)

Spring注解方式减少了配置文件内容,更加便于管理。

MVC模块注解

@Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。
@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。
@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true。
@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true。
@RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RestController :控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。

组件类注解

@Component :表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。
@ComponentScan:自动扫描指定包下所有使用@Service,@Component,@Controller,@Repository的类并注册。
@Repository:标注一个DAO组件类。
@Service:标注一个业务逻辑组件类。
@Controller:标注一个控制器组件类。
@Component 可以代替 @Repository、@Service、@Controller,因为这三个注解是被 @Component 标注的。

装配 Bean 时常用注解

@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值。
@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作。

Configuration and @Bean

使用@Configuration 来注解类表示类可以被 Spring 的 IoC 容器所使用,作为 bean 定义的资源。

IOC

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC

Spring 通过 calss 直接获取 Bean

1
2
3
4
SpringApplication app = new SpringApplication(THTTPMain.class);
ApplicationContext ctx = app.run(args);
ReportManager manager = ctx.getBean(ReportManager.class);
manager.run();

Spring 标签管理

https://www.cnblogs.com/wuchanming/p/5426746.html

AOP 面向切面编程

会计基本假设

包括(会计主体、持续经营、会计分期和货币计量)

会计主体:规范空间范围,独立核算的特定单位或组织。
会计主体于法律主体并非对等的概念。法律主体可以作为会计主体,但会计主体不一定是法律主体。

持续经营:持续经营保持了会计信息处理的一致性和稳定性。

会计分期:将一个会计主体持续的生产经营活动划分为若干相等的会计期间,以便结算帐目和编制财务会计报告。

货币计量:指会计主体在会计确认、计量和报告时采用货币作为统一的计量单位。是衡量商品价值的共同尺度。

四个基本假设相互依存、相互补充关系。

会计基础

会计基础:确定收入和费用的归属期。按照其以应收应付还是实收实付作为标准。

权责发生制(应收应付制):以应收应付作为标准来确定本期收入和费用以计算本期盈亏的会计处理基础。(会计记账以此为主)

收付实现制:以款项的实际收付来确认本期收入和费用,计算本期盈亏的一种会计处理基础。(行政部门使用)

会计科目的设置不完全相同:
权责发生制:有必要设置一些待摊和预提账户。
收付实现制:不需要设置待摊和预提账户。

权责发生制比收付实现制计算的盈亏更准确,相对也更复杂。

会计要素与会计科目

会计要素:对会计对象的基本分类,会计核算对象的具体化。是设置会计科目的依据。
一类反应财务状况的要素,资产负债表的要素,包括资产、负债和所有者权益。
二类反应经营成果要素,包括收入、费用和利润。
资产:过去的交易或事项形成,企业拥有或控制,预期带来经济利益。(货币资金、交易型金融资产、应收及预付款项、存货、长期股权投资、固定资产、无形资产等)
负债:企业承担的现时义务,预期导致经济利益流出,过去交易或事项形成。(短期借款、应付票据、应付账款、预收账款、应交税费、应付职工薪酬、长期借款、应付债券、长期应付款)
所有者权益(股东权益):资产 - 负债 = 所有者权益。清算、减资、分派现金股利时不需要偿还,企业清算时享有剩余权益,参与利润分配。源于资产和负债的确认。

收入:日常活动中形成,与投入资本无关的经济利益总流入,导致所有者权益增加,本企业经济利益流入。

费用:日常活动中形成,导致所有者权益减少,与投入资本无关的经济利益总流出。

利润:一定会计期间的经营成果。利润=收入-费用+利得-损失。

会计要素的计量:

会计计量:为符合会计要素条件的登记入账,确定会计要素的金额。

历史成本:购置资产时的现金或其它等价物。用于资产或负债的过去价值的计量,不随时间折旧和市场价格变动影响。

重置成本:现实成本,按当前市场条件下,重新获取同样资产所需支付的现金或现金等价物。主要用于固定资产盘盈的计量。

可变现净值:资产预计售价 - 进一步加工成本 - 销售所需预计售金、费用后的净值。

现值:对未来现金流量以折旧率折现后的价值。

公允价值:在公平交易中,交易双方自愿进行资产交换或债务清偿的金额。

会计科目:
会计科目是对会计要素进行分类核算的项目。
意义:

  1. 复式记账的基础
  2. 编制记账凭证的基础
  3. 为成本计算与财产清查提供了前提条件
  4. 为编制财务报表提供了方便

会计等式与复式记账

会计恒等式:资产 + 费用 = 负债 + 所有者权益 + 收入

意义:是设置会计科目和账户,进行复式记账和编制资产负债表的理论依据。

复式记账法
对每一笔经济业务,需要在两个或两个以上项目联系账户中进行记录的方法。

  1. 需要完整的账户体系。
  2. 对每一笔经济业务都进行反映和记录
  3. 对每一笔经济业务都要反映设计的所有方面
  4. 对一定时期内的账户记录能进行综合试算平衡

借贷记账法是复式记账发的一种。以借、贷为记账符号,建立在会计恒等式的基础之上。通过“T”型图,左借右贷记录。

借贷记账法下各类会计科目的基本结构

记账规则:
有借必有贷 —— 账户登记方向
借贷必相等 —— 账户登记金额

记录步骤:

  1. 分析每一笔经济业务发证所涉及的账户名称,并判断账户性质
  2. 判断经济业务发生所引起的资金数量是增加还是减少
  3. 根据账户的结构确定记入账户的方向。

账户对应关系:在两个或两个以上账户之间形成的应借应贷的相互对照关系。作用是了解业务的来龙去脉,检查经济业务处理是否合理。

会计分录
是对某项经济业务事项表明其应借应贷账户及其金额的一种记录,简称分录。
格式:会计三要素,记账方向、对应账户、金额。
种类:简单会计分录:一借一贷的会计分录;复合会计分录:一借多贷或一贷多借的会计分录。

如何编制:

  1. 分析经济业务设计的要素
  2. 确定涉及哪些账户,是增加还是减少
  3. 确定应计入哪个账户的借方,哪个账户的贷方
  4. 确定应借应贷账户是否正确,借贷方金额是否相等

平衡方法——编制“总分类账户额试算平衡表”

平行登记:对所发生的每项经济业务事项都要以会计凭证为依据,一方面记入有关总分类账户,另一方面计入有关总分类账户所属明细分类账户的方法。要点:依据相同,借贷方向相同,会计期间相同,金额相等。

这篇文章是根据学习知乎 Live 提升专注力的四个方法 总结的学习笔记。

大纲

先放一个大纲,然后写出学习后会总结的点。

主要内容

主要分四个大块:

  1. 像设计游戏一样设计任务(目标、规则、障碍)

    • 我们要达成一个任务或者目标,首先将任务拆分成一个个小的、明确的小任务,每一个环节不用太难,也不用太简单,按照自己的专注力上限设计任务。
    • 每一个小环节可以设置一些障碍,来提升成就感,通过不断的成就感的提升驱使完成目标,在成就感与挫败感之间寻找一个平衡。
    • 这样可以在不断的达成目标时提升自己的专注力上限。
  2. 创造使用推理和类比的机会

    • 专注力应该是一种思维能力,而不仅仅是一种强制力。需要的是脑力的专注力,而不是身体的专注力。提升这些的方法是推理和类比。
    • 推理:通过一个点,去不断深挖,了解其本质。(推理解决 A ——> 什么是 A ?怎么产生的 A ? ——> 产生 A 的是什么?[是否有经验性的证据?] ——> 对这件事情我的理解是什么? ——> 我是否可以更深入的了解?)
    • 类比:相同事物的相关性思考。思考一个事物可以通过相关性的联系来帮助你理解。
    • 一件事情的训练需要可以的练习。
    • 创造和使用推理和类比的机会。
      • 费曼学习法则:如何把这个东西通俗易懂的讲解给别人?
      • 笔记整理和回顾
      • 输出:和别人分享你的经验、知识和见解(例如我写了这篇文章)
      • 反驳:养成反驳自己的习惯,站在相反的观点思考问题,左右互搏。通过自我辩论的方式。
  3. 学习之前寻找『困惑感』

    • 如何快速进入学习状态?积累困惑感。困惑感是你学习一个东西的源动力,当你找到足够多的困惑时,你学习一个东西的时候会更加专注。
    • 当你不知道自己有什么困惑的时候,需要先创造困惑感。
    • 根据主题寻找知识,更能提高你的兴趣。
      • 当你有问题的时候决定你如何看书,而不是被书牵着鼻子走。
    • 读一本书之前,先评估一本书是否适合你。
      • 首选根据作者选书。如果你觉得一本书写的很好,那么不妨看看这个作者的其它书。
      • 其次是看书的目录和简介,可以判断一本书的难易程度。
      • 看豆瓣和亚马逊的评分和评论。看其中的差评可以了解一本书的不足。
      • 通过以上三点来了解一本书是否适合你🌹时间去读。
  4. 抗干扰能力的养成 —— 学会和大脑相处

    • 做任何一件事情的时候不要过早退出循环。
    • 不要太习惯于失败的模式,要思考如何才能去成功。
    • 情绪控制
    • 选择控制
      • 不要给自己太多的选择。
    • 信息控制
    • 上面有部分的音频不能播放,不知道什么原因,👂不了

最后再贴一张图,是作者 PPT 中的一部分,觉得总结的很好,贴出来分享。

最后

这里提到的四块总结都是很实用的点,里面很多地方博主也是深有体会的。主要差在了刻意练习上面,不能很好的和自己的大脑相处,就像《象与骑象人》中描述的,骑象人无法很好的驾驭🐘,是因为不够了解🐘,缺乏足够的练习。

冲正

冲正是为系统认为可能交易失败时采取的补救手法。即一笔交易在终端已经置为成功标志,但是发送到主机的账务交易包没有得到响应,即终端交易超时,所以不确定该笔交易是否在主机端也成功完成,为了确保用户的利益,终端重新向主机发送请求,请求取消该笔交易的流水,如果主机端已经交易成功,则回滚交易,否则不处理,然后将处理结果返回给终端。

小明(是一个虚构人物)作为一名开发工程师(认真脸),平时经常用 Git 提交代码,觉得有些操作姿势还是很不舒服的,于是专门研究了一下各种场景下如果操作更优雅。

简短的提供思路式的讲解。

git merge 场景

场景一:分支 merge

有时候开发一个稍微大一些的需求持续个几天,搞一个分支去提交吧,于是有了 git checkout -b mywork,在 mywork 分支 commit C4、C5,然后主分支被 commit C3,最后我要将分支 merge 到之分支之上 git merge mywork

流程示意图如上面,使用 merge 的好处就是多人维护一个项目仓库的时候,要任何时候保证主分支代码是可用的,任何人不应该直接在 master 上提交代码。

场景二:merge request

fork \ merge request

场景三:rebase

开发了很久,各种fix提交记录,终于测通过了,要合到主分支了。发现这么多无效信息的提交记录干扰我们阅读,这时可以通过rebase将你的多次提交记录压缩成一个commit信息,然后再合到主分支上。

压缩 commit
git log 选择你提交的前一个版本

git rebase -i e9a13ba5adcc154d5717b107d55f416e61c03958

然后对其中的各项 commit 选择 pick / f / drop

遇到问题后处理,然后 git rebase --continue 直到合并完成

rebase到最新提交前

把所有分支的提交记录都弄下来 git fetch --all

然后 git rebase base/master

还是遇到问题后处理,然后 git rebase --continue 直到合并完成

最后 git push -f origin master

还有处理过程中不想处理了可以 git rebase --abort

blame

咨询(检举)谁写的代码为什么这么设计(写了一堆坑)。

git blame __init__.py 可以查看每行代码提交记录

grep

git grep -n tensorflow 可以根据关键字搜索代码

7.5 Git 工具 - 搜索

revert

git revert C2 revert 是将你的一次提交代码反向重新创建一个新的记录

patch

patch 的做法是将我们多次的提交diff成一个问题件,然后在 apply 作为一个新的 commit 提交。对于上面 rebase 那种多次提交并带着merge记录的很难通过rebase操作,patch会很方便的解决。

https://www.cnblogs.com/y041039/articles/2411600.html

hooks

git操作的一些钩子,可以帮你做一些检查。

https://git-scm.com/book/zh/v1/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git%E6%8C%82%E9%92%A9

stash

临时保存操作内容

保存记录 git stash
提取记录 git stash pop

https://git-scm.com/book/zh/v1/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git%E6%8C%82%E9%92%A9

cherry-pick

对已经提交的数据再次提交使用

  1. 找到一个 commit,记录 log 值
  2. 新建一个分支 git checkout -b newbranch
  3. 将一个commit 复制到新分支提交一个新 commit。git cherry-pick 38361a55138140827b31b72f8bbfd88b3705d77a

零散整理,复习知识点。

HashMap 实现原理

Java 8 中,HashMap 是由哈希数组+链表+红黑树组成的,也就是哈希数组、哈希表、链表散列,意思就是数组不是紧密排列的。每个数组元素对应一种不同的hash值,但是不同的hash值可能会映射到数组的同一下标(即哈希冲突)。因为

1
2
n = tab.length
tab[i = (n - 1) & hash]

put(K key,V value)方法:添加键值对key-value,如果存在键key,则value覆盖oldValue,并返回oldValue。先通过键key,利用哈希函数hashCode()等操作,获取hash值,然后根据hash值得到映射到数组的下标,再判断key键是不是存在此下标中。
两个对象的hashCode相同,equals不一定相同;两个对象equals相同,hashCode一定相同。所以,重写equals()方法,一定要重写hashCode()方法。

get(Object key)方法:返回键key对应的value值,如果不存在键key,返回null。
以上两个方法都是找key,然后就直接获得附加的value值了。

https://blog.csdn.net/laoxingyao/article/details/81252977

Java clone

https://blog.csdn.net/zhangjg_blog/article/details/18369201

抽象类\抽象方法

https://blog.csdn.net/qq_33567641/article/details/80986235

Optional 使用

1
2
3
4
5
Optional.ofNullable(entities)
.orElse(Collections.emptyList())
.stream()
.map(this::copyValueFromEntity2Dto)
.collect(Collectors.toList());

##IntStream迭代索引

1
2
3
Map<String, Boolean> retMap = IntStream.range(0, skuList.size())
.mapToObj(i -> Pair.of(skuList.get(i).getSkuId(), purchased.get(i)))
.collect(Collectors.toMap(Pair::getLeft, Pair::getRight));

POJO

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

函数接口

1
2
3
4
5
import java.util.function.*;
BiConsumer<T, U>
Function<T, R>
BiFunctionM<T, R, U>
@FunctionalInterface

https://www.ibm.com/developerworks/cn/java/j-java8idioms7/index.html

Supplier 接收一个函数,返回值类型为 T

1
2
3
4
public void abc(Supplier<T> fun){
fun.get();
}
abc(Class1::func1);

##Jackson - Annotations

@JsonIgnore 注解用来忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法时,和Filed效果一样。这个注解只能用在POJO存在的字段要忽略的情况,不能满足现在需要的情况。
@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段,可以满足当前的需要。这个注解还可以指定要忽略的字段。
@JsonInclude 该注解也是放在类名上面,作用是忽略类中字段值为null的当接收的时候。

Mock\Stub

Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取比较复杂的对象,用一个虚拟的对象来创建以便测试的测试方法。
Mock 与 Stub 的区别?
https://yanbin.blog/mockito-how-to-mock-void-method/#more-7748

EventBus

EventBus 是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。由于EventBus是将消息队列放入到内存中的,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。

lombok

@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法。
@Setter:注解在属性上;为属性提供 setting 方法。
@Getter:注解在属性上;为属性提供 getting 方法。
@Builder:构造一个实例,属性不需要单独 Set。

1
2
3
4
5
6
7
8
9
10
import lombok.Data;
import lombok.Builder;
@Data
@Builder
public class ReportReqDto {
private String id;
private Integer age;
private String name;
}
ReportReqDto.builder().id("1234312312313").age(12).name("test");
1
2
3
4
5
6
7
8
9
10
11
12
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AbelDeliveryRequestDto {
private long memberId;
private String skuId;
private int quantity;
private String extra;
private boolean anonymous;
private Map<String, String> params = new HashMap<>();
}

Maven 配置:

1
2
3
4
5
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>

常用时间表示方法

时间处理看似简单,不熟悉的话实则也有很多坑在里面,下面先介绍一下常用的时间系统。

格林尼治时间 GMT

格林尼治时间是指位于英国伦敦郊区的皇家格林尼治天文台当地的标准时间,因为本初子午线被定义为通过那里的经线。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间基于天文观测本身的缺陷,已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)来决定。

格林尼治标准时间-维基百科

协调世界时 UTC

协调世界时是最主要的世界时间标准,其以原子时秒长为基础。它与0度经线的平太阳时相差不超过1秒,并不遵守夏令时。协调世界时是最接近格林威治标准时间的几个替代时间系统之一,也是我们系统中主要使用的一个时间系统。
理论时区上以被15整除的子午线为中心,向东西两侧延伸7.5°,每15°为一个时区,这是理论时区。所以每差一个时区理论相差一个小时。东边的时区比西边的时区早,所以引入了国际日期变更线的概念。实际上为了避开国界线,时区的形状并不规则,又会以国家内部行政分界线划分,这是实际时区。在我国横跨四个理论时区,实际统一使用东八区(UTC+8)为实际时区。

时区的具体表示方式请移步 时区-维基百科

UNIX时间

UNIX时间或称POSIX时间,是UNIX或类UNIX系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒。
UNIX时间也就是我们常说的时间戳,也是系统中常用的一种时间表示方式。它全球唯一,当我们将时间戳转换成协调世界时的时候是零时区的时间加上对应时区的时差得出的协调世界时。

夏令时

先放维基百科解释 夏时制-维基百科
是一种为了节约能源而认为规定的地方时间制度。

Python 处理时间

说完了时间的一些表示方法,下面来说说 Python 有哪些处理时间的模块,以及整理了一些各异的时间处理函数。

time 模块

datetime 模块

calendar 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import calendar

#返回指定年的某月
def get_month(year, month):
return calendar.month(year, month)

#返回指定年的日历
def get_calendar(year):
return calendar.calendar(year)

#判断某一年是否为闰年,如果是,返回True,如果不是,则返回False
def is_leap(year):
return calendar.isleap(year)

#返回某个月的weekday的第一天和这个月的所有天数
def get_month_range(year, month):
return calendar.monthrange(year, month)

#返回某个月以每一周为元素的序列
def get_month_calendar(year, month):
return calendar.monthcalendar(year, month)

arrow 库

pip 安装就好了,Python中最好用的时间处理库了。

官方文档

crsmithdev_arrow_ Better dates & times for Python - github