Eric Chang's Blog


  • 首页

  • 归档

  • 分类

  • 标签

  • 生活

  • 关于

  • 搜索

2017我的年度书单

发表于 2017-12-10 |

引言

  • 今年是工作的第一年,虽然非常忙,但仍然静下心读了几本书。
  • 书籍相比于公众号、博客、各种手机APP等,在获取信息的效率方面确实比较逊色,但是读书的目的远远不仅是获取信息。读书、思考、认识、改变应当是一个有机统一的整体。书中的世界和我们眼中的世界有时是不同的,我想,这可能就是读书的意义所在吧。
  • 读书本身并不是学习,学习有很多渠道,不一定非要读书。如果说读书可以促使人进步,我想,不如说由读书引发的思考使人进步。思考力已经成为在这个飞速发展和变化的社会生存的核心竞争力。
  • 下面,分享我今年读的几本书,如果您对这些书籍或领域也感兴趣,欢迎邮件交流。

2017-我的书单

  • 《经济学基础》
    • 作者:[美] 曼昆
    • 曼昆是美国著名经济学家、哈佛大学经济学教授,本书是美国乃至全球经济学和金融学专业的知名的教科书。
    • 本书最大的特点是将深刻的经济学原理和普通人的生活相结合,深入浅出,用类比的思想讲解经济学的基本原理。
    • 本书涉及了经济学最深刻的本质:经济为何能够成为人类社会生活的一部分?为什么要有经济和金融,它有没有替代品?经济为人性服务还是人性为经济服务?
    • 如果您能将本书中的西方经济学思想和中国的具体实际相结合,您就会发现当今中国的各种经济现象的本源和基本的解决方案。大到国家层面的大政方针、小到我们每个人的财务支配,经济学原理就像一只无形的手支配着所有人的经济行为。
    • 本书是经济学经典著作《国富论》的延伸和发展,将现代经济学、金融学和西方经济学的思想融为一体,非常值得认真阅读。

book1

  • 《乌合之众》
    • 作者:[法] 居斯塔夫·勒庞
    • 作者勒庞是法国社会心理学家、社会学家、群体心理学创始人,本书是群体心理学的鼻祖。
    • 虽然群体心理学和个体心理学所揭示的心理学基本原理在本质上高度一致,但是群体心理学在研究方法、外在表象、应用实践等方面与个体心理学有着很大的不同。
    • 本书不是心理学教材,而是一本心理学专著,对于没有心理学背景的读者来说,可能不容易领会其中的内涵。建议在阅读本书前先阅读戴维·迈尔斯的《社会心理学》。
    • 本书提出了几个较为深刻的问题,就连勒庞自己也没有给出完美的解答:为什么将个体放在群体中就会出现和个体单独存在时完全不同、甚至截然相反的心理表现?社会和群体存在和意义和价值是什么?不同种族、不同信仰、不同价值观的人如何合作?社会群体和家庭如何影响个体的心理发展?
    • 如果您对心理学在群体中的表征看兴趣,可以阅读此书。

book2

  • 《合作的进化》
    • 作者:[美] 罗伯特·阿克塞尔罗德
    • 本书很薄,一两周便能够通读完成;
    • 不同于《乌合之众》,本书专注于行为心理学的研究和实践,而不是侧重群体心理学。
    • 阅读完本书您会发现,人类的一切政治、经济、军事、科技、教育、娱乐活动无不暗含着行为心理学的基本原理,可以说行为心理学指导人类进行各种社会活动,社会活动本身反过来也影响人的行为。人的行为在一定程度上是可预测的。
    • 如果您对博弈论感兴趣,建议将本书和博弈论相关书籍一起阅读,您会发现人类行为不知不觉也应用了博弈论的基本原理,并且对企业间、国家间的合作理解得更为深刻和透彻。

book3

  • 《变态心理学》
    • 作者:[美] 德博拉 C.贝德尔 (Deborah C. Beidel) / 辛西娅 M. 布利克(Cynthia M. Bulik) / 梅琳达•斯坦利(Melinda A. Stanley)
    • 本书讲解了非常态心理的基本原理,比如造成孤独症、焦虑症、抑郁症的原因和基本治疗方法。虽然只有心理学相关专业才需要这些知识,但是我还是完整阅读本书,对非常态心理有了基本的理解。
    • 本书不仅包含理论研究,而且还包含了大量生动的例子和临床实践,便于读者了解问题的表象和本质原因。
    • 本书中还有很多概念我不太理解,需要再次阅读其他变态心理学著作配合理解。

book4

  • 《聪明的投资者》
    • 作者:[美] 本杰明·格雷厄姆
    • 本书作者本杰明·格雷厄姆是美国经济学家和投资思想家、价值投资理论奠基人、巴菲特的老师。
    • 本书是价值投资的最为经典的著作,没有之一。
    • 如果您对投资感兴趣,或者准备成为股东,强烈推荐阅读此书。
    • 本书理论部分不多,对于大多数章节,都直接给出作者的观点或者结论,比如投资的基本原则和注意事项、公司或股票的选择原则、如何在股市中盈利和止损等。
    • 本书并没有讲解太多技术面的操作技巧,如果需要了解技术面,不建议阅读本书。

book5

  • 《人人都是经营者》
    • 作者:[中] 刁东平
    • 阿米巴经营模式的核心,是经营哲学、组织结构设计、内部市场、经营会计、人才培养、内部运行等等一整套理论的有机整合,作者认为这是比较适合中国企业的、但尚未在中国企业中广泛应用的一种经营模式。
    • 我个人认为,阿米巴经营模式适用于那种资金流动性大、具有较充足的流动资金、处于朝阳产业并想要扩大生产的中型企业。准备上市的企业也可以参考运用。
    • 任何一种模式都无法代替“实事求是”四个字,应当根据企业的实际情况,使用适合自己的模式。

book6

  • 《巴菲特之道》
    • 作者:[美] 罗伯特·哈格斯特朗
    • 想了解投资大师巴菲特?就读这本书!
    • 本书介绍了巴菲特的个人经历,以及如果从一位投资小白成长为投资大师的传奇经历,从这段经历中,我们也可以看出巴菲特的投资思想的变迁。
    • 虽说成功不可复制,但是参考巴菲特成功的经历,多多少少有所启发、有所借鉴。

book7

  • 《看见》
    • 作者:[中] 柴静
    • 本书给了读者看中国的另一只眼睛。
    • 本书中所写的都是记者柴静的采访经历,看起来都是一些小事,但却能反映最真实的中国的现状。本书书名为《看见》,的确,读完本书后,我看见了一些以前不曾看见的东西,对中国的改革、发展有了更深刻的认识,对发展中遇到的问题和解决方法有了更深刻的认识。
    • 历史就是一个和另一个的《看见》所书写的,《看见》不仅是为了看见,更是为了改变和进步。

book8

我理解的DevOps

发表于 2017-06-15 | 分类于 DevOps |

引言

  • DevOps是一种重要的软件开发模式;
  • 我所在的团队正在进行DevOps转型;
  • DevOps极大地提升了开发效率;
  • 本文介绍了我对DevOps的理解;

什么是DevOps

  • DevOps是一种软件开发人员(Research and Dev,RD)和IT运维运营技术人员(Ops)和质量检测(QA)之间沟通合作的模式;
  • DevOps的根本目的是快速频繁的、小步的、自动化便捷的监控和审计的、云端和虚拟化的、可视化的部署,满足“每天部署10次”或者“快速解决bug并上线”的要求;
  • DevOps是敏捷开发、持续交付的基础;
  • DevOps模式和传统的瀑布模型相对应;

我们需要维护什么?

  • 以我所在的团队为例,我们需要维护的内容如下:
    • 需要维护的环境分为:开发环境,测试环境,准生产环境,生产环境;
    • 每个环境包含若干个scope,每个scope都是整个系统的一部分,由不同的团队进行开发;
    • 使用microsoft微服务架构,每个scope中都有若干service,每个service之间可能还存在相互依赖关系;
    • 每个service都需要若干resource,这些resource包括但不限于:
  • RabbitMQ;
  • Service Fabric;
  • IoTHub;
  • EventHub;
  • ELK;
  • Consule;
  • KeyVault;
  • MongoDB;
  • Postgresql;
  • Cassandra;
  • Storm;
  • Redis;

如果没有DevOps,我们怎样工作?

  • 没有流水线Pipeline:
    • 开发过程变得非常痛苦,会经常忘记对代码进行单元测试和集成测试;
    • 开发完成的服务,打包后不知道放在何处,别人需要引用时很不方便;
    • 代码质量得不到保证,很多代码没有经过“单元测试覆盖率检测”和“代码重复率检测”,代码可维护性变差;
    • 随着开发的深入进行,开发人员的主要精力不在是编写新的代码,而是处理bug和维护旧的代码,使开发效率逐渐降低;
  • 没有自动化环境部署:
    • 在开发者完成一个微服务的开发后,不知道将自己开发的服务部署到什么环境上去测试;
    • 开发者在测试自己的代码时,会时常发现所依赖的资源没有准备好,比如测试环境缺少MongoDB等资源;
    • 运维人员不能显式的看到自己维护了多少资源,每种资源都在被哪些环境、哪些service引用;
    • 运维人员不能显式的看到资源的使用情况及使用量;
    • 经理不能有效的进行成本控制;
  • 没有自动化监控系统:
    • 运维人员不能在机器、硬件、软件出现故障时得到及时的警告,导致机器挂掉了都还不知道;
    • 不能灵活调配各种资源的使用,导致某些资源极度紧缺、某些资源却有富余;
  • 手动,而不是自动:
    • 从下面的图片可以看出,只需手工运行5条命令的情况下,成功部署的概率就已跌至86%,如需手工运行55条命令,成功部署的概率将跌至22%,如需手工运行100条命令,成功部署的概率将趋近于0(仅2%)!

DevOps

为什么要有DevOps

  • 不知道目前发布、部署的进展情况;
  • 没有一套明确的发布、部署流程,急上线时容易出问题,出了问题也没有预案来解决;
  • 自动化程度不够;

DevOps工具链

  • 编码:代码开发和审阅,版本控制工具、代码合并工具;
  • 构建:持续集成工具、构建状态统计工具;
  • 测试:通过测试和结果确定绩效的工具;
  • 打包:成品仓库、应用程序部署前暂存;
  • 发布:变更管理、发布审批、发布自动化;
  • 配置:基础架构配置和部署,基础架构即代码工具;
  • 监视:应用程序性能监视、最终用户体验;

DevOps的多维度目标

  • 团队维度:拟合开发和运维的鸿沟,支持位于全球多个地点的、包含外包人员的、混合开发/测试/基础设施的团队;
  • 技术维度:拟合多类型的分布式的硬件平台和上面部署的多种应用、多种需求的鸿沟;
  • 需求维度:平衡软件开发过程中对软件用户需求变化、追求稳定性、追求开发效率、降低check-in风险这几个目标;
  • 市场维度:解决软件迭代慢和较高的用户需求的矛盾;
  • 终极目标:从时间和空间两个维度,合理统筹并高效使用现有资源,实现组织目标,最大限度满足用户需求;

DevOps需要遵循的基本原则

  • 以人为本,一切工具都是为人服务;
  • 需求细分,及时开发,及时验证;
  • 减少开发的分支,尽量在主干上开发,避免合并分支造成的开销和时间浪费;另外,分支太多的时候不可能做到持续集成;
  • 减少代码积压,代码积压越多、越多的需求和开发成果得不到验证、效率就越低、下次部署的风险就越大;
  • 代码和配置相分离,尽量降低他们在逻辑或者物理上的耦合;
  • 尽早生成二进制包,而不是使用源代码,并确保二进制包不被篡改;
  • 二进制包应当和环境无关;
  • 确保部署流程是幂等的;
  • 对生产和测试环境的修改只能由程序,而不是人完成;

环境管理

  • 环境必须遵循:快速部署和响应(使用docker或者其他虚拟化技术能够更容易做到这一点),可恢复,可支持,可审计;
  • 环境配置项目:
    • 操作系统和配置;
    • 中间件和软件栈及配置:数据库,消息系统,队列;
    • 基础设施软件:代码管理,目录服务,监控;
    • 外部集成:外部系统和服务;
    • 网络:路由,防火墙,交换机,DNS;
    • 团队:开发团队和infra团队之间的协调分工;
  • 自动化的环境部署;
  • 测试环境应当和生产环境尽量一致;
  • 环境的配置文件也应当进行版本控制;

监控

  • 监控的内容:
    • 硬件,物理设备,路由器,代理;
    • 操作系统;
    • 中间件;
    • 应用程序;
    • 日志;
  • 如何监控:
    • 清晰的信息展示;
    • 及时的告警;
    • 可视化的状态呈现;

常用DevOps利器

  • Jenkins:开源的持续集成工具;
  • SonarQube:开源的代码质量管理系统;
  • Puppet:开源的软件自动化配置和部署工具;
  • Docker:让应用程序布署在软件容器下的工作可以自动化进行;

总结:DevOps到底是什么?

  • 高效的流水线开发/测试/上线;
  • 自动化的环境部署和管理;
  • 良好和及时的监控/告警/可视化/反馈/日志;
  • 开发团队、运维团队、用户之间良好的沟通协作,快速解决问题的能力;
  • 完整的文档;
  • 任一模块的幂等和可恢复;
  • 良好的审计和评估,良好的成本管理;
  • 整个系统稳定且灵活,高度自动化;
  • 总而言之,DevOps的核心只有三个词:高效、自动、监控;

参考

  • DevOps的真谛到底是什么?
  • 持续集成是什么?
  • 持续交付概述
  • 看板管理

Flasgger使用心得

发表于 2017-05-20 | 分类于 Python |

引言

  • Flask是一款流行的Python实现的Web开发微框架;
  • Swagger是一款Restful接口的文档在线自动生成+功能测试功能软件;
  • 通过swagger能够清晰、便捷地调试符合Restful规范的API;
  • 在flask框架中使用的swagger即为flasgger,flasgger是flask支持的swagger UI,便于调试使用flask框架搭建的web api接口;
  • 本文介绍了flasgger的用法和不足之处。

使用方法

  • 首先,需要在项目中安装flasgger,具体方法有两种:
    • 方法一:在visual studio中右键工程,搜索flasgger,自动安装;
    • 方法二:使用pip命令,pip install flasgger;
  • 安装后,使用下面的程序框架,搭建最简单的web api:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
app = Flask(__name__)
Swagger(app)

@app.route('/api/<string:language>/', methods=['GET'])
def index(language):
"""
This is the language awesomeness API
Call this api passing a language name and get back its features
---
tags:
- Awesomeness Language API
parameters:
- name: language
in: path
type: string
required: true
description: The language name
- name: size
in: query
type: integer
description: size of awesomeness
responses:
500:
description: Error The language is not awesome!
200:
description: A language with its awesomeness
schema:
id: awesome
properties:
language:
type: string
description: The language name
default: Lua
features:
type: array
description: The awesomeness list
items:
type: string
default: ["perfect", "simple", "lovely"]

"""


language = language.lower().strip()
features = [
"awesome", "great", "dynamic",
"simple", "powerful", "amazing",
"perfect", "beauty", "lovely"
]
size = int(request.args.get('size', 1))
if language in ['php', 'vb', 'visualbasic', 'actionscript']:
return "An error occurred, invalid language for awesomeness", 500
return jsonify(
language=language,
features=random.sample(features, size)
)


app.run(debug=True)
  • 从上面的程序我们可以看出,只要将yaml格式的flasgger描述性程序放置在两组双引号之间的位置,即可实现flasgger的基本功能;
  • 访问http://localhost:5000/apidocs/index.html 即可看到flasgger页面;

flasgger

  • 当然,上面的yaml描述性程序可以放置在单独的文件中,那么api中用@符号引入这个文件即可:
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
import random
from flask import Flask, jsonify, request
from flasgger import Swagger
from flasgger.utils import swag_from

app = Flask(__name__)
Swagger(app)

@app.route('/api/<string:language>/', methods=['GET'])
@swag_from('index.yml')
def index(language):
language = language.lower().strip()
features = [
"awesome", "great", "dynamic",
"simple", "powerful", "amazing",
"perfect", "beauty", "lovely"
]
size = int(request.args.get('size', 1))
if language in ['php', 'vb', 'visualbasic', 'actionscript']:
return "An error occurred, invalid language for awesomeness", 500
return jsonify(
language=language,
features=random.sample(features, size)
)


app.run(debug=True)

flasgger配置文件解析:

  • 在flasgger的配置文件中,以yaml的格式描述了flasgger页面的内容;
  • tags标签中可以放置对这个api的描述和说明;
  • parameters标签中可以放置这个api所需的参数,如果是GET方法,可以放置url中附带的请求参数,如果是POST方法,可以将参数放置在schema子标签下面;
  • responses标签中可以放置返回的信息,以状态码的形式分别列出,每个状态码下可以用schema标签放置返回实体的格式;

flasgger的不足

  • flasgger的配置文件中,对于POST方法,在描述POST body的schema标签中,不支持以yaml格式描述的数组或嵌套的object,这使得页面上面无法显示这类POST body的example;
  • 解决方案:将这类POST body的example放置在description部分(三横杠”—“上面的部分),由于description部分是用html格式解析的,所以可以以html的语法编写;

参考

  • flasgger介绍
  • flask文档
  • flasgger源码
  • swagger官网

企业财务报表分析方法

发表于 2017-05-01 | 分类于 feeling |

引言

  • 最近研究投资,看了肖星的一本书读懂财报,做了一些笔记;
  • 结合一些投资的资料,总结了一下投资中,特别是股票投资中,需要知道的一些研判公司经营情况的基础概念和公式,特在本篇博客中加以记录,共大家参考;
  • 这些概念和公式都是纸面上的,需要结合具体情况分析才有价值;
  • 投资活动中,不能偏信任何一个公式、概念或理论,需要结合具体情况,实事求是进行分析;
  • 非常感谢这篇公众号的总结:看过这份最全财务公式表的会计人,月薪还怕破不了5w?

三张基础财务报表

资产负债表

资产负债表——所有表格的基础。从某种意义上说,一个公司的资产负债表才是根本。无论是现金流量表还是利润表都是对资产负债表的深入解释。在格雷厄姆的时代,会计准则并没有要求现金流量表。后来的会计准则进一步发展,现金流量表才成为必须。因此在格雷厄姆的《证券分析》一书中对资产负债表的论述与分析是最多的。

现金流量表——资产负债表的变化

现金流量表是对资产负债表变化的解释。现金的变化最终反映到资产负债表的现金及等价物一项。而现金的变化源泉则是净利润。净利润经过“经营”、“投资”、“筹资”三项重要的现金变动转变为最终的现金变化。

首先,净利润经过营运资本的变化、摊销折旧等非现金项目、其他项目(财务支出或收入、投资收益等)的调整,最终转换为经营现金流。

其次,投资的支出与收益的现金流量。其中买卖资产对资产负债表的资产项目有影响。

最后,筹资的现金流量。其中,借债与还债会影响资产负债表的借款项目。分红与增发会影响资产负债表的股东权益项目。

利润表——净利润的来源

利润表是净利润的来源。而净利润则直接影响资产负债表中股东权益的变化。

这三张表格是一个公司财务状况的精髓与总结。也是公司这个动态系统的简化模型。

财务报表汇总图

财务报表

企业经营状况分析

企业经营状况主要从以下三个方面进行分析:

  • 企业偿债能力;
  • 企业营运能力;
  • 企业盈利能力;

企业经营状况分析

企业财务报表分析公式大全

偿债能力分析

1、流动比率=流动资产/流动负债*100%。指标越高,企业流动资产流转越快,偿还流动负债能力越强。国际公认200%,我国150%较好。

2、速动比率=速动资产(流动资产-存货)/流动负债*100%。国际标志比率100%我国90%左右。

3、资产负债率=负债总额/资产总额*100%。指标越高负债程度高,经营风险大,能以较低的资金成本进行生产经营。保守比率不高于50%,国际公认较好60%。

4、长期资产适合率=(所有者权益+长期负债)/(固定资产+长期投资)*100%

资本状况分析

1、资本保值增值率=扣除客观因素后的年末所有者权益/年初所有者权益*100%,指标越高,资本保全情况越好,企业发展潜力越大,债权人利益越有保障。

2、资本积累率=本年所有者权益增长额/年初所有者权益*100%,指标越高,所有者权益增长越快,资本积累能力越强,保全情况好,持续发展能力越大。

盈利能力分析

1、主营业务毛利率=毛利(主营收入-主营成本)/主营业务收入*100%,介于20%-50%之间,一般相对合理稳定,流动性强的商品,毛利率低。设计新颖的特殊商品(时装)毛利率高。

2、主营业务净利率=净利润/主营业务收入*100%,反映企业基本获利能力。

3、主营业务成本率=主营业务成本/主营业务收入*100%

4、 营业费用率=营业费用/主营业务收入*100%

5、主营业务税金率=主营业务税金及附加/主营业务收入*100%

6、资产净利率=税后净利/平均总资产100%=主营业务净利率总资产周转率。指标高低于企业资产结构,经验管理水平有密切关系。

7、净资产收益率=净利润/平均所有者权益*100%。反映投资者投资回报率,股东期望平均年度净资产收益率能超过12%。

8、不良资产比率=年末不良资总额/年末资产总额*100%

9、资产损失比率=待处理资产损失净额/年末资产总额*100%

10、固定资产成新率=平均固定资产净值/平均固定资产原值*100%

11、 流动比率=流动资产/流动负债*100%

12、 速动比率=速动资产/流动负债*100%

13、 资产负债率=负债总额/资产总额*100%

14、长期资产适合率=(所有者权益+长期负债)/(固定资产+长期投资)*100%

15、资本保值增值率=扣除客观因素后的年末所有者权益/年初所有者权益*100%

16、资本积累率=本年所有者权益增长额/年初所有者权益*100%

17、 主营业务毛利率=毛利/主营业务收入*100%

18、 主营业务净利率=净利润/主营业务收入*100%

19、主营业务成本率=主营业务成本/主营业务收入*100%

20、 营业费用率=营业费用/主营业务收入*100%

21、主营业务税金率=主营业务税金及附加/主营业务收入*100%

22、资产净利率=税后净利/平均总资产100%=主营业务净利率总资产周转率

23、 净资产收益率=净利润/平均所有者权益*100%

24、 管理费用率=管理费用/主营业务收入*100%

25、 财务费用率=财务费用/主营业务收入*100%

26、成本、费用利润率=利润总额/(主营业务成本+期间费用)*100%

27、 销售收现比=销售收现/销售额

28、 营运指数=经营现金净流量/经营所得现金

29、 现金比率=现金余额/流动负债*100%

30、现金流动负债比=经营活动净现金流量/流动负债*100%

31、现金债务总额比=经营活动净现金流量/总负债*100%

32、 销售现金比率=经营现金净流量/销售额*100%

33、应收帐款周转率(次数)=赊销收入净额/应收帐款平均余额

34、 应收帐款周转天数

=天数/应收帐款周转次数

=计算期天数*应收帐款平均余额/赊销收入净额

销售收入净额=销售收入-现销收入-销售折扣与折让

35、 存货周转率=销售成本/平均存货

36、 存货周转天数=计算期天数/存货周转率

37、流动资产周转次数(率)=销售收入净额/流动资产平均余额

38、流动资产周转天数=计算期天数/流动资产周转次数

39、总资产周转率=销售收入净额/平均资产总额

40、总资产周转天数=计算期天数/总资产周转率

41、已获利息倍数=(税前利润总额+利息支出)/利息支出

42、总资产报酬率=(利润总额+利息支出)/平均资产总额

营运能力分析

1、应收帐款周转率(次数)=赊销收入净额/应收帐款平均余额,指标高说明收帐迅速,账龄期限短,减少企业收帐费用和坏账损失。

2、 应收帐款周转天数

=天数/应收帐款周转次数

=计算期天数*应收帐款平均余额/赊销收入净额

销售收入净额=销售收入-现销收入-销售折扣与折让

3、存货周转率=销售成本/平均存货。一般情况周转速度越快,变现速度越快,占用存货资金少,占用相同数额的存货而实现的销货成本大。

4、存货周转天数=计算期天数(年360天)/存货周转率

5、流动资产周转次数(率)=销售收入净额/流动资产平均余额,指标高表明企业流动资产周转速度快,利用效果好。

6、流动资产周转天数=计算期天数/流动资产周转次数

7、总资产周转率=销售收入净额/平均资产总额。周转速度快,企业的营运能力强;指标低,说明收入不足,或资产闲置浪费。

8、 总资产周转天数=计算期天数/总资产周转率

9、已获利息倍数=(税前利润总额+利息支出)/利息支出

10、总资产报酬率=(利润总额+利息支出)/平均资产总额

综合偿债能力

已获利息倍数=(税前利润总额+利息支出)÷利息支出

  • 盈利能力:

主营业务净利率=(净利润÷主营业务收入)×100%

资产净利率=(净利润÷平均总资产)×100%=主营业务净利率*总资产周转率

净资产收益率=(净利润÷平均净资产总额)×100%

总资产报酬率=(利润总额+利息支出)÷平均资产总额

  • 营运能力:

应收帐款周转率=主营业务收入÷应收帐款平均余额
(高表明企业收帐迅速,帐龄期限短,可减少收帐费用和坏帐损失,相对增加企业流动资产的投资收益,说明资产流动性大,变现快短期偿债能力强)

存货周转率=主营业务成本÷平均存货余额
(高表明企业资产由于销售顺畅而具有较高的流动性存货转现速度快存货占用水平低,过高 存货不足,产品脱销)
(慢:必然占用在量的资金,造成资金浪费,营运困难)

流动资产周转率=主营业务收入÷平均资产总额

总资产周转率=主营业务收入÷平均资产总额
(过低:收入不足,资产闲置,浪费)

  • 发展能力:

销售增长率=(本年主营业务收入-上年主营业务收入)÷上年主营业务收入

资本积累率=[(年末所有者权益-年初所有者权益)÷年初所有者权益]×100%

主营业务利润 = 主营业务收入 — 主营业务成本 — 主营业务税金及附加

营业利润 = 主营业务利润 + 其他业务利润 — 期间费用

利润总额 = 营业利润 + 投资收益 + 补贴收入 + 营业外收入 — 营业外支出

净利润 = 利润总额 — 所得税

武汉游记

发表于 2017-04-30 | 分类于 feeling |

引言

  • 五一假期原本准备待在家里,不过按耐不住一颗游玩的心,和女朋友一起来到武汉,近距离欣赏江城的靓丽风景;
  • 武汉是湖北省省会、中部六省唯一的副省级市和特大城市,中国中部地区中心城市,全国重要的工业基地;
  • 武汉地处江汉平原东部,长江中游。世界第三大河长江及其最大支流汉江横贯市境中央,将武汉中心城区一分为三,形成武昌、汉口、汉阳三镇隔江鼎力的格局;
  • 下面,就带您领略武汉的美景。

黄鹤楼

  • 黄鹤楼位于武汉长江南岸的武昌蛇山之巅,为国家5A级旅游景区,享有“天下江山第一楼“、”天下绝景“之称;
  • 黄鹤楼是武汉市标志性建筑,与晴川阁、古琴台并称“武汉三大名胜”,也与湖南岳阳楼、江西南昌滕王阁并称为“江南三大名楼”;
  • 李白的《黄鹤楼送孟浩然之广陵》就出自与此:故人西辞黄鹤楼,烟花三月下扬州,孤帆远影碧空尽,唯见长江天际流。
  • 下图是黄鹤楼,五一人非常多,从楼下到最上层走了一个多小时;

黄鹤楼

  • 黄鹤楼上的风景很美,可以远眺长江大桥;

黄鹤楼远眺

长江大桥

  • 武汉长江大桥位于湖北省武汉市武昌蛇山和汉阳龟山之间的长江江面上,是万里长江上的第一座大桥,也是新中国成立后在长江上修建的第一座复线铁路、公路两用桥,被称为“万里长江第一桥”;
  • 武汉长江大桥是苏联援华156项工程之一,于1955年9月动工,1957年10月15日正式通车,全长约1670米。上层为公路桥(107国道),下层为双线铁路桥(京广铁路),桥身共有8墩9孔,每孔跨度为128米,桥下可通万吨巨轮;
  • 1956年6月毛泽东题写的“一桥飞架南北,天堑变通途”,正是对武汉长江大桥沟通中国南北交通这一重要作用的真实写照,作为中国第一个五年计划主要成就,大桥图案入选1962年4月发行的第三套人民币,成为新中国国家建设的重要标志;
  • 下图是站在长江大桥桥头照的:

长江大桥

长江大桥桥头

  • 站在桥上,每当有火车通过时,能够明显感觉到桥的晃动;

长江大桥桥面

户部巷

  • 作为一个吃货,无论到哪里,最重要的就是吃了,户部巷有很多好吃的,当然不能错过;
  • 户部巷位于武昌最繁华的司门口,东靠十里长街,西临浩瀚长江,南枕“天下江山第一楼”黄鹤楼,北接都府堤红色景区,是一处由名街名楼名景名江环绕而成的美食天堂;
  • 热干面是武汉最出名的小吃了,热腾腾的面条上浇上一勺麻酱,别提味道有多好了,除此之外,糊米酒也非常出名,糊米酒是在普通的米酒中加入了黑芝麻,集“米酒”和“芝麻糊”于一身,味道很独特;

热干面-糊米酒-银耳汤

  • 来武汉不能不吃武昌鱼,武昌鱼分为清蒸和红烧两种,其中清蒸武昌鱼更能够保持鱼的鲜味;武昌鱼肉非常嫩,蛋白质含量高,是营养和美味的完美结合;毛主席在《水调歌头~游泳》中也曾赞美过武昌鱼的鲜美:才饮长沙水,又食武昌鱼,万里长江横渡,极目楚天舒。

武昌鱼

  • 藕汤是武汉挺出名的小吃,汤的味道非常鲜美,加上藕片和排骨熬制而成;

藕汤

  • 糯米团子,外面是糯米,里面的鲜猪肉;

糯米团子

  • 烧麦,这是香菇大肉馅的烧麦,非常好吃;

烧麦

  • 豆皮是武汉出名的小吃,制作十分简单,将新鲜的生豆皮放入油锅中煎制即可,配上鲜萝卜丝,非常好吃;

豆皮

网站安全架构——常用加密方法小结

发表于 2017-02-27 | 分类于 Web |

引言

  • 在网站的安全性架构中,常常用到各种加密方法和算法;
  • 本文总结了几种加密方法的原理,以备不时之用;
  • 本文不涉及技术细节;

单项散列加密

  • 原理:采取某种算法,使得通过明文可以得到密文,但是不能由密文反推明文;这类算法的特点是,输入变化微小也能引起结果的大幅变化;
  • 应用场景1:为安全起见,用户密码是加密后存入数据库中,验证身份时只对比密文,不对比明文;这种方法常被攻击者用彩虹表攻击(常用密码明文及其密文之间的对应关系表);
  • 应用场景2:用于生成信息摘要、验证信息的完整性等;
  • 代表算法:MD5,SHA;

对称加密

  • 原理:加密和解密使用同一个密钥,适合对大量数据进行加密;
  • 关键点:密钥的安全性是加密算法有效性的保证;
  • 代表算法:DES,RC;

非对称加密

  • 分为私钥(所有者掌握)和公钥(公开),公钥加密只能私钥解开,私钥加密只能公钥解开;
  • 应用场景1:在传递少量敏感信息时(如验证身份),可以用公钥加密,经传输后,对方使用私钥解密,这样即便传输过程中信息泄露,攻击者也不能获取明文;
  • 应用场景2:签名者用私钥对信息(数字签名)加密,接受者用公钥进行解密,由于只有发送者掌握私钥,所以发送者对该信息不能抵赖;
  • 代表算法:RSA;

HTTPS依赖的加密算法

  • HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,是使用 TLS/SSL 加密的 HTTP 协议。
  • HTTP 协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议 TLS/SSL 具有身份验证、信息加密和完整性校验的功能,可以避免此类问题。
  • TLS/SSL 全称安全传输层协议 Transport Layer Security, 是介于 TCP 和 HTTP 之间的一层安全协议,不影响原有的 TCP 协议和 HTTP 协议,所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。
  • TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

https-safety

如何保证密钥安全:

  • 决不能把密钥写在源码中;
  • 密钥也尽量不要写在配置文件中;
  • 方案一:将密钥和算法放置在独立的服务器上,甚至做成一个专用的硬件设备,由专人维护,独立提供加密解密服务;这种方法每次都要远程调用服务,性能不太好;
  • 方案二:将加解密算法放在应用系统中,密钥本身放在独立的服务器中,这样可改善性能;

新马泰游记

发表于 2017-02-18 | 分类于 feeling |

第一次出国

  • 新马泰之行是我第一次出国,趁着尚未正式工作,出去玩一圈长长见识,以后这样的机会就不多了;
  • 出去玩之前,听说新加坡环境很好、马来西亚的水果很好吃、泰国有很多人妖,但这都只是听说,身临其境之后才发现,有很多东西和听说的不完全一样;
  • 2月正值三国的旅游旺季,此时出国正和时宜;
  • 行程整体安排:
    • 2月9日:郑州新郑国际机场出发,经停香港,于当地时间23:45抵达曼谷素万那普国际机场;
    • 2月10日:曼谷;
    • 2月11日-12日:芭提雅;
    • 2月13日:曼谷;
    • 2月14日:曼谷素万那普国际机场出发,与北京时间11:30抵达新加坡樟宜国际机场;
    • 2月14日-15日:新加坡;
    • 2月15日:从新加坡陆路过境到马来西亚,并抵达马六甲;
    • 2月16日:马六甲,并乘车抵达吉隆坡;
    • 2月17日-18日:吉隆坡;
    • 2月18日:从吉隆坡乘车赴新山,并通过陆路口岸过境进入新加坡,从新加坡樟宜国际机场出发,经停香港,返回郑州;
  • 行程总里程:9880公里;

新马泰三国概况

泰国 新加坡 马来西亚
首都 曼谷 新加坡 吉隆坡
面积 513115平方公里
相当于四川省大小
683平方公里
相当于广州市大小
330257平方公里
相当于云南省大小
人口 6800万 553万 3033万
语言 泰语 英语/马来语/华语 马来语
宗教 佛教 佛教/伊斯兰教 伊斯兰教
气候 热带季风气候
均温27℃
热带海洋气候
均温33℃
热带海洋气候
均温29℃
时差 比北京早一个小时 同北京时间 同北京时间
交通 靠左行驶 靠左行驶 靠左行驶
货币 泰铢
1泰铢约兑换0.1962人民币
新加坡元
1新加坡元约兑换4.8389人民币
林吉特
1林吉特约兑换1.5421人民币
电压 220V 220V
英式插头
240V
英式插头
紧急电话 报警 191
火警 199
急救 1691
报警 999
火警 995
急救 995
报警 999
火警 994
急救 999

泰国

  • 泰国的货币是泰铢,到机场后先兑换了一些:

泰铢-正面

泰铢-背面

  • 泰国的饮食酸甜居多,菜里面一般会放一些黄色的尖椒调味,所以菜品普遍偏辣,下图是酒店的自助早餐,包括炒洋葱、炒豆芽等:

泰国自助早餐

  • 泰国议会制的君主立宪制国家。泰国人多信仰佛教。在古代,泰国地区的人看病、上学、结婚等事宜都是在寺庙中完成的。直至今日,泰国的酒店每天早晨都能看到前来化缘的僧人。
  • 泰国国王在民众心目中的地位非常高,举例来说,每到毕业季,国王会巡游77个省、并亲自向大学生颁发毕业证书,普通民众家里如果能拜访一张和泰国国王的合照是非常荣耀的事情。国王的生日2月5日被定为泰国的父亲节。
  • 泰国国王登基的地方就是大皇宫,这是历代王宫保存最完美、规模最大、最有民族特色的王宫,是泰国的”故宫“。大皇宫位于曼谷市中心,紧邻湄南河,及政治、宗教、艺术于一体,堪称世界瑰宝,供奉贴金佛像地方必须脱鞋进入。

泰国大皇宫
泰国大皇宫

  • 大皇宫中建筑金碧辉煌,其实这是金色油漆和彩色玻璃的杰作,但在古代,这可都是真正的黄金和宝石啊!

泰国大皇宫
泰国大皇宫
泰国大皇宫
泰国大皇宫

  • 参观完大皇宫,旁边就是世界闻名的湄南河,这条河是古时候泰国的通商要道,河道旁边全是商店和餐馆:

湄南河
湄南河

  • 湄南河旁边的餐馆中,泰式的炒米饭尤其受欢迎:

湄南河

  • 在芭提雅的格兰岛,对于像我一样的内地人而言,最重要的一项活动就是看海了,宽广的太平洋一望无际,海水十分清澈。在海里游泳的感觉和在游泳池里大不一样。在这里,我完成了人生的第一次潜水。

大海

  • 在芭提雅滨海的56层高的观光塔上,纵览芭提雅全景,这个三面临海的城市,给我留下深刻印象:

观光塔上

  • 无意中还发现了泰国版的红牛,酸甜可口,非常好喝:

泰国版红牛

新加坡

  • 从曼谷距新加坡大概1500公里,飞行约3个小时,飞机上的景色非常美,能当屏保了:

飞机

  • 新加坡的货币是新元,到机场先换了几张:

新元
新元

  • 到了新加坡,我才知道这些新加坡独有的特色:

    • 新加坡很小,东西最长处仅45公里,所有吃的东西靠进口;
    • 新加坡距赤道仅137公里,每天都下2-3场雨,气候非常湿润;
    • 在新加坡,所有的自来水均可直接饮用,边洗澡边喝水也是可以的;
    • 新加坡实行12年义务教育,小学上课时间07:30-13:30,下午不上课,好幸福;
    • 新加坡贩卖口香糖非法,要罚款5000新币并做9个月的牢;
    • 新加坡生孩子第一胎奖励1.2万新元,第二胎奖励2.4万新元,以此类推,但这个钱家长取不出来,只能供孩子使用;
    • 新加坡所有的电梯没有4和13,不吉利;
    • 新加坡车牌只有10年使用权,过期只能再买;
    • 新加坡房价均价只有1万人民币,不过只卖给本国人,由于太潮,一楼不住人;
    • 新加坡药店很少,所有口服药必须有医生允许才能买到,60岁以上老人体检免费;
    • 新加坡的酒非常贵,而且政府对酒有严格的控制,晚上十点以后不能买酒、所有超市的收银台无法扫描酒类商品(包括烧菜用的料酒);
  • 新加坡圣淘沙岛上的赌场非常有名,里面聚集了世界各地的土豪,但有三种人不能进入赌场:21岁以下的,被加入黑名单的,本地人不让进(除非买100新元门票才让进,外国人持护照免费进入),赌场都不是新加坡政府开的,都是外国政府投资;

  • 小心翼翼的进去转了一圈,有几百张赌桌,上面摆放着花花绿绿的筹码,有各种玩法,和电影上看到的差不多。由于赌场内部严禁拍照,所以只能上一张赌场的外景:

赌场

  • 圣淘沙岛上有一尊高35米的狮身鱼尾雕塑,夜景非常美:
    狮身鱼尾

  • 酒店旁边有很多大排档。新加坡的大排档不像国内给人一种不卫生的感觉,这里非常干净,地板看不到一片污渍或者纸屑。我点了一份烤巴沙鱼,5.5新币,鱼肉滑嫩入味,味道非常鲜美:
    烤巴沙鱼

  • 新加坡地方虽小,但是整个城市给人干净、整洁、有序的感觉,下图分别是滨海艺术中心、金融区、赌场外景、狮身鱼尾像、国会大厦和高等法院:

滨海艺术中心
金融区
赌场外景
狮身鱼尾像
国会大厦
高等法院

马来西亚

  • 吉隆坡以南41公里的太子城是马来西亚耗资81亿美元新建的行政中心,红色的建筑是太子清真寺,由于是用粉红色的大理石建成,故又称粉红清真寺。进入清真寺要脱鞋,光脚踩着滚烫的石阶、高大的穹顶、彩色的琉璃令人流连忘返。

太子清真寺
太子清真寺
太子清真寺
太子清真寺

  • 清真寺旁边绿顶的建筑,就是新建的首相府。真是美得无法形容!

太子清真寺
太子清真寺
首相府

  • 驱车来到吉隆坡,首先参观了位于市中心的吉隆坡塔;
    吉隆坡塔

  • 马来西亚曾经是英国和荷兰殖民地,二战期间曾被日本占领,经历了坎坷的民族独立和解放斗争。

英雄纪念碑
英雄纪念碑
独立广场
独立广场
独立广场

  • 马来西亚人多信仰伊斯兰教,故酒店中天花板上一般有一个向西的标志,方便做礼拜,而且酒店卫生间的马桶旁总是放着一个用来解决个人如厕后卫生问题的喷头:

酒店
酒店

新马泰游小提示

  • 关于行李:
    • 不要带生鲜食品,否则过不了检验检疫;
    • 可以带少量未开封的零食,如小面包、豆干;
    • 托运行李中不要放置打火机、锂电池等物品,锂电池、照相机等电子产品不能托运,需要随身携带;
    • 新加坡只允许携带19根香烟入境,不能携带酒,不能携带口香糖;
    • 可以带一些驱蚊液、防晒霜;
  • 国际航班提前3个小时办理登机手续,不要迟到了;
  • 在国外需要保管好护照,如果丢失护照,需要立即和中国大使馆联系申请临时护照;申请临时护照时,需要用到个人照片,为了以防万一,出发前最好随身携带2张2寸白底近期免冠照;
  • 新马泰三国均为靠左行驶,过马路时需要特别注意,遵守当地交通法规;
  • 泰国是小费制国家,泰国酒店需要给服务生小费,标准:20泰铢/人/天,其他服务(如服务生提行李、参加骑大象活动、当地的导游和司机等)也需要给相应数量的小费;小费必须是纸币,不能给硬币;
  • 参观曼谷大皇宫等景点时,为了表达对国王的尊重,不能穿拖鞋、背心、无袖上衣、短裤等,女士尽量穿着过膝长裙;
  • 以下的app在国外非常好用:
    • 社交类:facebook,twitter;
    • 地图:Google map,Here;
    • 住宿和酒店:Booking,Airbnb;
    • 车辆和交通:Grab;
  • 可以在机场兑换一些当地货币,以免在买水或者零食时遇到麻烦;
  • 大额消费尽量刷卡,这样可以有机会获得优惠的汇率,具体优惠程度参照商店的标准;
  • 国外的通信费较高,中国移动在开通国际漫游后,新马泰三国的移动数据流量费为1元人民币/M,如果游玩天数较多,建议在机场办理当地不限流量的电话卡,或者提前在淘宝上买;
  • 因为宗教信仰等原因,马来西亚的厕所可能没有纸巾,当地人习惯使用马桶旁边的小水管解决如厕后的个人卫生问题,所以记得携带手纸;

2016我的年度书单

发表于 2016-12-12 |

引言

  • 2016年,我把所有的精力都放在了找实习和工作上,同时还要完成学校要求的小论文和毕业论文,几乎没什么精力来读“闲书”,下面这些书都是每天临睡前看一会儿,积少成多读完的。
  • 读书能让我静下心,认真思考我自己,认真思考这个世界,思考清楚了,才有“静力”,做起事情来才更有“动力”。
  • 我不喜欢读电子书,下面所有的书我都是买来或者从图书馆借来纸质版的书籍阅读。
  • 我认为自己思想还不够深入、品性还需要磨砺,我读书的目的正是为了修炼性格、磨砺自己。
  • 下面是我的2016书单,欢迎大家赞赏、吐槽、拍砖。

2016-我的书单

  • 《自卑与超越》
    • 作者: [奥地利] 阿弗雷德·阿德勒
    • 本书作者阿弗雷德·阿德勒是弗洛伊德精神分析学派的核心成员之一,他立足于个体心理学,在本书中全面阐释了自卑的含义和意义,对人的自卑心理全面分析,将自卑的产生、发展、认识描绘的淋漓尽致,是对人性中自卑情结最为深刻的刻画。
    • 本书不仅具有较大的理论价值,也具有较大的使用价值。本书从社会生活、商业、人文、教育等多方面分析了自卑情结,深刻揭示了人的行为和内在的自卑情结的联系,深入诠释了接受自卑比克服自卑更加重要这一事实。
    • 本书绝对不仅仅讲了自卑,也绝不是只有自认为自卑的人才需要阅读,本书通过自卑揭示了一些不为人知的心理学原理,而这些原理又是被广泛应用在社会生活中的,我强烈推荐所有对心理学感兴趣的朋友阅读此书!

book1

  • 《追求意义的意志》
    • 作者: [奥地利] 维克多·弗兰克尔
    • 本书的作者维克多·弗兰克尔出生于奥地利,是美国著名的临床心理学家,获得维也纳大学医学博士和哲学博士学位。他亲历了二战,在希特勒占领奥地利后为了照顾年迈的父母,在获得美国签证的情况下没有逃离险境,而是坚持留在奥地利,最终被送进集中营。在集中营中,他亲眼见证了一个个生命的逝去,在巨大的痛苦和伤痛中不断思考生命的价值和意义,从痛苦、彷徨、抑郁甚至死亡的边缘寻找那一点点的亮光和希望。在那种情境下,生命只是囚服上的号码牌,没有人知道自己什么时候会被送进毒气室,生命的意义和存在的价值到底在哪里?恐怕只有像作者这样的亲历者才有资格回答这个问题。放眼望去,人类所经历的一切痛苦是否是值得的?作为一个个体,在社会中所经历的痛苦是否是值得的?思考这些问题可能会让你暂时感到恐惧和无助,但只有思考清楚了这些问题,我们才能从心底感到希望和快乐,真正明白活着是为了什么、我们现在的所有付出和努力是为了什么。
    • 刚开始阅读本书时,我将书名误认为《追求意志的意义》,读了几章,发现不对劲,回头一看标题,方才豁然开朗,明白了作者的想表达的含义。
    • 文本作者被称之为继弗洛伊德的心理分析、阿德勒的个体心理学之后的维也纳第三心理治疗学派。我强烈建议对心理学感兴趣的朋友们阅读此书。

book2

  • 《脆弱的力量》
    • 作者:[美] 布琳·布朗
    • 本文作者是最受欢迎的5大TED演讲者、美国最具影响力女性之一的布琳·布朗,如果您没有时间阅读本书,建议直接观看作者同一主题的TED演讲视频。
    • 本书从脆弱和羞耻感的角度研究了爱、归属感和人生,将脆弱和力量这两个看似矛盾的词汇完美的统一起来,让人们意识到脆弱的意义和价值所在,也让人们对不确定性和危机感不再恐惧。

book3

  • 《非暴力沟通》
    • 作者:[美] 马歇尔·卢森堡
    • 本书是沟通领域的佳作,从心理学的角度描绘了人的观察和评论的不统一性、体会和表达的不统一性、事实和感受的不统一性。什么时候应该尊重事实?什么时候又应该尊重感受?作者给出了自己的回答。
    • 倾听是解决沟通障碍的良药,怎样有效倾听对方的感受、最大程度地减少伤害?读完本书,您心中自然会有答案。

book4

  • 《钝感力》
    • 作者:[日] 渡边淳一
    • 本书送给像我一样对于他人的看法和感受比较敏感的朋友。
    • 本书的作者是日本著名的医学家、小说家,曾获得医学博士学位。本文从医学的角度描绘了“钝感力”作为一种为人处世的态度及人生智慧,相比激进、张扬、刚硬而言,更易在目前竞争激烈、节奏飞快、错综复杂的现代社会中生存,也更易取得成功。

book5

  • 《亲爱的安德烈》
    • 作者:[中] 龙应台
    • 《目送》、《孩子你慢慢来》、《亲爱的安德烈》是著名作家龙应台的亲情三部曲,其中我最喜欢这本《亲爱的安德烈》。
    • 书中充分和细腻的描述了这位母亲在儿子长大后理性上和感性上的冲突,既希望儿子陪在身边、又希望儿子独立奋斗,既希望儿子理解自己、又怕自己已经和时代脱节。于是,母子俩用了三年时间互相通信,龙应台“认识了人生里第一个十八岁的人”,安德烈“也第一次认识了自己的母亲”。

book6

  • 《思想的星空》
    • 作者: [中] 周国平
    • 本文作者周国平是中国社会科学院哲学研究所研究员,他的作品充满了人生的智慧和哲学的魅力,融理性和激情于一体,笔调清新自然,内涵睿智深刻,在这里同时推荐他的其他作品:《尼采美学文选》、《尼采诗集》、《偶像的黄昏》。

book7

  • 《幸福的方法》
    • 作者:[美] 泰勒·本·沙哈尔
    • 本文作者泰勒·本·沙哈尔是哈佛大学心理学硕士、哲学和组织行为学博士,著名的《幸福课》就是他本人开创的。
    • 本书用充满智慧的语言、科学实证的方法、自助成功的案例和巧妙创新的编排,让人们能够把积极心理学应用到日常生活之中。

book8

关于leetcode环形链表相关题目的总结

发表于 2016-07-20 | 分类于 Algorithm |

引言

  • 这几天,博主总结了一些leetcode的链表题目,本文参考了网上大牛的文章,结合自己的想法,总结了环形链表的解决方案,欢迎各位补充/批评指正。

建模

  • 链表头节点是X,环的第一个节点是Y;
  • slow和fast分别是指针,如果从链表头部开始往后移动,且fast指针移动速度为slow指针移动速度的两倍,设第一次的交点是Z;
  • 各段的长度分别是a,b,c,如图所示;
  • 环的长度是L;
  • slow和fast指针的向前移动速度分别是qs,qf;

roll

判断链表是否有环(leetcode 141)

  • fast如果走到了null,证明没有环;
  • fast如果和slow相遇了,证明有环;
  • 代码如下:
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
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;

while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(fast==slow){
return true;
}
}
return false;
}
}

环长度是多少

  • 方法一:在第一次相遇后,相当于slow和fast的距离是一个环的长度,继续让这两个指针以各自的速度去走,下一次相遇时,走过的节点数即为环的长度;
  • 方法二:第一次相遇后,让fast停着不走了,slow继续走,记录到下次相遇时走过了几个节点,即为环的长度;
  • 方法三:第一次相遇时slow走过的距离:a+b,fast走过的距离:a+b+c+b;因为fast的速度是slow的两倍,所以fast走的距离是slow的两倍,有 2(a+b) = a+b+c+b;可以得到a=c;最终我们得到L=b+c=a+b,也就是说,从一开始到二者第一次相遇,循环的次数就等于环的长度;

找到环中的第一个节点(leetcode 142)

  • 我们已经得到了结论a=c;
  • 那么让两个指针分别从X和Z开始走,每次走一步,那么正好会在Y相遇,也就是环的第一个节点;
  • 代码如下:
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
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
fast = head;
while(fast!=slow){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}

return null;
}
}

如何将有环的链表变成单链表(解除环)

  • 在上一个问题的最后,将c段中Y点之前的那个节点与Y的链接切断即可;

如何判断两个单链表是否有交点,如何找到第一个相交的节点(leetcode 160)

  • 先判断两个链表是否有环;
  • 如果一个有环一个没环,肯定不相交;
  • 如果两个都没有环,判断两个列表的尾部是否相等;
  • 如果两个都有环,判断一个链表上的Z点是否在另一个链表上;
  • 找到第一个相交的节点方法:
    • 求出两个链表的长度L1,L2(如果有环,则将Y点当做尾节点来算);
    • 假设L1<L2,用两个指针分别从两个链表的头部开始走;
    • 长度为L2的链表先走(L2-L1)步,然后两个一起走,直到二者相遇;
  • 代码如下:
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
38
39
40
41
42
43
44
45
46
47
48
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public static int getLength(ListNode head){
ListNode point = head;
int length = 1;
while(point!=null){
length++;
point = point.next;
}

return length;
}

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int aLength = getLength(headA);
int bLength = getLength(headB);
int diff = Math.max(aLength,bLength)-Math.min(aLength,bLength);

ListNode pointA = headA;
ListNode pointB = headB;

while(diff>0){
if(aLength>bLength){
pointA = pointA.next;
}else if(aLength<bLength){
pointB = pointB.next;
}
diff--;
}

while(pointA!=pointB){
pointA = pointA.next;
pointB = pointB.next;
}

return pointA;
}
}

二叉树的遍历

发表于 2016-05-11 | 分类于 Algorithm |

引言

  • 本文展示了二叉树的前序遍历、中序遍历、后序遍历;
  • 每种遍历均用递归和非递归的方法实现。
  • 递归的方法明显比非递归的方法容易理解。
  • 非递归的实现方式有很多种,本文给出了用一个栈实现的方法。

程序

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package test;

import java.util.Stack;

public class Test {

public static class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

public static TreeNode BinaryTree(int[] array) {
return makeBinaryTreeByArray(array, 1);
}

public static TreeNode makeBinaryTreeByArray(int[] array, int index) {
if (index < array.length) {
int value = array[index];
if (value != 0) {
TreeNode t = new TreeNode(value);
array[index] = 0;
t.left = makeBinaryTreeByArray(array, index * 2);
t.right = makeBinaryTreeByArray(array, index * 2 + 1);
return t;
}
}
return null;
}

//前序遍历 递归实现
public static void preTraversal(TreeNode root){
if(root==null){
return;
}

System.out.print(root.val+" ");
preTraversal(root.left);
preTraversal(root.right);
}

//前序遍历 非递归实现(栈)
public static void preTraversal1(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
if(root==null){
return;
}

stack.push(root);
while(!stack.isEmpty()){
TreeNode tmp = stack.pop();
System.out.print(tmp.val+" ");
if(tmp.right!=null){
stack.push(tmp.right);
}
if(tmp.left!=null){
stack.push(tmp.left);
}
}
}

//中序遍历 递归实现
public static void midTraversal(TreeNode root){
if(root==null){
return;
}

if(root.left!=null){
midTraversal(root.left);
}

System.out.print(root.val+" ");

if(root.right!=null){
midTraversal(root.right);
}
}

//中序遍历 非递归实现(栈)
public static void midTraversal1(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || stack.size() > 0) {
while (node != null) {
stack.push(node);
node = node.left;
}
if (stack.size() > 0) {
node = stack.pop();
System.out.print(node.val+" ");
node = node.right;
}
}
}

//后序遍历 递归实现
public static void behTraversal(TreeNode root){
if(root==null){
return;
}

if(root.left!=null){
behTraversal(root.left);
}

if(root.right!=null){
behTraversal(root.right);
}

System.out.print(root.val+" ");
}

//后序遍历 非递归实现(栈)
public static void behTraversal1(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root, prev = root;
while (node != null || stack.size() > 0) {
while (node != null) {
stack.push(node);
node = node.left;
}
if (stack.size() > 0) {
TreeNode temp = stack.peek().right;
if (temp == null || temp == prev) {
node = stack.pop();
System.out.print(node.val+" ");
prev = node;
node = null;
} else {
node = temp;
}
}
}
}

/**
* 13
* / \
* 65 5
* / \ \
* 97 25 37
* / /\ /
* 22 4 28 32
*/

public static void main(String[] args) {
int[] arr = { 0, 13, 65, 5, 97, 25, 0, 37, 22, 0, 4, 28, 0, 0, 32, 0 };
TreeNode root = BinaryTree(arr);
preTraversal(root); //13 65 97 22 25 4 28 5 37 32
System.out.print("\n");
preTraversal1(root); //13 65 97 22 25 4 28 5 37 32
System.out.print("\n");
midTraversal(root); //22 97 65 4 25 28 13 5 32 37
System.out.print("\n");
midTraversal1(root); //22 97 65 4 25 28 13 5 32 37
System.out.print("\n");
behTraversal(root); //22 97 4 28 25 65 32 37 5 13
System.out.print("\n");
behTraversal1(root); //22 97 4 28 25 65 32 37 5 13
}
}
123…11
Eric Chang

Eric Chang

www.yinshuisiyuan.net

101 日志
15 分类
51 标签
github weibo linkedin mail
  • 阮一峰
  • Azure
  • Python
  • Nodejs
© 2015 - 2020 Eric Chang
由 Hexo 强力驱动
主题 - NexT.Pisces


知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。