├── .gitignore
├── AngularJS权威教程(中文版).pdf
├── AngularJs学习笔记.docx
├── C++
├── C++语法(前六章).doc
├── C++语法(第七章).doc
├── C++语法(第九章).doc
├── C++语法(第八章).doc
├── C++语法(第十一章).docx
├── C++语法(第十三章).doc
├── C++语法(第十二章).doc
├── C++语法(第十五章).docx
├── C++语法(第十六章).docx
├── C++语法(第十四章)(未完成).doc
├── C++语法(第十章).doc
├── MFC学习笔记.doc
└── MFC的一些函数.doc
├── HTML及CSS.docx
├── JavaScript .docx
├── Nodejs
├── NodeJs学习笔记.docx
└── node.js开发指南.pdf
├── Vuejs
├── Vuejs技巧篇.docx
└── vue学习笔记.doc
├── bootstrap.docx
├── dojo学习.docx
├── jquery.docx
├── linux.docx
├── readme.md
├── shell命令比较复杂一些的(带索引).md
├── 《人月神话》
└── 《人月神话》笔记摘抄.md
├── 世界各国中英文名对照.js
├── 写一个web版的360工具箱.docx
├── 前端架构详谈(1)纯前端发布
├── 01.png
├── 02.png
└── readme.md
├── 原生JavaScript.docx
├── 台式电脑候选.md
├── 大型项目前端架构浅谈.md
├── 如何使用虚拟机来运行linux
├── 01.jpg
├── 02.jpg
├── 03.jpg
├── 04.jpg
├── 05.jpg
├── 06.jpg
├── 07.jpg
├── 08.jpg
├── 09.jpg
├── 10.jpg
├── 11.jpg
├── 12.jpg
├── 13.jpg
├── 14.jpg
├── 15.jpg
├── 16.jpg
├── 17.jpg
├── readme.md
└── vsftpd.conf
├── 数据库.docx
├── 数据结构
├── STL.docx
├── 二进制文件的读写.docx
├── 排序.docx
├── 数据结构总述.docx
├── 查找算法.docx
├── 树.docx
├── 第二章算法.docx
└── 迭代器.docx
├── 笔记本候选.md
├── 网易云课堂
├── 网易云课堂(DOM编程艺术).docx
├── 网易云课堂(HTML和CSS).docx
├── 网易云课堂(JavaScript).docx
└── 网易云课堂(页面架构).docx
└── 西安互联网开发招聘汇总(2019.5.24).md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 |
--------------------------------------------------------------------------------
/AngularJS权威教程(中文版).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/AngularJS权威教程(中文版).pdf
--------------------------------------------------------------------------------
/AngularJs学习笔记.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/AngularJs学习笔记.docx
--------------------------------------------------------------------------------
/C++/C++语法(前六章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(前六章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第七章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第七章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第九章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第九章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第八章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第八章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第十一章).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十一章).docx
--------------------------------------------------------------------------------
/C++/C++语法(第十三章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十三章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第十二章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十二章).doc
--------------------------------------------------------------------------------
/C++/C++语法(第十五章).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十五章).docx
--------------------------------------------------------------------------------
/C++/C++语法(第十六章).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十六章).docx
--------------------------------------------------------------------------------
/C++/C++语法(第十四章)(未完成).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十四章)(未完成).doc
--------------------------------------------------------------------------------
/C++/C++语法(第十章).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十章).doc
--------------------------------------------------------------------------------
/C++/MFC学习笔记.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/MFC学习笔记.doc
--------------------------------------------------------------------------------
/C++/MFC的一些函数.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/MFC的一些函数.doc
--------------------------------------------------------------------------------
/HTML及CSS.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/HTML及CSS.docx
--------------------------------------------------------------------------------
/JavaScript .docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/JavaScript .docx
--------------------------------------------------------------------------------
/Nodejs/NodeJs学习笔记.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Nodejs/NodeJs学习笔记.docx
--------------------------------------------------------------------------------
/Nodejs/node.js开发指南.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Nodejs/node.js开发指南.pdf
--------------------------------------------------------------------------------
/Vuejs/Vuejs技巧篇.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Vuejs/Vuejs技巧篇.docx
--------------------------------------------------------------------------------
/Vuejs/vue学习笔记.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Vuejs/vue学习笔记.doc
--------------------------------------------------------------------------------
/bootstrap.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/bootstrap.docx
--------------------------------------------------------------------------------
/dojo学习.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/dojo学习.docx
--------------------------------------------------------------------------------
/jquery.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/jquery.docx
--------------------------------------------------------------------------------
/linux.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/linux.docx
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ##学习笔记
2 |
3 | 除了PDF,剩下的都是我自己在学习的过程中写下来的笔记
4 |
5 | 就是这样=.=
--------------------------------------------------------------------------------
/shell命令比较复杂一些的(带索引).md:
--------------------------------------------------------------------------------
1 | # 常见shell命令
2 |
3 | ## 01、判断目录是否存在,不存在则创建
4 |
5 | 当前目录不存在mysql-data文件夹则创建mysql-data
6 |
7 | 示例代码:
8 |
9 | ```bash
10 | if [ ! -d "mysql-data" ]; then
11 | mkdir mysql-data
12 | fi
13 | ```
14 |
15 | ## 02、shell 中获取文件真实路径(绝对路径)
16 |
17 | 获得绝对路径:
18 |
19 | ```bash
20 | # 通过 readlink 获取绝对路径,再取出目录
21 | work_path=$(dirname $(readlink -f $0))
22 | ```
23 |
24 | 拼接路径:
25 |
26 | ```bash
27 | work_path="$work_path/mysql-data"
28 | ```
29 |
30 | 注意,如果拼接时候出现问题,那么可能是你在windows下创建的shell脚本,然后在linux下执行。
31 |
32 | vi命令编辑脚本,然后输入 ``$set ff=unix`` 来修改编码;
--------------------------------------------------------------------------------
/《人月神话》/《人月神话》笔记摘抄.md:
--------------------------------------------------------------------------------
1 | ## 《人月神话》读书笔记摘抄
2 |
3 | ### 前注
4 |
5 | 1、引用部分表示是该内容引用原文。
6 |
7 | 由于篇幅所限,引用的原文会摘抄、省略部分语句、或补充一部分以增加表达性。但会确保尽可能和原文保持一致。
8 |
9 | 2、引用部分后的 Pxx 表示是书籍的第 x 页。
10 |
11 | 3、页码之后是我个人评论。
12 |
13 | 4、书籍采用的是《人月神话》四十周年纪念版。
14 |
15 | ### 第二章节:人月神话
16 |
17 | > 系统编程的进度安排背后,第一个错误的假设是:一切将运转良好,每一项任务仅花费它应该“花费”的时间。
18 |
19 | P15。
20 |
21 | 结果就是所有由没有丰富开发经验的人所评估的工期,都会导致项目比预期时间 delay。
22 |
23 | 结果,要么就是团队成员疲于加班,要么就是项目延期。
24 |
25 | ---
26 |
27 |
28 | > 第二个谬误的思考方式是在估计和进度安排中,使用的工作量单位:人月
29 |
30 | P16
31 |
32 | 这里的人月,指的是工时计算 m 人 * y 月(日) 的工作量。
33 |
34 | 该公式的成立,仅限于可以完全分解的任务,并且他们之间不需要相互交流。
35 |
36 | 实际上,当需要更多的沟通交流时,2 个人每日的工作效率并不是 2 人日,而是 1.8 人日,如果人数继续上升,人均效率还会再次下降。甚至可能会出现 5 个人的开发效率,反而不如 2-3 个人的开发效率高。
37 |
38 | ---
39 |
40 | > 某些任务的计划进度,可能受限于顾客要求的紧迫程度,但紧迫程度完全无法控制实际的完成情况。就好像约好在两分钟之内完成一个煎蛋……(略)一面已经焦了,而另一面还是生的。
41 |
42 | P21
43 |
44 | 甲方的要求是很难拒绝的,但无底线的接收甲方的要求,结果只可能是毁灭性的——交付一个非常糟糕的项目。
45 |
46 | 一个又能合理应对甲方,又可以保证项目工期不至于被无止境的压缩的解决方案是:
47 |
48 | 【在项目中做一个看起来技术含量比较高,但实际开发工期并不久的功能。然后告诉甲方,我们有一个非常 cool 的东西,他非常先进,是业内最先进的技术,但需要更多的工期。】
49 |
50 | 也就是说,我们预期 3 个月的工期,报给甲方的是四个月~五个月(实际并不需要那么久),在甲方要求压缩工期后,时间变回我们预期的 3 个月的工期。于是项目顺利的按期完成了。
51 |
52 | 当然,这需要公司有水平比较高的开发人员,可以跟进比较潮流的技术,并运用到项目里。
53 |
54 |
55 |
56 | ### 第三章节:外科手术队伍
57 |
58 | > 这些研究表明,效率高和效率低的实施者之间个体差异非常大,经常能够达到数量级的水平(差异)。
59 |
60 | P29
61 |
62 | > xxxx(三个外国人,名字略),曾对一组具有经验的程序人员进行测量,在该小组中,最好的和最差的表现在生产率上平均为 10:1;在编程速度和空间上具有 5:1 的惊人差异!简言而之,2万美元的程序员的生产率,可能是 1万美元的程序员的 10 倍。
63 |
64 | P30
65 |
66 | 根据我的经验来看,假如初级开发人员的效率是 1,那么中级开发人员在 3-5,而高级开发人员 从 10~50 都是存在的。并且某些功能,只有高级开发人员有办法实现。
67 |
68 | 这也就是为什么,各种互联网大厂,宁愿花 2w~3w/月,甚至更多的薪资去请一个高级开发人员,而不是选择用 8-10k/月的薪资,去请更多一般程序员。
69 |
70 | ---
71 |
72 | > (跳着节选一部分)Milss 的建议。一个团队以类似外科手术的形式组件:
73 | >
74 | > 外科医生:首席程序员;
75 | >
76 | > 副手:首席程序员的副手,能完成任何一个工作,但经验不如首席;
77 | >
78 | > 管理员:外科医生的老板,负责决定人员、薪酬、办公空间。通常不需要全职负责;
79 | >
80 | > 工具维护人员:负责管理工具,确保基本服务的可靠性(这个类似运维);
81 | >
82 | > 测试人员:搭测试平台,提出测试方案和测试用例。
83 |
84 | P32~P34(略去了一些国内少见的人员职位,原文共 10 个角色)
85 |
86 | 简单来说,这个就是明确一个开发团队的将和兵,以及一些重要的工具人。
87 |
88 | 由首席程序员定技术方案(而不是民主讨论),其他人负责执行该技术方案,并确保项目高效率沟通交流。让不同角色的人专心于自己的任务,越专一,效率越高。
89 |
90 | 换句话说,系统是一个人或者最多两个人思考的产物,而其他专业人员负责解决问题。当人员之间出现分歧时,由外科医生(首席程序员)来决定使用什么方案,达成客观上的一致性。
91 |
92 | 这种方案是一个大概 8~20 个人的团队。当系统需要更多的开发人员时,首席程序员将在同样的团队结构里,担任专业人员的角色(即承担一个功能的开发角色),由更高级的首席程序员分配任务。
93 |
94 | ### 第四章节:贵族专制、民主政治和系统设计
95 |
96 | > 概念的完整性:
97 | >
98 | > 在系统设计中,概念完整性应该是最重要的考虑因素,也就是说,为了反映一系列连贯的设计思路,宁可省略一些不规则的考虑特性和改进,也不提倡独立和无法整合的系统,哪怕它们其实包含着许多很好的设计。
99 |
100 | P42
101 |
102 | 简单来说,秀技一时爽,整合火葬场。
103 |
104 | 软件工程开发不是一个人的事情,需要更多考虑工程的可持续性和统一性,以及长期可维护性。
105 |
106 | 切忌不能为了个人喜好,而加入一些自己觉得很 cool 的东西。这会导致不同系统在整合的时候,遇见极为复杂的问题。
107 |
108 | ---
109 |
110 | > 概念的完整性要求设计必须由一个人,或者非常少数互有默契的人员来实现。
111 | >
112 | > 系统的概念完整性,决定了其使用的容易程度,不能与系统基本概念进行整合的良好想法和特色,最好放到一边,不予考虑。但如果出现了很多非常重要但不兼容的构想,就应该考虑抛弃原来的设计,对不同基本概念进行合并,在合并后的系统上重新开始。
113 |
114 | P44
115 |
116 | 在软件开发领域,民主应该是位于受限范围内的。
117 |
118 | 具体来说,某些基础性的概念,如代码规范、接口规范、使用的基本框架和库等,应该是统一的(即专制),而在具体某个功能的实现上,可以允许民主,各人找到合适的开发方式。
119 |
120 | 也就是所谓的,戴着镣铐跳舞。
121 |
122 | ### 第五章节:画蛇添足
123 |
124 | > 对于系统设计师来说,一种普遍的倾向是过分地设计系统,向系统添加很多修饰功能和想法。
125 |
126 | P55
127 |
128 | 简单来说,需求负责人、产品经理、架构师以及软件开发人员,他们往往会进入一个误区,就是过度设计。
129 |
130 | 也就是说,设计了很多功能,耗费了很多工时,但实际上,相关人员使用的并不多(并且这个功能不一定是甲方提出的要求)。
131 |
132 | 解决方案其实很简单,做一个日志系统,用于记录用户对页面的访问量,以及对功能的使用率。并且以数据作为依据,提供给用户作为参考。减少用户浪费的金钱和时间,并把节约的时间,用在开发更有意义的功能上。
133 |
134 | ---
135 |
136 | ### 第六章节:贯彻执行
137 |
138 | > 对于在整个设计中,保证这些看似琐碎的问题处理原则的一致性,绝对不是一件无关紧要的事情。
139 |
140 | P63
141 |
142 | 这里的所谓的琐碎问题,指的是前文中提到的一些看似不重要的问题。例如,每次操作后,如何设置返回的条件吗。(可以理解为前后端交互时,异步请求返回的数据格式,是否格式统一)
143 |
144 | 这些问题看似没什么,也是很简单琐碎的事情。但若不统一规范,将带来额外的沟通成本,也容易产生一些无谓的 bug。无数个这样的小问题积累起来,带来的后果会超出预料的。
145 |
146 | 所以一般要统一规范,以前后端交互来说,当返回请求结果时,应该调用封装好的方法,将结果返回给用户。如此可以确保返回数据的统一。
147 |
148 | ---
149 |
150 | > 无需多说,会议是必要的。然而,数百人在场的大型磋商会议往往需要大规模和非常正式地召集。因此,我们把会议分为两个级别:周例会和年度大会——这实际上是一种非常有效的方式。
151 | >
152 | > (略)(周例会中),如果达成了共识,非常好;如果没有,则由首席架构师来决定。这需要花费时间,最终所发布的结论是正式和果断的。
153 | >
154 | > 周例会的决策会给出迅捷的结论,使工作继续开展下去。
155 | >
156 | > (略)(5)明确地授予首席架构师决策的权力,避免了妥协和拖延。
157 |
158 | P66
159 |
160 | 原文里指的大型会议是数百人级别的,然而我们并不会去做这种需要几百人共同协作的软件开发。
161 |
162 | 对我们来说,更适用的是第二段所提到的周例会,从几个人到十几个人的单个小组,到几十人的跨部门小组协同开发时,需要举办的李慧。
163 |
164 | 周例会负责抛出问题,然后达成一致(或者由负责人定下一致的解决方案),然后解决问题,减少沟通成本。
165 |
166 | ---
167 |
168 | > 电话日志:
169 | >
170 | > 对于存有疑问的实现人员,应鼓励他们打电话询问相应的架构师,而不是一边猜测一边工作。这是一个很基本的措施。(略)
171 | >
172 | > 一种有用的机制是,由架构师保存电话日志。日志中,记录了每一个问题和相应的回答。
173 |
174 | P68~P69
175 |
176 | 本文初版比较久远。现在取代电话日志的是邮件日志。也就是说,对于一些问题,应该由邮件提出来,并通过邮件正式的回答。
177 |
178 | 邮件的机制有几个好处:
179 |
180 | 1. 更正式,避免不停的变动导致带来的额外开发时间;
181 | 2. 每个人都应该对自己提出的问题和做出的解答负责,减少了撕逼扯皮的成本;
182 | 3. 可以存档,可以过一段时间回来查询当时的反馈是什么;
183 |
184 | 所以推荐对于简单问题,电话、钉钉、微信或者 QQ 沟通。
185 |
186 | 而对于复杂,又可能产生撕逼扯皮的问题,应该以邮件形式进行沟通,并抄送给相关负责人员,作为留存依据,降低沟通成本。
187 |
--------------------------------------------------------------------------------
/世界各国中英文名对照.js:
--------------------------------------------------------------------------------
1 | export default {
2 | 'Afghanistan': '阿富汗',
3 | 'Angola': '安哥拉',
4 | 'Albania': '阿尔巴尼亚',
5 | 'United Arab Emirates': '阿联酋',
6 | 'Argentina': '阿根廷',
7 | 'Armenia': '亚美尼亚',
8 | 'French Southern and Antarctic Lands': '法属南半球和南极领地',
9 | 'Australia': '澳大利亚',
10 | 'Austria': '奥地利',
11 | 'Azerbaijan': '阿塞拜疆',
12 | 'Burundi': '布隆迪',
13 | 'Belgium': '比利时',
14 | 'Benin': '贝宁',
15 | 'Burkina Faso': '布基纳法索',
16 | 'Bangladesh': '孟加拉国',
17 | 'Bulgaria': '保加利亚',
18 | 'The Bahamas': '巴哈马',
19 | 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',
20 | 'Belarus': '白俄罗斯',
21 | 'Belize': '伯利兹',
22 | 'Bermuda': '百慕大',
23 | 'Bolivia': '玻利维亚',
24 | 'Brazil': '巴西',
25 | 'Brunei': '文莱',
26 | 'Bhutan': '不丹',
27 | 'Botswana': '博茨瓦纳',
28 | 'Central African Republic': '中非共和国',
29 | 'Canada': '加拿大',
30 | 'Switzerland': '瑞士',
31 | 'Chile': '智利',
32 | 'China': '中国',
33 | 'Ivory Coast': '象牙海岸',
34 | 'Cameroon': '喀麦隆',
35 | 'Democratic Republic of the Congo': '刚果民主共和国',
36 | 'Republic of the Congo': '刚果共和国',
37 | 'Colombia': '哥伦比亚',
38 | 'Costa Rica': '哥斯达黎加',
39 | 'Cuba': '古巴',
40 | 'Northern Cyprus': '北塞浦路斯',
41 | 'Cyprus': '塞浦路斯',
42 | 'Czech Republic': '捷克',
43 | 'Germany': '德国',
44 | 'Djibouti': '吉布提',
45 | 'Denmark': '丹麦',
46 | 'Dominican Republic': '多明尼加共和国',
47 | 'Algeria': '阿尔及利亚',
48 | 'Ecuador': '厄瓜多尔',
49 | 'Egypt': '埃及',
50 | 'Eritrea': '厄立特里亚',
51 | 'Spain': '西班牙',
52 | 'Estonia': '爱沙尼亚',
53 | 'Ethiopia': '埃塞俄比亚',
54 | 'Finland': '芬兰',
55 | 'Fiji': '斐',
56 | 'Falkland Islands': '福克兰群岛',
57 | 'France': '法国',
58 | 'Gabon': '加蓬',
59 | 'United Kingdom': '英国',
60 | 'Georgia': '格鲁吉亚',
61 | 'Ghana': '加纳',
62 | 'Guinea': '几内亚',
63 | 'Gambia': '冈比亚',
64 | 'Guinea Bissau': '几内亚比绍',
65 | 'Equatorial Guinea': '赤道几内亚',
66 | 'Greece': '希腊',
67 | 'Greenland': '格陵兰',
68 | 'Guatemala': '危地马拉',
69 | 'French Guiana': '法属圭亚那',
70 | 'Guyana': '圭亚那',
71 | 'Honduras': '洪都拉斯',
72 | 'Croatia': '克罗地亚',
73 | 'Haiti': '海地',
74 | 'Hungary': '匈牙利',
75 | 'Indonesia': '印度尼西亚',
76 | 'India': '印度',
77 | 'Ireland': '爱尔兰',
78 | 'Iran': '伊朗',
79 | 'Iraq': '伊拉克',
80 | 'Iceland': '冰岛',
81 | 'Israel': '以色列',
82 | 'Italy': '意大利',
83 | 'Jamaica': '牙买加',
84 | 'Jordan': '约旦',
85 | 'Japan': '日本',
86 | 'Kazakhstan': '哈萨克斯坦',
87 | 'Kenya': '肯尼亚',
88 | 'Kyrgyzstan': '吉尔吉斯斯坦',
89 | 'Cambodia': '柬埔寨',
90 | 'South Korea': '韩国',
91 | 'Kosovo': '科索沃',
92 | 'Kuwait': '科威特',
93 | 'Laos': '老挝',
94 | 'Lebanon': '黎巴嫩',
95 | 'Liberia': '利比里亚',
96 | 'Libya': '利比亚',
97 | 'Sri Lanka': '斯里兰卡',
98 | 'Lesotho': '莱索托',
99 | 'Lithuania': '立陶宛',
100 | 'Luxembourg': '卢森堡',
101 | 'Latvia': '拉脱维亚',
102 | 'Morocco': '摩洛哥',
103 | 'Moldova': '摩尔多瓦',
104 | 'Madagascar': '马达加斯加',
105 | 'Mexico': '墨西哥',
106 | 'Macedonia': '马其顿',
107 | 'Mali': '马里',
108 | 'Myanmar': '缅甸',
109 | 'Montenegro': '黑山',
110 | 'Mongolia': '蒙古',
111 | 'Mozambique': '莫桑比克',
112 | 'Mauritania': '毛里塔尼亚',
113 | 'Malawi': '马拉维',
114 | 'Malaysia': '马来西亚',
115 | 'Namibia': '纳米比亚',
116 | 'New Caledonia': '新喀里多尼亚',
117 | 'Niger': '尼日尔',
118 | 'Nigeria': '尼日利亚',
119 | 'Nicaragua': '尼加拉瓜',
120 | 'Netherlands': '荷兰',
121 | 'Norway': '挪威',
122 | 'Nepal': '尼泊尔',
123 | 'New Zealand': '新西兰',
124 | 'Oman': '阿曼',
125 | 'Pakistan': '巴基斯坦',
126 | 'Panama': '巴拿马',
127 | 'Peru': '秘鲁',
128 | 'Philippines': '菲律宾',
129 | 'Papua New Guinea': '巴布亚新几内亚',
130 | 'Poland': '波兰',
131 | 'Puerto Rico': '波多黎各',
132 | 'North Korea': '朝鲜',
133 | 'Portugal': '葡萄牙',
134 | 'Paraguay': '巴拉圭',
135 | 'Qatar': '卡塔尔',
136 | 'Romania': '罗马尼亚',
137 | 'Russia': '俄罗斯',
138 | 'Rwanda': '卢旺达',
139 | 'Western Sahara': '西撒哈拉',
140 | 'Saudi Arabia': '沙特阿拉伯',
141 | 'Sudan': '苏丹',
142 | 'South Sudan': '南苏丹',
143 | 'Senegal': '塞内加尔',
144 | 'Solomon Islands': '所罗门群岛',
145 | 'Sierra Leone': '塞拉利昂',
146 | 'El Salvador': '萨尔瓦多',
147 | 'Somaliland': '索马里兰',
148 | 'Somalia': '索马里',
149 | 'Republic of Serbia': '塞尔维亚共和国',
150 | 'Suriname': '苏里南',
151 | 'Slovakia': '斯洛伐克',
152 | 'Slovenia': '斯洛文尼亚',
153 | 'Sweden': '瑞典',
154 | 'Swaziland': '斯威士兰',
155 | 'Syria': '叙利亚',
156 | 'Chad': '乍得',
157 | 'Togo': '多哥',
158 | 'Thailand': '泰国',
159 | 'Tajikistan': '塔吉克斯坦',
160 | 'Turkmenistan': '土库曼斯坦',
161 | 'East Timor': '东帝汶',
162 | 'Trinidad and Tobago': '特立尼达和多巴哥',
163 | 'Tunisia': '突尼斯',
164 | 'Turkey': '土耳其',
165 | 'United Republic of Tanzania': '坦桑尼亚联合共和国',
166 | 'Uganda': '乌干达',
167 | 'Ukraine': '乌克兰',
168 | 'Uruguay': '乌拉圭',
169 | 'United States of America': '美国',
170 | 'Uzbekistan': '乌兹别克斯坦',
171 | 'Venezuela': '委内瑞拉',
172 | 'Vietnam': '越南',
173 | 'Vanuatu': '瓦努阿图',
174 | 'West Bank': '西岸',
175 | 'Yemen': '也门',
176 | 'South Africa': '南非',
177 | 'Zambia': '赞比亚',
178 | 'Zimbabwe': '津巴布韦',
179 | 'Republic of Singapore': '新加坡',
180 | 'Taiwan': '中国台湾',
181 | 'Hong Kong': '中国香港'
182 | }
183 |
--------------------------------------------------------------------------------
/写一个web版的360工具箱.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/写一个web版的360工具箱.docx
--------------------------------------------------------------------------------
/前端架构详谈(1)纯前端发布/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/前端架构详谈(1)纯前端发布/01.png
--------------------------------------------------------------------------------
/前端架构详谈(1)纯前端发布/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/前端架构详谈(1)纯前端发布/02.png
--------------------------------------------------------------------------------
/前端架构详谈(1)纯前端发布/readme.md:
--------------------------------------------------------------------------------
1 | # 前端架构详谈(1)纯前端发布
2 |
3 | * 0、前言
4 | * 1、项目简述
5 | * 2、场景描述
6 | * 3、数据结构简述
7 | * 4、项目核心点
8 | * 5、后台服务
9 | * 6、项目架构图
10 | * 7、数据库设计
11 | * 8、后期功能扩展
12 | * 9、示例效果
13 | * 10、总结
14 |
15 | ## 0、前言
16 |
17 | 在上一篇文章《大型项目前端架构浅谈》里,我简单的阐述了一下在大型项目里,前端架构如何设计。
18 |
19 | 有很多同学反映,说谈的比较浅。但由于篇幅所限,尽管已经写了8000字,但想每个都深入下去,实在是不太可能。
20 |
21 | 因此便有了这个续篇。
22 |
23 | 我考虑了一下,续篇的第一文,将优先深入阐述【2.4、纯前端版本发布】这一小结。
24 |
25 | 原内容如下:
26 |
27 | ```
28 | 2.4、纯前端版本发布
29 | 纯前端版本发布分为两步:
30 |
31 | * 前端发布到生产环境——此时可以通过外网链接加正确的版本号访问到新版本的代码,但页面上的资源还是旧版本;
32 |
33 | * 前端通过配置工具(或者是直接更新html文件),将html中引入的资源,改为新版本。
34 |
35 | 解决的问题是:当前端需要发布新版本时,可以不依赖于后端(根据实际情况,也可以不依赖于运维)。毕竟有很多需求并不需要后端介入,单纯改个前端版本后就要后端发布一次,显然是一件非常麻烦的事情。
36 |
37 | 这个需要专门的工具,用于配置版本发布,我最近就在写这个。
38 |
39 | 意义:
40 |
41 | 提高发布效率,降低发布带来的人员时间损耗(这些都是钱),也可以在前端版本回滚的时候,速度更快。
42 | ```
43 |
44 | ## 1、项目简述
45 |
46 | 当前常见场景为:前端的版本,写死在后端渲染的页面中(或者写死在html静态页面中)。
47 |
48 | 这带来一个问题,当前端需要发布版本时,要么重新发布静态页面(依赖使用静态页面),要么需要后端来发布。
49 |
50 | * 前者不利于后端使用页面渲染相关的中间件,比如 csrf 处理中,有一种方法就需要将 csrf-token 写入到页面中,又或者是国际化,将国际化内容直接写入到页面里;
51 | * 后者显而易见,后端发布是一件很麻烦的事情;
52 |
53 |
54 | 因此,我们期望实际场景中是这样一个形式(如下图):
55 |
56 |
57 |
58 | 通过实现这样的流程,后端开发者可以在页面里订阅资源的版本号,并将其值写入页面进行渲染。
59 |
60 | 而前端开发者可以实现:
61 |
62 | * 独立发布(通过管理页面提交最新的版本号,一次配置后无需依赖后端);
63 | * 提高前后端分离程度和可配置化能力;
64 | * 遇见前端bug时,通过在线快速发布新版本或回滚到旧版本来修复bug的能力;
65 |
66 |
67 | ## 2、场景描述
68 |
69 | 在前端领域中,常见的前端资源命名,有三种方式:
70 |
71 | 1. 名字不变:如/js/app.js
72 | 2. hash名,每次发布是新的hash:如/js/app.r324wf1.js
73 | 3. 带版本号的名字:如/0.1.0/js/app.js
74 |
75 |
76 | 前端发布资源时,也有两种方式:
77 |
78 | 1. html完全由前端管理,前端发布的时候会有html文件,webpack打包时自动在html里写文件名;
79 | 2. html由后端管理(服务器渲染),前端只负责发布js、css等资源文件。在前端发布之后,后端修改版本号再发布;
80 |
81 |
82 | 目前比较好的解决方案是 第三种命名方式 和 第二种发布方式,优点:
83 |
84 | 1. 版本管理清楚明确;
85 | 2. 版本发布后,当前分支自动锁死(不可修改),避免覆盖发布导致的bug;
86 | 3. 后端控制视图(html)能实现的功能更强(比如通过中间件在所有view里插入一些内容);
87 |
88 | 实际场景对比:
89 |
90 | 【常规方式】
91 |
92 | 1. 假如html后端管理,html上有一个js资源加载,链接为:
93 | 2. 发布后,发现1.1.10版本的前端页面存在一个bug,于是快速修复,发布1.1.11版本;
94 | 3. 如果需要修复这个bug,那么需要后端开发将html里的 1.1.10 修改为 1.1.11,然后再发布一次版本。缺点是后端发布毫无疑问是很麻烦的一件事情。
95 |
96 |
97 | 【应用本项目后的解决方案】
98 |
99 | 1. 配置key-value系统,key为version,value默认配置为1.1.10,html的资源加载写为:
100 | 2. 第二步不变,前端发布修复了bug的1.1.11版本;
101 | 3. 在系统里更新配置,将key=version的value,更新为1.1.11;
102 | 4. 后端开发不需要做任何工作,Server在请求时,检测到version这个key的value过期(默认每个key都有过期时间,例如5秒),因此重新读取MySQL或Redis里key=version的value值。并将version的值更新为1.1.11;
103 | 5. 因此线上资源加载的真实资源从1.1.10变为1.1.11;
104 |
105 | 其他应用场景:
106 |
107 | 1. 页面中的通知信息:比如说,页面内嵌一个消息框是系统通知,这个通知可能会变,每次手动改通知的话就比较麻烦。写运营配置工具又浪费时间,可以通过这种配置来实现。
108 | 2. 其他需要返回数据是可配置的场景;
109 |
110 | ## 3、数据结构简述
111 |
112 | 1. 应用-Key两级结构:为了方便管理,每个用户都可以创建应用,并在应用下创建Key(即Key属于应用)。
113 | 2. Key-value系统:key需要注册,每个key都有value存在。使用时,通过key可以获取key对应的value,方便管理。
114 | 3. Key的新增/编辑(前端):通过专门的管理页面,使用者可以将key-value写入MySQL,每一次编辑都应有历史记录;
115 | 4. 权限管理:普通用户,只能创建有限数量个(如0~3个)应用,但可以获得其他应用的管理权限;管理员用户可以查看/编辑/删除所有的应用和其所属的key-value;
116 | 5. value的获取(后端):server注册绑定key,绑定后会定时从Redis或MySQL同步value到本机缓存,以确保本机的缓存是最新的。在渲染页面时,可以实时获取key对应的value(这一步是同步的)
117 |
118 |
119 | ## 4、项目核心点
120 |
121 | ### 1、Server-Redis-MySQL三层结构:
122 |
123 | 之所以设计三层结构:
124 |
125 | * 一是因为Redis这么fashion又好用的东西,能不上嘛;
126 | * 二是加入Redis可以作为缓存,减少MySQL的读写压力(Redis的并发量更大),以及确保一致性(数据优先从MySQL读);
127 | * 三对分布式应用更友好;
128 |
129 | ### 2、Server取value值:
130 |
131 | 功能说明:
132 |
133 | 1. 需要配置该key的默认值,默认值将定期从Redis或者MySQL读取并更新;
134 | 2. 每次渲染的时候,默认从本机缓存取(确保不影响渲染速度),获取的是默认值;
135 | 3. 如果本机缓存的默认值过期,则从Redis获取,然后写入本机缓存(减少MySQL压力);
136 | 4. 如果Redis也不存在(过期),则从MySQL读取,然后写入Redis和本机缓存;
137 | 5. 本机缓存存在过期时间(默认10秒),过期后,则从Redis读取并更新本机缓存;
138 | 6. Redis的数据存在过期时间(默认600秒),过期后,下次获取的时候,会被写入最新的数据;
139 | 7. 可以强制获取MySQL的数据,用于更新Redis的缓存;
140 |
141 |
142 | 异常处理:
143 |
144 | * 【1】当无法从Redis取到值,则取默认值;
145 | * 【2】当无法连接Redis,将重试一次,如果重试失败,则取默认值;
146 | * 【3】当无法连接MySQL,重试一次,重试失败,则取默认值;
147 |
148 |
149 | 可能存在的问题:
150 |
151 | 【1】后进先出问题:
152 |
153 | Server无法从Redis读取值时(值过期),读取MySQL,此时值记为(A)。
154 |
155 | 在写入Redis之前,用户提交版本号到MySQL(此时值记为B)。
156 |
157 | 若用户提交的B,先写入Redis(B),然后Server从MySQL读取的旧值再写入Redis(A)。
158 |
159 | 此时,Redis的值是旧值(A),而不是新值(B)。
160 |
161 | 将在600秒后(在Redis中配置的默认过期时间),Redis缓存过期后,才会读取新值。
162 |
163 | ### 3、用户新建、更新key-value
164 |
165 | 功能说明:
166 |
167 | 1. 用户先登录,登录后可以查看自己管理的所有应用和该应用下的key(读取自MySQL);
168 | 2. 用户可以新建key,填写对应的value,保存后保存到MySQL,然后再更新到Redis;
169 | 3. 编辑Key时,从MySQL读取,保存时,更新到MySQL和Redis;
170 | 4. 删除Key时,从MySQL标记为删除(而不是真的删除),并删除Redis的缓存(慎重,危险操作,额外提示);
171 |
172 |
173 | ## 5、后台服务
174 |
175 | 1. Nginx服务:反向代理,将用户访问指向后台服务器,为后期负载均衡扩展做准备。
176 | 2. Server应用:正常的后台应用,会渲染页面。
177 | 3. Redis:MySQL的缓存
178 | 4. MySQL:版本管理数据将存在这里。
179 | 5. 版本管理前台:登录、新增、编辑、删除应用和key时在这里。
180 |
181 | ## 6、项目架构图
182 |
183 | 如下图:
184 |
185 |
186 |
187 | ## 7、数据库设计
188 |
189 | 1、database名:version_controller
190 |
191 | 2、用户表:(表名developer_info)
192 |
193 | 表结构和源代码略
194 |
195 | 3、应用表:(表名app)
196 |
197 | 略
198 |
199 | 4、key-value表:(表名key_value)
200 |
201 | 略
202 |
203 | 5、权限管理sql
204 |
205 | 略
206 |
207 | ## 8、后期功能扩展
208 |
209 | 1. 可以通过比如QQ机器人等,通过key查看key-value,甚至编辑key-value;
210 | 2. key-value更新后,向有编辑权限的用户和创建者,推送邮件告知;
211 | 3. 提交key值的更新后,增加审批流程;
212 |
213 | ## 9、示例效果
214 |
215 | 后端动态渲染页面:
216 |
217 | http://119.3.214.234:6644/
218 |
219 | 管理页面(新增、编辑应用/key):(账号和密码都是12345678)
220 |
221 | http://119.3.214.234:7789/
222 |
223 | python端使用该应用的package:
224 |
225 | https://github.com/qq20004604/kv-manager
226 |
227 | ## 10、总结
228 |
229 | 由于时间和精力所限,我给了一个包含了主要功能的DEMO,具体的细节并不完善,请见谅。
230 |
231 | 关键的数据库设计和后台管理页面的代码,由于有其他用处,所以没有开源,但功能描述已经在上面写的很清楚了。
232 |
233 | 想要深入讨论的,可以加我的微信:qq20004604
234 |
235 | 顺便问一下,西安有没有能给15k每月,年薪20w以上的国企?
236 |
237 | end~
--------------------------------------------------------------------------------
/原生JavaScript.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/原生JavaScript.docx
--------------------------------------------------------------------------------
/台式电脑候选.md:
--------------------------------------------------------------------------------
1 | 前注:
2 |
3 | 价格主要取自京东,买的时候个人觉得可以和品牌供货商谈。
4 |
5 | 对电脑配置不太熟悉的话,可以看每一款配置最后的优缺点评价和综合点评。
6 |
7 | ---
8 |
9 | 1、戴尔(DELL)成就5090
10 |
11 | 参考链接:
12 |
13 | https://item.jd.com/100007412752.html#crumb-wrap
14 |
15 | 价格:
16 |
17 | 京东:6999(含 23.8 英寸显示器)6289(不含显示器)
18 |
19 | 配置:
20 |
21 | * 英特尔 9 代 i7 八核 CPU(i7-9700)(性能大概是同价位笔记本的 2 倍);
22 | * 16G 内存;
23 | * 512g ssd 硬盘(高性能硬盘);
24 | * 可选配显示器(价格见上面);
25 |
26 | 优点:
27 |
28 | * 可直接配显示器,无需额外采购;
29 | * 性价比很高,高性能 CPU、大内存可以满足日常开发需求;
30 | * 高速 ssd 硬盘可以提高开发人员的开发需求;
31 | * 缩减了显卡的配置,降低了价格;
32 |
33 | 综合点评:
34 |
35 | cpu、内存和硬盘的配置都不错,足够满足研发需要。还可以选配显示器,节省采购精力。
36 |
37 | ---
38 |
39 | 2、联想(Lenovo)拯救者刃7000
40 |
41 | 参考链接:
42 |
43 | https://item.jd.com/100004096481.html#crumb-wrap
44 |
45 | 价格:
46 |
47 | 京东:7989(不含显示器)
48 |
49 | 配置:
50 |
51 | * 英特尔 9 代 i9 cpu(i9-9900);
52 | * 16G 内存;
53 | * 512g ssd 固态硬盘(高性能硬盘);
54 |
55 | 优点:
56 |
57 | * cpu 比 1# 更好,大约高 20% 左右;
58 | * 同样的大内存和高性能 ssd 硬盘;
59 | * 优秀的显卡,适合做深度学习、AI 等相关领域的研发工作;
60 | * 联想,传统国企采购品牌;
61 | * 谁要说这个电脑性能不行,就应该打屁股咯;
62 |
63 | 综合点评:
64 |
65 | 比 1# 推荐更优秀的 cpu 和显卡,提供了更优秀的机器性能,可以提高研发人员的工作效率。
66 |
67 | 需要额外采购显示器。
68 |
69 | ---
70 |
71 | 3、惠普(HP)战99商用办公台式电脑主机
72 |
73 | 参考链接:
74 |
75 | https://item.jd.com/100006246826.html#crumb-wrap
76 |
77 | 参考价格:
78 |
79 | 京东:5999(无显示器)
80 |
81 | 配置:
82 |
83 | * 英特尔 9 代 i7 cpu(i7-9700)
84 | * 16g 内存
85 | * 2TB 机械硬盘 + 256g SSD 硬盘;
86 |
87 | 优点:
88 |
89 | * cpu 水平足够;
90 | * 内存可以满足研发需求;
91 | * 便宜;
92 | * 内置无线网卡,不需要网线也能上网;
93 |
94 | 综合评价:
95 |
96 | 三款里最便宜的,性能也足够满足一般研发需要。
97 |
98 | 缺点是不适合做有显卡性能要求的研发工作。另外惠普虽然是大公司,但是美国公司。
99 |
100 | ---
101 |
102 | 以下是显示器推荐
103 |
104 | ---
105 |
106 | 4、飞利浦 31.5英寸 2K QHD高分辨率 显示器
107 |
108 | 参考链接:
109 |
110 | https://item.jd.com/5918529.html
111 |
112 | 参考价格:
113 |
114 | 京东:1199
115 |
116 | 配置:
117 |
118 | * 2560x1440 分辨率(2k 分辨率);
119 | * 60HZ 刷新率;
120 |
121 | 优点:
122 |
123 | * 更大的分辨率,适合前端、设计同学使用;
124 |
125 | 综合评价:
126 |
127 | 由于前端和设计同学,对屏幕分辩率要求比较高,因此推荐这一款,是 2k 分辨率里最便宜的了。
128 |
129 | 5、三星(SAMSUNG)23.8英寸 显示器
130 |
131 | 参考链接:
132 |
133 | https://item.jd.com/100007193438.html
134 |
135 | 参考价格:
136 |
137 | 京东:769
138 |
139 | 配置:
140 |
141 | * 1920x1080 分辨率(1080P);
142 | * 75HZ 刷新率;
143 |
144 | 优点:
145 |
146 | * 刷新率更高,屏幕也还可以,对眼睛的伤害更低;
147 |
148 | 综合评价:
149 |
150 | 常规 1080p 显示器,屏幕比较好,对于需要常年坐在电脑前的研发同学来说,对眼睛的伤害会小一些。
151 |
152 | 价格在同样的 1080p 显示器里,中规中矩一些。
153 |
154 | 6、戴尔(DELL)D2720DS 27英寸 2K高清 三面微边框 旋转升降 专业设计绘图
155 |
156 | 参考链接:
157 |
158 | https://item.jd.com/100006246946.html#crumb-wrap
159 |
160 | 参考价格:
161 |
162 | 京东:1499
163 |
164 | 配置:
165 |
166 | * 2560x1440 分辨率(2K);
167 | * 60HZ 刷新率;
168 |
169 | 优点:
170 |
171 | * 戴尔,品质保证;
172 | * 可以旋转屏幕,比如变为竖屏,对于研发同学来说非常友好;
173 | * 非常好的屏幕;
174 | * 公司现在用的就是戴尔的显示器;
175 |
176 | 综合评价:
177 |
178 | 预算充足的话,我推荐这款。
179 |
--------------------------------------------------------------------------------
/大型项目前端架构浅谈.md:
--------------------------------------------------------------------------------
1 |
大型项目前端架构浅谈
2 |
3 | 目录:
4 |
5 | * 1、综合
6 | * 1.1、使用场景
7 | * 1.2、核心思想
8 | * 1.3、切入角度
9 | * 1.4、其他
10 | * 2、基础层设计
11 | * 2.1、自建Gitlab
12 | * 2.2、版本管理
13 | * 2.3、自动编译发布Jenkins
14 | * 2.4、纯前端版本发布
15 | * 2.5、统一脚手架
16 | * 2.6、Node中间层
17 | * 2.7、埋点系统
18 | * 2.8、监控和报警系统
19 | * 2.9、安全管理
20 | * 2.10、Eslint
21 | * 2.11、灰度发布
22 | * 2.12、前后端分离
23 | * 2.13、Mock
24 | * 2.14、定期备份
25 | * 3、应用层设计
26 | * 3.1、多页和单页
27 | * 3.2、以应用为单位划分前端项目
28 | * 3.3、基础组件库的建设
29 | * 3.4、技术栈统一
30 | * 3.5、浏览器兼容
31 | * 3.6、内容平台建设
32 | * 3.7、权限管理平台
33 | * 3.8、登录系统设计(单点登录)
34 | * 3.9、CDN
35 | * 3.10、负载均衡
36 | * 3.11、多端共用一套接口
37 | * 3.12、流量峰值保障
38 | * 4、总结
39 |
40 | 1、综合
41 |
42 | 我在2年之前,写过一篇中小型项目的前端架构浅谈。随着能力的上升,以及在阿里巴巴工作过,是时候写一篇大型项目的前端架构分析了。
43 |
44 | 本篇文章不会更多侧重于具体技术实现,而是尝试从更高角度出发,分析为什么要这么做,这些设计能解决什么问题,成本和收益如何。
45 |
46 | 由于作者能力有限,可能会有所缺漏或者部分错误,欢迎读者指出。
47 |
48 | 1.1、适用场景:
49 |
50 | 本篇文章,适用于单个/多个大型项目、拥有超过10个以上的前端开发的场景。
51 |
52 | 前端项目的规模不同,成本收益比也会有所差别。通常来说,人员越多、项目复杂度越高,那么收益/成本的比值越大。
53 |
54 | 对于人数较少、项目简单的开发团队,可能有部分措施不适用,因此应该根据具体情况来选用。
55 |
56 | 1.2、核心思想:
57 |
58 | 【1】解决问题:前端架构的设计,应是用于解决已存在或者未来可能发生的技术问题,增加项目的可管理性、稳定性、可扩展性。
59 |
60 | 【2】人效比:对于需要额外开发工作量的事务(本文中存在一些需要一定开发量的内容),我们在决定是否去做的时候,应该考虑到两个要素:第一个是花费的人力成本,第二个是未来可能节约的时间和金钱、避免的项目风险与资损、提高对业务的支撑能力以带来在业务上可衡量的更高的价值、以及其他价值。
61 |
62 | 【3】定性和定量:架构里设计的内容,一定要有是可衡量的意义的,最好是可以定量的——即可以衡量带来的收益或减少的成本,至少是可以定性的——即虽然无法用数字阐述收益,但我们可以明确这个是有意义的,例如增加安全性降低风险。
63 |
64 | 【4】数据敏感:专门写这一条强调数据作为依据的重要性。当我们需要说服其他部门/上级管理者,以推动我们设计的内容时,只有数据——特别是跟钱有关的数据,才是最有说服力的证明。
65 |
66 | 由于篇幅所限,本文很难直接给出定量的值,因此建议架构设计者,先确保项目中设计使用2.7里的埋点系统,根据埋点系统获取的数据,对项目效果进行定量分析,并以此写成PPT和其他部门/上级管理者进行协调。
67 |
68 |
69 | 1.3、切入角度:
70 |
71 | 分为基础层和应用层。
72 |
73 | 基础层偏基础设施建设,与业务相关性较低。
74 |
75 | 应用层更贴近用户,用于解决某一个问题。
76 |
77 | 部分两个都沾边的,根据经验划分到其中一个。
78 |
79 | 1.4、其他
80 |
81 | 由于已经谈到架构层级,因此很多内容,并不仅仅只属于前端领域,有很多内容是复合领域(前端、后端、运维、测试),因此需要负责架构的人,技术栈足够全面,对未来发展有足够的前瞻性。
82 |
83 | 文章的内容结构为:【项目】—>【解决的问题和带来的好处】—>【项目的实际意义】
84 |
85 | 2、基础层设计
86 |
87 | 2.1、自建Gitlab
88 |
89 | 这个是基础的基础了。本不应该提的,不过考虑到我最近面试的几家公司,有的公司(人数并不少)并没有使用Gitlab,因此专门提一下,并且使用这个的难度非常低。
90 |
91 | 强烈建议使用Gitlab进行版本管理,自建Gitlab难度并不大,方便管理,包括代码管理、权限管理、提交日志查询,以及联动一些第三方插件。
92 |
93 | 意义:
94 |
95 | 公司代码是公司的重要资产,使用自建Gitlab可以有效保护公司资产。
96 |
97 | 2.2、版本管理
98 |
99 | 版本管理的几个关键点:
100 |
101 |
102 | -
103 | 发布后分支锁死,不可再更改:指当例如0.0.1版本成功发布后,不可再更改0.0.1分支上的代码,否则可能会导致版本管理混乱。
104 |
105 | -
106 | 全自动流程发布;指应避免开发者提交后,手动编译打包等操作,换句话说,开发人员发布后,将自动发布到预发布/生产环境。开发人员不和相关环境直接接触。实现这个需要参考下面的2.3。
107 |
108 | -
109 | 多版本并存;指当例如发布0.0.2版本后,0.0.1版本的代码应仍保存在线上(例如CDN),这样当出现线上bug时,方便快速回滚到上一个版本。
110 |
111 |
112 |
113 | 意义:
114 |
115 | 提高项目的可控性。
116 |
117 | 2.3、自动编译发布Jenkins
118 |
119 | 这个工具用于在代码发布后,执行一系列流程,例如自动编译打包合并,然后再从Gitlab发布到CDN或者静态资源服务器。
120 |
121 | 使用这个工具,可以让一般研发人员不关心代码传到Gitlab后会发生什么事情,只需要专心于开发就可以了。
122 |
123 | 意义:
124 |
125 | 让研发人员专心于研发,和环境、运维等事情脱钩。
126 |
127 | 2.4、纯前端版本发布
128 |
129 | 纯前端版本发布分为两步:
130 |
131 |
132 | -
133 | 前端发布到生产环境——此时可以通过外网链接加正确的版本号访问到新版本的代码,但页面上的资源还是旧版本;
134 |
135 | -
136 | 前端通过配置工具(或者是直接更新html文件),将html中引入的资源,改为新版本。
137 |
138 |
139 |
140 | 解决的问题是:当前端需要发布新版本时,可以不依赖于后端(根据实际情况,也可以不依赖于运维)。毕竟有很多需求并不需要后端介入,单纯改个前端版本后就要后端发布一次,显然是一件非常麻烦的事情。
141 |
142 | 这个需要专门的工具,用于配置版本发布,我最近就在写这个。
143 |
144 | 意义:
145 |
146 | 提高发布效率,降低发布带来的人员时间损耗(这些都是钱),也可以在前端版本回滚的时候,速度更快。
147 |
148 | 2.5、统一脚手架
149 |
150 | 适用场景:有比较多独立中小项目。好处:
151 |
152 |
153 | -
154 | 可以减少开发人员配置脚手架带来的时间损耗(特殊功能可以fork脚手架后再自行定制);
155 |
156 | -
157 | 统一项目结构,方便管理,也降低项目交接时带来的需要熟悉项目的时间;
158 |
159 | -
160 | 方便统一技术栈,可以预先引入固定的组件库;
161 |
162 |
163 |
164 | 意义:
165 |
166 | 提高开发人员在多个项目之间的快速切换能力,提高项目可维护性,统一公司技术栈,避免因为环境不同导致奇怪的问题。
167 |
168 | 2.6、Node中间层管理
169 |
170 | 适用场景:需要SEO且前端使用React、vue,或前端介入后端逻辑,直接读取后端服务或者数据库的情况。
171 |
172 |
173 | -
174 | SEO:仁者见仁智者见智,虽然很多公司已经不做了,但通常认为,还是有一定意义的(特别是需要搜索引擎引流的时候),因此React或者Vue的同构是必须的。并且同构还可以降低首页白屏时间;
175 |
176 | -
177 | 前端读取后端服务/数据库:好处是提高前端的开发效率和对业务的支持能力,缺点是可能导致P0级故障。
178 |
179 |
180 |
181 | 意义:
182 |
183 | 让前端可以侵入后端领域,质的提升对业务的支持能力。
184 |
185 | 2.7、埋点系统
186 |
187 | 强烈推荐前端做自己的埋点系统。这个不同于后端的日志系统。
188 |
189 | 前端埋点系统的好处:
190 |
191 |
192 | -
193 | 记录每个页面的访问量(日周月年的UV、PV);
194 |
195 | -
196 | 记录每个功能的使用量;
197 |
198 | -
199 | 捕捉报错情况;
200 |
201 | -
202 | 图表化显示,方便给其他部门展示;
203 |
204 |
205 |
206 | 埋点系统是前端高度介入业务,把握业务发展情况的一把利剑,通过这个系统,我们可以比后端更深刻的把握用户的习惯,以及给产品经理、运营等人员提供准确的数据依据。当有了数据后,前端人员就可以针对性的优化功能、布局、页面交互逻辑、用户使用流程。
207 |
208 | 埋点系统应和业务解耦,开发人员使用时注册,然后在项目中引入。然后在埋点系统里查看相关数据(例如以小时、日、周、月、年为周期查看)[原创水印-作者:零零水(王冬),微信:qq20004604]。
209 |
210 | 意义:
211 |
212 | 数据是money,数据是公司的生命线,数据是最好的武器。
213 |
214 | 2.8、监控和报警系统
215 |
216 | 监控和报警系统应基于埋点系统而建立,在如以下场景时[原创水印-作者:零零水(王冬),微信:qq20004604]触发:
217 |
218 |
219 | -
220 | 当访问量有比较大的变化(比如日PV/UV只有之前20%以下)时,自动触发报警,发送邮件到相关人员邮箱;
221 |
222 | -
223 | 比如报错量大幅度上升(比如200%或更高),则触发报警;
224 |
225 | -
226 | 当一段时间内没有任何访问量(不符合之前的情况),则触发报警;
227 |
228 | -
229 | 每过一段时间,自动汇总访问者/报错触发者的相关信息(例如系统、浏览器版本等);
230 |
231 |
232 |
233 | 建设这个系统的好处在于,提前发现一些不容易发现的bug(需要埋点做的比较扎实)。有一些线上bug,因为用户环境特殊,导致无法被开发人员和测试人员发现。但其中一部分bug又因为不涉及资金,并不会导致资损(因此也不会被后端的监控系统所发现),这样的bug非常容易影响项目里某个链路的正常使用。
234 |
235 | 意义:
236 |
237 | 提高项目的稳定性,提高对业务的把控能力。降低bug数,降低资损的可能性,提前发现某些功能的bug(在工单到来之前)。
238 |
239 | 2.9、安全管理
240 |
241 | 前端的安全管理,通常要依赖于后端,至于只跟单纯有关系的例如dom.innerHTML= 'xxx '这种太基础,就不提了。
242 |
243 | 安全管理的很难从架构设计上完全避免,但还是有一定解决方案的,常见安全问题如下:
244 |
245 |
246 | -
247 | XSS注入:对用户输入的内容,需要转码(大部分时候要server端来处理,偶尔也需要前端处理),禁止使用eval函数;
248 |
249 | -
250 | https:这个显然是必须的,好处非常多;
251 |
252 | -
253 | CSRF:要求server端加入CSRF的处理方法(至少在关键页面加入);
254 |
255 |
256 |
257 | 意义:
258 |
259 | 减少安全漏洞,避免用户受到损失,避免遭遇恶意攻击,增加系统的稳定性和安全性。
260 |
261 | 2.10、Eslint
262 |
263 | Eslint的好处很多,强烈推荐使用:
264 |
265 |
266 | -
267 | 降低低级bug(例如拼写问题)出现的概率;
268 |
269 | -
270 | 增加代码的可维护性,可阅读性;
271 |
272 | -
273 | 硬性统一代码风格,团队协作起来时更轻松;
274 |
275 |
276 |
277 | 总的来说,eslint推荐直接配置到脚手架之中,对我们提高代码的可维护性的帮助会很大。可以考虑在上传到gitlab时,硬性要求eslint校验,通过的才允许上传。
278 |
279 | 意义:
280 |
281 | 提高代码的可维护性,降低团队协作的成本。
282 |
283 | 2.11、灰度发布
284 |
285 | 灰度发布是大型项目在发布时的常见方法,指在发布版本时,初始情况下,只允许小比例(比如1~5%比例的用户使用),若出现问题时,可以快速回滚使用老版本,适用于主链路和访问量极大的页面。
286 |
287 | 好处有以下几点:
288 |
289 |
290 | -
291 | 生产环境比开发环境复杂,灰度发布时可以在生产环境小范围尝试观察新版本是否可以正常运行,即使出问题,也可以控制损失。
292 |
293 | -
294 | 对于大版本更新,可以先灰度一部分,观察埋点效果和用户反馈(即所谓的抢先试用版)。假如效果并不好,那么回滚到老版本也可以及时止损;
295 |
296 | -
297 | 当我们需要验证某些想法或问题的时候,可以先灰度一部分,快速验证效果如何,然后查漏补缺或者针对性优化;
298 |
299 |
300 |
301 | 灰度发布通常分为多个阶段:【1】1%;【2】5~10%;【3】30~50%;【4】全量推送(100%)。灰度发布一定要允许配置某些IP/账号访问时,可以直接访问到灰度版本。
302 |
303 | 意义:
304 |
305 | 降低风险,提高发布灵活度。
306 |
307 | 2.12、前后端分离
308 |
309 | 这个并不是指常见的前后端分离,而是指在分配前后端管控的领域。
310 |
311 | 中小项目常见的情况是后端只提供接口和让某个url指向某个html,前端负责html、css、js等静态资源。
312 |
313 | 但大型项目并不建议这么做,建议前端负责除html以外的静态资源,而html交给后端处理,理由有很多:
314 |
315 |
316 | -
317 | 后端进行渲染,方便统一插入一些代码和资源,例如埋点js,监控js,国际化文本资源,页面标识符等。这些通常是后端通过调用某些服务直接写入的;
318 |
319 | -
320 | 当页面需要统一的头尾时(参考淘宝里我的淘宝页面),前端不应该关注这些跟当前页面无关的东西;
321 |
322 | -
323 | 某些东西,如果通过html来管理,那么耦合度太高了,违背了解耦和分离的原则;
324 |
325 | -
326 | 前端版本发布在后端引入某种功能模块后,可以从单独的页面控制前端发布内容,比更新html更方便,也利于灰度发布;
327 |
328 |
329 |
330 | 意义:
331 |
332 | 更规范的进行页面管理,降低页面和功能的耦合度,减少复杂页面的环境配置时间。
333 |
334 | 2.13、Mock
335 |
336 | Mock也是常见前端系统之一,用于解决在后端接口未好时,生成返回的数据。
337 |
338 | 我个人不太建议开发一个专门的系统来Mock,更好的Mock手法是直接嵌入到脚手架之中。思路如下:
339 |
340 |
341 | -
342 | 当在开发环境下,访问链接通常是localhost:8000/index.html,此时加入后缀 ?debug=true;
343 |
344 | -
345 | 封装好的异步请求在发现当前链接有以上标志时,认为是测试环境,访问/userinfo 时,不去读取线上的数据(因为也读取不到),去本地环境读取 src/test_ajax/userinfo.json,并将内容返回给用户;
346 |
347 | -
348 | 异步请求正常拿到数据,在页面中显示[原创水印-作者:零零水(王冬),微信:qq20004604];
349 |
350 | - 当线上接口可以获取到数据后,从network里找到返回的数据,放入/ src/test_ajax/userinfo.json中,此时再次本地调试的话,相当于使用的是线上的真实数据。
351 |
352 |
353 |
354 |
355 | 这种处理,可以降低mock的复杂度,随时更改mock时返回的数据,比单独开发一个mock系统性价比更高。
356 |
357 | 意义:
358 |
359 | 在前后端并行开发时,降低沟通交流成本,方便开发完毕后直接对接。
360 |
361 | 2.14、定期备份
362 |
363 | 备份是常被忽略的一件事情,但当我们遇见毁灭性场景时,缺少备份带来的损失是非常大的,常见场景:
364 |
365 |
366 | -
367 | 服务器损坏,导致存在该服务器上的内容全部完蛋;
368 |
369 | -
370 | 触发某致命bug或者错误操作(例如rm -f),导致文件和数据全部消失;
371 |
372 | -
373 | 数据库出现错误操作或出现问题,导致用户数据、公司资产遭受严重损失;
374 |
375 |
376 |
377 | 总的来说,没人想遇见这样的场景,但我们必须考虑这种极端情况的发生,因此需要从架构层面解决这个问题。常见方法是定期备份、多机备份、容灾系统建设等。
378 |
379 | 意义:
380 |
381 | 避免在遭遇极端场景时,给公司带来不可估量的损失。
382 |
383 | 3、应用层设计
384 |
385 | 3.1、多页和单页
386 |
387 | 除了特殊场景,通常推荐使用多页架构。理由如下:
388 |
389 |
390 | -
391 | 多页项目,页面和页面之间是独立的,不存在交互,因此当一个页面需要单独重构时,不会影响其他页面,对于有长期历史的项目来说,可维护性、可重构性要高很多;
392 |
393 | -
394 | 多页项目的缺点是不同页面切换时,会有一个白屏时间,但通常来说,这个时间并不长,大部分现有大公司的线上网页,都是这样的,因此认为是可以接受的;
395 |
396 | -
397 | 多页项目可以单次只更新一个页面的版本,而单页项目如果其中一个功能模块要更新(特别是公共组件更新),很容易让所有页面都需要更新版本;
398 |
399 | -
400 | 多页项目的版本控制更简单,如果需要页面拆分,调整部分页面的使用流程,难度也会更低;
401 |
402 | -
403 | 灰度发布更友好;
404 |
405 |
406 |
407 | 之前面试的一家,采用了单页的形式,之前因为种种原因,同时采用了ng和react。由于项目历史也比较久(3年以上),结果导致目前继续维护更新的难度很大,即使想部分重构,也很麻烦。
408 |
409 | 意义:
410 |
411 | 降低长期项目迭代维护的难度,
412 |
413 | 3.2、以应用为单位划分前端项目
414 |
415 | 在项目比较大的时候,将所有页面的前端文件放入到同一个代码仓库里,我之前参与过一家企业的前端项目开发,发现其就是这么做的。根据使用经验来看[原创水印-作者:零零水(王冬),微信:qq20004604],存在很多问题:
416 |
417 |
418 | -
419 | 会极大的增加代码的维护难度;
420 |
421 | -
422 | 项目会变得很丑陋;
423 |
424 | -
425 | 不方便权限管理,容易造成页面误更改或代码泄密;
426 |
427 | -
428 | 任何人都有权利改任何他能看到的页面(在合并代码的时候,管理人员并不能确定他本次修改的页面是否是需求里他应该改的页面);
429 |
430 | -
431 | 发布成本高,即使改一个页面,也需要发布所有资源;
432 |
433 |
434 |
435 | 因此,我们应该避免这种现象的发生,个人推荐以应用为单位进行开发、发布。所谓应用即指一个业务涉及到的前后端代码,好处很多:
436 |
437 |
438 | -
439 | 方便进行管理,当某个业务有需求变更时,可以只给研发人员该业务前端应用的developer权限;
440 |
441 | -
442 | 在需要发布某业务时,只需要发布该业务的所属应用即可;
443 |
444 |
445 |
446 | 意义:
447 |
448 | 规范项目,增加代码的安全性,降低项目维护成本。
449 |
450 | 3.3、基础组件库的建设
451 |
452 | 这个蛮基础的,对于组件库的建设,不建议研发人员较少时去做这件事情,专职前端开发人数少于10人时,建议使用比较靠谱的第三方UI库,例如Antd,这样性价比更高。
453 |
454 | 设计基础组件库的前提,是要求统一技术栈,这样才能最大化基础组件库的效益。组件库建议以使用以下参考标准:
455 |
456 |
457 | -
458 | 使用ts;
459 |
460 | -
461 | 可扩展性强;
462 |
463 | -
464 | 适用程度高;
465 |
466 | -
467 | 文档清楚详细;
468 |
469 | -
470 | 版本隔离,小版本优化加功能,大改需要大版本更新;
471 |
472 | -
473 | 和UI协调统一,要求UI交互参与进来;
474 |
475 |
476 |
477 |
478 | 总的来说,建设起来后,利大于弊,但是需要专人维护,因此还是有一定成本的。
479 |
480 | 意义:
481 |
482 | 统一不同/相同产品线之间的风格,给用户更好的体验,减少单次开发中写UI组件时浪费的时间和人力,提高开发效率。
483 |
484 | 3.4、技术栈统一
485 |
486 | 前端有三大主流框架,还有兼容性最强jQuery,以及各种第三方库,UI框架。因此项目需求如果复杂一些,很容易形成一个大杂烩。因此前端的技术栈必须统一,具体来说,建议实现以下举措:
487 |
488 |
489 | -
490 | 三大框架选型其一,团队水平一般推荐Vue、水平较好推荐React,对外项目选React或者ng;
491 |
492 | -
493 | 需要兼容IE8或更老版本时,建议使用jQuery;
494 |
495 | -
496 | 组件库自建或者统一选择一个固定的第三方;
497 |
498 | -
499 | 一些特殊第三方库统一使用一个版本,例如需要使用地图时,固定使用高德或百度或腾讯地图;
500 |
501 | -
502 | 基础设施建设应避免重复造轮子,所有团队尽量共用,并有专门的前端平台负责统一这些东西,对于特殊需求,可以新建,但应当有说服力;
503 |
504 |
505 |
506 | 总的来说,技术栈统一的好处很多,可以有效提高开发效率,降低重复造轮子产生的成本。
507 |
508 | 意义:
509 |
510 | 方便招人,简化团队成员培养成本,以及提高项目的可持续性。
511 |
512 |
513 | 3.5、浏览器兼容
514 |
515 | 常见的问题是IE6、7、8,以及部分小众浏览器(PC和手机)产生的奇怪问题。因此应该考虑统一解决方案,避免bug的重复产生。常见解决方案有:
516 |
517 |
518 | -
519 | 配置postcss,让某些css增加兼容性前缀;
520 |
521 | -
522 | 写一个wepback的loader,处理某些特殊场景;
523 |
524 | -
525 | 规范团队代码,使用更稳定的写法(例如移动端避免使用fixed进行布局);
526 |
527 | -
528 | 对常见问题、疑难问题,总结解决方案并团队共享;
529 |
530 | -
531 | 建议或引导用户使用高版本浏览器(比如chrome);
532 |
533 |
534 |
535 | 意义:
536 |
537 | 避免浏览器环境产生的bug,以及排查此类bug所浪费的大量时间。
538 |
539 | 3.6、内容平台建设
540 |
541 | 为了提高公司内部的沟通效率,总结经验,以及保密原因。应建设一个内部论坛+博客站点。其具备的好处如下:
542 |
543 |
544 | -
545 | 可以记录公司的历史;
546 |
547 | -
548 | 研发同学之间分享经验;
549 |
550 | -
551 | 总结转载一些外界比较精品的文章,提高大家的眼界;
552 |
553 | -
554 | 增加公司内部同学的交流,有利于公司的团队和文化建设;
555 |
556 | -
557 | 对某些技术问题可以进行讨论,减少因没有达成共识带来的沟通损耗;
558 |
559 |
560 |
561 | 众所周知,大型互联网公司通常都有这样一个内部论坛和博客站点。其降低了公司的沟通和交流成本,也增加了公司的技术积累。
562 |
563 | 意义:
564 |
565 | 博客增强技术积累,论坛增强公司内部沟通能力。
566 |
567 | 3.7、权限管理平台
568 |
569 | 当公司内部人员较多时,应有一个专门的平台,来管理、规范用户的权限以及可访问内容[原创水印-作者:零零水(王冬),微信:qq20004604]。权限管理平台有几个特点:
570 |
571 |
572 | -
573 | 必然和Server端天然高耦合度,因此需要有专门的控制模块负责处理权限问题(负责Server端开发处理,或者前端通过中间层例如Node层介入处理);
574 |
575 | -
576 | 自动化流程控制,即用户创建、申请、审批、离职自动删除,都应该是由系统推进并提醒相关人士,必要时应能触发报警;
577 |
578 | -
579 | 权限应有时效性,减少永久性权限的产生;
580 |
581 | -
582 | 审批流程应清晰可见,每一阶段流程应具体明确;
583 |
584 | -
585 | 应与公司流程紧密结合,并且提高可修改性,方便公司后期进行流程优化;
586 |
587 |
588 |
589 | 意义:
590 |
591 | 使得公司内部流程正规化、信息化。
592 |
593 | 3.8、登录系统设计(单点登录)
594 |
595 | 当公司内部业务线比较复杂但相互之间的耦合度比较高时,我们应该考虑设计添加单点登录系统。具体来说,用户在一处登录,即可以在任何页面访问,登出时,也同样在任何页面都失去登录状态。SSO的好处很多:
596 |
597 |
598 | -
599 | 增强用户体验;
600 |
601 | -
602 | 打通了不同业务系统之间的用户数据;
603 |
604 | -
605 | 方便统一管理用户;
606 |
607 | -
608 | 有利于引流;
609 |
610 | -
611 | 降低开发系统的成本(不需要每个业务都开发一次登录系统和用户状态控制);
612 |
613 |
614 |
615 | 总的来说,大中型web应用,SSO可以带来很多好处,缺点却很少。
616 |
617 | 意义:
618 |
619 | 用户体验增强,打通不同业务之间的间隔,降低开发成本和用户管理成本。
620 |
621 | 3.9、CDN
622 |
623 | 前端资源的加载速度是衡量用户体验的重要指标之一。而现实中,因为种种因素,用户在加载页面资源时,会受到很多限制。因此上CDN是非常有意义的,好处如下:
624 |
625 |
626 | -
627 | 用户来自不同地区,加入CDN可以使用户访问资源时,访问离自己比较近的CDN服务器,降低访问延迟;
628 |
629 | -
630 | 降低服务器带宽使用成本;
631 |
632 | -
633 | 支持视频、静态资源、大文件、小文件、直播等多种业务场景;
634 |
635 | -
636 | 消除跨运营商造成的网络速度较慢的问题;
637 |
638 | -
639 | 降低DDOS攻击造成的对网站的影响;
640 |
641 |
642 |
643 | CDN是一种比较成熟的技术,各大云平台都有提供CDN服务,价格也不贵,因此CDN的性价比很高。
644 |
645 | 意义:
646 |
647 | 增加用户访问速度,降低网络延迟,带宽优化,减少服务器负载,增强对攻击的抵抗能力。
648 |
649 | 3.10、负载均衡
650 |
651 | 目前来看,负载均衡通常使用Nginx比较多,以前也有使用Apache。当遇见大型项目的时候,负载均衡和分布式几乎是必须的。负载均衡有以下好处:
652 |
653 |
654 | -
655 | 降低单台server的压力,提高业务承载能力;
656 |
657 | -
658 | 方便应对峰值流量,扩容方便(如举办某些活动时);
659 |
660 | -
661 | 增强业务的可用性、扩展性、稳定性;
662 |
663 |
664 |
665 | 负载均衡已经是蛮常见的技术了,好处不用多说,很容易理解。
666 |
667 | 意义:
668 |
669 | 增强业务的可用性、扩展性、稳定性,可以支持更多用户的访问。
670 |
671 | 3.11、多端共用一套接口
672 |
673 | 目前常见场景是一个业务,同时有PC页面和H5页面,由于业务是一样的,因此应避免同一个业务有多套接口分别适用于PC和H5端。[原创の水印-作者:零零水(王冬),QQ:20004604]因此解决方案如下:
674 |
675 |
676 | -
677 | 后端提供的接口,应该同时包含PC和H5的数据(即单独对一个存在亢余数据);
678 |
679 | -
680 | 接口应当稳定,即当业务变更时,应尽量采取追加数据的形式;
681 |
682 | -
683 | 只有在单独一端需要特殊业务流程时,设计单端独有接口;
684 |
685 |
686 |
687 | 多端共用接口,是减少开发工作量,并且提高业务可维护性的重要解决方案。
688 |
689 | 意义:
690 |
691 | 降低开发工作量,增强可维护性。
692 |
693 | 3.12、流量峰值保障
694 |
695 | 实际场景中,经常会遇见过高的峰值流量。具体来说,假设平时网站每秒访问量的高峰在3-4k左右。通常来说,你设计能承载每秒1w访问的Server,基本是够用的。但生活总是充满意外,假如运营搞一个秒杀活动,每秒访问量的峰值超过2w甚至更多都是有可能的,这种情况下,很容易导致连锁反应,然后服务器原地爆炸。
696 |
697 | 为了应对这种特殊情况,我们需要做一些操作(通常需要Server端介入),常见解决方式有以下几种:
698 |
699 |
700 | - 限流:比如告知用户排队、重定向到错误页等;
701 | - 服务降级:比如说,某些非核心功能临时禁止使用;
702 | - 缓存:包括页面静态资源缓存,和DB之间的缓存等;
703 | - 扩容:一台机子不行,上两台,有手动扩容和自动扩容的区分;
704 | - 同步变异步:某些操作从同步操作,变为异步非阻塞操作;
705 | - 削峰:这个和限流的区别在于,用户还是能正常访问,只不过原本1秒内2w访问量,现在变为2秒或更久2w访问量;
706 |
707 |
708 | 总的来说,解决方法很多,架构师需要能理解整个业务模型和架构模型,才能正确对峰值流量提出有效的解决方案。
709 |
710 | 意义:
711 |
712 | 保障大促等活动,为业务的正常开展保驾护航。
713 |
714 | 4、总结
715 |
716 | 由于各个公司具体情况不同,项目也具有特殊性,因此以上设计不可强行套入,应根据自己公司规模、项目进展、人员数量等,先添加比较重要的功能和设计。并需要考虑到长期项目的可维护性和发展需要,对部分基础设施进行提前研发设计。
717 |
718 | 篇幅所限,因此无法面面俱到,只提了一些我认为比较重要的架构层面需要考虑的内容,欢迎大家补充。大家如果有自己的看法,欢迎回复,或者添加我的微信 qq20004604(昵称:零零水)进行讨论。
719 |
720 | 最后问一下,西安有没有不加班,并且需要前端架构师的公司,请联系我。
721 |
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/01.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/02.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/03.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/04.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/05.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/06.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/06.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/07.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/07.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/08.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/08.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/09.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/09.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/10.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/11.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/12.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/13.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/14.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/15.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/16.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/17.jpg
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/readme.md:
--------------------------------------------------------------------------------
1 | 程序员技术交流、面试、职场、生活、游戏、相亲,综合讨论QQ群:387017550,群内经常发红包,欢迎加入
2 |
3 | 群福利:每周一次免费面试,在YY频道直播,可旁听,有往期录音
4 |
5 | ## 1、下载
6 |
7 | 虚拟机软件使用Oracle VM VirtualBox,优势是开源。
8 |
9 | 进入以下链接,然后下载:
10 |
11 | https://www.oracle.com/technetwork/cn/server-storage/virtualbox/downloads/index.html
12 |
13 | ## 2、安装
14 |
15 | 打开,安装就行,建议不要放在C盘
16 |
17 | ## 3、新建虚拟机
18 |
19 | #### 1、新建
20 |
21 | 首先打开 VirtualBox,点击新建,填写虚拟机名字,如下图:
22 |
23 |
24 |
25 | #### 2、分配内存
26 |
27 | 点击下一步,分配内存。注意尽量不要超过3GB,理由是如果超过3GB,可能会触发一个错误(解决方案参考这个链接:https://stackoverflow.com/questions/33304393/vt-x-is-disabled-in-the-bios-for-both-all-cpu-modes-verr-vmx-msr-all-vmx-disabl)
28 |
29 |
30 | 我选择分配2048MB(即2GB内存)。
31 |
32 |
33 |
34 | #### 3、虚拟硬盘
35 |
36 | 分配虚拟硬盘,推荐10GB。
37 |
38 |
39 |
40 | 使用默认选项,点击创建按钮后,出现一个新弹窗。
41 |
42 | 在新弹窗里,前2步直接点击下一步,第三步选择位置的时候,建议改一下位置(默认是在C盘),并且我将大小调整到15GB,点击创建按钮。
43 |
44 |
45 |
46 | #### 4、启动
47 |
48 | 此时创建完毕,如下图,双击启动。
49 |
50 |
51 |
52 | 但是初始情况下如下图,原因是你没有安装操作系统。这个时候我们去下载 Ubuntu 系统。
53 |
54 |
55 |
56 | ## 4、下载Ubuntu系统
57 |
58 | 打开这个网站:https://www.ubuntu.com/download/server ,然后下载LTS版本。
59 |
60 | 用虚拟机软件挂载下载的 ISO 文件,挂到某个光盘符下,然后虚拟机的启动盘也修改为同一个。
61 |
62 | ## 5、启动失败常见问题解决方案
63 |
64 | 如下图修改:
65 |
66 |
67 |
68 | 不然会报错误 ``No bootable medium found``
69 |
70 | 如果运行的时候提示:``this kernel requires an x86-64 cpu``,说明没有启用 ``intel Virtualization Technology``,解决方案参考:https://blog.csdn.net/zhouyongku/article/details/45172897
71 |
72 | 同时,系统需要选择 64bit 的,如下图:
73 |
74 |
75 |
76 | 正常情况下,会自动触发安装,如下图
77 |
78 |
79 |
80 | ## 6、安装过程中的配置
81 |
82 | 第一步,选English,如图,接下来一路下一步,直到需要名字为止。
83 |
84 |
85 |
86 | 如图,输入名字,然后继续使用默认选项,一路下一步。
87 |
88 |
89 |
90 | 安装完成后如下图,点击 ``Reboot Now`` 启动。
91 |
92 |
93 |
94 | 重启后,会提示你移除虚拟盘片,如下图,移除后继续。
95 |
96 |
97 |
98 | ## 7、进入系统
99 |
100 | 在第七步,启动系统后,会刷出几个[OK],但是没有输入内容的地方。这个时候,要按一下回车键,系统就会提示你输入姓名和密码了。
101 |
102 | 输入后,进入系统,如图:
103 |
104 |
105 |
106 |
107 | ## 8、设置root密码
108 |
109 | 此时,我们可以通过自己命名的账号登录,但这个账号并不是 root 账号。
110 |
111 | 假如我们想登录 root 账号,就得知道他的密码是什么。
112 |
113 | 显然我们不知道。
114 |
115 | 但值得庆幸的是,第一个user是在admin组,所以他可以给root设置密码。
116 |
117 | 输入以下命令:
118 |
119 | ```
120 | sudo passwd root
121 |
122 | [sudo] password for you :// 此时提示输入你当前账号的密码
123 |
124 | Enter new UNIX password: // 此时提示你输入 root 账号的密码,按enter确认
125 | // 然后再重复输入一次
126 | ```
127 |
128 | 这时就搞定了。
129 |
130 |
131 | ## 9、设置虚拟机网络模式
132 |
133 | 有三种网络模式,桥接、NAT、Host-Only。
134 |
135 | 详解见:https://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html
136 |
137 | 我们这里使用桥接模式,像之前那样打开虚拟机的设置功能,如下图设置:
138 |
139 |
140 |
141 |
142 | ## 10、让Linux可以通过ftp来访问
143 |
144 | 参考文章:https://blog.csdn.net/timothy93bp/article/details/77527531
145 |
146 | #### 1、下载 vsftpd
147 |
148 | 输入命令:
149 |
150 | ```
151 | sudo apt-get install vsftpd
152 | ```
153 |
154 | 如果报错 ``could not get lock /var/lib/dpkg/lock`` ,参考这个链接;https://itsfoss.com/could-not-get-lock-error/
155 |
156 | 具体来说,先输入 ``ps aux | grep -i apt`` 搜索哪些占用了 apt,然后通过 ``sudo kill -9 进程id`` 的方式干掉他。
157 |
158 | 安装的过程中,他会提示你会占用一些空间,升级一些东西和安装一些东西。输入 ``Y`` 然后回车确认即可。
159 |
160 | 一会就安好了。
161 |
162 | #### 2、配置 ftp 的密码
163 |
164 | 输入 ``sudo passwd ftp`` ,然后重复输入2次密码即可(账号名为你的默认账号名)。
165 |
166 | #### 3、修改配置文件
167 |
168 | 输入 ``sudo vim /etc/vsftpd.conf`` 编辑配置文件。按下 ``i`` 进入编辑模式。
169 |
170 | 这个文件的详细配置说明参考:https://blog.csdn.net/mengtianwxs/article/details/72997092
171 |
172 | 1. 删除 ``write_enable=YES`` 之前的 ``#`` 井号(即注释符号,下同);
173 | 2. 按 esc 返回命令模式,再输入 ``:wq`` ,保存退出;
174 |
175 | 输入 ``sudo service vsftpd restart`` 重启 ftp 服务器。
176 |
177 | 最终文件应该是这样的(如果你的和我不一样,可能是我改了但是漏了没写):
178 |
179 | https://github.com/qq20004604/notes/blob/master/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%9D%A5%E8%BF%90%E8%A1%8Clinux/vsftpd.conf
180 |
181 |
182 | #### 4、安装 ssh
183 |
184 | 参考文章:https://blog.csdn.net/netwalk/article/details/12952051
185 |
186 | 首先,Ubuntu缺省没有安装SSH Server,使用以下命令安装:
187 |
188 | ```
189 | sudo apt-get install openssh-server
190 | ```
191 |
192 | 然后输入 ``ps -e|grep ssh`` 确认 ssh 是否启动,如果显示 ``sshd`` 则表明已经启动了。
193 |
194 | 没启动的话,输入:``sudo /etc/init.d/ssh start`` 启动;或者 ``sudo /etc/init.d/ssh restart`` 重新启动;
195 |
196 | #### 5、登录
197 |
198 | windows客户端可以下载 FileZilla Client 来进行FTP登录。
199 |
200 | 如下图:
201 |
202 | * 协议选 SFTP;
203 | * 主机输入虚拟机的 IP(查询 ip 通过输入 ``ifconfig`` 命令,找 ``inet`` 后面的那个ip地址);
204 | * 端口不填(默认是22);
205 | * 输入用户名和密码(用户名用root);
206 | * 其他用户名,可以访问,但上传下载很麻烦,原因是需要处理权限问题。如果需要控制权限则使用其他账号
207 |
208 | 点击【连接】即可。
209 |
210 |
211 |
212 | **常见问题:**
213 |
214 | 1. 登录被拒绝怎么办?
215 | 1. 查看是否没有安装 ssh;
216 | 2. ssh服务是否没启动;
217 | 3. ``/etc/vsftpd.conf`` 是否按我所说的进行更改配置;
218 | 4. 重启一下 ssh 服务(命令见上面);
219 | 5. 重启一下 ftp 服务器(命令见上面);
220 | 6. 重启虚拟机;
221 | 7. 重启主机;
222 | 8. ping 一下试试(在主机输入``ping 虚拟机的ip地址``),能否ping通(ping不同说明ip可能是错的);
223 | 9. 通过 ssh 登录一下试试(命令 ``ssh 用户名@ip地址``),登录不了可能是ssh服务没启动;
224 | 10. 总之,以上都正常的话,分别重启虚拟机和主机;
225 |
226 | 登录成功的话,应该如下图:
227 |
228 |
229 |
230 |
--------------------------------------------------------------------------------
/如何使用虚拟机来运行linux/vsftpd.conf:
--------------------------------------------------------------------------------
1 | # Example config file /etc/vsftpd.conf
2 | #
3 | # The default compiled in settings are fairly paranoid. This sample file
4 | # loosens things up a bit, to make the ftp daemon more usable.
5 | # Please see vsftpd.conf.5 for all compiled in defaults.
6 | #
7 | # READ THIS: This example file is NOT an exhaustive list of vsftpd options.
8 | # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
9 | # capabilities.
10 | #
11 | #
12 | # Run standalone? vsftpd can run either from an inetd or as a standalone
13 | # daemon started from an initscript.
14 | # listen=YES
15 | #
16 | # This directive enables listening on IPv6 sockets. By default, listening
17 | # on the IPv6 "any" address (::) will accept connections from both IPv6
18 | # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
19 | # sockets. If you want that (perhaps because you want to listen on specific
20 | # addresses) then you must run two copies of vsftpd with two configuration
21 | # files.
22 | listen_ipv6=YES
23 | #
24 | # Allow anonymous FTP? (Disabled by default).
25 | anonymous_enable=NO
26 | #
27 | # Uncomment this to allow local users to log in.
28 | local_enable=YES
29 | #
30 | # Uncomment this to enable any form of FTP write command.
31 | write_enable=YES
32 | #
33 | # Default umask for local users is 077. You may wish to change this to 022,
34 | # if your users expect that (022 is used by most other ftpd's)
35 | # local_umask=022
36 |
37 |
38 | #
39 | # Uncomment this to allow the anonymous FTP user to upload files. This only
40 | # has an effect if the above global write enable is activated. Also, you will
41 | # obviously need to create a directory writable by the FTP user.
42 | #anon_upload_enable=YES
43 | #
44 | # Uncomment this if you want the anonymous FTP user to be able to create
45 | # new directories.
46 | #anon_mkdir_write_enable=YES
47 | #
48 | # Activate directory messages - messages given to remote users when they
49 | # go into a certain directory.
50 | dirmessage_enable=YES
51 | #
52 | # If enabled, vsftpd will display directory listings with the time
53 | # in your local time zone. The default is to display GMT. The
54 | # times returned by the MDTM FTP command are also affected by this
55 | # option.
56 | use_localtime=YES
57 | #
58 | # Activate logging of uploads/downloads.
59 | xferlog_enable=YES
60 | #
61 | # Make sure PORT transfer connections originate from port 20 (ftp-data).
62 | connect_from_port_20=YES
63 | #
64 | # If you want, you can arrange for uploaded anonymous files to be owned by
65 | # a different user. Note! Using "root" for uploaded files is not
66 | # recommended!
67 | #chown_uploads=YES
68 | #chown_username=whoever
69 | #
70 | # You may override where the log file goes if you like. The default is shown
71 | # below.
72 | #xferlog_file=/var/log/vsftpd.log
73 | #
74 | # If you want, you can have your log file in standard ftpd xferlog format.
75 | # Note that the default log file location is /var/log/xferlog in this case.
76 | #xferlog_std_format=YES
77 | #
78 | # You may change the default value for timing out an idle session.
79 | #idle_session_timeout=600
80 | #
81 | # You may change the default value for timing out a data connection.
82 | #data_connection_timeout=120
83 | #
84 | # It is recommended that you define on your system a unique user which the
85 | # ftp server can use as a totally isolated and unprivileged user.
86 | #nopriv_user=ftpsecure
87 | #
88 | # Enable this and the server will recognise asynchronous ABOR requests. Not
89 | # recommended for security (the code is non-trivial). Not enabling it,
90 | # however, may confuse older FTP clients.
91 | #async_abor_enable=YES
92 | #
93 | # By default the server will pretend to allow ASCII mode but in fact ignore
94 | # the request. Turn on the below options to have the server actually do ASCII
95 | # mangling on files when in ASCII mode.
96 | # Beware that on some FTP servers, ASCII support allows a denial of service
97 | # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
98 | # predicted this attack and has always been safe, reporting the size of the
99 | # raw file.
100 | # ASCII mangling is a horrible feature of the protocol.
101 | #ascii_upload_enable=YES
102 | #ascii_download_enable=YES
103 | #
104 | # You may fully customise the login banner string:
105 | #ftpd_banner=Welcome to blah FTP service.
106 | #
107 | # You may specify a file of disallowed anonymous e-mail addresses. Apparently
108 | # useful for combatting certain DoS attacks.
109 | #deny_email_enable=YES
110 | # (default follows)
111 | #banned_email_file=/etc/vsftpd.banned_emails
112 | #
113 | # You may restrict local users to their home directories. See the FAQ for
114 | # the possible risks in this before using chroot_local_user or
115 | # chroot_list_enable below.
116 | # chroot_local_user=YES
117 | #
118 | # You may specify an explicit list of local users to chroot() to their home
119 | # directory. If chroot_local_user is YES, then this list becomes a list of
120 | # users to NOT chroot().
121 | # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
122 | # the user does not have write access to the top level directory within the
123 | # chroot)
124 | # chroot_local_user=YES
125 | # chroot_list_enable=YES
126 | # (default follows)
127 | # chroot_list_file=/etc/vsftpd.chroot_list
128 | #
129 | # You may activate the "-R" option to the builtin ls. This is disabled by
130 | # default to avoid remote users being able to cause excessive I/O on large
131 | # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
132 | # the presence of the "-R" option, so there is a strong case for enabling it.
133 | #ls_recurse_enable=YES
134 | #
135 | # Customization
136 | #
137 | # Some of vsftpd's settings don't fit the filesystem layout by
138 | # default.
139 | #
140 | # This option should be the name of a directory which is empty. Also, the
141 | # directory should not be writable by the ftp user. This directory is used
142 | # as a secure chroot() jail at times vsftpd does not require filesystem
143 | # access.
144 | secure_chroot_dir=/var/run/vsftpd/empty
145 | #
146 | # This string is the name of the PAM service vsftpd will use.
147 | pam_service_name=vsftpd
148 | #
149 | # This option specifies the location of the RSA certificate to use for SSL
150 | # encrypted connections.
151 | rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
152 | rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
153 | ssl_enable=NO
154 |
155 | #
156 | # Uncomment this to indicate that vsftpd use a utf8 filesystem.
157 | #utf8_filesystem=YES
158 |
159 | # local_root=/usr/local/wd
160 |
161 |
--------------------------------------------------------------------------------
/数据库.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据库.docx
--------------------------------------------------------------------------------
/数据结构/STL.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/STL.docx
--------------------------------------------------------------------------------
/数据结构/二进制文件的读写.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/二进制文件的读写.docx
--------------------------------------------------------------------------------
/数据结构/排序.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/排序.docx
--------------------------------------------------------------------------------
/数据结构/数据结构总述.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/数据结构总述.docx
--------------------------------------------------------------------------------
/数据结构/查找算法.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/查找算法.docx
--------------------------------------------------------------------------------
/数据结构/树.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/树.docx
--------------------------------------------------------------------------------
/数据结构/第二章算法.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/第二章算法.docx
--------------------------------------------------------------------------------
/数据结构/迭代器.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/迭代器.docx
--------------------------------------------------------------------------------
/笔记本候选.md:
--------------------------------------------------------------------------------
1 | 前注:
2 |
3 | 价格主要取自京东,买的时候个人觉得可以和品牌供货商谈。
4 |
5 | 对电脑配置不太熟悉的话,可以看每一款配置最后的优缺点评价和综合点评。
6 |
7 | ---
8 |
9 | 1、戴尔 G3
10 |
11 | 参考链接:
12 |
13 | https://item.jd.com/100006778346.html#crumb-wrap
14 |
15 | 参考价格:
16 |
17 | 京东:7999
18 |
19 | 配置:
20 |
21 | * 英特尔 9 代 i7 CPU(i7-9750H)
22 | * 16G 内存
23 | * 15.6 寸显示器(72%色域);
24 | * 1TB 硬盘(机械硬盘)
25 |
26 | 优点:
27 |
28 | * 性能强(9 代 i7 的 cpu);
29 | * 高性价比(这个价位,相对配置是顶尖的);
30 | * 大内存(16G 内存足够满足开发使用);
31 | * 屏幕好不伤眼睛(办公人员可以放心更多时间去使用电脑);
32 | * 显卡还可以,可以用于做深度学习、AI 计算等需要依赖于显卡的业务;
33 |
34 | 缺点:
35 |
36 | * 续航一般(2-3小时);
37 | * 比较重(2-2.5kg);
38 | * 笨重,不适合出差携带;
39 | * 多彩键盘;
40 |
41 | 综合点评:
42 |
43 | 适合对机器性能要求比较高,对移动性和便携性要求比较低的研发人员使用。
44 |
45 | 不适合需要一定便携性的出差人员能使用。
46 |
47 | ---
48 |
49 | 2、联想 ThinkPad X1 Carbon 2019
50 |
51 | 参考链接:
52 |
53 | https://item.jd.com/100006650700.html#crumb-wrap
54 |
55 | 参考价格:
56 |
57 | 京东:9999
58 |
59 | 配置:
60 |
61 | * 英特尔 i5 CPU(i5-8265U)
62 | * 8G 内存;
63 | * 14 寸显示器;
64 | * 512G SSD(高性能硬盘);
65 | * 支持 4G 移动上网
66 |
67 | 优点:
68 |
69 | * 便携性高,适合出差使用(重量 < 1.5kg,屏幕只有 14 寸但分辨率依然是 1080P,续航可以达到 8 个小时);
70 | * 国企传统采购品牌,售后一般比较 ok;
71 | * 内置支持手机 4G 上网(需付费订购相关服务);
72 |
73 | 缺点:
74 |
75 | * 配置差,性价比低(比1#贵 2000,但除了硬盘,配置都不如上面的);
76 | * 美帝良心想的口碑,不是网友瞎说的;
77 |
78 | 综合评价:
79 |
80 | 适合对机器性能要求不高,但需要经常出差的人士使用。
81 |
82 | 不适合对电脑性能要求高的研发人员使用。
83 |
84 | ---
85 |
86 | 3、小米 Pro 2019
87 |
88 | 参考链接:
89 |
90 | https://item.jd.com/100003536681.html#crumb-wrap
91 |
92 | 参考价格:
93 |
94 | 京东:7299
95 |
96 | 配置:
97 |
98 | * 英特尔 i7 CPU(i7-8550U)
99 | * 16G 内存;
100 | * 15.6 寸显示器;
101 | * 512g SSD硬盘(高性能硬盘);
102 |
103 | 优点:
104 |
105 | * 小米,国产品牌,售后我觉得还算 ok;
106 | * 价格相对便宜;
107 | * 性价比中等;
108 | * 16G 内存足以满足一般开发需求;
109 | * cpu 的性能中等(但也比上面 thinkpad 好);
110 | * 高性能硬盘;
111 | * 续航强(5-8 小时);
112 | * 不适合玩游戏(办公专用的话,我觉得这条没毛病)
113 |
114 | 缺点:
115 |
116 | * cpu 性能不是特别好(大概是 1# 的 60~70%左右);
117 | * 重量中等(1.9kg);
118 | * 据说发热略高,风扇声音略大;
119 |
120 | 综合评价:
121 |
122 | 综合来看,性价比比较高,综合性能不突出,但也没有明显的缺陷。
123 |
124 | 同时适合对性能有一定要求的研发,和对便携性有要求的其他人员。
125 |
126 | 假如只考虑选购一款笔记本,但所有人都需要用的话,推荐用这款。否则推荐使用针对性更明确的不同款的组合。
127 |
128 | ---
129 |
130 | 4、Macbook Pro 17 款 13 寸
131 |
132 | 参考链接:
133 |
134 | https://item.jd.com/5225342.html
135 |
136 | 参考价格:
137 |
138 | 京东:9999
139 |
140 | 优点:
141 |
142 | * 续航超长,一般在 8~10 个小时;
143 | * 办公专用(国内外各大公司更爱使用 Mac 而不是 windows);
144 | * 实际性能超出同配置下的 windows 笔记本;
145 | * 有很多苹果系统专用的软件,可以提高生产力(做的 PPT 也更好看);
146 | * 便携性强(1.37kg,13 寸屏幕,高续航);
147 | * 内置 linux 命令行;
148 | * 适合前端、设计、产品经理、后端;
149 |
150 | 缺点:
151 |
152 | * 有一定上手难度,对没用过的人有学习成本;
153 | * 有一些 windows 的软件,在 mac 下没有同样的(需要找类似的软件);
154 | * 偏贵;
155 |
156 | 综合评价:
157 |
158 | 适合对电脑有一定了解,需要使用 linux 命令行的人。
159 |
160 | 适合从事软件研发业的任何人使用,并且大部分时候来说是最佳电脑。
161 |
162 | 但上手有一定门槛,也缺少一些 windows 下专用的软件。
--------------------------------------------------------------------------------
/网易云课堂/网易云课堂(DOM编程艺术).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(DOM编程艺术).docx
--------------------------------------------------------------------------------
/网易云课堂/网易云课堂(HTML和CSS).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(HTML和CSS).docx
--------------------------------------------------------------------------------
/网易云课堂/网易云课堂(JavaScript).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(JavaScript).docx
--------------------------------------------------------------------------------
/网易云课堂/网易云课堂(页面架构).docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(页面架构).docx
--------------------------------------------------------------------------------
/西安互联网开发招聘汇总(2019.5.24).md:
--------------------------------------------------------------------------------
1 | # 西安互联网开发招聘汇总
2 |
3 | ## 记得给star!
4 |
5 | 1、 农行软开:
6 |
7 | 类型:校招、社招
8 |
9 | 链接:https://job.abchina.com/rio/index.do?action=openHome
10 |
11 | 备注:校招要求硕士,英语6级,应届。社招主要是oracle和运维招聘
12 |
13 | ---
14 |
15 | 2、工行软开:
16 |
17 | 类型:校招、社招
18 |
19 | 链接:(社招)
20 |
21 | https://www.hotjob.cn/wt/ICBC/web/templet1000/index/corpwebPosition1000ICBC!getPostListByCondition?positionType=&brandCode=1&useForm=0&recruitType=2&showComp=true&pc.rowSize=7
22 |
23 | 备注:据说回复极慢或者不回复,需要在微信公众号上报名
24 |
25 | ---
26 |
27 | 3、浦发软开:
28 |
29 | 类型:社招
30 |
31 | 链接:https://news.spdb.com.cn/about_spd/recruitment/shzp/
32 |
33 | 备注:需要邮件发送给对方邮箱,据说回复也很慢
34 |
35 | ---
36 |
37 | 4、浙商银行软开
38 |
39 | 类型:社招
40 |
41 | 链接:https://zp.czbank.com.cn/zpweb/planController/gotoIndex.mvc?pageType=2
42 |
43 | 备注:目测不是纯开发岗,而是偏管理
44 |
45 | ---
46 |
47 | 5、中国联通西安研究院
48 |
49 | 类型:社招、校招
50 |
51 | 链接:http://zglt2019.zhaopin.com/job.html
52 |
53 | 备注:
54 | 1. 找到一个能内推的人,但不确定:https://www.v2ex.com/t/530214
55 | 2. 社招可以输入框输入【西安】然后点击搜索。
56 |
57 | ---
58 |
59 | 6、中国移动雄安研究院
60 |
61 | 类型:社招、校招
62 |
63 | 链接:
64 |
65 | http://hotjob.cn/wt/CMRI/web/index/webPosition210!getPostListByConditionShowPic?columnId=2&operational=59aea13bed21327e66d9d2f4cd21fa0a269760918a545757b657180ec974fd987b29225b861a6079fc744488b1d0af58ac033f6023c898bcc73ce086ab048794e22ea8ae2d0fd4de836f8303b05ff21043f3ded18ed3f35c7f7bf54cde740e092a6b5381a4dd5b11
66 |
67 | 备注:最近招人蛮多的
68 |
69 | ---
70 |
71 | 7、京东
72 |
73 | 类型:社招
74 |
75 | 链接:https://jobs.51job.com/yx/co3275932.html
76 |
77 | 备注:我不想去京东跟东哥当兄弟,略略略
78 |
79 | ---
80 |
81 | 8、奥比中光
82 |
83 | 类型:社招
84 |
85 | 链接:https://jobs.51job.com/xian-gxjs/co3030205.html
86 |
87 | 备注:
88 | 1. 奥比中光成立于2013年1月,是我国人工智能3D传感领域独角兽。公司总部位于深圳,在美国西雅图、上海、广州、西安设有分部。奥比中光是继苹果、微软、英特尔之后,全球第四家,也是全亚洲第一家能量产消费级3D传感器的厂商。目前,奥比中光已推出多款3D传感摄像头,产品已应用于智能手机、智能机器人、智慧客厅、新零售、VR/AR、工业测量等多领域。2018年5月,奥比中光完成由蚂蚁金服领投的超两亿美金D轮融资,估值已超10亿美元。
89 | 2. 听说氛围可能不好,还996(https://www.zhihu.com/question/65974065)
90 |
91 | ---
92 |
93 | 9、中行软开
94 |
95 | 类型:校/社招、实习生招聘
96 |
97 | 链接:http://campus.chinahr.com/views/boc-spring2019/jobs.html
98 |
99 | 备注:似乎招聘已经结束了,我发邮件咨询中,尚未收到回复。
100 |
101 | ---
102 |
103 | 10、海康威视
104 |
105 | 类型:社招
106 |
107 | 链接:https://jobs.51job.com/xian/co2546282.html
108 |
109 | 备注:钱感觉也不多
110 |
111 | ---
112 |
113 | 11、大华
114 |
115 | 类型:社招
116 |
117 | 链接:https://jobs.51job.com/xian/co180850.html
118 |
119 | 备注:下限通常1w,上限不超过2w
120 |
121 | ---
122 |
123 | 12、国电南瑞西安研发
124 |
125 | 类型:社招
126 |
127 | 链接:没找到
128 |
129 | 备注:据说【没有编制,都是劳务派遣,待遇也一般】
130 | https://www.zhihu.com/question/286615325/answer/464746737
131 |
132 | ---
133 |
134 | 13、CVTE
135 |
136 | 类型:社招、校招
137 |
138 | 链接:http://hr.cvte.com/v2/positions?place=0&type=0&time=0&keyword=&page=0
139 |
140 | 备注:似乎没有常规的前后端开发岗位,西安甚至没几个岗位。
141 |
142 | ---
143 |
144 | 14、海尔优家智能科技
145 |
146 | 类型:社招、实习生
147 |
148 | 链接:
149 | https://www.zhipin.com/gongsir/5532224e28b7ea7d1nZz39i7Fw~~.html?city=101110100&ka=sel_city_101110100
150 |
151 | 备注:
152 | 前端岗位(12-18K)
153 |
154 | ``https://www.zhipin.com/job_detail/e7419337b61404d81XN409y9GVo~.html?ka=comp_joblist_3``
155 |
156 | ---
157 |
158 | 15、浪潮
159 |
160 | 类型:社招
161 |
162 | 链接:https://vip.liepin.com/7893220/joblist.shtml
163 |
164 | 备注:目测只有Java
165 |
166 | ---
167 |
168 | 16、新华三
169 |
170 | 类型:社招
171 |
172 | 链接:https://jobs.51job.com/xian/co299000.html
173 |
174 | 备注:工资1w-2w
175 |
176 | ---
177 |
178 | 17、360企业安全
179 |
180 | 类型:社招
181 |
182 | 链接:
183 | https://www.zhipin.com/gongsir/92dd1835f489ca0e1XN-39i-.html?city=101110100&ka=sel_city_101110100
184 |
185 | 备注:只有产品经理岗
186 |
187 | ---
188 |
189 | 18、大疆
190 |
191 | 类型:社招,校招
192 |
193 | 链接:(社招)https://we.dji.com/zh-CN/social?city=6101
194 |
195 | 备注:没有常规的前后端开发岗,反而是偏硬件
196 |
--------------------------------------------------------------------------------