-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathatom.xml
521 lines (291 loc) · 161 KB
/
atom.xml
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
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>认真搞定一切</title>
<subtitle>会思考的天蝎座</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.cuteximi.com/"/>
<updated>2018-10-13T03:17:39.026Z</updated>
<id>http://blog.cuteximi.com/</id>
<author>
<name>cuteximi</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>一站式解决服务器缺少编译环境的问题,别再为了缺少依赖而烦恼了!</title>
<link href="http://blog.cuteximi.com/%E4%B8%80%E7%AB%99%E5%BC%8F%E8%A7%A3%E5%86%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BC%BA%E5%B0%91%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%8C%E5%88%AB%E5%86%8D%E4%B8%BA%E4%BA%86%E7%BC%BA%E5%B0%91%E4%BE%9D%E8%B5%96%E8%80%8C%E7%83%A6%E6%81%BC%E4%BA%86%EF%BC%81/"/>
<id>http://blog.cuteximi.com/一站式解决服务器缺少编译环境的问题,别再为了缺少依赖而烦恼了!/</id>
<published>2018-10-13T03:17:00.000Z</published>
<updated>2018-10-13T03:17:39.026Z</updated>
<content type="html"><![CDATA[<p>本文参考:<a href="https://github.com/pyenv/pyenv/wiki/Common-build-problems" target="_blank" rel="noopener">https://github.com/pyenv/pyenv/wiki/Common-build-problems</a></p><p>Ubuntu / Debian 系统:</p><pre><code>sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \xz-utils tk-dev libffi-dev liblzma-dev</code></pre><p>Fedro / Centos /RHEL 系统:</p><pre><code>sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel \openssl-devel xz xz-devel libffi-devel</code></pre><p>openSUSE :</p><pre><code>zypper in zlib-devel bzip2 libbz2-devel readline-devel sqlite3 sqlite3-devel libopenssl-devel xz xz-devel</code></pre><p>macOS:</p><pre><code>brew install readline xz</code></pre><p>如果你的 macOS 是Mojave or higher (10.14+)</p><pre><code>sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /</code></pre><p><strong>NOTE:</strong> <code>libssl-dev</code> is required when compiling Python, installing <code>libssl-dev</code> will actually install <code>zlib1g-dev</code>, which leads to uninstall and re-install Python versions (installed before installing libssl-dev). On Redhat and derivatives the package is named <code>openssl-devel</code>.</p>]]></content>
<summary type="html">
<p>本文参考:<a href="https://github.com/pyenv/pyenv/wiki/Common-build-problems" target="_blank" rel="noopener">https://github.com/pyenv/pyenv/wi
</summary>
<category term="编译环境" scheme="http://blog.cuteximi.com/categories/%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83/"/>
</entry>
<entry>
<title>解决这个警告⚠️:warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory</title>
<link href="http://blog.cuteximi.com/%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E8%AD%A6%E5%91%8A%E2%9A%A0%EF%B8%8F%EF%BC%9Awarning-setlocale-LC-CTYPE-cannot-change-locale-UTF-8-No-such-file-or-directory/"/>
<id>http://blog.cuteximi.com/解决这个警告⚠️:warning-setlocale-LC-CTYPE-cannot-change-locale-UTF-8-No-such-file-or-directory/</id>
<published>2018-10-13T03:15:00.000Z</published>
<updated>2018-10-13T04:01:50.856Z</updated>
<content type="html"><![CDATA[<blockquote><p>建议直接看方案2</p></blockquote><p>在电脑上使用终端连接服务器的时候,经常会打印出如下警告:</p><font color="##666600">warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory</font><p>在网上查找相关解决方案:于是找到一篇文章:<a href="https://www.cyberciti.biz/faq/os-x-terminal-bash-warning-setlocale-lc_ctype-cannot-change-locale/" target="_blank" rel="noopener">OS X Terminal: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory Fix</a></p><h3 id="解决方案1"><a href="#解决方案1" class="headerlink" title="解决方案1"></a>解决方案1</h3><p>我使用的终端是 <strong>iTerm2</strong>, 找到它的配置( iTerm2 > Preference > Advanced):修改为如图:</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-e553a576dd00c45c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p>出现上述警告本质上$LC_CTYPE 这个环境变量导致的。</p><p>查看我的物理机的 locale 配置:</p><pre><code>ximi:~$ localeLANG=LC_COLLATE="C"LC_CTYPE="UTF-8"LC_MESSAGES="C"LC_MONETARY="C"LC_NUMERIC="C"LC_TIME="C"LC_ALL=</code></pre><p>查看服务器的配置:</p><pre><code>LANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=</code></pre><p>物理机会传递 LC_CTYPE 参数给服务器,从而修改了服务器上的 LC_CTYPE 参数,导致服务器不认识。</p><p>所以,可以禁用终端传递该参数。</p><h2 id="解决方案2"><a href="#解决方案2" class="headerlink" title="解决方案2"></a>解决方案2</h2><p>方案1不是很完美,只是在逃避问题。还存在乱码问题</p><p>仔细想一想,这类问题是由于服务器和本机的 locale 配置不一样。</p><p>只要保持本地的和服务器的一致就可以了。</p><p>我使用的是 iterm2终端,对应的配置文件 .bash_profile或.bashrc文件。</p><p>只需要加入如下两行内容即可:</p><pre><code>export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8</code></pre><p><code>locale</code> 分别再服务器和本机上执行,输出类似的结果:</p><pre><code>LANG="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_CTYPE="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_ALL="en_US.UTF-8"</code></pre><p>此时,不会乱码,也不会存在那个警告了。</p>]]></content>
<summary type="html">
<blockquote>
<p>建议直接看方案2</p>
</blockquote>
<p>在电脑上使用终端连接服务器的时候,经常会打印出如下警告:</p>
<font color="##666600">warning: setlocale: LC_CTYPE: cannot c
</summary>
<category term="字符编码" scheme="http://blog.cuteximi.com/categories/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81/"/>
</entry>
<entry>
<title>运行gulp项目报错:AssertionError: Task function must be specified</title>
<link href="http://blog.cuteximi.com/%E8%BF%90%E8%A1%8Cgulp%E9%A1%B9%E7%9B%AE%E6%8A%A5%E9%94%99%EF%BC%9AAssertionError-Task-function-must-be-specified/"/>
<id>http://blog.cuteximi.com/运行gulp项目报错:AssertionError-Task-function-must-be-specified/</id>
<published>2018-10-13T03:12:57.000Z</published>
<updated>2018-10-13T03:21:16.395Z</updated>
<content type="html"><![CDATA[<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>今天像往常一样,编写文章,并使用gulp bulid压缩代码,但是一运行:gulp build 就出现了这个错误:<font color="#dd0000">AssertionError: Task function must be specified。</font></p><p>gulp项目需要全局安装gulp和项目内安装gulp,通过 gulp -v 查看全局gulp 和本地项目的gulp版本:</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-cea39e76cbf4f6f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p>这俩显然,不一致。</p><p>下面,我们可以看到项目里记录的gulp的版本号:<br><img src="https://upload-images.jianshu.io/upload_images/5317394-e6a63cbcf9ba985a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><h2 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h2><p>可以卸载修改json文件里面的版本号:为gulp 3 版本。如 3.9.1</p><p>重新运行 npm install</p><hr><p>gulp 3 和 gulp 4运行方式是不一样的,所以会出现错误。具体细节,可以看这里</p><h3 id="gup3-VS-gulp4-区别"><a href="#gup3-VS-gulp4-区别" class="headerlink" title="gup3 VS gulp4 区别"></a>gup3 VS gulp4 区别</h3><blockquote><p>Gulp 4最大的变化就是你不能像以前那样传递一个依赖任务列表。</p></blockquote><p>Gulp3,如果有一个任务A,B和C的列表,你想在一个序列中运行(确保A在B开始之前完成,而B在C开始之前完成),代码如下:</p><pre><code>gulp.task('a', function () { // Do something.});gulp.task('b', ['a'], function () { // Do some stuff.});gulp.task('c', ['b'], function () { // Do some more stuff.});</code></pre><p>在Gulp 4中,你不能再这样做了。你会得到以下错误:</p><pre><code>assert.js:85 throw new assert.AssertionError({ ^AssertionError: Task function must be specified at Gulp.set [as _setTask] (/home/hope/web/node_modules/undertaker/lib/set-task.js:10:3) at Gulp.task (/home/hope/web/node_modules/undertaker/lib/task.js:13:8) at Object.<anonymous> (/home/hope/web/gulpfile.js:31:6) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.require (module.js:497:17) at require (internal/module.js:20:19)</code></pre><p>不要用Gulp3的方式指定依赖任务,你需要使用<strong>gulp.series</strong>和<strong>gulp.paralle</strong>l,因为gulp任务现在只有两个参数。</p><blockquote><p>gulp.series:按照顺序执行<br>gulp.paralle:可以并行计算</p></blockquote><pre><code>gulp.task('my-tasks', gulp.series('a', 'b', 'c', function() { // Do something after a, b, and c are finished.}));</code></pre><pre><code>gulp.task('build', gulp.parallel('styles', 'scripts', 'images', function () { // Build the website.}));</code></pre><p>或者这样</p><pre><code>gulp.task('my-tasks', gulp.series('a', gulp.parallel('styles','scripts', 'images'), 'b', 'c', function() { // Do something after a, b, and c are finished.}));</code></pre><blockquote><p>相关任务必须在被调用之前发生。</p></blockquote><p>参考:<br><a href="https://link.jianshu.com?t=https%3A%2F%2Fgithub.com%2Fgulpjs%2Fgulp%2Fblob%2Fmaster%2Fdocs%2FAPI.md" target="_blank" rel="noopener">https://github.com/gulpjs/gulp/blob/master/docs/API.md</a><br><a href="https://link.jianshu.com?t=https%3A%2F%2Fwww.fastless.com%2Fgulp-4" target="_blank" rel="noopener">https://www.fastless.com/gulp-4</a><br><a href="https://www.jianshu.com/p/40b99bed3127" target="_blank" rel="noopener">https://www.jianshu.com/p/40b99bed3127</a></p>]]></content>
<summary type="html">
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>今天像往常一样,编写文章,并使用gulp bulid压缩代码,但是一运行:gulp build 就出现了这个错误:<font
</summary>
<category term="gulp" scheme="http://blog.cuteximi.com/tags/gulp/"/>
</entry>
<entry>
<title>make 和 make install 的区别</title>
<link href="http://blog.cuteximi.com/make%E5%92%8Cmakeinstall%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
<id>http://blog.cuteximi.com/make和makeinstall的区别/</id>
<published>2018-10-13T03:10:21.000Z</published>
<updated>2018-10-13T03:32:21.253Z</updated>
<content type="html"><![CDATA[<p>简单来说,make 是编译,make install 是安装…</p><h2 id="总结:linux编译安装中configure、make和make-install各自的作用"><a href="#总结:linux编译安装中configure、make和make-install各自的作用" class="headerlink" title="总结:linux编译安装中configure、make和make install各自的作用"></a>总结:linux编译安装中configure、make和make install各自的作用</h2><ul><li><p>./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。</p></li><li><p>make是用来编译的,它从Makefile中读取指令,然后编译。</p></li><li>make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。</li></ul><p><strong>1、configure</strong></p><p>这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:<code>./configure --prefix=/usr</code>上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin.同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。</p><p><strong>2、make</strong></p><p>这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或Python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。<br>make 是 Linux 开发套件里面自动化编译的一个控制程序,他通过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些需要的程序进行编译的程序。一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。</p><p><strong>3、make install</strong></p><p>这条命令来进行安装(当然有些软件需要先运行 make check 或 make test来进行一些测试),这一步一般需要你有 <strong>root 权限</strong>(因为要向系统写入文件)</p>]]></content>
<summary type="html">
<p>简单来说,make 是编译,make install 是安装…</p>
<h2 id="总结:linux编译安装中configure、make和make-install各自的作用"><a href="#总结:linux编译安装中configure、make和make-ins
</summary>
<category term="编译程序" scheme="http://blog.cuteximi.com/categories/%E7%BC%96%E8%AF%91%E7%A8%8B%E5%BA%8F/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录7-一些键盘按键技巧</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%957-%E4%B8%80%E4%BA%9B%E9%94%AE%E7%9B%98%E6%8C%89%E9%94%AE%E6%8A%80%E5%B7%A7/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录7-一些键盘按键技巧/</id>
<published>2018-10-13T03:08:02.000Z</published>
<updated>2018-10-13T03:08:24.260Z</updated>
<content type="html"><![CDATA[<p>使用命令行不代表我们需要频繁的输入一些命令,有时候bash的一些特性使得我们会更加的懒惰,本章节将带领导学习几个好用的命令。这些命令使我们的操作更加高效。</p><ul><li>clear</li><li>history</li></ul><h2 id="命令行编辑"><a href="#命令行编辑" class="headerlink" title="命令行编辑"></a>命令行编辑</h2><p>bash 使用了一个叫做 readline 的库,来实现命令行的编辑。下面介绍一个常用的快捷方式</p><h3 id="移动光标"><a href="#移动光标" class="headerlink" title="移动光标"></a>移动光标</h3><p><code>Ctrl + a</code> 光标移动到最开始的位置<br><code>Ctrl + e</code> 光标一定到结束的位置<br><code>Ctrl + f</code> 移动光标从开始的位置向结束的位置<br><code>Ctrl + h</code>移动光标从结束的位置向开始的位置<br><code>Alt + f</code> 移动一个词汇的距离,向结束的方向<br><code>Alt + h</code> 移动一个词汇的距离,向开始的方向<br><code>Ctrl + l</code> 清空屏幕上的命令</p><h3 id="编辑命令"><a href="#编辑命令" class="headerlink" title="编辑命令"></a>编辑命令</h3><p><code>Ctrl + d</code>删除命令</p><h3 id="自动补全"><a href="#自动补全" class="headerlink" title="自动补全"></a>自动补全</h3><p>当你输入一个命令的时候,按 <code>tab</code> 可以提示或者自动补全该命令。当然,除此之外,<code>tab</code> 键还可以自动补全路径名。</p><h2 id="历史命令"><a href="#历史命令" class="headerlink" title="历史命令"></a>历史命令</h2><p>一般情况下,bash 会记录我们最近输入的 500 个命令</p><p>在终端输入 history 命令之后,会显示最近的命令,以数字开头代表序号,第几个命令;使用 <code>!数字</code> 来重复执行数字代表的那跳命令。</p>]]></content>
<summary type="html">
<p>使用命令行不代表我们需要频繁的输入一些命令,有时候bash的一些特性使得我们会更加的懒惰,本章节将带领导学习几个好用的命令。这些命令使我们的操作更加高效。</p>
<ul>
<li>clear</li>
<li>history</li>
</ul>
<h2 id="命令行编
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录6-重定向</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%956-%E9%87%8D%E5%AE%9A%E5%90%91/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录6-重定向/</id>
<published>2018-10-13T03:07:05.000Z</published>
<updated>2018-10-13T03:07:24.143Z</updated>
<content type="html"><![CDATA[<p>重定向,回忆一下这个概念是不是之前学过:在 Java web 开发中请求的重定向。在本章节中,我们要学的是“IO重定向”。本文将从以下命令开始展开:</p><ul><li>cat</li><li>sort</li><li>uniq</li><li>grep</li><li>wc</li><li>head</li><li>tail</li><li>tee</li></ul><p>I/O 重定向允许我们更改输出地点和输入来源。一般地,输出送到屏幕,输入来自键盘, 但是通过 I/O 重定向,我们可以做出改变。我们使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕 以外的另一个文件。为什么我们要这样做呢?因为有时候把一个命令的运行结果存储到 一个文件很有用处。<br>例如,我们可以告诉 shell 把 ls 命令的运行结果输送到文件 ls-output.txt 中去, 由文件代替屏幕。</p><pre><code>[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt</code></pre><p>这样,我们就把 bin 目录下的详细信息重定向到了文件 ls-output.txt 了,并且有内容。</p><p>技巧:单纯的使用<code>> ls-output.txt</code> 这个命令可以清空一个存在的文件或者创建一个文件。</p><figcaption>符号每次都是从头开始写。那么,如果我们想追加文件内容怎么办呢? 使用<code>>></code> 符号。</p></figcaption><pre class="line-numbers language-></code>"><code class="language-></code>"><p>也就是每次都是在文件末尾添加内容,不会覆盖之前的内容。</p><p>如果,现在需要把标准输出和标准输出错误都重定向到文件中,可以使用</p><pre><code>ls -l /bin/usr &> ls-output.txt<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="cat-连接文件"><a href="#cat-连接文件" class="headerlink" title="cat 连接文件"></a>cat 连接文件</h2><p>cat 命令读取一个或多个文件,然后复制到标准输出。cat 经常用来显示简短的文件,cat 可以连接多个文件。比如我们下载了一个大型文件,文件被分成了还几个小文件,可以使用 cat 命令把它们连接起来。<br>例子:</p><pre><code>cat file-1.* >file-1</code></pre><h2 id="管道"><a href="#管道" class="headerlink" title="管道"></a>管道</h2><p>管道操作符<code>|</code>,一个命令的标准输出可以通过<code>管道</code>送至另一个命令的标准输入。</p><p>例子:</p><pre><code>ls -l /usr/bin | less</code></pre><h2 id="过滤器(管道线)"><a href="#过滤器(管道线)" class="headerlink" title="过滤器(管道线)"></a>过滤器(管道线)</h2><p>管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后 输出它。</p><h2 id="uniq-去掉重复的行"><a href="#uniq-去掉重复的行" class="headerlink" title="uniq 去掉重复的行"></a>uniq 去掉重复的行</h2><p><code>uniq 命令经常和 sort 命令结合在一起使用</code> 默认情况下,从数据列表中删除任何重复行。但是如果我们想看到 重复的数据列表,让 uniq 命令带上<code>-d</code>选项</p><h2 id="wc-打印行数、字数和字节"><a href="#wc-打印行数、字数和字节" class="headerlink" title="wc 打印行数、字数和字节"></a>wc 打印行数、字数和字节</h2><p>默认显示三个数据,如果加上参数 <code>-l</code> 就只显示行数。<br>例子:统计 /bin 和 /usr/bin 有序程序列表的个数</p><pre><code>ls /bin /usr/bin | sort | uniq | wc -l</code></pre><h2 id="grep-打印匹配行"><a href="#grep-打印匹配行" class="headerlink" title="grep 打印匹配行"></a>grep 打印匹配行</h2><p>grep 是个很强大的程序,用来找到文件中的匹配文本。</p><p>用法也很简单:<code>grep pattern [file...]</code></pre><p>grep 有一些方便的选项:”-i”使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写 敏感的),”-v”选项会告诉 grep 只打印不匹配的行。</p><h2 id="head-tail-打印开头或者结尾"><a href="#head-tail-打印开头或者结尾" class="headerlink" title="head / tail 打印开头或者结尾"></a>head / tail 打印开头或者结尾</h2><p>默认情况下两个命令都打印 10 行。通过参数 -n 来控制打印的行数。</p><p>tail 有一个选项允许你实时地浏览文件。使用<code>-f</code>选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。</p><h2 id="tee-用来捕捉管道线某个时期的数据"><a href="#tee-用来捕捉管道线某个时期的数据" class="headerlink" title="tee 用来捕捉管道线某个时期的数据"></a>tee 用来捕捉管道线某个时期的数据</h2><p>tee 程序从标准输入读入数据,并且同时复制数据 到标准输出和一个或多个文件。当在某个中间处理 阶段来捕捉一个管道线的内容时,这很有帮助。<br>例子:</p><pre><code>ls /usr/bin | tee ls.txt | grep zip</code></pre><p>这次包含 tee 命令,在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt:</p>]]></content>
<summary type="html">
<p>重定向,回忆一下这个概念是不是之前学过:在 Java web 开发中请求的重定向。在本章节中,我们要学的是“IO重定向”。本文将从以下命令开始展开:</p>
<ul>
<li>cat</li>
<li>sort</li>
<li>uniq</li>
<li>grep</li
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录5-使用命令</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%955-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录5-使用命令/</id>
<published>2018-10-13T03:06:12.000Z</published>
<updated>2018-10-13T03:06:48.603Z</updated>
<content type="html"><![CDATA[<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p><p>在前面的章节里,我们学到的都是一些神秘的命令,我们不知道他们怎么来的,不过接下来我们会试图去掉一些神秘性,甚至创建我们自己的命令!</p><p>本章节我们将学习一下命令:一起来揭开命令的神秘面纱吧!</p><ul><li>type</li><li>which</li><li>man</li><li>whatis</li><li>alias</li></ul><h2 id="到底什么是命令"><a href="#到底什么是命令" class="headerlink" title="到底什么是命令"></a>到底什么是命令</h2><p>书中总结了四种情况:</p><p>1.是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 这一类程序可以是用诸如 C 和 C++语言写成的程序编译的二进制文件, 也可以是由诸如shell,perl,python,ruby等等脚本语言写成的程序 。</p><p>2.是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。</p><p>3.是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 在后续的章节里,我们将讨论配置环境变量以及书写 shell 函数。但是现在, 仅仅意识到它们的存在就可以了。</p><p>4.是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。</p><h2 id="识别命令"><a href="#识别命令" class="headerlink" title="识别命令"></a>识别命令</h2><p>既然,给出了上面四种形式的命令,当然提供了一个识别命令的命令!<br> <code>type</code></p><p>如图所示:使用 type 命令查看如下几个命令的类型。<br><img src="https://upload-images.jianshu.io/upload_images/5317394-6d7a347a76bd2975.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p>可以看出 <code>type</code> <code>cd</code> 是 shell 内建的命令。<code>mv</code> 是一个可执行程序,这里的 <code>ll</code> 是一个命令的别名。</p><h2 id="which-显示一个可执行程序的位置"><a href="#which-显示一个可执行程序的位置" class="headerlink" title="which 显示一个可执行程序的位置"></a>which 显示一个可执行程序的位置</h2><p>在大型的系统中,命令很多,需要确认命令的具体位置,可以使用 which 来确认可执行命令的具体位置。</p><h2 id="man-显示使用手册"><a href="#man-显示使用手册" class="headerlink" title="man 显示使用手册"></a>man 显示使用手册</h2><p>下表是man 操作手册的章节说明:可以指定打开某一章节</p><table><thead><tr><th>章节</th><th>内容</th></tr></thead><tbody><tr><td>1</td><td>用户命令</td></tr><tr><td>2</td><td>程序接口内核系统调用</td></tr><tr><td>3</td><td>C 库函数程序接口</td></tr><tr><td>4</td><td>特殊文件,比如说设备结点和驱动程序</td></tr><tr><td>5</td><td>文件格式</td></tr><tr><td>6</td><td>游戏娱乐,如屏幕保护程序</td></tr><tr><td>7</td><td>其他方面</td></tr><tr><td>8</td><td>系统管理员命令</td></tr></tbody></table><h2 id="whatis-一句话描述命令"><a href="#whatis-一句话描述命令" class="headerlink" title="whatis 一句话描述命令"></a>whatis 一句话描述命令</h2><p>有时候你不是很懂某一个命令怎么描述,可以使用 whatis 命令来显示一句话描述:</p><pre><code>whatis mvmv(1) move(rename) files</code></pre><h2 id="使用别名命令"><a href="#使用别名命令" class="headerlink" title="使用别名命令"></a>使用别名命令</h2><p>使用 <code>alias</code> 命令来创建别名。</p><p>为什么使用别名呢,有时候我们输入一系列复杂的命令来达到我们想要的结果,使用别名就可以封装复杂的命令,暴露出简单的命令提供给我们使用。<br>命令格式:<code>alias name='string'</code><br>例子:<br><code>alias foo='cd /usr; ls; cd -'</code><br> 删除别名 <code>unalias name</code></p><p>在 shell 中新建别名的时候,关闭这个会话之后,下一次就失效了,要想持久化别名,在之后的会话中也能使用,可以在配置文件(比如:<code>.bash_profile</code>)中:<br><img src="https://upload-images.jianshu.io/upload_images/5317394-f8608e48054c24ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><h2 id="推荐阅读"><a href="#推荐阅读" class="headerlink" title="推荐阅读"></a>推荐阅读</h2><p><a href="">原版英文书籍《Linux命令行》阅读记录1 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录2 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录3 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录4 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录5 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录6 </a><br><a href="">原版英文书籍《Linux命令行》阅读记录7 </a></p>]]></content>
<summary type="html">
<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p>
<p>在前面的章节里,我们学到的都是一些神秘的命令,我们不知道他们怎么来的,不过接下来我们会试图去掉一些神秘性,甚至创建我们自己的命令!<
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录4-操作文件和目录</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%954-%E6%93%8D%E4%BD%9C%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录4-操作文件和目录/</id>
<published>2018-10-13T03:05:17.000Z</published>
<updated>2018-10-13T03:05:42.338Z</updated>
<content type="html"><![CDATA[<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p><p>从本章节开始,开始真正的实战。</p><p>主要学习以下命令:</p><ul><li>cp</li><li>mv</li><li>mkdir</li><li>rm</li><li>ln</li><li>一些练习<br>以上命令用来操作文件和目录。</li></ul><blockquote><p>图形化界面,可以简单且轻松的完成文件的复制粘贴等操作,为什么我们还要学习使用命令行呢?一些简单的任务,图形化界面更占优势,但是当遇到很复杂的操作时,使用命令行更加方便。比如复制当前目录下以 .html 结尾的文件,图形化界面是不是要一个一个用手去选择?命令行就很简单了</p></blockquote><pre><code>cp -u *.html destination</code></pre><h2 id="通配符"><a href="#通配符" class="headerlink" title="通配符"></a>通配符</h2><p>在开始学习上述命令之前,先来了解一下通配符的重要性以及用法。因为 shell 频繁地使用 文件名,shell 提供了特殊字符来帮助你快速指定一组文件名。这些特殊字符叫做通配符。列一个表格:</p><table><thead><tr><th>通配符</th><th>意义</th></tr></thead><tbody><tr><td>*</td><td>匹配任意多个字符(包括零个或一个)</td></tr><tr><td>?</td><td>匹配任意一个字符(不包括零个)</td></tr><tr><td>[characters]</td><td>匹配任意一个属于字符集中的字符</td></tr><tr><td>[!characters]</td><td>匹配任意一个不是字符集中的字符</td></tr><tr><td>[[:class:]]</td><td>匹配任意一个属于指定字符类中的字符</td></tr></tbody></table><p>普遍使用的字符类:<br>|字符类|意义|<br>|–|–|<br>|[:alnum:]|匹配任意的字母或数字|<br>|[:alpha:]|匹配任意的字母|<br>|[:digit:]|匹配任意一个数字|<br>|[:lower:]|匹配任意一个小写字母|<br>|[:upper:]|匹配任意一个大写字母|</p><p>我们可以借助通配符来构建复杂的文件名查找规则。下面举一些例子:</p><figcaption>代表查找所有文件<br><code>g*</code> 代表查找所有以 “g” 开头的文件<br><code>b*.txt</code> 代表查找以 “b” 开头,中间任意字符,以 .txt 结尾的文件<br><code>Data???</code> 代表查找以 Data 开头,后面紧跟 3 个字符的文件<br><code>[a, b, c]*</code> 代表查找以 a 或 b 或 c 开头的文件<br><code>g[0-9][0-9][0-9]</code> 代表查找以 g 开头,并且紧跟着三个数字的文件<br><code>[[:lower:]123]</code> 代表查找以小写字母结尾 或者 以 1 或 2 或 3 结尾的文件</p></figcaption><pre class="line-numbers language-*</code>"><h2 id="mkdir-创建目录"><a href="#mkdir-创建目录" class="headerlink" title="mkdir 创建目录"><code class="language-*</code>"><h2 id="mkdir-创建目录"><a href="#mkdir-创建目录" class="headerlink" title="mkdir 创建目录"></a>mkdir 创建目录</h2><p>用法:</p><pre><code>mkdir directory...<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><pre><code>mkdir dir</code></pre><p>此时会创建一个目录,名为 dir。</p><p>注意表示法: 在描述一个命令时(如上所示),当有三个圆点跟在一个命令的参数后面, 这意味着那个参数可以重复,就像这样:</p><pre><code>mkdir dir1 dir2 dir3</code></pre><p>此时会创建三个目录,名为 dir1, dir2, dir3。</p><p><strong>有用的参数说明</strong>:</p><p><code>-m</code> 指定权限<br><code>-p</code> 用于创建多级目录,若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录</p><h2 id="cp-复制文件和目录"><a href="#cp-复制文件和目录" class="headerlink" title="cp 复制文件和目录"></a>cp 复制文件和目录</h2><p>复制,有两种用法:<br>1.复制单个项目<br>2.复制多个项目</p><pre><code>cp item1 item2</code></pre><p>复制 文件或目录 item1 到文件或目录 item2</p><pre><code>cp item... directory</code></pre><p>复制多个项目到一个目录下。</p><p><strong>有用的参数</strong>:</p><p>-a , –archive , 复制文件时,带上属性。<br>-i , –interactive, 重写文件之前,会提示用户是否重写,默认 cp 是重写文件的。<br>-r , –recursive , 递归地复制目录以及目录里面的内容。<br>-u , –update ,当把文件从一个目录复制到另一个目录中时,只复制不存在的文件。或者文件内容更新于已存在的文件中。<br>-v, –verbose, 显示详细的复制操作。</p><p><strong>cp 命令的几个例子展示</strong>:</p><ul><li>cp file1 file2 如果file2 存在的话,cp 命令把 file1 的内容重写到 file2 中。如果 file2 不存在,则创建。</li><li>cp -i file1 file2 如果 file2 存在,在重写之前会提示用户确认 “是否重写?”,其他的,同上。</li><li>cp file1 file2 dir1 复制 file1 和 file2 到目录 dir1 中,<strong>目录 dir1 必须存在</strong>。</li><li>cp dir1/* dir2 使用通配符,将 dir1目录下的内容全部复制到 dir2 目录下,<strong>目录 dir2 必须存在</strong>。</li><li>cp -r dir1 dir2 复制目录 dir1 中的内容到目录 dir2目录中,目录 dir 不存在则创建。</li></ul><h2 id="mv-移动和重命名"><a href="#mv-移动和重命名" class="headerlink" title="mv 移动和重命名"></a>mv 移动和重命名</h2><p>mv 的使用方法和 cp 一样。</p><pre><code>mv item1 item2</code></pre><p>移动(重命名)item1 为 item2</p><pre><code>mv item... directory</code></pre><p>移动多个项目到一个目录下。</p><p><strong>有用的参数</strong>:</p><p>-i , –interactive, 重写文件之前,会提示用户是否重写,默认 cp 是重写文件的。<br>-u , –update ,当把文件从一个目录移动到另一个目录中时,只移动不存在的文件。或者文件内容更新于已存在的文件中。<br>-v, –verbose, 显示详细的操作信息。</p><p><strong>mv的例子:</strong></p><ul><li>mv file1 file2 如果file2 存在的话,cp 命令把 file1 的内容重写到 file2 中。如果 file2 不存在,则创建。</li><li>mv -i file1 file2 如果 file2 存在,在重写之前会提示用户确认 “是否重写?”,其他的,同上。</li><li>mv file1 file2 dir1 移动 file1 和 file2 到目录 dir1 中,<strong>目录 dir1 必须存在</strong>。</li><li>mv dir1 dir2 如果目录 dir2 不存在,则创建目录 dir2 ,并且移动 dir1 的内容到目录 dir2 中,同时删除目录 dir1 。如果存在 dir2 , 移动目录 dir1以及它的内容到目录 dir2 。</li></ul><h2 id="rm-删除文件和目录"><a href="#rm-删除文件和目录" class="headerlink" title="rm 删除文件和目录"></a>rm 删除文件和目录</h2><p>rm 命令用来删除文件和目录。</p><pre><code>rm item...</code></pre><p>前面提到过这种表达方式,代表参数可以一个或多个,可以删除一个或多个项目。</p><p><strong>有用的参数</strong></p><p>-i, –interactive, 删除的时候,提示用户确认信息,如果不带此参数,rm 会默默直接删掉文件。<br>-r, –recursive, 递归的删除文件。要删除目录时,必须要指定此参数,代表全部清空。<br>-f, –force, 忽视不存在的信息,不显示提示信息,会覆盖 <code>-i</code>参数<br>-v,verbose, 显示详细的操作信息。</p><p>提个醒!</p><blockquote><p>类 Unix 的操作系统,比如说 Linux,没有复原命令。一旦你用 rm 删除了一些东西, 它就消失了。Linux 假定你很聪明,你知道你在做什么。尤其要小心使用通配符。</p></blockquote><h2 id="ln-创建链接"><a href="#ln-创建链接" class="headerlink" title="ln 创建链接"></a>ln 创建链接</h2><p>ln 既可以创建硬链接,也可以创建符号链接(软链接)。</p><ul><li><p>硬链接是最初 Unix 创建链接的方式。每个文件都默认都有一个硬链接,这个硬链接给予文件名字。我们每建立一个硬链接,都相当于新增一个额外的目录项。硬链接有两个额外的局限性:<br>1.一个硬链接不能关联不同文件系统 的文件。2.硬链接不能关联目录</p></li><li><p>符号链接是为了解决上述局限性,通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的<strong>文件指针</strong>。这种方式和 Windows 的快捷方式差不多,但是比 Windows 要早很多年!删除符号链接的时候,只是链接被删除,而不是文件本身。如果文件先被删除,链接依然会存在,只是不指向任何东西。</p></li></ul><h2 id="练习"><a href="#练习" class="headerlink" title="练习"></a>练习</h2><p>首先创建一个领地,执行命令 mkdir playground</p><pre><code>[me@linuxbox ~]$ mkdir playground</code></pre><p>然后,进入 playground 目录创建两个目录 dir1 和 dir2</p><pre><code>[me@linuxbox ~]$ cd playground[me@linuxbox playground]$ mkdir dir1 dir2</code></pre><p>接下来,复制一些数据来这个目录。</p><pre><code>[me@linuxbox playground]$ cp /etc/passwd .</code></pre><p>再次执行上面的命令,只不过这一次加上了参数 <code>-v</code> 来显示详细的操作信息:</p><pre><code>[me@linuxbox playground]$ cp -v /etc/passwd .`/etc/passwd' -> `./passwd'</code></pre><p>如果换成参数 -i 会显示上面呢?来试试</p><pre><code>[me@linuxbox playground]$ cp -i /etc/passwd .cp: 是否覆盖 './passwd'?</code></pre><p>接着输入 y 就会被重写,输入背的字符(n什么的),会保留。</p><p>这样,我们就有了 一个 <code>playground</code> 目录下 有一个文件 <code>passwd</code>和 两个目录 <code>dir1</code> 和<code>dir2</code> 。</p><p>我们给 <code>passwd</code> 改一个名字:改成 <code>dog</code></p><pre><code>[me@linuxbox playground]$ mv passwd dog</code></pre><p>首先把 dog 文件移动到 dir1 木目录中。</p><pre><code>me@linuxbox playground]$ mv dog dir1</code></pre><p>接着把 dir1 移动到目录 dir2 中。</p><pre><code>me@linuxbox playground]$ mv dir1 dir2</code></pre><p><strong>因为 dir2 存在,所以 dir1 以及它里面的内容都会移动到 dir2中。<br>如果 dir2 不存在, dir1 会重命名为 dir2 。</strong></p><p>最后将 dog 文件再移动到 playground 目录下。</p><pre><code>me@linuxbox playground]$ cd dir2/dir1me@linuxbox dir1]$ mv dog ~/playround</code></pre><p>建立符号链接(软链接)</p><pre><code>me@linuxbox playground]$ ln -s /home/me/playground/dog dog-system</code></pre><p>使用<code>ll</code>,查看一下:</p><p><code>lrwxrwxrwx 1 me me 6 2008-01-15 15:17 dog-system -> /home/me/playground/dog</code></pre><p>根据我们前面所学的文件解析,可知这一个符号链接文件,指向 <code>/home/me/playground/dog</code> 文件。</p><p>提示:创建符号链接的时候,最好使用绝对路径。</p><p>上面演示的是创建文件的符号链接,同样也可以创建的目录的符号链接。</p><blockquote><p>对于符号链接,有一点值得记住,执行的大多数文件操作是针对链接的对象,而不是链接本身。 而 rm 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。</p></blockquote>]]></content>
<summary type="html">
<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p>
<p>从本章节开始,开始真正的实战。</p>
<p>主要学习以下命令:</p>
<ul>
<li>cp</li>
<li>mv</li>
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录3-解析文件的描述含义和阅读文件</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%953-%E8%A7%A3%E6%9E%90%E6%96%87%E4%BB%B6%E7%9A%84%E6%8F%8F%E8%BF%B0%E5%90%AB%E4%B9%89%E5%92%8C%E9%98%85%E8%AF%BB%E6%96%87%E4%BB%B6/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录3-解析文件的描述含义和阅读文件/</id>
<published>2018-10-13T03:04:37.000Z</published>
<updated>2018-10-13T03:04:59.015Z</updated>
<content type="html"><![CDATA[<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p><h2 id="深入研究长格式输出"><a href="#深入研究长格式输出" class="headerlink" title="深入研究长格式输出"></a>深入研究长格式输出</h2><p>上一篇文章讲到 ls 命令加上 -l 就会输出详细的长格式信息。类似于这样的:</p><pre><code>-rw-r--r-- 1 root wheel 5 Apr 5 19:22 .CFUserTextEncoding-r--r--r-- 1 root wheel 10 Oct 3 2017 .forwarddrwxr-xr-x 3 root wheel 96 Mar 16 2018 .oracle_jre_usage-rw------- 1 root wheel 3667 Sep 30 10:05 .sh_historydrwx------ 3 root wheel 96 Sep 18 22:02 .ssh-rw------- 1 root wheel 15886 Aug 30 19:37 .viminfodrwx------ 15 root wheel 480 Mar 15 2018 Library</code></pre><p>我会依次讲解每个部分的大概。<br>以第一行的数据为例:<br><code>-rw-r--r-- 1 root wheel 5 Apr 5 19:22 .CFUserTextEncoding</code><br>第一部分:<code>-rw-r--r--</code></p><p>① - 代表文件类型,-代表普通文件,d代表目录。<br>②连续三个字符代表文件所有者的权限<br>③连续字符代表文件所属组的权限<br>④三个字符是文件其他所有人的权限</p><p>第二部分:<code>1</code>,代表文件的硬连接数<br>第三部分:<code>root</code> ,文件属于 root 用户<br>第三部分:<code>wheel</code>, 文件属于 wheel 组。<br>第四部分:<code>5</code> ,文件大小<br>第六部分:<code>Apr 5 19:22</code> ,文件上一次修改时间<br>第七部分:<code>.CFUserTextEncoding</code> , 文件名字</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-971e8ac8f1ae53ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><h2 id="确认文件类型"><a href="#确认文件类型" class="headerlink" title="确认文件类型"></a>确认文件类型</h2><p>在 linux 系统中,并不要求文件名称来反映文件内容。用 file 命令来确定文件的类型。</p><pre><code>file filename</code></pre><h2 id="使用less浏览文件"><a href="#使用less浏览文件" class="headerlink" title="使用less浏览文件"></a>使用less浏览文件</h2><p>The less command is a program to view text files.</p><p>为什么我们要查看文本文件呢? 因为许多包含系统设置的文件(叫做配置文件),是以文本格式存储的,阅读它们 可以更深入的了解系统是如何工作的。另外,许多系统所用到的实际程序(叫做脚本)也是以这种格式存储的。<strong>more 程序只能向前翻页,而 less 程序允许前后翻页</strong></p><p>less 命令的使用规则:</p><pre><code>less filename</code></pre><p>运行 less 程序之后,可以使用下面这些命令来浏览文件。</p><table><thead><tr><th>命令</th><th>行为</th></tr></thead><tbody><tr><td>Page UP or b</td><td>向上翻滚一页</td></tr><tr><td>Page Down or space</td><td>向下翻滚一页</td></tr><tr><td>UP Arrow</td><td>向上翻滚一行</td></tr><tr><td>Down Arrow</td><td>向下翻滚一行</td></tr><tr><td>G</td><td>移动到最后一行</td></tr><tr><td>1G or g</td><td>移动到开头一行</td></tr><tr><td>/charaters</td><td>向前查找指定的字符串</td></tr><tr><td>n</td><td>向前查找下一个出现的字符串,这个字符串是之前所指定查找的</td></tr><tr><td>h</td><td>显示帮助屏幕</td></tr><tr><td>q</td><td>退出 less 程序</td></tr></tbody></table><table><thead><tr><th>目录</th><th>说明</th></tr></thead><tbody><tr><td>/</td><td>根目录,万物起源。</td></tr><tr><td>/bin</td><td>包含系统启动和运行所必须的二进制程序。</td></tr><tr><td>/boot</td><td>包含 Linux 内核、初始 RAM 磁盘映像(用于启动时所需的驱动)和 启动加载程序。有趣的文件:/boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序。/boot/vmlinuz,Linux 内核。</td></tr><tr><td>/dev</td><td>这是一个包含设备结点的特殊目录。“一切都是文件”,也适用于设备。 在这个目录里,内核维护着所有设备的列表。</td></tr><tr><td>/etc</td><td>这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会开启每个系统服务。这个目录中的任何文件应该是可读的文本文件。有趣的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件:/etc/crontab, 定义自动运行的任务。/etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表。</td></tr><tr><td>/home</td><td>在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通用户只能 在自己的目录下写文件。这个限制保护系统免受错误的用户活动破坏。</td></tr><tr><td>/lib</td><td>包含核心系统程序所使用的共享库文件。这些文件与 Windows 中的动态链接库相似。</td></tr><tr><td>/lost+found</td><td>每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。这个目录应该是空的,除非文件系统 真正的损坏了。</td></tr><tr><td>/media</td><td>在现在的 Linux 系统中,/media 目录会包含可移动介质的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些介质连接到计算机之后,会自动地挂载到这个目录结点下。</td></tr><tr><td>/mnt</td><td>在早些的 Linux 系统中,/mnt 目录包含可移动介质的挂载点。</td></tr><tr><td>/opt</td><td>这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品。</td></tr><tr><td>/proc</td><td>这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 相反,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的。</td></tr><tr><td>/root</td><td>root 帐户的家目录。</td></tr><tr><td>/sbin</td><td>这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为<code>超级用户</code>保留。</td></tr><tr><td>/tmp</td><td>这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置导致系统每次 重新启动时,都会清空这个目录。</td></tr><tr><td>/usr</td><td>在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。</td></tr><tr><td>/usr/bin</td><td>/usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。</td></tr><tr><td>/usr/lib</td><td>包含由/usr/bin 目录中的程序所用的共享库。</td></tr><tr><td>/usr/local</td><td>这个/usr/local 目录,是非系统发行版自带程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中会存在这个目录, 并且在管理员安装程序之前,这个目录是空的。</td></tr><tr><td>/usr/sbin</td><td>包含许多系统管理程序。</td></tr><tr><td>/usr/share</td><td>/usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件、图标、桌面背景、音频文件等等。</td></tr><tr><td>/usr/share/doc</td><td>大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。</td></tr><tr><td>/var</td><td>除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录存放的是动态文件。各种数据库,假脱机文件, 用户邮件等等,都位于在这里。</td></tr><tr><td>/var/log</td><td>这个/var/log 目录包含日志文件、各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。</td></tr></tbody></table><h2 id="符号链接"><a href="#符号链接" class="headerlink" title="符号链接"></a>符号链接</h2><p>有时候,你会看到输出这样的信息:</p><pre><code>lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so</code></pre><p>第一个l是什么?为什么有两个文件名呢?其实这是一个特殊的文件,叫做符号链接。 在大多数“类 Unix” 系统中, 有可能一个文件被多个文件名所指向。虽然这种特性的意义并不明显,但它真的很有用。</p><p>关于软连接和硬链接的区别以及意义,//todo</p>]]></content>
<summary type="html">
<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p>
<h2 id="深入研究长格式输出"><a href="#深入研究长格式输出" class="headerlink" title="深入研
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录2-在文件系统中翱翔!</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%952-%E5%9C%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%BF%B1%E7%BF%94/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录2-在文件系统中翱翔/</id>
<published>2018-10-13T03:03:53.000Z</published>
<updated>2018-10-13T03:04:18.425Z</updated>
<content type="html"><![CDATA[<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p><p>The first thing we need to learn is how to navigate the filesystem on our linux system. In this article I will introduce the following commands:</p><p>我们需要学习的第一件事是如何在 Linux 的文件系统中跳转,在本文章中我们介绍如下命令:</p><ul><li>pwd </li><li>cd</li><li>ls</li></ul><p>还会介绍文件命名的规则:</p><ul><li><p><strong>以 “.” 字符开头的文件名是隐藏文件</strong>,ls 命令不能列出它们, 用 ls -a 命令就可以了。</p></li><li><p>文件名和命令名是<strong>大小写敏感的</strong>。文件名 “File1” 和 “file1” 是指两个不同的文件名。</p></li><li><p>Linux 没有“文件扩展名”的概念。</p></li><li><p>虽然 Linux 支持长文件名,文件名可能包含空格,标点符号,但标点符号仅限 使用 “.”,“-”,下划线。最重要的是,<strong>不要在文件名中使用空格</strong>。如果你想表示词与 词间的空格,用下划线字符来代替。</p></li></ul><h2 id="1-理解文件系统🌲"><a href="#1-理解文件系统🌲" class="headerlink" title="1. 理解文件系统🌲"></a>1. 理解文件系统🌲</h2><p>在类 unix 系统中,比如 linux 中,总的只有<strong>一个</strong>单一的文件系统树,不管有多少个磁盘或者存储设备连接到这个计算机,这些存储设备连接(挂载)到目录树的各个节点上。注意,这是一颗倒置的目录树。</p><h3 id="2-当前目录"><a href="#2-当前目录" class="headerlink" title="2. 当前目录"></a>2. 当前目录</h3><p>在图形化界面可以看出目录的层级结构,但是在命令行中,是没有这个概念的,我们就像是在迷宫一样,在任意时刻,我们处在一个目录下,我们当前所处的目录,称作当前目录。我们可以进入上级目录,或者下级目录。</p><p>使用 pwd 来显示当前目录。( print working directory 的缩写)</p><pre><code>[me@linuxbox ~]$ pwd/home/me</code></pre><h2 id="3-列出目录的内容"><a href="#3-列出目录的内容" class="headerlink" title="3. 列出目录的内容"></a>3. 列出目录的内容</h2><p>To list the files and directories in the current working directory, we use the <code>ls</code> command.</p><pre><code>[me@linuxbox ~]$ lsDesktop Documents Music Pictures Public Templates Videos</code></pre><p>单独一个 ls 是默认列出当前目录下的内容,当然也可以在后面指定目录。比如,<code>ls /usr</code> 指定列出 /usr 目录下的内容。</p><p>介绍 ls 一些常用的参数:<br>|选项 | 说明 |<br>| – | –|<br>|ls -a | 显示隐藏文件 |<br>|ls -l | 显示更详细的信息|<br>|ls -d| ls -d -l 目录 直接显示这个目录的详情,而不是显示这个目录里面的内容|<br>|ls 目录1 目录2 | 可以列出多个目录下的内容|<br>|ls -t | 按照修改时间排序|<br>|ls -S | 按照文件大小排序|<br>|ls -h | 显以人类可读的形式显示文件大小|<br>|ls -r | 反序|</p><h2 id="4-切换目录(更改当前工作目录)"><a href="#4-切换目录(更改当前工作目录)" class="headerlink" title="4. 切换目录(更改当前工作目录)"></a>4. 切换目录(更改当前工作目录)</h2><p>切换目录我们使用命令:cd 是 change directory 的缩写。</p><h4 id="4-1-绝对路径"><a href="#4-1-绝对路径" class="headerlink" title="4.1 绝对路径"></a>4.1 绝对路径</h4><p>An absolute pathname begins with the root directory.<br>绝对路径开始于根目录 /</p><h4 id="4-2-相对路径"><a href="#4-2-相对路径" class="headerlink" title="4.2 相对路径"></a>4.2 相对路径</h4><p>A relative pathname starts from the working directory.<br>相对路径始于当前工作目录。</p><p>为了做到这个(用相对路径表示), 我们在文件系统树中用一对特殊符号来表示相对位置。 这对特殊符号是 “.” (点) 和 “..” (点点)。</p><p>符号 “.” 指的是工作目录,”..” 指的是工作目录的父目录</p><h4 id="4-3-演示"><a href="#4-3-演示" class="headerlink" title="4.3 演示"></a>4.3 演示</h4><p>🌰1:使用绝对路径,进入 bin 目录下</p><pre><code>[me@linuxbox ~]$ cd /usr/bin[me@linuxbox bin]$ pwd/usr/bin</code></pre><p>🌰2:使用相对路径</p><pre><code>[me@linuxbox ~]$ cd /usr # 绝对路径[me@linuxbox usr]$ cd ./bin # 相对路径[me@linuxbox bin]$ pwd/usr/bin</code></pre><p>小结:<strong>有一件很重要的事,我必须指出来。在几乎所有的情况下,你可以省略”./”。它是隐含的</strong>。</p><p>所以上面的例子,也可以这样写:省掉 <code>./</code></p><pre><code>[me@linuxbox ~]$ cd /usr # 绝对路径[me@linuxbox usr]$ cd bin # 相对路径,省掉了 ./[me@linuxbox bin]$ pwd/usr/bin</code></pre><p>有用的参数:<br>| 操作 | 说明 |<br>| ———- | —— |<br>| cd - | 跳到先前的工作目录 |<br>| cd ~username| 跳转到用户主目录,cd ~ximi 跳转到 ximi 用户的 home 目录|</p><p>自行练习一下吧…</p>]]></content>
<summary type="html">
<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p>
<p>The first thing we need to learn is how to navigate the filesystem
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>原版英文书籍《Linux命令行》阅读记录1-什么是shell?</title>
<link href="http://blog.cuteximi.com/%E5%8E%9F%E7%89%88%E8%8B%B1%E6%96%87%E4%B9%A6%E7%B1%8D%E3%80%8ALinux%E5%91%BD%E4%BB%A4%E8%A1%8C%E3%80%8B%E9%98%85%E8%AF%BB%E8%AE%B0%E5%BD%951-%E4%BB%80%E4%B9%88%E6%98%AFshell/"/>
<id>http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录1-什么是shell/</id>
<published>2018-10-13T03:02:33.000Z</published>
<updated>2018-10-13T03:03:13.618Z</updated>
<content type="html"><![CDATA[<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p><h2 id="1-理解-Linux-的-“自由”"><a href="#1-理解-Linux-的-“自由”" class="headerlink" title="1. 理解 Linux 的 “自由”"></a>1. 理解 Linux 的 “自由”</h2><p>Many people speak of “freedom” with regard to Linux. Freedom is the power to decide what your computer does and the only way to have this freedom is to know what your computer is doing. Freedom is a computer that is without any secrets, one where everything can be known if you care enough to find it.</p><p>很多人一说到Linux, 就会说自由。但是你真的而理解这种自由吗?这种自由是一种权力,能够决定你的计算机干什么,获取这种自由的唯一方式就是知道你的计算机在做什么。自由就是你的计算机没有任何㊙️,你可以从计算机那里了解一切,只要你用心去寻找。</p><h2 id="2-什么是-shell"><a href="#2-什么是-shell" class="headerlink" title="2. 什么是 shell"></a>2. 什么是 shell</h2><p>We speak of the command line, we are really referring to the shell. The shell is a program that takes keyboard commands and passes them to the operating system to carry out.</p><p>一说起命令行,我们真正指的是 shell。shell 就是一个程序,把键盘的输入传递给操作系统去执行。</p><h3 id="3-初次相遇-shell"><a href="#3-初次相遇-shell" class="headerlink" title="3. 初次相遇 shell"></a>3. 初次相遇 shell</h3><p>第一次见到 shell,你只会看到一行提示符,形如:<code>[me@linuxbox ~]$</code></p><p>This is called a shell prompt and it will appear whenever the shell is ready to accept input.</p><p>这叫做 shell 提示符, 无论何时当 shell 准备好接受输入时,就会闲这样的提示符。当然,出现的形式会根据不同的 Linux 发行版有所不同。但是大体上会包含 <code>主机名</code> <code>用户名</code> <code>当前目录</code> 和一个<code>美元符号</code>。</p><p>🤔另外,如果提示符最后是 # 号,而不是 $,会表示这是一个具有 super root 权限的终端。</p><h3 id="3-一些简单入门的小命令"><a href="#3-一些简单入门的小命令" class="headerlink" title="3. 一些简单入门的小命令"></a>3. 一些简单入门的小命令</h3><p><strong>命令历史</strong>:使用 ⬆️ 箭头可以浏览以往的命令,以往的命令会重新出现在提示符后面。<br><strong>移动光标</strong>:使用 ⬅️ ➡️ 箭头可以移动光标,来更好地编辑命令。<br><strong>时间</strong>:date 显示系统当前时间和日期</p><pre><code>[me@linuxbox ~]$ dateSun Sep 30 10:02:00 CST 2018</code></pre><p><strong>日历</strong>:cal 与上一个命令相关,默认显示当前月份的日历。</p><pre><code>[me@linuxbox ~]$ cal September 2018Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1516 17 18 19 20 21 2223 24 25 26 27 28 2930</code></pre><p><strong>查看磁盘剩余空间</strong>:df</p><pre><code>[me@linuxbox ~]$ dfFilesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on/dev/disk1s1 489620264 166659552 315340480 35% 945005 9223372036853830802 0% /devfs 385 385 0 100% 666 0 100% /dev/dev/disk1s4 489620264 6291496 315340480 2% 3 9223372036854775804 0% /private/var/vmmap -hosts 0 0 0 100% 0 0 100% /netmap auto_home 0 0 0 100% 0 0 100% /home/dev/disk2s1 5859376 378616 5480760 7% 2830 4294964449 0% /Volumes/ACDSee/dev/disk3s2 310480 283440 27040 92% 255 4294967024 0% /Volumes/Charles Proxy v4.2.7ximi:~ taoshilei$</code></pre><p><strong>结束终端会话</strong>:exit</p><p>Note: Don’t be tempted to use Ctrl-c and Ctrl-v to perform copy and paste inside a terminal window. They don’t work.</p><p>提示:不要在终端窗口使用 Ctrl-c 和Ctrl-v 来完成复制和粘贴工作。这些不起作用。这两个命令有别的含义,他们早于在微软之前就已经定义了这两个命令的含义,所以不是我们在windows下熟悉的复制粘贴。</p>]]></content>
<summary type="html">
<p>背景:<br>阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。</p>
<h2 id="1-理解-Linux-的-“自由”"><a href="#1-理解-Linux-的-“自由”" class="header
</summary>
<category term="Linux命令行" scheme="http://blog.cuteximi.com/categories/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
</entry>
<entry>
<title>并发编程的艺术之并发编程的挑战</title>
<link href="http://blog.cuteximi.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%9A%84%E8%89%BA%E6%9C%AF%E4%B9%8B%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%9A%84%E6%8C%91%E6%88%98/"/>
<id>http://blog.cuteximi.com/并发编程的艺术之并发编程的挑战/</id>
<published>2018-10-13T02:58:56.000Z</published>
<updated>2018-10-13T03:00:33.067Z</updated>
<content type="html"><![CDATA[<p>并发编程的目的是为了让我们的程序变得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。线程不在于多,在并发编程中,我们将面临如下挑战:上下文切换、死锁问题、受限于软硬件资源限制问题。</p><h2 id="上下文切换"><a href="#上下文切换" class="headerlink" title="上下文切换"></a>上下文切换</h2><p>单核CPU是如果实现多线程的呢?</p><p>CPU通过给每个线程分配<code>时间片</code>来实现,<code>时间片</code>是分配给线程的时间。因为<code>时间片</code>非常短,所以CPU不停地切换线程执行,我们感觉上是同时执行的。(一般的,时间片只有十几毫秒 <code>ms</code>)</p><p>当一个任务执行一个时间片之后,会切换成下一个任务执行,但是切换之前会保存这个任务的状态,以便下次回到这个任务的时候,可以下载上一次的状态,继续执行。这样,一个任务从保存到再加载的过程就是一次上下文切换。</p><p>上面给出了<code>时间片</code> 和 <code>上下文切换</code>的解释。不只是计算机遵循这些原则。</p><p>拿现实生活中的例子,我们阅读英文书籍,遇到不会的单词,记住读到的位置,然后去查词典,查会了之后,我们回到上次卡住的位置继续阅读。想到回到原来的位置,大脑必须得记住在什么位置。这样周而复始,查单词和读书之间的切换是会影响读书效率的。这样也就不难理解,上下文切换对多线程的影响了。</p><p><strong>多线程一定快吗?</strong>根据一个代码的实例,来探讨一下这个问题:</p><pre><code>package com.cuteximi.concurrent;/** * @program: Java-300 * @description: 多线程一定快吗? * @author: TSL * @create: 2018-10-11 14:22 **/public class TestConcurrent { private static final long count = 10000; public static void main(String[] args) throws InterruptedException { concurrency(); serial(); } // 并行 private static void concurrency() throws InterruptedException{ long start = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { int a = 0; for (int i = 0;i< count;i++){ a+=5; } } }); thread.start(); int b = 0; for (long i = 0;i<count;i++){ b--; } long time = System.currentTimeMillis() - start; thread.join(); System.out.println("concurrency: "+time+" ms,b="+b); } // 串行 private static void serial(){ long start = System.currentTimeMillis(); int a =0; for (long i = 0;i < count;i++){ a+=5; } int b =0; for (long i = 0;i < count;i++){ b--; } long time = System.currentTimeMillis() - start; System.out.println("Serial "+time+" ms,b="+b+",a="+a); }}</code></pre><p>经过不断的修改,上述代码的 count 的值。对比两种方式的执行速度。<br>|count的值|串行方法耗时(ms)|并行方法耗时(ms)|并行比串行快多少|<br>|–|–|–|–|<br>|1万|0|1|慢|<br>|10万|3|4|慢|<br>|100万|6|6|差不多|<br>|1000万|18|11|快|<br>|1亿|160|79|快了一倍多</p><p>上表的数据是一个平均值,但是很容易看出<strong>多线程就不一定快!</strong><br>那么一开始的时候为什么串行比并行还要快呢?是因为<strong>并行存在创建线程和上下文切换的花销</strong>。随着数量的扩大,多线程才显示出优势。</p><p>我们不得不重视,上下文切换的开销!</p><h2 id="死锁"><a href="#死锁" class="headerlink" title="死锁"></a>死锁</h2><p>🔐是一个很有用的工具,使用锁的过程中最容易出现的就是死锁,一旦产生死锁就会造成系统不可用。看下面这段代码:</p><pre><code>package com.cuteximi.concurrent;/** * @program: Java-300 * @description: 死锁的例子 * @author: TSL * @create: 2018-10-11 15:14 **/public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args) { deadLock(); } private static void deadLock(){ // 线程1 Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (A){ try { Thread.sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } synchronized (B){ System.out.println("111111"); } } } }); // 线程2 Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (B){ synchronized (A){ System.out.println("222222222"); } } } }); t1.start(); t2.start(); }}</code></pre><p>执行这段代码的时候,一直结束不了,因为线程1 和线程2在互相等待。</p><p>如何避免死锁呢?</p><ul><li>避免一个线程同时获得多把锁。</li><li>避免一个线程在🔐内同时获得多个资源。尽量保证每把锁仅占用一个资源。</li><li>尝试使用定时锁,使用lock.tryLock(timeout)来代替内部锁。</li><li>对于数据库锁,加锁和解锁必须在一个数据库连接里面,否则会出现解锁失败的情况。</li></ul><h2 id="资源限制"><a href="#资源限制" class="headerlink" title="资源限制"></a>资源限制</h2><p>程序执行速度受限于极端及硬件或软件资源,叫做资源限制。</p><ul><li>硬件限制:比如 带宽、硬盘读写速度、CPU处理速度等。</li><li>软件限制:比如 数据库连接数,sock连接数等。</li></ul><p>对于硬件的限制,可以考虑使用<strong>集群</strong>。比如使用 ODPS、Hadoop或者自己搭建集群。</p><p>对于软件资源的限制,可以考虑使用<strong>资源池</strong>将资源复用。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>本文主要说明了在并发编程中遇到几个的挑战,建议使用 JDK 并发包中的提供的并发容器和工具类来解决这一类问题。</p>]]></content>
<summary type="html">
<p>并发编程的目的是为了让我们的程序变得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。线程不在于多,在并发编程中,我们将面临如下挑战:上下文切换、死锁问题、受限于软硬件资源限制问题。</p>
<h2 id="上下文切换"><a href="#上下文切换" cla
</summary>
<category term="并发编程" scheme="http://blog.cuteximi.com/categories/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/"/>
</entry>
<entry>
<title>优秀的资源推荐</title>
<link href="http://blog.cuteximi.com/%E4%BC%98%E7%A7%80%E7%9A%84%E8%B5%84%E6%BA%90%E6%8E%A8%E8%8D%90/"/>
<id>http://blog.cuteximi.com/优秀的资源推荐/</id>
<published>2018-10-06T13:01:19.000Z</published>
<updated>2018-10-12T09:09:31.009Z</updated>
<content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote><p>该篇文章整理自网络,网友一起贡献的优秀的学习网站和资源,谢谢大家。师傅领进门,修行在个人,一起来和优秀的人一起学习进步吧,这些优质的博主和资源是经过时间历练的,当然陶哥也不能藏着掖着啊,好内容当然也要和大家一起分享了。</p></blockquote><h2 id="分类介绍1"><a href="#分类介绍1" class="headerlink" title="分类介绍1"></a>分类介绍1</h2><p>主要介绍如下几个方面:</p><ul><li>优秀的博主。</li><li>优秀的社区。</li><li>专注某个知识领域的文章。</li></ul><p>其实有没有分那么细致,毕竟优秀的人不仅仅在某方面厉害。</p><ul><li><p>1.阮一峰的网络日志:<a href="http://www.ruanyifeng.com/blog/" target="_blank" rel="noopener">http://www.ruanyifeng.com/blog/</a></p></li><li><p>2.海牛部落:<a href="http://www.hainiubl.com/" target="_blank" rel="noopener">http://www.hainiubl.com/</a> 高品质的技术社区</p></li><li><p>3.熔岩: <a href="http://blog.51cto.com/lavasoft" target="_blank" rel="noopener">http://blog.51cto.com/lavasoft</a> Java生态技术</p></li><li><p>4.老赵点滴: <a href="http://blog.zhaojie.me/" target="_blank" rel="noopener">http://blog.zhaojie.me/</a> 打造国内最好的.net技术博客</p></li><li><p>5.陈皓 : <a href="https://www.coolshell.cn/" target="_blank" rel="noopener">https://www.coolshell.cn/</a> 享受编程和技术带来的快乐</p></li><li><p>6.赖永浩 : <a href="http://laiyonghao.com/" target="_blank" rel="noopener">http://laiyonghao.com/</a></p></li><li><p>7.July : <a href="https://blog.csdn.net/v_july_v" target="_blank" rel="noopener">https://blog.csdn.net/v_july_v</a> 结构之法、算法之道</p></li><li><p>8.刘未鹏:<a href="http://mindhacks.cn/" target="_blank" rel="noopener">http://mindhacks.cn/</a> 不解释</p></li><li><p>9.徐宥: <a href="https://blog.youxu.info/" target="_blank" rel="noopener">https://blog.youxu.info/</a> 人工智能博士,科普</p></li><li><p>10.李博杰:<a href="https://ring0.me/" target="_blank" rel="noopener">https://ring0.me/</a> 科普系列</p></li></ul><h4 id="公司团队"><a href="#公司团队" class="headerlink" title="公司团队"></a>公司团队</h4><ul><li><p>11.今日头条技术博客: <a href="https://techblog.toutiao.com/" target="_blank" rel="noopener">https://techblog.toutiao.com/</a> 纯技术大佬</p></li><li><p>12.美团技术团队:<a href="https://tech.meituan.com/" target="_blank" rel="noopener">https://tech.meituan.com/</a> 一行代码,亿万生活。非常接地气的文章。</p></li><li><p>13.阿里巴巴UED资深设计部门:<a href="http://www.aliued.com/" target="_blank" rel="noopener">http://www.aliued.com/</a> 前端的福利</p></li><li><p>14.Alloy Team : <a href="http://www.alloyteam.com/" target="_blank" rel="noopener">http://www.alloyteam.com/</a> 腾讯核心技术团队、致力于Web前端技术。</p></li><li><p>15.Tencent ISUX : <a href="https://isux.tencent.com/" target="_blank" rel="noopener">https://isux.tencent.com/</a> 腾讯核心设计团队,负责互联网产品的设计。</p></li></ul><h4 id="社区"><a href="#社区" class="headerlink" title="社区"></a>社区</h4><ul><li>16.V2EX : <a href="https://www.v2ex.com/" target="_blank" rel="noopener">https://www.v2ex.com/</a> 技术论坛</li></ul><p>以上仅为个人觉得值得看的博客和社区等,本文会持续更新,先收藏起来吧。如您有什么好的资源,欢迎评论。<br>查看外链可以选择点击阅读原文。</p>]]></content>
<summary type="html">
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote>
<p>该篇文章整理自网络,网友一起贡献的优秀的学习网站和资源,谢谢大家。师傅领进门,修行在个人,一起来和优秀的人一起学习
</summary>
<category term="编程" scheme="http://blog.cuteximi.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="推荐" scheme="http://blog.cuteximi.com/tags/%E6%8E%A8%E8%8D%90/"/>
</entry>
<entry>
<title>mac指南</title>
<link href="http://blog.cuteximi.com/mac%E6%8C%87%E5%8D%97/"/>
<id>http://blog.cuteximi.com/mac指南/</id>
<published>2018-09-24T02:44:54.000Z</published>
<updated>2018-09-24T02:45:31.199Z</updated>
<content type="html"><![CDATA[<h1 id="Mac-开发配置手册"><a href="#Mac-开发配置手册" class="headerlink" title="Mac 开发配置手册"></a>Mac 开发配置手册</h1><p>手册内容为「<strong>如何让一部全新的 MacBook 快速完成开发环境配置</strong>」,主要面向 Web 开发者。其中的指导,在 Mavericks 和 Yosemite 上有效,其他版本系统并未尝试。</p><ul><li>如果你是一名老手,本手册让你减少配置开发环境的烦恼。</li><li>如果你是一名新手,那么恭喜你,你将会认识一个全新的世界。</li></ul><p>手册内容主要意译自:<a href="https://github.com/sb2nov/mac-setup" target="_blank" rel="noopener">Sourabh Bajaj</a> 的 Mac OS X Setup Guide,少部分内容由译者添加和修改。</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-e63a0dc3f41d7f04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p>##系统设置</p><p>在任何的操作系统中,首先你需要做一件事就是更新系统,点击窗口左上角的 > 关于本机 > 软件更新 。此外,如果这是一部新的电脑,你还需要到系统设置进行一些适当调整。如何调整,取决于个人喜好。</p><h3 id="触控板"><a href="#触控板" class="headerlink" title="触控板"></a>触控板</h3><p>系统设置 > 触控板<br>光标与点击<br>✓ 轻拍来点按<br>✓ 辅助点按<br>✓ 查找<br>✓ 三指拖移<br>滚动缩放<br>✓ 默认全选<br>更多手势<br>✓ 默认全选</p><h3 id="Dock"><a href="#Dock" class="headerlink" title="Dock"></a>Dock</h3><p>置于屏幕上的位置:左边<br>设置 Dock 图标更小(大小随个人喜好)<br>✓ 自动显示和隐藏 Dock</p><h3 id="Finder"><a href="#Finder" class="headerlink" title="Finder"></a>Finder</h3><p>Finder > 显示<br>显示标签页栏<br>显示路径栏<br>显示状态栏<br>自定工具栏 > 去除所有按钮,仅剩搜索栏<br>Finder > 偏好设置<br>通用<br>开启新 Finder 窗口时打开:HOME「用户名」目录<br>边栏<br>添加 HOME「用户名」目录 和 创建代码文件目录<br>将 共享的(shared) 和 标记(tags) 目录去掉</p><h3 id="菜单栏"><a href="#菜单栏" class="headerlink" title="菜单栏"></a>菜单栏</h3><p>去掉蓝牙等无需经常使用的图标<br>将电池显示设置为百分比</p><h3 id="Spotlight"><a href="#Spotlight" class="headerlink" title="Spotlight"></a>Spotlight</h3><p>去掉字体和书签与历史记录等不需要的内容<br>设置合适的快捷键</p><h3 id="互联网帐户"><a href="#互联网帐户" class="headerlink" title="互联网帐户"></a>互联网帐户</h3><p>添加 iCloud 用户,同步日历,联系人和 Find my mac 等等</p><h1 id="XCode"><a href="#XCode" class="headerlink" title="XCode"></a>XCode</h1><p>从 App store 或苹果开发者网站安装 <a href="https://developer.apple.com/xcode/" target="_blank" rel="noopener">Xcode</a> 。</p><p>紧接着,安装 Xcode command line tools,运行:</p><pre><code>xcode-select --install</code></pre><p>运行命令后,按照指引,你将完成 Xcode command line tools 安装。</p><hr><figcaption><p>如果你不是一名 iOS 或 OS X 开发者,可以跳过安装 XCode 的过程,直接安装 Xcode command line tools 。安装完成后,你将可以直接在 terminal 中使用主要的命令,比如:<code>make, GCC, clang, perl, svn, git, size, strip, strings, libtool, cpp</code>等等。</p></figcaption><pre class="line-numbers language-译注</code>:</p>"><code class="language-译注</code>:</p>"><p>如果你想了解 Xcode command line tools 包含多少可用的命令,可以到 <code>/Library/Developer/CommandLineTools/</code> 查看。以下为其中的命令列表:</p><ul><li>ar</li><li>as</li><li>asa</li><li>bison</li><li>BuildStrings</li><li>c++</li><li>c89</li><li>c99</li><li>cc</li><li>clang</li><li>clang++</li><li>cmpdylib</li><li>codesign_allocate</li><li>CpMac</li><li>cpp</li><li>ctags</li><li>ctf_insert</li><li>DeRez</li><li>dsymutil</li><li>dwarfdump</li><li>dyldinfo</li><li>flex</li><li>flex++</li><li>g++</li><li>gatherheaderdoc</li><li>gcc</li><li>gcov</li><li>GetFileInfo</li><li>git</li><li>git-cvsserver</li><li>git-receive-pack</li><li>git-shell</li><li>git-upload-archive</li><li>git-upload-pack</li><li>gm4</li><li>gnumake</li><li>gperf</li><li>hdxml2manxml</li><li>headerdoc2html</li><li>indent</li><li>install_name_tool</li><li>ld</li><li>lex</li><li>libtool</li><li>lipo</li><li>lldb</li><li>lorder</li><li>m4</li><li>make</li><li>MergePef</li><li>mig</li><li>mkdep</li><li>MvMac</li><li>nasm</li><li>ndisasm</li><li>nm</li><li>nmedit</li><li>otool</li><li>pagestuff</li><li>projectInfo</li><li>ranlib</li><li>rebase</li><li>redo_prebinding</li><li>ResMerger</li><li>resolveLinks</li><li>Rez</li><li>RezDet</li><li>RezWack</li><li>rpcgen</li><li>segedit</li><li>SetFile</li><li>size</li><li>SplitForks</li><li>strings</li><li>strip</li><li>svn</li><li>svnadmin</li><li>svndumpfilter</li><li>svnlook</li><li>svnrdump</li><li>svnserve</li><li>svnsync</li><li>svnversion</li><li>unifdef</li><li>unifdefall</li><li>UnRezWack</li><li>unwinddump</li><li>what</li><li>xml2man</li><li>yacc<h1 id="Homebrew"><a href="#Homebrew" class="headerlink" title="Homebrew"></a>Homebrew</h1></li></ul><p>包管理工具可以让你安装和更新程序变得更方便,目前在 OS X 系统中最受欢迎的包管理工具是 <a href="http://brew.sh/" target="_blank" rel="noopener">Homebrew</a>.</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>在安装 Homebrew 之前,需要将 <strong>Xcode Command Line Tools</strong> 安装完成,这样你就可以使用基于 Xcode Command Line Tools 编译的 Homebrew。</p><p>在 terminal 中复制以下命令(不包括 <code>$</code>),跟随指引,将完成 Hombrew 安装。</p><pre><code>$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>紧接着,我们需要做一件事让通过 Homebrew 安装的程序的启动链接 (在 <code>/usr/local/bin</code>中)可以直接运行,无需将完整路径写出。通过以下命令将 <code>/usr/local/bin</code> 添加至 <code>$PATH</code> 环境变量中:</p><pre><code>$ echo ' export PATH="/usr/local/bin:$PATH" ' >> ~/.bash_profile</code></pre><p><strong>Cmd+T</strong> 打开一个新的 terminal 标签页,运行以下命令,确保 brew 运行正常。</p><pre><code>$ brew doctor</code></pre><hr><p><code>译注:</code></p><p>安装完成后,Homebrew 会将本地 <code>/usr/local</code> 初始化为 git 的工作树,并将目录所有者变更为当前所操作的用户,将来 <code>brew</code> 的相关操作不需要 sudo 。</p><p>Homebrew 基本使用<br>安装一个包,可以简单的运行:<br>$ brew install <package_name><br>更新 Homebrew 在服务器端上的包目录:<br>$ brew update<br>查看你的包是否需要更新:<br>$ brew outdated<br>更新包:</p><p>$ brew upgrade <package_name><br>Homebrew 将会把老版本的包缓存下来,以便当你想回滚至旧版本时使用。但这是比较少使用的情况,当你想清理旧版本的包缓存时,可以运行:<br>$ brew cleanup<br>查看你安装过的包列表(包括版本号):<br>$ brew list –versions</p><h1 id="Homebrew-Cask"><a href="#Homebrew-Cask" class="headerlink" title="Homebrew Cask"></a>Homebrew Cask</h1><p>你已经感受到了使用 Homebrew 安装命令行程序的便利。那么接下来,我们将通过 Homebrew Cask 优雅、简单、快速的安装和管理 OS X 图形界面程序,比如 Google Chrome 和 Dropbox。</p><h3 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h3><p>安装 Homebrew-cask 是如此的简单直接,运行以下命令即可完成:</p><pre><code>$ brew install caskroom/cask/brew-cask$ brew cask install google-chrome // 安装 Google 浏览器$ brew update && brew upgrade brew-cask && brew cleanup // 更新</code></pre><h3 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h3><p>如果你想查看 cask 上是否存在你需要的 app,可以到 <a href="http://caskroom.io/" target="_blank" rel="noopener">caskroom.io</a> 进行搜索。</p><h3 id="文件预览插件"><a href="#文件预览插件" class="headerlink" title="文件预览插件"></a>文件预览插件</h3><p>有些 <a href="https://github.com/sindresorhus/quick-look-plugins" target="_blank" rel="noopener">插件</a> 可以让 Mac 上的文件预览更有效,比如语法高亮、markdown 渲染、json 预览等等。</p><pre><code>$ brew cask install qlcolorcode$ brew cask install qlstephen$ brew cask install qlmarkdown$ brew cask install quicklook-json$ brew cask install qlprettypatch$ brew cask install quicklook-csv$ brew cask install betterzipql$ brew cask install webpquicklook$ brew cask install suspicious-package</code></pre><h3 id="OS-X-图形界面程序"><a href="#OS-X-图形界面程序" class="headerlink" title="OS X 图形界面程序"></a>OS X 图形界面程序</h3><pre><code>$ brew cask install alfred$ brew cask install appcleaner$ brew cask install cheatsheet$ brew cask install dropbox$ brew cask install google-chrome$ brew cask install onepassword$ brew cask install sublime-text$ brew cask install totalfinder...</code></pre><hr><p><code>译注:</code> 译者本人并不喜欢 brew cask 的安装方式,更倾向于到 App Store 或官方下载 OS X 图形界面程序。主要因为名字不好记忆、偶尔需要手动更新,另外当你使用 Alfred 或 Spotlight ,你将发现将程序安装在 ~/Application 会很方便。</p><h2 id="iTerm2"><a href="#iTerm2" class="headerlink" title="iTerm2"></a>iTerm2</h2><p>作为一名开发者,我们常常花上很多时间在终端 上,如同武士的剑,一出手便知高低。所以让我们安装 Mac 上最强大的终端 <a href="http://www.iterm2.com/" target="_blank" rel="noopener">iTerm2</a> 吧!写码除虫,居家必备。</p><p>在 <strong>Finder</strong> 中,将 <strong>iTerm</strong> 拖拽进入 Application 文件夹中。然后,你可以在 <strong>Launchpad</strong> 中启动 iTerm。</p><h3 id="颜色和字体设置"><a href="#颜色和字体设置" class="headerlink" title="颜色和字体设置"></a>颜色和字体设置</h3><ul><li>在 Keys -> Hotkey 中设置 <code>command + option + i</code> 快速显示和隐藏 iTerm</li><li>在 Profiles -> Default -> Check silence bell</li><li>下载 <a href="https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized" target="_blank" rel="noopener">Solarized dark iterm colors</a>,在 Profiles -> Default -> Colors -> Load Presets 将其导入,作为默认颜色。</li><li>在 Profiles -> Text 改变游标(cursor)文字和颜色,随个人喜好。</li><li>更多设置,可参考 <a href="http://imwuyu.me/talk-about/cool-iterm2.html/" target="_blank" rel="noopener">打造好用的终端</a></li></ul><p><a href="http://orangehat.u.qiniudn.com/iterm2-theme.png" target="_blank" rel="noopener"><img src="http://upload-images.jianshu.io/upload_images/5317394-d134e344756ca8e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Screen"></a></p><p>Zsh<br>我们将安装 zsh ,其拓展功能和主题将由 oh-my-zsh 提供。其中Env.sh 文件用于维护别名(aliases),输出(exports)和路径改变(path changes)等等,以免影响 ~/.zshrc。<br>Zsh<br>使用 Homebrew 完成 zsh 和 zsh completions 的安装<br> brew install zsh zsh-completions<br>安装 oh-my-zsh 让 zsh 获得拓展功能和主题<br> curl -L <a href="https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh" target="_blank" rel="noopener">https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh</a> | sh<br>用文本编辑器或 vi 打开 .zshrc 进行以下编辑:<br> ZSH_THEME=pygmalion<br> alias zshconfig=”vi ~/.zshrc”<br> alias envconfig=”vi ~/Projects/config/env.sh”<br> plugins=(git colored-man colorize github jira vagrant virtualenv pip python brew osx zsh-syntax-highlighting)<br>用文本编辑器或 vi 打开 ~/Projects/config/env.sh 进行以下编辑:</p><pre><code>#!/bin/zsh# PATHexport PATH="/usr/local/share/python:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"export EDITOR='vi -w'# export PYTHONPATH=$PYTHONPATH# export MANPATH="/usr/local/man:$MANPATH"# Virtual Environmentexport WORKON_HOME=$HOME/.virtualenvsexport PROJECT_HOME=$HOME/Projectssource /usr/local/bin/virtualenvwrapper.sh# Ownerexport USER_NAME="YOUR NAME"eval "$(rbenv init -)"# FileSearchfunction f() { find . -iname "*$1*" ${@:2} }function r() { grep "$1" ${@:2} -R . }#mkdir and cdfunction mkcd() { mkdir -p "$@" && cd "$_"; }# Aliasesalias cppcompile='c++ -std=c++11 -stdlib=libc++'</code></pre><p>译注:</p><p>如果是新增环境变量或者是修改环境变量的值,都需要 source 一下才能立即生效。<br>如果是删除一个环境变量,必须输入 exit 以 logout 当前 shell ,然后再重新打开一个新的 shell 并 login 才能生效。</p><h1 id="Git-and-Github"><a href="#Git-and-Github" class="headerlink" title="Git and Github"></a>Git and Github</h1><p>作为一名开发者怎么可能没有 <a href="http://git-scm.com/" target="_blank" rel="noopener">Git</a> 呢? 我们马上就来安装:</p><pre><code>$ brew install git</code></pre><p>好的,现在我们来测试一下 <code>git</code> 是否安装完好:</p><pre><code>$ git --version</code></pre><p>运行 <code>$ which git</code> 将会输出 <code>/usr/local/bin/git</code>.</p><p>接着,我们将定义你的 Git 帐号(与你在 <a href="https://github.com/" target="_blank" rel="noopener">GitHub</a> 使用的用户名和邮箱一致)</p><pre><code>$ git config --global user.name "Your Name Here"$ git config --global user.email "[email protected]"</code></pre><p>这些配置信息将会添加进 <code>~/.gitconfig</code> 文件中.</p><p>我们将推荐使用 HTTPS 方法(另一个是 SSH),将你的代码推送到 Github 上的仓库。如果你不想每次都输入用户名和密码的话,可以按照此 <a href="https://help.github.com/articles/set-up-git" target="_blank" rel="noopener">描述</a> 说的那样,运行:</p><pre><code>$ git config --global credential.helper osxkeychain</code></pre><p>此外,如果你打算使用 SSH方式,可以参考此 <a href="https://help.github.com/articles/generating-ssh-keys" target="_blank" rel="noopener">链接</a>.</p><p>Git Ignore<br>创建一个新文件 ~/.gitignore ,并将以下内容添加进去,这样全部 git 仓库将会忽略以下内容所提及的文件。</p><pre><code># Folder view configuration files.DS_StoreDesktop.ini# Thumbnail cache files._*Thumbs.db# Files that might appear on external disks.Spotlight-V100.Trashes# Compiled Python files*.pyc# Compiled C++ files*.out# Application specific filesvenvnode_modules.sass-cache</code></pre><h1 id="MySQL"><a href="#MySQL" class="headerlink" title="MySQL"></a>MySQL</h1><h3 id="安装-2"><a href="#安装-2" class="headerlink" title="安装"></a>安装</h3><p>我们将使用 Homebrew 安装 <a href="http://www.mysql.com/" target="_blank" rel="noopener">MySQL</a>,同时也会安装 MySQL 的相关文件。</p><p>安装 MySQL:</p><pre><code>$ brew update # 这是一个好习惯$ brew install mysql</code></pre><p>在使用 MySQL 前,我们需要做一些设置:</p><pre><code>$ unset TMPDIR$ mkdir /usr/local/var$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp</code></pre><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><p>启动 MySQL 服务,运行 <code>mysql.server</code></p><pre><code>$ mysql.server start</code></pre><p>关闭 MySQL,运行:</p><pre><code>$ mysql.server stop</code></pre><p>你可以了解更多 <code>mysql.server</code> 的命令,运行:</p><pre><code>$ mysql.server --help</code></pre><p>登录 MySQL, 运行:</p><pre><code>$ mysql -uroot</code></pre><p><strong>Note</strong>: 默认情况下,MySQL 用户 <code>root</code> 没有密码,这对本地开发没有关系,但如果你希望修改密码,你可以运行:</p><pre><code>$ mysqladmin -u root password 'new-password'</code></pre><hr><p><code>译注:</code></pre><p>当你在设置密码时出现问题,可以参考 <a href="https://ruby-china.org/topics/1901" target="_blank" rel="noopener">lgn21st</a> 的方式。</p><p>此外,如果你觉得敲那么多命令是一件很麻烦的事情,那么你也可以参考 <a href="http://elf8848.iteye.com/blog/1914209" target="_blank" rel="noopener">Mac OS安装 MySQL(使用二进制PGK包安装)</a></p><h1 id="Node-js"><a href="#Node-js" class="headerlink" title="Node.js"></a>Node.js</h1><p>使用 Homebrew 安装 <a href="http://nodejs.org/" target="_blank" rel="noopener">Node.js</a>:</p><pre><code>$ brew update$ brew install node</code></pre><p>一般 Node modules 通常被安装在每个项目的本地文件夹 <code>node_modules</code>, 但有几个包推荐你安装在全局:</p><p><a href="http://coffeescript.org/" target="_blank" rel="noopener">CoffeeScript</a>、 <a href="http://lesscss.org/" target="_blank" rel="noopener">Less</a>、 <a href="http://gruntjs.com/" target="_blank" rel="noopener">Grunt</a> 或 <a href="http://gulpjs.com/" target="_blank" rel="noopener">Gulp</a></p><pre><code>$ npm install -g coffee-script$ npm install -g less$ npm install -g grunt-cli$ npm install -g gulp</code></pre><h3 id="Npm-使用"><a href="#Npm-使用" class="headerlink" title="Npm 使用"></a>Npm 使用</h3><p>安装包:</p><pre><code>$ npm install <package> # 安装在本地项目中$ npm install -g <package> # 安装在全局</code></pre><p>安装包,并且将其保存你项目中的 <code>package.json</code> 文件:</p><pre><code>$ npm install <package> --save</code></pre><p>查看 npm 安装的内容:</p><pre><code>$ npm list # 本地$ npm list -g # 全局</code></pre><p>查看过期的包(本地或全局):</p><pre><code>$ npm outdated [-g]</code></pre><p>更新全部或特别指定一个包:</p><pre><code>$ npm update [<package>]</code></pre><p>卸载包:</p><pre><code>$ npm uninstall <package></code></pre><h1 id="Apps"><a href="#Apps" class="headerlink" title="Apps"></a>Apps</h1><p>这里推荐的 apps 在开发者圈子内普遍评价不错,能便利的处理日常的开发和使用的任务。以下推荐分为四类:</p><ul><li>开发者工具</li><li>生产力工具</li><li>办公工具</li><li>其他</li></ul><h3 id="Developer-Tools"><a href="#Developer-Tools" class="headerlink" title="Developer Tools"></a>Developer Tools</h3><ul><li><a href="https://www.google.com/intl/en/chrome/browser/" target="_blank" rel="noopener">Google Chrome</a></li><li><a href="https://www.jetbrains.com/webstorm/" target="_blank" rel="noopener">Webstorm</a></li><li><a href="http://bohemiancoding.com/sketch/" target="_blank" rel="noopener">Sketch</a></li><li><a href="http://kapeli.com/dash" target="_blank" rel="noopener">Dash</a></li><li><a href="http://www.sequelpro.com/" target="_blank" rel="noopener">Sequel Pro</a></li><li><a href="https://www.parallels.com/hk/" target="_blank" rel="noopener">Parallels</a></li><li><a href="https://mac.github.com/" target="_blank" rel="noopener">Github</a></li></ul><h3 id="Productivity"><a href="#Productivity" class="headerlink" title="Productivity"></a>Productivity</h3><ul><li><p><a href="https://agilebits.com/onepassword" target="_blank" rel="noopener">1Password</a> : 跨平台的密码管理工具</p></li><li><p><a href="http://www.alfredapp.com/" target="_blank" rel="noopener">Alfred 2</a> : 搜索工具,强烈建议更新至 power pack,可以参考 <a href="http://www.zhihu.com/question/20656680" target="_blank" rel="noopener">借助 Alfred 2 的 Workflows 功能可以做哪些好玩的事情?</a></p></li><li><p><a href="http://www.freemacsoft.net/appcleaner/" target="_blank" rel="noopener">AppCleaner</a>: 应用程序卸载工具</p></li><li><p><a href="https://www.dropbox.com/" target="_blank" rel="noopener">Dropbox</a>: 文件同步工具</p></li><li><p><a href="http://reederapp.com/" target="_blank" rel="noopener">Reeder</a>:RSS 阅读工具</p></li><li><p><a href="https://getpocket.com/" target="_blank" rel="noopener">Pocket</a> : 稍后阅读工具</p></li><li><p><a href="http://spectacleapp.com/" target="_blank" rel="noopener">Spectacle</a> : 让窗口成比例的显示,在写代码调试的时候很方便</p></li><li><p><a href="http://wakaba.c3.cx/s/apps/unarchiver.html" target="_blank" rel="noopener">Unarchiver</a>: 支持多种格式(包括 windows下的格式)的压缩/解压缩工具</p></li><li><p><a href="https://www.omnigroup.com/omnifocus" target="_blank" rel="noopener">OminiFocus</a> :时间管理工具</p></li><li><p><a href="http://25.io/mou/" target="_blank" rel="noopener">Mou</a>:Markdown 编辑器,国人出品</p></li><li><p>[Sip] 取色器</p></li><li><p>[MindeNode] 思维导图</p></li><li><p>[xScope] 测量工具</p></li><li><p>[Lantern] 科学上网</p></li><li><p>[OhMyStar] Github star 管理</p></li></ul><h3 id="Office-Apps"><a href="#Office-Apps" class="headerlink" title="Office Apps"></a>Office Apps</h3><ul><li><a href="http://www.apple.com/mac/keynote/" target="_blank" rel="noopener">Keynote</a></li><li><a href="http://www.apple.com/mac/numbers/" target="_blank" rel="noopener">Numbers</a></li><li><a href="http://www.apple.com/mac/pages/" target="_blank" rel="noopener">Pages</a></li><li><a href="http://www.microsoft.com/mac/buy" target="_blank" rel="noopener">Microsoft Office</a></li></ul><h3 id="Others"><a href="#Others" class="headerlink" title="Others"></a>Others</h3><ul><li><a href="http://www.grandtotal.biz/CheatSheet/" target="_blank" rel="noopener">CheatSheet</a> : 长按 <code>command</code> ,将能查看当前程序的快捷键</li><li><a href="https://tapbots.com/software/tweetbot/mac/" target="_blank" rel="noopener">Tweetbot</a>: 最好的 twitter 客户端,优雅,精致</li></ul>]]></content>
<summary type="html">
<h1 id="Mac-开发配置手册"><a href="#Mac-开发配置手册" class="headerlink" title="Mac 开发配置手册"></a>Mac 开发配置手册</h1><p>手册内容为「<strong>如何让一部全新的 MacBook 快速完成开发环
</summary>
<category term="编程" scheme="http://blog.cuteximi.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="mac" scheme="http://blog.cuteximi.com/tags/mac/"/>
</entry>
<entry>
<title>pip-bug解决方案</title>
<link href="http://blog.cuteximi.com/pip-bug%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
<id>http://blog.cuteximi.com/pip-bug解决方案/</id>
<published>2018-09-19T06:37:11.000Z</published>
<updated>2018-09-19T06:40:21.295Z</updated>
<content type="html"><![CDATA[<p>使用pip3 出现以下错误:</p><figcaption>(most recent call last):</figcaption><pre class="line-numbers language-Traceback"><code class="language-Traceback">File “/usr/bin/pip3”, line 9, infrom pip import main<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>或者pip升级时也出现这个问题<br>这是pip 10.0.0版本的BUG</p><p><strong>解决办法</strong></p><p>修改 /usr/bin/pip 文件</p><pre class="line-numbers language-text"><code class="language-text">from pip import mainif __name__ == '__main__': sys.exit(main())<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>改为:</p><pre class="line-numbers language-text"><code class="language-text">from pip import __main__if __name__ == '__main__': sys.exit(__main__._main())<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p><img src="https://upload-images.jianshu.io/upload_images/5317394-8459959eaa590f27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="微信公众号:码省理工"></p>]]></content>
<summary type="html">
<p>使用pip3 出现以下错误:</p>
<figcaption>(most recent call last):</figcaption><pre class="line-numbers language-Traceback"><code class="language-Tr
</summary>
<category term="pip" scheme="http://blog.cuteximi.com/tags/pip/"/>
</entry>
<entry>
<title>SpringBoot采坑|启动项目检测不到Controller</title>
<link href="http://blog.cuteximi.com/SpringBoot%E9%87%87%E5%9D%91-%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE%E6%A3%80%E6%B5%8B%E4%B8%8D%E5%88%B0Controller/"/>
<id>http://blog.cuteximi.com/SpringBoot采坑-启动项目检测不到Controller/</id>
<published>2018-09-19T06:34:27.000Z</published>
<updated>2018-09-19T06:40:18.087Z</updated>
<content type="html"><![CDATA[<pre><code>问题描述:springboot项目访问不到controller方法。</code></pre><p>【分析】<br>应该是springboot并没有扫描到controller。<br>【查看日志】<br>记录此时的日志输出</p><pre><code>/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/java -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51893 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51894:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/tools.jar:/Users/taoshilei/Documents/springbootdemo/target/classes:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/2.0.4.RELEASE/spring-boot-starter-jdbc-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter/2.0.4.RELEASE/spring-boot-starter-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot/2.0.4.RELEASE/spring-boot-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.0.4.RELEASE/spring-boot-starter-logging-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/taoshilei/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/taoshilei/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/Users/taoshilei/.m2/repository/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/Users/taoshilei/.m2/repository/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/Users/taoshilei/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/Users/taoshilei/.m2/repository/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/Users/taoshilei/.m2/repository/com/zaxxer/HikariCP/2.7.9/HikariCP-2.7.9.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-jdbc/5.0.8.RELEASE/spring-jdbc-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-beans/5.0.8.RELEASE/spring-beans-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-tx/5.0.8.RELEASE/spring-tx-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.0.4.RELEASE/spring-boot-starter-web-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.0.4.RELEASE/spring-boot-starter-json-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.6/jackson-datatype-jdk8-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.6/jackson-datatype-jsr310-2.9.6.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.0.4.RELEASE/spring-boot-starter-tomcat-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.32/tomcat-embed-core-8.5.32.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/8.5.32/tomcat-embed-el-8.5.32.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.32/tomcat-embed-websocket-8.5.32.jar:/Users/taoshilei/.m2/repository/org/hibernate/validator/hibernate-validator/6.0.11.Final/hibernate-validator-6.0.11.Final.jar:/Users/taoshilei/.m2/repository/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/Users/taoshilei/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/taoshilei/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-web/5.0.8.RELEASE/spring-web-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-webmvc/5.0.8.RELEASE/spring-webmvc-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-aop/5.0.8.RELEASE/spring-aop-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-context/5.0.8.RELEASE/spring-context-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-expression/5.0.8.RELEASE/spring-expression-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.3.1/mybatis-spring-boot-starter-1.3.1.jar:/Users/taoshilei/.m2/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.3.1/mybatis-spring-boot-autoconfigure-1.3.1.jar:/Users/taoshilei/.m2/repository/org/mybatis/mybatis/3.4.5/mybatis-3.4.5.jar:/Users/taoshilei/.m2/repository/org/mybatis/mybatis-spring/1.3.1/mybatis-spring-1.3.1.jar:/Users/taoshilei/.m2/repository/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-core/5.0.8.RELEASE/spring-core-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-jcl/5.0.8.RELEASE/spring-jcl-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.6/jackson-module-parameter-names-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.9.6/jackson-core-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper-spring-boot-starter/1.2.5/pagehelper-spring-boot-starter-1.2.5.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.2.5/pagehelper-spring-boot-autoconfigure-1.2.5.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper/5.1.4/pagehelper-5.1.4.jar:/Users/taoshilei/.m2/repository/com/github/jsqlparser/jsqlparser/1.0/jsqlparser-1.0.jar:/Users/taoshilei/.m2/repository/com/alibaba/druid-spring-boot-starter/1.1.9/druid-spring-boot-starter-1.1.9.jar:/Users/taoshilei/.m2/repository/com/alibaba/druid/1.1.9/druid-1.1.9.jar:/Users/taoshilei/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.0.4.RELEASE/spring-boot-autoconfigure-2.0.4.RELEASE.jar com.cuteximi.springbootdemo.SpringbootdemoApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.4.RELEASE)2018-08-26 17:14:42.416 INFO 2196 --- [ main] c.c.s.SpringbootdemoApplication : Starting SpringbootdemoApplication on ximi.local with PID 2196 (/Users/taoshilei/Documents/springbootdemo/target/classes started by taoshilei in /Users/taoshilei/Documents/springbootdemo)2018-08-26 17:14:42.419 INFO 2196 --- [ main] c.c.s.SpringbootdemoApplication : No active profile set, falling back to default profiles: default2018-08-26 17:14:42.481 INFO 2196 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4f6ee6e4: startup date [Sun Aug 26 17:14:42 CST 2018]; root of context hierarchy2018-08-26 17:14:43.641 INFO 2196 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2018-08-26 17:14:43.659 INFO 2196 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2018-08-26 17:14:43.659 INFO 2196 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.322018-08-26 17:14:43.662 INFO 2196 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/taoshilei/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]2018-08-26 17:14:43.717 INFO 2196 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2018-08-26 17:14:43.717 INFO 2196 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1239 ms2018-08-26 17:14:43.779 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]2018-08-26 17:14:43.780 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet statViewServlet mapped to [/druid/*]2018-08-26 17:14:43.782 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]2018-08-26 17:14:43.782 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]2018-08-26 17:14:43.782 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]2018-08-26 17:14:43.783 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]2018-08-26 17:14:43.783 INFO 2196 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webStatFilter' to urls: [/*]2018-08-26 17:14:43.823 INFO 2196 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource2018-08-26 17:14:44.149 INFO 2196 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited2018-08-26 17:14:44.354 INFO 2196 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:14:44.474 INFO 2196 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4f6ee6e4: startup date [Sun Aug 26 17:14:42 CST 2018]; root of context hierarchy2018-08-26 17:14:44.511 INFO 2196 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)2018-08-26 17:14:44.512 INFO 2196 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)2018-08-26 17:14:44.529 INFO 2196 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:14:44.529 INFO 2196 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:14:44.744 INFO 2196 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup2018-08-26 17:14:44.745 INFO 2196 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'statFilter' has been autodetected for JMX exposure2018-08-26 17:14:44.746 INFO 2196 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure2018-08-26 17:14:44.749 INFO 2196 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSource,type=DruidDataSourceWrapper]2018-08-26 17:14:44.750 INFO 2196 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'statFilter': registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]2018-08-26 17:14:44.789 INFO 2196 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2018-08-26 17:14:44.793 INFO 2196 --- [ main] c.c.s.SpringbootdemoApplication : Started SpringbootdemoApplication in 2.774 seconds (JVM running for 3.516)2018-08-26 17:15:29.784 INFO 2196 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'2018-08-26 17:15:29.784 INFO 2196 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started2018-08-26 17:15:29.798 INFO 2196 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 14 ms2018-08-26 17:17:08.584 INFO 2196 --- [ Thread-8] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4f6ee6e4: startup date [Sun Aug 26 17:14:42 CST 2018]; root of context hierarchy2018-08-26 17:17:08.599 INFO 2196 --- [ Thread-8] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown2018-08-26 17:17:08.600 INFO 2196 --- [ Thread-8] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans2018-08-26 17:17:08.615 INFO 2196 --- [ Thread-8] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closedProcess finished with exit code 130 (interrupted by signal 2: SIGINT)</code></pre><p>【解决方案】<br>试着使用网提供的思路,将启动类放到与controller文件夹同级。<br><img src="https://upload-images.jianshu.io/upload_images/5317394-839f596aac07f180.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p>【再次查看日志】</p><pre><code>/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/java -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=52845 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=52846:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/lib/tools.jar:/Users/taoshilei/Documents/springbootdemo/target/classes:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/2.0.4.RELEASE/spring-boot-starter-jdbc-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter/2.0.4.RELEASE/spring-boot-starter-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot/2.0.4.RELEASE/spring-boot-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.0.4.RELEASE/spring-boot-starter-logging-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/taoshilei/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/taoshilei/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar:/Users/taoshilei/.m2/repository/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar:/Users/taoshilei/.m2/repository/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:/Users/taoshilei/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/Users/taoshilei/.m2/repository/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar:/Users/taoshilei/.m2/repository/com/zaxxer/HikariCP/2.7.9/HikariCP-2.7.9.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-jdbc/5.0.8.RELEASE/spring-jdbc-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-beans/5.0.8.RELEASE/spring-beans-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-tx/5.0.8.RELEASE/spring-tx-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.0.4.RELEASE/spring-boot-starter-web-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.0.4.RELEASE/spring-boot-starter-json-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.6/jackson-datatype-jdk8-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.6/jackson-datatype-jsr310-2.9.6.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.0.4.RELEASE/spring-boot-starter-tomcat-2.0.4.RELEASE.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.32/tomcat-embed-core-8.5.32.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/8.5.32/tomcat-embed-el-8.5.32.jar:/Users/taoshilei/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.32/tomcat-embed-websocket-8.5.32.jar:/Users/taoshilei/.m2/repository/org/hibernate/validator/hibernate-validator/6.0.11.Final/hibernate-validator-6.0.11.Final.jar:/Users/taoshilei/.m2/repository/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar:/Users/taoshilei/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/taoshilei/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-web/5.0.8.RELEASE/spring-web-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-webmvc/5.0.8.RELEASE/spring-webmvc-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-aop/5.0.8.RELEASE/spring-aop-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-context/5.0.8.RELEASE/spring-context-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-expression/5.0.8.RELEASE/spring-expression-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.3.1/mybatis-spring-boot-starter-1.3.1.jar:/Users/taoshilei/.m2/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.3.1/mybatis-spring-boot-autoconfigure-1.3.1.jar:/Users/taoshilei/.m2/repository/org/mybatis/mybatis/3.4.5/mybatis-3.4.5.jar:/Users/taoshilei/.m2/repository/org/mybatis/mybatis-spring/1.3.1/mybatis-spring-1.3.1.jar:/Users/taoshilei/.m2/repository/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-core/5.0.8.RELEASE/spring-core-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/springframework/spring-jcl/5.0.8.RELEASE/spring-jcl-5.0.8.RELEASE.jar:/Users/taoshilei/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.6/jackson-module-parameter-names-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.9.6/jackson-core-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar:/Users/taoshilei/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper-spring-boot-starter/1.2.5/pagehelper-spring-boot-starter-1.2.5.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.2.5/pagehelper-spring-boot-autoconfigure-1.2.5.jar:/Users/taoshilei/.m2/repository/com/github/pagehelper/pagehelper/5.1.4/pagehelper-5.1.4.jar:/Users/taoshilei/.m2/repository/com/github/jsqlparser/jsqlparser/1.0/jsqlparser-1.0.jar:/Users/taoshilei/.m2/repository/com/alibaba/druid-spring-boot-starter/1.1.9/druid-spring-boot-starter-1.1.9.jar:/Users/taoshilei/.m2/repository/com/alibaba/druid/1.1.9/druid-1.1.9.jar:/Users/taoshilei/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/taoshilei/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.0.4.RELEASE/spring-boot-autoconfigure-2.0.4.RELEASE.jar com.cuteximi.springbootdemo.SpringbootdemoApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.4.RELEASE)2018-08-26 17:50:40.248 INFO 2506 --- [ main] c.c.s.SpringbootdemoApplication : Starting SpringbootdemoApplication on ximi.local with PID 2506 (/Users/taoshilei/Documents/springbootdemo/target/classes started by taoshilei in /Users/taoshilei/Documents/springbootdemo)2018-08-26 17:50:40.251 INFO 2506 --- [ main] c.c.s.SpringbootdemoApplication : No active profile set, falling back to default profiles: default2018-08-26 17:50:40.347 INFO 2506 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@359f7cdf: startup date [Sun Aug 26 17:50:40 CST 2018]; root of context hierarchy2018-08-26 17:50:41.652 INFO 2506 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2018-08-26 17:50:41.674 INFO 2506 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2018-08-26 17:50:41.674 INFO 2506 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.322018-08-26 17:50:41.677 INFO 2506 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/taoshilei/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]2018-08-26 17:50:41.739 INFO 2506 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2018-08-26 17:50:41.739 INFO 2506 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1395 ms2018-08-26 17:50:41.814 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]2018-08-26 17:50:41.815 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet statViewServlet mapped to [/druid/*]2018-08-26 17:50:41.817 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]2018-08-26 17:50:41.818 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]2018-08-26 17:50:41.818 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]2018-08-26 17:50:41.818 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]2018-08-26 17:50:41.818 INFO 2506 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webStatFilter' to urls: [/*]2018-08-26 17:50:41.862 INFO 2506 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource2018-08-26 17:50:42.174 INFO 2506 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited2018-08-26 17:50:42.372 INFO 2506 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:50:42.493 INFO 2506 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@359f7cdf: startup date [Sun Aug 26 17:50:40 CST 2018]; root of context hierarchy2018-08-26 17:50:42.524 INFO 2506 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/list],methods=[GET]}" onto public java.util.List<com.cuteximi.springbootdemo.domain.User> com.cuteximi.springbootdemo.controller.StudentController.test1()2018-08-26 17:50:42.528 INFO 2506 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)2018-08-26 17:50:42.528 INFO 2506 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)2018-08-26 17:50:42.545 INFO 2506 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:50:42.545 INFO 2506 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2018-08-26 17:50:42.717 INFO 2506 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup2018-08-26 17:50:42.718 INFO 2506 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'statFilter' has been autodetected for JMX exposure2018-08-26 17:50:42.718 INFO 2506 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure2018-08-26 17:50:42.722 INFO 2506 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.alibaba.druid.spring.boot.autoconfigure:name=dataSource,type=DruidDataSourceWrapper]2018-08-26 17:50:42.723 INFO 2506 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'statFilter': registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]2018-08-26 17:50:42.762 INFO 2506 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2018-08-26 17:50:42.768 INFO 2506 --- [ main] c.c.s.SpringbootdemoApplication : Started SpringbootdemoApplication in 2.914 seconds (JVM running for 3.529)</code></pre><p>对比两次日志,多了这一条:</p><pre><code>2018-08-26 17:50:42.524 INFO 2506 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/list],methods=[GET]}" onto public java.util.List<com.cuteximi.springbootdemo.domain.User> com.cuteximi.springbootdemo.controller.StudentController.test1()</code></pre><p>实验结果:<br><img src="https://upload-images.jianshu.io/upload_images/5317394-9854c70cb67fb591.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-8459959eaa590f27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="微信公众号:码省理工"></p>]]></content>
<summary type="html">
<pre><code>问题描述:springboot项目访问不到controller方法。
</code></pre><p>【分析】<br>应该是springboot并没有扫描到controller。<br>【查看日志】<br>记录此时的日志输出</p>
<pre><code>/
</summary>
<category term="Spring Boot" scheme="http://blog.cuteximi.com/tags/Spring-Boot/"/>
</entry>
<entry>
<title>致自己-关键总结</title>
<link href="http://blog.cuteximi.com/%E8%87%B4%E8%87%AA%E5%B7%B1-%E5%85%B3%E9%94%AE%E6%80%BB%E7%BB%93/"/>
<id>http://blog.cuteximi.com/致自己-关键总结/</id>
<published>2018-09-19T06:30:09.000Z</published>
<updated>2018-09-19T06:40:19.705Z</updated>
<content type="html"><![CDATA[<p>Google was late to search.<br>Facebook was late to social networking.<br>Apple was late to the MP3 Player.</p><p><code>It`s never to late.Just do it better.</code></p><p>任何时候做任何决定都不是最晚的时候,而是你要斟酌自己自身的实力,不要去企图把小概率事件扣到自己的头上。</p><p>借用stormzhang(帅张)一段话:</p><blockquote><p>人的一生有很多重要的决定,最大的可能是在做正确的决定其实决定了你未来的人生,是否考研,是否转行,要不要去投资个生意,爱上一个女孩要不要去追等等等,做这些所有的选择与决定之前,想想自身的优势,结合趋势和风口,看一下自己做这件事的把握有多少,单反但凡重大决定,不要想着在尝试中去找答案,对于小事情这样是可以的,但是对于一些重要决定是没有尝试的机会的,想尽一切办法想把仗打赢的,是最难的,你该做的,是在一开始选择前,这场仗能打赢,再去打。</p></blockquote><p>最后(还是引用stormzhang)一句话告诫自己:<br>永远不要以小概率事件来决策,永远不要把自己当成小概率事件的缔造者。</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-8459959eaa590f27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="微信公众号:码省理工"></p>]]></content>
<summary type="html">
<p>Google was late to search.<br>Facebook was late to social networking.<br>Apple was late to the MP3 Player.</p>
<p><code>It`s never to lat
</summary>
</entry>
<entry>
<title>致自己</title>
<link href="http://blog.cuteximi.com/%E8%87%B4%E8%87%AA%E5%B7%B1/"/>
<id>http://blog.cuteximi.com/致自己/</id>
<published>2018-09-19T06:30:03.000Z</published>
<updated>2018-09-19T06:40:22.501Z</updated>
<content type="html"><![CDATA[<p>Google was late to search.<br>Facebook was late to social networking.<br>Apple was late to the MP3 Player.</p><p><code>It`s never to late.Just do it better.</code></p><p>任何时候做任何决定都不是最晚的时候,而是你要斟酌自己自身的实力,不要去企图把小概率事件扣到自己的头上。</p><p>借用stormzhang(帅张)一段话:</p><blockquote><p>人的一生有很多重要的决定,最大的可能是在做正确的决定其实决定了你未来的人生,是否考研,是否转行,要不要去投资个生意,爱上一个女孩要不要去追等等等,做这些所有的选择与决定之前,想想自身的优势,结合趋势和风口,看一下自己做这件事的把握有多少,单反但凡重大决定,不要想着在尝试中去找答案,对于小事情这样是可以的,但是对于一些重要决定是没有尝试的机会的,想尽一切办法想把仗打赢的,是最难的,你该做的,是在一开始选择前,这场仗能打赢,再去打。</p></blockquote><p>最后(还是引用stormzhang)一句话告诫自己:<br>永远不要以小概率事件来决策,永远不要把自己当成小概率事件的缔造者。</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-8459959eaa590f27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="微信公众号:码省理工"></p>]]></content>
<summary type="html">
<p>Google was late to search.<br>Facebook was late to social networking.<br>Apple was late to the MP3 Player.</p>
<p><code>It`s never to lat
</summary>
<category term="致自己" scheme="http://blog.cuteximi.com/categories/%E8%87%B4%E8%87%AA%E5%B7%B1/"/>
</entry>
<entry>
<title>jstat使用指南</title>
<link href="http://blog.cuteximi.com/jstat%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"/>
<id>http://blog.cuteximi.com/jstat使用指南/</id>
<published>2018-09-19T06:23:46.000Z</published>
<updated>2018-09-19T06:27:49.963Z</updated>
<content type="html"><![CDATA[<h1 id="jstat命令使用"><a href="#jstat命令使用" class="headerlink" title="jstat命令使用"></a>jstat命令使用</h1><h3 id="1-说在前面"><a href="#1-说在前面" class="headerlink" title="1 说在前面"></a>1 说在前面</h3><blockquote><p>提示:可以通过jps查看虚拟机进程的id<br>例如:使用命令<code>jps -l</code><br>注意:本次演示使用的jdk版本是jdk8.</p></blockquote><p><img src="https://upload-images.jianshu.io/upload_images/5317394-eb8c3f5e799a8c6c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="HotSpot虚拟机进程"></p><h3 id="2-jstat简介"><a href="#2-jstat简介" class="headerlink" title="2 jstat简介"></a>2 jstat简介</h3><p>jstat命令可以监控Java堆状况,监控类装载、卸载数量等,监控JIT编译等。命令的格式如下:</p><figcaption>[-命令选项] [vmid] [间隔时间/毫秒] [查询次数]</code></p></figcaption><pre class="line-numbers language-jstat"><h3 id="3-演示各个参数"><a href="#3-演示各个参数" class="headerlink" title="3 演示各个参数"><code class="language-jstat"><h3 id="3-演示各个参数"><a href="#3-演示各个参数" class="headerlink" title="3 演示各个参数"></a>3 演示各个参数</h3><p>3.1 类加载统计</p><p>命令行输入:<code>jstat -class 70815</code></p><pre><code>Loaded Bytes Unloaded Bytes Time 3610 6339.0 0 0.0 4.01<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p><code>说明</code></p><ul><li>Loaded:加载class的数量</li><li>Bytes:所占用空间大小</li><li>Unloaded:未加载数量</li><li>Bytes:未加载占用空间</li><li>Time:时间</li></ul><p>3.2 编译统计</p><p>命令行输入:<code>jstat -compiler 70815</code></p><pre><code>Compiled Failed Invalid Time FailedType FailedMethod 1624 0 0 2.08 0</code></pre><p><code>说明</code></p><ul><li>Compiled:编译数量。</li><li>Failed:失败数量</li><li>Invalid:不可用数量</li><li>Time:时间</li><li>FailedType:失败类型</li><li>FailedMethod:失败的方法</li></ul><p>3.3 垃圾回收统计<br>命令行输入:<code>jstat -gc 70815</code><br>可右划查看结果。</p><pre><code>S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT5120.0 5120.0 5100.9 0.0 33280.0 2452.0 87552.0 4345.6 18560.0 18133.4 2432.0 2216.3 4 0.033 1 0.014 0.047</code></pre><p><code>说明</code></p><ul><li>S0C:第一个幸存区的大小</li><li>S1C:第二个幸存区的大小</li><li>S0U:第一个幸存区的使用大小</li><li>S1U:第二个幸存区的使用大小</li><li>EC:新生代的大小</li><li>EU:新生代的使用大小</li><li>OC:老年代大小</li><li>OU:老年代使用大小</li><li>MC:方法区大小</li><li>MU:方法区使用大小</li><li>CCSC:压缩类空间大小</li><li>CCSU:压缩类空间使用大小</li><li>YGC:年轻代垃圾回收次数</li><li>YGCT:年轻代垃圾回收消耗时间</li><li>FGC:老年代垃圾回收次数</li><li>FGCT:老年代垃圾回收消耗时间</li><li>GCT:垃圾回收消耗总时间</li></ul><p>3.4 堆内存统计<br>输入命令:jstat -gcapacity 70815</p><pre><code> NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 43520.0 262144.0 43520.0 5120.0 5120.0 33280.0 87552.0 524288.0 87552.0 87552.0 0.0 1064960.0 18560.0 0.0 1048576.0 2432.0 4 1</code></pre><p><code>说明</code></p><ul><li>NGCMN:新生代最小容量</li><li>NGCMX:新生代最大容量</li><li>NGC:当前新生代容量</li><li>S0C:第一个幸存区大小</li><li>S1C:第二个幸存区的大小</li><li>EC:Eden区的大小</li><li>OGCMN:老年代最小容量</li><li>OGCMX:老年代最大容量</li><li>OGC:当前老年代大小</li><li>OC: 当前老年代大小</li><li>MCMN: 最小元数据容量</li><li>MCMX:最大元数据容量</li><li>MC:当前元数据空间大小</li><li>CCSMN:最小压缩类空间大小</li><li>CCSMX:最大压缩类空间大小</li><li>CCSC:当前压缩类空间大小</li><li>YGC:年轻代gc次数</li><li>FGC:老年代GC次数</li></ul><p>3.5 新生代垃圾回收统计<br>输入命令:<code>jstat -gcnew 70815</code></p><pre><code> S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT5120.0 5120.0 5100.9 0.0 7 15 5120.0 33280.0 3198.8 4 0.033</code></pre><p><code>说明</code></p><ul><li>S0C:第一个幸存区大小</li><li>S1C:第二个幸存区的大小</li><li>S0U:第一个幸存区的使用大小</li><li>S1U:第二个幸存区的使用大小</li><li>TT:对象在新生代存活的次数</li><li>MTT:对象在新生代存活的最大次数</li><li>DSS:期望的幸存区大小</li><li>EC:Eden区的大小</li><li>EU:Eden区的使用大小</li><li>YGC:年轻代垃圾回收次数</li><li>YGCT:年轻代垃圾回收消耗时间</li></ul><p>3.6 新生代内存统计<br>输入命令:<code>jstat -gcnewcapacity 70815</code></p><pre><code>NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC 43520.0 262144.0 43520.0 87040.0 5120.0 87040.0 5120.0 261120.0 33280.0 4 1</code></pre><p><code>说明</code></p><ul><li>NGCMN:新生代最小容量</li><li>NGCMX:新生代最大容量</li><li>NGC:当前新生代容量</li><li>S0CMX:最大幸存1区大小</li><li>S0C:当前幸存1区大小</li><li>S1CMX:最大幸存2区大小</li><li>S1C:当前幸存2区大小</li><li>ECMX:最大Eden区大小</li><li>EC:当前Eden区大小</li><li>YGC:年轻代垃圾回收次数</li><li>FGC:老年代回收次数</li></ul><p>3.7 老年代垃圾回收统计<br>输入命令: <code>jstat -gcold 70815</code></p><pre><code> MC MU CCSC CCSU OC OU YGC FGC FGCT GCT 18560.0 18133.4 2432.0 2216.3 87552.0 4345.6 4 1 0.014 0.047</code></pre><p><code>说明</code></p><ul><li>MC:方法区大小</li><li>MU:方法区使用大小</li><li>CCSC:压缩类空间大小</li><li>CCSU:压缩类空间使用大小</li><li>OC:老年代大小</li><li>OU:老年代使用大小</li><li>YGC:年轻代垃圾回收次数</li><li>FGC:老年代垃圾回收次数</li><li>FGCT:老年代垃圾回收消耗时间</li><li>GCT:垃圾回收消耗总时间</li></ul><p>3.8 老年代内存统计<br>输入命令:<code>jstat -gcoldcapacity 70815</code></p><pre><code>OGCMN OGCMX OGC OC YGC FGC FGCT GCT 87552.0 524288.0 87552.0 87552.0 4 1 0.014 0.047</code></pre><p><code>说明</code></p><ul><li>OGCMN:老年代最小容量</li><li>OGCMX:老年代最大容量</li><li>OGC:当前老年代大小</li><li>OC:老年代大小</li><li>YGC:年轻代垃圾回收次数</li><li>FGC:老年代垃圾回收次数</li><li>FGCT:老年代垃圾回收消耗时间</li><li>GCT:垃圾回收消耗总时间</li></ul><p>3.9 元数据空间统计<br>输入命令:<code>jstat -gcmetacapacity 70815</code></p><pre><code> MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT 0.0 1064960.0 18560.0 0.0 1048576.0 2432.0 4 1 0.014 0.047</code></pre><p><code>说明</code></p><ul><li>MCMN:最小元数据容量</li><li>MCMX:最大元数据容量</li><li>MC:当前元数据空间大小</li><li>CCSMN:最小压缩类空间大小</li><li>CCSMX:最大压缩类空间大小</li><li>CCSC:当前压缩类空间大小</li><li>YGC:年轻代垃圾回收次数</li><li>FGC:老年代垃圾回收次数</li><li>FGCT:老年代垃圾回收消耗时间</li><li>GCT:垃圾回收消耗总时间</li></ul><h2 id="总结垃圾回收统计"><a href="#总结垃圾回收统计" class="headerlink" title="总结垃圾回收统计"></a>总结垃圾回收统计</h2><p>输入命令:<code>jstat -gcutil 70815</code></p><pre><code>S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 99.63 0.00 11.95 4.96 97.70 91.13 4 0.033 1 0.014 0.047</code></pre><p><code>说明</code></p><ul><li>S0:幸存1区当前使用比例</li><li>S1:幸存2区当前使用比例</li><li>E:Eden区使用比例</li><li>O:老年代使用比例</li><li>M:元数据区使用比例</li><li>CCS:压缩使用比例</li><li>YGC:年轻代垃圾回收次数</li><li>FGC:老年代垃圾回收次数</li><li>FGCT:老年代垃圾回收消耗时间</li><li>GCT:垃圾回收消耗总时间</li></ul><p>3.10 JVM编译方法统计<br>输入命令:<code>jstat printcompliation 70815</code></p><pre><code>Compiled Size Type Method 1708 8 1 java/lang/reflect/WeakCache$LookupValue hashCode</code></pre><p><code>说明</code></p><ul><li>Compiled:最近编译方法的数量</li><li>Size:最近编译方法的字节码数量</li><li>Type:最近编译方法的编译类型。</li><li>Method:方法名标识。</li></ul><h3 id="说在最后"><a href="#说在最后" class="headerlink" title="说在最后"></a>说在最后</h3><p>Google was late to search.<br>Facebook was late to social networking.<br>Apple was late to the MP3 Player.<br><code>It`s never to late.Just do it better.</code></pre><p>任何时候做任何决定都不是最晚的时候,而是你要斟酌自己自身的实力,不要去企图把小概率事件扣到自己的头上。</p><p>借用stormzhang(帅张)一段话:</p><blockquote><p>人的一生有很多重要的决定,最大的可能是在做正确的决定其实决定了你未来的人生,是否考研,是否抓航,要不要去投资个生意,爱上一个女孩要不要去追等等等,做这些所有的选择与决定之前,想想自身的优势,结合趋势和风口,看一下自己做这件事的把握有多少,单反但凡重大决定,不要想着在尝试中去找答案,对于小事情这样是可以的,但是对于一些重要决定是没有尝试的机会的,想尽一切办法想把仗打赢的,是最难的,你该做的,是在一开始选择前,这场仗能打赢,再去打。</p></blockquote><p>最后(还是引用stormzhang)一句话告诫自己:<br>永远不要以小概率事件来决策,永远不要把自己当成小概率事件的缔造者。</p><p><img src="https://upload-images.jianshu.io/upload_images/5317394-8459959eaa590f27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="微信公众号:码省理工"></p>]]></content>
<summary type="html">
<h1 id="jstat命令使用"><a href="#jstat命令使用" class="headerlink" title="jstat命令使用"></a>jstat命令使用</h1><h3 id="1-说在前面"><a href="#1-说在前面" class="head
</summary>
<category term="JVM" scheme="http://blog.cuteximi.com/categories/JVM/"/>
<category term="工具" scheme="http://blog.cuteximi.com/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>一个牛逼的coder</title>
<link href="http://blog.cuteximi.com/%E4%B8%80%E4%B8%AA%E7%89%9B%E9%80%BC%E7%9A%84coder/"/>
<id>http://blog.cuteximi.com/一个牛逼的coder/</id>
<published>2018-09-18T12:08:47.000Z</published>
<updated>2018-09-18T12:15:22.681Z</updated>
<content type="html"><![CDATA[<p>大厂offer拿到手软,同样毕业,为什么别人可以拿到很多大厂的offer?大 厂更看重毕业生哪一点?</p><p>阅读文本大概需要 4 分钟。</p><p>今天我给大家分享一个帖子:</p><p>一个有实力的coder应该要知道的领域</p><h2 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h2><p><img src="http://upload-images.jianshu.io/upload_images/5317394-59caa6fb81bd2c15?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image"></p><p><strong>1.算法和数据结构</strong></p><p>数据,链表,二叉树,队列,栈的各种操作(性能,场景)</p><p>二分查找和各种变种的二分查找</p><p>各类排序算法以及时间复杂度分析</p><p>各类算法题(手写)</p><p>理解并可以分子时间和空间复杂度</p><p>动态规划</p><p>红黑树/AVL树,Hash树,Tire树,B树,B+树</p><p>图算法</p><p><strong>2.计算机网络</strong></p><p>OSI七层协议(TCP四层)</p><p>每一层的协议</p><p>URL到页面的过程</p><p>HTTPhttp/https 1.0 1.1 2.0</p><p>get/post以及幂等性</p><p>http协议头相关网络攻击(CSRF,XSS)</p><p>TCP/IP三次握手,四次挥手拥塞控制(过程/阈值)</p><p>流量控制与滑动窗口</p><p>TCP和UDP的比较子网划分(笔试)</p><p>DDOS攻击</p><p>IO/NIO/AIO三者原理,各个语言是怎么实现的;</p><p>Netty</p><p>Linux内核select poll epoll</p><p><strong>3.数据库</strong></p><p>索引(分类以及优化方式,失效条件,底层结构);</p><p>sql语法;</p><p>引擎对比;</p><p>数据库的锁(行锁,表锁,页级索,意向锁,读锁,写锁,悲观锁,乐观锁,以及枷锁的select sql方式);</p><p>隔离界别,依次解决的问题(脏读,不可重复读,幻读);</p><p>事物的ACID;</p><p>B树,B+树优化(explain,慢查询,show profile);</p><p>数据库的范式分库分表,主从复制,读写分离;</p><p>Nosql相关(redis和mencached区别);</p><p>redis相关;</p><p><strong>4.操作系统</strong></p><p>进程通信IPC(几种方式),与线程的区别;</p><p>OS的几种策略(页面置换,进程调度,每个里面算法);</p><p>互斥与死锁相关的;</p><p>Linux常用命令;</p><p>Linux内核相关;</p><p><strong>5.编程语言(java)</strong></p><p>java基础、集合、并发;</p><p>多线程(线程池,SYNC和Lock锁机制,线程通信,volatile、ThreadLocal,Cyclibarrier,Atom包,CountDownLatch,AQS,CAS原理);</p><p>JVM(内存模型,gc垃圾回收,包括分代,GC算法,收集器,类加载和双亲委派机制,内存泄漏和内存溢出);</p><p>IO/NIO相关、反射和代理,异常;</p><p>java8相关的;</p><p>序列化、设计模式(常用的);</p><p>web相关的(servlet, cookie/session, Spring(AOP,IOC,MVC事务,动态代理);</p><p>mybatis.Tomcat,Hibernate等看源码;</p><p><strong>6.分布式架构</strong></p><p>(了解原理就行,如果真的有实践经验更好)</p><p>CAP原理和BASE理论。</p><p>Nosql与KV存储(redis,hbase,mongodb,memcached等)</p><p>服务化理论(包括服务发现、治理等,zookeeper、etcd、springcloud微服务、)</p><p>负载均衡(原理、cdn、一致性hash)</p><p>RPC框架(包括整体的一些框架理论,通信的netty,序列化协议thrift,protobuff等) </p><p>消息队列(原理、kafka,activeMQ,rocketMQ)</p><p>分布式存储系统(GFS、HDFS、fastDFS)、存储模型(skipList、LSM等)</p><p>分布式事务、分布式锁等</p><p><strong>7.脚本语言</strong></p><p>(只是作为横向扩充,一般问到linux也会问问shell脚本)</p><p>python , php ,shell ,golang 。</p><p><strong>8.大数据与数据分析</strong></p><p>hadoop生态圈(hive、hbase、hdfs、zookeeper、storm、kafka) spark体系 ,语言:python、R、scala 搜索引擎与技术</p><p><strong>9.机器学习算法</strong> </p><p>模型和算法很多。不细说了,如果很熟练就去投算法,国内很多公司都算法岗都很稀缺,其他岗可以大概了解下理论。 </p><p><strong>10.其他工具的理论和使用</strong> </p><p>这个更多了,问的多的比如git、docker、maven/gradle、Jenkins等等,自己需要的话选择性地去学。</p><p>说了这么多…推荐几本良心的书籍吧。</p><h2 id="推荐书单"><a href="#推荐书单" class="headerlink" title="推荐书单"></a>推荐书单</h2><p><img src="http://upload-images.jianshu.io/upload_images/5317394-59caa6fb81bd2c15?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image"></p><p>算法与数据结构:</p><p>数据结构(严蔚敏)/大话数据结构 </p><p>剑指Offer/程序员面试金典/编程珠玑/编程之美/牛客网+leetcode</p><p>程序员笔试面试最优解(左程云)</p><p>Java的版本(不是很推荐): 数据结构与算法经典问题解析(Java语言描述)</p><p>图解数据结构(使用Java)</p><hr><p>计算机网络:</p><p>计算机网络(谢希仁)</p><p>TCP/IP 详解</p><p>HTTP权威指南</p><p>图解TCP/IP</p><p>图解HTTP</p><hr><p>数据库:</p><p>数据库主要是多用,书上主要看索引和性能的部分</p><p>高性能MySQL/深入浅出MySQL</p><hr><p>操作系统:</p><p>OS原理:操作系统(课本,黑色的那个)</p><hr><p>Linux:</p><p>Linux私房菜 //鸟哥写的,很全,包括bash部分</p><p>跟阿铭学Linux //主要偏重于命令和操作,比较浅显</p><hr><p>Java:</p><p>Java疯狂讲义/Java编程思想/Java核心技术 卷1</p><p>深入理解Java虚拟机</p><p>并发编程的艺术/多线程编程核心技术</p><p>Effective Java</p><p>Java程序员面试笔试宝典 //何昊的那本,个人感觉是突击知识点的神器 </p><p>Java程序性能优化</p><p>实战Java高并发程序设计</p><hr><p>Java Web:</p><p>Spring实战/轻量级JavaEE 企业应用(红皮,讲SSH的)</p><p>//主要看最后一部分Spring的就可以</p><p>深入JavaWeb技术内幕(阿里 许令波)//这个讲的还是比较深的 SpringBoot实战/深入实践SpringBoot</p><hr><p>设计模式:</p><p>大话设计模式 //通俗易懂</p><p>各类博客的总结</p><hr><p>分布式与大数据:</p><p>分布式服务框架原理与实践</p><p>大型网站技术架构</p><p>Hadoop实战(hadoop体系包括得很全)</p><hr><p>其他:</p><p>Git:</p><p>Git权威指南</p><p>Git官方讲解视频(牛客网有带字幕的)</p><p>Redis: </p><p>Redis实战</p><p>是不是觉得有点多啊?当然,大佬都是一步一步积累的,加油吧!优秀的你,肯定有时间,有耐心,有毅力!</p><p>本文编辑:cuteximi</p><p>参考:网友分享 & 整理</p><p>版式:cuteximi</p><ul><li><ul><li><ul><li>End - - - -</li></ul></li></ul></li></ul><p>如果觉得对你有帮助,请持续关注转发,谢谢各位。</p><p>cuteximi.com</p>]]></content>
<summary type="html">
<p>大厂offer拿到手软,同样毕业,为什么别人可以拿到很多大厂的offer?大 厂更看重毕业生哪一点?</p>
<p>阅读文本大概需要 4 分钟。</p>
<p>今天我给大家分享一个帖子:</p>
<p>一个有实力的coder应该要知道的领域</p>
<h2 id="基础知识
</summary>
<category term="程序员" scheme="http://blog.cuteximi.com/categories/%E7%A8%8B%E5%BA%8F%E5%91%98/"/>
<category term="程序员" scheme="http://blog.cuteximi.com/tags/%E7%A8%8B%E5%BA%8F%E5%91%98/"/>
</entry>
</feed>