SegmentFault codingstudy最新的文章
2018-04-10T23:46:28+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
Tampermonkey的使用
https://segmentfault.com/a/1190000014296585
2018-04-10T23:46:28+08:00
2018-04-10T23:46:28+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p>今天就介绍一款浏览器插件的使用:<code>Tampermonkey</code>,又称为<strong>油猴</strong>, 是一款流行的<strong>用户脚本管理器</strong></p>
<p>基本可是适用与各种浏览器:<code>Chrome,Edge,Saair,Opera,Firefox</code></p>
<hr>
<p><code>Tampermonkey</code> 将在你的用户脚本管理方面提供更多的便利.它提供了诸如便捷脚本安装、自动更新检查、标签中的脚本运行状况速览、内置的编辑器等众多功能,同时<code>Tampermonkey</code>还有可能正常运行原本并不兼容的脚本</p>
<p>你可以在谷歌的应用商店搜索<code>tampermonkey</code>进行安装,也可以用过<code>tampermonkey</code>的<a href="https://link.segmentfault.com/?enc=R8cy6Js5lLR4DPvxeZfQ%2FQ%3D%3D.%2FkIfY%2FyxBo0Bo0nv83YMW6YekwngtXQTjn1WFe7oQlk%3D" rel="nofollow">官网</a>进行安装</p>
<p>安装成功之后,会弹出来一个文档介绍的网页,可以进行阅读了解其中的功能</p>
<p>之后我们可以点击扩展图标,在点击获取新脚本,会弹出一个脚本网站列表,网站中有上万个<strong>脚本</strong>,你可以选择你需要的脚本文件</p>
<p>我们选择一个网站 <a href="https://link.segmentfault.com/?enc=b%2FcGucVz8sRZP5F70toLZw%3D%3D.PY5IZobxRazaFZnA8gyWPBn%2BfCLlbA6IfibeNkIq7Lw%3D" rel="nofollow">https://greasyfork.org/zh-CN</a> 进去之后选择我们需要的脚本进行安装,比如选择<code>VIP视频在线解析</code>,安装之后就可以使用<br><img src="/img/bV79l7?w=2508&h=492" alt="图片描述" title="图片描述"></p>
<p>可以点击扩展图标,进入<code>管理面板</code>关联所有已经安装的用户脚本,这些脚本的源代码都是可见的,可修改的<br><img src="/img/bV79l9?w=2666&h=466" alt="图片描述" title="图片描述"></p>
<p>如果没有找到你需要的用户脚本,你可以点击管理面板中的<strong>➕</strong>自己用<code>JavaScript</code>写一个脚本文件</p>
<p><strong><em>如果你有好用的油猴-用户脚本,可以推荐出来,大家一起来使用</em></strong></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux命令之htpasswd
https://segmentfault.com/a/1190000013926321
2018-03-22T22:08:13+08:00
2018-03-22T22:08:13+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p><code>htpasswd</code>是<code>Apache</code>的<code>Web</code>服务器内置的工具,用于创建和更新储存用户名和用户基本认证的密码文件</p>
<h4>安装</h4>
<ol>
<li>由于该工具是<code>Apache</code>的<code>Web</code>服务器内置的工具,所以直接安装<code>Apache</code>,在对应的<code>bin</code>目录下可以看到该命令的</li>
<li>还可以直接安装<code>httpd-tools</code>这个工具包,比如:<code>yum install httpd-tools</code>,安装成功后就可以直接使用该命令</li>
</ol>
<h4>语法</h4>
<p><code>htpasswd (选项) (参数)</code></p>
<h4>选项</h4>
<ul>
<li>
<code>-c</code>: 创建一个新的密码文件</li>
<li>
<code>-b</code>: 在命令行中一并输入用户名和密码而不是根据提示输入密码</li>
<li>
<code>-D</code>: 删除指定的用户</li>
<li>
<code>-n</code>: 不更新密码文件,只将加密后的用户名密码输出到屏幕上</li>
<li>
<code>-p</code>: 不对密码进行加密,采用明文的方式</li>
<li>
<code>-m</code>: 采用MD5算法对密码进行加密(<strong>默认的加密方式</strong>)</li>
<li>
<code>-d</code>: 采用CRYPT算法对密码进行加密</li>
<li>
<code>-s</code>: 采用SHA算法对密码进行加密</li>
<li>
<code>-B</code>: 采用bcrypt算法对密码进行加密(<strong>非常安全</strong>)</li>
</ul>
<h4>参数</h4>
<ul>
<li>用户名: 要创建或者更新的用户名</li>
<li>密码: 用户的新密码</li>
</ul>
<h4>实例</h4>
<ol>
<li>新建一个密码文件<code>.passwd</code>并添加一个用户,不提示直接输入用户名密码<br><code>htpasswd -bc .passwd jiang wen</code>
</li>
<li>在原有的密码文件<code>.passwd</code>下在添加一个用户<br><code>htpasswd -b .passwd wen jiang</code>
</li>
<li>更新用户的密码:有两种方式<br>第一种,直接添加相同的用户名,就会自动区更新密码:<code>htpasswd -b .passwd wen wen</code><br>第二种,先删除需要更新密码的用户名,在添加用户:<code>htpassdw -D .passwd wen & htpasswd -b .passwd wen wen</code>
</li>
<li>不更新密码文件,只显示加密后的用户名和密码 <br><code>htpasswd -bn jiang jiang</code>
</li>
<li>
<strong>nginx</strong>模块 <a href="https://link.segmentfault.com/?enc=2jBPhrGR6%2FZXQhcFUb0jAg%3D%3D.YgjFZ%2BGSZMBEVx%2B0enCeQ7KPdG8X3aDk6kIWPJ7rTHp3kz5TermPKhaUs6jzN2Xw%2B3e5HWeN0UO9Br5zOF8K8A%3D%3D" rel="nofollow">http_auth_basic_module</a>中的使用,用于生成用户密码文件进行认证</li>
</ol>
<p><a href="https://link.segmentfault.com/?enc=mUWLVvtq4%2BBox5EAP8OyYg%3D%3D.ujFboriFcqpfJnmnwTrFwR%2FIDYDkfQ3sg9XzoJ%2BGKWOmuRkfcLVrKqk77cr5ZMh3OHmPbdmwW3v9fBZB5Cu7vELJLUvQyomDJ%2BPMyJ0BBgVMxU2XqgMxR%2FZ4o%2FZdrp4glY%2F2%2BuSVLDgVYOG93n%2FwRs9ZxLZKJbtAPHAAoGd8%2FjvahY6wSFO9toN84lX3HQ%2Bwx2VLe2Jp55Jm0%2BpOskakee9gBPMh5V0kV0IXgEp%2FbTfVzqAVoXJ9czPD0XX3Sk5a0fPb3meEJxG1HisnpIIXGA%3D%3D" rel="nofollow">原文连接</a></p>
有关Promise.catch方法的理解
https://segmentfault.com/a/1190000013509895
2018-03-04T14:17:19+08:00
2018-03-04T14:17:19+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p>之前写了一篇有关<code>Promise</code>的<code>then</code><a href="https://link.segmentfault.com/?enc=CrH5a%2FLlhryfRR4tnWjtPw%3D%3D.APDfarRtY6BycXOfB%2BDvfF50lp%2BnzdttcIkEmZLDprDCrd%2Bl7bo7vKGrpdF6Wz74ksP%2Bw5mIVxjFgu85oGlWhA%3D%3D" rel="nofollow">方法的文章</a>,现在在讲解一下有关<code>Promise</code>原型上<code>catch</code>的方法</p>
<hr>
<p><code>catch</code>方法是为了处理拒绝的情况或者抛出异常的情况</p>
<h4>语法</h4>
<pre><code class="js">p.catch(onRejected);
p.catch(function(reason){
// 拒绝
});</code></pre>
<h5>参数</h5>
<ul>
<li>
<code>onRejected</code>:当<code>Promise</code> 被拒绝时,被调用的一个<code>Function</code>,该函数拥有一个参数</li>
<li>
<code>reson</code>: 拒绝的原因</li>
</ul>
<h5>返回值</h5>
<p>一个新的<code>Promise</code></p>
<h4>示例代码</h4>
<h5>返回的Promise行为状态</h5>
<pre><code class="js">var p1 = new Promise(function(resolve, reject) {
resolve('Success');
});
p1.then(function(value) {
console.log(value); // "Success!"
throw 'oh, no!';
}).catch(function(e) {
console.log(`e`,e); // "e oh, no!"
//或者
//Promise.resolve();
}).then(function(value){
console.log('after a catch the chain is restored',value);
}, function (err) {
console.log('Not fired due to the catch',err);
});
上面的打印结果为:
Success
e oh, no!
after a catch the chain is restored undefined</code></pre>
<pre><code class="js">var p1 = new Promise(function(resolve, reject) {
resolve('Success');
});
p1.then(function(value) {
console.log(value); // "Success!"
throw 'oh, no!';
}).catch(function(e) {
console.log(`e`,e); // "e oh, no!"
//或者
return Promise.resolve();
}).then(function(value){
console.log('after a catch the chain is restored',value);
}, function (err) {
console.log('Not fired due to the catch',err);
});
上面的打印结果为:
Success
e oh, no!
after a catch the chain is restored undefined</code></pre>
<p>若把上面的代码改为以下这样:</p>
<pre><code class="js">var p1 = new Promise(function(resolve, reject) {
resolve('Success');
});
p1.then(function(value) {
console.log(value); // "Success!"
throw 'oh, no!';
}).catch(function(e) {
console.log(`e`,e); // "e oh, no!"
//或者
return Promise.reject("ssssss");
}).then(function(value){
console.log('after a catch the chain is restored',value);
}, function (err) {
console.log('Not fired due to the catch',err);
});
上面的打印结果为:
Success
e oh, no!
Not fired due to the catch ssssss</code></pre>
<pre><code class="js">var p1 = new Promise(function(resolve, reject) {
resolve('Success');
});
p1.then(function(value) {
console.log(value); // "Success!"
throw 'oh, no!';
}).catch(function(e) {
console.log(`e`,e); // "e oh, no!"
throw "ssssss"
}).then(function(value){
console.log('after a catch the chain is restored',value);
}, function (err) {
console.log('Not fired due to the catch',err);
});
上面的打印结果为:
Success
e oh, no!
Not fired due to the catch ssssss</code></pre>
<p>在上面的代码中可以看出<code>catch</code>返回的<code>Promise</code>状态和<code>then</code>方法中的行为是一致的,具体请参考<a href="https://link.segmentfault.com/?enc=z1jMPRqdWnv0gRVZ8CRLhA%3D%3D.CkPtgYkJvZv%2BZofxWeCKiX4SNWz8me4NubCZp4NN7fXFWk%2Bahaf6KeGGssTCBVUEN4IZQ0Y%2BJPC5qB0aeFcgbg%3D%3D" rel="nofollow">then</a></p>
<p><strong>抛出一个错误或返回一个失败的 <code>Promise</code>,<code>Promise</code> 通过 catch() 返回失败onRejected状态的结果;否则,它将返回成功的<code>onFulfilld</code>状态的数据</strong></p>
<h5>异常捕获的行为</h5>
<pre><code class="js">// 抛出一个错误,大多数时候将调用catch方法
var p1 = new Promise(function(resolve, reject) {
throw 'Uh-oh!';
});
p1.catch(function(e) {
console.log(e); // "Uh-oh!"
});
// 在异步函数中抛出的错误不会被catch捕获到
var p2 = new Promise(function(resolve, reject) {
setTimeout(function() {
throw 'Uncaught Exception!';
}, 1000);
});
p2.catch(function(e) {
console.log(e); // 不会执行
});
// 在resolve()后面抛出的错误会被忽略
var p3 = new Promise(function(resolve, reject) {
resolve();
throw 'Silenced Exception!';
});
p3.catch(function(e) {
console.log(e); // 不会执行
});</code></pre>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
利用CI自动部署hexo博客
https://segmentfault.com/a/1190000013286548
2018-02-13T21:06:39+08:00
2018-02-13T21:06:39+08:00
一步
https://segmentfault.com/u/yibuyou
1
<hr>
<p>每次写完一篇文章,都会手动执行<code>hexo g</code>和<code>hexo d</code>去生成静态网页后在进行部署到<code>Github page上去</code> </p>
<p>而且为了保存文章的源码<code>md</code>文件还需要<code>push</code>到对应的仓库分支上,比较麻烦</p>
<p>都说<code>懒惰</code>推动着新的东西出现,那么能不能只保存原<code>md</code>文件<code>push</code>上去,其他的操作都让它自动去完成呢 ?</p>
<p>答案肯定是可以的,下面就来讲解一下CI具体的实现方法(<strong>这里只讲解如何把travis接入</strong>):</p>
<hr>
<p>首先来介绍利用的工具:</p>
<ul>
<li>
<code>Github Page</code>:是<code>github</code>网站提供的静态网站服务,集体详细的介绍可以查看<a href="https://link.segmentfault.com/?enc=65rMYsF4KTxVl2U1ZTQiHA%3D%3D.v%2Bn%2BP0k6M4790FtZBkt3nFGS0F6xmH7u4E3oqd1%2FbTo%3D" rel="nofollow">官方文档</a>
</li>
<li>
<code>travis</code>: 是在线托管的<code>CI</code>服务,用<code>Travis</code>来进行持续集成,不需要自己搭服务器<a href="https://link.segmentfault.com/?enc=LE%2BsrWVnNZwao5XATR75yQ%3D%3D.O0I%2FJ7l2HrJLNWH58C6Q%2BBOcYKN6f6DxBl6x3GpUvZ0%3D" rel="nofollow">官方网站</a>
</li>
</ul>
<p>接入<code>Travis</code>过程:</p>
<ol>
<li>登录<code>Travis</code>网站用<code>github</code>授权登录</li>
<li>登录后在个人主页选择你需要<code>CI</code>的仓库</li>
<li>点击你选择的<code>hexo</code>博客的仓库进行配置</li>
</ol>
<p>点击左上角红色框的<strong>More options</strong>按钮,选择<code>Settings</code>打开配置页面进行配置<br><img src="/img/bV3UAY?w=2212&h=806" alt="图片描述" title="图片描述"></p>
<p>第一个配置项:<code>Build only if .travis.yml is present</code>代表的意思是:只有在<code>.travis.yml</code>文件中配置的<strong>分支</strong>改变了才构建<br>第二个配置项:<code>Build pushes</code>代表当推送完这个分支后开始构建</p>
<p>到了这一步,我们已经开启了要构建的仓库,但是还有个问题就是,构建完后,我们怎么将生成的文件推送到github上呢? <br>我们只要想<code>github一push</code>,他就自动构建并<code>push</code>静态文件到<code>githubpages</code>,那么下面要解决的就是<code>Travis CI</code>怎么访问<code>github</code>了</p>
<ol><li>在<code>Travis CI</code>配置<code>Github</code>的<code>Access Token</code> 用来访问<code>Github</code>
</li></ol>
<p>首先我们进入<code>github</code>的设置页面,然后点击<code>Developer settings</code>选项进入开发者设置,然后字点击<code>Personal access tokens</code><br><img src="/img/bV3UA3?w=2090&h=479" alt="图片描述" title="图片描述"><br>点击右上角的<code>Generate new token</code>会让你输入密码确定,然后进入一个生成<code>token</code>的页面<br><img src="/img/bV3UA4?w=1562&h=2448" alt="图片描述" title="图片描述"></p>
<p>输入<code>token</code>的描述,选择这个<code>token</code>权限,然后然后点击生成就可以了,然后复制保存下来,下次在进来就看不到了<br><img src="/img/bV3UA5?w=1576&h=418" alt="图片描述" title="图片描述"></p>
<p>左后还在 <code>Travis</code> 仓库配置界面<code>setting</code>里面 环境变量<code>Environment Variables</code>进行配置<code>token</code>方便在构建文件中引用:如下图<br><img src="/img/bV3UA8?w=2026&h=389" alt="图片描述" title="图片描述"></p>
<ol><li>在博客的源码文件分支下添加<code>.travis,yml</code>配置文件,决定怎么执行构建任务,下面是<code>.travis,yml</code>的内容:</li></ol>
<pre><code class="yml">language: node_js
node_js: stable
install:
- npm install
script:
- hexo g
after_script:
- cd ./public
- git init
- git config user.name "jjeejj"
- git config user.email "wenjunjiang1993@163.com"
- git add .
- git commit -m "Update docs"
- git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:master
branches:
only:
- hexo
env:
global:
- GH_REF: github.com/jjeejj/jjeejj.github.io.git</code></pre>
<p>这其中的<code>config</code>改成对应你自己的</p>
<p>到此为止,就已经配置完成了,下面就让我们推送一篇文章测试一下的<br>现在我本地源码目录有新加的一篇文章:<br><img src="/img/bV3UBa?w=630&h=558" alt="图片描述" title="图片描述"></p>
<p>然后进行<code>push</code>提交(此刻应该等待编译成功了)</p>
<p>然后稍等一会就可以在博客网站上看到刚才的那篇文章了<br><img src="/img/bV3UBc?w=1586&h=834" alt="图片描述" title="图片描述"></p>
<p>你也可以在<code>Travis</code>的博客仓库的控制台看到编译的日志<br><img src="/img/bV3UBf?w=2131&h=1112" alt="图片描述" title="图片描述"></p>
<blockquote>这里备注一下,由于平常我们写文章都是使用<code>heox new draft</code>新建的草稿文件,是放在<code>_drafts</code>文件夹中的,写完之后需要手动<code>hexo publish</code>一下,移到<code>_psots</code>文件夹中的,使用构建时候,还是需要这样做的</blockquote>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
JavaScript中Object基础内部方法
https://segmentfault.com/a/1190000013125903
2018-02-04T14:27:39+08:00
2018-02-04T14:27:39+08:00
一步
https://segmentfault.com/u/yibuyou
1
<hr>
<p>对于<code>JavaScript</code>对象的操作基本上都会调用底层的对象内部方法,我们可以看出在<a href="https://link.segmentfault.com/?enc=t45wmzfaaGuDFtTRT%2Bxt0A%3D%3D.mat8Nz7CCMX8g2bko9udfcNuufRcIYurH4IJhNUP7lG7ubu0NiPfXVxQ4Ou4P8oiRZL%2Bmmn%2FsqKR1zQvrGa2eKVb06cpY%2BAab4%2F%2Bxw7PJRE%3D" rel="nofollow"><code>ES6</code></a>标准中定了<strong>14</strong>种内部方法.</p>
<p>双 <strong>[[]]</strong> 代表内部方法,在一般的<code>JS</code>代码中不可见,你可以调用、删除或覆写(<code>通过Proxy对象</code>)普通方法,但是无法操作内部方法.</p>
<hr>
<p>下面通过一个思维导图来展示这<strong>14</strong>种基础的内部方法</p>
<p><img src="/img/bV3eOa?w=2337&h=2388" alt="图片描述" title="图片描述"></p>
<blockquote>若看不清楚,可以在微信公众号后台发送 <strong>内部方法</strong> 获取高清图片</blockquote>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux下各文件夹的作用
https://segmentfault.com/a/1190000013023540
2018-01-28T18:58:08+08:00
2018-01-28T18:58:08+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p>接触<code>linux</code>的新手看到<code>linux</code>有好多系统生成的文件夹,但是不知道每个文件夹有什么作用</p>
<p>下面来简单讲解一下<code>linux</code>下各文件夹的结构及用途介</p>
<hr>
<p><strong>讲解的环境是:阿里云的Ubuntu 16.04.3</strong></p>
<p>首先放一张根目录下的文件夹图<br><img src="/img/bV2OaK?w=1670&h=102" alt="图片描述" title="图片描述"></p>
<h5>boot</h5>
<p>该文件夹存放引导加载器(<code>bootstrap loader</code>)使用的文件,一般我们不会使用这里面的文件<br><img src="/img/bV2OaN?w=1602&h=270" alt="图片描述" title="图片描述"></p>
<h5>dev</h5>
<p>该文件夹存放的是设备文件即设备驱动程序,用户可以通过这些文件访问外部设备.<br><img src="/img/bV2OaR?w=1680&h=542" alt="图片描述" title="图片描述"></p>
<p><code>/dev/null</code>称为空设备,也称为位桶(bit bucket)或者黑洞(black hole),你可以向它输入任何数据,但任何写入它的数据都会被抛弃。通常用于处理不需要的输出流,<strong>这些操作通常由重定向完成</strong></p>
<p><code>/dev/shm/</code>这个目录是<code>linux</code>下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上。其大小是非固定的,即不是预先分配好的内存来存储的。(<code>shm == shared memory</code>).<br>默认最大为内存的一半大小,使用<code>df -h</code>命令可以看到.但它并不会真正的占用这块内存,如果<code>/dev/shm/</code>下没有任何文件,它占用的内存实际上就是0字节<br>我们可以看到<code>/dev/shm</code>的文件系统为<code>tmpfs</code>,即为临时文件系统</p>
<p><img src="/img/bV2Oa0?w=700&h=156" alt="图片描述" title="图片描述"></p>
<h5>home</h5>
<p>该文件夹包含用户家目录,即系统上的所有实际数据存放的地方,你添加的用户 都会在该目录下创建一个和用户们相同的目录,为该用户的家目录</p>
<h5>root</h5>
<p>超级管理员的家目录</p>
<h5>bin</h5>
<p><code>/bin</code>目录包含了引导启动所需的命令和普通用户可能用的命令.这些命令都是二进制文件的可执行程序(bin是binary的简称),多是系统中重要的系统文件<br><img src="/img/bV2Oba?w=1882&h=596" alt="图片描述" title="图片描述"></p>
<h5>sbin</h5>
<p><code>/sbin</code>目录类似<code>/bin</code> ,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用</p>
<h5>etc</h5>
<p><code>/etc</code>目录存放着各种系统配置文件,其中包括了用户信息文件<code>/etc/passwd</code>, 系统初始化文件<code>/etc/rc</code>等。linux正是靠这些文件才得以正常地运行</p>
<h5>lib</h5>
<p><code>/lib</code>目录是根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文件,这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副本,故可以使得可执行文件变得更小,节省空间.</p>
<h5>tmp</h5>
<p>临时目录,对于某些程序来说,有些文件被用了一次两次之后,就不会再被用到,像这样的文件就放在这里.有些linux系统会定期自动对这个目录进行清理,因此,千万不要把重要的数据放在这里</p>
<h5>opt</h5>
<p>这个目录主要存那些可选的程序.想尝试最新的<code>firefox</code>测试版吗?那就装到<code>/opt</code>目录下吧,这样,当你尝试完,想删掉<code>firefox</code>的时候,你就可以直接删除它,而不影响系统其他任何设置.安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面</p>
<p>举例:刚才装的测试版<code>firefox</code>,就可以装到<code>/opt/firefox_beta</code>目录下,<code>/opt/firefox_beta</code>目录下面就包含了运行<code>firefox</code>所需要的所有文件、库、数据等等.要删除<code>firefox</code>的时候,你只需删除<code>/opt/firefox_beta</code>目录即可,非常简单</p>
<h5>usr</h5>
<p><code>/usr</code>是个很重要的目录,因为所有程序安装在这里.</p>
<p><code>/usr/local</code>:本地安装的程序和其他东西,因为这样可以在升级新版系 统或新发行版时无须重新安装全部程序<br><code>/usr/bin</code>:集中了几乎所有用户命令,是系统的软件库.另有些命令在<code>/bin</code>或<code>/usr/local/bin</code>中<br><code>/usr/sbin</code>:包括了根文件系统不必要的系统管理命令<br><code>/usr/src</code>:linux内核的源代码</p>
<h5>var</h5>
<p><code>/var</code>包含系统一般运行时要改变的数据,通常这些数据所在的目录的大小是要经常变化或扩充的</p>
<p><code>/var/lib</code>:存放系统正常运行时要改变的文件<br><code>/var/local</code>:存放<code>/usr/local</code>中安装的程序的可变数据<br><code>/var/log</code>:各种程序的日志(log)文件,这里的文件经常不确定地增长,应该定期清除。<br><code>/var/tmp</code>:比<code>/tmp</code>允许更大的或需要存在较长时间的临时文件</p>
<h5>proc</h5>
<p><code>/proc</code>文件系统是一个伪的文件系统,就是说它是一个实际上不存在的目录,因而这是一个非常特殊的目录.它并不存在于某个磁盘上,而是由核心在内存中产生.这个目录用于提供关于系统的信息</p>
<p><code>/proc/x</code>:关于进程<code>x</code>的信息目录,这<code>x</code>是这一进程的标识号.每个进程在 <code>/proc</code>下有一个名为自己进程号的目录<br><code>/proc/cpuinfo</code>:存放处理器(cpu)的信息,如cpu的类型、制造商、 型号和性能等<br><code>/proc/filesystems</code>:核心配置的文件系统信息<br><code>/proc/uptime</code>:系统启动的时间长度<br><code>/proc/version</code>:核心版本</p>
<h5>lost+found</h5>
<p>这个目录平时是空的,系统非正常关机而留下“无家可归”的文件就在这里</p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
内穿穿透工具lanproxy的配置使用
https://segmentfault.com/a/1190000012921882
2018-01-21T12:55:24+08:00
2018-01-21T12:55:24+08:00
一步
https://segmentfault.com/u/yibuyou
0
<p>做微信开发或者把内网服务穿透出去,都会需要一个公网的地址</p>
<p>经常使用的内网穿透工具有:<strong>花生壳</strong>,<strong>ngrok</strong>,<strong>魔法隧道</strong>等,但是这些域名都是第三方随机的,自定义域名的都是收费。</p>
<p>本来在<strong>window</strong>是使用的<strong>n2n</strong>内网穿透服务的,但是换了<code>Mac</code>之后没有找到<code>Mac</code>端的客户端。</p>
<p>所以本文讲解一下怎么用<strong>lanproxy</strong>搭建一个内网穿透的服务</p>
<hr>
<h4>搭建环境</h4>
<ul>
<li>一台公网的服务器(本文使用的是<code>Ubuntu 16.04.3 LTS</code>),运行<strong>lanproxy</strong>服务端</li>
<li>服务器<code>JDK</code>的环境(本文使用的<code>openjdk 1.8.0_151</code>)</li>
<li>客户端机器,运行<strong>lanproxy</strong>客户端,也需要<code>java</code>的环境需要安装<code>jdk</code>和<code>maven</code>
</li>
</ul>
<h4>搭建过程</h4>
<h5>获取 lanproxy 的源码 并编译</h5>
<ol>
<li>去<a href="https://link.segmentfault.com/?enc=%2FlPXq2HquKA1%2F05MJf%2F%2FzA%3D%3D.TemzsADVoeoxIB6kyPZs214s3g51m%2F903KYS3ele1LfuQoowRaSK%2Fp8eOPgoP0sv" rel="nofollow"><code>lanproxy</code></a>的<code>github</code>地址去获取源码到本地<br><code>git clone git@github.com:ffay/lanproxy.git</code>
</li>
<li>进入项目目录下 执行<code>mvn package</code>进行大包编译,打包编译的文件在<code>distribution</code>目录下,包括<code>client</code>和<code>server</code>
</li>
</ol>
<p><img src="/img/bV2nJw?w=832&h=600" alt="图片描述" title="图片描述"></p>
<h5>配置并启动</h5>
<h6>server端</h6>
<p>在<code>proxy-server-0.1</code>文件夹小的<code>conf</code>是<code>server</code>端的配置文件</p>
<pre><code>server.bind=0.0.0.0 # 服务地址
server.port=4900 # 服务端口
# ssl 配置可以默认
server.ssl.enable=true
server.ssl.bind=0.0.0.0
server.ssl.port=4993
server.ssl.jksPath=test.jks
server.ssl.keyStorePassword=123456
server.ssl.keyManagerPassword=123456
server.ssl.needsClientAuth=false
config.server.bind=0.0.0.0 # 服务页面管理访问地址
config.server.port=8090 # 服务页面管理访问端口
config.admin.username=admin # 服务页面管理访问用户名
config.admin.password=admin # 服务页面管理访问用密码</code></pre>
<p>配置完成之后可以上该文件加到传服务器上,执行下面的命令<br><code>scp -r proxy-server-0.1 user@premote_ip:remote_dolder</code></p>
<p>在服务端执行<code>proxy-server-0.1/bin</code>文件夹下的<code>startuo.sh</code>,服务端启动</p>
<p>在浏览器上访问上面的你的 服务器<code>ip + prot</code>就可以看到管理页面了<br><img src="/img/bV2nJx?w=1028&h=540" alt="图片描述" title="图片描述"></p>
<p>输入上面你配置的用户名密码登录进去,进去配置<br><img src="/img/bV2nJy?w=1480&h=710" alt="图片描述" title="图片描述"></p>
<p>首先添加一个客户端:<br><img src="/img/bV2nJz?w=1368&h=720" alt="图片描述" title="图片描述"></p>
<p>添加成功后在客户端管理那可以看到刚刚添加的客户端:<br><img src="/img/bV2nJA?w=2619&h=804" alt="图片描述" title="图片描述"></p>
<p>然后在对刚刚添加成功的客户端进行配置:<br><img src="/img/bV2nJB?w=1628&h=766" alt="图片描述" title="图片描述"></p>
<p>代理名称随便输入,一般都用本地代理服务的名称方便产看</p>
<blockquote>一个客户端代理可以配置多个本地服务端口</blockquote>
<h6>client端</h6>
<p>在<code>proxy-client-0.1</code>文件夹小的<code>conf</code>是<code>clent</code>端的配置文件</p>
<pre><code>client.key=caaab8dc002c4e0f8b31ecb683d8900f # 这个key就是服务端中客户端管理的客户端秘钥
ssl.enable=false
ssl.jksPath=test.jks
ssl.keyStorePassword=123456
server.host= # 这个添加服务端地址,可以是配置的域名也可以是公网Ip
#default ssl port is 4993
server.port=4900 # 服务端端口</code></pre>
<p>这个客户端 是<code>java</code>版本的所以需要<code>jdk</code>环境,配置完成后在<code>window</code>执行<code>bin目录下的 startup.bat</code>,在<code>linux(mac</code>)环境中运行bin目录下的 <code>startup.sh</code></p>
<h4>nginx 的配置</h4>
<p>如果你微信开发只能<code>80</code>端口,但是你只有一个<code>80</code>端口,而且有很多其他的服务,这个就需要配置<code>nginx</code>进行端口转发</p>
<p>首先你要有一个域名,配置一条<code>A</code>记录指向的服务比如这个代理服务你可以配置:<br><code>*.proxy.yourdomain</code> ---- > <code>你的公网ip地址</code></p>
<p>在<code>nginx</code>上进行配置,主要是根据 <code>server_name</code>进行转发</p>
<p>假如你本地的微信服务是<code>8080</code>端口,上面客户端配置添加的公网端口是<code>5000</code>那你可以这样配置,把你本地微信的服务穿透出去为:<br><code>wechat.proxy.yourdomain</code>(上面添加的域名<code>A</code>记录和这个有关系的,不然解析不到对应的服务器地址)那么<code>nginx</code>的配置为</p>
<pre><code>{
server {
listen 80;
server_name wechat.proxy.yourdomain;
location / {
proxy_pass http://127.0.0.1:5000/;
}
}
}</code></pre>
<p>配置完成后重启 <code>nginx -s reload</code> ,你就可以可以使用你配置<strong>代理域名服务</strong>访问你本地的服务了</p>
<p><strong>以后如果再有本地的服务需要穿透出去的,可以按照相同的方法进行配置</strong><br>如果在同一个机器上,就可以直接在服务配置页面下选择对应的客户端添加一个端口转发的配置就可以了<br>若不再一个机器上,就新建一个客户端在进行配置</p>
<p><img src="/img/bVYpjx?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
homebrew的tap功能详解
https://segmentfault.com/a/1190000012826983
2018-01-13T15:11:32+08:00
2018-01-13T15:11:32+08:00
一步
https://segmentfault.com/u/yibuyou
17
<hr>
<p><code>Homebrew</code>是使用<code>ruby</code>开发的<code>Mac</code>的软件包管理器.<br>这里就说明一下有关<code>Taps(third-party-repositories)</code>的知识</p>
<hr>
<p><code>brew tap</code>可以为<code>brew</code>的软件的 跟踪,更新,安装添加更多的的<code>tap formulae</code></p>
<p>如果你在核心仓库没有找到你需要的软件,那么你就需要安装第三方的仓库去安装你需要的软件</p>
<p><code>tap</code>命令的仓库源默认来至于<code>Github</code>,但是这个命令也不限制于这一个地方</p>
<h4>brew tap 命令</h4>
<ul><li>
<code>brew tap</code> 没有参数会自动更新已经存在的<code>tap</code>并列出当前已经<code>tapped</code>的仓库</li></ul>
<p><img src="/img/bV1Y16?w=1472&h=128" alt="图片描述" title="图片描述"><br><img src="/img/bV1Y19?w=384&h=184" alt="图片描述" title="图片描述"></p>
<ul><li>
<code>brew tap <user>/<repo></code> 在本地对这个 <code>https://github.com/user/repo</code> 仓库上做了一个浅度的克隆,完成之后 <code>brew</code>就可以在这个仓库包含的<code>formulae</code>上工作,好比就在<code>Homebrew</code>规范的仓库,你可使用<code>brew install</code> 或者<code>brew uninstall </code>安装或者卸载这个仓库上的软件。当你执行<code>brew update</code>这个命令时,<code>tap</code> 和 <code>formulae</code> 就会自定更新</li></ul>
<p><img src="/img/bV1Y16?w=1472&h=128" alt="图片描述" title="图片描述"></p>
<ul>
<li>
<code>brew tap <user>/<repo> URL</code> 在本地对这个 <code>URL</code> 仓库上做了一个浅度的克隆,和上面一个参数命令是不一样的,<code>URL</code>没有默认关联到<code>Github</code>,这个<code>URL</code>没有要求必须是<code>HTTP</code>协议,任何位置和任何协议而且<strong>Git</strong>也是能很好的处理的</li>
<li>
<code>brew untap <user>/<repo> [<user>/<repo> <user>/<repo> ...]</code> 移除已经安装的<code>tap</code>.这个仓库被删除,<code>brew</code>就不在可用在这个仓库的<code>formulae</code>.可以同时删除几个仓库</li>
</ul>
<h4>仓库命名的规范</h4>
<ul>
<li>在 <code>Github</code>上,你的仓库名称必须是<code>homebrew-something</code>,为了使用一个参数的<code>brew tap</code>命令,<code>homebrew-</code>这个前缀不是可选的,是必须的。<br>对于两个参数的<code>brew tap</code>命令没有这个限制,但是必须给出明确的全部的<code>URL</code>地址</li>
<li>当你在命令行使用<code>brew tap</code>时,你可以省略<code>homebrew-</code>这个前缀的</li>
</ul>
<p>也就是说:<code>brew tap username/foobar</code>是作为长版本<code>brew tap username/homebrew-foobar</code>使用的一个简写.</p>
<p><strong><code>brew</code>可以自己添加<code>homebrew-</code>前缀的在需要的时候</strong></p>
<h4>重复名称安装包的处理</h4>
<p>如果你想安装的一个安装包在你<code>tap</code>的一个仓库上,但是同时还出现在了<code>homebrew/core</code>上,这就意味着你必须明确指出<code>tap</code>的名称去安装它,否则就会默认安装<code>homebrew/core</code>上的包.</p>
<p>如果你想要是你安装的<code>tap</code>的优先顺序高于<code>homebrew/core</code>这个默认的仓库,你可以使用<code>brew tap-pin username/repo</code>去<strong>pin</strong>这个仓库.你可以使用<code>brew-tap-unpin username/repo</code> 恢复这个<code>pin</code></p>
<p>当你使用<code>brew install foo</code>这个命令时,<code>brew</code> 将按照下面的顺序去查找哪个<code>formula(tap)</code>将被使用:</p>
<ol>
<li>pinned taps</li>
<li>core formulae</li>
<li>other taps</li>
</ol>
<p>举个例子:</p>
<p>你想安装<code>vim</code>安装包,而且没有<code>pinned</code>某个仓库:</p>
<pre><code>brew install vim # installs from homebrew/core
brew install username/repo/vim # installs from your custom repo</code></pre>
<p>你想安装<code>vim</code>安装包,而且有<code>pinned</code>的仓库:</p>
<pre><code>brew install vim # installs from your custom repo
brew install homebrew/core/vim # installs from homebrew/core</code></pre>
<h4>可以关注的Taps</h4>
<ul>
<li>
<a href="https://link.segmentfault.com/?enc=8GZNHSvwNBOd588c9zpPbg%3D%3D.hfrOVe2xVauaNpJp%2BoMLxpGZ6KkpEXO%2Fn10aeecLsgXAh2L0AhinXU5%2Bm0khaJ5N" rel="nofollow"><code>homebrew/php</code></a>:和<code>php</code>关联的<code>formulae</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=wPkScXQ1xmiA8kLgYJIBBQ%3D%3D.buhpERxsVUuZQbrcSSiCEqK99olfA75tpd2VYT6xaNnyjPSkuGB8g200MpQDqDTh" rel="nofollow"><code>denji/nginx</code></a>: <code>nginx modules</code> 的<code>tap</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=0K1qACDJWXgxC3hOhHc2pw%3D%3D.JIvzW04jKhNkJsrQF8C7Ptl41aa8WjrWUA%2BzT5uFKWqsfsoSX8UXXOGjs21y3fGBFe7pzM8kZoOROgxXcq0zYw%3D%3D" rel="nofollow"><code>InstantClientTap/instantclient</code></a>: <code>Oracle</code>客户端实例的<code>tap</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=dSUs8s%2BG2roT2Wrkk2sf7g%3D%3D.I%2BYVYyclARisPlbMPx%2Fi23FRtJDldemMPL0nqGfZQGPQss%2Ba7Kv1VCRSLCIVMGDb" rel="nofollow"><code>petere/postgresql</code></a>: 允许同时安装多个<code>PostgreSQL</code>版本的<code>tap</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=jyYNpo%2FRnblIObPlpFnQMw%3D%3D.%2BCv9qJNGLeMqUAbCvXEpzKyRvePgQaiF%2B1sQffjBFQrM%2FuoQvT8csWHJIVCi7q3n" rel="nofollow"><code>dunn/emacs</code></a>: <code>Emacs package</code>的<code>tap</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=GCCFihR8XDZa5M%2BXwiMNKA%3D%3D.TXuQpFvIWO4JtMdDp7AHWByw5WBt5%2BwgWqOUg83aHTtiskE41S%2FSn5sDCS0SPqc8" rel="nofollow"><code>sidaf/pentest</code></a>: 渗透测试工具的<code>tap</code>
</li>
<li>
<a href="https://link.segmentfault.com/?enc=gI1xft7%2F%2BA6yOl3rPN0qrQ%3D%3D.ohvRpbkK73rm36qlQk9GHkdnLxEaFf0HmZPK975UzcoIH%2FwzbvNg3YSBSkTQqhTa" rel="nofollow"><code>osrf/simulation</code></a>: 机器仿真的<code>tap</code>
</li>
</ul>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
mysql字段时间类型的比较
https://segmentfault.com/a/1190000012727436
2018-01-06T14:39:42+08:00
2018-01-06T14:39:42+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p><code>mysql</code>字段的时间类型分为5种:<code>DATE</code>,<code>DATETIME</code>,<code>TIME</code>,<code>TIMESTAMP</code>,<code>YEAR</code>;</p>
<p>下面就分别介绍这几种时间类型的区别</p>
<hr>
<table>
<thead><tr>
<th align="center">类型</th>
<th align="center">字节大小</th>
<th align="center">范围</th>
<th align="center">格式</th>
<th align="center">零值</th>
<th align="center">用途</th>
</tr></thead>
<tbody>
<tr>
<td align="center">DATE</td>
<td align="center">3</td>
<td align="center">1000-01-01/9999-12-32</td>
<td align="center">YYYY-MM-DD</td>
<td align="center">0000-00-00</td>
<td align="center">日期值</td>
</tr>
<tr>
<td align="center">DATETIME</td>
<td align="center">8</td>
<td align="center">1000-01-01 00:00:00/9999-12-32 23:59:59</td>
<td align="center">YYYY-MM-DD hh:mm:ss</td>
<td align="center">0000-00-00 00:00:00</td>
<td align="center">混合日期和时间值</td>
</tr>
<tr>
<td align="center">TIME</td>
<td align="center">3</td>
<td align="center">-838:59:59/838:59:59</td>
<td align="center">hh:mm:ss</td>
<td align="center">00:00:00</td>
<td align="center">时间值</td>
</tr>
<tr>
<td align="center">TIMESTAMP</td>
<td align="center">4</td>
<td align="center">1970-01-01 00:00:01/2038-01-19 03:14:07</td>
<td align="center">YYYY:MM:DD: hh:mm:ss</td>
<td align="center">0000-00-00 00:00:00</td>
<td align="center">混合日期和时间值,时间戳</td>
</tr>
<tr>
<td align="center">YEAR</td>
<td align="center">1</td>
<td align="center">1901/2155</td>
<td align="center">YYYY</td>
<td align="center">0000</td>
<td align="center">年份值</td>
</tr>
</tbody>
</table>
<p><strong>每个时间类型都有一个有效范围和一个零值,当指定的类型的值超过有效范围时,就会使用零值</strong></p>
<h4>YEAR</h4>
<p>该类型表示<strong>年</strong>,格式为<code>YYYY</code></p>
<p>有三种表示方法</p>
<ol>
<li>直接使用四位数字或字符串,范围是<strong>1901-2155</strong>,输入的格式为'YYYY'或YYYY,如输入‘2011’或2011就回直接保存为2011,若超过范围就会表示为0000</li>
<li>使用两位的字符串表示,如果插入为'00'-'69'则表示为2000-2069,若插入'70-99'则表示为1970-1999.如输入'22'保存为2222,输入88保存为1988.'0'和'00'的效果一样</li>
<li>使用两位数字,如果插入为00-69则表示为2000-2069,若插入70-99则表示为1970-1999.如输入22保存为2222,输入88保存为1988.如果是0则表示为0000.注意该处和字符串的情况不一样</li>
</ol>
<h4>TIME</h4>
<p>该类型表示<strong>时:分:秒</strong>,尽管时间范围为<strong>0~23</strong>,但是为了表示某些特殊的时间,<strong>mysql</strong>将小时的范围扩大了,并且支持负值。</p>
<p>对于<code>TIME</code>类型复制,标准的格式为<code>HH:MM:SS</code>,但不一定要这个格式</p>
<p>如果插入的格式为<code>D HH:MM:SS</code>则类似插入了<code>D*24+HH:MM:SS</code>,比如插入<code>2 23:12:12</code>,相当于<code>71:12:12</code></p>
<p>如果插入的格式为<code>HHMM</code>或则<code>SS</code>,那么其他位置就赋零值.比如<code>30</code> 相当于<code>00:00:30</code>,比如<code>11:30</code> 相当于<code>11:30:00</code></p>
<p>在<code>mysql</code>中,系统可以自动识别<code>HHMMSS</code>转化为标准格式.我们可以通过<code>CURRENT_TIME()</code>获取当前的<code>TIME</code>值</p>
<h4>DATE</h4>
<p>该类型表示<strong>年-月-日</strong>,标准格式为<code>YYYY-MM-DD</code>,但是<code>mysql</code>中还支持一些不严谨的格式:比如<code>YYYY/MM/DD</code>等其他的符号来分割</p>
<p>在插入数据的数据的也可以使用<code>YY-MM-DD</code> 年份的转换和上面的<code>YEAR</code>类型的规则一样的</p>
<p>可以使用<code>CURRENT_DATE()</code> 函数获取当前的<code>DATE</code>值</p>
<h4>DATETIME</h4>
<p>该类型表示<strong>YYYY-MM-DD hh:mm:ss</strong>,可以看出<code>DATE</code>和<code>TIME</code>类型的结合体.所以赋值的规则时和上面<code>DATE</code>和<code>TIME</code>的时一样的</p>
<h4>TIMESTAMP</h4>
<p>该类型表示为<strong>YYYY-MM DD hh:mm:ss</strong>,取值范围比<code>DATETIME</code>小,因此输入时一定要注意输入值的范围,超过范围会当作零值处理。<br>哈哈,到<code>2038</code>年后就别用这个类型了</p>
<blockquote>这只是一个简单的区分说明,具体<code>mysql</code>时间类型的说明 请参考 <a href="https://link.segmentfault.com/?enc=BjRCdKyPVzY4oggsWEgNNA%3D%3D.vVxFDdZGuVgkdmelXntgAQ5HtiIML4eT8LQWN26VvbPJnHf%2F2hv2hnu%2F%2Bc9EQ5gZzO%2FG8jmp39k%2FEmTpqMsB7HxcAq9lo6m7oIWYTs5dx34%3D" rel="nofollow">官方文档</a>
</blockquote>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
为hexo博客添加RSS订阅功能
https://segmentfault.com/a/1190000012647294
2017-12-30T10:45:43+08:00
2017-12-30T10:45:43+08:00
一步
https://segmentfault.com/u/yibuyou
7
<hr>
<p><code>RSS(Really Simple Syndication)</code> 简易信息聚合,在互联网上被广泛采用的内容包装和投递协.</p>
<p>是一种描述同步网站内容的格式,使用<code>xml</code>格式. 当网站内容更新时,可以通过订阅<code>RSS</code>源在<code>RSS</code>阅读器上获取更新的信息</p>
<p>大多数内容提供的网站都会提供<code>RSS</code>订阅的功能,方便用户去获取最新的内容.</p>
<p>本篇文章主要介绍怎么给自己的<code>hexo</code>博客添加<code>RSS</code>源</p>
<hr>
<p>在<code>hexojs</code>用户下的仓库中发现两个<code>RSS</code>功能的<code>npm</code>包</p>
<ol>
<li><a href="https://link.segmentfault.com/?enc=w19ycEF5%2Fxiopkib%2Bojk7w%3D%3D.2IMwdSDHI51VPMhWVhkJQRNT7MkjzApAE9zUtmooyExqnulXN4rwJhxN%2BdfWOKUy" rel="nofollow">hexo-migrator-rss</a></li>
<li><a href="https://link.segmentfault.com/?enc=3AGtYil%2BHTc5L6pNS2hAFA%3D%3D.xaQXy%2BjybO6LwGHc4jxmUwroLQLs8OlOHeziY8eCKcASziUavJgDbi3%2FWDAUhuy8" rel="nofollow">hexo-generator-feed</a></li>
</ol>
<p>不过第一个包是从 <code>RSS</code> 迁移所有文章到<code>source/_posts</code>文件夹中的,第二个才是生成<code>RSS</code>文件的包.</p>
<p>下面就介绍一下<strong>hexo-generator-feed</strong>的使用</p>
<h5>hexo-generator-feed</h5>
<p>首选先安装这个包:</p>
<p><code>npm install hexo-generator-feed</code></p>
<p>然后在在<code>_config.yml</code>文件中配置该插件</p>
<pre><code class="yml">feed:
type: atom
path: atom.xml
limit: 20
hub:
content:
content_limit:
content_limit_delim: ' '</code></pre>
<p>参数的含义:</p>
<ul>
<li>
<code>type</code>: <code>RSS</code>的类型(<code>atom/rss2</code>)</li>
<li>
<code>path</code>: 文件路径,默认是<code>atom.xml/rss2.xml</code>
</li>
<li>
<code>limit</code>: 展示文章的数量,使用<strong>0</strong>或则<strong>false</strong>代表展示全部</li>
<li>
<code>hub</code>:</li>
<li>
<code>content</code>: 在<code>RSS</code>文件中是否包含内容 ,有3个值 <code>true/false</code>默认不填为<code>false</code>
</li>
<li>
<code>content_limit</code>: 指定内容的长度作为摘要,仅仅在上面<code>content</code>设置为<code>false</code>和<code>没有自定义的描述出现</code>
</li>
<li>
<code>content_limit_delim</code>: 上面截取描述的分隔符,截取内容是以指定的这个分隔符作为截取结束的标志.在达到规定的内容长度之前最后出现的这个分隔符之前的内容,,防止从中间截断.</li>
</ul>
<blockquote>此外还有一种方法,就是在<code>Next</code>主题的<code>_config.yml</code>文件中有个<code>rss</code>的配置,直接设置为<code>true</code>就可以了<br><img src="/img/bV1eiC?w=1074&h=200" alt="图片描述" title="图片描述">
</blockquote>
<p>配置好之后运行<code>hexo g</code>就可以找到你博客的<code>pubilc</code> 文件夹下发现<code>atom.xml</code>文件了</p>
<p><img src="/img/bV1eiH?w=444&h=706" alt="图片描述" title="图片描述"></p>
<p>然后运行<code>hexo</code>服务就可以在个人站点处看到<code>RSS</code>的订阅图标了,点击这个图标就可以出现<code>RSS</code>订阅的地址,就可以添加到你的<code>RSS</code>阅读器方便查看博客的最新文章<br><img src="/img/bV1eiJ?w=634&h=794" alt="图片描述" title="图片描述"></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux命令之ln
https://segmentfault.com/a/1190000012562335
2017-12-24T20:42:50+08:00
2017-12-24T20:42:50+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p><code>linux</code>命令之 <strong>ln</strong></p>
<hr>
<p><code>ln</code>命令的功能是为某一个文件在另一个位置建立一个同步的链接.链接类型分为硬链接和符号链接(软链接),默认是硬链接,如果要创建符号链接就必须使用<strong>-s</strong>选项</p>
<p><strong>符号链接</strong>文件是一个独立的文件,但是它的许多属性依赖于源文件,所以给你符号链接文件设置权限是没有意义的</p>
<p>当我们在不同的目录用到相同的文件时,不需要在每一个目录放置一个文件,我们只需要在一个固定的目录放上该文件,然后在其他目录用<strong>ln</strong>命令创建链接就可以了</p>
<h4>语法</h4>
<p><code>ln [选项] 参数</code></p>
<h4>选项</h4>
<ul>
<li>-s 创建符号链接(软链接)</li>
<li>-f,--force 强制建立文件或者目录的链接,不论文件或目录是否存在</li>
<li>-v,--verbose 显示命令的处理过程</li>
</ul>
<blockquote>常用的就这几个,具体的可以查看帮助 <code>ln --help</code>或者 <code>man ln</code>
</blockquote>
<h4>参数</h4>
<ul>
<li>源文件:指定链接的的源文件,如果使用<strong>-s</strong>创建软链接,则源文件可以是目录或文件;创建硬链接的时,则源文件参数只能是文件</li>
<li>目标文件:指定源文件链接的目标文件</li>
</ul>
<h4>实例</h4>
<ol>
<li>将在<code>/usr/python/bin/python3</code> 执行文件软链接到 <code>/usr/bin/python3</code>文件上<p><code>ln -s /usr/python/bin/python3 /usr/bin/python3</code></p>
<p>使用该方法,可以在系统中安装多个<code>python</code>版本</p>
</li>
<li>将目录<code>/usr/mengqc/mub1</code>下的文件<code>m2.c</code>链接到目录<code>/usr/liu</code>下的文件<code>a2.c</code><p><code>ln /usr/mengqc/mub1/m2.c /usr/liu/a2.c</code></p>
<p>在执行<code>ln</code>命令之前,目录<code>/usr/liu</code>中不存在<code>a2.c</code>文件。执行<code>ln</code>之后,在<code>/usr/liu</code>目录中才有<code>a2.c</code>这一项,表明<code>m2.c</code>和<code>a2.c</code>链接起来(注意,<strong>二者在物理上是同一文件,指向硬盘的同一位置</strong>),利用<code>ls -l</code>命令可以看到链接数的变化</p>
</li>
<li>在目录<code>/usr/liu</code>下建立一个符号链接文件<code>abc</code>,使它指向目录<code>/usr/mengqc/mub1</code><p><code>ln -s /usr/mengqc/mub1 /usr/liu/abc</code></p>
<p>执行该命令后,<code>/usr/mengqc/mub1</code>代表的路径将存放在名为<code>/usr/liu/abc</code>的文件中</p>
</li>
</ol>
<h4>硬链接和软链接的区别</h4>
<ul>
<li>
<p>硬链接</p>
<p>创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式(<code>ls -l</code>)的第二列中看到,无额外链接的文件的链接数为1</p>
<p>在默认情况下,<code>ln</code>命令创建硬链接。<code>ln</code>命令会增加链接数,<code>rm</code>命令会减少链接数.一个文件除非链接数为0,否则不会从文件系统中被物理地删除</p>
<p>限制:</p>
<pre><code>1. 不能对目录做硬链接
2. 只有在同一个文件系统中才能创建
</code></pre>
</li>
<li>
<p>软链接</p>
<p>软链接,是将一个路径名链接到一个文件.这些文件是一种特别类型的文件。事实上,它只是一个文本文件,其中包含它提供链接的另一个文件的路径名,另一个文件是实际包含所有数据的文件.所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件</p>
<p><strong>与硬链接不同的是,软链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件</strong></p>
<p>软链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做软链接</p>
<p>特点:</p>
<pre><code>1. 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据
2. 在目录长列表(`ls -l`)中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是`l`
3. 符号链接的大小是其链接文件的路径名中的字节数
</code></pre>
</li>
</ul>
<p><img src="/img/bV0Scn?w=710&h=124" alt="图片描述" title="图片描述"></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux系统配置免密码登录
https://segmentfault.com/a/1190000012464429
2017-12-17T22:48:48+08:00
2017-12-17T22:48:48+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p>进行<code>linux</code>服务器管理的时候,经常需要登录进去,每个服务器都需要记住和输入对应的用户名和密码,是非常麻烦的。</p>
<p>所以这里配置一下服务器免密码进行登录,方便我们进行管理</p>
<hr>
<p>演示配置环境:客户端 <code>Mac</code>。服务器: <code>Ubuntu 16.04</code></p>
<p>首先放一张图,进行介绍密匙免密登录的原理</p>
<p><img src="/img/bV0sIX?w=1520&h=282" alt="图片描述" title="图片描述"></p>
<p>转化为图为:</p>
<p><img src="/img/bV0sI0?w=1440&h=550" alt="图片描述" title="图片描述"></p>
<h4>本地配置公钥/私钥</h4>
<p>生产配置之前先检查自己之前是否配置过,如果之前配置过再重新生成,就会覆盖之前的记录,导致你之前配置的记录失效</p>
<p><strong>执行命令生成</strong><br><code>ssh-keygen -r rsa -C test@qq.com</code></p>
<p>执行该命令后会在用户根目录生产一个<code>.ssh</code>的文件夹<br><img src="/img/bV0sJe?w=934&h=216" alt="图片描述" title="图片描述"></p>
<p>创建的过程中会让你输入密码,可以不设置密码,一直回车就好</p>
<p>这里面<code>id_rsa</code>是私钥,<code>id_rsa.pub</code>是公钥,至于<code>konwn_hosts</code>文件是登录过服务器后自动生成的文件,用户保存远程服务器的指纹信息</p>
<blockquote>上面生产秘钥的命令中的 -r 参数是制定加密算法,-C 参数是制定 邮箱<br>对于window系统就需要安装<code>git</code>客户端 <a href="https://link.segmentfault.com/?enc=nYFXQUL%2FfOUl08H2sC5KRg%3D%3D.a5NHyzPBGCJ%2FTHbpgzgmpeEV0VAsnp5SZDPClNNOmuM%3D" rel="nofollow"><code>msysgit</code></a>
</blockquote>
<h4>配置服务器</h4>
<p>需要把客户端生产的公钥<code>id_rsa.pub</code> 里面的内容拷贝到服务器上对应用户根目录下的<code>.ssh/authorized_keys</code>文件中。</p>
<p><strong>若没有该文件可以手动创建该文件</strong>。也可以在服务上进行生成公钥/私钥,执行的命令和上面第一步一样的</p>
<p>也可以直接使用<code>ssh-copy-id user@host</code>命令直接拷贝到远程服务器上,为了防止出错,建议使用该命令进行复制客户端的公钥</p>
<p>有时候可能会修改然<code>authorized_keys</code>文件的权限<br><code>chmod 600 authorized_keys</code></p>
<p>接下来看一下<code>ssh</code>的配置文件<code>/etc/ssh/sshd_config</code>中的配置项是否打开</p>
<pre><code class="sh">RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys</code></pre>
<p>确保上面这几项是打开的,非注释掉的</p>
<p>最后重启<code>ssh</code><br><code>service ssh restart</code></p>
<p>接下来就可以免密码登录的了,但是每次还是需要输入用户名和主机地址的,这可以在本地配置<code>alias</code>别名</p>
<p>如果你安装了<code>zsh</code>就在<code>.zshrc</code>文件中添加,如果没有安装就是默认的在<code>.bashrc</code> 文件中添加<br><code>alias ssh_name user@host</code></p>
<p>执行 <code>source .zshrc</code> 或 <code>source .bashrc</code> 生效配置文件</p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux命令之ls
https://segmentfault.com/a/1190000012416624
2017-12-13T23:06:51+08:00
2017-12-13T23:06:51+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p><code>ls</code>命令用于显示工作目录下的内容,默认显示文件及子目录;带上参数后,我们可以用<code>ls</code>做更多的事</p>
<hr>
<h4>首先看看该命令的帮助</h4>
<pre><code class="sh">usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]</code></pre>
<p>列出指定工作目录的的文件,默认是当前文件夹; 默认按照字母排序</p>
<h4>语法</h4>
<p><code>ls [options] [files]</code></p>
<h4>选项 -- options</h4>
<ul>
<li>-a,--all 不忽略以 <strong>.</strong> 开头的文件,即隐藏文件,展示所有的文件</li>
<li>-A 同 -a ,但不列出 <strong>.</strong> (目前目录) 及 <strong>..</strong> (父目录)</li>
<li>-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出</li>
<li>-h,--human-readable 以人更易读的方式列出文件大小(e.g., 1K 234M 2G)</li>
<li>-r,--reverse 将文件以相反次序显示(默认依英文字母次序)</li>
<li>-R,--recursive 列出递归的目录即若目录下有文件,则以下之文件亦皆依序列出</li>
<li>-S 以文件的大小进行排序,从大到小排序</li>
<li>--block-size=SIZE 改变显示文件的基础单位大小</li>
<li>-d,--directory 只显示文件及名称,不显示内容</li>
<li>-t 通过修改时间进行排序,最新修改的在最上面</li>
<li>-p 在文件夹后面添加 <strong>/</strong> 标记</li>
</ul>
<h4>参数--files</h4>
<p>要展示的工作目录(默认是当前文件夹)</p>
<h4>实例</h4>
<p>1.不带参数的<code>ls</code>命令,只列出文件及目录,没有其他附件信息</p>
<p><img src="/img/bV0ghj?w=684&h=130" alt="图片描述" title="图片描述"></p>
<blockquote>有时候你可能发现<code>ls</code>命令列出了其他信息,那是因为你的<code>ls</code>命令是带了参数<code>ls</code>命令的别名</blockquote>
<p>2.以文件的大小进行排序</p>
<p><code>ls -lhS</code><br><img src="/img/bV0ghm?w=920&h=354" alt="图片描述" title="图片描述"></p>
<p>3.指定显示文件大小的基本单位</p>
<p>单位包括:</p>
<pre><code>K = Kilobyte
M = Megabyte
G = Gigabyte
T = Terabyte
P = Petabyte
E = Exabyte
Z = Zettabyte
Y = Yottabyte</code></pre>
<p><code>ls -l --block-size=M</code><br><img src="/img/bV0ghq?w=1020&h=358" alt="图片描述" title="图片描述"></p>
<blockquote>注意:使用强制基本单位后,不会显示小数,会四舍五入<br>如果在 <code>--block-size</code> 之前使用<code>-h</code>,<code>--block-size</code> 起作用;若在之后使用则<code>-h</code>起作用。谁在后谁起作用</blockquote>
<p>4.只显示目录文件</p>
<p><code>ls -ld */</code><br><img src="/img/bV0ghM?w=932&h=286" alt="图片描述" title="图片描述"></p>
<p>5.以时间进行排序,通过修改时间列出,最新修改的在最上面</p>
<p><code>ls -lt</code><br><img src="/img/bV0ghY?w=918&h=412" alt="图片描述" title="图片描述"></p>
<p>6.增加 / (斜线) 标记目录</p>
<p><code>ls -lp</code><br><img src="/img/bV0gh5?w=976&h=308" alt="图片描述" title="图片描述"></p>
<p><strong>详细的命令使用方式,可以使用<code>man ls</code> 或<code>ls --help</code> 查看</strong></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux命令之scp
https://segmentfault.com/a/1190000012281048
2017-12-04T21:15:20+08:00
2017-12-04T21:15:20+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p>由于经常在<code>linux</code>服务器和本地进行文件传输,这样就需要了解文件传输的命令</p>
<hr>
<p>在没有文件传输工具的情况下,就必须了解有关的文件传输命令,下面就来说说这个命令<code>scp(secure copy)</code>,是<code>linux</code>系统下基于<code>ssh</code>登陆进行安全的远程文件拷贝命令</p>
<h4>首先看看该命令的帮助</h4>
<p><code>scp</code></p>
<pre><code class="sh">usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2</code></pre>
<h4>语法</h4>
<p><code>scp [可选参数] file_source file_target</code></p>
<h4>参数</h4>
<ul>
<li>-1: 强制scp命令使用ssh1协议</li>
<li>-2: 强制scp命令使用ssh12协议</li>
<li>-4: 强制scp命令只使用IPv4寻址</li>
<li>-6: 强制scp命令只使用IPv6寻址</li>
<li>-P: 指定数据传输用到的端口号</li>
<li>-v: 详细方式显示输出</li>
<li>-c cipher: 以cipher方式将数据进行传输加密,这个选项会直接传给ssh</li>
<li>-l: 限定用户所能使用的带宽,以Kbit/s为单位</li>
<li>-F: 指定一个替代的ssh配置文件,此参数直接传递给ssh</li>
<li>-p: 保留原文件的修改时间,访问时间和访问权限</li>
<li>-q: 不显示传输进度条</li>
<li>-r: 递归复制整个目录</li>
<li>-C: 允许压缩</li>
</ul>
<h4>实例</h4>
<h5>从本地复制到远程</h5>
<p><strong>复制文件</strong></p>
<pre><code class="sh">-------------------------------------------------------------
一:
scp loacl_file remote_username@remote_ip:remote_folder
scp /home/space/music/1.mp4 root@www.test/com:/home/root/other/music
---------------------------------------------------------------------
二:
scp loacl_file remote_username@remote_ip:remote_file
scp /home/space/music/1.mp4 root@www.test/com:/home/root/other/music/1.mp3
------------------------------------------------------------------------
三:
scp loacl_file remote_ip:remote_folder
scp /home/space/music/1.mp4 www.test/com:/home/root/other/music
--------------------------------------------------------------
四:
scp loacl_file remote_ip:remote_file
scp /home/space/music/1.mp4 www.test/com:/home/root/other/music/1.mp3</code></pre>
<p>上面的例子中:</p>
<ul>
<li>前两个指定了用户名,执行命令后需要输入密码</li>
<li>后两个没有指定用户名,执行命令后需要输入用户名和密码</li>
<li>第一个和第三个只指定了目录,文件名称不变,对应本地的文件名称</li>
<li>第二个和第四个指定的文件名称</li>
</ul>
<blockquote><p>注意:复制文件时该命令不会创建文件夹,若服务器没有对应的文件夹,则会把文件夹名称当做文件的名称。对于上面第一个例子,若服务器上没有<code>music</code>文件夹,则会<code>music</code>当做文件名去对应<code>1.mp4</code><br>对于表达式中的<code>remote_ip</code>可以是<strong>ip</strong>地址或者对应映射的<strong>域名</strong></p></blockquote>
<p><strong>复制目录</strong></p>
<pre><code class="sh">scp -r /home/space/music/ www.test.com:/home/root/others/ </code></pre>
<p>上面命令将本地 music 目录复制到远程 others 目录下</p>
<blockquote><p>复制目录是记得要加上<code>-r</code>参数.若服务器上没有指定的目录则会在服务器上自动创建一个目录</p></blockquote>
<h5>从远程复制到本地</h5>
<p>从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可</p>
<pre><code class="sh">scp -r root@www.test.com:/home/root/others/ /home/space/music/
scp root@www.test/com:/home/root/other/music/1.mp3 /home/space/music/1.mp4 </code></pre>
<h5>特别说明</h5>
<ol>
<li>使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的</li>
<li>如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号</li>
</ol>
<p><code>scp -P 4500 /home/space/music/1.mp4 root@www.test/com:/home/root/other/music/1.mp3</code></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
Base64原理解析
https://segmentfault.com/a/1190000012203024
2017-11-28T21:38:37+08:00
2017-11-28T21:38:37+08:00
一步
https://segmentfault.com/u/yibuyou
7
<hr>
<p><strong>Base64</strong>是基于64个字符进行转换的,因为2的6次方正好为64,所以<strong>6bit</strong>就可以表示出64个字符,因此在转换的过程中以<strong>6bit</strong>表示一个字符。</p>
<hr>
<p><strong>原理:</strong></p>
<p><strong>3x8=4x6</strong>,核心是这个公式</p>
<ol>
<li>base64的编码都是按字符串长度,以每3个8bit的字符为一组</li>
<li>针对每组,首先获取每个字符的ASCII编码值</li>
<li>将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节</li>
<li>再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节</li>
<li>将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符</li>
</ol>
<p><strong>ASCII表</strong><br><img src="/img/bVZmIZ?w=800&h=891" alt="图片描述" title="图片描述"></p>
<p><strong>Base64编码表</strong><br><img src="/img/bVZmI0?w=694&h=521" alt="图片描述" title="图片描述"></p>
<p><strong>案例</strong></p>
<ul><li>字符串长度能被3整除的:比如 wen</li></ul>
<pre><code> w e n
ASCII: 119 101 110
8bit: 01110111 01100101 01101110
6bit: 011101 110110 010101 101110
十进制: 29 54 21 46
Base64: d 2 V u
所以 "wen" ---- > d2Vu</code></pre>
<ul><li>字符串长度不能被3整除时,比如:jiang</li></ul>
<pre><code> j i a n g
ASCII: 106 105 97 110 103
8bit: 01101010 01101001 01100001 01101110 01100111
6bit: 011010 100110 100101 100001 011011 100110 011100 异常
十进制: 26 38 37 33 27 38 28
Base64: a m l h b m c =
所以 "jiang" ---- > amlhbmc=</code></pre>
<p>注意:<strong>Base64是四个字符为一组,不够的补=</strong></p>
<blockquote><p>工具网站:<br><a href="https://link.segmentfault.com/?enc=1XQDCqFAwUPdkgpuNQE10w%3D%3D.HbZO%2BpcI%2BuOY9eA0fyGBJAEiHCOfnlNtX8iWiyw89Po%3D" rel="nofollow">进制转换</a><br><a href="https://link.segmentfault.com/?enc=JQKvMJgPEBr5CxX%2BUv8BDA%3D%3D.qhhZNXNhR%2BF4oKInLDvWdqtxSubUEwQGUYaQhIgxj88iD0SLcNovz5BI3j0dH358" rel="nofollow">Base64转换工具</a><br><a href="https://link.segmentfault.com/?enc=RcqyKVnECAtO%2B7vauJzuGQ%3D%3D.wmumcBQtOlaGnm0B9Tk1aH2qjij0lcEaB6df%2Fn0ryN8vzcZpl9hFw5FH0Iiv2DZv" rel="nofollow">图片转base64</a></p></blockquote>
<p><strong>汉字转Base64</strong></p>
<p>这里需要注意,汉字本身可以有多种编码,比如<code>gb2312、utf-8、gbk</code>等等,每一种编码的<code>Base6</code>4对应值都不一样。下面的例子以<code>utf-8</code>为例</p>
<p><code>严</code>的<code>utf-8</code>为<code>E4B8A5</code>,写成二进制就是三字节的11100100 10111000 10100101,然后按照上面的规则转换得到<code>Base64</code> 编码为:5Lil</p>
<p>所以,汉字严(utf-8编码)的Base64值就是5Lil</p>
<p><strong><em>从上面英语字母或者汉字转换为Base64的来看,就是先转换为对应的编码的二进制,然后在进行转换</em></strong></p>
<p><strong>补充内容</strong></p>
<p>对于一张图片,我们进程看到这样的表达形式:</p>
<pre><code>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAA....</code></pre>
<p>这是<code>这是Data URI scheme</code>目的是将一些小数据,直接嵌入到网页中,而不用在引用外部</p>
<p>在上面<code>data</code>表示取得数据的协定名称,<code>image/png</code> 是数据类型名称,<code>base64</code> 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据</p>
<p>Data URI scheme支持的类型有:</p>
<ul>
<li>data:,文本数据</li>
<li>data:text/plain,文本数据</li>
<li>data:text/html,HTML代码</li>
<li>data:text/html;base64,base64编码的HTML代码</li>
<li>data:text/css,CSS代码</li>
<li>data:text/css;base64,base64编码的CSS代码</li>
<li>data:text/javascript,Javascript代码</li>
<li>data:text/javascript;base64,base64编码的Javascript代码</li>
<li>data:image/gif;base64,base64编码的gif图片数据</li>
<li>data:image/png;base64,base64编码的png图片数据</li>
<li>data:image/jpeg;base64,base64编码的jpeg图片数据</li>
<li>data:image/x-icon;base64,base64编码的icon图片数据</li>
</ul>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
MongoDB的数据类型介绍
https://segmentfault.com/a/1190000012157473
2017-11-25T16:06:14+08:00
2017-11-25T16:06:14+08:00
一步
https://segmentfault.com/u/yibuyou
4
<hr>
<p><code>MongoDB</code>以<code>BSON</code>一种<strong>序列化</strong>的二进制格式存储数据。在每个序列化之前的文档又支持以下列表中的数据类型,每种数据类型都有一个对应的<strong>数字</strong>和<strong>字符串</strong>别名。可以用在<a href="https://link.segmentfault.com/?enc=f6DCGxA6NDY9kDHgEPLtIQ%3D%3D.7i%2F4mO9zKg8Gd5JCkhZ9Qy%2ByJY%2FWxs%2FDYXmD9qJdNtN9DVG%2F0lmPPrNAB2kvgYErJf1iaRia1dyyV2i0s7c34neZsenYopTP4M8B%2B%2BisJSI%3D" rel="nofollow"><strong>$type</strong></a>操作符中用于查询文档</p>
<hr>
<p><strong>数据类型</strong>:</p>
<table>
<thead><tr>
<th align="center"><strong>Type</strong></th>
<th align="center"><strong>Number</strong></th>
<th align="center"><strong>String</strong></th>
<th align="center"><strong>Notes</strong></th>
</tr></thead>
<tbody>
<tr>
<td align="center">Double</td>
<td align="center">1</td>
<td align="center">"double"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">字符串</td>
<td align="center">2</td>
<td align="center">"string"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">对象</td>
<td align="center">3</td>
<td align="center">"object"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">数组</td>
<td align="center">4</td>
<td align="center">"array"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">二进制数据</td>
<td align="center">5</td>
<td align="center">"binData"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">未定义</td>
<td align="center">6</td>
<td align="center">"undefined"</td>
<td align="center">已过期</td>
</tr>
<tr>
<td align="center">ObjectId</td>
<td align="center">7</td>
<td align="center">"objectId"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">Boolean</td>
<td align="center">8</td>
<td align="center">"bool"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">日期</td>
<td align="center">9</td>
<td align="center">"date"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">空</td>
<td align="center">10</td>
<td align="center">"null"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">正则表达式</td>
<td align="center">11</td>
<td align="center">"regex"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">DBPointer</td>
<td align="center">12</td>
<td align="center">"dbPointer"</td>
<td align="center">已过期</td>
</tr>
<tr>
<td align="center">JavaScript(代码)</td>
<td align="center">13</td>
<td align="center">"javascript"</td>
<td align="center">此数据类型用于将JavaScript代码存储到文档中</td>
</tr>
<tr>
<td align="center">符号</td>
<td align="center">14</td>
<td align="center">"symbol"</td>
<td align="center">已过期</td>
</tr>
<tr>
<td align="center">JavaScript(带范围)</td>
<td align="center">15</td>
<td align="center">"javascriptWithScope"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">32位整数</td>
<td align="center">16</td>
<td align="center">"int"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">时间戳</td>
<td align="center">17</td>
<td align="center">"timestamp"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">64位整数</td>
<td align="center">18</td>
<td align="center">"long"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">Decimal128</td>
<td align="center">19</td>
<td align="center">"decimal"</td>
<td align="center">New in version 3.4</td>
</tr>
<tr>
<td align="center">Min key</td>
<td align="center">-1</td>
<td align="center">"minKey"</td>
<td align="center">-----</td>
</tr>
<tr>
<td align="center">Max key</td>
<td align="center">127</td>
<td align="center">"maxKey"</td>
<td align="center">-----</td>
</tr>
</tbody>
</table>
<p>你可以使用<code>typeof</code>或者<code>instanceof</code><a href="https://link.segmentfault.com/?enc=fHFs1JId8kSWAxjhcyd7FA%3D%3D.LFmhFmZVQNAWk1xR5xEAiBzlmm0PiDJVkFfHfopmXVpcrCCnzXi2H8Ar3O%2BzoAGXeV2MmLEOWB%2BKmT2JJgHCCXbJ25o%2BWJxH6vAuP2PIKDI%3D" rel="nofollow">instanceof/typeof</a> 判断一个字段值的类型</p>
<p>以下的代码示例,都是在<code>Mongo shell</code>中实现的</p>
<p>下面介绍一下几种重要的数据类型</p>
<h4>ObjectId</h4>
<p><code>ObjectId</code> 类似唯一主键,可以很快的去生存和排序,包含 <strong>12 bytes</strong>,含义是:</p>
<ul>
<li>前4个字节表示创建<strong>unix</strong>时间戳,格林尼治时间 <strong>UTC</strong>时间,比北京时间晚了8个小时</li>
<li>接下来的3个字节是机器标识码</li>
<li>紧接的两个字节由进程id组成(PID</li>
<li>最后三个字节是随机数</li>
</ul>
<p><img src="/img/bVZaTO?w=670&h=116" alt="图片描述" title="图片描述"><br><code>MongoDB</code>中存储的文档必须有一个<code>_id</code>键。这个键的值可以是任何类型的,默认是个<code>ObjectId</code>对象</p>
<p>由于<code>ObjectId</code>中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 <code>getTimestamp</code> 函数来获取文档的创建时间:</p>
<pre><code class="js">> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")</code></pre>
<p><code>ObjectId</code> 转为字符串</p>
<pre><code class="js">> newObject.str
5a1919e63df83ce79df8b38f</code></pre>
<h4>字符串</h4>
<p><strong>BSON字符串都是UTF-8编码</strong></p>
<h4>时间戳</h4>
<p><code>BSON</code>有一个特殊的时间戳类型用于 <code>MongoDB</code> 内部使用,与普通的 <strong>日期</strong> 类型不相关。 时间戳值是一个64位的值。其中:</p>
<ul>
<li>前32位是一个 time_t 值(与Unix新纪元相差的秒数)</li>
<li>后32位是在某秒中操作的一个递增的<code>序数</code>
</li>
</ul>
<p>在<strong>单个 mongod 实例</strong>中,时间戳值通常是唯一的</p>
<p>在复制集中, <strong>oplog</strong> 有一个 <strong>ts</strong> 字段。这个字段中的值使用BSON时间戳表示了操作时间</p>
<blockquote><p>BSON时间戳类型主要用于 MongoDB<strong>内部</strong> 使用 。在大多数情况下的应用开发中,你可以使用BSON日期类型</p></blockquote>
<h4>日期</h4>
<p>表示当前距离<code>Unix</code>新纪元(1970年1月1日)的毫秒数.日期类型是有符号的,负数表示1970年之前的日期</p>
<pre><code class="js">> var mydate1 = new Date() //格林尼治时间
> mydate1
ISODate("2017-11-25T07:38:00.833Z")
> typeof mydate1
object</code></pre>
<pre><code class="js">> var mydate2 = ISODate() //格林尼治时间
> mydate2
ISODate("2017-11-25T07:38:57.996Z")
> typeof mydate2
object</code></pre>
<p>这样创建的时间是日期类型,可以使用<code>JS</code>中的<code>Date</code>类型的方法</p>
<p>返回一个时间类型的字符串</p>
<pre><code class="js">> var mydate1str = mydate1.toString()
> mydate1str
Sat Nov 25 2017 15:38:00 GMT+0800 (CST)
> typeof mydate1str
string</code></pre>
<p>或者</p>
<pre><code class="js">> Date()
Sat Nov 25 2017 15:43:28 GMT+0800 (CST)</code></pre>
<h4>Boolean</h4>
<p>此类型用于存储布尔值:<code>true / false</code></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
语法图的理解
https://segmentfault.com/a/1190000012119401
2017-11-22T21:29:46+08:00
2017-11-22T21:29:46+08:00
一步
https://segmentfault.com/u/yibuyou
1
<hr>
<p>出现的<code>JavaScript语言精粹</code>和 <a href="https://link.segmentfault.com/?enc=ZDrQTN2AlRw2yI4iMf53QQ%3D%3D.JW%2BkYFaT8WqIRwr22ZpciBUklFwAzcQAbVLyhDOFPpOXVM%2FXKUcjCPwD%2BpMZW%2FQ7" rel="nofollow">json.org</a>的语法图,又叫铁路图 的理解。<br><img src="/img/bVY0X3?w=1314&h=292" alt="图片描述" title="图片描述"></p>
<hr>
<p>语法图或铁路图的规则</p>
<ol>
<li><p>从左侧边界开始沿轨道到右侧边界;</p></li>
<li><p>沿途,在圆框遇到的是自变量,方快中遇到的是规则或者描述;</p></li>
<li><p>任何沿着轨道能走通的序列都是合法的;</p></li>
<li><p>任何不能沿着轨道走通的序列都是非法的;</p></li>
<li><p>每个<strong>末端只有一个竖条</strong>的铁路图允许在任何一对标记中间插入空白,而在末端有两个竖条的铁路图是不允许的;</p></li>
</ol>
<p>对上面的示例语法图语法解释:</p>
<ol>
<li><p>空对象 <code>{}</code></p></li>
<li><p>中间横向语句</p></li>
</ol>
<pre><code class="js">{
"string":value
}</code></pre>
<ol><li><p><code>value</code>后循环</p></li></ol>
<pre><code class="js">{
"string":value,
"string1":value
}</code></pre>
<blockquote><p>平滑进入的为入口<br><img src="/img/bVY0Yb?w=1314&h=292" alt="图片描述" title="图片描述"></p></blockquote>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
linux命令之 at
https://segmentfault.com/a/1190000012100828
2017-11-21T18:56:40+08:00
2017-11-21T18:56:40+08:00
一步
https://segmentfault.com/u/yibuyou
0
<hr>
<p><code>linux</code>命令之 <strong>at</strong></p>
<hr>
<p><strong>at</strong> 在指定的时间执行一次特定的任务,即:一次性定时任务计划执行</p>
<p>该命令是<code>atd</code>进程控制,首先查看一下该进程是否启动,一般是随着系统自动启动的<br><code>ps aux | grep atd</code></p>
<p>若没有启动,则需要手动进行启动</p>
<pre><code>/etc/init.d/atd start
支持的语法:Usage: /etc/init.d/atd {start|stop|restart|force-reload|status}</code></pre>
<p>若没有安装,则需要安装:</p>
<pre><code>apt-get install at
or
yum install -y at</code></pre>
<h4>首先看看该命令的帮助</h4>
<pre><code class="sh">Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec ...
at [-V] [-q x] [-f file] [-mMlbv] -t time
at -c job ...
atq [-V] [-q x]
at [ -rd ] job ...
atrm [-V] job ...
batch</code></pre>
<h4>语法</h4>
<p><code>at (选项) (参数)</code></p>
<h4>选项</h4>
<ul>
<li><p>-f 指定包含具体指令的任务文件</p></li>
<li><p>-q 指定新任务的队列名称</p></li>
<li><p>-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出</p></li>
<li><p>-c 打印任务的内容到标准输出</p></li>
<li><p>-V 显示版本信息</p></li>
<li><p>-d 删除指定的待执行任务,还可以使用<strong>atrm</strong>删除</p></li>
<li><p>-l 显示待执行任务的列表,还可以使用<strong>atq</strong>显示</p></li>
</ul>
<h4>参数</h4>
<p>日期时间:指定任务执行的日期时间</p>
<h4>时间格式</h4>
<ul>
<li><p>当天的时间:hh:mm,加入时间已经过去,就放到明天执行</p></li>
<li><p>模糊的指定时间:<strong>midnight</strong>,<strong>noon</strong>,<strong>teatime</strong></p></li>
<li><p>采用十二进制的时间:在时间的后面<strong>am</strong>或者<strong>pm</strong></p></li>
<li><p>也可以指定执行命令的具体时间:<strong>month day</strong>(月 日),<strong>mm/dd/yy</strong>(月/日/年),<strong>dd.mm.tt</strong>(日/月/年),指定的日期必须跟在指定的时间后面</p></li>
<li><p>相对记时法:安排不就要执行的命令:<strong>time+count time-units</strong>,<strong>time</strong>就是指定的时间,<strong>time-units</strong>是单位有<strong>minutes</strong>,<strong>hours</strong>,<strong>days</strong>,<strong>weeks</strong>,<strong>count</strong>是时间数量:比如:<strong>at 5pm+3 days</strong></p></li>
<li><p>还有一种直接用<strong>today</strong>(今天),<strong>tomorrow</strong>(明天)来指定时间的,比如:<strong>at 5pm tomorrow</strong></p></li>
</ul>
<h4>实例</h4>
<ol>
<li>
<p>在当天17:35 输出时间到一个文件</p>
<pre><code class="sh">➜ ~ at 17:36
warning: commands will be executed using /bin/sh
at> date > ./log.log
at> <EOT>
job 7 at Tue Nov 21 17:36:00 2017</code></pre>
</li>
<li>
<p>删除特定的任务</p>
<pre><code class="sh">[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root</code></pre>
</li>
</ol>
<blockquote><p>输入完成之后按 <strong>ctrl+d保存退出</strong></p></blockquote>
<h4>安全的问题</h4>
<p>不是所有用户都可以运行<code>at</code>任务的。因为系统安全的原因。很多主机被攻击破解后,非常有可能运用一些计划任务来运行或搜集你的系统运行信息,并定时的发送给黑客。 所以,除非是你认可的帐号,否则先不要让他们使用 at 命令。</p>
<p>那怎么控制用户使用 at 命令的权限呢?</p>
<p>在这里面有两个文件进行控制的:</p>
<ul>
<li><p><code>/etc/at.allow</code>: 这个文件优先被寻找,若有这个文件,则写在这个文件的使用者才能使用,没有在这个文件用户不能使用的</p></li>
<li><p><code>/etc/at.deny</code>: 若没有<code>/etc/at.allow</code>这个文件,就会寻找<code>/etc/at.deny</code>这个文件,写在<code>at.deny</code>的用户是不可以使用的,没有在的就可以使用</p></li>
<li><p>若两个文件都没有,那么就只有<strong>root</strong>用户你可以使用这个命令</p></li>
</ul>
<blockquote><p>对于这个两个文件内容的书写时:<strong>一个帐号写一行</strong></p></blockquote>
<p><img src="/img/bVYP5c?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman 变量使用篇(六)
https://segmentfault.com/a/1190000012077563
2017-11-20T11:52:25+08:00
2017-11-20T11:52:25+08:00
一步
https://segmentfault.com/u/yibuyou
11
<hr>
<p><code>postman</code> <strong>变量</strong>使用篇(六)</p>
<hr>
<h3>Variables</h3>
<h4>什么是变量</h4>
<p>变量是一个符号,可以接受不同的值。你可能根据你的项目经验,对其他语言的变量比较熟悉。在postman 的工作原理也是一样的</p>
<h4>为什么使用变量</h4>
<p>变量允许你在不同的地方重复使用这个值,因此你可以保持你的代码<strong>DRY</strong>(Dont't Repeat Yourself). 如果你想改变这个值,那么你可以改变这个变量一次,其他地方引用这个变量就会自定改变</p>
<p>如果你有多个<strong>API</strong>使用相同的域名 <code>your-domain.com</code> 。你可以保存这个域名作为一个变量,代理重复使用这个值:<code>{{domian}}/uri</code></p>
<p>借助于postman <code>Script</code>脚本作用,你可以设置一个变量的值,复制一个请求的数据在其他的请求的中使用</p>
<h4>变量的作用域</h4>
<p>有以下的变量作用域:</p>
<pre><code>1. Global---全局
2. Enviroment --- 环境变量
3. Local --- 局部
4. Data ---- 数据
</code></pre>
<p>如果一个变量在两个不同的作用域。那么拥有较高级别作用域优先,postma 解析变量是由大范围都小范围解析的</p>
<p>优先级从高到底<br>Data ---- > Local ---- > Enviroment ---- > Global</p>
<h4>在请求的构建器中访问变量</h4>
<p>变量在postman 中使用是用下面方式:<strong>{{variableName}}</strong>,当 postman 解析变量事,这个字符串{{variableName}} 会被替换为响应的值。</p>
<p>比如一个环境变量 <code>enviroment variable</code> <strong>url</strong> 的值被定义为<code>http://localhost</code>,你可以使用<code>{{url}}</code>在请求的输入框中将被替换为<code>http://localhost</code>,当请求被发送的时候</p>
<p>由于变量在请求<code>builder</code>中被访问是使用字符串代替的,因此,你可以在请求<code>builder</code>的任何地方添加文本,这包括<code>URL</code>,<code>URL parameters</code>,<code>headers</code>,<code>authorization</code>,<code> request body </code>,<code>header presets</code>。<br>postman 解析这些变量是通过作用域规则</p>
<h4>访问变量通过脚本(scripts)</h4>
<p>变量可以被使用在<code>pre-request</code>和<code>test script</code>中。因为这些部分是通过<code>JavaScript</code>来写的</p>
<p>你可以以不同的方式初始化和检索这些变量。可以在脚本中初始化变量,并将它们放在特定的范围内</p>
<ol>
<li><p>定义一个变量在脚本中 <br>在脚本中设置一个变量可以根据变量预定的范围通过<strong>pm.environment.set("variable_key", "variable_value");</strong>方法或者<strong>pm.globals.set("variable_key", "variable_value");</strong>方法,这方法要求提供变量的<code>key</code>和<code>value</code>去设置变量。当你发送请求的时候,这脚本将会执行,值将会保存在变量中</p></li>
<li><p>取一个预定义的变量<br>一旦一个变量被设置,你可以使用<code>pm.environment.get("variable_key");</code>或者<code>pm.globals.get("variable_key");</code> 根据适合的范围去获取变量值。这方法要求提供一个变量名作为参数去检索储存的值</p></li>
<li><p>设置一个变量在作用域中<br>可以访问环境变量在相应的环境模板。全局变量可以广泛的访问,不管选择的作用域</p></li>
</ol>
<p><img src="/img/bVYP1X?w=557&h=151" alt="图片描述" title="图片描述"></p>
<h4>打印变量 --- Logging variables</h4>
<p>经常在脚本中使用变量时,你可能需要看到变量获取到的值,你可以使用<strong>Postman Console</strong>去实现的。应用菜单,选择<code>View</code>然后在选择Show Postman Console<code>,去打印变量的值。你可以在脚本中使用</code>console.log("domain)";`当你发送请求时,这脚本将会执行,参数对应的值也会打印在<strong>Postman Console</strong><br><img src="/img/bVYP14?w=525&h=331" alt="图片描述" title="图片描述"></p>
<h4>Data variables 数据 变量</h4>
<p><code>Collection Runner</code>让你导入一个<code>CSV</code>或者<code>JSON</code>文件,然后在<code>HTTP</code>请求和脚本中使用文件中的值。我们把这些值叫做<code>Data variables</code>。使用它们在postman中,相同的语法和环境,全局变量</p>
<h6>Data variables in requests</h6>
<p>变量在postman中使用在<strong>{{}}</strong>中,比如在 URL 参数 <code>{{username}}</code> 和 <code>{{password}}</code> 将被替换对应文件中变量的值</p>
<h5>Data variables in pre-request and test scripts</h5>
<p>在<code>pre-request</code>和<code> test scripts</code>使用,用的是指定的<code>data</code>对象去加载来着文件的值。比如:<code>data.username</code> 或者 data["username"] 去访问文件中对应的<code>username</code>变量</p>
<blockquote><p>更多的文件数据,参考<a href="https://link.segmentfault.com/?enc=9ONZta%2FR9qBMMYyPycFxTg%3D%3D.zU0kYfX5ps0tyMDaCp9PJ46%2BMfRqjQ8amPh665Subsa20qBXCpiyeKP9wA5%2B39nOhKuMMJSMfD%2B63OGsMGkoHyW4IONmua72%2Bk%2BSA34cnmQ%3D" rel="nofollow">working with data files</a></p></blockquote>
<h4>Dynamic variables 内置的动态变量</h4>
<p>postman有一些动态变量,你可以在请求中使用。动态变量不能再沙盒中使用,仅仅可以在请求的<code>URL</code>/<code>headers</code>/<code>body</code>中使用</p>
<ul>
<li><p>{{$guid}} 添加一个<code>v4</code>风格的<code>guid</code></p></li>
<li><p>{{$timestamp}} 添加一个当前的时间戳</p></li>
<li><p>${{$randomInt}} 添加一个 0--10的随机数</p></li>
</ul>
<h4>Quick Look for variables 快速查看变量</h4>
<p>快速查查是一个快速预览功能展示所有你的环境和全局变量咋一个地方。<br>点击右上角眼睛的图表展示</p>
<h5>Autocomplete and tooltips for variables 提示 ,自动补全变量</h5>
<p>postman变量有两个非常有用的特征 <code>autocomplete </code> 和 <code>tooltips</code>,让变量更加好用</p>
<p><img src="/img/bVYP2d?w=670&h=273" alt="图片描述" title="图片描述"></p>
<h3>Manage environments</h3>
<p><img src="/img/bVYP2D?w=391&h=132" alt="图片描述" title="图片描述"></p>
<p>每一个环境变量都是一个键-值对,<code>key</code>可以看做变量名称。他们可以被编辑使用</p>
<blockquote><p>环境和全局变量都会保存为字符串,如果你想要保存一个对象或者数组,首先确定使用<code>JSON.stringify()</code>,再去保存。在使用之前使用<code>JSON.parse()</code></p></blockquote>
<h4>What are environments?</h4>
<p>在使用<code>API</code>工作时,你经常需要有设置不同,比如:你的本地机器,开发服务器,生产服务器。<br><code>Environments</code>对能使你使用变量来定制请求,你可以很方便的切换不同的设置而不需要改变你的请求。</p>
<p><code>Environments</code> 是一组变量键-值对</p>
<p><code>Environments</code> 是能够下载保存为<code>JSON</code> 文件,并在之后上传使用的</p>
<h4>Create a new environment</h4>
<p>点击右上角齿轮的图表,选择<code>Manage Environments</code>,在点击<strong>Add</strong>按钮去创建一个新的环境</p>
<p><img src="/img/bVYP4y?w=721&h=662" alt="图片描述" title="图片描述"></p>
<h4>Manage environment</h4>
<p><img src="/img/bVYP3c?w=722&h=145" alt="图片描述" title="图片描述"></p>
<h4>Select an active environment</h4>
<p>选择一个环境,一旦你选择了一个环境,你就可以还有在这个环境的变量和对应的变量值了<br><img src="/img/bVYP3g?w=328&h=162" alt="图片描述" title="图片描述"></p>
<h4>Edit an active environment</h4>
<p>点击那个眼睛图标,展示环境和全局变量,点击环境变量的<strong>Edit</strong>将打开一个模态框编辑键-值对<br><img src="/img/bVYP3r?w=362&h=263" alt="图片描述" title="图片描述"></p>
<h4>Share an environment</h4>
<p>这是 <code>Postman Pro feature</code> 的功能</p>
<p>分享之前最好复制一份,把复制的一份分享出去</p>
<h3>Manage globals</h3>
<p>全局变量提供了一组变量,这些变量总是在所有范围内供您使用,你可以有很多<code>environments</code>,,但是只有一个是活动的在某一个时间,但是你只有一组全局变量,它们总是可用的。</p>
<h4>Manage global variables</h4>
<p>点击右上角齿轮的图表,选择<code>Manage Environments</code>,在点击<strong>Globals </strong>按钮境打开全局变量的管理界面<br><img src="/img/bVYP3y?w=727&h=650" alt="图片描述" title="图片描述"></p>
<h4>View global variables</h4>
<p>点击那个眼睛图标,展示环境和全局变量,点击全局变量的<strong>Edit</strong>将打开一个模态框编辑键-值对</p>
<p><a href="https://segmentfault.com/a/1190000011991458">postman 的基础使用篇(一)</a><br><a href="https://segmentfault.com/a/1190000011991614">postman发送请求使用篇(二)</a><br><a href="https://segmentfault.com/a/1190000012007906">postman响应使用篇(三)</a><br><a href="https://segmentfault.com/a/1190000012024844">postman的代理使用篇(四)</a><br><a href="https://segmentfault.com/a/1190000012056247">postman认证使用篇(五)</a></p>
<p><img src="/img/bVYP5c?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
提高效率的VScode插件
https://segmentfault.com/a/1190000012067159
2017-11-19T10:47:12+08:00
2017-11-19T10:47:12+08:00
一步
https://segmentfault.com/u/yibuyou
8
<hr>
<p>有效的利用<code>VScode</code>插件能更方便我们的工作,提高我们的工作的效率</p>
<hr>
<h5>vscode-icons</h5>
<p>让你的左边栏的文件显示相应的<code>icon</code> 图表 <br><img src="/img/bVYNm7?w=256&h=446" alt="图片描述" title="图片描述"></p>
<h5>TODO Parser</h5>
<p>代办事项,会在左下角显示一个按钮,点击显示所有的代办事项<br><img src="/img/bVYNnb?w=210&h=45" alt="图片描述" title="图片描述"></p>
<h5>open in browser</h5>
<p>右键选中文件,在浏览器中打开文件<br><img src="/img/bVYNnc?w=341&h=368" alt="图片描述" title="图片描述"></p>
<h5>Git History</h5>
<p>查看<code>Git</code>提交的历史,对比提交文件的差异。按 <code>F1</code><br><img src="/img/bVYNnd?w=670&h=82" alt="图片描述" title="图片描述"></p>
<h5>Document This</h5>
<p>自动生成<code>JSDoc</code>注释文档在<code>JS</code>或者<code>TS</code>文件中<br><img src="/img/bVYNnl?w=489&h=143" alt="图片描述" title="图片描述"></p>
<h5>Prettier</h5>
<p>格式化<code>JS</code>,<code>TS</code>,<code>CSS</code>文件</p>
<h5>Docker</h5>
<p>很方便的部署构建<code>Docker</code>应用</p>
<h5>Bookmarks</h5>
<p>添加书签,很方便跳转过去。可以对书签进行管理<br><img src="/img/bVYNnp?w=761&h=213" alt="图片描述" title="图片描述"></p>
<h5>AutoFileName</h5>
<p>引用的时候自动补全文件的名称</p>
<h5>Path Intellisense</h5>
<p>自动感应引入文件的路径</p>
<h5>Import Cost</h5>
<p>显示引入包的大小<br><img src="/img/bVYNnq?w=418&h=50" alt="图片描述" title="图片描述"></p>
<h5>vscode-wechat</h5>
<p>微信小程序的插件,可以预览小程序</p>
<h5>Python</h5>
<p><code>Python</code>语言的插件</p>
<h5>Go</h5>
<p><code>Go</code>语言的插件</p>
<h5>npm</h5>
<p>支持执行定义在<code>package.json</code>文件中的脚本,验证定义的依赖模块<br><img src="/img/bVYNnv?w=635&h=258" alt="图片描述" title="图片描述"></p>
<h5>npm Intellnsense</h5>
<p>能自动导入已经安装的<code>npm</code>包<br><img src="/img/bVYNnz?w=614&h=67" alt="图片描述" title="图片描述"><br>选中之后出现已经安装的包<br><img src="/img/bVYNnB?w=616&h=407" alt="图片描述" title="图片描述"></p>
<h5>Code Runner</h5>
<p>选中代码去执行<br><img src="/img/bVYNnC?w=460&h=455" alt="图片描述" title="图片描述"></p>
<p>还可以选中规定的的语言去执行<br><img src="/img/bVYNnG?w=618&h=63" alt="图片描述" title="图片描述"><br>选中之后出现语言的列表<br><img src="/img/bVYNnH?w=625&h=419" alt="图片描述" title="图片描述"></p>
<h5>Live Server</h5>
<p>启动一个开发者本地静态资源的服务<br><img src="/img/bVYNnI?w=224&h=76" alt="图片描述" title="图片描述"><br>点击启动之后:<br><img src="/img/bVYNnK?w=238&h=56" alt="图片描述" title="图片描述"></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
mac命令行用sublime,vscode,atom打开目录或文件的方法
https://segmentfault.com/a/1190000012061654
2017-11-18T14:23:05+08:00
2017-11-18T14:23:05+08:00
一步
https://segmentfault.com/u/yibuyou
0
<p><code>MAC</code> 在命令行直接利用 <strong>sublime</strong>,<strong>vscode</strong>,<strong>atom</strong>,直接打开文件或者目录,能很高的提高开发效率</p>
<p>总体的思路就是配置<code>alias</code>别名,但是<code>atom</code>有些意外的情况发生</p>
<ol>
<li>第一步打开终端,进到对应的用户目录下,找到你的<code>shell</code>配置文件<p><img src="/img/bVYLWE?w=1206&h=1316" alt="图片描述" title="图片描述"></p>
</li>
<li>
<p>修改对应的<code>shell</code>配置文件,若你安装过<code>oh_my_zsh</code>,打开<code>.zshrc</code>文件,若你是默认没有修改过就开<code>.bash_profile</code>文件</p>
<pre><code>alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
#alias atom="/Applications/Atom.app/Contents/MacOS/Atom"
alias vscode="/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code"</code></pre>
<p><img src="/img/bVYLWM?w=1210&h=134" alt="图片描述" title="图片描述"></p>
<p>添加图中对应的<code>alias</code>,图中应用程序路径是我自己的,你可以查看自己应用程序路径添加上</p>
</li>
<li>执行以下命令让你修改的配置文件生效<br><code>source ./.zshrc</code> 或者 <code>source ./.bash_profile</code>
</li>
</ol>
<p>在上面可以看出有关<code>atom</code>的那个别名被注释掉了,这个因为用<code>atom</code>别名打开一个文件或者目录的时候,后台应用程序被挂起,命令行不退出输入模式。如果退出输入模式那么<code>atom</code>应用程序也会被关闭。所以用别名指向应用程序的路径对<code>atom</code>是不可以行的。</p>
<p>那么对于<code>atom</code>怎么处理呢?<br>答案就是:在<code>atom</code>应用程序中,有个<strong>Install Shell Commonds</strong>功能选项<br><img src="/img/bVYLWQ?w=530&h=842" alt="图片描述" title="图片描述"><br><img src="/img/bVYLWS?w=902&h=294" alt="图片描述" title="图片描述"></p>
<p>点击之后在命令行就可以直接使用<code>atom</code>打开目录或者文件</p>
<hr>
<p><strong>最新的更新 2018-09-18</strong></p>
<p><code>vscode</code> 配置命令行的另一种简单的方法,利用 <code>vscode</code> 自身所带的命令</p>
<ol>
<li>首先 使用 快捷键 <code>commandOrcontrol + shift + p</code> 打开 <code>VScode</code> 的 命令输入框,输入 <code>Shell</code><br><img src="/img/bVbhaLG?w=1250&h=576" alt="图片描述" title="图片描述">
</li>
<li>选择在 <code>PATH 安装 code 命令</code>,然后成功安装</li>
<li>最后就可以在命令行中使用 <code>code</code> 命令操作 <code>vscode</code> 的了</li>
</ol>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"><br><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman认证使用篇(五)
https://segmentfault.com/a/1190000012056247
2017-11-17T20:00:43+08:00
2017-11-17T20:00:43+08:00
一步
https://segmentfault.com/u/yibuyou
14
<p><code>postman</code> <strong>认证</strong>使用篇(五)</p>
<h4>Authorization</h4>
<p>尽管请求编辑器已经足够强大去构造各种各样的请求,但是有的时候你的请求可能是需要认证,那么就可以尝试使用下面的认证功能了(由于认证的参数信息属于敏感数据,为了保证在协作环境中工作时数据的安全,建议使用变量)</p>
<p><img src="/img/bVYKwI?w=498&h=458" alt="图片描述" title="图片描述"></p>
<p>下面分别说明下拉选项中的认证方式:</p>
<h5>No Auth</h5>
<p>不需要认证,这是默认选中的</p>
<h5>Bearer Auth</h5>
<p><img src="/img/bVYKwL?w=1059&h=253" alt="图片描述" title="图片描述"></p>
<p>填写<strong>Token</strong>进行验证,<strong>JWT</strong>中有使用</p>
<h5>Basic Auth 基础身份验证</h5>
<p><img src="/img/bVYKwN?w=987&h=252" alt="图片描述" title="图片描述"></p>
<p>输入用户名和密码,直接发送明文数据,在点击<strong>Preview Request</strong>按钮就会自动在<strong>Headers</strong>中生成<strong>authorization</strong> header.</p>
<p>或者直接发送请求,也会自动把<strong>authorization</strong>header 添加到 <strong>Headers</strong> 中<br><img src="/img/bVYKwQ?w=912&h=113" alt="图片描述" title="图片描述"></p>
<h5>Digest Auth 摘要认证</h5>
<p>消息摘要式身份认证是在基本身份认证上面扩展了安全性,服务器为每一个连接生成一个唯一的随机数,客户端用这个随机数对密码进行<strong>MD5</strong>加密,然后返回服务器,服务器也用这个随机数对密码进行加密,然后和客户端传送过来的加密数据进行比较,如果一致就返回结果<br>客户端请求资源->服务器返回认证标示->客户端发送认证信息->服务器查验认证<br><img src="/img/bVYKwS?w=1419&h=562" alt="图片描述" title="图片描述"></p>
<p>过程:</p>
<ol>
<li>
<p>发送一个请求</p>
<pre><code> GET /auth/basic/ HTTP/1.1
HOST: target</code></pre>
</li>
<li>
<p>服务器返回401响应头,要求输入用户凭据</p>
<pre><code> HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Digest Encrypt",nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", opaque="0000000000000000",stale=false, algorithm=MD5, qop="auth"</code></pre>
</li>
<li>
<p>输入凭据后再发送请求</p>
<pre><code> GET /auth/digest/ HTTP/1.1
Accept: */*
Authorization: Digest username="LengWa", realm="Digest Encrypt", qop="auth", algorithm="MD5", uri="/auth/digest/", nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3", nc=00000001, cnonce="6092d3a53e37bb44b3a6e0159974108b", opaque="0000000000000000", response="652b2f336aeb085d8dd9d887848c3314"</code></pre>
</li>
<li><p>服务端验证通过后返回数据</p></li>
</ol>
<p>返回401请求头时,对于WWW-Authenticate 各个域的作用:</p>
<ul>
<li><p>realm: 是一个简单的字符串,一般是是邮件格式</p></li>
<li><p>qop: 是认证的(校验)方式,这个比较重要,对后面md5的加密过程有影响</p></li>
<li><p>nonce: 是一个字符串,唯一的、不重复的(还可以包含一些有用的信息,进行验证)</p></li>
<li><p>opaque: 是个字符串,它只是透传而已,即客户端还会原样返回过来</p></li>
<li><p>username: 用户认证的用户名</p></li>
<li><p>uri: 本次资源的位置</p></li>
<li><p>cnonce: 客户端随机参数的GUID</p></li>
<li><p>nc: 是认证的次数,因为如果认证失败,则仍然可以重新发送认证信息继续认证</p></li>
<li><p>response: 这个值很重要,是根据以上信息加上密码根据一定的顺序加密生成的MD5值,服务端在收到这个信息后,也根据相同的方式计算出这个值,而密码保存在服务端。服务端根据用户名去找密码,计算出MD5值,如果和客户端传过来一致,就认证通过,否则不通过</p></li>
</ul>
<h5>OAuth 1.0 / OAuth 2.0</h5>
<p>现在大多数授权登录都是基于 <strong>OAuth 2.0</strong></p>
<p>这两种认证方式,就不具体介绍了。网上讲解的比较多</p>
<p>不了解的可以看看这个文档:<a href="https://link.segmentfault.com/?enc=mJb7FUFcjk0b6m0kIaue5A%3D%3D.tl%2BOmVO6772LaLZrsoT82BSCPRj68xv6BXVLaPU7DMpB3thjD4rXpZZKn2NEljbBpDjJrJq8c5aKJHy%2B8nCSrg%3D%3D" rel="nofollow">理解OAuth</a></p>
<h5>Hawk authentication</h5>
<p><img src="/img/bVYKw4?w=1165&h=506" alt="图片描述" title="图片描述"></p>
<p><strong>hawk</strong>是一个<strong>HTTP</strong>认证方案,使用<strong>MAC</strong>(Message Authentication Code,消息认证码算法)算法,它提供了对请求进行部分加密验证的认证HTTP请求的方法,包括HTTP方法、请求URI和主机。</p>
<p><strong>hawk</strong>方案要求提供一个共享对称密匙在服务器与客户端之间,通常这个共享的凭证在初始TLS保护阶段建立的,或者是从客户端和服务器都可用的其他一些共享机密信息中获得的</p>
<p>举例过程:</p>
<ol>
<li>
<p>发起一个资源请求</p>
<pre><code>GET /resource/1?b=1&a=2 HTTP/1.1
Host: 127.0.0.1:8000</code></pre>
</li>
<li>
<p>服务器返回401响应头</p>
<pre><code>HTTP/1.1 401 Unauthorized
WWW-Authenticate: Hawk</code></pre>
</li>
<li>
<p>客户端之前已经获取一组<code>Hawk</code>访问资源的资格证书在对应的服务器上资格证书包含以下的属性:</p>
<pre><code>Key identifier(Hawk Auth ID): dh37fgj492je
Key(Hawk Auth Key): werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn
Algorithm: hmac-sha-256</code></pre>
</li>
<li>
<p>客户端通过计算时间戳来生成认证报头,并构造标准的请求字符串</p>
<pre><code>1353832234
GET
/resource/1?b=1&a=2
127.0.0.1
8000
some-app-data</code></pre>
</li>
<li><p>使用<code>Hawk</code>凭证中的<code>Algorithm</code>指定的加密算法加上<code>Key(Hawk Auth Key)</code>指定的<code>key</code>进行加密,之后把结果在经过<code>bae64</code>转码为<code>/uYWR6W5vTbY3WKUAN6fa+7p1t+1Yl6hFxKeMLfR6kk=</code></p></li>
<li>
<p>客户单在发送请求,在<code>Authorization</code>头字段包括<code>Key identifier(Hawk Auth ID)</code>指定的id,时间戳,以及加密生成的<code>MAC</code></p>
<pre><code>GET /resource/1?b=1&a=2 HTTP/1.1
Host: 127.0.0.1:8000
Authorization: Hawk id="dh37fgj492je", ts="1353832234", ext="some-app-data", mac="/uYWR6W5vTbY3WKUAN6fa+7p1t+1Yl6hFxKeMLfR6kk="</code></pre>
</li>
<li><p>服务端收到请求后再次按相同的算法计算出<code>MAC</code>,并验证<code>Hawk</code>凭证的有效性,如果验证通过就返回结果</p></li>
</ol>
<p>这个认证的方式 <code>npm</code>中有包,里面有案例,可以查看一下<a href="https://link.segmentfault.com/?enc=DmTR5fYdui%2Bbc4ldMoVvVw%3D%3D.Ub%2BW4vHElYikWpoZ1BZgPp%2BtBt31d85aoBWdBWN%2FYvJVj1itHEBKWSDj68hSjcOZ" rel="nofollow">hawk</a></p>
<p><a href="https://link.segmentfault.com/?enc=PzH3so7NPEjc1xEcRaD%2BZA%3D%3D.tJiCtMmvAhmPC6oNusfpUD67gNpvO%2BVJJvgDh1WsAihLAJug5WoIvrYVYnFWR5gBxICBkJRl%2FA0RpeQ8jrwBlv9QDqN%2Bh%2Bqo7N2SNti%2Btx4%3D" rel="nofollow">官方详细文档</a></p>
<h5>AWS Signature</h5>
<p><strong>AWS</strong>的使用者可以使用自定义的<strong>HTTP</strong>方案基于<strong>HMAC</strong>的加密算法去认证</p>
<p>参考文档</p>
<pre><code>[http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html)
[http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html](http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html)
</code></pre>
<p><a href="https://segmentfault.com/a/1190000011991458">postman 的基础使用篇(一)</a><br><a href="https://segmentfault.com/a/1190000011991614">postman发送请求使用篇(二)</a><br><a href="https://segmentfault.com/a/1190000012007906">postman响应使用篇(三)</a><br><a href="https://segmentfault.com/a/1190000012024844">postman的代理使用篇(四)</a></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman的代理使用篇(四)
https://segmentfault.com/a/1190000012024844
2017-11-15T22:48:58+08:00
2017-11-15T22:48:58+08:00
一步
https://segmentfault.com/u/yibuyou
2
<hr>
<p><code>postman</code> 的<strong>代理使用篇</strong>(四)</p>
<h4>Proxy</h4>
<h5>proxy(代理) 是什么</h5>
<p>在一个基本的网络会话中,一个客户端发送一个请求到服务器,服务器返回一个响应<br><img src="/img/bVYCms?w=671&h=243" alt="图片描述" title="图片描述"></p>
<p>一个代理服务是一个应用程序或者系统,作为一个中介在你的电脑和互联网之间。<br>客户端和服务器,代理以你的名义向网站,服务发送请求<br><img src="/img/bVYCmA?w=565&h=226" alt="图片描述" title="图片描述"></p>
<p>代理服务可以在你本地的机器上,或者你的网络上的一些地方,或者在你的客户端和目标服务之间的任何地方</p>
<h5>Configuring proxy settings 配置设置你的代理</h5>
<p>下面讲的是如何在postman上配置代理,让所有的请求通过一个代理服务区请求对应的服务器。</p>
<p><code>postman native app</code> 支持配置代理,你可以指定用<strong>custom proxy</strong>或者使用在操作系统定义的<strong>system proxy</strong><br><img src="/img/bVYCmD?w=709&h=450" alt="图片描述" title="图片描述"></p>
<p>如果你想在你应用使用相同的代理,你可以使用<strong>system proxy</strong>;<br>如果你想让来自postman的请求通过自定义代理服务器,请使用<strong>custom proxy</strong></p>
<h6>custom proxy</h6>
<p>postman 允许你自定义<code>HTTP</code>或者<code>HTTPS</code>代理在postman上.<br>换句话说:在postman上发送的所有请求都会通过你选择的代理服务器上.</p>
<p>过程:</p>
<ol>
<li><p>postman客户端发送一个请求到你选的代理服务器</p></li>
<li><p>代理服务器发送请求到目标服务器</p></li>
<li><p>目标服务器通过代理服务器进行响应</p></li>
</ol>
<p><img src="/img/bVYCmI?w=1500&h=338" alt="图片描述" title="图片描述"></p>
<p>自定义代理服务设置默认是关闭的,你可以通过右边的开关打开</p>
<p>适当的选择代理服务器类型,默认的<code>HTTP</code>和<code>HTTPS</code>都被选中的,这就意味着所有的<code>HTTP</code>和<code>HTTPS</code>请求都会经过代理服务器</p>
<blockquote><p>注意:输入代理服务地址的时候不带<code>protocol</code></p></blockquote>
<h6>system proxy</h6>
<p>如果你的所有的应用都使用相同的 代理,那么你就就有可能在操作系统级别有一个默认的代理配置。</p>
<p>使用<strong>system proxy settings</strong> 转发你在postman上<code>HTTP</code>或者<code>HTTPS</code>的请求通过你的操作系统默认的代理配置</p>
<p>过程:</p>
<pre><code>1.postman客户端发送一个请求通过操作系统默认配置,它转发你的请求到代理服务器
2. 系统代理服务器发送请求到目标服务器
3. 目标服务器通过系统配置代理服务器进行响应</code></pre>
<p><img src="/img/bVYCmO?w=1522&h=340" alt="图片描述" title="图片描述"></p>
<p>系统代理配置默认是开启的,所有的postman请求都会通过系统代理</p>
<blockquote><p>如果<strong>System Proxy</strong>和<strong>Custom Proxy</strong>都开启了,会优先考虑<strong>Custom Proxy</strong></p></blockquote>
<p><a href="https://segmentfault.com/a/1190000011991458">postman 的基础使用篇(一)</a><br><a href="https://segmentfault.com/a/1190000011991614">postman发送请求使用篇(二)</a><br><a href="https://segmentfault.com/a/1190000012007906">postman响应使用篇(三)</a></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman响应使用篇(三)
https://segmentfault.com/a/1190000012007906
2017-11-14T21:56:06+08:00
2017-11-14T21:56:06+08:00
一步
https://segmentfault.com/u/yibuyou
4
<h4>Responses</h4>
<p>确保<code>API</code>响应正确是在使用<code>API</code>时要做的事情.<br>一个<code>API</code>响应包含响应体<strong>body</strong>,响应头<strong>headers</strong>,状态码<strong>status code</strong><br>postman组织响应体和响应头在不同的<code>tab</code>.状态码,调用<code>API</code>响应的时间,响应的大小在旁边的<code>tab</code>显示,你可以把鼠标放上去显示描述的详细的信息<br><img src="/img/bVYxXb?w=1607&h=251" alt="图片描述" title="图片描述"></p>
<h5>Saving responses 保存响应</h5>
<p><img src="/img/bVYxXh?w=313&h=108" alt="图片描述" title="图片描述"><br>如果一个请求已经保存在收藏夹中,你可以为这个请求保存这个响应。<br>一旦这个响应返回,点击保存按钮,输入一个保存响应的名称。当你加载这个请求时,所有为这个请求保存的响应都是可以使用的。点击 <strong>Examples</strong> 下拉按钮,可以选择你要查看的响应<br><img src="/img/bVYxXl?w=1604&h=167" alt="图片描述" title="图片描述"></p>
<h5>responses body 查看响应体</h5>
<p>postman响应体<strong>Body</strong>工具栏提供几个工具帮你很快的查看内容。<br>有三种查看方式: pretty, raw, preview<br><img src="/img/bVYxXo?w=474&h=138" alt="图片描述" title="图片描述"></p>
<p><strong>Pretty</strong></p>
<p>以漂亮的模式去格式化响应的JSON或者XML方便更好的去查看。在这个模式中响应数据内容中的链接是高亮显示并且可以点击去发送请求的。还可以点击下拉选项选择以什么方式去格式化响应的数据</p>
<hr>
<p>postman 是根据响应的<code>Content-Type header</code>的值去确定自动格式化的方式,如果postman没有自动格式化,你可以强制格式化通过<code>JSON</code>或者<code>XML</code>.你可以在<code>Settings</code>中的<code>General</code> 的 <code>Language detection</code>进行下拉选择<br><img src="/img/bVYxXq?w=708&h=370" alt="图片描述" title="图片描述"></p>
<hr>
<p><strong>Raw</strong></p>
<p>仅仅是响应体的一个大文本,可以告诉你响应体是否压缩了</p>
<hr>
<p><strong>Preview</strong></p>
<p>在一个沙盒的<code>iframe</code> 中渲染响应的内容。一些web框架默认的返回错误的<code>HTML</code>,这时候<code>Preview</code> 是非常有用的。由于<code>iframe</code>沙盒的限制,JS和图片是不可以用的</p>
<hr>
<p>如果<code>API</code>请求返回一个图片,postman将识别并自动渲染它.对于二进制的响应类型,你可以选择<strong>“Send and download</strong> 保存响应到硬盘上。你可以使用合适的方式查看他.可以灵活的测试<code>audio files, PDFs, zip files, or anything</code><br><img src="/img/bVYxXA?w=281&h=136" alt="图片描述" title="图片描述"></p>
<h5>responses Headers 查看响应头</h5>
<p>展示键-值对,鼠标放到<code>header name</code> 能够给出详细的描述。<br>如果你发送一个<code>HEAD</code> 请求,将默认展示<code>Headers</code> tab</p>
<h5>Response time 响应时间</h5>
<p>postman自动计算服务器响应到达的时间,这对平台的初步测试时非常有用的的</p>
<h5>Response size 响应大小</h5>
<p>postman 分解响应的的大小为<code>body</code>和<code>headers</code>,响应的大小是近似计算的</p>
<h5>Response Cookie 响应Cookie</h5>
<p>服务器返回的<code>Cookie</code>在一个专门的tab中。在<code>native apps</code>你可以利用<strong>manage cookies</strong>的功能去管理<code>Cookie</code>,在<code>Chrome app</code> 你可以用<code>Interceptor extension</code>去管理<code>Cookie</code></p>
<h5>Response Tests 响应测试</h5>
<p>随着你收到服务器响应请求的数据同时,你也可以看到一些测试结果。<br>对于该部分会放到<code>Scripts</code>脚本篇进行详解<br><img src="/img/bVYxXE?w=1029&h=702" alt="图片描述" title="图片描述"></p>
<p><a href="https://segmentfault.com/a/1190000011991458">postman 的基础使用篇(一)</a><br><a href="https://segmentfault.com/a/1190000011991614">postman发送请求使用篇(二)</a></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"><br><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman发送请求使用篇(二)
https://segmentfault.com/a/1190000011991614
2017-11-13T22:11:50+08:00
2017-11-13T22:11:50+08:00
一步
https://segmentfault.com/u/yibuyou
2
<p><code>postman</code> <strong>发送请求使用篇</strong></p>
<h4>Requests</h4>
<p>在<code>Builder</code>选项卡下面,可以让你很快的创建<code>Http</code>请求,包含四部分:<code>URL</code>,<code>Method</code>,<code>headers</code>,<code>body</code></p>
<h5>URL</h5>
<p>这是发送一个请求需要设置的第一件事情,<code>URL</code>输入框会保存之前使用过的<code>URL</code>,当你输入的时候回自动下拉显示出来。</p>
<p>点击<strong>Params</strong>那按钮,打开输入URL参数的编辑器,你可以添加键-值对,postman会自动合并为<code>query string</code>放到URL参数上。如果URL上已经有参数,会自定分割参数到数据编辑中<br><img src="/img/bVYtIe?w=1406&h=220" alt="图片描述" title="图片描述"></p>
<p>你在参数输入框中输入的数据不会自动<code>URL-encoded</code>,你可以按照下面这个做,进行<code>encoded</code>,第一步点击右边的<strong>Bulk Eit</strong>然后选中需要编码的数据,右键选着<code>EncodeURIComponent</code><br><img src="/img/bVYtIh?w=624&h=382" alt="图片描述" title="图片描述"></p>
<blockquote><p>postman会自定添加<code>http://</code>在url开头,如果没有指定协议的话</p></blockquote>
<p>一些API端点出是路径变量:<br><code>https://api.library.com/:entity/</code></p>
<p>为了编辑路径变量,点击<strong>Params</strong>,可以看到已经作为一个<code>key</code>存在,根据你的需要更新这个值。<br><img src="/img/bVYtIi?w=1515&h=294" alt="图片描述" title="图片描述"></p>
<h5>Headers</h5>
<p>点击<code>Headers</code>功能会打开<code>headers</code>键-值对的编辑框,你可以设置任意的头名称,将会自动下拉出现公共的<code>HTTP</code>头类型,而且<code>Content-Type</code>类型的值也会自动下拉出现</p>
<blockquote><p>受限制的<code>headers</code>:如果你使用Chrome app,一些头字段是受Chrome和XMLHttpRequest 规范限制的,你可以使用 <strong>Interceptor extension</strong>发送受限制的头信息</p></blockquote>
<h5>Cookies</h5>
<p>Cookie可以使用<code>manage cookies</code>功能被管理在<code>native apps</code>,管理每个域名下面的<code>Cookie</code><br><img src="/img/bVYtIm?w=1357&h=486" alt="图片描述" title="图片描述"></p>
<h5>Header presets(预先设置)</h5>
<p>你可以保存你经常使用的<code>headers</code>,在<code>header preset</code>中,在<code>Headers tab</code>下面。当你在<code>Headers</code>输入框中输入时,会自动下拉出来<br><img src="/img/bVYtIy?w=1357&h=718" alt="图片描述" title="图片描述"></p>
<h5>Method</h5>
<p>直接修改请求的方法<br><img src="/img/bVYtIz?w=265&h=527" alt="图片描述" title="图片描述"></p>
<h5>Body</h5>
<p>当构建一个请求的时候,你可能需要一些请求体来进行工作.请求体的编辑区域根据不同的请求体类型分为四个区域</p>
<p>当你通过http协议发送一个请求的时候,服务器期望接收一个<code>Content-Type</code>头信息,这个<code>Content-Type</code>头信息让服务器正确的解析请求体信息。对于<code>form-data</code>和<code>urlencoded </code>类型,postman会自动设置<code>Content-Type</code>,不需要你去设置它。对于<code>raw</code>模式会根据你选着的格式类型去设置,如果你手动设置就会覆盖postman设置的值。对于<code>binary</code>postman不设置任何的<code>Content-Type</code>类型<br><img src="/img/bVYtII?w=759&h=329" alt="图片描述" title="图片描述"></p>
<blockquote><p>form-data----->multipart/form-data<br>x-www-form-urlencoded---->application/x-www-form-urlencoded</p></blockquote>
<p><a href="https://segmentfault.com/a/1190000011991458?_ea=2831076">postman 的基础使用篇(一)</a></p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>
postman 的基础使用篇(一)
https://segmentfault.com/a/1190000011991458
2017-11-13T22:00:55+08:00
2017-11-13T22:00:55+08:00
一步
https://segmentfault.com/u/yibuyou
9
<p><code>postman</code> 是接口调试的利器,之前以<code>chrome</code>插件的形式,现在也有原生APP。</p>
<h4>安装</h4>
<h5>native apps</h5>
<p>直接官方网站下载即可</p>
<p><a href="https://link.segmentfault.com/?enc=WwqEgq52qD5G%2FzS678BSTQ%3D%3D.rBRnxXjXyLDo0RXMv33qCKzP7aSrdmhZxC%2FTA3DC8LE%3D" rel="nofollow">download page</a></p>
<h5>Chrome app</h5>
<p>去<code>chrome</code>应用商店直接搜索<code>postman</code>下载安装即可</p>
<h4>数据迁移</h4>
<ol>
<li><p>如果你有账户,登录庄户后就会自动同步</p></li>
<li>
<p>如果没有账户,</p>
<ul>
<li><p>你可以导出全部数据,然后在导入数据<br><img src="/img/bVYtFi?w=1540&h=630" alt="图片描述" title="图片描述"></p></li>
<li><p>你也可以导出你想要一部分数据<br><img src="/img/bVYtFu?w=632&h=378" alt="图片描述" title="图片描述"></p></li>
</ul>
</li>
</ol>
<h4>发送请求</h4>
<h5>操作步骤:</h5>
<p><img src="/img/bVYtFF?w=1899&h=635" alt="图片描述" title="图片描述"></p>
<h5>原理:</h5>
<p><img src="/img/bVYtFV?w=946&h=489" alt="图片描述" title="图片描述"></p>
<h4>创建收藏夹</h4>
<p>正常情况下,每个请求都会在左边栏的<code>History</code>留下记录,但是请求多的话,你想要重复某个请求就不方便了,所以可以把你想保留的请求按照分类收藏起来,以方便以后使用。</p>
<p><img src="/img/bVYtF6?w=1600&h=739" alt="图片描述" title="图片描述"></p>
<h4>设置</h4>
<p>在App头部的导航栏,点击小扳手的图标,选中<code>Settings</code>打开设置的弹出框<br><img src="/img/bVYtF7?w=291&h=185" alt="图片描述" title="图片描述"></p>
<h5>General</h5>
<ul>
<li><p>Trim keys and values in request body(去除请求体中的键和值的空格):如果使用<code>form-data</code>或者<code>url-encoded</code> 应该关闭开功能</p></li>
<li><p>Language detection(语言判断):设置成<code>JSON</code>将强制以<code>JSON</code>进行渲染,和响应头的<code>Content-Type</code>无关</p></li>
<li><p>Request Timeout in ms(0 for infinity):设置请求超时的时间</p></li>
<li><p>Send no-cache header:发送一个<code>no-cache</code>请求头,获取服务器最新的资源</p></li>
<li><p>Automatically follow redirects:防止服务返回300系列的状态,自动重定向</p></li>
<li>
<p>Send anonymous usage data to Postman:是否循序匿名向postman发送数据</p>
<p>其他的都可以默认配置<br><img src="/img/bVYtGe?w=729&h=550" alt="图片描述" title="图片描述"></p>
</li>
</ul>
<h5>Themes</h5>
<p>有黑白两种主题可以选择</p>
<h5>Shortcuts</h5>
<p>应用快捷键</p>
<h5>Data</h5>
<p>数据的导入导出</p>
<h5>Add-ons</h5>
<p>postman的命令行协助扩展工具<code>newman</code>,可以让postman的collection和构建系统整合起来,<br>可以通过corn自动测试API接口<a href="https://link.segmentfault.com/?enc=Hmu6VfNFqrL84eIC7xuFVg%3D%3D.oP4f9WIzp0xqKcEDVbcRvr6gMoQ4%2B%2Fin9TyPilHTY3mN4z4O0deDnbN%2BMe6DhkWHx%2FgL4Tyfjy5zKLu7NR79tPpIVBRj7Vd2%2BGyP10EjyQ8pBNEhUOenrbsfOjSLj81m" rel="nofollow">文档</a></p>
<h5>Sync</h5>
<p>同步账户数据</p>
<h5>Certificates</h5>
<p>在一个基础域名下。添加客户端证书</p>
<h5>Proxy</h5>
<p>设置API请求的代理</p>
<h5>Update</h5>
<p>应用更新</p>
<h5>About</h5>
<p>应用的信息</p>
<p><img src="/img/bVYtGJ?w=314&h=214" alt="图片描述" title="图片描述"></p>
<p><strong>扫描关注,查看更多文章,提高编程能力</strong></p>