-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
399 lines (236 loc) · 150 KB
/
atom.xml
File metadata and controls
399 lines (236 loc) · 150 KB
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
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>linsage的博客</title>
<icon>https://www.gravatar.com/avatar/8b829c4d6ef2e6de8478f6e97b70a5b8</icon>
<subtitle>中山</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://linsage.com/"/>
<updated>2018-06-02T06:38:14.000Z</updated>
<id>https://linsage.com/</id>
<author>
<name>linsage</name>
<email>linsage@live.com</email>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Kotlin入门:Kotlin介绍</title>
<link href="https://linsage.com/2018/06/02/kotlin/Kotlin%E4%BB%8B%E7%BB%8D/"/>
<id>https://linsage.com/2018/06/02/kotlin/Kotlin介绍/</id>
<published>2018-06-02T05:14:52.000Z</published>
<updated>2018-06-02T06:38:14.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://note-1256162930.picgz.myqcloud.com/8wdy5.jpg" alt=""></p><a id="more"></a><h1 id="什么是Kotlin?"><a href="#什么是Kotlin?" class="headerlink" title="什么是Kotlin?"></a>什么是Kotlin?</h1><p>由 JetBrains 公司开发,2017 Google I/O成为Android官方支持开发语言,开源语言</p><h1 id="Kotlin特性"><a href="#Kotlin特性" class="headerlink" title="Kotlin特性"></a>Kotlin特性</h1><ul><li>开源</li><li>可以编译成Java字节码,也可以编译成JavaScript,运行于JVM或JavaScript环境</li><li>JDK兼容,混合Java + Kotlin项目的互操作性和无缝支持</li><li>IntelliJ IDEA,Android Studio、Eclipse 多种开发工具支持</li><li>语法更简洁、安全、易扩展、对初学者友好</li></ul><h1 id="Kotlin语法"><a href="#Kotlin语法" class="headerlink" title="Kotlin语法"></a>Kotlin语法</h1><h2 id="定义包名"><a href="#定义包名" class="headerlink" title="定义包名"></a>定义包名</h2><p>在源文件的开头定义包名:</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> my.demo</div><div class="line"><span class="keyword">import</span> java.util.*</div><div class="line"><span class="comment">//...</span></div></pre></td></tr></table></figure><p>包名不必和文件夹路径一致:源文件可以放在任意位置</p><h2 id="定义函数"><a href="#定义函数" class="headerlink" title="定义函数"></a>定义函数</h2><p>定义一个函数接受两个 int 型参数,返回值为 int :</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">sum</span><span class="params">(a: <span class="type">Int</span> , b: <span class="type">Int</span>)</span></span> : <span class="built_in">Int</span>{</div><div class="line"><span class="keyword">return</span> a + b</div><div class="line">}</div></pre></td></tr></table></figure><p>定义main函数</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> print(<span class="string">"sum of 3 and 5 is "</span>)</div><div class="line"> println(sum(<span class="number">3</span>, <span class="number">5</span>))</div><div class="line">}</div></pre></td></tr></table></figure><h2 id="定义局部变量"><a href="#定义局部变量" class="headerlink" title="定义局部变量"></a>定义局部变量</h2><p>常量用val声明,变量用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">val</span> a: <span class="built_in">Int</span> = <span class="number">1</span> <span class="comment">// 立即初始化</span></div><div class="line"> <span class="keyword">val</span> b = <span class="number">2</span> <span class="comment">// 推导出Int型</span></div><div class="line"> <span class="keyword">val</span> c: <span class="built_in">Int</span> <span class="comment">// 当没有初始化值时必须声明类型</span></div><div class="line"> c = <span class="number">3</span> <span class="comment">// 赋值</span></div><div class="line"> println(<span class="string">"a = <span class="variable">$a</span>, b = <span class="variable">$b</span>, c = <span class="variable">$c</span>"</span>)</div><div class="line"></div><div class="line"> <span class="comment">//空安全变量</span></div><div class="line"> <span class="keyword">var</span> str: String = <span class="string">"hello"</span></div><div class="line"> <span class="keyword">var</span> str1 = <span class="string">"word"</span></div><div class="line"> <span class="comment">//可为空字符串变量</span></div><div class="line"> <span class="keyword">var</span> str2: String? = <span class="literal">null</span></div><div class="line">}</div></pre></td></tr></table></figure><h2 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h2><p>与 java 和 javaScript 一样,Kotlin 支持单行注释和块注释</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 单行注释</span></div><div class="line"></div><div class="line"><span class="comment">/* 哈哈哈哈</span></div><div class="line"><span class="comment"> 这是块注释 */</span></div></pre></td></tr></table></figure><h2 id="字符串模板"><a href="#字符串模板" class="headerlink" title="字符串模板"></a>字符串模板</h2><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">var</span> a = <span class="number">1</span></div><div class="line"> <span class="comment">// 使用变量名作为模板:</span></div><div class="line"> <span class="keyword">val</span> s1 = <span class="string">"a is <span class="variable">$a</span>"</span></div><div class="line"></div><div class="line"> a = <span class="number">2</span></div><div class="line"> <span class="comment">// 使用表达式作为模板:</span></div><div class="line"> <span class="keyword">val</span> s2 = <span class="string">"<span class="subst">${s1.replace("is", "was")}</span>, but now is <span class="variable">$a</span>"</span></div><div class="line"> println(s2)</div><div class="line">}</div></pre></td></tr></table></figure><h2 id="使用条件表达式"><a href="#使用条件表达式" class="headerlink" title="使用条件表达式"></a>使用条件表达式</h2><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">maxOf</span><span class="params">(a: <span class="type">Int</span>, b: <span class="type">Int</span>)</span></span>: <span class="built_in">Int</span> {</div><div class="line"> <span class="keyword">if</span> (a > b) {</div><div class="line"> <span class="keyword">return</span> a</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> <span class="keyword">return</span> b</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure><p>把if当表达式</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">maxOf</span><span class="params">(a: <span class="type">Int</span>, b: <span class="type">Int</span>)</span></span> = <span class="keyword">if</span> (a > b) a <span class="keyword">else</span> b</div></pre></td></tr></table></figure><h2 id="使用循环"><a href="#使用循环" class="headerlink" title="使用循环"></a>使用循环</h2><p>for循环</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">val</span> items = listOf(<span class="string">"apple"</span>, <span class="string">"banana"</span>, <span class="string">"kiwi"</span>)</div><div class="line"> <span class="keyword">for</span> (item <span class="keyword">in</span> items) {</div><div class="line"> println(item)</div><div class="line">}</div></pre></td></tr></table></figure><p>while 循环</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">val</span> items = listOf(<span class="string">"apple"</span>, <span class="string">"banana"</span>, <span class="string">"kiwi"</span>)</div><div class="line"> <span class="keyword">var</span> index = <span class="number">0</span></div><div class="line"> <span class="keyword">while</span> (index < items.size) {</div><div class="line"> println(<span class="string">"item at <span class="variable">$index</span> is <span class="subst">${items[index]}</span>"</span>)</div><div class="line"> index++</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure><h2 id="使用-when-表达式"><a href="#使用-when-表达式" class="headerlink" title="使用 when 表达式"></a>使用 when 表达式</h2><p>移除了switch用更强大的when替代,when子式可以是常量、变量、返回数值的表达式、返回Boolean值的表达式</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> x = <span class="number">10</span></div><div class="line"><span class="keyword">when</span> (x) {</div><div class="line"> <span class="comment">//常量</span></div><div class="line"> <span class="number">2</span> -> println(<span class="string">"=2"</span>)</div><div class="line"> <span class="comment">//数值表达式</span></div><div class="line"> <span class="keyword">if</span> (x > <span class="number">0</span>) <span class="number">1</span> <span class="keyword">else</span> <span class="number">-1</span> -> println(<span class="string">"大于0并等于1,或小于0并等于-1"</span>)</div><div class="line"> <span class="comment">//Boolean类型表达式</span></div><div class="line"> <span class="keyword">in</span> <span class="number">1.</span><span class="number">.5</span> -> println(<span class="string">"1-5"</span>)</div><div class="line"> !<span class="keyword">in</span> <span class="number">6.</span><span class="number">.9</span> -> println(<span class="string">"6-9"</span>)</div><div class="line"> <span class="keyword">is</span> <span class="built_in">Int</span> -> println(<span class="string">"判断类型"</span>)</div><div class="line"> <span class="keyword">else</span> -> println(<span class="string">"否则"</span>)</div><div class="line">}</div></pre></td></tr></table></figure><h2 id="使用集合"><a href="#使用集合" class="headerlink" title="使用集合"></a>使用集合</h2><p>对一个集合进行迭代</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">val</span> items = listOf(<span class="string">"apple"</span>, <span class="string">"banana"</span>, <span class="string">"kiwi"</span>)</div><div class="line"> <span class="keyword">for</span> (item <span class="keyword">in</span> items) {</div><div class="line"> println(item)</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure><p>使用lambda表达式过滤和映射集合:</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">fun</span> <span class="title">main</span><span class="params">(args: <span class="type">Array</span><<span class="type">String</span>>)</span></span> {</div><div class="line"> <span class="keyword">val</span> fruits = listOf(<span class="string">"banana"</span>, <span class="string">"avocado"</span>, <span class="string">"apple"</span>, <span class="string">"kiwi"</span>)</div><div class="line"> fruits</div><div class="line"> .filter { it.startsWith(<span class="string">"a"</span>) }</div><div class="line"> .sortedBy { it }</div><div class="line"> .map { it.toUpperCase() }</div><div class="line"> .forEach { println(it) }</div><div class="line">}</div></pre></td></tr></table></figure><h1 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h1><ul><li><a href="https://try.kotlinlang.org/" target="_blank" rel="external">在线写Kotlin</a></li><li><a href="http://www.kotlindoc.cn/GettingStarted" target="_blank" rel="external">Kotlin中文文档</a></li></ul>]]></content>
<summary type="html">
Kotlin介绍
</summary>
<category term="Kotlin入门" scheme="https://linsage.com/categories/Kotlin%E5%85%A5%E9%97%A8/"/>
<category term="Kotlin入门" scheme="https://linsage.com/tags/Kotlin%E5%85%A5%E9%97%A8/"/>
</entry>
<entry>
<title>IntelliJ IDEA插件开发</title>
<link href="https://linsage.com/2018/01/10/%E6%8A%80%E6%9C%AF/IntelliJ%20IDEA%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<id>https://linsage.com/2018/01/10/技术/IntelliJ IDEA插件开发/</id>
<published>2018-01-10T09:52:19.000Z</published>
<updated>2018-05-03T09:06:56.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fnbnqh4ycoj31kw0nqadr.jpg" alt=""></p><a id="more"></a><h2 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h2><p>Java Bean 类转换json,粘贴到Postman上调试</p><h2 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h2><ul><li>IntelliJ IDEA Community(社区免费版)</li><li>JDK 1.8</li></ul><h2 id="基础配置"><a href="#基础配置" class="headerlink" title="基础配置"></a>基础配置</h2><p><img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fnbo2aq0v1j309109874n.jpg" alt=""></p><ul><li>plugin.xml:配置插件信息,主要配置antAction对应,文件右键弹出菜单</li><li>Java2JsonAction:主代码文件</li></ul><h2 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h2><p><img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fnbo4k38ckg31fi0pgtpg.gif" alt=""></p><h2 id="插件地址"><a href="#插件地址" class="headerlink" title="插件地址"></a>插件地址</h2><p><a href="https://plugins.jetbrains.com/plugin/10336-java-bean-to-json" target="_blank" rel="external">Java Bean to Json</a></p>]]></content>
<summary type="html">
IntelliJ IDEA插件开发
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="工具" scheme="https://linsage.com/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>快速配置https</title>
<link href="https://linsage.com/2017/11/02/%E6%8A%80%E6%9C%AF/%E5%BF%AB%E9%80%9F%E9%85%8D%E7%BD%AEhttps/"/>
<id>https://linsage.com/2017/11/02/技术/快速配置https/</id>
<published>2017-11-02T10:08:01.000Z</published>
<updated>2017-11-03T07:55:01.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws4.sinaimg.cn/large/006tNc79gy1fl3pzhsmcyj307w04i3yu.jpg" alt=""></p><p>由于微信平台要求接口使用HTTPS,各大网站开始推广HTTPS化。 本文介绍如何低成本快速部署使用https</p><a id="more"></a><h1 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h1><ol><li>安装acme.sh</li><li>申请证书</li><li>安装证书</li><li>配置nginx</li><li>检查和校验</li></ol><h2 id="安装acme-sh"><a href="#安装acme-sh" class="headerlink" title="安装acme.sh"></a>安装acme.sh</h2><p><a href="https://github.com/Neilpang/acme.sh" target="_blank" rel="external">acme.sh</a> 实现了 acme 协议, 可以从 <a href="https://letsencrypt.org/" target="_blank" rel="external">Let’s Encrypt</a> 生成免费的证书,自动利用crontab自动更新证书。</p><p><code>curl https://get.acme.sh | sh</code></p><p><code>source ~/.bashrc</code></p><p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fl3r1ijs4oj30qq08841u.jpg" alt=""></p><h2 id="申请证书"><a href="#申请证书" class="headerlink" title="申请证书"></a>申请证书</h2><p>acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证,</p><h3 id="http-验证"><a href="#http-验证" class="headerlink" title="http 验证"></a>http 验证</h3><p>我用的是http验证方式,我用的nginx服务器,acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:</p><p><code>acme.sh --issue -d example.com --nginx</code></p><p><strong>目前let’s encrypt只信任80和443端口,nginx必须监听80端口,完成验证</strong></p><h3 id="dns-验证"><a href="#dns-验证" class="headerlink" title="dns 验证"></a>dns 验证</h3><p>添加txt记录<br><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fl4qz6xkkej31cu034glz.jpg" alt=""></p><p><a href="https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md" target="_blank" rel="external">https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md</a></p><h3 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h3><p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fl4qy200lxj30ov05iwgx.jpg" alt=""></p><h2 id="安装证书"><a href="#安装证书" class="headerlink" title="安装证书"></a>安装证书</h2><p>注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">acme.sh --installcert -d api.linsage.xyz \</div><div class="line"> --key-file /usr/local/nginx/ssl/api.linsage.xyz.key \</div><div class="line"> --fullchain-file /usr/local/nginx/ssl/api.linsage.xyz.cer \</div><div class="line"> --reloadcmd "service nginx force-reload"</div></pre></td></tr></table></figure><p><code>openssl dhparam -out dhparams.pem 4096</code></p><p>统一放目录:/usr/local/nginx/ssl/</p><h2 id="配置nginx"><a href="#配置nginx" class="headerlink" title="配置nginx"></a>配置nginx</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line">server {</div><div class="line"> listen 80;</div><div class="line"> server_name api.linsage.xyz;</div><div class="line"> return 301 https://$server_name$request_uri;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> server {</div><div class="line"> listen 443;</div><div class="line"> server_name api.linsage.xyz;</div><div class="line"></div><div class="line"> ssl on;</div><div class="line"> ssl_certificate /usr/local/nginx/ssl/api.linsage.xyz.cer;</div><div class="line"> ssl_certificate_key /usr/local/nginx/ssl/api.linsage.xyz.key;</div><div class="line"> ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;</div><div class="line"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</div><div class="line"> ssl_session_cache shared:SSL:10m;</div><div class="line"> ssl_session_timeout 10m;</div><div class="line"> ssl_stapling on;</div><div class="line"> ssl_stapling_verify on;</div><div class="line"> ssl_prefer_server_ciphers on;</div><div class="line"> ssl_dhparam /usr/local/nginx/ssl/dhparam.pem;</div><div class="line"> add_header Strict-Transport-Security max-age=15552000;</div><div class="line"></div><div class="line"> location /{</div><div class="line"> root html;</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div></pre></td></tr></table></figure><h2 id="检查评级"><a href="#检查评级" class="headerlink" title="检查评级"></a>检查评级</h2><p><a href="https://www.ssllabs.com" target="_blank" rel="external">https://www.ssllabs.com</a></p>]]></content>
<summary type="html">
快速配置https
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
</entry>
<entry>
<title>Nginx安装</title>
<link href="https://linsage.com/2017/11/02/%E6%8A%80%E6%9C%AF/Nginx%E5%AE%89%E8%A3%85/"/>
<id>https://linsage.com/2017/11/02/技术/Nginx安装/</id>
<published>2017-11-02T07:07:53.000Z</published>
<updated>2017-11-02T09:06:04.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fl3rpy8cidj309s020wen.jpg" alt=""></p><p>Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。</p><a id="more"></a><h2 id="安装依懒库"><a href="#安装依懒库" class="headerlink" title="安装依懒库"></a>安装依懒库</h2><p>检查安装nginx的依赖库</p><ol><li>编译需要 gcc-c++</li><li>gzip 模块需要 zlib 库 ( 下载: <a href="http://www.zlib.net/" target="_blank" rel="external">http://www.zlib.net/</a> )</li><li>rewrite 模块需要 pcre 库 ( 下载: <a href="http://www.pcre.org/" target="_blank" rel="external">http://www.pcre.org/</a> )</li><li>ssl 功能需要 openssl 库 ( 下载: <a href="http://www.openssl.org/" target="_blank" rel="external">http://www.openssl.org/</a> )</li></ol><p><code>apt-get install -y build-essential</code><br><code>apt-get install -y zlibc zlib1g zlib1g-dev</code><br><code>apt-get install -y libpcre3 libpcre3-dev</code><br><code>apt-get install -y libssl-dev</code></p><h2 id="安装nginx"><a href="#安装nginx" class="headerlink" title="安装nginx"></a>安装nginx</h2><ol><li>下载 <code>wget http://nginx.org/download/nginx-1.12.2.tar.gz</code></li><li>解压 <code>tar -zxvf nginx-1.12.2.tar.gz</code></li><li>进去目录,执行 <code>./configure --with-http_ssl_module</code></li><li>编译安装 <code>make & make install</code></li><li>默认安装在 /usr/local/nginx 下</li></ol><h2 id="配置nginx"><a href="#配置nginx" class="headerlink" title="配置nginx"></a>配置nginx</h2><ul><li>默认配置文件:/usr/local/nginx/conf/nginx.conf </li><li>启动命令:/usr/local/nginx/sbin/nginx</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">http {</div><div class="line"> include mime.types;</div><div class="line"> default_type application/octet-stream;</div><div class="line"> </div><div class="line"> server {</div><div class="line"> listen 23285;</div><div class="line"> server_name localhost;</div><div class="line"> </div><div class="line"> #charset koi8-r;</div><div class="line"> </div><div class="line"> #access_log logs/host.access.log main;</div><div class="line"> </div><div class="line"> location / {</div><div class="line"> root html;</div><div class="line"> index index.html index.htm;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure><h2 id="作为系统服务"><a href="#作为系统服务" class="headerlink" title="作为系统服务"></a>作为系统服务</h2><p>vi /etc/init.d/nginx</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div></pre></td><td class="code"><pre><div class="line">#!/bin/bash</div><div class="line">#</div><div class="line"># chkconfig: - 85 15</div><div class="line"># description: Nginx is a World Wide Web server.</div><div class="line"># processname: nginx</div><div class="line"></div><div class="line">nginx=/usr/local/nginx/sbin/nginx</div><div class="line">conf=/usr/local/nginx/conf/nginx.conf</div><div class="line">case $1 in</div><div class="line">start)</div><div class="line">echo -n "Starting Nginx"</div><div class="line">$nginx -c $conf</div><div class="line">echo " done"</div><div class="line">;;</div><div class="line">stop)</div><div class="line">echo -n "Stopping Nginx"</div><div class="line">killall -9 nginx</div><div class="line">echo " done"</div><div class="line">;;</div><div class="line">test)</div><div class="line">$nginx -t -c $conf</div><div class="line">;;</div><div class="line">reload)</div><div class="line">echo -n "Reloading Nginx"</div><div class="line">ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP</div><div class="line">echo " done"</div><div class="line">;;</div><div class="line">restart)</div><div class="line">$0 stop</div><div class="line">$0 start</div><div class="line">;;</div><div class="line">show)</div><div class="line">ps -aux|grep nginx</div><div class="line">;;</div><div class="line">*)</div><div class="line">echo -n "Usage: $0 {start|restart|reload|stop|test|show}"</div><div class="line">;;</div><div class="line">esac</div></pre></td></tr></table></figure><p>chmod +x /etc/init.d/nginx<br>update-rc.d nginx defaults<br>service nginx start</p><h2 id="检查防火墙"><a href="#检查防火墙" class="headerlink" title="检查防火墙"></a>检查防火墙</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -nL --line-numbers</div><div class="line">iptables -A INPUT -p tcp --dport 23285 -j ACCEPT</div></pre></td></tr></table></figure><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fl3uf0vmxsj31960g0mzz.jpg" alt=""></p>]]></content>
<summary type="html">
Nginx安装
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
</entry>
<entry>
<title>Chrome Headless模式</title>
<link href="https://linsage.com/2017/08/03/%E6%8A%80%E6%9C%AF/Chrome%20Headless%E6%A8%A1%E5%BC%8F/"/>
<id>https://linsage.com/2017/08/03/技术/Chrome Headless模式/</id>
<published>2017-08-03T03:27:26.000Z</published>
<updated>2017-11-02T02:49:26.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fi6j8gqmelj307c06it8u.jpg" alt=""><br>Google Chrome 浏览器59+版本包含headless模式,该模式运行不需要任何显示命令支持。简单来说,服务器上能跑无界面的Chrome浏览器。</p><a id="more"></a><h2 id="解决了什么问题"><a href="#解决了什么问题" class="headerlink" title="解决了什么问题"></a>解决了什么问题</h2><ul><li>网页爬虫</li><li>自动化测试</li><li>自动截图</li><li>…</li></ul><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">sudo apt-get install libxss1 libappindicator1 libindicator7</div><div class="line">wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb</div><div class="line">sudo dpkg -i google-chrome*.deb # Might show "errors", fixed by next line</div><div class="line">sudo apt-get install -f</div></pre></td></tr></table></figure><h2 id="启动-Chrome"><a href="#启动-Chrome" class="headerlink" title="启动 Chrome"></a>启动 Chrome</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#</span> https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md</div><div class="line"><span class="meta">#</span> --disable-gpu currently required, see link above</div><div class="line">google-chrome --headless --hide-scrollbars --remote-debugging-port=9222 --disable-gpu &</div></pre></td></tr></table></figure><h2 id="使用-Node-js"><a href="#使用-Node-js" class="headerlink" title="使用 Node.js"></a>使用 Node.js</h2><p><a href="https://github.com/cyrus-and/chrome-remote-interface" target="_blank" rel="external">chrome-remote-interface</a> </p><h2 id="使用-Java"><a href="#使用-Java" class="headerlink" title="使用 Java"></a>使用 Java</h2><p><a href="https://github.com/ldaume/headless-chrome" target="_blank" rel="external">headless-chrome</a></p><h3 id="gradle配置"><a href="#gradle配置" class="headerlink" title="gradle配置"></a>gradle配置</h3><figure class="highlight groovy"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">apply <span class="string">plugin:</span> <span class="string">'java'</span></div><div class="line"></div><div class="line">sourceCompatibility = <span class="number">1.8</span></div><div class="line"></div><div class="line">repositories {</div><div class="line"> repositories { maven { url <span class="string">'https://maven.reinvent-software.de/nexus/content/groups/public/'</span> } }</div><div class="line"> repositories { maven { url <span class="string">'http://maven.aliyun.com/nexus/content/groups/public/'</span> } }</div><div class="line"> mavenLocal()</div><div class="line"> mavenCentral()</div><div class="line">}</div><div class="line"></div><div class="line">dependencies {</div><div class="line"> testCompile <span class="string">group:</span> <span class="string">'junit'</span>, <span class="string">name:</span> <span class="string">'junit'</span>, <span class="string">version:</span> <span class="string">'4.11'</span></div><div class="line"> compile <span class="string">'software.reinvent:headless-chrome:0.3.0'</span></div><div class="line">}</div></pre></td></tr></table></figure><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><p>chrome路径<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">webdriver.chrome.binary: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"</div></pre></td></tr></table></figure></p><h3 id="Main文件"><a href="#Main文件" class="headerlink" title="Main文件"></a>Main文件</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>{</div><div class="line"><span class="comment">//读取配置</span></div><div class="line">Config config = <span class="keyword">new</span> ConfigProvider().get();</div><div class="line">ChromeDriver driver = <span class="keyword">new</span> HeadlessChromeProvider(config).get();</div><div class="line">driver.get(<span class="string">"http://www.qq.com"</span>);</div><div class="line"><span class="comment">//截图</span></div><div class="line">File file = driver.getScreenshotAs(OutputType.FILE);</div><div class="line">System.out.println(file.getPath());</div><div class="line"><span class="comment">//退出</span></div><div class="line">driver.quit();</div><div class="line">}</div></pre></td></tr></table></figure><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><h4 id="状态"><a href="#状态" class="headerlink" title="状态"></a>状态</h4><p><img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fi6v72eqq7j304r0c6glw.jpg" alt=""></p><h4 id="截图"><a href="#截图" class="headerlink" title="截图"></a>截图</h4><p><img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fi6v94wsujj30n20hwwiy.jpg" alt=""></p>]]></content>
<summary type="html">
Chrome Headless模式
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="chrome" scheme="https://linsage.com/tags/chrome/"/>
</entry>
<entry>
<title>构建自己的Chrome扩展</title>
<link href="https://linsage.com/2017/07/20/%E6%8A%80%E6%9C%AF/%E6%9E%84%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84Chrome%E6%89%A9%E5%B1%95/"/>
<id>https://linsage.com/2017/07/20/技术/构建自己的Chrome扩展/</id>
<published>2017-07-20T02:06:29.000Z</published>
<updated>2017-08-06T02:41:21.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fhq4oj62btj30cs0afmxr.jpg" alt=""><br><a id="more"></a></p><p>Chrome扩展是用于扩充Chrome浏览器的程序,主用于对浏览器功能的增强。Chrome扩展和Chrome应用有很多相似之处,Chrome应用强调独立的程序,有更多的底层的系统接口和权限,Chrome扩展只能运行于浏览器,强调和浏览器结合。</p><h2 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h2><p>由于使用gitlab社区版搭建git仓库,本身gitlab没有左侧代码目录树视图,繁琐的跳转才能预览和审视代码视图。</p><p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fhq5fh6h4ej307a02qaa2.jpg" alt=""></p><h2 id="Manifest文件格式"><a href="#Manifest文件格式" class="headerlink" title="Manifest文件格式"></a>Manifest文件格式</h2><p>Chrome扩展一个Manifest文件,整个扩展的入口。</p><p><a href="http://open.chrome.360.cn/extension_dev/manifest.html" target="_blank" rel="external">格式:Manifest文件</a></p><p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fhq59pgnjvj30tk0jxjuo.jpg" alt=""></p><h2 id="开发技巧"><a href="#开发技巧" class="headerlink" title="开发技巧"></a>开发技巧</h2><ul><li>基础前端知识</li><li>浏览学习其他插件的源码</li><li>善于利用自带调试窗口</li></ul><p><a href="http://www.ituring.com.cn/book/1421" target="_blank" rel="external">Chrome扩展及应用开发</a><br><a href="http://open.chrome.360.cn/extension_dev/overview.html" target="_blank" rel="external">Chrome扩展开发文档</a><br><a href="https://developer.chrome.com/extensions" target="_blank" rel="external">Chrome扩展官方文档</a></p><h2 id="应用发布"><a href="#应用发布" class="headerlink" title="应用发布"></a>应用发布</h2><p>应用写好后打包上传,提供相关信息。开发者信息中心注册,要选择HK,一张VISA信用卡,交纳5美刀认证。等待几小时审核后,就可以在市场上看到自己的应用啦!</p><p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fhq5oaldboj31iq0ck0uu.jpg" alt=""><br><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fhq5pd30a3j31i60xmtgl.jpg" alt=""></p><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fhpc4wcad7g30z10hzaqs.gif" alt=""></p><ul><li><a href="https://chrome.google.com/webstore/detail/gitlab-treeview/kfjchffabpogdehadpflljaikjicdpng" target="_blank" rel="external">下载地址</a></li><li><a href="https://github.com/linsage/gitlab-treeview" target="_blank" rel="external">Github</a></li></ul>]]></content>
<summary type="html">
构建自己的Chrome扩展
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="chrome" scheme="https://linsage.com/tags/chrome/"/>
</entry>
<entry>
<title>Java常量类生成器</title>
<link href="https://linsage.com/2017/07/04/%E6%8A%80%E6%9C%AF/Java%E5%B8%B8%E9%87%8F%E7%B1%BB%E7%94%9F%E6%88%90%E5%99%A8/"/>
<id>https://linsage.com/2017/07/04/技术/Java常量类生成器/</id>
<published>2017-07-04T09:22:31.000Z</published>
<updated>2017-08-06T02:41:04.000Z</updated>
<content type="html"><![CDATA[<ul><li>需求</li></ul><ol><li>properties配置文件,创建常量类</li><li>常量类创建后,繁多设置属性值</li><li>配置文件变更和常量类不同步,容易遗漏</li></ol><ul><li>特点</li></ul><ol><li>支持自动生成常量类 ConfigGenerator</li><li>支持无限树形结构生成,基础数据类型(默认String,自定义属性type)</li><li>支持自动设置值 ConfigLoader</li></ol><ul><li><p>作用:只需维护properties文件,自动生成类和设置属性值</p></li><li><p>项目地址:<a href="https://github.com/linsage/constant-generator" target="_blank" rel="external">https://github.com/linsage/constant-generator</a></p></li></ul><a id="more"></a><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><h4 id="config-properties-配置文件"><a href="#config-properties-配置文件" class="headerlink" title="config.properties 配置文件"></a>config.properties 配置文件</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line">name=linsage</div><div class="line">devMode=true</div><div class="line">devMode.type=boolean</div><div class="line">#数据库</div><div class="line">db.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull</div><div class="line">db.user=root</div><div class="line">db.password=123456</div><div class="line">#druid</div><div class="line">druid.initialSize=10</div><div class="line">druid.minIdle=10</div><div class="line">druid.maxActive=100</div><div class="line">#监控页面</div><div class="line">druid.visitPath=/zs</div><div class="line">#慢sql</div><div class="line">druid.logSlowSql=true</div><div class="line">druid.slowSqlMillis=100</div><div class="line">#qiuniu</div><div class="line">qiniu.accessKey=123456</div><div class="line">qiniu.secretKey=56788</div><div class="line">qiniu.separator=_</div><div class="line">qiniu.bucket=test1</div><div class="line">qiniu.domain=http://1.bkt.clouddn.com</div><div class="line">qiniu.ins.bucket=test2</div><div class="line">qiniu.ins.domain=http://2.bkt.clouddn.com</div><div class="line">#proxy</div><div class="line">httpProxy.ip=127.0.0.1</div><div class="line">httpProxy.port=8118</div><div class="line">httpProxy.port.type=int</div></pre></td></tr></table></figure><h4 id="ConfigGenerator-配置文件生成常量类"><a href="#ConfigGenerator-配置文件生成常量类" class="headerlink" title="ConfigGenerator 配置文件生成常量类"></a>ConfigGenerator 配置文件生成常量类</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 生成常量类</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="comment">// base model 文件保存路径</span></div><div class="line"> String outputDir = PathKit.getWebRootPath() + <span class="string">"/../src/main/java/xyz/linsage/model"</span>;</div><div class="line"> <span class="comment">//包名</span></div><div class="line"> String packageName = <span class="string">"xyz.linsage.model"</span>;</div><div class="line"> <span class="comment">//类名</span></div><div class="line"> String className = <span class="string">"Constant"</span>;</div><div class="line"> ConfigGenerator g = <span class="keyword">new</span> ConfigGenerator(packageName, className, outputDir);</div><div class="line"> <span class="comment">//带顺序,为了和配置文件一致</span></div><div class="line"> LinkedProp prop = LinkedPropKit.use(<span class="string">"config.properties"</span>);</div><div class="line"> g.generate(prop.getProperties());</div><div class="line">}</div></pre></td></tr></table></figure><h4 id="生成类"><a href="#生成类" class="headerlink" title="生成类"></a>生成类</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> xyz.linsage.model;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * Generated by linsage, do not modify this file.</span></div><div class="line"><span class="comment"> */</span></div><div class="line"><span class="meta">@SuppressWarnings</span>(<span class="string">"serial"</span>)</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Constant</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String name;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> devMode;</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">db</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String url;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String user;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String password;</div><div class="line">}</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">druid</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String initialSize;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String minIdle;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String maxActive;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String visitPath;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String logSlowSql;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String slowSqlMillis;</div><div class="line">}</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">qiniu</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String accessKey;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String secretKey;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String separator;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String bucket;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String domain;</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">ins</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String bucket;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String domain;</div><div class="line">}</div><div class="line">}</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">httpProxy</span> </span>{</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String ip;</div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> port;</div><div class="line">}</div><div class="line">}</div></pre></td></tr></table></figure><h4 id="ConfigLoader-自动加载配置文件属性值"><a href="#ConfigLoader-自动加载配置文件属性值" class="headerlink" title="ConfigLoader 自动加载配置文件属性值"></a>ConfigLoader 自动加载配置文件属性值</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</div><div class="line"> LinkedProp prop = LinkedPropKit.use(<span class="string">"config.properties"</span>);</div><div class="line"> ConfigLoader configLoader = <span class="keyword">new</span> ConfigLoader();</div><div class="line"> configLoader.load(Constant.class, prop.getProperties());</div><div class="line"></div><div class="line"> System.out.println(Constant.name);</div><div class="line"> System.out.println(Constant.devMode);</div><div class="line"> System.out.println(Constant.db.url);</div><div class="line"> System.out.println(Constant.qiniu.ins.domain);</div><div class="line"> System.out.println(Constant.httpProxy.port);</div><div class="line"> System.out.println(<span class="string">"ok"</span>);</div><div class="line">}</div></pre></td></tr></table></figure>]]></content>
<summary type="html">
Java常量类生成器
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="java" scheme="https://linsage.com/tags/java/"/>
</entry>
<entry>
<title>hexo中实现ins相册功能</title>
<link href="https://linsage.com/2017/06/19/%E6%8A%80%E6%9C%AF/hexo%E4%B8%AD%E5%AE%9E%E7%8E%B0ins%E7%9B%B8%E5%86%8C%E5%8A%9F%E8%83%BD/"/>
<id>https://linsage.com/2017/06/19/技术/hexo中实现ins相册功能/</id>
<published>2017-06-19T06:47:43.000Z</published>
<updated>2017-08-06T02:40:41.000Z</updated>
<content type="html"><![CDATA[<p>hexo主题搭建博客,最终生成静态网页形式展示。 想要获取instagram信息,在博客中实现相册功能。</p><p><img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fgqiienff4j30bo04ijrl.jpg" alt=""></p><a id="more"></a><h2 id="选择一个hexo主题"><a href="#选择一个hexo主题" class="headerlink" title="选择一个hexo主题"></a>选择一个hexo主题</h2><p>hexo的主题很多,个人推荐简约和性能,支持手机浏览的主题。 推荐<a href="https://github.com/litten/hexo-theme-yilia" target="_blank" rel="external">yilia</a></p><h2 id="了解hexo文件目录"><a href="#了解hexo文件目录" class="headerlink" title="了解hexo文件目录"></a>了解hexo文件目录</h2><p><img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fgqipioka8j30es0jowfo.jpg" alt=""></p><p><img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fgqiqcorvhj30as060aab.jpg" alt=""><br>如图所示,photos目录下,存放着相册功能所有前端资源。其中关键是ins.json数据与ins.js显示逻辑。ins.js依靠ins.json内容信息控制显示。 问题如何生成ins.json内容?</p><h2 id="抓取ins生成内容"><a href="#抓取ins生成内容" class="headerlink" title="抓取ins生成内容"></a>抓取ins生成内容</h2><h3 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h3><ul><li>纯静态页面,不可能动态更新ins.json</li><li>instagram国内被和谐,不访问相关图片资源</li></ul><h3 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h3><ul><li>借助后端Java能力,抓取ins信息</li><li>图片转存七牛,实现访问</li></ul><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><p>项目地址:<a href="https://github.com/linsage/ins-to-qiniu" target="_blank" rel="external">https://github.com/linsage/ins-to-qiniu</a><br>博客配置:<a href="https://github.com/linsage/blog-backup" target="_blank" rel="external">https://github.com/linsage/blog-backup</a></p><h4 id="1-通过ins的api获取账号下信息并缓存"><a href="#1-通过ins的api获取账号下信息并缓存" class="headerlink" title="1. 通过ins的api获取账号下信息并缓存"></a>1. 通过ins的api获取账号下信息并缓存</h4><p><strong>国内环境,可能借助代理才能实现请求</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 获取图文信息json</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> username</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="function"><span class="keyword">private</span> JSONArray <span class="title">getEdges</span><span class="params">(String username)</span> </span>{</div><div class="line"> <span class="comment">//先从缓存读取</span></div><div class="line"> JSONArray array = CacheKit.get(<span class="string">"userPhoto"</span>, username);</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (array != <span class="keyword">null</span>)</div><div class="line"> <span class="keyword">return</span> array;</div><div class="line"></div><div class="line"> <span class="comment">//1.获取userId</span></div><div class="line"> String url = <span class="string">"https://www.instagram.com/"</span> + username + <span class="string">"/?__a=1"</span>;</div><div class="line"> <span class="comment">//由于墙外地址,使用代理(请自行修改)</span></div><div class="line"> OkHttpClient okHttpClient = <span class="keyword">new</span> OkHttpClient().newBuilder().proxy((<span class="keyword">new</span> Proxy(Proxy.Type.HTTP, <span class="keyword">new</span> InetSocketAddress(<span class="string">"127.0.0.1"</span>, <span class="number">8118</span>)))).build();</div><div class="line"> Request request = <span class="keyword">new</span> Request.Builder().url(url).build();</div><div class="line"> Call call = okHttpClient.newCall(request);</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> Response response = call.execute();</div><div class="line"> JSONObject jsonObject = JSONObject.parseObject(response.body().string());</div><div class="line"> String userId = ((JSONObject) jsonObject.get(<span class="string">"user"</span>)).get(<span class="string">"id"</span>).toString();</div><div class="line"> <span class="comment">//System.out.println(jsonObject.toJSONString());</span></div><div class="line"></div><div class="line"> <span class="comment">//2.获取内容</span></div><div class="line"> String contentUrl = <span class="string">"https://www.instagram.com/graphql/query/?query_id=17880160963012870&id="</span> + userId + <span class="string">"&first=999"</span>;</div><div class="line"> request = <span class="keyword">new</span> Request.Builder().url(contentUrl).build();</div><div class="line"> response = okHttpClient.newCall(request).execute();</div><div class="line"> jsonObject = JSONObject.parseObject(response.body().string());</div><div class="line"> <span class="comment">//System.out.println(jsonObject.toJSONString());</span></div><div class="line"></div><div class="line"> <span class="comment">//data.user.edge_owner_to_timeline_media.edges</span></div><div class="line"> array = jsonObject</div><div class="line"> .getJSONObject(<span class="string">"data"</span>)</div><div class="line"> .getJSONObject(<span class="string">"user"</span>)</div><div class="line"> .getJSONObject(<span class="string">"edge_owner_to_timeline_media"</span>)</div><div class="line"> .getJSONArray(<span class="string">"edges"</span>);</div><div class="line"></div><div class="line"> <span class="comment">//设置缓存(k-username,V-图文)</span></div><div class="line"> CacheKit.put(<span class="string">"userPhoto"</span>, username, array);</div><div class="line"></div><div class="line"> <span class="keyword">return</span> array;</div><div class="line"> } <span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> }</div><div class="line"> }</div></pre></td></tr></table></figure><h4 id="2-下载ins图片并上传到七牛云"><a href="#2-下载ins图片并上传到七牛云" class="headerlink" title="2. 下载ins图片并上传到七牛云"></a>2. 下载ins图片并上传到七牛云</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 下载ins,返回相册json</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">downloadIns</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>{</div><div class="line"> String username = getPara(<span class="string">"username"</span>);</div><div class="line"></div><div class="line"> JSONArray array = getEdges(username);</div><div class="line"></div><div class="line"> <span class="comment">//结果map(k-年月,v-内容)</span></div><div class="line"> Map<String, JSONArray> nodeMap = <span class="keyword">new</span> LinkedHashMap<>();</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (array != <span class="keyword">null</span>) { <span class="comment">//不为空,下载图片</span></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < array.size(); i++) {</div><div class="line"> JSONObject node = array.getJSONObject(i).getJSONObject(<span class="string">"node"</span>);</div><div class="line"> <span class="comment">//时间</span></div><div class="line"> <span class="keyword">int</span> timestamp = node.getIntValue(<span class="string">"taken_at_timestamp"</span>);</div><div class="line"> Date date = DateKit.getDateByUnixTime(timestamp);</div><div class="line"> <span class="comment">//code</span></div><div class="line"> <span class="keyword">final</span> String code = node.getString(<span class="string">"shortcode"</span>);</div><div class="line"> <span class="comment">//标题</span></div><div class="line"> <span class="keyword">final</span> String title = node.getJSONObject(<span class="string">"edge_media_to_caption"</span>).getJSONArray(<span class="string">"edges"</span>).getJSONObject(<span class="number">0</span>).getJSONObject(<span class="string">"node"</span>).getString(<span class="string">"text"</span>);</div><div class="line"> <span class="comment">//图片地址</span></div><div class="line"> <span class="keyword">final</span> String url = node.getString(<span class="string">"display_url"</span>);</div><div class="line"> <span class="keyword">final</span> String extension = url.substring(url.lastIndexOf(<span class="string">"."</span>));</div><div class="line"> <span class="keyword">final</span> String fileName = code + extension;</div><div class="line"> <span class="keyword">final</span> String saveDir = PathKit.getWebRootPath() + File.separator + <span class="string">"ins"</span>;</div><div class="line"> <span class="comment">//年-月-1</span></div><div class="line"> <span class="keyword">final</span> String key = DateKit.dateFormat(date, <span class="string">"yyyy-MM-1"</span>);</div><div class="line"></div><div class="line"> JSONObject obj = <span class="keyword">new</span> JSONObject();</div><div class="line"> obj.put(<span class="string">"timestamp"</span>, timestamp);</div><div class="line"> obj.put(<span class="string">"url"</span>, Constant.Qiniu.domain + <span class="string">"/"</span> + fileName);</div><div class="line"> obj.put(<span class="string">"title"</span>, title);</div><div class="line"> obj.put(<span class="string">"type"</span>, <span class="string">"image"</span>);</div><div class="line"> <span class="keyword">if</span> (!nodeMap.containsKey(key)) {</div><div class="line"> nodeMap.put(key, <span class="keyword">new</span> JSONArray());</div><div class="line"> }</div><div class="line"> nodeMap.get(key).add(obj);</div><div class="line"></div><div class="line"> DownloadKit.get().download(url, fileName, saveDir, <span class="keyword">new</span> DownloadKit.OnDownloadListener() {</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDownloadSuccess</span><span class="params">()</span> </span>{</div><div class="line"> System.out.println(<span class="string">"onDownloadSuccess:"</span> + code);</div><div class="line"></div><div class="line"> <span class="comment">//成功下载,上传到七牛云</span></div><div class="line"> QiniuKit.get().upload(<span class="keyword">new</span> File(saveDir + File.separator + fileName), <span class="keyword">new</span> QiniuKit.OnUploadListener() {</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onUploadSuccess</span><span class="params">()</span> </span>{</div><div class="line"> System.out.println(<span class="string">"onUploadSuccess"</span> + code);</div><div class="line"> System.out.println(Constant.Qiniu.domain + <span class="string">"/"</span> + fileName);</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onUploadFailed</span><span class="params">()</span> </span>{</div><div class="line"> System.out.println(<span class="string">"onUploadFailed"</span> + code);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDownloading</span><span class="params">(<span class="keyword">int</span> progress)</span> </span>{</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDownloadFailed</span><span class="params">()</span> </span>{</div><div class="line"> System.out.println(<span class="string">"onDownloadFailed:"</span> + code);</div><div class="line"> }</div><div class="line"> });</div><div class="line"></div><div class="line"></div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">//ins.json</span></div><div class="line"> JSONObject result = <span class="keyword">new</span> JSONObject();</div><div class="line"></div><div class="line"> JSONArray list = <span class="keyword">new</span> JSONArray();</div><div class="line"> <span class="keyword">for</span> (Map.Entry<String, JSONArray> entry : nodeMap.entrySet()) {</div><div class="line"> String key = entry.getKey();</div><div class="line"> JSONArray value = entry.getValue();</div><div class="line"> <span class="comment">// now work with key and value...</span></div><div class="line"> Date date = DateKit.convertToDate(key);</div><div class="line"> Calendar cal = Calendar.getInstance();</div><div class="line"> cal.setTime(date);</div><div class="line"> <span class="keyword">int</span> year = cal.get(Calendar.YEAR);</div><div class="line"> <span class="keyword">int</span> month = cal.get(Calendar.MONTH) + <span class="number">1</span>;</div><div class="line"></div><div class="line"> JSONObject item = <span class="keyword">new</span> JSONObject();</div><div class="line"> item.put(<span class="string">"year"</span>, year);</div><div class="line"> item.put(<span class="string">"month"</span>, month);</div><div class="line"> item.put(<span class="string">"arr"</span>, value);</div><div class="line"> list.add(item);</div><div class="line"> }</div><div class="line"></div><div class="line"> result.put(<span class="string">"list"</span>, list);</div><div class="line"></div><div class="line"> renderJson(result);</div><div class="line"> }</div></pre></td></tr></table></figure><h4 id="3-ins-js根据ins-json内容进行显示,配置相册目录入口"><a href="#3-ins-js根据ins-json内容进行显示,配置相册目录入口" class="headerlink" title="3. ins.js根据ins.json内容进行显示,配置相册目录入口"></a>3. ins.js根据ins.json内容进行显示,配置相册目录入口</h4><h4 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h4><p><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fgqjbk9lxej31ea10wn29.jpg" alt=""></p>]]></content>
<summary type="html">
hexo中实现ins相册功能
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="hexo" scheme="https://linsage.com/tags/hexo/"/>
</entry>
<entry>
<title>socks5代理转http代理</title>
<link href="https://linsage.com/2017/06/13/%E6%8A%80%E6%9C%AF/Socks5%E4%BB%A3%E7%90%86%E8%BD%ACHttp%E4%BB%A3%E7%90%86/"/>
<id>https://linsage.com/2017/06/13/技术/Socks5代理转Http代理/</id>
<published>2017-06-13T07:16:04.000Z</published>
<updated>2017-08-06T02:40:06.000Z</updated>
<content type="html"><![CDATA[<p>通用shadowsocks提供socks5,实现科学上网,但是没提供http代理,除了浏览器外,很多软件和开发上需要请求墙外的地址,这些没有提供socks5的代理,需要http代理来实现访问。</p><a id="more"></a><h2 id="安装shadowsocks客户端"><a href="#安装shadowsocks客户端" class="headerlink" title="安装shadowsocks客户端"></a>安装shadowsocks客户端</h2><p>shadowsocks不区分服务端和客户端,根据启动脚本</p><ul><li>sslocal代表以客户端模式工作</li><li>ssserver代表以服务器端模式工作</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">yum install python-pip</div><div class="line">pip install shadowsocks</div></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">touch /etc/shadowsocks.json</div></pre></td></tr></table></figure><blockquote><p>{<br> “server”:”your_server_ip”, #ss服务器IP<br> “server_port”:your_server_port, #端口<br> “local_address”: “127.0.0.1”, #本地ip<br> “local_port”:1080, #本地端口<br> “password”:”your_server_passwd”,#连接ss密码<br> “timeout”:300, #等待超时<br> “method”:”rc4-md5”, #加密方式<br> “fast_open”: false, # true 或 false。如果你的服务器 Linux 内核在3.7+,可以开启 fast_open 以降低延迟。开启方法: echo 3 > /proc/sys/net/ipv4/tcp_fastopen 开启之后,将 fast_open 的配置设置为 true 即可<br> “workers”: 1 # 工作线程数<br>}</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">nohup sslocal -c /etc/shadowsocks.json /dev/null 2>&1 &</div><div class="line">echo " nohup sslocal -c /etc/shadowsocks.json /dev/null 2>&1 &" /etc/rc.local</div><div class="line">ps aux |grep sslocal |grep -v "grep"</div></pre></td></tr></table></figure><h2 id="安装Privoxy"><a href="#安装Privoxy" class="headerlink" title="安装Privoxy"></a>安装Privoxy</h2><p><a href="http://www.privoxy.org/" target="_blank" rel="external">Privoxy</a>是一款带过滤功能的代理服务器,针对HTTP、HTTPS协议。通过Privoxy的过滤功能,用户可以保护隐私、对网页内容进行过滤、管理cookies,以及拦阻各种广告等,支持全平台。 需要用到的功能就是它的socks转换功能,将socks转换为可用的http方式。</p><p>命令安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">brew install privoxy</div></pre></td></tr></table></figure><p>源码安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">tar -zxvf privoxy-3.0.24-stable-src.tar.gz</div><div class="line">cd privoxy-3.0.24-stable</div><div class="line">useradd privoxy</div><div class="line">autoheader && autoconf</div><div class="line">./configure</div><div class="line">make&&make install</div></pre></td></tr></table></figure><h2 id="配置Privoxy"><a href="#配置Privoxy" class="headerlink" title="配置Privoxy"></a>配置Privoxy</h2><h3 id="1-确认本地shadowsocks端口(默认1080)及开启服务"><a href="#1-确认本地shadowsocks端口(默认1080)及开启服务" class="headerlink" title="1. 确认本地shadowsocks端口(默认1080)及开启服务"></a>1. 确认本地shadowsocks端口(默认1080)及开启服务</h3><p><img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fgku16ibh8j30bq0hqjsr.jpg" alt=""></p><h3 id="2-修改配置文件"><a href="#2-修改配置文件" class="headerlink" title="2. 修改配置文件"></a>2. 修改配置文件</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo vim /usr/local/etc/privoxy/config</div></pre></td></tr></table></figure><p>所有请求通过socks5中转,127.0.0.1:1080代表shadowsocks本地监听的地址和端口<br>privoxy监听本地的8118端口</p><h3 id="3-启动"><a href="#3-启动" class="headerlink" title="3. 启动"></a>3. 启动</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#</span>打开</div><div class="line">sudo /Applications/Privoxy/startPrivoxy.sh</div><div class="line"><span class="meta">#</span>关闭</div><div class="line">sudo /Applications/Privoxy/stopPrivoxy.sh</div></pre></td></tr></table></figure><h3 id="4-检查"><a href="#4-检查" class="headerlink" title="4. 检查"></a>4. 检查</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">#查看端口</div><div class="line">netstat -an | grep 8118</div><div class="line">#程序运行</div><div class="line">ps -ef|grep privoxy</div></pre></td></tr></table></figure><h3 id="5-测试"><a href="#5-测试" class="headerlink" title="5. 测试"></a>5. 测试</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl --connect-timeout 2 -x 127.0.0.1:8118 http://google.com</div></pre></td></tr></table></figure><p>返回如下代表成功<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">HTML</span>></span><span class="tag"><<span class="name">HEAD</span>></span><span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"content-type"</span> <span class="attr">content</span>=<span class="string">"text/html;charset=utf-8"</span>></span></div><div class="line"><span class="tag"><<span class="name">TITLE</span>></span>301 Moved<span class="tag"></<span class="name">TITLE</span>></span><span class="tag"></<span class="name">HEAD</span>></span><span class="tag"><<span class="name">BODY</span>></span></div><div class="line"><span class="tag"><<span class="name">H1</span>></span>301 Moved<span class="tag"></<span class="name">H1</span>></span></div><div class="line">The document has moved</div><div class="line"><span class="tag"><<span class="name">A</span> <span class="attr">HREF</span>=<span class="string">"http://www.google.com/"</span>></span>here<span class="tag"></<span class="name">A</span>></span>.</div><div class="line"><span class="tag"></<span class="name">BODY</span>></span><span class="tag"></<span class="name">HTML</span>></span></div></pre></td></tr></table></figure></p><h2 id="软件使用代理"><a href="#软件使用代理" class="headerlink" title="软件使用代理"></a>软件使用代理</h2><p><img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fgkuim4forj30lk0a8myf.jpg" alt=""></p><h2 id="代码使用代理"><a href="#代码使用代理" class="headerlink" title="代码使用代理"></a>代码使用代理</h2><p><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fgkuky8d0gj311f08xgnj.jpg" alt=""></p><p>privoxy更多用法自行发掘!</p>]]></content>
<summary type="html">
socks5代理转http代理
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="web" scheme="https://linsage.com/tags/web/"/>
</entry>
<entry>
<title>微信小程序-会话管理</title>
<link href="https://linsage.com/2017/06/12/%E6%8A%80%E6%9C%AF/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E4%BC%9A%E8%AF%9D%E7%AE%A1%E7%90%86/"/>
<id>https://linsage.com/2017/06/12/技术/微信小程序-会话管理/</id>
<published>2017-06-12T06:44:25.000Z</published>
<updated>2017-08-06T02:39:37.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fgifwzkbhxj30cg07twek.jpg" alt=""></p><p>通过微信,小程序以微信账号授权方式进行登录,以用户为核心,减少繁琐注册和输入密码操作,降低用户使用成本。会话管理,大致包含用户登录以及维护用户的登录状态。</p><a id="more"></a><h2 id="处理用户登录"><a href="#处理用户登录" class="headerlink" title="处理用户登录"></a>处理用户登录</h2><p><img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fgifz93j91j30jg0f8wfs.jpg" alt=""></p><h2 id="简化流程"><a href="#简化流程" class="headerlink" title="简化流程"></a>简化流程</h2><ul><li>小程序:客户端</li><li>业务服务器、会话服务器:服务端</li></ul><ol><li>客户端,发起wx.login获得code</li><li>客户端,发起wx.getUserInfo获得encryptedData、iv</li><li>服务端,发送参数(code、encryptedData、iv),请求微信服务器得到openid,解密出用户信息,完成自动注册及登录保持。</li><li>服务端,用户信息key-value方式保存到redis或者缓存服务(充当session)上,key返回给小程序端。</li><li>客户端,接受返回用户信息和key,保存到本地缓存localstorage</li><li>交换请求,带上key进行登录鉴权</li></ol><p>服务端登录代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 登录</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="meta">@Clear</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">login</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> String code = getHeader(<span class="string">"X-WX-Code"</span>);</div><div class="line"> String encryptData = getHeader(<span class="string">"X-WX-Encrypted-Data"</span>);</div><div class="line"> String iv = getHeader(<span class="string">"X-WX-IV"</span>);</div><div class="line"> String url = String.format(<span class="string">"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"</span>, Constant.WX.appId, Constant.WX.appSecret, code);</div><div class="line"> <span class="comment">//获取openid+session_key</span></div><div class="line"> String return_message = HttpKit.get(url);</div><div class="line"> HashMap<String, String> map = <span class="keyword">new</span> FastJson().parse(return_message, HashMap.class);</div><div class="line"> String openid = map.get(<span class="string">"openid"</span>);</div><div class="line"> String session_key = map.get(<span class="string">"session_key"</span>);</div><div class="line"> <span class="keyword">if</span> (StringKit.isNotEmpty(openid) && StringKit.isNotEmpty(session_key)) { <span class="comment">//返回结果</span></div><div class="line"> <span class="comment">//生成skey</span></div><div class="line"> String skey = HashKit.md5(DateKit.getCurrentUnixTime() + <span class="string">""</span> + (<span class="keyword">new</span> Random().nextInt(<span class="number">1000000</span>) + <span class="number">1</span>));</div><div class="line"> <span class="comment">//用户信息</span></div><div class="line"> String user_info = decrypt(encryptData, session_key, iv);</div><div class="line"> WxUserInfoDto wxUserInfoDto = <span class="keyword">new</span> FastJson().parse(user_info, WxUserInfoDto.class);</div><div class="line"></div><div class="line"> <span class="comment">//检查是否注册?</span></div><div class="line"> Account account = AccountService.service.findByWXOpenId(wxUserInfoDto.getOpenId());</div><div class="line"> <span class="keyword">if</span> (account == <span class="keyword">null</span>) { <span class="comment">//自动注册</span></div><div class="line"> account = <span class="keyword">new</span> Account();</div><div class="line"> account.setId(UUID.randomUUID().toString());</div><div class="line"> account.setSource(SourceEnum.WX.getValue());</div><div class="line"> account.setWxOpenId(wxUserInfoDto.getOpenId());</div><div class="line"> account.setUsername(<span class="string">"wx_"</span> + wxUserInfoDto.getOpenId()); <span class="comment">// "wx_"+openid</span></div><div class="line"> account.setSalt(EncryptKit.salt());</div><div class="line"> account.setPwd(EncryptKit.encryptPassword(<span class="string">"123456"</span>, account.getSalt()));</div><div class="line"> account.setCreateDate(<span class="keyword">new</span> Date());</div><div class="line"> account.setRegisterDate(<span class="keyword">new</span> Date());</div><div class="line"> account.setAvatar(wxUserInfoDto.getAvatarUrl());</div><div class="line"> account.setNickname(wxUserInfoDto.getNickName());</div><div class="line"> account.setGender(wxUserInfoDto.getGender());</div><div class="line"> account.setStat(StatEnum.Enabled.getValue());</div><div class="line"> account.setIsAdmin(<span class="number">0</span>);</div><div class="line"> account.save();</div><div class="line"> } <span class="keyword">else</span> { <span class="comment">//返回用户</span></div><div class="line"> <span class="comment">//更新登录时间</span></div><div class="line"> account.setLatestLoginDate(<span class="keyword">new</span> Date());</div><div class="line"> account.update();</div><div class="line"> }</div><div class="line"> CacheKit.put(Constant.CacheName.loginUser, skey, account);</div><div class="line"> renderJson(KV.by(<span class="string">"skey"</span>, skey).set(<span class="string">"userInfo"</span>, account));</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> WxRuntimeException(<span class="string">"登录请求参数错误"</span>);</div><div class="line"> }</div><div class="line"> } <span class="keyword">catch</span> (WxRuntimeException e) { <span class="comment">//业务错误</span></div><div class="line"> getResponse().setStatus(<span class="number">299</span>);</div><div class="line"> renderJson(KV.by(<span class="string">"message"</span>, e.getMessage()));</div><div class="line"> } <span class="keyword">catch</span> (Exception e) { <span class="comment">//异常</span></div><div class="line"> log.error(e.getMessage());</div><div class="line"> getResponse().setStatus(<span class="number">500</span>);</div><div class="line"> renderJson(KV.by(<span class="string">"message"</span>, e.getMessage()));</div><div class="line"> }</div><div class="line"> }</div></pre></td></tr></table></figure><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li>微信小程序开源全栈基础项目:<a href="https://github.com/tencentyun/wafer" target="_blank" rel="external">https://github.com/tencentyun/wafer</a></li><li>微信小程序api:<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/api/" target="_blank" rel="external">https://mp.weixin.qq.com/debug/wxadoc/dev/api/</a></li></ul>]]></content>
<summary type="html">
微信小程序-会话管理
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="微信小程序" scheme="https://linsage.com/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
</entry>
<entry>
<title>TamperMonkey使用</title>
<link href="https://linsage.com/2017/06/11/%E6%8A%80%E6%9C%AF/TamperMonkey%E4%BD%BF%E7%94%A8/"/>
<id>https://linsage.com/2017/06/11/技术/TamperMonkey使用/</id>
<published>2017-06-11T08:40:53.000Z</published>
<updated>2017-08-06T02:38:56.000Z</updated>
<content type="html"><![CDATA[<p>TamperMonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它的作用就是让浏览器运行特殊的JS脚本,从而实现更多功能。<br><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fgie75mecvj3074074jrf.jpg" alt=""></p><a id="more"></a><h2 id="下载插件-http-tampermonkey-net-(chrome为示例)"><a href="#下载插件-http-tampermonkey-net-(chrome为示例)" class="headerlink" title="下载插件 http://tampermonkey.net/ (chrome为示例)"></a>下载插件 <a href="http://tampermonkey.net/" target="_blank" rel="external">http://tampermonkey.net/</a> (chrome为示例)</h2><p><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fgie9k7dwrj310w02omxn.jpg" alt=""></p><h2 id="安装网上提供脚本-https-greasyfork-org-zh-CN"><a href="#安装网上提供脚本-https-greasyfork-org-zh-CN" class="headerlink" title="安装网上提供脚本 https://greasyfork.org/zh-CN"></a>安装网上提供脚本 <a href="https://greasyfork.org/zh-CN" target="_blank" rel="external">https://greasyfork.org/zh-CN</a></h2><p>网上提供各种好用的脚本,例如:百度网盘直接下载助手、去广告插件….</p><h2 id="创建自定义脚本"><a href="#创建自定义脚本" class="headerlink" title="创建自定义脚本"></a>创建自定义脚本</h2><p>需求:获取instagram指个账号所有内容列表json<br><img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fgiechjjkpj30mc0b0wg6.jpg" alt=""></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// ==UserScript==</span></div><div class="line"><span class="comment">// @name 获取ins列表json</span></div><div class="line"><span class="comment">// @namespace http://linsage.xyz/</span></div><div class="line"><span class="comment">// @version 0.1</span></div><div class="line"><span class="comment">// @description 获取ins列表json</span></div><div class="line"><span class="comment">// @author You</span></div><div class="line"><span class="comment">// @match https://www.instagram.com/*/</span></div><div class="line"><span class="comment">// @grant GM_xmlhttpRequest</span></div><div class="line"><span class="comment">// @require https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js</span></div><div class="line"><span class="comment">// ==/UserScript==</span></div><div class="line"></div><div class="line">$(<span class="built_in">document</span>).ready(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</div><div class="line"> <span class="comment">//https://www.instagram.com/{username}/?__a=1</span></div><div class="line"> <span class="keyword">var</span> url=<span class="built_in">window</span>.location.toString();</div><div class="line"> <span class="keyword">var</span> username=url.split(<span class="string">"/"</span>)[<span class="number">3</span>];</div><div class="line"> <span class="built_in">console</span>.info(username);</div><div class="line"> <span class="comment">//1.通过username获取userid</span></div><div class="line"> GM_xmlhttpRequest({</div><div class="line"> method: <span class="string">"GET"</span>,</div><div class="line"> url:<span class="string">"https://www.instagram.com/"</span>+username+<span class="string">"/?__a=1"</span>,</div><div class="line"> onload: <span class="function"><span class="keyword">function</span>(<span class="params">response</span>) </span>{</div><div class="line"> <span class="keyword">var</span> jsonObj =<span class="built_in">eval</span>(<span class="string">"("</span>+response.responseText+<span class="string">")"</span>);</div><div class="line"> <span class="keyword">var</span> userid=jsonObj.user.id;</div><div class="line"> <span class="built_in">console</span>.info(userid);</div><div class="line"> <span class="comment">//2.获取内容</span></div><div class="line"> GM_xmlhttpRequest({</div><div class="line"> method: <span class="string">"GET"</span>,</div><div class="line"> url:<span class="string">"https://www.instagram.com/graphql/query/?query_id=17880160963012870&id="</span>+userid+<span class="string">"&first=999"</span>,</div><div class="line"> onload: <span class="function"><span class="keyword">function</span>(<span class="params">result</span>) </span>{</div><div class="line"> <span class="keyword">var</span> contentObj =<span class="built_in">eval</span>(<span class="string">"("</span>+result.responseText+<span class="string">")"</span>);</div><div class="line"> <span class="built_in">console</span>.info(contentObj);</div><div class="line"></div><div class="line"> <span class="keyword">var</span> photo=[];</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i< contentObj.data.user.edge_owner_to_timeline_media.edges.length; i++) {</div><div class="line"> <span class="keyword">var</span> node=contentObj.data.user.edge_owner_to_timeline_media.edges[i].node;</div><div class="line"> photo.push(node);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">var</span> str=<span class="built_in">JSON</span>.stringify(photo) ;</div><div class="line"> <span class="built_in">console</span>.info(str);</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">var</span> x = <span class="built_in">window</span>.open();</div><div class="line"> x.document.open();</div><div class="line"> x.document.write(<span class="string">'<html><body><pre>'</span> + str + <span class="string">'</pre></body></html>'</span>);</div><div class="line"> x.document.close();</div><div class="line"> }</div><div class="line"> });</div><div class="line"> }</div><div class="line"> });</div><div class="line">});</div></pre></td></tr></table></figure><ul><li>@match 匹配url规则下,使用应用当前脚本</li><li>@require 地址引入jQuery</li><li>@grant 使用加强函数 GM_xmlhttpRequest</li><li>GM_xmlhttpRequest:相当于$.ajax用法,发起异步ajax,由于安全限制以此方式发起,并且同域请求(跨域请求每次会提示授权发起)</li></ul><h2 id="效果-https-www-instagram-com-用户名"><a href="#效果-https-www-instagram-com-用户名" class="headerlink" title="效果 https://www.instagram.com/用户名/"></a>效果 <a href="https://www.instagram.com/用户名/" target="_blank" rel="external">https://www.instagram.com/用户名/</a></h2><p><img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fgierx9p45j31kw0ozws2.jpg" alt=""></p><p><img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fgiesu93efj316k122tf4.jpg" alt=""></p>]]></content>
<summary type="html">
TamperMonkey使用
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="chrome" scheme="https://linsage.com/tags/chrome/"/>
</entry>
<entry>
<title>想法与行动</title>
<link href="https://linsage.com/2017/02/01/%E7%94%9F%E6%B4%BB/%E6%83%B3%E6%B3%95%E4%B8%8E%E8%A1%8C%E5%8A%A8/"/>
<id>https://linsage.com/2017/02/01/生活/想法与行动/</id>
<published>2017-02-01T12:24:03.000Z</published>
<updated>2017-07-20T03:16:49.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ww3.sinaimg.cn/large/006tKfTcgy1fcb8lecuzdj30zk0k0tcw.jpg" alt=""></p><p>宝贵时间不能只用来看剧、玩游戏。<br>要跳出自身的循环,必须努力break一次。<br>既然不甘于平庸,就要努力而不止停留于想法,重要是行动。<br>“做事情切忌纠结,先run起来,然后慢慢改进,太多雄心壮志的项目,纠结纠结人就老了,还没做出来。”</p>]]></content>
<summary type="html">
<p><img src="https://ww3.sinaimg.cn/large/006tKfTcgy1fcb8lecuzdj30zk0k0tcw.jpg" alt=""></p>
<p>宝贵时间不能只用来看剧、玩游戏。<br>要跳出自身的循环,必须努力break一次。<br>
</summary>
<category term="生活" scheme="https://linsage.com/categories/%E7%94%9F%E6%B4%BB/"/>
<category term="生活" scheme="https://linsage.com/tags/%E7%94%9F%E6%B4%BB/"/>
</entry>
<entry>
<title>Jfinal整合Druid</title>
<link href="https://linsage.com/2017/01/30/%E6%8A%80%E6%9C%AF/Jfinal+Druid/"/>
<id>https://linsage.com/2017/01/30/技术/Jfinal+Druid/</id>
<published>2017-01-30T14:45:51.000Z</published>
<updated>2017-08-06T02:38:47.000Z</updated>
<content type="html"><![CDATA[<p>JFinal 是基于 Java 语言的极速 WEB + ORM 框架。Druid 是阿里开源的一个数据库连接池,与传统的c3p0、dbcp等数据库连接池相比,特点在于其强大监控功能。<br><a id="more"></a><br>下面演示配置过程。</p><h2 id="相关"><a href="#相关" class="headerlink" title="相关"></a>相关</h2><ul><li>IntelliJ IDEA</li><li>Gradle</li><li>Jfinal</li><li>Druid</li></ul><h2 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h2><figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> testCompile <span class="string">"junit:junit:3.8.1"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">"com.jfinal:jetty-server:8.1.8"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">"com.jfinal:jfinal:3.0"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">"log4j:log4j:1.2.16"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">"mysql:mysql-connector-java:5.1.20"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">"com.jfinal:cos:26Dec2008"</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.alibaba:druid:1.0.27'</span></div><div class="line">}</div></pre></td></tr></table></figure><h2 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h2><h3 id="1-修改web-xml"><a href="#1-修改web-xml" class="headerlink" title="1. 修改web.xml"></a>1. 修改web.xml</h3><p>WebConfig是继承JFinalConfig的启动类</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="meta"><!DOCTYPE web-app PUBLIC</span></div><div class="line"><span class="meta"> "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span></div><div class="line"><span class="meta"> "http://java.sun.com/dtd/web-app_2_3.dtd" ></span></div><div class="line"><span class="tag"><<span class="name">web-app</span>></span></div><div class="line"> <span class="tag"><<span class="name">filter</span>></span></div><div class="line"> <span class="tag"><<span class="name">filter-name</span>></span>jfinal<span class="tag"></<span class="name">filter-name</span>></span></div><div class="line"> <span class="tag"><<span class="name">filter-class</span>></span>com.jfinal.core.JFinalFilter<span class="tag"></<span class="name">filter-class</span>></span></div><div class="line"> <span class="tag"><<span class="name">init-param</span>></span></div><div class="line"> <span class="tag"><<span class="name">param-name</span>></span>configClass<span class="tag"></<span class="name">param-name</span>></span></div><div class="line"> <span class="tag"><<span class="name">param-value</span>></span>xyz.linsage.WebConfig<span class="tag"></<span class="name">param-value</span>></span></div><div class="line"> <span class="tag"></<span class="name">init-param</span>></span></div><div class="line"> <span class="tag"></<span class="name">filter</span>></span></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">filter-mapping</span>></span></div><div class="line"> <span class="tag"><<span class="name">filter-name</span>></span>jfinal<span class="tag"></<span class="name">filter-name</span>></span></div><div class="line"> <span class="tag"><<span class="name">url-pattern</span>></span>/*<span class="tag"></<span class="name">url-pattern</span>></span></div><div class="line"> <span class="tag"></<span class="name">filter-mapping</span>></span></div><div class="line"><span class="tag"></<span class="name">web-app</span>></span></div></pre></td></tr></table></figure><h3 id="2-WebConfig启动类"><a href="#2-WebConfig启动类" class="headerlink" title="2. WebConfig启动类"></a>2. WebConfig启动类</h3><ul><li>main 内置jetty方式启动,</li><li>configConstant,读取相关配置文件</li><li>configPlugin,分别加入StatFilter(监控)、WallFilter(防SQL注入)、Log4jFilter(打印SQL日志)</li><li>configHandler,增加监控平台处理</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 启动类</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@author</span> linsage</span></div><div class="line"><span class="comment"> * <span class="doctag">@create</span> 2017-01-30 下午4:41</span></div><div class="line"><span class="comment"> */</span></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebConfig</span> <span class="keyword">extends</span> <span class="title">JFinalConfig</span> </span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> PORT = <span class="number">8006</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String BASE_URL = <span class="string">"http://localhost:"</span> + PORT;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String WEB_APP = <span class="string">"src/main/webapp"</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String CONTEXT_PATH = <span class="string">"/"</span>;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>{</div><div class="line"> Server server = <span class="keyword">new</span> Server(PORT);</div><div class="line"> WebAppContext context = <span class="keyword">new</span> WebAppContext(WEB_APP, CONTEXT_PATH);</div><div class="line"> server.setHandler(context);</div><div class="line"> server.start();</div><div class="line"> <span class="comment">//打开浏览器</span></div><div class="line"> System.out.println(BASE_URL);</div><div class="line"> Desktop.getDesktop().browse(<span class="keyword">new</span> URI(BASE_URL));</div><div class="line"> server.join();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 配置常量</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> constants</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configConstant</span><span class="params">(Constants constants)</span> </span>{</div><div class="line"> <span class="comment">// 加载少量必要配置,随后可用getProperty(...)获取值</span></div><div class="line"> loadPropertyFile(<span class="string">"config.properties"</span>);</div><div class="line"> constants.setDevMode(getPropertyToBoolean(<span class="string">"devMode"</span>, <span class="keyword">true</span>));</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 配置路由</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> routes</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configRoute</span><span class="params">(Routes routes)</span> </span>{</div><div class="line"> routes.add(<span class="string">"/"</span>, HomeController.class);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configEngine</span><span class="params">(Engine me)</span> </span>{</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 配置插件</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> plugins</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configPlugin</span><span class="params">(Plugins plugins)</span> </span>{</div><div class="line"> <span class="comment">// 配置druid数据库连接池插件</span></div><div class="line"> DruidPlugin druidPlugin = <span class="keyword">new</span> DruidPlugin(getProperty(<span class="string">"jdbcUrl"</span>), getProperty(<span class="string">"user"</span>), getProperty(<span class="string">"password"</span>));</div><div class="line"> druidPlugin.setInitialSize(getPropertyToInt(<span class="string">"druid.InitialSize"</span>, <span class="number">10</span>));</div><div class="line"> druidPlugin.setMinIdle(getPropertyToInt(<span class="string">"druid.MinIdle"</span>, <span class="number">10</span>));</div><div class="line"> druidPlugin.setMaxActive(getPropertyToInt(<span class="string">"druid.MaxActive"</span>, <span class="number">100</span>));</div><div class="line"> <span class="comment">//监控</span></div><div class="line"> StatFilter statFilter = <span class="keyword">new</span> StatFilter();</div><div class="line"> statFilter.setLogSlowSql(getPropertyToBoolean(<span class="string">"druid.logSlowSql"</span>, <span class="keyword">false</span>));</div><div class="line"> statFilter.setSlowSqlMillis(getPropertyToInt(<span class="string">"druid.slowSqlMillis"</span>,<span class="number">3</span>*<span class="number">1000</span>));</div><div class="line"> druidPlugin.addFilter(statFilter);</div><div class="line"> <span class="comment">//防注入</span></div><div class="line"> WallFilter wallFilter = <span class="keyword">new</span> WallFilter();</div><div class="line"> wallFilter.setDbType(<span class="string">"mysql"</span>);</div><div class="line"> druidPlugin.addFilter(wallFilter);</div><div class="line"> <span class="comment">//日志</span></div><div class="line"> Log4jFilter log4jFilter = <span class="keyword">new</span> Log4jFilter();</div><div class="line"> log4jFilter.setDataSourceLogEnabled(<span class="keyword">false</span>);</div><div class="line"> log4jFilter.setConnectionLogEnabled(<span class="keyword">false</span>);</div><div class="line"> log4jFilter.setStatementLogEnabled(<span class="keyword">false</span>);</div><div class="line"> log4jFilter.setResultSetLogEnabled(<span class="keyword">false</span>);</div><div class="line"> log4jFilter.setStatementExecutableSqlLogEnable(<span class="keyword">true</span>); <span class="comment">//只开启执行sql</span></div><div class="line"> druidPlugin.addFilter(log4jFilter);</div><div class="line"></div><div class="line"> plugins.add(druidPlugin);</div><div class="line"></div><div class="line"> <span class="comment">// 配置ActiveRecord插件</span></div><div class="line"> ActiveRecordPlugin arp = <span class="keyword">new</span> ActiveRecordPlugin(druidPlugin);</div><div class="line"> arp.addMapping(<span class="string">"user"</span>, User.class);</div><div class="line"> <span class="comment">//arp.setShowSql(true);</span></div><div class="line"> plugins.add(arp);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 配置全局拦截器</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> interceptors</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configInterceptor</span><span class="params">(Interceptors interceptors)</span> </span>{</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"><span class="comment"> * 配置处理器</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * <span class="doctag">@param</span> handlers</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">configHandler</span><span class="params">(Handlers handlers)</span> </span>{</div><div class="line"> DruidStatViewHandler dvh = <span class="keyword">new</span> DruidStatViewHandler(getProperty(<span class="string">"druid.visitPath"</span>));</div><div class="line"> handlers.add(dvh);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure><h3 id="3-项目配置config-properties"><a href="#3-项目配置config-properties" class="headerlink" title="3. 项目配置config.properties"></a>3. 项目配置config.properties</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">jdbcUrl = jdbc:mysql://127.0.0.1:3306/scaffold?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull</div><div class="line">user = root</div><div class="line">password = 123456</div><div class="line">devMode = true</div><div class="line">#druid</div><div class="line">druid.InitialSize = 10</div><div class="line">druid.MinIdle = 10</div><div class="line">druid.MaxActive = 100</div><div class="line">#监控页面</div><div class="line">druid.visitPath = /zs</div><div class="line">#慢sql</div><div class="line">druid.logSlowSql = true</div><div class="line">druid.slowSqlMillis = 3000</div></pre></td></tr></table></figure><h3 id="4-日志配置log4j-properties"><a href="#4-日志配置log4j-properties" class="headerlink" title="4. 日志配置log4j.properties"></a>4. 日志配置log4j.properties</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"># 根级别WARN,添加stdout、file输出</div><div class="line">log4j.rootLogger=WARN, stdout, file</div><div class="line"></div><div class="line"># 打印到控制台,日志级别DEBUG</div><div class="line">log4j.appender.stdout=org.apache.log4j.ConsoleAppender</div><div class="line">log4j.appender.stdout.Threshold=DEBUG</div><div class="line">log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</div><div class="line">log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n</div><div class="line"></div><div class="line"># 打印到文件,每天一个文件,日志级别WARN</div><div class="line">log4j.appender.file=org.apache.log4j.DailyRollingFileAppender</div><div class="line">log4j.appender.file.DatePattern='_'yyyy-MM-dd'.log'</div><div class="line">log4j.appender.file.File=./scaffold.log</div><div class="line">log4j.appender.file.Threshold=WARN</div><div class="line">log4j.appender.file.layout=org.apache.log4j.PatternLayout</div><div class="line">log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n</div><div class="line"></div><div class="line"># Druid *注意只能配一个值,避免重复打印*</div><div class="line">log4j.logger.druid.sql=WARN</div><div class="line">log4j.logger.druid.sql.DataSource=WARN</div><div class="line">log4j.logger.druid.sql.Connection=WARN</div><div class="line"># 当前执行sql只打印到控制台</div><div class="line">log4j.logger.druid.sql.Statement=DEBUG</div><div class="line">log4j.logger.druid.sql.ResultSet=WARN</div></pre></td></tr></table></figure><h2 id="打印SQL问题"><a href="#打印SQL问题" class="headerlink" title="打印SQL问题"></a>打印SQL问题</h2><p>由于jfinal自带打印sql,只能打印,不能打印出参数。改用druid打印,为了避免打印日志重复及过多,只开启执行sql打印及。<br><img src="https://ww2.sinaimg.cn/large/006y8lVagy1fc9lmm69dwj30z00bu420.jpg" alt=""><br>日志级别,控制台只输出DEBUG级别(打印sql),实际部署运行文件打印只输出WARN级别<br><img src="https://ww4.sinaimg.cn/large/006y8lVagy1fc9lnkhhexj30ue0ag76l.jpg" alt=""></p><h2 id="druid监控页面"><a href="#druid监控页面" class="headerlink" title="druid监控页面"></a>druid监控页面</h2><p>由于通过jfinal直接代码配置,非传统xml配置,登录账户及密码权限验证,需要自定义控制验证,我为了简化,只改变区分一般druid.visitPath来完成安全隐藏。<br><img src="https://ww3.sinaimg.cn/large/006y8lVagy1fc9lvnl9dnj313a0a6jty.jpg" alt=""></p>]]></content>
<summary type="html">
Jfinal整合Druid
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="数据库" scheme="https://linsage.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
</entry>
<entry>
<title>Jenkins持续集成</title>
<link href="https://linsage.com/2017/01/16/%E6%8A%80%E6%9C%AF/Jenkins%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
<id>https://linsage.com/2017/01/16/技术/Jenkins持续集成/</id>
<published>2017-01-16T01:39:38.000Z</published>
<updated>2017-08-20T07:34:39.000Z</updated>
<content type="html"><![CDATA[<h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs83foay8j30ot0cu3yu.jpg" alt=""></p><a id="more"></a><h2 id="测试环境"><a href="#测试环境" class="headerlink" title="测试环境"></a>测试环境</h2><ul><li>CI服务器<ul><li>JDK1.7</li><li>Gradle</li><li>Git</li></ul></li><li>相关文件目录:/home/ci</li><li>默认Jenkins运行目录:/root/.jenkins</li></ul><h2 id="使用示例"><a href="#使用示例" class="headerlink" title="使用示例"></a>使用示例</h2><h3 id="1-安装JDK并配置环境变量(略)"><a href="#1-安装JDK并配置环境变量(略)" class="headerlink" title="1. 安装JDK并配置环境变量(略)"></a>1. 安装JDK并配置环境变量(略)</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">JAVA_HOME=/usr/local/jdk1.7.0_79</div></pre></td></tr></table></figure><h3 id="2-安装Gradle(自动化构建工具)"><a href="#2-安装Gradle(自动化构建工具)" class="headerlink" title="2. 安装Gradle(自动化构建工具)"></a>2. 安装Gradle(自动化构建工具)</h3><p>(1) 下载gradle2.7</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">wget https://services.gradle.org/distributions/gradle-2.7-all.zip</div></pre></td></tr></table></figure><p>(2) 解压</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">jar -xvf gradle-2.7-all.zip // 或 unzip gradle-2.7-all.zip</div></pre></td></tr></table></figure><p>(3) 配置环境变量(GRADLE_HOME)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">vi /etc/profile</div><div class="line">export GRADLE_HOME=/home/ci/gradle-2.7</div><div class="line">export JAVA_HOME=/usr/local/jdk1.7.0_79</div><div class="line">export PATH=$JAVA_HOME/bin:$PATH:$GRADLE_HOME/bin</div><div class="line">source /etc/profile</div></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">gradle --version //Gradle 2.7</div></pre></td></tr></table></figure><h3 id="3-安装Git(源码管理)"><a href="#3-安装Git(源码管理)" class="headerlink" title="3. 安装Git(源码管理)"></a>3. 安装Git(源码管理)</h3><p>(1) 下载并安装Git(版本要求: 1.7.9 minimum, 1.8.x recommended )</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum -y install git</div></pre></td></tr></table></figure><p>(2) 升级或者移除并源码安装<br><a href="http://tecadmin.net/how-to-upgrade-git-version-1-7-10-on-centos-6/" target="_blank" rel="external">升级1.7.10教程</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">wget https://github.com/git/git/archive/v2.2.1.tar.gz</div><div class="line">tar -zxvf v2.2.1.tar.gz</div><div class="line">cd git-2.2.1</div><div class="line">make configure</div><div class="line">./configure -prefix=/usr/local/git --with-curl --with-expat</div><div class="line">make && make install</div></pre></td></tr></table></figure><p>(3) 添加到环境变量</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">vi /etc/profile</div><div class="line">export GIT_HOME=/usr/local/git</div><div class="line">export PATH=$JAVA_HOME/bin:$PATH:$GRADLE_HOME/bin:$GIT_HOME/libexec/git-core</div><div class="line">source /etc/profile</div></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">git --version //git version 2.2.1</div></pre></td></tr></table></figure><h3 id="4-安装Jenkins(CI)"><a href="#4-安装Jenkins(CI)" class="headerlink" title="4. 安装Jenkins(CI)"></a>4. 安装Jenkins(CI)</h3><p>(1) 下载配置Tomcat容器</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.64/bin/apache-tomcat-7.0.64.tar.gz</div><div class="line">tar -zxvf apache-tomcat-7.0.64.tar.gz </div><div class="line">#删除多余自带应用</div><div class="line">rm -rf apache-tomcat-7.0.64/webapps/*</div></pre></td></tr></table></figure><p>(2) 设置编码UTF-8</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vi apache-tomcat-7.0.64/conf/server.xml</div></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><Connector port="8080" protocol="HTTP/1.1"</div><div class="line"> URIEncoding="UTF-8"</div><div class="line"> connectionTimeout="20000"</div><div class="line"> redirectPort="8443" /></div><div class="line">```![]()</div><div class="line">(3) 设置内存(可选,多任务执行下需要)</div></pre></td></tr></table></figure><p>vi apache-tomcat-7.0.64/bin/catalina.sh </p><p>#!/bin/sh 下面 增加:<br>JAVA_HOME=’/usr/local/jdk1.8’<br>JAVA_OPTS=’-Xms256m -Xmx512m -Djava.security.egd=file:/dev/./urandom’<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">(4) 下载Jenkins</div></pre></td></tr></table></figure></p><p>cd apache-tomcat-7.0.64/webapps/<br>mkdir ROOT<br>cd ROOT<br>wget <a href="http://mirrors.jenkins-ci.org/war/1.632/jenkins.war" target="_blank" rel="external">http://mirrors.jenkins-ci.org/war/1.632/jenkins.war</a><br>jar -xvf jenkins.war // 或 unzip jenkins.war<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(5) 防火墙开放8080端口</div></pre></td></tr></table></figure></p><p>vi /etc/sysconfig/iptables</p><p>#jenkis-tomcat<br>-A INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT</p><p>#重启服务<br>service iptables restart<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(6) 设置开机自动启动</div></pre></td></tr></table></figure></p><p>vi /etc/rc.local </p><p>#加入<br>/home/ci/apache-tomcat-7.0.64/bin/startup.sh<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(7) 启动Jenkins</div></pre></td></tr></table></figure></p><p>/home/ci/apache-tomcat-7.0.64/bin/startup.sh<br>```</p><h3 id="4-配置Jenkins"><a href="#4-配置Jenkins" class="headerlink" title="4. 配置Jenkins"></a>4. 配置Jenkins</h3><p>(1) 安全设置<br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs92poelrj30zx0iqjst.jpg" alt=""><br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs92z4bt3j30qz0h6758.jpg" alt=""><br>(2) 注册一个超级管理员账号<br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs93fjklmj307o058gli.jpg" alt=""><br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs93uudnqj30jq0d03yp.jpg" alt=""><br>(3) 插件安装<br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs94dsuywj30st0e3wfe.jpg" alt=""><br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs94jetzrj30qk0c8dgn.jpg" alt=""><br>Git插件<br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs9559inej30p502e0sr.jpg" alt=""><br>Gradle插件<br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs95dbyw1j30pg01m0sl.jpg" alt=""><br>远程SSH插件<br><img src="https://ww3.sinaimg.cn/large/006tNc79gw1fbs95o4qy1j30p101f744.jpg" alt=""><br>(4) 系统设置<br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs95vacpkj30s30cr0th.jpg" alt=""><br>JDK<br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs967xx44j30ov07c74e.jpg" alt=""><br>Git<br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs96f91wxj30or03x0sp.jpg" alt=""><br>Gradle<br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs96o7kizj30oo04ojrd.jpg" alt=""><br>邮箱通知<br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs97cc7h3j310g0pqmyf.jpg" alt=""></p><h3 id="5-配置远程服务器"><a href="#5-配置远程服务器" class="headerlink" title="5. 配置远程服务器"></a>5. 配置远程服务器</h3><p><img src="https://ww3.sinaimg.cn/large/006tNc79gw1fbs9845cqdj30px0c90tg.jpg" alt=""><br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs989rw9tj30oj0f874n.jpg" alt=""></p><h3 id="6-构建任务"><a href="#6-构建任务" class="headerlink" title="6.构建任务"></a>6.构建任务</h3><p>(1)创建任务<br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs98rduo9j30mo092q3d.jpg" alt=""><br>(2)源码配置<br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs9aaidvmj30zy0c2mxk.jpg" alt=""><br>(3)gradle编译<br><img src="https://ww3.sinaimg.cn/large/006tNc79gw1fbs9ajonhpj308n05gdfs.jpg" alt=""><br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs9apcx9zj30ou0chgm3.jpg" alt=""><br>(4)查看工作区<br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs9bbmwsmj30q006jq2v.jpg" alt=""><br><img src="https://ww1.sinaimg.cn/large/006tNc79gw1fbs9bxce56j30cu0fat94.jpg" alt=""><br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs9ceabbmj30mw07st94.jpg" alt=""><br>(5)部署<br><img src="https://ww3.sinaimg.cn/large/006tNc79gw1fbs9cthi1tj308507twek.jpg" alt=""><br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs9cy9542j30nx0gp75h.jpg" alt=""><br><img src="https://ww2.sinaimg.cn/large/006tNc79gw1fbs9d6t6m4j30zn0dot9b.jpg" alt=""><br>(6)邮件通知<br><img src="https://ww4.sinaimg.cn/large/006tNc79gw1fbs9e4ue2hj31260o0abv.jpg" alt=""></p>]]></content>
<summary type="html">
Jenkins持续集成
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="ci" scheme="https://linsage.com/tags/ci/"/>
</entry>
<entry>
<title>提高终端的颜值</title>
<link href="https://linsage.com/2016/12/19/%E6%8A%80%E6%9C%AF/%E6%8F%90%E9%AB%98%E7%BB%88%E7%AB%AF%E7%9A%84%E9%A2%9C%E5%80%BC/"/>
<id>https://linsage.com/2016/12/19/技术/提高终端的颜值/</id>
<published>2016-12-19T03:40:17.000Z</published>
<updated>2017-08-06T02:38:34.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ww2.sinaimg.cn/large/006tNbRwgy1fc460c69a3j309a098mxg.jpg" alt=""></p><p>程序员长期面对命令行终端和代码编写器,一套看着舒服、自己喜爱的编程字体和配色方案,能提高工作效率,享受编程乐趣。因为每个人喜好不一样,没有唯一的,只有适合自己的。<br><a id="more"></a></p><h2 id="编程字体"><a href="#编程字体" class="headerlink" title="编程字体"></a>编程字体</h2><ul><li><p>Droid Sans Mono:Google的Droid字体家族中一员,专门用来开发Android平台上的应用<br> <img src="https://ww1.sinaimg.cn/large/006tNbRwgy1fc460jdzf9j3099047q2x.jpg" alt=""></p></li><li><p>Monaco:Mac平台,默认字体,个人最喜欢的编程字体<br> <img src="https://ww1.sinaimg.cn/large/006tNbRwgy1fc460sg1moj305y06st8o.jpg" alt=""></p></li><li><p>Consolas:是商业字体,专门为微软设计。<br> <img src="https://ww2.sinaimg.cn/large/006tNbRwgy1fc460wsgayj306y08cglr.jpg" alt=""></p></li><li><p>Source Code Pro:Adobe公司开放的英文开源字集,适用於Linux、Mac OS X和Windows<br> <img src="https://ww4.sinaimg.cn/large/006tNbRwgy1fc4615a1inj305w06wmx6.jpg" alt=""></p></li><li><p>Courier New:Courier 的一个变体,由 Adrian Frutiger 为 IBM 打字机设计的。<br> <img src="https://ww1.sinaimg.cn/large/006tNbRwgy1fc461bq0c7j306w07omx4.jpg" alt=""></p></li></ul><h2 id="Solarized配色方案"><a href="#Solarized配色方案" class="headerlink" title="Solarized配色方案"></a>Solarized配色方案</h2><ol><li>跨平台的配色方案,支持多种编辑器和IDE,如Vim,iTerm2、IntelliJ IDEA…。背景色分dark和light,个人偏好light。<a href="http://ethanschoonover.com/solarized" target="_blank" rel="external">官方介绍</a><br><img src="https://ww1.sinaimg.cn/large/006tNbRwgy1fc461ijnb3j30fg0f0757.jpg" alt=""></li></ol><h2 id="SecretCRT配色方案"><a href="#SecretCRT配色方案" class="headerlink" title="SecretCRT配色方案"></a>SecretCRT配色方案</h2><p>由于SecretCRT商业软件,暂时没有Solarized配色支持,ssh操作不可避免使用的软件。 <a href="http://jingyan.baidu.com/article/a681b0dec6c0783b1943467e.html" target="_blank" rel="external">SecretCRT配色方案</a><br><img src="https://ww4.sinaimg.cn/large/006tNbRwgy1fc461qckvzj30fg0f0757.jpg" alt=""></p>]]></content>
<summary type="html">
提高终端的颜值
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="vim" scheme="https://linsage.com/tags/vim/"/>
</entry>
<entry>
<title>使用Hexo+Github搭建个人博客</title>
<link href="https://linsage.com/2016/12/15/%E6%8A%80%E6%9C%AF/%E4%BD%BF%E7%94%A8Hexo+Github%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2/"/>
<id>https://linsage.com/2016/12/15/技术/使用Hexo+Github搭建博客/</id>
<published>2016-12-15T02:03:13.000Z</published>
<updated>2017-08-06T02:40:18.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://ww1.sinaimg.cn/large/006tNbRwgy1fc45yvqxlwj30wa0jwmxk.jpg" alt=""></p><p>开篇之作,一直想写些技术与学习相关的文章分享。向别人讲述一个知识学习方法和经验,分享总是比个人单纯学会要难,需要考虑很多东西,包括学习方法、遇到问题、讲述方式、写作手法等。与别人分享知识的过程,同时也是个人学习的过程。<br><a id="more"></a></p><h2 id="预备知识"><a href="#预备知识" class="headerlink" title="预备知识"></a>预备知识</h2><ul><li>Git基础命令使用</li><li>Github使用</li><li>Hexo安装与使用</li><li>Markdown语法</li></ul><h2 id="搭建过程"><a href="#搭建过程" class="headerlink" title="搭建过程"></a>搭建过程</h2><h3 id="一、GitHub-Pages"><a href="#一、GitHub-Pages" class="headerlink" title="一、GitHub Pages"></a>一、GitHub Pages</h3><p>专属于个人的静态网页托管项目,稳定可靠,<a href="https://pages.github.com/" target="_blank" rel="external">官网介绍</a>。</p><h4 id="1-注册GitHub。"><a href="#1-注册GitHub。" class="headerlink" title="1. 注册GitHub。"></a>1. 注册GitHub。</h4><p>创建用户名一个username.github.io。username-实际用户名。</p><h4 id="2-配置项目信息"><a href="#2-配置项目信息" class="headerlink" title="2. 配置项目信息"></a>2. 配置项目信息</h4><p><img src="https://ww4.sinaimg.cn/large/006tNbRwgy1fc45ziwy2ej312m0ss75n.jpg" alt=""></p><h4 id="3-通过git下载本地"><a href="#3-通过git下载本地" class="headerlink" title="3. 通过git下载本地"></a>3. 通过git下载本地</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">git clone https://github.com/username/username.github.io</div></pre></td></tr></table></figure><h4 id="4-创建默认页"><a href="#4-创建默认页" class="headerlink" title="4. 创建默认页"></a>4. 创建默认页</h4><p>创建index.html页面,git推到远程服务器</p><h4 id="5-浏览"><a href="#5-浏览" class="headerlink" title="5. 浏览"></a>5. 浏览</h4><p> <a href="http://linsage.github.io" target="_blank" rel="external">http://linsage.github.io</a></p><h3 id="二、Hexo博客框架"><a href="#二、Hexo博客框架" class="headerlink" title="二、Hexo博客框架"></a>二、Hexo博客框架</h3><p>Hexo 是一个快速、简洁且高效的博客框架,最终生成静态网页,<a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="external">官网介绍</a>。</p><h4 id="1-安装Hexo"><a href="#1-安装Hexo" class="headerlink" title="1. 安装Hexo"></a>1. 安装Hexo</h4><p><a href="https://hexo.io/zh-cn/docs/index.html" target="_blank" rel="external">安装介绍</a><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">npm install -g hexo-cli</div></pre></td></tr></table></figure></p><h4 id="2-hexo命令"><a href="#2-hexo命令" class="headerlink" title="2. hexo命令"></a>2. hexo命令</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">hexo init #初始化</div><div class="line">hexo g #生成静态网页</div><div class="line">hexo s #启动服务,默认4000端口</div><div class="line">hexo d #部署</div><div class="line">hexo n #写文章</div></pre></td></tr></table></figure><h4 id="3-选择yilia主题"><a href="#3-选择yilia主题" class="headerlink" title="3. 选择yilia主题"></a>3. 选择yilia主题</h4><p>hexo提供很多主题选择,根据喜好选择。<br>修改hexo根目录下的 <code>_config.yml</code> : <code>theme: yilia</code><br><a href="https://github.com/litten/hexo-theme-yilia" target="_blank" rel="external">yilia主题</a></p><h4 id="4-部署到github"><a href="#4-部署到github" class="headerlink" title="4. 部署到github"></a>4. 部署到github</h4><h3 id="三、域名解析"><a href="#三、域名解析" class="headerlink" title="三、域名解析"></a>三、域名解析</h3><p>域名推荐到阿里云或者godaddy购买,国内需要实名认证后才能正常解析。<br>linsage.xyz域名下,子域名blog,相当于linsage.xyz<br>增加CNAME记录<br><img src="https://ww2.sinaimg.cn/large/006tNbRwgy1fc45zwli6nj31j00480sx.jpg" alt=""><br>增加CNAME文件<br><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fgdy946sf8j30lw0ds0tx.jpg" alt=""></p><p>等1分钟后,访问 <a href="http://linsage.xyz" target="_blank" rel="external">http://linsage.xyz</a> 即可</p><h2 id="相关软件"><a href="#相关软件" class="headerlink" title="相关软件"></a>相关软件</h2><ul><li>MacOS</li><li>MWeb,专注于markdown语法编辑器。</li><li>iPic,图床上传工具</li><li>坚果云同步盘</li></ul>]]></content>
<summary type="html">
使用Hexo+Github搭建个人博客
</summary>
<category term="技术" scheme="https://linsage.com/categories/%E6%8A%80%E6%9C%AF/"/>
<category term="技术" scheme="https://linsage.com/tags/%E6%8A%80%E6%9C%AF/"/>
<category term="hexo" scheme="https://linsage.com/tags/hexo/"/>
</entry>
</feed>