Kaynağa Gözat

Gitbook Auto Published

willin 8 yıl önce
ebeveyn
işleme
2431bc2bf0

+ 9 - 2
SUMMARY.md

@@ -14,7 +14,9 @@
     - [Electron](project/source/electron.md)
     - [UDP](project/source/udp.md)
     - [NativeScript](project/source/nativescript.md)
+    - [Koa](project/source/koa.md)
   - JavaScript
+    - [Promise](project/js/promise.md)
     - [ES6/7](project/js/es6.md)
     - [Benchmark](project/js/benchmark.md)
     - [Test](project/js/test.md)
@@ -26,7 +28,9 @@
     - [Fetch AJAX](project/fe/fetch.md)
     - [前端库](project/fe/packages.md)
   - [Tool](project/tool/README.md)
+    - [代码管理GIT](project/tool/git.md)
     - [包管理NPM](project/tool/npm.md)
+    - [文档GitBook](project/tool/gitbook.md)
     - [Babel](project/tool/babel.md)
     - [守护进程PM2](project/tool/pm2.md)
     - [造轮子(NPM)篇](project/tool/tool.md)
@@ -45,6 +49,9 @@
 - [能力](basic/README.md)
   - [问题处理能力](basic/solving.md)
   - 基础常识
+    - [在线资源](basic/online.md)
+    - [离线资源](basic/offline.md)
+    - [OS X](basic/osx.md)
     - [HTTP](basic/http.md)
-
-
+    - [Hexo静态博客搭建](basic/hexo.md)
+    - [翻|越G|F|W](basic/ss.md)

BIN
_static/basic/04.01.png


BIN
_static/basic/04.02.png


BIN
_static/basic/05.00.png


BIN
_static/basic/05.01.png


BIN
_static/basic/05.02.png


BIN
_static/basic/05.03.png


BIN
_static/basic/06.00.png


BIN
_static/basic/06.01.png


BIN
_static/basic/image1.png


BIN
_static/basic/image10.png


BIN
_static/basic/image11.png


BIN
_static/basic/image12.png


BIN
_static/basic/image13.png


BIN
_static/basic/image2.png


BIN
_static/basic/image3.png


BIN
_static/basic/image4.png


BIN
_static/basic/image5.png


BIN
_static/basic/image6.png


BIN
_static/basic/image7.png


BIN
_static/basic/image8.png


BIN
_static/basic/image9.png


BIN
_static/project/rebase.jpg


BIN
_static/project/reset.jpg


+ 334 - 0
basic/hexo.md

@@ -0,0 +1,334 @@
+# Hexo搭建静态博客
+
+## 1. 环境
+
+### 1.1 安装Git
+
+### 1.2 安装node.js
+
+**1. 安装nvm**
+
+使用crul方式安装:
+
+> $curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
+
+> $echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \  --cache=$HOME/.npm/.cache/cnpm \  --disturl=https://npm.taobao.org/dist \  --userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc
+
+**2. 使用nvm安装node.js**
+
+> $nvm install node
+
+> $nvm alias default node
+
+## 2. 配置Github
+
+### 2.1 建立Respository
+
+建立与你用户名对应的仓库,仓库名必须为【**your_user_name**.github.io】
+
+### 2.2 配置SSH-Key
+
+参考:[Windows下Git安装指南](http://www.cnblogs.com/zhcncn/p/3787849.html)
+
+##3. 安装Hexo
+
+###3.1 Installation
+打开Git命令,执行如下命令
+
+> $ cnpm install -g hexo
+
+###3.2 Quick Start
+
+**1. Setup your blog**
+
+在电脑中建立一个名字叫「Hexo」的文件夹(比如我建在了D:\Hexo),然后在此文件夹中右键打开Git Bash。执行下面的命令
+
+> $ hexo init
+
+> [info] Copying data
+
+> [info] You are almost done! Don't forget to run `cnpm install` before you start blogging with Hexo!
+
+Hexo随后会自动在目标文件夹建立网站所需要的文件。然后按照提示,运行 cnpm install(在 /D/Hexo下)
+
+> cnpm install
+
+会在D:\Hexo目录中安装 node_modules。
+
+**2. Start the server**
+
+运行下面的命令(在 /D/Hexo下)
+
+> $ hexo server
+
+> [info] Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.
+
+表明Hexo Server已经启动了,在浏览器中打开 [http://localhost:4000/](http://localhost:4000/),这时可以看到Hexo已为你生成了一篇blog。
+
+你可以按Ctrl+C 停止Server。
+
+**3. Create a new post**
+
+新打开一个git bash命令行窗口,cd到/D/Hexo下,执行下面的命令
+
+> $ hexo new "My New Post"
+
+> [info] File created at d:\Hexo\source\_posts\My-New-Post.md
+
+刷新http://localhost:4000/,可以发现已生成了一篇新文章 "My New Post"。
+
+**NOTE:**
+
+有一个问题,发现 "My New Post" 被发了2遍,在Hexo server所在的git bash窗口也能看到create了2次。
+
+> $ hexo server
+
+> [info] Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.
+
+> [create] d:\Hexo\source\_posts\My-New-Post.md
+
+> [create] d:\Hexo\source\_posts\My-New-Post.md
+
+经验证,在hexo new "My New Post" 时,如果按Ctrl+C将hexo server停掉,就不会出现发2次的问题了。
+
+所以,在hexo new文章时,需要stop server。
+
+**4. Generate static files**
+
+执行下面的命令,将markdown文件生成静态网页。
+
+> $ hexo generate
+
+该命令执行完后,会在 D:\Hexo\public\ 目录下生成一系列html,css等文件。
+
+**5. 编辑文章**
+
+hexo new "My New Post"会在D:\Hexo\source\_posts目录下生成一个markdown文件:My-New-Post.md
+
+可以使用一个支持markdown语法的编辑器(比如 Sublime Text 2)来编辑该文件。
+
+**6. 部署到Github**
+
+部署到Github前需要配置_config.yml文件,首先找到下面的内容
+
+```
+# Deployment
+## Docs: http://hexo.io/docs/deployment.html
+deploy:
+ type:
+```
+
+然后将它们修改为
+
+```
+# Deployment
+## Docs: http://hexo.io/docs/deployment.html
+deploy:
+ type: git
+ repository: git@github.com:zhchnchn/zhchnchn.github.io.git
+ branch: master
+```
+
+**NOTE1:**
+
+Repository:必须是SSH形式的url(git@github.com:zhchnchn/zhchnchn.github.io.git),而不能是HTTPS形式的url(https://github.com/zhchnchn/zhchnchn.github.io.git),否则会出现错误:
+
+> $ hexo deploy
+
+> [info] Start deploying: github
+
+> [error] https://github.com/zhchnchn/zhchnchn.github.io is not a valid repositor URL!
+
+使用SSH url,如果电脑没有开放SSH 端口,会致部署失败。
+
+> fatal: Could not read from remote repository.
+
+> Please make sure you have the correct access rights
+and the repository exists.
+
+**NOTE2:**
+
+如果你是为一个项目制作网站,那么需要把branch设置为gh-pages。
+
+**7. 测试**
+
+当部署完成后,在浏览器中打开[http://our_user_name.github.io/](https://our_user_name.github.io/) ,正常显示网页,表明部署成功。
+
+**8. 总结:部署步骤**
+
+每次部署的步骤,可按以下三步来进行。
+
+> hexo clean
+
+> hexo generate
+
+> hexo deploy
+
+**9. 总结:本地调试**
+
+1. 在执行下面的命令后,
+
+> $ hexo g #生成
+
+> $ hexo s #启动本地服务,进行文章预览调试
+
+浏览器输入http://localhost:4000,查看搭建效果。此后的每次变更_config.yml 文件或者新建文件都可以先用此命令调试,尤其是当你想调试新添加的主题时。
+
+2. 可以用简化的一条命令
+
+> hexo s -g
+
+###3.3 总结
+####3.3.1 常用命令
+>hexo new "postName" #新建文章
+
+> hexo new page "pageName" #新建页面
+
+> hexo generate #生成静态页面至public目录
+
+> hexo server #开启预览访问端口(默认端口4000,'ctrl + c'关闭server)
+
+> hexo deploy #将.deploy目录部署到GitHub
+
+> hexo help  # 查看帮助
+
+> hexo version  #查看Hexo的版本
+
+####3.3.2 复合命令
+
+> hexo deploy -g  #生成加部署
+
+> hexo server -g  #生成加预览
+
+命令的简写为:
+
+> hexo n == hexo new
+
+> hexo g == hexo generate
+
+> hexo s == hexo server
+
+>hexo d == hexo deploy
+
+##4. 配置Hexo
+
+#### [配置参考: http://ibruce.info/2013/11/22/hexo-your-blog/](http://ibruce.info/2013/11/22/hexo-your-blog/)
+
+
+
+# 配合Travis CI,将Hexo博客自动部署到github上
+
+## 1. 新建代码仓库
+
+新建一个代码仓库,有一个注意点,若仓库取名为【**your_user_name**.github.io】,则需要新建一个分支用来放.md文件,因为html文件会自动部署到master上。若仓库名只是普通的名称,则可以将.md文件放到master分支上,但这时需要新建一个分支gh-pages用来放html文件。
+
+这里,我们就使用了【**your_user_name**.github.io】这样的仓库名,取名为Hexo.github.io,新建一个分支,取名为raw。
+
+Clone到本地
+```
+git clone -b raw <仓库克隆URL> #只Clone出新建的raw分支 保留master分支用于部署
+```
+
+## 2. 安装Node.js和Hexo
+
+请参考[2.1 Hexo搭建](https://crabxlab.gitbooks.io/fs-guide/content/front/hexo_create.html)
+
+## 3. 使用Travis CI
+
+首先我们先打开[Travis CI](https://travis-ci.org/),可以在右上角找到使用GitHub登陆的按钮。
+![travis ci](/_static/basic/travis.png)
+
+授权完成后,你可以在左上角找到My Repositories一旁的加号“+”,点击它,它就会列出你所有的仓库,你只需要找到刚才的 hexo.github.io 并把它左侧的开关打开就可以了。
+
+![img](/_static/basic/04.01.png)
+![img](/_static/basic/04.02.png)
+
+## 4. 生成GitHub Personal Access Token
+登录GitHub,在右上角头像处进入设置。
+
+![img](/_static/basic/05.00.png)
+
+在左侧找到 Personal access tokens,并点击右上角的 Generate new token。
+
+![img](/_static/basic/05.01.png)
+
+需要为新的Token输入一个名字,这里我们就填入 Travis CI 好了。
+
+![img](/_static/basic/05.02.png)
+
+确定生成后,Token将显示在页面上,此时需要将其复制并保存好,并避免泄露。遗忘Token后不能找回,只能重新生成。
+
+![img](/_static/basic/05.03.png)
+
+最后,我们还需要[生成随机字符串](https://www.random.org/strings/?num=10&len=20&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new),并在其中选择一行随机字符串,为下文备用。
+
+## 5. 配置Travis CI
+首先在Travis CI中找到已经启用自动构建的仓库,并在右侧找到设置按钮。
+
+![img](/_static/basic/06.00.png)
+
+注意:该图片中的仓库名称为SumiMakito.github.io,但我们这里的名称应该为Hexo.github.io。
+
+有两处需要设置,首先需要启用 Build only if .travis.yml is present 选项,以避免 master 分支被构建和陷入构建循环的问题。
+
+另外,在下方的环境变量设置处,我们需要设置两组变量,并注意保持 Display value in build log 禁用,以免构建日志泄露Token等信息。
+
+```
+#需要设置的两组变量
+GitHubKEY = 上文生成的GitHub Personal Access Token
+NOTIFY_TOKEN = 上文生成的随机字符串
+```
+
+![img](/_static/basic/06.01.png)
+
+在每次Push后,Travis CI将检查分支下的 .travis.yml 文件,并以此作为配置进行构建。
+
+在分支下新建.travis.yml和build.sh。下面是我所使用的 .travis.yml :
+
+```yml
+language: node_js
+node_js:
+  - "0.12"
+install:
+  - npm install hexo-cli -g
+  - npm install hexo --save
+  - npm install
+script:
+  - chmod +x ./build.sh
+  - ./build.sh > /dev/null
+branches:
+  only:
+    - raw
+```
+
+  在这里,配置文件限制了自动构建工作只会在 raw 分支下进行。
+
+  下面是我所使用的build.sh:
+
+```
+hexo generate #生成静态整站
+cd ./public #生成的静态页面会存储在public目录下
+git init
+git config --global push.default matching
+git config --global user.email "username@example.com" #填入GitHub的邮箱地址
+git config --global user.name "username" #填入GitHub的用户名
+git add --all .
+git commit -m "Travis CI Auto Builder" #自动构建后的内容将全部以此信息提交
+git push --quiet --force https://${GitHubKEY}@github.com/你的GitHub用户名/你的代码仓库名.git master  #自动构建后的内容将全部以此信息提交
+curl --connect-timeout 20 --max-time 30 -s http://远端服务器URL/webhook.php?_=${NOTIFY_TOKEN} #服务器Webhook 将在下文介绍
+```
+
+## 6. 测试
+
+还记得之前的Hexo文件夹吗?
+
+```
+cd ./HexoBlog
+hexo new hello-ci #本地没有Hexo的话可以直接跳过这一步
+vim ./source/_posts/hello-ci.md
+git add --all .
+git commit -m "Hello, CI!"
+git push #将代码push到raw分支上
+```
+
+登陆相应网址进行效果查看。

+ 53 - 0
basic/offline.md

@@ -0,0 +1,53 @@
+# 离线资源
+
+## 系统工具
+
+* **Oh My Zsh:** [http://ohmyz.sh/](http://ohmyz.sh/)
+* **iTerm:** [http://www.iterm2.com/](http://www.iterm2.com/)
+* HomeBrew: [http://brew.sh/](http://brew.sh/)
+* XtraFinder: [http://www.trankynam.com/xtrafinder/](http://www.trankynam.com/xtrafinder/)
+* iStat Menus (系统状态监控)
+* Bartender (状态栏图标管理)
+* Skim: [http://skim-app.sourceforge.net/](http://skim-app.sourceforge.net/) (PDF阅读)
+* Moom (调整窗口大小)
+* Autojump (Terminal自动定位到目录的神器): brew install autojump (然后修改 `.zshrc` 在 `plugins` 里面加上`autojump`)
+
+
+## IDE
+
+* **Atom:** <https://atom.io/>
+* WebStorm *(收费)*: [http://www.jetbrains.com/webstorm/](http://www.jetbrains.com/webstorm/)
+* Sublime Text 3: [http://www.sublimetext.com/3](http://www.sublimetext.com/3)
+* MacDown: [http://macdown.uranusjr.com/](http://macdown.uranusjr.com/)
+
+## 浏览器插件
+
+### Chrome
+
+Chrome Dev: [https://dl.google.com/chrome/mac/dev/GoogleChrome.dmg](https://dl.google.com/chrome/mac/dev/GoogleChrome.dmg)
+
+* **梯|子 Proxy SwitchyOmega:** [https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif](https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)
+* **正则工具 RegExp Tester App:** [https://chrome.google.com/webstore/detail/regexp-tester-app/cmmblmkfaijaadfjapjddbeaoffeccib](https://chrome.google.com/webstore/detail/regexp-tester-app/cmmblmkfaijaadfjapjddbeaoffeccib)
+* **取色器 ColorZilla:** [https://chrome.google.com/webstore/detail/bhlhnicpbhignbdhedgjhgdocnmhomnp](https://chrome.google.com/webstore/detail/bhlhnicpbhignbdhedgjhgdocnmhomnp)
+* **JSON美化 JsonView:** [https://chrome.google.com/webstore/detail/jsonview-jsonviewer-json/hdmbdioamgdkppmocchpkjhbpfmpjiei](https://chrome.google.com/webstore/detail/jsonview-jsonviewer-json/hdmbdioamgdkppmocchpkjhbpfmpjiei)
+* **模拟请求 Postman:** [https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm](https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm)
+* 服务器环境嗅探 ChromeSnifferPlus: [https://github.com/justjavac/ChromeSnifferPlus](https://github.com/justjavac/ChromeSnifferPlus)
+* 时间戳 Utime: [https://chrome.google.com/webstore/detail/utime/kpcibgnngaaabebmcabmkocdokepdaki](https://chrome.google.com/webstore/detail/utime/kpcibgnngaaabebmcabmkocdokepdaki)
+
+### FireFox
+
+* **调试工具 FireBug:** [https://addons.mozilla.org/zh-CN/firefox/addon/firebug/](https://addons.mozilla.org/zh-CN/firefox/addon/firebug/)
+* **取色器 ColorZilla:** [https://addons.mozilla.org/zh-CN/firefox/addon/colorzilla/](https://addons.mozilla.org/zh-CN/firefox/addon/colorzilla/)
+* **JSON美化 JsonView:** [https://addons.mozilla.org/zh-CN/firefox/addon/jsonview/](https://addons.mozilla.org/zh-CN/firefox/addon/jsonview/)
+* **模拟请求 RESTClient:** [https://addons.mozilla.org/zh-CN/firefox/addon/restclient/](https://addons.mozilla.org/zh-CN/firefox/addon/restclient/)
+
+## 前端工具
+
+* PNG图片压缩: [https://pngquant.org/](https://pngquant.org/)
+
+### Node.js
+
+* NVM: [https://github.com/creationix/nvm](https://github.com/creationix/nvm)
+* CNPM: [http://npm.taobao.org/](http://npm.taobao.org/)
+* Labeb: <https://github.com/mohebifar/lebab> (ES5代码转ES6工具)
+* Babel: <https://github.com/babel/babel> (ES6代码转ES5工具)

+ 21 - 0
basic/online.md

@@ -0,0 +1,21 @@
+# 在线资源
+
+## 前端工具
+
+* CSS Sprite: [http://www.spritebox.net/](http://www.spritebox.net/)
+* CSS兼容性查询: [http://browserhacks.com/](http://browserhacks.com/)
+* JPG压缩: [https://tinyjpg.com/](https://tinyjpg.com/)
+* 图片压缩: [https://compressor.io/](https://compressor.io/)
+* 图片转文字: [http://photo2text.com/](http://photo2text.com/)
+* CSSTidy: [http://www.css88.com/tool/csstidy/](http://www.css88.com/tool/csstidy/)
+
+## 代码运行
+
+* <http://jsbin.com/>
+* <http://codepen.io/pen/>
+* <https://jsfiddle.net/>
+
+## 工具箱
+
+* <http://tool.oschina.net/>
+* <http://tool.lu/>

+ 34 - 0
basic/osx.md

@@ -0,0 +1,34 @@
+# OS X
+
+## 应用安装
+
+> 系统偏好设置 -> 安全性与隐私 -> 允许从以下位置下载的应用  -> 改为“任何来源”
+
+<!-- ## 关闭SIP
+
+重启Mac,按CMD+R,进入recovery界面,在顶部工具栏选择“终端”:
+
+```
+csrutil disable
+``` -->
+
+## 安装Xcode
+
+以及 Command Line Tools
+
+
+## 本地DNS配置
+
+Localhost下的泛域名指定
+
+需要先安装 `brew` (离线资源)
+
+```
+brew install dnsmasq
+mkdir -pv $(brew --prefix)/etc/
+echo 'address=/.cxl/10.2.1.86' > $(brew --prefix)/etc/dnsmasq.conf
+sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
+sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
+sudo mkdir -v /etc/resolver
+sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/cxl'
+```

+ 71 - 0
basic/ss.md

@@ -0,0 +1,71 @@
+## Shad0ws0cks
+
+  Shad0ws0cks是一款轻量级socks代理软件,速度快,而且可以跨平台使用。 在这里假定我们已经获取到账号.
+
+下载:
+
+Shad0ws0cks-windows: <https://github.com/Shad0ws0cks/Shad0ws0cks-windows/releases>
+
+os-x: <https://github.com/Shad0ws0cks/Shad0ws0cksX-NG/releases>
+
+ (把0改为o)
+
+找到安装包解压,右键shad0ws0cks.exe,以管理员身份运行,在任务栏里面找到图标,右键,服务器->编辑服务器
+
+![](/_static/basic/image1.png)
+
+根据购买的服务器帐号信息,添加服务器IP,端口,密码,点击确定,如果有多个账号,就点击添加,最后确定。
+
+然后程序就会自动连接服务器.
+
+![](/_static/basic/image2.png)
+
+然后通过 Firefox 下的 Autoproxy 或者 Chrome 下的 SwichyOmega 之类惯用的扩展插件设置一下 SOCKS 5 代理服务
+
+这里讲一下Chrome 下的 SwichyOmega:
+
+下载:
+SwichyOmega:[https://github.comShad0ws0cks/FelisCatus/SwitchyOmega/releases](https://github.com/FelisCatus/SwitchyOmega/releases)
+
+![](/_static/basic/image3.png)
+
+下载.rcx文件,下载完成拖入谷歌扩展程序列表安装并开启.安装完毕后会自动开启选项界面:
+
+![](/_static/basic/image4.png)
+
+这里有一段介绍性的教程。如果想了解SwitchyOmega的不妨跟着教程走一遍。
+
+点击proxy情景模式:
+
+![](/_static/basic/image5.png)
+
+按照选择的代理服务器要求填写以上红线部分,这里用的是Shad0ws0cks,所以代理协议选择socks5,代理端口号为刚刚在编辑服务器时设置的本机端口号。
+
+点击选择自动代理情景模式
+
+![](/_static/basic/image6.png)
+
+添加条件设置,即添加需要永久自动启动代理访问的域名:
+
+![](/_static/basic/image7.png)
+
+就可以使得这些域名通配符匹配的域名可以通过代理访问,永久的(即以后浏览这些网站都自动使用代理模式)。
+除了在选项界面添加条件,也可以在浏览器右上角小图标设置,如下:
+
+![](/_static/basic/image8.png)
+
+点击添加条件
+
+![](/_static/basic/image9.png)
+
+或者点击资源未加载
+
+![](/_static/basic/image10.png)
+
+就可以添加到自动代理模式。
+
+但是,有些网站有时候抽风需要翻墙访问,有时候不需要,那就可以临时设置代理模式,默认是直接连接,如下:
+
+![](/_static/basic/image11.png)
+
+点击proxy,此时,就可以访问临时需要翻墙的网站了。图标为![](/_static/basic/image12.png)时为直接连接,图标为![](/_static/basic/image13.png)时为代理模式。

+ 66 - 0
operation/shell.md

@@ -72,3 +72,69 @@ top -d 2 -c -p 123456 #//每隔2秒显示pid是12345的进程的资源使用情
 ```bash
 find . -name *.log  #//在当前目录下查找.log日志
 ```
+
+## SSH远程执行命令
+
+命令格式
+
+```shell
+ssh -p $port $user@$p 'cmd'
+```
+
+> $port : ssh连接端口号
+
+> $user: ssh连接用户名
+
+> $ip:ssh连接的ip地址
+
+> cmd:远程服务器需要执行的操作
+
+ssh的-t参数
+
+
+> -t      Force pseudo-tty allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t options force tty allocation, even if ssh has no local tty.
+
+中文翻译一下:
+
+> 就是可以提供一个远程服务器的虚拟tty终端,加上这个参数我们就可以在远程服务器的虚拟终端上输入自己的提权密码了,非常安全
+
+### 脚本批量执行远程命令
+
+```shell
+#!/bin/bash
+
+#变量定义
+ip_array=("192.168.1.101" "192.168.1.102" "192.168.1.103" "192.168.1.104")
+
+#远程命令,如删除日志,停止服务,重新启动服务
+remote_cmd="cd web/ && find . -name '*.log' -delete && pm2 kill && pm2 start app.json"
+
+#本地通过ssh执行远程服务器的脚本
+for ip in ${ip_array[*]}
+do
+    #特定IP对应特定端口的判断
+    if [ $ip = "192.168.1.101" ]; then
+        port="2222"
+    else
+        port="22"
+    fi
+    #特定IP对应特定用户名的判断
+    if [ $ip = "192.168.1.102" ]; then
+        user="willin"
+    else
+        user="root"
+    fi
+    #执行
+    ssh -t -p $port $user@$ip "$remote_cmd"
+done
+```
+
+这个方法还是很方便的,-t虚拟出一个远程服务器的终端,在多台服务器同时部署时确实节约了不少时间啊!
+
+## 递归删除日志
+
+删除当前目录及子目录的`.log`日志
+
+```
+find . -name '*.log' -delete
+```

+ 163 - 0
project/js/promise.md

@@ -0,0 +1,163 @@
+<!-- toc -->
+
+# Promise思想
+
+改善Callback Hell问题
+
+## 什么样的函数需要改写成Promise
+
+例1:
+
+```js
+mysql.query('SELECT 1 + 1 AS solution', function (err, rows, fields) {
+  if (err) {
+    throw err;
+  }
+  //对查询结果进行操作
+  console.log('The solution is: ', rows[0].solution);
+});
+```
+
+例2:
+
+```js
+fs.readFile('myfile.txt', function (err, file) {
+  if (err) {
+    throw err;
+  }
+  //对file进行操作
+});
+```
+
+## Callback Hell
+
+例子:
+
+```js
+mysql.query(sql1, function(err1, rows1) {
+  if (err1){
+    throw err1;
+  }
+  mysql.query(sql2,function(err2,rows2){
+    if(err2){
+      throw err2;
+    }
+    //对rows1和rows2进行操作
+
+  });
+});
+```
+
+这样写法的问题:
+
+1. 嵌套太多,可读性差
+2. 变量名受污染
+3. 各个函数之间的干扰,一但错误发生,不能继续向下执行
+
+等等
+
+## 示例代码
+
+```js
+'use strict';
+/**
+ * 生成一个defer对象
+ * @return {object} Promise对象
+ */
+let getDefer = function () {
+  let deferred = {};
+  deferred.promise = new Promise(function (resolve, reject) {
+    deferred.resolve = resolve;
+    deferred.reject = reject;
+  });
+  return deferred;
+};
+
+/*
+ * 通过getDefer封装Promise
+ */
+let promiseFunc = function (input) {
+  let deferred = getDefer();
+  if (parseInt(input, 10) < 10) {
+    deferred.resolve(input * input);
+  }
+  else {
+    deferred.reject('Input Number Too Large');
+  }
+  return deferred.promise;
+};
+
+promiseFunc(5).then(function (result) {
+  console.log(result);//25
+}).catch(function (err) {
+  console.log(err);//不报错
+});
+
+promiseFunc(15).then(function (result) {
+  console.log(result);
+}).catch(function (err) {
+  console.log(err);//报错
+});
+
+
+/*
+ * 链式写法
+ */
+setTimeout(function () {
+  console.log('=============');
+  promiseFunc(2).then(function (val) {
+    console.log('Step 1:', val); //val===4
+    return promiseFunc(val);
+  }).then(function (val) {
+    console.log('Step 2:', val); //val===16
+    return promiseFunc(val);
+  }).then(function (val) {
+    console.log('step 3:', val); //err 不执行这句,跳到catch,往后的then均不执行
+    return promiseFunc(val);
+  }).then(function (val) {
+    console.log('Step 4:', val);
+    return promiseFunc(val);
+  }).catch(function (err) {
+    console.log(err);
+  });
+}, 20);
+
+/*
+ * Promise.all
+ * 全部执行完,再返回
+ * (常用)
+ */
+setTimeout(function () {
+  Promise.all([promiseFunc(1), promiseFunc(2), promiseFunc(3)]).then(function (val) {
+    console.log('=============');
+    console.log(val);//[1,4,9]
+  });
+}, 100);
+
+/*
+ * Promise.race
+ * 谁先执行完,返回谁
+ * (不常用)
+ */
+setTimeout(function () {
+  Promise.race([promiseFunc(1), promiseFunc(2), promiseFunc(3)]).then(function (val) {
+    console.log('=============');
+    console.log(val);//1
+  });
+}, 100);
+```
+
+执行结果:
+
+```
+25
+Input Number Too Large
+=============
+Step 1: 4
+Step 2: 16
+Input Number Too Large
+=============
+[ 1, 4, 9 ]
+=============
+1
+```

+ 57 - 0
project/source/koa.md

@@ -0,0 +1,57 @@
+# Koa
+
+## 前置条件
+
+### 1. Babel
+
+```
+npm install -g babel-cli
+```
+
+### 2. koa 2.0以上版本
+
+```
+npm install koa@v2.0.0-alpha.3
+```
+
+(更新本文时的最新版本为2.0 alpha)
+
+最新版本: [https://github.com/koajs/koa](https://github.com/koajs/koa)
+
+## 带async的示例
+
+app.js:
+
+```js
+const Koa = require('koa');
+const app = new Koa();
+
+// logger
+
+app.use(async (ctx, next) => {
+  const start = new Date;
+  await next();
+  const ms = new Date - start;
+  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
+});
+
+// response
+
+app.use(ctx => {
+  ctx.body = 'Hello World';
+});
+
+app.listen(3000);
+```
+
+***注:*** 需要Stage-3支持
+
+```
+npm install babel-preset-stage-3
+```
+
+执行:
+
+```
+babel-node --presets stage-3 app.js
+```

+ 111 - 0
project/tool/git.md

@@ -0,0 +1,111 @@
+# Git
+
+## 初始化版本库
+
+Git 通常有两种方式来进行初始化:
+
+#### git clone:
+
+这是较为简单的一种初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份
+
+例如:
+
+    $ git clone git://github.com/someone/some_project.git  some_project
+
+上面的命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版本库完全克隆到本地some_project目录下面,
+如果想要设置自己的git配置,就git init初始化.git文件.创建自己的版本库,也可以git branch new_branch创建自己的分支.
+
+    $ git remote add origin git://github.com/someone/some_project.git
+
+设置远程服务器别名为origin,这样将代码提交的时候就可以执行以下命令:
+
+    $ git push origin #将代码提交到origin的master上面(默认)
+
+
+#### git init和git remote:
+
+这种初始化方式稍微复杂一些
+
+例如:
+
+    $ mkdir [yourworkname] #本地创建一个工作目录
+    $ cd [yourworkname] #进入这个目录
+    $ git init #初始化版本库,即生成.git,就会对该目录下的文件进行版本控制
+
+Git以后,你会看到目录下面自动生成.git文件,用于版本管理使用(非常重要的文件,不要轻易改动),这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把可访问的URL记录下来,此时你就可以利用'git remote add'命令来增加一个远程服务器端,
+
+例如:
+
+    $ git remote add origin git://github.com/someone/another_project.git
+
+上面的命令就会增加URL地址为'git: //github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可
+
+## Git 的基本命令
+
+现在我们有了本地和远程的版本库,让我们来试着用用Git的基本命令:
+
+#### git pull:
+
+从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update
+
+#### git add:
+
+是 将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'git add app/model/user.rb'就会增加app/model/user.rb文件到Git的索引中,也可以使用git add .来加入当前工作空间所有修改过或者新增的文件.
+
+#### git rm:
+
+从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb',该功能类似于SVN的rm、del
+
+#### git commit:
+
+提交当前工作空间的修改内容,类似于SVN的commit命令,例如'git commit -m story #3, add user model',提交的时候必须用-m来输入一条提交信息,该功能类似于SVN的commit
+
+#### git push:
+
+将本地commit的代码更新到远程版本库中,例如'git push origin'就会将本地的代码更新到名为orgin的远程版本库中
+
+#### git log:
+
+查看历史日志,该功能类似于SVN的log
+
+#### git revert:
+
+还原一个版本的修改,必须提供一个具体的Git版本号,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本号都是生成的一个哈希值
+
+#### git branch:
+
+对分支的增、删、查等操作,例如'git branch new_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'git branch -D new_branch'就会强制删除叫做new_branch的分支,'git branch'就会列出本地所有的分支
+
+#### git checkout:
+
+Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如'git checkout new_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如'git checkout app/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
+
+#### git rebase:
+
+用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能
+![img](/_static/project/rebase.jpg)
+
+#### git reset:
+
+将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么结果就只剩下了A-C三个提交的版本
+
+![img](/_static/project/reset.jpg)
+
+1. Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
+
+2. 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
+
+3. 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
+
+
+#### git stash:
+
+将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解
+
+#### git config:
+
+利用这个命令可以新增、更改Git的各种设置,例如'git config branch.master.remote origin'就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的 Git
+
+#### git tag:
+
+可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了

+ 44 - 0
project/tool/gitbook.md

@@ -0,0 +1,44 @@
+# Gitbook
+
+GitBook是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书
+
+* 登陆gitbook,使用github账号登陆,新建一个book,然后选择link to github.(不要选择gitbook在线编辑)
+
+* 新建github仓库比如some_book.git
+
+* 本地安装gitbook和gitbook-cli命令行工具:
+
+
+    $ cnpm i -g gitbook-cli
+    $ gitbook versions:install
+
+* 本地新建my_book
+
+
+    $ gitbook init my_book #新建一本书
+    $ cd my_book
+    $ git init
+
+* 使用GitBook制作电子书,必备两个文件:README.md和SUMMARY.md
+
+### README.md:
+
+电子书介绍说明部分
+
+### SUMMARY.md:
+
+电子书目录部分
+
+接下来只需要编写相应章节即可。在编辑完README.md和SUMMARY.md后,可以运行以下命令:
+
+    $ git add .
+    $ git commit -m '...'
+    $ git remote add origin git@github.com:xxxx/some_book.git #创建远程服务器
+    $ git push -u origin master
+
+Gitbook首先把你的Markdown文件编译为HTML文件,并根据SUMMARY.md生成书的目录。所有生存的文件都保存在当前目录下的一个名为_book的子目录中。完成这些工作后,Gitbook会作为一个HTTP Server运行,并在4000端口监听HTTP请求。
+
+
+然后使用markdown语法编辑文章,开启本地服务器:
+
+    $ gitbook serve