-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblog(1).sql
272 lines (231 loc) · 124 KB
/
blog(1).sql
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
-- phpMyAdmin SQL Dump
-- version 4.7.7
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: 2018-06-13 04:45:45
-- 服务器版本: 10.1.30-MariaDB
-- PHP Version: 7.2.2
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `blog`
--
-- --------------------------------------------------------
--
-- 表的结构 `articles`
--
CREATE TABLE `articles` (
`article_id` int(11) NOT NULL,
`username` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名',
`abstract` varchar(255) NOT NULL DEFAULT '' COMMENT '摘要',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
`content` text NOT NULL COMMENT '文字内容',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`read_num` int(255) NOT NULL DEFAULT '0' COMMENT '阅读数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章表';
--
-- 转存表中的数据 `articles`
--
INSERT INTO `articles` (`article_id`, `username`, `abstract`, `title`, `content`, `create_time`, `read_num`) VALUES
(1, 'Elenore', ' \r\n \r\n正则表达式是由一个字符序列形成的搜索模式。\r\n \r\n \r\n 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。\r\n \r\n \r\n 正则表达式可以是一个简单的字符,或一个更复杂的模式。\r\n \r\n \r\n 正则表达式可用于所有文本搜索和文本替换的操作。\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 前几天和朋友聊起自控力这个话题,大家纷纷表示:拭心你自控力太强了,博客写了三四年,公众号也运营的这\r\n \r\n', '3算法第三方', '<p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n <br class=\"Apple-interchange-newline\" />\n正则表达式是由一个字符序列形成的搜索模式。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 正则表达式可以是一个简单的字符,或一个更复杂的模式。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 正则表达式可用于所有文本搜索和文本替换的操作。\n </p>\n<br />\n <p style=\"font-size:13.3333px;\">\n <img src=\"http://localhost/web_project/kindeditor/attached/image/20180601/20180601084858_60328.png\" alt=\"\" />\n </p>\n <p style=\"font-size:13.3333px;\">\n <br />\n </p>\n <p style=\"font-size:13.3333px;\">\n 前几天和朋友聊起自控力这个话题,大家纷纷表示:拭心你自控力太强了,博客写了三四年,公众号也运营的这\n </p>\n</p>', 1527837283, 8),
(2, '123123', '\n \n \n正则表达式是由一个字符序列形成的搜索模式。\n \n \n 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。\n \n \n 正则表达式可以是一个简单的字符,或一个更复杂的模式。\n \n \n 正则表达式可用于所有文本搜索和文本替换的操作。\n \n\n \n \n \n \n \n \n \n 前几天和朋友聊起自控力这个话题,大家纷纷表示:拭心你自控力太强了,博客写了三四年,公众号也运营的这\n \n', '3算法第三方', '<p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n <br class=\"Apple-interchange-newline\" />\n正则表达式是由一个字符序列形成的搜索模式。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 正则表达式可以是一个简单的字符,或一个更复杂的模式。\n </p>\n <p style=\"font-size:15px;font-family:"color:#333333;background-color:#FFFFFF;\">\n 正则表达式可用于所有文本搜索和文本替换的操作。\n </p>\n<br />\n <p style=\"font-size:13.3333px;\">\n <img src=\"http://localhost/web_project/kindeditor/attached/image/20180601/20180601084858_60328.png\" alt=\"\" />\n </p>\n <p style=\"font-size:13.3333px;\">\n <br />\n </p>\n <p style=\"font-size:13.3333px;\">\n 前几天和朋友聊起自控力这个话题,大家纷纷表示:拭心你自控力太强了,博客写了三四年,公众号也运营的这\n </p>\n</p>', 1527837456, 0),
(6, '123123', '果。\n主要是不太理解里面的细节。比\n是什么意思?为什么会这么写?下有第2个正则 这么写有必要么?是不是第一个就完全可以满足提取IMG标签的要求了?\n果。\n主要是不太理解里面的细节。比如\\b[^>]*这是什么意思?为什么会这么写?下有第2个正则 这么写有必要么?是不是第一个就完全可以满足提取IMG标签的要求了?', '', '<p>\n<pre>果。\n主要是不太理解里面的细节。比</pre>\n<pre>是什么意思?为什么会这么写?下有第2个正则 这么写有必要么?是不是第一个就完全可以满足提取IMG标签的要求了?</pre>\n<pre>果。\n主要是不太理解里面的细节。比如\\b[^>]*这是什么意思?为什么会这么写?下有第2个正则 这么写有必要么?是不是第一个就完全可以满足提取IMG标签的要求了?</pre>\n</p>', 1527838035, 0),
(8, '123123', 'escape()不对“+”编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。 encodeURIComponent() 最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。 因此,“; / ? : @ & = + $ , #”,这些在encodeURI()中不被编码的符号,在enc', 'zzzzzzzzzzllllllllooooo', '<p>\n<pre><span style=\"color:#e8bf6a;\">\n<pre><span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">escape()不对“+”编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">encodeURIComponent()</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">因此,“; / ? : @ & = + $ , #”,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">encodeURIComponent()相比encodeURI()要更加彻底。</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\">为什么优先使用encodeURIComponent而不是escape?</span> <span style=\"color:#4F4F4F;font-family:"font-size:16px;background-color:#FFFFFF;\"> escape方法并不编码字符+。而我们知道,在用户提交的表单字段中,如果有空格,则会被转化为+字符,而服务器解析的时候则会认为+号代表空格。由于这个缺陷,escape方法并不能正确地处理所有的非ASCII字符,你应当尽量避免使用escape方法,取而代之,你最好选择 encodeURIComponent()方法。</span> </pre>\n</span></pre>\n</p>', 1527857816, 0),
(24, '123123', '<p>\n <p style=\"font-size:15px;font-family:&quot;color:#333333;background-color:#FFFFFF;\">\n <br class=\"Apple-interchange-newline\" />\n正则表达式是由一个字符序列形成的搜索模式。\n </p>\n <p style=\"font-size:15px;font-family:&quot;color:#333333;ba', '', '<p>\n <p><br />\n<span> </span><p style=\"font-size:15px;font-family:&quot;color:#333333;background-color:#FFFFFF;\"><br />\n<span> </span><br class=\"Apple-interchange-newline\" /><br />\n正则表达式是由一个字符序列形成的搜索模式。<br />\n<span> </span></p><br />\n<span> </span><p style=\"font-size:15px;font-family:&quot;color:#333333;background-color:#FFFFFF;\"><br />\n<span> </span>当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。<br />\n<span> </span></p><br />\n<span> </span><p style=\"font-size:15px;font-family:&quot;color:#333333;background-color:#FFFFFF;\"><br />\n<span> </span>正则表达式可以是一个简单的字符,或一个更复杂的模式。<br />\n<span> </span></p><br />\n<span> </span><p style=\"font-size:15px;font-family:&quot;color:#333333;background-color:#FFFFFF;\"><br />\n<span> </span>正则表达式可用于所有文本搜索和文本替换的操作。<br />\n<span> </span></p><br />\n<br /><br />\n<span> </span><p style=\"font-size:13.3333px;\"><br />\n<span> </span><img src=\"http://localhost/web_project/kindeditor/attached/image/20180601/20180601084858_60328.png\" alt=\"\" /><br />\n<span> </span></p><br />\n<span> </span><p style=\"font-size:13.3333px;\"><br />\n<span> </span><br /><br />\n<span> </span></p><br />\n<span> </span><p style=\"font-size:13.3333px;\"><br />\n<span> </span>前几天和朋友聊起自控力这个话题,大家纷纷表示:拭心你自控力太强了,博客写了三四年,公众号也运营的这<br />\n<span> </span></p><br />\n</p>\n</p>', 1527837641, 0),
(25, '123123', '判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。\n \n \n \n \n \n scrollTop为滚动条在Y轴上的滚动距离。\n \n \n \n \n \n clientHeight为内容可视区域的高度。\n \n \n \n \n \n scrollHeight为内容可视区域的高度加上溢出(滚动)的距离。\n \n \n \n \n \n 从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollT', 'JS如何判断滚动条是否滚到底部', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n scrollTop为滚动条在Y轴上的滚动距离。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n clientHeight为内容可视区域的高度。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n scrollHeight为内容可视区域的高度加上溢出(滚动)的距离。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollTop + clientHeight == scrollHeight。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 代码如下(兼容不同的浏览器)。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //滚动条在Y轴上的滚动距离\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getScrollTop(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.body){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     bodyScrollTop = document.body.scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.documentElement){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     documentScrollTop = document.documentElement.scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //文档的总高度\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getScrollHeight(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.body){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     bodyScrollHeight = document.body.scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.documentElement){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     documentScrollHeight = document.documentElement.scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //浏览器视口的高度\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getWindowHeight(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var windowHeight = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.compatMode == \"CSS1Compat\"){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     windowHeight = document.documentElement.clientHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }else{\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     windowHeight = document.body.clientHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return windowHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n window.onscroll = function(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(getScrollTop() + getWindowHeight() == getScrollHeight()){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     alert(\"已经到最底部了!!\");\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n };\n </div>\n</p>', 1527912533, 0),
(26, '123123', '判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。\n \n \n \n \n \n scrollTop为滚动条在Y轴上的滚动距离。\n \n \n \n \n \n clientHeight为内容可视区域的高度。\n \n \n \n \n \n scrollHeight为内容可视区域的高度加上溢出(滚动)的距离。\n \n \n \n \n \n 从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollT', 'JS如何判断滚动条是否滚到底部', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop、clientHeight、scrollHeight。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n scrollTop为滚动条在Y轴上的滚动距离。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n clientHeight为内容可视区域的高度。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n scrollHeight为内容可视区域的高度加上溢出(滚动)的距离。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollTop + clientHeight == scrollHeight。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n 代码如下(兼容不同的浏览器)。\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //滚动条在Y轴上的滚动距离\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getScrollTop(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.body){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     bodyScrollTop = document.body.scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.documentElement){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     documentScrollTop = document.documentElement.scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return scrollTop;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //文档的总高度\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getScrollHeight(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.body){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     bodyScrollHeight = document.body.scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.documentElement){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     documentScrollHeight = document.documentElement.scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return scrollHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n //浏览器视口的高度\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n function getWindowHeight(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   var windowHeight = 0;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(document.compatMode == \"CSS1Compat\"){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     windowHeight = document.documentElement.clientHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }else{\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     windowHeight = document.body.clientHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   return windowHeight;\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n \n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n window.onscroll = function(){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   if(getScrollTop() + getWindowHeight() == getScrollHeight()){\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n     alert(\"已经到最底部了!!\");\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n   }\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n };\n </div>\n</p>', 1527912543, 0),
(27, '123123', '在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于‘类的\',而是通过构造函数(constructor)和原型链(prototype chains)实现的。但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都', '详解Javascript中prototype属性(推荐)', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于‘类的\',而是通过构造函数(constructor)和原型链(prototype chains)实现的。但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让原型对象的写法更加清晰、更像面向对象编程的语法而已。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   按照我的习惯,在写文章前我会给出文章目录。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   以下内容会分为如下小节:\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   1.构造函数的简单介绍\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   2.构造函数的缺点\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   3.prototype属性的作用\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   4.原型链(prototype chain)\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   5.constructor属性\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     5.1:constructor属性的作用\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   6.instanceof运算符\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <span style=\"line-height:25.2px;background-color:#FFFF00;\"><strong>1.构造函数的简单介绍</strong></span>\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   在我的一篇Javascript 中构造函数与new命令的密切关系文章中,详细了介绍了构造函数的概念和特点,new命令的原理和用法等,如果对于构造函数不熟悉的同学,可以前往细细品味。以下做一个简单的回顾。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   所谓构造函数,就是提供了一个生成对象的模板并描述对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。总的来说,构造函数就是对象的模板,对象就是构造函数的实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   构造函数的特点有:\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     a:构造函数的函数名首字母必须大写。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     b:内部使用this对象,来指向将要生成的对象实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     c:使用new操作符来调用构造函数,并返回对象实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   看一个最简单的一个例子。\n </p>\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n </div>\n</p>', 1527912632, 0),
(28, '123123', '大部分功能,ES5都可以做到,新的class写法只是让原型对象的写法更加清晰、更像面向对象编程的语法而已。\n \n \n   按照我的习惯,在写文章前我会给出文章目录。\n \n \n   以下内容会分为如下小节:\n \n \n   1.构造函数的简单介绍\n \n \n   2.构造函数的缺点\n \n \n   3.prototype属性的作用\n \n \n   4', '详解', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n 大部分功能,ES5都可以做到,新的class写法只是让原型对象的写法更加清晰、更像面向对象编程的语法而已。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   按照我的习惯,在写文章前我会给出文章目录。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   以下内容会分为如下小节:\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   1.构造函数的简单介绍\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   2.构造函数的缺点\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   3.prototype属性的作用\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   4.原型链(prototype chain)\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   5.constructor属性\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     5.1:constructor属性的作用\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   6.instanceof运算符\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <span style=\"line-height:25.2px;background-color:#FFFF00;\"><strong>1.构造函数的简单介绍</strong></span>\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   在我的一篇Javascript 中构造函数与new命令的密切关系文章中,详细了介绍了构造函数的概念和特点,new命令的原理和用法等,如果对于构造函数不熟悉的同学,可以前往细细品味。以下做一个简单的回顾。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   所谓构造函数,就是提供了一个生成对象的模板并描述对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。总的来说,构造函数就是对象的模板,对象就是构造函数的实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   构造函数的特点有:\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     a:构造函数的函数名首字母必须大写。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     b:内部使用this对象,来指向将要生成的对象实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n     c:使用new操作符来调用构造函数,并返回对象实例。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   看一个最简单的一个例子。\n </p>\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n </div>\n</p>', 1527917569, 0),
(29, '123123', '上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n \n \n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改', '实现的话就更简单', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n 上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上。\n </p>\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <br />\n </p>\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n </div>\n</p>', 1527917601, 0),
(30, '123123', '上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n \n \n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改', '实现的话就更简单', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n 上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上。\n </p>\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <br />\n </p>\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n </div>\n</p>', 1527917647, 0),
(31, '123123', '上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n \n \n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改', '实现的话就更简单', '<p>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n 上面代码中,如果将hobby方法放在原型对象上,那么两个实例对象都共享着同一个方法。我希望大家都能理解的是,对于构造函数来说,prototype是作为构造函数的属性;对于对象实例来说,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n   原型对象的属性不是对象实例的属性。对象实例的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上。\n </p>\n </p>\n <p style=\"font-size:14px;color:#222222;font-family:tahoma, arial, "background-color:#FFFFFF;\">\n <br />\n </p>\n </div>\n <div style=\"margin:0px;padding:0px;color:#393939;font-family:verdana, "font-size:14px;background-color:#FAF7EF;\">\n </div>\n</p>', 1527917651, 2),
(32, 'mazong', 'helo', '测试热门文章', ' <p>helo</p>\n', 1527918369, 70),
(33, 'mazong', 'helo', '测试', ' <p>helo</p>\n', 1527918378, 7),
(34, 'mazong', 'aaaaaaaaaaaaaaaaaasdasd', '热门文章', 'aaaaaaaaaaaaaaaaaasdasd', 1528806706, 240),
(35, 'mazong', 'helo', '问题不大', ' <p>helo</p>\n', 1525142993, 27),
(36, 'mazong', 'heloll', '无伤大雅', '<p>\n heloll\n</p>', 1525142993, 0),
(37, 'mazong', '这是摘要', '为了凑文章数量', '为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量为了凑文章数量', 1234567890, 0),
(44, 'mazong', '啦啦啦啦啦啦', '巴拉巴拉巴拉', '啦啦啦啦啦啦', 1528378835, 0),
(45, 'mazong', '测试编辑文章hhh,加多了个分类\n<p', '黄泽润牛逼', '<pre><span><b>测试编辑文章hhh,加多了个分类</b></span></pre>\n<pre><span style=\"color:#cc7832;font-weight:bold;\">var </span>content = <span style=\"color:#9876aa;\">$</span>(<span style=\"color:#6a8759;\">\"#editor_id\"</span>).<span style=\"color:#ffc66d;\">val</span>()<span style=\"color:#cc7832;\">; </span><span style=\"color:#808080;\">//</span><span style=\"color:#808080;font-family:\'宋体\';\">获取文本框的内容</span></pre>\n<pre><span style=\"color:#808080;font-family:\'宋体\';\"> </span></pre>\n<pre><span style=\"color:#808080;font-family:\'宋体\';\">\n<pre><span style=\"color:#808080;\">// </span><span style=\"color:#808080;font-family:\'宋体\';\">不用预处理,到编辑界面会自动转换成原有内容</span></pre>\n<pre><span style=\"color:#808080;font-family:\'宋体\';\"> </span><span style=\"color:#ffc66d;\">KindEditor</span>.<span style=\"color:#9876aa;\">html</span>(<span style=\"color:#6a8759;\">\"#editor_id\"</span><span style=\"color:#cc7832;\">, </span>data.article[<span style=\"color:#6a8759;\">\'content\'</span>])<span style=\"color:#cc7832;\">;</span></pre>\n<br />\n</span></pre>', 1528726268, 22),
(48, 't', '', '', '', 1528767168, 0),
(49, 't', '', '', '', 1528767708, 0),
(50, 'mazong', '种种原因:\n\n\n 我们很多人都有过写点东西的冲动,只是又因为种种原因没有', '我们为什么应该坚持写博客', '<h1>\n 种种原因:\n</h1>\n<p>\n 我们很多人都有过写点东西的冲动,只是又因为种种原因没有发表。\n</p>\n<ol>\n <li>\n <p>\n 写着写着,挤不出字来了。\n </p>\n </li>\n <li>\n <p>\n 总感觉自己的内心想法表达不出来。\n </p>\n </li>\n <li>\n <p>\n 感觉写了没什么用,自己都明白了干嘛还要写。\n </p>\n </li>\n <li>\n <p>\n 怕写出来被人笑话被人喷。(这个也是我经常害怕的)\n </p>\n </li>\n <li>\n <p>\n 写博客的费脑力,耗时间。还不如拿这精力去再学更多的东西。\n </p>\n </li>\n</ol>\n<h1>\n <a></a>关于以上几点我的理解:\n</h1>\n<ul>\n <li>\n <p>\n 第一点:万事开头难,我们不管做什么事,最难的就是从零到一的过程。只要你跨过了,什么都是那么的自然。不管写的多差,你就要坚持,然后慢慢得就有了感觉。\n </p>\n </li>\n <li>\n <p>\n 第二点:从一个方面说明,我们的表达能力还不行(这正好可以锻炼我们的表达能力)。从另一方面也说明,你对这个问题或是知识点了解得还不够透彻。如果你知道了来龙去脉、前因后果不会说不清除的(借此我们可以更加深入的学习)。\n </p>\n </li>\n <li>\n <p>\n 第三点:写博客当然有用,不然那么多牛人为什么写博客。首先,人都有一个遗忘规律。现在你认为已经烂记于心的东西,几个月后说不定就模糊了。其实,很多时候我们都是在反复的记忆遗忘做斗争。不说别的,现在要你写个数据库ado连接你写得出来吗?现在要你写个原生的ajax你写得出来吗?其实,这都是我们读书的时候就写过好多遍的,不如工作中不是经常手动去写很可能现在就忘记了。然,我们写博客有效的加深记忆。万一,还是忘记了,我们查找自己的博客也是很快就能回忆起来的。(其实,我们很多时候都是在反复的在学以前学过的东西,如果我们能过目不忘以前所接触、所学过的,我们一定是牛人了)\n </p>\n </li>\n <li>\n <p>\n 第四点:笑就笑呗,哪个牛人不是从菜鸟过来的。我不写教程,我写笔记写心得总可以吧。喷子,是少不了的。就是世上的蚊子无法灭绝。(正好可以锻炼你强大的内心)\n </p>\n </li>\n <li>\n <p>\n 第五点:费脑力,确实。耗时间,也是。不过这是值得的。为什么这么说,不管做什么,都是要有付出的。(不过,在后期越写越顺,脑力和时间也就越用越少,就像平时说话那么自然)\n </p>\n </li>\n</ul>\n<h1>\n <a></a>好处多多:\n</h1>\n<ol>\n <li>\n <p>\n 可以结交更多的朋友。和同档次和高于你档次的人做朋友,你可以学到很多。(近朱者赤,同道的朋友会有一种暗自竞争的动力)\n </p>\n </li>\n <li>\n <p>\n 在我们博文写成,会有很多道友阅读。很多我们自己认为是对的,实际上是错误的东西、或是我们难以发现的错误,热心的道友会帮你指出。这是一个难得的成长机会。\n </p>\n </li>\n <li>\n <p>\n 在写博客的过程中,我们肯定会遇到这样或那样的疑问会去查资料。在这过程,我们可能会引发更多的知识或疑问。这个时候问题本身可能就不是那么重要的,引申出来的问题和知识带你会让我们学习到更多。\n </p>\n </li>\n <li>\n <p>\n 很多时候,我们也会有心或是无心帮到一些初学者或是遇到同样问题的人。在得到他人的感谢或是肯定的时候心里满满的美(或是虚荣心吧)。\n </p>\n </li>\n <li>\n <p>\n 通过博客轨迹,我们以后也可以看到自己的成长轨迹。我们都做过些什么,以后应该怎么做,以至于不忘初心,不迷失自己。\n </p>\n </li>\n <li>\n <p>\n 还有一点,也许不是那么明显。我觉得博客是一个非常好的简历。不仅可以看到你的技术水平,还可以看到你平时的关注内容、评论言辞,从而看出你的为人和人品。\n </p>\n </li>\n</ol>\n<h1>\n <a></a>我们应该怎样去写好博客:\n</h1>\n<ol>\n <li>\n <p>\n 首先,我们要么就不写要么用心写。也不是说一定要写得多么牛逼,起码用心了,我们就有长进。如果随意滥竽充数,那就真的是浪费时间了。用心了,也不一定就是好的博文,但是会慢慢的一篇篇的变成好的博文。\n </p>\n </li>\n <li>\n <p>\n 然后,我们需要假想观众。我们写出来的东西,总是会有人去读的,起码自己会读吧。所以,一定要以能让别人读懂为基础理念。然后就是怎样能让别人更加容易读懂。\n </p>\n </li>\n <li>\n <p>\n 想象我们的读者是个初学者。不要一开始,在认为自己懂了的前提直接写下结论。(就像注释一样,也许我们写代码的时候整个逻辑都清晰明了。不过几个后,就要把代码从头理解了。所以,我们必要的时候会标上注释。我们假想对象是初学者,那样我们以后看自己的博客也会马上进入状态理解以前是要表达的意思)。\n </p>\n </li>\n <li>\n <p>\n 我们在看某本书的时候就开始计划着,我应该怎样更好的把自己现在看的这节通过博文的方式表达出来,而让读者看得懂。(有个这个想法,你看书会更加的专心,会去了解其原理。而不是像有时候,似懂非懂的情况下继续接着看),我们通过博文形式记录自己的读书笔记,会要比只是把书浏览一遍,然后过几个月又忘记了,然后又去读,要好的多。\n </p>\n </li>\n</ol>\n<p>\n \n</p>\n<p>\n 我注册博客园已经整整五年了,真正开始写博客也只是近一年的事情,以前没写也是因为上面的“种种原因”。然而,正是这一年,是我在程序员的这条道路上,成长最多最快也是这一年。也不是说写博客就真的会让你想开挂般成长。只是真的可以引发很多积极的东西,一些平时你不会去做的东西或者难以坚持的东西。\n</p>\n<p>\n \n</p>\n<p>\n 最后附上一副图,平时我群里群友闲聊时的镇群图。 (一图足以解释标题的疑问)\n</p>\n<p>\n <img src=\"http://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/PgqYrEEtEnqY9K7VxFNZoNP6IzOaBsBia36grvXSk5TDFPPAG2Ylp3gFSnCwhzOBJiaBXQicxGqqhk2dccBzIaqFw/640?wx_fmt=png\" alt=\"640?wx_fmt=png\" style=\"height:auto;\" /> \n</p>', 1528803224, 34),
(51, 'mazong', '开发者正把repos迁移到GitLab等其他Git托管平台…', '收购 GitHub 滔天争议后,微软回应一切', '<blockquote>\n <p>\n 开发者正把repos迁移到GitLab等其他Git托管平台……\n </p>\n <p>\n GitHub的Atom文本编辑器会与微软VS Code存在明显目标用户重叠……\n </p>\n <p>\n GitHub上同样聚集了数不清的私有repos,而这些代码库的享有者多数是与微软有着直接竞争关系的公司……\n </p>\n</blockquote>\n<p>\n 近日,在微软“<a href=\"http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650698800&idx=1&sn=51a3fd3b3d0b11fd120815ca80de45a4&chksm=bea605e389d18cf54e69674716565bfac1c172938e82f66e2239be064c3c9e980e5f8625c6db&scene=21#wechat_redirect\" target=\"_blank\">以75亿美金收购全球最大的编程及代码托管网站GitHub</a>”一事的敲定,引发了开源领域众多开发者对该收购案件的争议。毕竟,逐渐向开源靠拢的微软需要的还是时间的考验。\n</p>\n<p>\n 收购完成后,GitHub将由Nat Friedman负责领导,同时他还向微软云计算与人工智能事业部执行副总裁 Scott Guthrie 报告工作。Friedman原是Xamarin的前任CEO,2016年Xamarin被微软收购,为开发者提供.NET移动应用跨平台解决方案。\n</p>\n<p>\n 据了解,Xamarin堆栈的核心部分是开源的,此前这家公司原名Ximan,是为开发开源项目GNOME创建的。从表面上看,他的上任多少平息了开源开发者对此次收购的诸多担忧,但这或许是暂时的。\n</p>\n<p>\n <img src=\"https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/Pn4Sm0RsAuiaIA3priakCZyeLIQkEs464ylFS7piavH4aVwjA8dMia2vm0slAX5iaYIr0br6qTaUyrgVuiaHCrIHQXRw/640?wx_fmt=png\" alt=\"640?wx_fmt=png\" /> \n</p>\n<p>\n Nat Friedman:“我的码农生涯,始于6岁那一年。”\n</p>\n<p>\n 为了进一步与社区开发者进行交流,近日,Friedman在美国社交平台Reddit的“Ask Me Anything”(AMA)上回答了网友关于收购的问题。\n</p>\n<p>\n <img src=\"https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/Pn4Sm0RsAuiaIA3priakCZyeLIQkEs464yj1FfHUpBMBbd40pvqKicr2U1Qev85KCsaJOFYUQhibuHziagYNgEzlDvg/640?wx_fmt=png\" alt=\"640?wx_fmt=png\" /> \n</p>\n<p>\n Friedman谈到,\n</p>\n<blockquote>\n <p>\n 微软并不打算在GitHub上做太多改变……虽然GitHub和Visual Studio Team Services之间会“完全整合”,但在产品服务或发展轨迹方面不会有任何根本性的变化。\n </p>\n <p>\n 有开发者担心:GitHub开发与微软开发之间存在重叠,情况也确会如此。 GitHub和微软都开发了基于Electron的面向开发者的开源文本编辑器,这是一个使用JavaScript、HTML和CSS的应用程序开发框架。GitHub有Atom;微软有Visual Studio。 两者的开发将继续进行,因为,开发者对他们使用的工具特别专一:如果被迫使用Atom,Visual Studio Code用户将不会高兴,反之亦然。\n </p>\n</blockquote>\n<p>\n 以下,CSDN摘编了Friedman的十一个经典回答,分享给大家。\n</p>\n<p>\n 1、如何看待开发者正把repos迁移到GitLab等其他Git托管平台的行为?\n</p>\n<p>\n Nat Friedman:开发者思想独立自由,并始终秉持良好的怀疑态度。但我也承认,看到这么多开发者觉得有必要迁移自己的代码,让我感到很难过,我有责任认真对待他们的信任。\n</p>\n<p>\n 我认为,让开发者这样灵活的迁移repos非常棒,我也希望这两天匆忙迁移到别的平台上的开发者同样对考虑再迁回来持有一个开放的态度——如果我们依旧履行开放的承诺,并将GitHub变得更好的话。如果他们没有这么做,这也是他们的特权,我们仍会祝贺开发者应有的权利。\n</p>\n<p>\n 这也就意味着:GitHub团队对外公布的用户数量,无论是迁移走的还是关闭了账户的都属于极小的一部分,远远比不上本周GitHub新注册和感兴趣的数量。\n</p>\n<p>\n 2、考虑到GitHub的Atom文本编辑器会与微软VS Code存在明显目标用户重叠,微软接下来会有哪些打算?\n</p>\n<p>\n Nat Friedman:开发者确实对他们的setup非常关注,选择编辑器是开发者做得最个人的决定之一。语言改变、岗位改变,你往往会拿到一本新的电脑或升级OS系统,但对于编辑器的选择通常却是统一而终使用多年。我最不可能做的事情就是剥夺用户对Atom的选择权。\n</p>\n<p>\n Atom是一款非常棒的编辑器,拥有健康的社区环境,一群崇拜的粉丝,出色的设计,以及对实时协作的尝试。在微软,我们已经使用了Atom、VS Code、Sublime、Vim几乎每一款编辑器,我们希望开发者能在GitHub上任意选择自己喜欢的编辑器。\n</p>\n<p>\n 总而言之,我们将继续开发和支持Atom和VS Code。\n</p>\n<p>\n 3、这是否意味着微软产品的某些功能点(如Visual Studio Live Share)会最终与Atom重合吗?\n</p>\n<p>\n Nat Friedman:实际上, VS Code与Atom有着相当长的历史传承,此前微软和GitHub就已经在基础技术架构上协作多年:\n</p>\n<p>\n 最明显的是,我们开发了基于Electron的开源的面向程序员的文本编辑器。GitHub有Atom;微软有Visual Studio。最早我们是在2015年宣布与GitHub合作,当时Atom称为AtomShell,先于VS Code。\n</p>\n<p>\n Atom-ide采用了VS Code部分开发的Language Server协议。这允许VS Code和Atom之间共享高级语言支持。\n</p>\n<p>\n Atom-ide社区也在讨论采用调试适配器协议,该协议将启动Atom和VS Code之间的通用调试器支持。\n</p>\n<p>\n 我们对实时协作的最新发展非常兴奋,我希望Atom Teletyope和VS Code Live Share协调协议,以便使用任意一款编辑器的开发者最终可以实时编辑相同的文件。\n</p>\n<p>\n 4、你会继续保留GitHub注册账户,还是迫使用户使用微软账户以登陆GitHub呢?\n</p>\n<p>\n Nat Friedman:我们喜欢GitHub的登陆方式。你的GitHub账户是你作为开发者身份的标识,许多用户也都习惯了用户GitHub账户登录开发者工具和服务。所以,有可能的话,我们会添加GitHub作为登陆微软的选项。\n</p>\n<p>\n 5、在GitHub上公有的项目repos会出现广告吗?\n</p>\n<p>\n Nat Friedman:不会。\n</p>\n<p>\n 举个例子:此前GitHub成立之初,SourceForge在互联网代码托管平台领域占据主导地位。SourceForge最终被一家媒体集团收购,这家企业主要依靠投放广告变现。结果,SourceForge成为弹窗广告和横幅广告的集散地,并让用户在接收更多广告的情况下延长了下载速度。GitHub干净的界面和以开发者为中心的策略被视为是对SourceForge的一种抗议。这显然是一种正确的路径。\n</p>\n<p>\n 6、你会愿意将GitHub文化中的哪种特质带到微软?\n</p>\n<p>\n Nat Friedman:GitHub中一件非常酷的事情是,GitHub自身也是运行在GitHub上,包括他们的销售、市场、法务实际上都是使用issue并提出请求通过全公司的协作。这意味着不同的团队都在一个开放的环境内工作,这非常有助于形成高效协作的文化。\n</p>\n<p>\n 7、你认为微软此前拒绝开源软件的想法是什么?\n</p>\n<p>\n Nat Friedman:恐惧。(Fear)\n</p>\n<p>\n 8、有计划将私有的repos像GitLab、BitBucket一样免费吗?\n</p>\n<p>\n Nat Friedman:感谢提问,回答这个问题还为时尚早,我没有确切的答案。我们希望GitHub为世界上每一个人所用,为每一个有机会成为开发者的人所用。\n</p>\n<p>\n 9、关于GitHub如何激励开源工作的展开,例如通过将Patreon或OpenCollective进行集成,对此你有何看法?\n</p>\n<p>\n Nat Friedman:这是一个非常有趣的问题,其实整个社区都在想要搞明白的一件事情。我们低估了所有的进步取决于世界各地个人和小团体对开源项目的决心。有很多人有着伟大的创意却没有很好的资源支持,某些项目的从事者一直因为没有合适的工作激励模式而难以继续。\n</p>\n<p>\n 另外,去年我推出了aigrant.org项目,可为那些追求有趣的开源AI项目的个人和小团体提供资金。我们已经发布了50多笔赠款,看到能尽微薄之力促成的卓越影响实在令人惊叹。\n</p>\n<p>\n 如果能做到GitHub这样大规模的更是令人惊叹。\n</p>\n<p>\n 10、GitHub上同样也聚集了数不清的私有repos,而这些代码库的享有者多数是与微软有着直接竞争关系的公司。很明显,利益冲突之下,微软接下来将如何证明私有托管的repos在由微软人员接管后依然是私有的?\n</p>\n<p>\n Nat Friedman:目前,微软拥有超过10亿的用户隐私信息,我们高度重视隐私安全的职责。GitHub已有相应的政策和条例以限制员工接触到私有的repos,甚至在微软的管控下将变得更为严格。\n</p>\n<p>\n 11、我是一名科学家,为科学研究软件做了大量编程工作。我们中有很多人都选择了GitHub以协作我们的软件项目,因为大学/机构级别的支持可以说十分匮乏。我的问题是:\n</p>\n<p>\n a.如何确保教育、公共部门和其他非盈利/公共资助的软件项目能够轻松访问GitHub,而不会给他们这些没有强大计算机背景的人增加额外负担呢?\n</p>\n<p>\n b.您是否知道独立非盈利教育机构如Software Carpentry和Data Carpentry,你是否会承诺通过财务支持这些组织训练更多的科研人员进行软件和数据的最佳实践?\n</p>\n<p>\n c.既然选择了微软的资源与GitHub开源平台进行融合,那么你是否开展一个由微软或GitHub完全资助的暑期学生开源计划(如谷歌的Summer of Code)?\n</p>\n<p>\n Nat Friedman:非常好的问题和想法。\n</p>\n<p>\n 对于GitHub上的研究人员和教育机构而言,如果有可能的话,我们希望GitHub为更多领域的人使用。你会希望我们在未来解决哪些问题呢?\n</p>\n<p>\n 我不太清楚Software Carpentry和Data Carpentry,回头我得了解了解去。\n</p>\n<p>\n 学生资助计划是一个有趣的想法。我认为我们应该探索找到并确认想要在开源领域一展拳脚的才能之士。真正的难题是在于如何调整结构性奖励,以便更多的高级人才为开源做出贡献。\n</p>\n<p>\n 微软最近开始支持Outreachy,这是朝向这个目标的一次很大的进步。\n</p>\n<p>\n 相关链接:\n</p>\n<p>\n https://www.reddit.com/r/AMA/comments/8pc8mf/im_nat_friedman_future_ceo_of_github_ama/\n</p>', 1528804154, 8),
(52, 'mazong', 'HTTP协议的主要特点可概括如下:\n\n\n 1.支持客户/服务器模式。2.简单', 'HTTP协议的主要特点', '<p>\n HTTP协议的主要特点可概括如下:\n</p>\n<p>\n 1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。\n</p>\n<p>\n <br />\n</p>\n<p>\n 严重来讲,计算机之间的通讯,归根究竟,是计算机中运转的次第和另一个计算机(或本计算机)中运转的次第中止通讯。也就是说,是计算机中的进程和另一个进程(另一个计算机中的或本计算机中的)中止通讯。进程就是运转着的次第。但为冗杂起见,本人就经常说成是“两个计算机中止通讯”。这样的烦琐说法并没有什么过失,但我们该当对这种说法有个准确的了解。\n</p>\n<p>\n 有时,将“计算机”和“计算机中的进程”辨别开来是很必要的。由于有时在一个计算机中同时运转多个进程,而每一个进程都在和其他计算机的进程中止通讯。假定笼统地说一个计算机同时和多个计算机中止通讯,那么就相比模糊。在这种状况下,用进程之间的通讯就随意把标题讲分明。\n</p>\n<p>\n (1) 运用层协议 HTTP是一个运用层协议。HTTP运用牢靠的、面向衔接的运输协议TCP,但HTTP协议自身并不提供牢靠性机制和重传机制。\n</p>\n<p>\n (2) 恳求/呼应 一旦树立了运输衔接(这经常称为树立了会话),阅读器端就向万维网服务器端发送HTTP恳求,服务器收到恳求后给出HTTP呼应。\n</p>\n<p>\n (3) 无外形 “无外形”(stateless)就是指每一个HTTP恳求都是独立的。万维网服务器不保管过来的恳求和过来的会话记载。这就是说,同一个用户再次造访同一个服务器时,只需服务器没有中止方式的更新,服务器的呼应就给出和以前被造访时相反的呼应。服务器不记载已经造访过的用户,也不记载某个用户造访过几次。\n</p>\n<p>\n (4) 双向传输 这在大少数状况下都是这样的:阅读器收回HTTP恳求,服务器给出HTTP呼应。\n</p>\n<p>\n (5) 才干商量 HTTP允许阅读器和服务器商量一些细节,如在传送数据时运用的字符集。发送端可指明它所能够提供的才干(capability),而接纳端也能够指明它所能够承受的才干。\n</p>\n<p>\n (6) 支撑高速缓存 为了延长呼应工夫,阅读器可将读取的万维网页面暂具有其高速缓存中。假定用户再次恳求该页面,则HTTP允许阅读器能够对服务器中止查询,以便必定自从上次缓存了该页面后页面的方式能否有变化。\n</p>\n<p>\n (7) 支撑代理服务器 HTTP允许在阅读器和服务器之间具有一个代理服务器。代理服务器将万维网页面寄存在本人的缓存中,并且从这缓存中取出页面答复阅读器的恳求。\n</p>', 1528804316, 3);
INSERT INTO `articles` (`article_id`, `username`, `abstract`, `title`, `content`, `create_time`, `read_num`) VALUES
(53, 'mazong', '近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文', '文本处理(七)——用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践', '<p>\n 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类领域特别是应用深度学习解决文本分类的相关的思路、做法和部分实践的经验。\n</p>\n<p>\n 业务问题描述:\n</p>\n<p>\n 淘宝商品的一个典型的例子见下图,图中商品的标题是“夏装雪纺条纹短袖t恤女春半袖衣服夏天中长款大码胖mm显瘦上衣夏”。淘宝网后台是通过树形的多层的类目体系管理商品的,覆盖叶子类目数量达上万个,商品量也是10亿量级,我们是任务是根据商品标题预测其所在叶子类目,示例中商品归属的类目为“女装/女士精品>>蕾丝衫/雪纺衫”。很显然,这是一个非常典型的短文本多分类问题。接下来分别会介绍下文本分类传统和深度学习的做法,最后简单梳理下实践的经验。\n</p>\n<br />\n<h2>\n <a></a>一、传统文本分类方法\n</h2>\n<p>\n 文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初一度发展到利用知识工程建立专家系统,这样做的好处是短平快的解决top问题,但显然天花板非常低,不仅费时费力,覆盖的范围和准确率都非常有限。\n</p>\n<br />\n<p>\n 后来伴随着统计学习方法的发展,特别是90年代后互联网在线文本数量增长和机器学习学科的兴起,逐渐形成了一套解决大规模文本分类问题的经典玩法,这个阶段的主要套路是人工特征工程+浅层分类模型。训练文本分类器过程见下图:\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145327978\" alt=\"\" /><br />\n<p>\n <br />\n</p>\n<p>\n 整个文本分类问题就拆分成了特征工程和分类器两部分,玩机器学习的同学对此自然再熟悉不过了\n</p>\n<p>\n 1.1 特征工程\n</p>\n<br />\n<p>\n 特征工程在机器学习中往往是最耗时耗力的,但却极其的重要。抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是“数据-->信息”的过程,决定了结果的上限,而分类器是“信息-->知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。\n</p>\n<p>\n 文本分类问题所在的自然语言领域自然也有其特有的特征处理逻辑,传统分本分类任务大部分工作也在此处。文本特征工程分位文本预处理、特征提取、文本表示三个部分,最终目的是把文本转换成计算机可理解的格式,并封装足够用于分类的信息,即很强的特征表达能力。\n</p>\n<p>\n 1)文本预处理\n</p>\n<p>\n 文本预处理过程是在文本中提取关键词表示文本的过程,中文文本处理中主要包括文本分词和去停用词两个阶段。之所以进行分词,是因为很多研究表明特征粒度为词粒度远好于字粒度,其实很好理解,因为大部分分类算法不考虑词序信息,基于字粒度显然损失了过多“n-gram”信息。\n</p>\n<p>\n 具体到中文分词,不同于英文有天然的空格间隔,需要设计复杂的分词算法。传统算法主要有基于字符串匹配的正向/逆向/双向最大匹配;基于理解的句法和语义分析消歧;基于统计的互信息/CRF方法。近年来随着深度学习的应用,WordEmbedding + Bi-LSTM+CRF方法逐渐成为主流,本文重点在文本分类,就不展开了。而停止词是文本中一些高频的代词连词介词等对文本分类无意义的词,通常维护一个停用词表,特征提取过程中删除停用表中出现的词,本质上属于特征选择的一部分。\n</p>\n<p>\n 经过文本分词和去停止词之后淘宝商品示例标题变成了下图“ / ”分割的一个个关键词的形式:\n</p>\n<div>\n 夏装 / 雪纺 / 条纹 / 短袖 / t恤 / 女 / 春 / 半袖 / 衣服 / 夏天 / 中长款 / 大码 / 胖mm / 显瘦 / 上衣 / 夏\n</div>\n<p>\n 2)文本表示和特征提取\n</p>\n<p>\n 文本表示:\n</p>\n<p>\n 文本表示的目的是把文本预处理后的转换成计算机可理解的方式,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型的示例如下:\n</p>\n<div>\n ( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)\n</div>\n<p>\n 一般来说词库量至少都是百万级别,因此词袋模型有个两个最大的问题:高纬度、高稀疏性。词袋模型是向量空间模型的基础,因此向量空间模型通过特征项选择降低维度,通过特征权重计算增加稠密性。\n</p>\n<br />\n<p>\n 特征提取:\n</p>\n<p>\n 向量空间模型的文本表示方法的特征提取对应特征项的选择和特征权重计算两部分。特征选择的基本思路是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、χ²统计量等。\n</p>\n<p>\n 特征权重主要是经典的TF-IDF方法及其扩展方法,主要思路是一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。\n</p>\n<p>\n 3)基于语义的文本表示\n</p>\n<p>\n 传统做法在文本表示方面除了向量空间模型,还有基于语义的文本表示方法,比如LDA主题模型、LSI/PLSI概率潜在语义索引等方法,一般认为这些方法得到的文本表示可以认为文档的深层表示,而word embedding文本分布式表示方法则是深度学习方法的重要基础,下文会展现。\n</p>\n<p>\n 1.2 分类器\n</p>\n<p>\n 分类器基本都是统计分类方法了,基本上大部分机器学习方法都在文本分类领域有所应用,比如朴素贝叶斯分类算法(Naïve Bayes)、KNN、SVM、最大熵和神经网络等等,传统分类模型不是本文重点,在这里就不展开了。\n</p>\n<br />\n<br />\n<h2>\n <a></a>二、深度学习文本分类方法\n</h2>\n<p>\n 上文介绍了传统的文本分类做法,传统做法主要问题的文本表示是高纬度高稀疏的,特征表达能力很弱,而且神经网络很不擅长对此类数据的处理;此外需要人工进行特征工程,成本很高。而深度学习最初在之所以图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性,。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。接下来会分别介绍:\n</p>\n<br />\n<p>\n 2.1 文本的分布式表示:词向量(word embedding)\n</p>\n<br />\n<p>\n 分布式表示(Distributed Representation)其实Hinton 最早在1986年就提出了,基本思想是将每个词表达成 n 维稠密、连续的实数向量,与之相对的one-hot encoding向量空间只有一个维度是1,其余都是0。分布式表示最大的优点是具备非常powerful的特征表达能力,比如 n 维向量每维 k 个值,可以表征 <img src=\"https://www.zhihu.com/equation?tex=k%5E%7Bn%7D\" alt=\"k^{n}\" /> 个概念。事实上,不管是神经网络的隐层,还是多个潜在变量的概率主题模型,都是应用分布式表示。下图是03年Bengio在 <a href=\"https://link.zhihu.com/?target=http%3A/www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf\" target=\"_blank\">A Neural Probabilistic Language Model</a>的网络结构:\n</p>\n<div>\n <img src=\"https://img-blog.csdn.net/20180611145357581\" alt=\"\" /> \n</div>\n<p>\n 这篇文章提出的神经网络语言模型(NNLM,Neural Probabilistic Language Model)采用的是文本分布式表示,即每个词表示为稠密的实数向量。NNLM模型的目标是构建语言模型:\n</p>\n<p>\n <img src=\"https://img-blog.csdn.net/20180611145444280\" alt=\"\" /> \n</p>\n词的分布式表示即词向量(word embedding)是训练语言模型的一个附加产物,即图中的Matrix C。\n<p>\n <br />\n</p>\n尽管Hinton 86年就提出了词的分布式表示,Bengio 03年便提出了NNLM,词向量真正火起来是google Mikolov 13年发表的两篇word2vec的文章 <a href=\"https://link.zhihu.com/?target=http%3A/ttic.uchicago.edu/~haotang/speech/1301.3781.pdf\" target=\"_blank\">Efficient Estimation of Word Representations in Vector Space</a> 和 <a href=\"https://link.zhihu.com/?target=https%3A/papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf\" target=\"_blank\">Distributed Representations of Words and Phrases and their Compositionality</a>,更重要的是发布了简单好用的<a href=\"https://link.zhihu.com/?target=https%3A/code.google.com/archive/p/word2vec/\" target=\"_blank\">word2vec工具包</a>,在语义维度上得到了很好的验证,极大的推进了文本分析的进程。下图是文中提出的CBOW 和 Skip-Gram两个模型的结构,基本类似于NNLM,不同的是模型去掉了非线性隐层,预测目标不同,CBOW是上下文词预测当前词,Skip-Gram则相反。<br />\n<p>\n <img src=\"https://img-blog.csdn.net/20180611145459705\" alt=\"\" /> \n</p>\n<p>\n 除此之外,提出了Hierarchical Softmax 和 Negative Sample两个方法,很好的解决了计算有效性,事实上这两个方法都没有严格的理论证明,有些trick之处,非常的实用主义。详细的过程不再阐述了,有兴趣深入理解word2vec的,推荐读读这篇很不错的paper:<a href=\"https://link.zhihu.com/?target=http%3A/www-personal.umich.edu/~ronxin/pdf/w2vexp.pdf\" target=\"_blank\">word2vec Parameter Learning Explained</a>。额外多提一点,实际上word2vec学习的向量和真正语义还有差距,更多学到的是具备相似上下文的词,比如“good”“bad”相似度也很高,反而是文本分类任务输入有监督的语义能够学到更好的语义表示,有机会后续系统分享下。\n</p>\n<p>\n 至此,文本的表示通过词向量的表示方式,把文本数据从高纬度高稀疏的神经网络难处理的方式,变成了类似图像、语音的的连续稠密数据。深度学习算法本身有很强的数据迁移性,很多之前在图像领域很适用的深度学习算法比如CNN等也可以很好的迁移到文本领域了,下一小节具体阐述下文本分类领域深度学习的方法。\n</p>\n<br />\n<p>\n 2.2 深度学习文本分类模型\n</p>\n<p>\n 词向量解决了文本表示的问题,该部分介绍的文本分类模型则是利用CNN/RNN等深度学习网络及其变体解决自动特征提取(即特征表达)的问题。\n</p>\n<br />\n<p>\n 1)fastText\n</p>\n<p>\n fastText 是上文提到的 word2vec 作者 Mikolov 转战 Facebook 后16年7月刚发表的一篇论文 <a href=\"https://link.zhihu.com/?target=https%3A/arxiv.org/pdf/1607.01759v2.pdf\" target=\"_blank\">Bag of Tricks for Efficient Text Classification</a>。把 fastText 放在此处并非因为它是文本分类的主流做法,而是它极致简单,模型图见下:\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145538666\" alt=\"\" /><br />\n<p>\n 原理是把句子中所有的词向量进行平均(某种意义上可以理解为只有一个avg pooling特殊CNN),然后直接接 softmax 层。其实文章也加入了一些 n-gram 特征的 trick 来捕获局部序列信息。文章倒没太多信息量,算是“水文”吧,带来的思考是文本分类问题是有一些“线性”问题的部分[from项亮],也就是说不必做过多的非线性转换、特征组合即可捕获很多分类信息,因此有些任务即便简单的模型便可以搞定了。\n</p>\n<p>\n 2)TextCNN\n</p>\n<p>\n 本篇文章的题图选用的就是14年这篇文章提出的TextCNN的结构(见下图)。fastText 中的网络结果是完全没有考虑词序信息的,而它用的 n-gram 特征 trick 恰恰说明了局部序列信息的重要意义。<a href=\"https://link.zhihu.com/?target=http%3A/colah.github.io/posts/2014-07-Understanding-Convolutions/\" target=\"_blank\">卷积神经网络(CNN Convolutional Neural Network)</a>最初在图像领域取得了巨大成功,CNN原理就不讲了,核心点在于可以捕捉局部相关性,具体到文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息。\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145551890\" alt=\"\" /><br />\n<p>\n TextCNN的详细过程原理图见下:\n</p>\n<p>\n <img src=\"https://img-blog.csdn.net/20180611145615872\" alt=\"\" /> \n</p>\n<p>\n TextCNN详细过程:第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5,这个可以类比为图像中的原始像素点了。然后经过有 filter_size=(2,3,4) 的一维卷积层,每个filter_size 有两个输出 channel。第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示了,最后接一层全连接的 softmax 层,输出每个类别的概率。\n</p>\n<p>\n 特征:这里的特征就是词向量,有静态(static)和非静态(non-static)方式。static方式采用比如word2vec预训练的词向量,训练过程不更新词向量,实质上属于迁移学习了,特别是数据量比较小的情况下,采用静态的词向量往往效果不错。non-static则是在训练过程中更新词向量。推荐的方式是 non-static 中的 fine-tunning方式,它是以预训练(pre-train)的word2vec向量初始化词向量,训练过程中调整词向量,能加速收敛,当然如果有充足的训练数据和资源,直接随机初始化词向量效果也是可以的。\n</p>\n<br />\n<p>\n 通道(Channels):图像中可以利用 (R, G, B) 作为不同channel,而文本的输入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),实践中也有利用静态词向量和fine-tunning词向量作为不同channel的做法。\n</p>\n<p>\n 一维卷积(conv-1d):图像是二维数据,经过词向量表达的文本为一维数据,因此在TextCNN卷积用的是一维卷积。一维卷积带来的问题是需要设计通过不同 filter_size 的 filter 获取不同宽度的视野。\n</p>\n<p>\n Pooling层:利用CNN解决文本分类问题的文章还是很多的,比如这篇 <a href=\"https://link.zhihu.com/?target=https%3A/arxiv.org/pdf/1404.2188.pdf\" target=\"_blank\">A Convolutional Neural Network for Modelling Sentences</a> 最有意思的输入是在 pooling 改成 (dynamic) k-max pooling ,pooling阶段保留 k 个最大的信息,保留了全局的序列信息。比如在情感分析场景,举个例子:\n</p>\n<div>\n “ 我觉得这个地方景色还不错,但是人也实在太多了 ”\n</div>\n<p>\n 虽然前半部分体现情感是正向的,全局文本表达的是偏负面的情感,利用 k-max pooling能够很好捕捉这类信息。\n</p>\n<p>\n 3)TextRNN\n</p>\n<br />\n<p>\n 尽管TextCNN能够在很多任务里面能有不错的表现,但CNN有个最大问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。CNN本质是做文本的特征表达工作,而自然语言处理中更常用的是递归神经网络(RNN, Recurrent Neural Network),能够更好的表达上下文信息。具体在文本分类任务中,Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的 \"n-gram\" 信息。\n</p>\n<p>\n RNN算是在自然语言处理领域非常一个标配网络了,在序列标注/命名体识别/seq2seq模型等很多场景都有应用,<a href=\"https://link.zhihu.com/?target=https%3A/www.ijcai.org/Proceedings/16/Papers/408.pdf\" target=\"_blank\">Recurrent Neural Network for Text Classification with Multi-Task Learning</a>文中介绍了RNN用于分类问题的设计,下图LSTM用于网络结构原理示意图,示例中的是利用最后一个词的结果直接接全连接层softmax输出了。\n</p>\n<p>\n <img src=\"https://img-blog.csdn.net/20180611145716401\" alt=\"\" /> \n</p>\n<p>\n 4)TextRNN + Attention\n</p>\n<p>\n CNN和RNN用在文本分类任务中尽管效果显著,但都有一个不足的地方就是不够直观,可解释性不好,特别是在分析badcase时候感受尤其深刻。而注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本成了Seq2Seq模型的标配了。实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来,研究了下学术界果然有类似做法。\n</p>\n<br />\n<p>\n Attention机制介绍:\n</p>\n<p>\n 详细介绍Attention恐怕需要一小篇文章的篇幅,感兴趣的可参考14年这篇paper <a href=\"https://link.zhihu.com/?target=https%3A/arxiv.org/pdf/1409.0473v7.pdf\" target=\"_blank\">NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE</a>。\n</p>\n<p>\n 以机器翻译为例简单介绍下,下图中 <img src=\"https://www.zhihu.com/equation?tex=x_%7Bt%7D\" alt=\"x_{t}\" /> 是源语言的一个词,<img src=\"https://www.zhihu.com/equation?tex=y_%7Bt%7D\" alt=\"y_{t}\" /> 是目标语言的一个词,机器翻译的任务就是给定源序列得到目标序列。翻译 <img src=\"https://www.zhihu.com/equation?tex=y_%7Bt%7D\" alt=\"y_{t}\" /> 的过程产生取决于上一个词 <img src=\"https://www.zhihu.com/equation?tex=y_%7Bt-1%7D\" alt=\"y_{t-1}\" /> 和源语言的词的表示 <img src=\"https://www.zhihu.com/equation?tex=h_%7Bj%7D\" alt=\"h_{j}\" />(<img src=\"https://www.zhihu.com/equation?tex=x_%7Bj%7D\" alt=\"x_{j}\" /> 的 bi-RNN 模型的表示),而每个词所占的权重是不一样的。比如源语言是中文 “我 / 是 / 中国人” 目标语言 “i / am / Chinese”,翻译出“Chinese”时候显然取决于“中国人”,而与“我 / 是”基本无关。下图公式, <img src=\"https://www.zhihu.com/equation?tex=%5Calpha+_%7Bij%7D\" alt=\"\\alpha _{ij}\" /> 则是翻译英文第 <img src=\"https://www.zhihu.com/equation?tex=i\" alt=\"i\" /> 个词时,中文第 <img src=\"https://www.zhihu.com/equation?tex=j\" alt=\"j\" /> 个词的贡献,也就是注意力。显然在翻译“Chinese”时,“中国人”的注意力值非常大。\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145728821\" alt=\"\" /><br />\n<p>\n <img src=\"https://img-blog.csdn.net/20180611145801880\" alt=\"\" /> \n</p>\n<p>\n Attention的核心point是在翻译每个目标词(或 预测商品标题文本所属类别)所用的上下文是不同的,这样的考虑显然是更合理的。\n</p>\n<p>\n TextRNN + Attention 模型:\n</p>\n<p>\n 我们参考了这篇文章 <a href=\"https://link.zhihu.com/?target=https%3A/www.cs.cmu.edu/~diyiy/docs/naacl16.pdf\" target=\"_blank\">Hierarchical Attention Networks for Document Classification</a>,下图是模型的网络结构图,它一方面用层次化的结构保留了文档的结构,另一方面在word-level和sentence-level。淘宝标题场景只需要 word-level 这一层的 Attention 即可。\n</p>\n<div>\n <img src=\"https://img-blog.csdn.net/20180611145814423\" alt=\"\" /> \n</div>\n<p>\n 加入Attention之后最大的好处自然是能够直观的解释各个句子和词对分类类别的重要性。\n</p>\n<p>\n 5)TextRCNN(TextRNN + CNN)\n</p>\n<p>\n 我们参考的是中科院15年发表在AAAI上的这篇文章 Recurrent Convolutional Neural Networks for Text Classification 的结构:\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145859955\" alt=\"\" /><br />\n<p>\n 利用前向和后向RNN得到每个词的前向和后向上下文的表示:\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145938965\" alt=\"\" /><br />\n<p>\n 这样词的表示就变成词向量和前向后向上下文向量concat起来的形式了,即:\n</p>\n<img src=\"https://img-blog.csdn.net/20180611145945615\" alt=\"\" /><br />\n最后再接跟TextCNN相同卷积层,pooling层即可,唯一不同的是卷积层 filter_size = 1就可以了,不再需要更大 filter_size 获得更大视野,这里词的表示也可以只用双向RNN输出。\n<p>\n <br />\n</p>\n<h2>\n <a></a>三、一点经验\n</h2>\n<p>\n 理论和实践之间的Gap往往差异巨大,学术paper更关注的是模型架构设计的新颖性等,更重要的是新的思路;而实践最重要的是在落地场景的效果,关注的点和方法都不一样。这部分简单梳理实际做项目过程中的一点经验教训。\n</p>\n<br />\n<p>\n 模型显然并不是最重要的:不能否认,好的模型设计对拿到好结果的至关重要,也更是学术关注热点。但实际使用中,模型的工作量占的时间其实相对比较少。虽然再第二部分介绍了5种CNN/RNN及其变体的模型,实际中文本分类任务单纯用CNN已经足以取得很不错的结果了,我们的实验测试RCNN对准确率提升大约1%,并不是十分的显著。最佳实践是先用TextCNN模型把整体任务效果调试到最好,再尝试改进模型。\n</p>\n<p>\n 理解你的数据:虽然应用深度学习有一个很大的优势是不再需要繁琐低效的人工特征工程,然而如果你只是把他当做一个黑盒,难免会经常怀疑人生。一定要理解你的数据,记住无论传统方法还是深度学习方法,数据 sense 始终非常重要。要重视 badcase 分析,明白你的数据是否适合,为什么对为什么错。\n</p>\n<br />\n<p>\n 关注迭代质量 - 记录和分析你的每次实验:迭代速度是决定算法项目成败的关键,学过概率的同学都很容易认同。而算法项目重要的不只是迭代速度,一定要关注迭代质量。如果你没有搭建一个快速实验分析的套路,迭代速度再快也只会替你公司心疼宝贵的计算资源。建议记录每次实验,实验分析至少回答这三个问题:为什么要实验?结论是什么?下一步怎么实验?\n</p>\n<p>\n 超参调节:超参调节是各位调参工程师的日常了,推荐一篇文本分类实践的论文 <a href=\"https://link.zhihu.com/?target=https%3A/arxiv.org/pdf/1510.03820.pdf\" target=\"_blank\">A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification</a>,里面贴了一些超参的对比实验,如果你刚开始启动文本分析任务,不妨按文章的结果设置超参,怎么最快的得到超参调节其实是一个非常重要的问题,可以读读 萧瑟的这篇文章 <a href=\"https://zhuanlan.zhihu.com/p/24720954?utm_source=zhihu&utm_medium=social\" target=\"_blank\">深度学习网络调参技巧 - 知乎专栏</a>。\n</p>\n<br />\n<p>\n 一定要用 dropout:有两种情况可以不用:数据量特别小,或者你用了更好的正则方法,比如bn。实际中我们尝试了不同参数的dropout,最好的还是0.5,所以如果你的计算资源很有限,默认0.5是一个很好的选择。\n</p>\n<p>\n fine-tuning 是必选的:上文聊到了,如果只是使用word2vec训练的词向量作为特征表示,我赌你一定会损失很大的效果。\n</p>\n<p>\n 未必一定要 softmax loss: 这取决与你的数据,如果你的任务是多个类别间非互斥,可以试试着训练多个二分类器,也就是把问题定义为multi lable 而非 multi class,我们调整后准确率还是增加了>1%。\n</p>\n<p>\n 类目不均衡问题:基本是一个在很多场景都验证过的结论:如果你的loss被一部分类别dominate,对总体而言大多是负向的。建议可以尝试类似 booststrap 方法调整 loss 中样本权重方式解决。\n</p>\n<br />\n<p>\n 避免训练震荡:默认一定要增加随机采样因素尽可能使得数据分布iid,默认shuffle机制能使得训练结果更稳定。如果训练模型仍然很震荡,可以考虑调整学习率或 mini_batch_size。\n</p>\n<p>\n 没有收敛前不要过早的下结论:玩到最后的才是玩的最好的,特别是一些新的角度的测试,不要轻易否定,至少要等到收敛吧。\n</p>\n<br />\n<br />\n<h2>\n <a></a>四、写在最后\n</h2>\n<p>\n 几年前校招面阿里时,一面二面聊的都是一个文本分类的项目(一个新浪微博主题分类的学校课题项目),用的还是文中介绍的传统的做法。面试时对特征项处理和各个分类器可谓如数家珍,被要求在白板上写了好几个特征选择公式,短短几年传统做法已经被远远超越,不得不感慨深度学习的发展。\n</p>\n<p>\n 值得感慨的一方面是今天技术的发展非常快,故步自封自然是万万万万不可取,深知还有很多理论尚且不懂还要继续深读paper;另一方面,理解理论原理和做好项目间实际非常有巨大的gap,特别是身处工业界的同仁们,学术圈值得钻但要把握分寸,如果仅仅追逐技术深度,不免容易陷入空中阁楼。\n</p>\n<div>\n <br />\n</div>', 1528806787, 9),
(54, 'define', 'dsfsdfdsfsdfsdf', '12131323123', 'dsfsdfdsfsdfsdf', 1528805311, 0),
(55, 'define', '', '222', '', 1528805598, 1),
(56, 'define', '测试标签为空', '测试标签为空', '测试标签为空', 1528805637, 0);
-- --------------------------------------------------------
--
-- 表的结构 `blog_users`
--
CREATE TABLE `blog_users` (
`username` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(64) NOT NULL DEFAULT '' COMMENT '登录密码;md5加密',
`avatar` longtext NOT NULL COMMENT '用户头像',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '用户手机',
`email` varchar(50) NOT NULL DEFAULT '' COMMENT '用户邮箱',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`school` varchar(255) DEFAULT NULL COMMENT '学校',
`github` varchar(255) DEFAULT NULL,
`visited_num` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息';
--
-- 转存表中的数据 `blog_users`
--
INSERT INTO `blog_users` (`username`, `password`, `avatar`, `mobile`, `email`, `create_time`, `school`, `github`, `visited_num`) VALUES
('123123', '123', 'img/default.jpg', '18923978536', '[email protected]', 1234567890, '无', '无', 1),
('ad', '1', 'img/default.jpg', '1', '1', 1527821393, NULL, NULL, 6),
('adddd', '1', 'img/default.jpg', '1', '1', 1527821657, NULL, NULL, 2),
('ade', '1', 'img/default.jpg', '1', '1', 1527821531, NULL, NULL, 1),
('adee', '1', 'img/default.jpg', '1', '1', 1527821627, NULL, NULL, 0),
('adeee', '1', 'img/default.jpg', '1', '1', 1527821637, NULL, NULL, 0),
('adm', 'c4ca4238a0b923820dcc509a6f75849b', 'img/default.jpg', '121', '1', 1527821734, NULL, NULL, 0),
('admin', '123123', 'img/default.jpg', '1', '1', 0, NULL, NULL, 0),
('define', 'e10adc3949ba59abbe56e057f20f883e', 'http://localhost/myblog_test/img/default.jpg', '10000', '10000.com', 1528734204, '', '', 12),
('Elenore', '123456', 'img/no_login.png', '18923978536', '[email protected]', 1234567890, NULL, NULL, 24),
('Elenore0705', '4297f44b13955235245b2497399d7a93', 'http://localhost/myblog_test/img/default.jpg', '123456789', '[email protected]', 1528373055, '广外广外', 'gayhub.hhh', 2),
('mazong', '4297f44b13955235245b2497399d7a93', 'data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//2Q==', '18923978536', '[email protected]', 1527903639, '广东外语外贸大学', 'https://github.com/Elenore1997', 253),
('t', 'b2ca678b4c936f905fb82f2733f5297f', 'img/default.jpg', '16546615611', '[email protected]', 1528767064, NULL, NULL, 5),
('test', '202cb962ac59075b964b07152d234b70', 'img/default.jpg', '1', '1', 1527823175, NULL, NULL, 0),
('自闭第三天', '123123', 'img/no_login.png', '18923978536', '[email protected]', 0, 'gw', 'meiyou', 0);
-- --------------------------------------------------------
--
-- 表的结构 `comments`
--
CREATE TABLE `comments` (
`id` int(11) NOT NULL,
`article_id` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',
`username` varchar(60) NOT NULL DEFAULT '' COMMENT '评论人',
`comment_content` varchar(6400) NOT NULL DEFAULT '' COMMENT '评论内容',
`comment_time` int(11) NOT NULL DEFAULT '0' COMMENT '评论时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='评论表';
--
-- 转存表中的数据 `comments`
--
INSERT INTO `comments` (`id`, `article_id`, `username`, `comment_content`, `comment_time`) VALUES
(1, 35, 'mazong', '我评论一下?', 1528422047),
(2, 35, 'mazong', '再来一条', 1528424284),
(3, 35, 'mazong', '再来一条', 1528424290),
(8, 1, 'define', '666', 1528734535),
(9, 45, 'mazong', '登录测试评论', 1528764868),
(11, 31, 't', 'kkk', 1528767140),
(12, 50, 'mazong', '测试评论', 1528807110);
-- --------------------------------------------------------
--
-- 表的结构 `followers`
--
CREATE TABLE `followers` (
`id` int(11) NOT NULL,
`username` varchar(60) NOT NULL DEFAULT '' COMMENT '被关注人',
`followers` varchar(60) NOT NULL DEFAULT '' COMMENT '粉丝',
`create_time` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='粉丝表';
--
-- 转存表中的数据 `followers`
--
INSERT INTO `followers` (`id`, `username`, `followers`, `create_time`) VALUES
(1, 'mazong', 'adddd', 0),
(2, 'mazong', 'ad', 1234567890),
(5, 'adm', 'mazong', 0),
(8, 'ade', 'Elenore', 1234567890),
(9, 'Elenore0705', 'Elenore', 1234567890),
(24, 'Elenore', 'mazong', 1528621729),
(25, 'Elenore0705', 'mazong', 1528632607),
(26, 'Elenore', 'define', 1528734508),
(27, '123123', 't', 1528767124),
(28, 'adddd', 'mazong', 1528804653);
-- --------------------------------------------------------
--
-- 表的结构 `tags`
--
CREATE TABLE `tags` (
`id` int(11) NOT NULL,
`article_id` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',
`username` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名',
`tag` varchar(255) NOT NULL DEFAULT '' COMMENT '标签'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章标签表';
--
-- 转存表中的数据 `tags`
--
INSERT INTO `tags` (`id`, `article_id`, `username`, `tag`) VALUES
(1, 32, 'mazong', '算法'),
(2, 33, 'mazong', 'test'),
(4, 35, 'mazong', '算法'),
(5, 36, 'mazong', 'test'),
(7, 1, 'Elenore', '算法'),
(17, 44, 'mazong', '我是弱智'),
(18, 45, 'mazong', '我是弱智'),
(19, 45, 'mazong', 'test'),
(22, 48, 't', 'k'),
(23, 48, 't', 'll'),
(24, 50, 'mazong', '杂谈'),
(25, 51, 'mazong', '杂谈'),
(26, 52, 'mazong', '计算机网络'),
(27, 53, 'mazong', 'nlp'),
(28, 53, 'mazong', 'deep learning'),
(29, 54, 'define', 'nlp');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `articles`
--
ALTER TABLE `articles`
ADD PRIMARY KEY (`article_id`);
--
-- Indexes for table `blog_users`
--
ALTER TABLE `blog_users`
ADD PRIMARY KEY (`username`);
--
-- Indexes for table `comments`
--
ALTER TABLE `comments`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `followers`
--
ALTER TABLE `followers`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `tags`
--
ALTER TABLE `tags`
ADD PRIMARY KEY (`id`);
--
-- 在导出的表使用AUTO_INCREMENT
--
--
-- 使用表AUTO_INCREMENT `articles`
--
ALTER TABLE `articles`
MODIFY `article_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=58;
--
-- 使用表AUTO_INCREMENT `comments`
--
ALTER TABLE `comments`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
--
-- 使用表AUTO_INCREMENT `followers`
--
ALTER TABLE `followers`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=29;
--
-- 使用表AUTO_INCREMENT `tags`
--
ALTER TABLE `tags`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=32;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;