+ `
+})
+class ProductsList {
+ products: Product[];
+ selected: EventMitter;
+
+ constructor() {
+ this.selected = new EventMitter();
+ }
+
+ clicked(product) {
+ this.selected.next(product);
+ }
+}
+```
+
+1.0: TypeScript,一般的JavaScript 的开发者看到这段代码发现有很多不认识的语法。如:
+- annotations(注解): @ 是typescript 用于注解的标志
+- 多行字符串:我们的模版是通过 es6 中新字符串特性来书写的,我们再也不用+来连接你
+- 类:使用 class 关键字来定义类和相应的 constructor 构建函数
+- strong typing:强类型如 product[]的数组
+
+1.1 组件
+我们通过注解提供一个组件需要的一些属性点配置,并且告诉给浏览器新的 tag,如
+1.1.1:inputs 和 outputs
+1.1.2: selector
+
+action 和 parentheis for views 和用户事件和类中的 action 函数结合(事件绑定) - 如例子中就是当用户点击 product-row 这个组件时,去设置 productList 组件的 selected 属性的值为
+
+
+1.2 View 和 template(视图和模版)
+在例子中我们通过模版定义我们用户看到该组件的样子,如它包含你传统的 html 语法和一些其他的语法和新属性
+
+1.3 directive指令
+正如我们刚才在模版中看到的,和在注解中看的 directives:[]
+ngFor - 结构化指令,其他还有 ngIf
+(click) - 属性指令,和事件绑定
+productRow - 组件类指令
+
+1.4 service 服务
+我们引入的 data 服务服务用来引入 product-list 的数据,它可以来自于 http 数据api 接口也可以来自于客户端的缓存。我们引入服务这个概念把相关的逻辑 xxxx
+
+1.5 DI
+我们可以看到 DI 来帮助我们xxx
+如 constructor,或者 directives,providers 中声明的那样,我告诉通过注解告诉 angular2:该 ProductList 需要用到 xxx,请在运行的时候提供(该那部分通过向 provider register 形式告诉 angular2 他们各种的创建方法)
+
+
+#### 应用的组件树
+
+> 我们的应用页面通过组件以树的方式表现出来:
+
+
+
+`Figure 1.4 应用的组件树`
+
+root component -> (list->item) + form
+从而很直观的认识到页面的构成,相互之间通过事件,inputs & outputs 等来交互,整个流程和交互非常清楚,界限定义的
+
+#### 应用各视图的路由
+
+当然当我们的应用变的更复杂的时候,可能会出现更多的页面,每个页面有自己的 url 来标识和不同的组件构成提供不同的功能。
+
+> @3:路由和页面:[about, todoList, todoDetail 和 ComponentRoute 定义]
+
+```javascript
+import { Start } from './components/start';
+import { About } from './components/about';
+import { Contact } from './components/contact';
+
+// 3.1
+@RouteConfig([
+ { path: '/', component: Start, as: 'start'}
+ { path: '/about', component: About, as: 'about'}
+ { path: '/contact', component: Contact, as: 'contact'}
+])
+class App {
+....
+}
+
+
+```
+
+Angular 通过 component rounter 定义提供这样:
+如上面的例子告诉我们,当用户访问/about 路径 url 访问关于页面的时候,我们提供 about 组件来提供视图和逻辑来相应用户操作
+
+3.1:通过 route,我们定义了三个页面,如 url 路径,对应的组件和别名。
+3.2 我们可以在使用刚才定义的 route,实现点击链接后的跳转
+
+
+### Angular 的工具周边
+
+构建 Angular 应用,你可能还需要借助一些工具,才能让你的workflow流程更加顺畅高效。下图展示了一个 Angular 应用书写,构建,测试,打包,发布等一系统流程可能会用的工具。
+
+
+
+`Figure 1.6 Angular 相关工具和关系`
+
+- 代码质量工具: ESlint
+- 测试框架和工具:Jasmine,Karma
+- 模块系统和加载:JSPM,SystemJS,ES6 Modules
+- ES6/TypeScript语言工具:Babel,tsc,typings
+- 包管理工具:npm/bower/jspm
+- 打包构建工具:Webpack,Grunt,Gulp,Npm Scripts
+
+Todo: 每个部分一句话介绍和引入。
+
+
+### Angular 和其他框架简要对比
+
+相信各位读者之前除了jQuery外,也会用过其他MV*类的框架来构建自己的应用。那么它们究竟和 Angular 差别在哪,本小节通过对比 Angular 1.x,React,Backbone,jQuery 来简要描述它们和 Angular 的异同,从而让你信心满满的开始学习和使用上最新最强大的框架王者 - Angular 2。
+
+Angular 则让开发者可以应用逻辑和UI相互独立解耦合(利用MVVM的设计模式)Web Component + DI + Routing + Observables + Input/Output + ... 等提供了开发复杂应用的大量的框架,我们只需要把我们的逻辑按照框架提供好的坑和脚手架往里面填入就行你
+
+#### Angular 1.x
+
+#### React
+
+#### Backbone
+
+#### jQuery
+
+jQuery 最早简化了DOM操作(处理了浏览器兼容性问题和提供不少好用的方法),也提供一些诸如动画,ajax 网络请求等功能,但它仍然是一个较为底层的类库
+
+
+### Angular 常见功能写法一览
+
+
+
+
+
+
+### 总结
+希望通过这章节的介绍,读者可以对 Angular 应用的组成,各部分的关联,工具周边等有个较为全局的理解,具体部分的讲解,读者将会在后续的章节逐一深入学习和使用。
+
+
+----
+
+
diff --git a/source/_drafts/apps-travel-world.md b/source/_drafts/apps-travel-world.md
new file mode 100644
index 0000000..dff00b2
--- /dev/null
+++ b/source/_drafts/apps-travel-world.md
@@ -0,0 +1,92 @@
+畅游世界的16款应用
+
+翻译自[16 Apps That Will Help You Travel The World](https://medium.com/product-hunt/16-apps-that-will-help-you-travel-around-the-entire-world-1605bcdbeafc#.4p6ypt5wn)
+
+
+### Destinations on Google - explore cities and book flights with Google
+
+
+
+
+### Quest Organizer - spend less on your next quest
+
+
+
+It can sometimes be a pain to book a trip when you want to visit multiple cities in between your first and last stop. QuestOrganizer makes the multi-destination trip easier to plan by helping you find free stopovers, build a custom flight using a number of one-way flights, and hack your trip to find the cheapest total rate possible. We love the simplicity of this app.
+
+
+### Tripnary - find great places to fly on your budget
+
+
+
+
+### Travo - smart trip planning for the mission critical traveler
+
+
+
+
+### Nomad list collections - curated collections of the best places to live and travel
+
+
+
+
+### Tripomatic 3.0 - itinerary planner for independent travlers
+
+
+
+
+### Airbnb live there - don't get there. live there
+
+
+
+
+### Grabr - peer-to-peer international shopping & delivery
+
+
+
+
+### Boom - this supersonic passenger jet gets you from NYC to LDN in 3.5 hours
+
+
+
+
+### Overnight - book a last-minute stay with local hosts
+
+
+
+
+### Plane - connect with new people in new places
+
+
+
+
+### Outsite - coworking/living membership in beautiful places globally
+
+
+
+
+### Party with a local 2.0 - because a night out anywhere is better with a local
+
+
+
+
+### Roam - the first global co-living subscription
+
+
+
+
+### freebird - rebook cancelled or deplayed flights on any airline
+
+
+
+
+### pana - your on-demand travel concierge
+
+
+
+
+
+
+
+
+
diff --git a/source/_drafts/async-code-2016.md b/source/_drafts/async-code-2016.md
new file mode 100644
index 0000000..8739a77
--- /dev/null
+++ b/source/_drafts/async-code-2016.md
@@ -0,0 +1,217 @@
+异步代码为什么存在,其他语言是怎么处理的(如goroutine,callback,多线程等等),在node.js社区,从最早的...xxx
+内部是多线程,但是用户的代码全都执行在单个线程内,利用操作系统的non-blocking I/O来实现并发。
+好处:
+1. 单核心上,基本上这是速度最快的方案。
+2. runtime的核心实现起来比较简单,简单意味着容易维护,bug容易修正。
+坏处:
+1. 程序员的负担加大。很多人都难以适应层层递进的callback,好在还有一些库可以缓解。
+2. 某个任务如果执行CPU密集型计算,会阻塞其它任务。
+3. 单进程内无法利用多核。
+python :
+没深入研究过,不过由于GIL的存在,猜测跟nodejs应该是差不多的(twisted)
+golang:
+最核心的压根就不是actor模式/CSP神马的,而是调度器。放在C++和其它任何高级语言里实现actor/CSP也是个非常简单的事,但要写个调度器则非常困难,golang/erlang帮你做了这一步。
+
+
+
+## 不好的同步代码
+阻塞代码的不好: var success = request(url)
+
+
+## 回调的地狱
+callback hell
+
+async library 一些方法
+
+## 啰嗦的Promises
+
+bluebird 让统一catch错误处理
+Q, es6 promise, bluebird 的 promise A+ 标准
+
+## 冷门的node-fiber和eventmachine,windjs
+在Meteor中运用了大量的Fiber,但是它的思路和ES发展不一致导致不会进入浏览器标准中
+
+## 蹩脚的co和generator
+ - [ ] es2015 generator: functions which can be exited and later
+ re-entered(call a generator function does not execute its
+ body immmediately 而是返回一个对象有 next() 方法[返回 {value: 11, done:
+ false}]), 同时 next 方法也可以接收 value 用于 modify generator 的内部状态
+ - [ ] geneartor 实现了 iterator 接口和 observe(next, error, complete)
+ - [ ] coroutines -> asynchronous code in blocking style. co()
+ function make a yield & generator function 成为异步代码的可能;
+ - [ ] 最小实现:
+
+ function co(geneartor) {
+ var iterator = generator();
+ return new Promise((accept, reject)=>{
+ var onResult = lastPromiseResult => {
+ var {value, done} =
+ iterator.next(lastPromiseResult);
+ if(!done) {
+ value.then(onResult, reject);
+ } else {
+ accept(value);
+ }
+ };
+ onResult();
+ })
+ }
+
+## 根正苗红的async/await
+
+await 等待一个异步的值
+async/await 就是更加语义话的 geneator * 和 yield
+ 关键词?!
+ps:阮一峰有翻译
+
+ * [ ] http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.
+ html
+ * [ ] es7的新的函数类型 async function,里面支持新的关键字 await
+ * [ ] 和 promise 紧密结合(await 一个 promise 的返回,如果 err 就抛异常) - try catch
+ * [ ] 可能的问题:await 只能运用在 async 的 function 定义中,所以你的代码中可能会有大量的 async 函数
+ * [ ] 可能的问题:be careful to wrap your code in try/catches, or else a
+ promise might be rejected, in which case the error is
+ silently swallowed. (!) - 或者在 top level 用 try/catch 包下
+ * [ ] Loops
+ * [ ] iteration. 如插入数据 sequentially - want promoses to execute
+ to one after the other
+ * [ ] docs.forEach(function (doc) {
+ promise = promise.then(db.post(doc));
+ });
+ Then the promises will actually execute concurrently
+ * [ ] let docs = [{}, {}, {}];
+
+ for (let doc of docs) {
+ await db.post(doc);
+ }
+ * [ ] // WARNING: this won't work
+ docs.forEach(async function (doc, i) {
+ await db.post(doc);
+ console.log(i);
+ });
+ * [ ] The await will only pause its parent function, so check
+ that it's doing what you actually think it's doing. (所以
+ forEach 本身被一个接一个跑了没等 await promise 回来)
+ * [ ] concurrent loops
+ * [ ] 如果想实现 promise 并发,es6 promises 有 Promise.all()
+ * [ ] return Promise.all(docs.map(function (doc) {
+ return db.post(doc);
+ })).then(function (results) {
+ console.log(results);
+ });
+ * [ ] let promises = docs.map((doc) => db.post(doc));
+
+ let results = [];
+ for (let promise of promises) {
+ results.push(await promise);
+ }
+ * [ ] // WARNING: this doesn't work
+ let results = promises.map(async function(promise) {
+ return await promise;
+ }); // 仍然不 work,因为 promises.map 仍然不是 await 的 parent
+ function,不会真正等(callback),而是立即往下执行
+ * [ ] let promises = docs.map((doc) => db.post(doc));
+
+ let results = await Promise.all(promises);
+ * [ ] let results = await* promises;
+ * [ ] 注意点
+ * [ ] es7 bleeding-eage. 不被支持node.js,需要 babel/Regenerator
+ * [ ] async/await spec 仍然是 proposal 阶段
+ * [ ] 同时在客户端跑需要大概60kb 的 shims
+
+
+
+## 附录 - 关于generator 和 yield
+
+该附录参考和总结于:
+https://hacks.mozilla.org/2015/05/es6-in-depth-generators/
+es6 & beyond - 第三章 organization 和 第四章中 async flow control
+
+
+### generator 前言
+generators are not threads. (一些有多线程的语言, multiple pieces
+of code can run at the same time, usually leading to race
+conditions, and sweet sweet performance)
+see generator run, pause itself, then resume execution.
+
+### generator 语法
+iterator control: next() 或者迭代器 var xx of g() 的用法
+generator 函数的next() 次数是yield +1 次. 最后一次是return
+或者undefined(如果没有return - {done: true, value:
+})
+
+early completion: return(), throw()
+
+error handling: xx with generators can be expressed with
+try...catch, which works in both inbound and outbound
+directions. 甚至 g.throw('xxx')如果在generator 函数中 nothing
+handles this excepton, 异常会 immediately propagates back
+out to calling code.
+
+tranpspilling a generator: facebook的regenerator项目 或babel
+
+
+
+### generator 用途
+#### 迭代器和循环 producing a series of values
+generators are iterators
+对于实现 [Symbol.iterator]() and .next() 两个方法的类就可以 iterator.
+而generators 都built-in implementation of next() and
+[Symbol.iterator](). 只需要你来实现 looping behavior
+
++ 简化 array-build 的函数:
+(而不需要 rows.push(row); return rows了)
+function* splitIntoRows(icons, rowLength) {
+ for (var i = 0; i < icons.length; i += rowLength) {
+ yield icons.slice(i, i + rowLength);
+ }
+}
+
+#### 重构简化异步代码
+异步代码控制 queue of tasks to perform serially,详情见上方分析
+
++ 简化 array-build 的函数:
+(而不需要 rows.push(row); return rows了)
+function* splitIntoRows(icons, rowLength) {
+ for (var i = 0; i < icons.length; i += rowLength) {
+ yield icons.slice(i, i + rowLength);
+ }
+}
+
+
+## 附录 - 迭代器
+如何实现一个简单的迭代器呢?类需要实现[Symbol.iterator]和next两个方法,具体展示如下:
+
+```js
+// Usage
+for (var value of range(0, 3)) {
+ alert(value);
+}
+
+// implementation
+class RangeIterator {
+ constructor(start, stop) {
+ this.value = start;
+ this.stop = stop;
+ }
+
+ [Symbol.iterator]() { return this; }
+
+ next() {
+ var value = this.value;
+ if (value < this.stop) {
+ this.value++;
+ return {done: false, value: value};
+ } else {
+ return {done: true, value: undefined};
+ }
+ }
+}
+
+// Return a new iterator that counts up from 'start' to
+'stop'.
+function range(start, stop) {
+ return new RangeIterator(start, stop);
+}
+```
+
diff --git a/source/_drafts/average-manager-vs-greate.md b/source/_drafts/average-manager-vs-greate.md
new file mode 100644
index 0000000..bebdfad
--- /dev/null
+++ b/source/_drafts/average-manager-vs-greate.md
@@ -0,0 +1,6 @@
+普通老板和好老板的区别
+
+[Average Manager vs Great Manager - explained in 10 sketches] (https://medium.com/the-year-of-the-looking-glass/average-manager-vs-great-manager-cf8a2e30907d#.wes9b1fyy)
+
+
+
diff --git a/source/_drafts/beginner-docker-vm-container.md b/source/_drafts/beginner-docker-vm-container.md
new file mode 100644
index 0000000..9dfbad7
--- /dev/null
+++ b/source/_drafts/beginner-docker-vm-container.md
@@ -0,0 +1,246 @@
+
+
+
+
+如果你是位程序员或技术爱好者,你可有可能已经听说过 Docker:用来打包,分发和在容器中运行应用的好用工具。这段时间获得巨大的用户关注,从普通开发者到系统管理员之类的。对于那些像Google,VMware和亚马逊这样的大公司都在开发支持它的服务。
+
+不管你是否在脑袋中立即对Docker有了使用场景,我仍然认为去理解诸如什么是容器和它和之前虚拟机是什么关系等这些基本概念都是非常重要的。虽然网上有大量的优秀的Docker使用指南等资源,但我还没发现一些针对入门者的概念性指南,尤其是容器是有什么组成等概念上。希望,这篇博客能解决目前这问题。
+
+让我们从理解什么是虚拟机和容器开始吧。
+
+### 什么是容器,什么是虚拟机?
+
+在各自的目标上看,容器和虚拟机是类似的 - 就是独立应用和它的依赖到独立自包含的直到你可以在其他地方运行。
+
+进一步,容器和虚拟机消除了实体机的需求,允许我们更有有效地使用计算资源(在能源消耗和成本花费上)
+容器和虚拟机的主要差别体现在它们的架构实现方案上。让我们细细看来:
+
+### 虚拟机
+
+一个虚拟机通常就是对一台真实电脑的虚拟,就像真机那样用来执行软件。
+
+
+
+
+### 容器
+
+不像虚拟机技术提供硬件虚拟化,容器通过抽象用户空间(用户态)提供操作系统级别的虚拟化。随着我一步步解包容器这个术语,你就会理解我所说的。
+
+
+
+
+### Docker起源于?
+
+Docker是基于Linux容器之上的开源项目。它使用了Linux内核特性如命名空间和控制组在操作系统之上来创建容器。
+
+容器从不是个新东西。Google已经使用自家的容器技术数年之久了,其他的Linux容器技术包括如:Solaris Zones, BSD jails, and LXC也面世了好几年了。
+
+那为什么Docker突然一下子流行起来了呢?
+
+
+- 1 易于使用
+- 2 快速
+- 3 Docker Hub
+- 4 模块化和可扩展性
+
+最后也同样重要的是:谁能不喜欢这么可爱的 Docker 鲸呢
+
+
+
+### Docker 基本概念
+
+现在我们先全局看下,然后一步步过下Docker的主要部分
+
+
+
+
+#### Docker Engine
+
+docker引擎是docker运行在的那层。它是轻量级的运行时和诸如管理容器,镜像,构建和其他等系列工具。它原生运行子Linux系统上,有下面部分组成:
+
+- Docker守护进程,在宿主机器上运行
+- DOcker客户端,和Docker守护进程进行通信来执行命令
+- 一套REST风格的接口,用于和Docker守护进程来远程交互
+
+#### Docker Client
+
+Docker客户端,是我们作为Docker的终端用户需要打交道的。把它想成Docker的界面UI。
+你和Docker客户端沟通,而它会最终把你的指令送给Docker守护进程去执行。
+
+#### Docker Daemon
+
+Docker守护进程是真正执行那些先被送给Docker客户端命令的地方,如构建,运行和分发你的容器。Docker守护进程在你的宿主机器上运行,但是做为用户你从不用直接和它打交道。Docker Client也可以在宿主机器上运行(但不是强制必须的)。它可以在不同机器上和宿主机器上的Docker守护进程进行通信。
+
+#### Dockerfile
+
+Dockerfile正是你把如何构建Docker镜像的一步步指令记录的地方。这些指令可以是:
+
+- RUN apt-get install some-package:安装软件包
+- EXPOSE 80:暴露特定端口
+- ENV ANT_HOME /usr/local/apache-ant:传递环境变量
+
+迄今一旦一设置好了 Dockfile,你就可以用 docker build 命令来依据它来构建镜像了。下面是一个 Dockerfile 的例子:
+
+```sh
+# Start with ubuntu 14.04
+FROM ubuntu:14.04
+
+MAINTAINER preethi kasireddy iam.preethi.k@gmail.com
+
+# For SSH access and port redirection
+ENV ROOTPASSWORD sample
+
+# Turn off prompts during installations
+ENV DEBIAN_FRONTEND noninteractive
+RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
+RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections
+
+# Update packages
+RUN apt-get -y update
+
+# Install system tools / libraries
+RUN apt-get -y install python3-software-properties \
+ software-properties-common \
+ bzip2 \
+ ssh \
+ net-tools \
+ vim \
+ curl \
+ expect \
+ git \
+ nano \
+ wget \
+ build-essential \
+ dialog \
+ make \
+ build-essential \
+ checkinstall \
+ bridge-utils \
+ virt-viewer \
+ python-pip \
+ python-setuptools \
+ python-dev
+
+# Install Node, npm
+RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
+RUN apt-get install -y nodejs
+
+# Add oracle-jdk7 to repositories
+RUN add-apt-repository ppa:webupd8team/java
+
+# Make sure the package repository is up to date
+RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
+
+# Update apt
+RUN apt-get -y update
+
+# Install oracle-jdk7
+RUN apt-get -y install oracle-java7-installer
+
+# Export JAVA_HOME variable
+ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
+
+# Run sshd
+RUN apt-get install -y openssh-server
+RUN mkdir /var/run/sshd
+RUN echo "root:$ROOTPASSWORD" | chpasswd
+RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
+
+# SSH login fix. Otherwise user is kicked off after login
+RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
+
+# Expose Node.js app port
+EXPOSE 8000
+
+# Create tap-to-android app directory
+RUN mkdir -p /usr/src/my-app
+WORKDIR /usr/src/my-app
+
+# Install app dependencies
+COPY . /usr/src/my-app
+RUN npm install
+
+# Add entrypoint
+ADD entrypoint.sh /entrypoint.sh
+RUN chmod +x /entrypoint.sh
+ENTRYPOINT ["/entrypoint.sh"]
+
+CMD ["npm", "start"]
+
+```
+
+#### Docker Image
+
+镜像是从你在Dockerfile写的指令中构建生成的只读模板。镜像既定义了你需要什么软件和它的依赖同时定义了在它启动时需要运行的进程。
+
+Docker镜像是用Dockerfile构建的,每个在Dockerfile中的指令都给该镜像添加了新的一层,通过layer层这概念代表镜像中的文件系统被添加或被替换的那部分文件。Layers层是Docker能够足够轻量但能有强大结构的关键点。Docker使用联合文件系统实现了它:
+
+#### Union File Systems
+
+Docker使用联合文件洗通过你来构建镜像。你可以把联合文件系统看作是可堆栈的文件系统,意味着不同文件系统(内部叫做分支branches)的文件和目录可以透明的层叠来形成单一的文件系统。
+
+那些目录中内容如果和它所要层叠的分支中有相同的路径,那么会被看做单一被合并的目录。这样就避免为每一层单独创建拷贝的需要了。实际上,它们可是都是对相同资源的指针。当特定层的内容需要被改变,它会先创建拷贝然后在修改本地的拷贝,不去动原来的。这就是看起来可以写却没有写权限的文件系统是如何实现的(换句话就是,一个先copy后write的系统)
+
+分层的系统提供了下面两大好处:
+
+- 免于复制:层帮忙我们在每次使用镜像来创建和运行容器上免于全量的文件复制,使得docker容器的安装非常快速和廉价。
+- 层级分离:使得修改非常快速,当你做一个修改,Docker仅仅把对该层的更新传递到那个需要被修改的层上
+
+
+#### Volumes
+
+卷是容器的数据部分。当容器被创建时候被初始化。卷允许你持久化和分享容器的数据。数据卷和默认的联合文件系统是独立的,作为宿主系统中的正常文件和目录的形式存在。所以,如果你删除,更新或重新构建你的容器,你的数据卷不会被影响。当你想要更新容器时,你可以直接去更改他(作为奖励,数据卷可以在多个容器见分享和复用,这一点很赞~)
+
+#### Docker Containers
+
+Docker容器,正如上面讨论的,把应用软件和它运行所需要的一切都打包到一个看不见的盒子中。它包含了操作系统,应用代码,运行时(如.NET或JVM),系统工具,系统类库等等。Docker容器是从Docker镜像中创建而来的,既然镜像是只读的,Docker在这个只读文件系统镜像之上加了可读写的文件系统来创建一个容器
+
+同时,在创建容器时,Docker也为其创建了网络接口从而容器可以和本地网络『对话』通信,把尚有的IP地址绑定到容器上,接着运行你在定义镜像时声明的进程。
+
+一旦你成功创建了容器,你可以在任何环境下不做修改的运行它。
+
+
+
+
+### 对Docker一探究尽 - double-clicking on contianers
+
+唷,Docker还包含了不少东西。一件始终让我感到好奇的事情:容器是如何实现的,尤其是既然这其中没有抽象的基础设施边界在容器周围。经过大量的阅读,我大概了解了现在准备尝试解释给你们听听。
+
+容器这个词事实上是用来描述一些不同特性如何在一起配合工作,可视化的像个容器。让我们快速过下它们:
+
+1) 命名空间
+命名空间提供给容器对底层的Linux系统它们特殊视图,控制容器能看看到和访问它们什么什么。当你运行一个容器,Docker为要被运行的那个容器创建命名空间。
+在Docker利用的内核中,有好几种不同类型的命名空间,如:
+
+- a. NET: 为容器提供了它自己对系统网络栈的视图 (如,它自己的网络设备,IP地址,IP路由表,/proc/net 目录和端口号等)。
+- b. PID: PID 代表着进程ID。如果你曾经在命令行中运行过`ps aux`来查看你系统中运行中哪些进程,那么你肯定对PID这列有印象。PID命名空间让容器对它们的查看和交互的进程有自己特定范围的视图,包括独立的init初始进程 PID 1(它是所有其他进程的祖先。
+- c. MNT: 给容器在对系统挂载磁盘的独立视图。所以在不同MNT命名空间的进程对文件系统的目录层级有着不同视角。
+- d. UTS: UTS 代表着UNIX时分系统。它允许进程认出系统的识别符(如,主机名,域名等。UTS允许容器有它们自己的域名和NIS域名,从而独立于其他容器和宿主系统。
+- e. IPC: IPC 代表着进程间通信。IPC命名空间负责在不同容器中运行的进程间隔离IPC资源
+- f. USER: 这一命名空间被用来隔离在不同容器中的用户。
+
+Docker 使用这些命名空间一起从而隔离和开始了容器的创建。下面我要聊的特性是控制组
+
+2) 控制组
+
+控制组(通常也被称为 cgroups)是Linux内核特性用来对一系列进程的进行隔离,优先和为资源(如CPU,memory,磁盘 I/O,网络等)使用负责。在这个层面上,一个cgrou确保了Docker容器只使用它们需要的资源 - 同时,如果要需要,对容器所能使用的资源进行约束。cgroups也确保单一的容器不会消耗完所有的资源,使得整个系统挂掉。
+
+最后,联合文件系统是另外Docker使用的特性。
+
+3)联合的文件系统
+
+在上面 Docker 镜像章节描述过。
+这实际上就Docker容器中有的所有了(当然,魔鬼都在实现的细节中 - 如何管理不同组件之间的交互调用等)
+
+
+### 未来:Docker和虚拟机共存
+
+
+### 结论
+
+我希望你现在已经拥有一些关于容器Docker等基本知识,用于下一步的继续学习或有一天在项目中的使用。
+
+按惯例,如果我说错什么或有什么好建议,不要吝啬留下你的评论。
+
+
+
diff --git a/source/_drafts/data-infra-airbnb.md b/source/_drafts/data-infra-airbnb.md
new file mode 100644
index 0000000..9bfa107
--- /dev/null
+++ b/source/_drafts/data-infra-airbnb.md
@@ -0,0 +1,57 @@
+
+
+## 我们数据平台背后的哲学
+
+ 在airbnb,我们推崇数据导向的文化,利用数据作为我们市场决定的关键因素。跟踪指标,验证假设通过实验,构建机器学习模型,深挖商业价值,这些都让我们变得更快更明智。
+
+ 经过许多次的进化步骤,我们现在感到我们的数据基础架构栈变得稳定,可依赖和可以扩展的。所以这看起来是个好机会,来和社区分享我们的经验。在最近几个星期,我们发布了不少博客文章来讲述我们的分发/分布式架构和我们的工具集。因为开源贡献者提供了许多我们现在在用的基础系统,这些让我们也非常乐意于通过开源有用的项目在github来回馈社区,也记录我们这一路学到的东西~
+
+在我们实施数据基础架构时,一些非正式哲学慢慢形成了:
+
+- 借鉴开源社区
+- 倾向于标准组件和方法
+- 确保它可扩展
+- 倾听同事,解决实际问题
+- 预留更多资源
+
+
+## 基础架构概述
+
+
+上图是简化的图表来展示我们基础架构中的主要组件
+我们系统的原数据主要来自于两个主要的渠道:那些代码中的指令通过kafka来发送书剑 和 生成数据库dump出然后通过Sqoop导入(通过AWS的RDS(类MySQL)在时间恢复点导出)
+
+这些源头数据包含了用户活动事件数据和多维的快照被接着发送到黄金集群(Gold)中(我们用于存储数据和开始跑我们的ETL任务(抽取,转换和加载)在这一步,我们实施业务逻辑,构建汇总表,和实施数据质量检查。
+
+在上图中,有两个分离开的集群代表Gold金和Silver银,它们会在下一博文中详细讲解。抽象解释下这样分离是为了确保计算和存储资源的隔离,这样在遇到灾难等情况可以提供确保恢复的机制。这样的架构让Gold环境下,大部分重要的任务可以在严格确保下运行,SLA服务级别得意确保,从而避免受到资源密集型的热查询的干扰。我们也把Silver环境作为生产环境,但是不那么严格要求和容忍突发的资源密集的查询
+
+
+要意识到通过设置两个集群我们拥有了隔离的能力,但是它的代价是大数据量的数据复制和复杂动态系统间的数据同步的管理。Gold是我们数据源头,我们从它那边到Silver做全量的复制。在Silver产生的数据不会被复制到Gold下,你可以这样认为这样的单向复制的设计方式让Silver免于成为其他任何东西的父集。 因为我们很多的分析和报告在Silver集群上实施,所以确保新数据被尽快加载到Silver中使用户的任务执行的没有延期是至关重要的。更重要的是,如果我们在Gold集群更新现有的数据,我们必须通知更新事件和同时把更新的变化同步到Silver。这复制优化问题在开源社区目前木有什么好方案,所以我们在接下来的博客中会详细描述为解决这问题构建新的一套工具。
+
+我们在调优HDFS上付出了巨大的努力,对我们的中间源和数据池 - Hive管理的数据表提供更精确的调优。数据仓库的质量和稳健依赖于数据要不可修改和所有的延生可以被重现 - 使用分区Hive表对实现这个目标是很重要的。进一步,我不鼓励不同数据系统的延续和我们也不想维护在数据源头和最终用户表报间的中间数据基础架构。在我们的经验中,这些中间系统会混淆唯一数据事实,给ETL任务的管理添加负担,让展现在Dashboard仪表盘上的指标的线性最终变得困难,从而不明确它是怎么从源数据一步步来的。我们不需要跑 Oracle, Teradata,Vertica和Redshift等,相反我们使用Presto对于据大部分热查询在Hive维护管理的数据表。我们喜欢在不久将来把Presto直接连接到我们的Tableau的按照上。
+
+图上需要单独说明的点,包括Airpal,我们开发和开源的web界面的查询执行工具(背后是presto)
+
+
+## 细看我们Hadoop集群进化
+
+### A)在Mesos架构上运行唯一的Hadoop
+
+### B)远程的读写
+
+### C) 同构机器上的异构负载
+
+### D)HDFS的同盟
+
+### E)系统监控重担
+
+### 结论
+
+在经历过旧集群按照配置时遇到的各种错误和低效能,我们决心来系统性的解决这些难题。它是个长期的工程来迁移PT级别的数据,和数以百计的用户任务(但不干扰同事们的任务)。我们会新写一篇在此主题上的博客,和发布一系列的工具到开源社区中。
+
+
+
+## 感谢和表扬
+非常感谢对原先实现Airbnb的数据基础架构的工程团队和对那些持续工作让系统不断稳定和提升的同事们。我很高兴能写这篇文字,但是真正的工作和荣耀属于这项目背后的人员:Nick Barrow-Williams, Greg Brandt, Dan Davydov, Wensheng Hua, Swaroop Jagadish, Andy Kramolisch, Kevin Long, Jingwei Lu, Will Moss, Krishna Puttaswamy, Liyin Tang, Paul Yang, Hongbo Zeng, and Jason Zhang。
+
+
diff --git a/source/_drafts/earn-money-like-play-piano.md b/source/_drafts/earn-money-like-play-piano.md
new file mode 100644
index 0000000..aefdbe0
--- /dev/null
+++ b/source/_drafts/earn-money-like-play-piano.md
@@ -0,0 +1,4 @@
+> 翻译自[Making money takes practice like playing the piano takes practice](https://m.signalvnoise.com/making-money-takes-practice-like-playing-the-piano-takes-practice-41a72ab51a68#.cq1gkcfvh),加入创业公司很不错,但是要学会怎么赚钱,而不是想很多人一样仅仅学会怎么花投资者的钱。
+
+
+
diff --git a/source/_drafts/effective-code-review.md b/source/_drafts/effective-code-review.md
new file mode 100644
index 0000000..819b37d
--- /dev/null
+++ b/source/_drafts/effective-code-review.md
@@ -0,0 +1,32 @@
+> 翻译于[Effective Code Reviews](http://codeahoy.com/2016/04/03/effective-code-reviews/),本文对代码审查会遇到的问题(变成审查者炫技,开发者依赖审查找出代码问题对自己的代码不管不顾,总是等代码ready后才审查等),从管理者,开发者和审查者都提出了不少实用有效的建议(如建立合适的团队文化,讲点人情味,对事不对人,谦虚点~)
+
+代码审查就是开发者写的代码被其他开发者来审视看是否有缺陷和可提升点的过程。换句话说,开发者先独立完成他们的编码工作,然后召集一次代码审查。
+
+代码审查是一种被证明可以推升软件质量的编程方法。在Google,所有的代码都需要被同事进行审查才能入库。从《代码大全2》中列举两个例子:
+
+- IBM的Orbit项目有近50w行代码量,通过使用11种级别的审查,从而这个项目比预期更早发布,只有预期1%的代码错误bug数量。
+- 对AT&T的一个拥有多达200人的组织调研发现,当引入代码审查后,他们工作效率提升了14%,软件的缺陷数量降低了近90%。
+
+不过,现在还是有很多团队在代码审查上做的并不好甚至还没有全完意识到它的好处。在这样『功能紊乱』的组织或团队中,很快会所有参与其中的人感到痛苦难过。
+
+- 代码审查常常会变为审查人通过指出其他同事的代码『错误』的炫技平台。而实际这仅仅是他个人很牵强的观点而已
+- 开发者通常对代码审查不够积极总是说要等待代码最终ready后才进行。这是有些好处,不过也会错过代码审核的最佳时间点
+- 开发者对要被审核代码的不管不顾,等着其他人来帮他找到错误
+
+在这篇文章中,我们聊聊组织团队通过实施哪些规则和方法,让每个参与代码审查的人都能感到满意和愉快。
+
+### 给管理者:建立正确的文化
+
+### 给所有人:人情味
+
+### 给审查者:谦虚点
+
+### 给开发者:对事不对人
+
+### 总结
+
+同事间的代码审查是相互交流沟通的过程,这其中的低效也是源自于社交层面的。不过不少管理者花了不少时间去考虑工具是否好用,是否酷炫。工具当然会有提升,不过仅仅通过它不会带来最终的好结果。从建立正确的文化开始,然后剩下的人与人之间配合和沟通~
+
+
+PS:经过大半年的野蛮发展,我们交付了不错的软件应用给业务部门,随着团队的增大和后续人员的加入,新的功能点也需要在原有项目上迭代,我们广发团队们也开始了陆陆续续的Code Review的进展工作,你有什么好建议?
+
diff --git a/source/_drafts/entrepreneur-daily-routines.md b/source/_drafts/entrepreneur-daily-routines.md
new file mode 100644
index 0000000..9a9636c
--- /dev/null
+++ b/source/_drafts/entrepreneur-daily-routines.md
@@ -0,0 +1,33 @@
+创业老板企业家每天都做什么?
+
+翻译自[The Daily Routines of 15 Successful Entrepreneurs](https://medium.com/product-hunt/the-daily-routines-of-15-successful-entrepreneurs-5d946754ce58#.ynvepdhnx)
+
+该文章是从 Product Hunt Live 整理而来。
+what their typical day looks like. 各自有各自的不同。
+Some wake up by 4am; others don’t start the day until closer to 11am. Some exercise every single day; others write or meditate. Some have their routine planned down to (what seems like) the minute; others keep more of a loose schedule.
+
+但是有一点是明确的,routines help us get into a flow state that unlokcs our ability to be happy and effective every day.
+
+- Get a decent amount of sleep
+- Read things that are interesting to you
+- Try to break a sweat daily
+- Spend time with people you love
+- And when you really need to kick into gear, there’s nothing that a good cup of coffee (or an ice plunge) can’t help with ;-)
+
+
+### Charlie Hoehn, Author of Play it away
+
+一般会冥想对要做的事情进行可视化。同时每天晚上会把第二天会做的事情罗列出来,还会进行必要的营养补充(那些缺少的维生素和矿物质)
+
+### Tony Robbins
+
+每天会跳到冰水中(毛主席吗....)as a discipline to make my mind know that when I say I'm going to do something, I do it now - no matter how difficult it may seem. 对身体也不错(every cell, nerve, and muscle in your body pumps like crazy when you make that radical of a temperature change. it moves your lymph and makes you ready for anything. completely invigorating.)
+
+### Sam Altman, YCombinator 孵化主席
+
+『try to do the things that i think are important, and be ruthless about not doing things that i don't think are important』. 通常给自己当天确定3个大目标和20个小的待办事项
+
+
+
+
+
diff --git a/source/_drafts/exp-dji-phantom3.md b/source/_drafts/exp-dji-phantom3.md
new file mode 100644
index 0000000..df8cfad
--- /dev/null
+++ b/source/_drafts/exp-dji-phantom3.md
@@ -0,0 +1,4 @@
+记录DJI的一些经历(从最早的兑换,到最后的卖出,还有几次飞行)
+
+
+
diff --git a/source/_drafts/express-history.md b/source/_drafts/express-history.md
new file mode 100644
index 0000000..94eef4a
--- /dev/null
+++ b/source/_drafts/express-history.md
@@ -0,0 +1,91 @@
+如果你在过去5年什么时间点里用过 Node.js,那么你很有可能也用过 Express。
+它是在github上被加星最多的nodejs相关的项目,每周平均大概100w的下载量。
+
+这就是最近项目进展中发生的冲击破迅速引起了我的注意。
+
+『I am closing down Express5.0. I'm quitting the Express TC now. I cannot trust anyone any more.』
+我要关掉 Express5.0项目了,我现在要退出Express技术委员会了。我再也不会相信任何人!!
+
+谁是 Doug Wilson?他凭什么可以关掉Express的未来版本?!
+接下来我的一些发现让我真是大吃一惊
+
+如果你和我一样,认为过去两年Express核心项目被Strongloop公司积极维护着。那我准备告诉你一些新消息了,Express并没有被他们维护着!
+
+那些像我们一样在过去两年用着的Express,其实是要靠着Doug Wilson的辛苦工作支持的。
+
+『谁说Doug Wilson』你可能会问,如果你之前没有听说过他,你绝不是少数。我也是知道最近才了解他的。
+
+为了更加全景化了解这个问题,我们最好先从Express框架的全能创建者 TJ Holowaychuk 聊起~
+
+## 偏执狂:TJ Holowaychuk
+
+## 能把开源项目卖掉是什么鬼
+
+## MIT 开源授权:简单解释(读者可略过)
+
+## 占有几乎就有真理
+
+## 下次你做坏事时
+
+TJ已经对他把Express卖出的决定感到后悔。把开源项目卖掉是你能做的最混账的事!
+很多人也对此很生气。
+但让我真正生气的是,TJ并没有卖到什么钱。
+
+『你弄得看起来卖完后,我突然好有钱的样子,但实际上连我半个月的工资都不到。。。』
+
+这才是真正让我无语的地方。如果你真要做什么坏事,好歹是为了什么非常吸引人的诱惑如大量钱财等
+
+如果读者中有任何想过把自己开源项目卖掉给最高的开价者,那么我的建议是:
+
+
+
+
+## 欢迎进入黑暗世界:Strongloop接管Express项目!
+
+StrongLoop 收购了Express项目在Github的所有权。这是个明智的决定,毫无疑问让它到了社区的前沿和中心。
+
+虽然说这不是什么道德优越的好事,但是这意味着Strongloop就要影响Express项目的进展?
+
+这还很有可能StrongLoop是对Express是出于好心,同时会给社区分配除足够的资源和支持。甚至精心的找了个全职的开发者来帮助开发这个项目。
+
+『那些不那么多地道的行为会持续产生,沿着不地道的方式』
+
+在 2014年的 7月29 号,StrongLoop 发表了臭名昭著的声明:
+TJ HolowayChuk 把Express的赞助方转让给了StrongLoop。
+
+在同年的8月,Express 在github的项目被移StrongLoop org下。同年10月,Express官方网站在显著位置加了一条指向LoopBack的链接(StrongLoop自己的构建在Express之上的开源框架)
+
+在2014年那个命运般的日子和知道2016年3月到这个月这篇文章写的日子下,你猜StrongLoop给Express项目的主分支提交了几次代码?
+
+一次都没!!
+
+或者说几乎为0.反正绝对少于5个,就如下图所示:
+
+
+
+该项目的最高提交数的6位贡献者都不是StrongLoop的员工。
+
+
+## 未被歌颂的Express英雄:Doug Wilson
+
+## 人事现状
+
+你可能已经听到了,IBM最近收购了Strongloop。我敢肯定Strongloop对Express项目的慷慨赞助对IBM收购这个决定起了不小的作用。
+IBM最近还把Express也加入了Node基金(head off xx to 阻止?)
+据传言,IBM分配了两个全职工程师在这个项目上。
+
+## 最后的思考
+
+Doug 和他的朋友们目前在全力以赴在类似于Express的崭新项目上。我相信你不久后就会有所耳闻。
+按我目前理解的,Express需要彻底的重写来支持HTTP/2。希望这能顺利进展但是谁知道呢现在
+
+说实话,如果你只能从这件JavaScript历史的风暴轶事中记住一件的话:
+
+『在互联网的某个角落有个名叫 Doug Wilson(@blipsofadoug)的人,在过去的三年里,它就是为了我们默默支持和照顾Express的人!』
+
+在过去的三年中,Doug 很可能解决了影响你生产环境下的应用的一个真实bug,而同时你可能都没有用意识到这一点就提升了服务器的运行性能~
+
+
+
+
+
diff --git a/source/_drafts/facebook-opensource.md b/source/_drafts/facebook-opensource.md
new file mode 100644
index 0000000..00987bb
--- /dev/null
+++ b/source/_drafts/facebook-opensource.md
@@ -0,0 +1,28 @@
+Facebook 是怎么看待开源这件事的?
+
+> 翻译自[Inside Facebook's Open Source Machine](http://www.forbes.com/sites/roberthof/2016/04/15/inside-facebooks-open-source-machine/print/). 福布斯专栏对Facebook开源负责人的采访整理。正直F8大会闭幕~
+
+### Q: 在Facebook内,你们是怎么运作开源的?
+
+A:
+
+### Q:公司的代码/设计哪些开源哪些不开源,你们是怎么判断的
+
+A:
+
+### Q:所以你们界定开源和闭源的标准在哪
+
+### Q:就像你们对Facebook 首页消息流算法就闭口不谈
+
+### Q:你能举一些例子,你们开源的技术怎么通过其他公司的贡献又给你们带来裨益的
+
+### Q:你们现在哪些开源项目正热门?
+
+Q: Has there been an evolution in how you develop code in the first place based on the expectation that you could open source it?
+Q: You mean to think modularly?
+Q: So essentially, they’re not doing code in their pajamas.
+Q: I would think one challenge might be that you can get efficiencies inside a company from intertwining systems, so how do you persuade engineers not to opt for that kind of advantage?
+Q: Any less obvious benefits of open source for Facebook and other companies?
+Q: What companies don’t understand this yet?
+
+
diff --git a/source/_drafts/fintech-100.md b/source/_drafts/fintech-100.md
new file mode 100644
index 0000000..fa31247
--- /dev/null
+++ b/source/_drafts/fintech-100.md
@@ -0,0 +1,140 @@
+创新者 - Leading global fintech innovators 2015
+
+The financial services industry is facing a wave of digital disruption that is starting to reshape the sector. The Fintech 100 celebrates the top companies this bold new space: the 50 leading established players creating change within financial services, and 50 of the emerging fintech stars of tomorrow.
+
+The Fintech 100 offers an in-depth view of the most exciting startups and organisations taking advantage of technology to revolutionise the industry. The report is a collaborative effort between H2 Ventures and KPMG.
+
+
+### 01 众安保险 - 定制保险
+
+ZhongAn is an innovative online property insurance company. They utilize big data technology to assist with product design, automatic underwriting, auto claims, precision marketing and risk management. Founded in 2013 in Shanghai, ZhongAn Insurance is the first company in China to be issued an internet (online) insurance license. The company is a joint venture between: Alibaba Group Holding (an e–commerce company), Tencent Holdings (an online gaming and social networking company) and Ping An Insurance. ZhongAn offers wide range of online insurance services to the Chinese market, catering to all socio economic groups, with a major focus on travel, accident and health.
+
+### 04 趣分期 - Helping students establish the right values in spending and credit
+“Beijing–based Qufenqi.com, recently completed US$ 9–digit Series E funding round and will soon announce investors and specific funding amounts. We also rolled out a new product, “Quzu,” which allows users to pay their apartment rent in installments” - Min Luo, CEO
+
+Qufenqi is an electronics retailer that offers monthly installment payment solutions to the students and professionals in China. The company primarily offers smart phones, laptops and other consumer electronics online, allowing customers to choose their own down payment option and the time period for making regular monthly installments. Customers have to close the installments within two years of the purchase. The business model is tailored for students and young white collar workers, with the final price and monthly required payments shown transparently on the product page.
+
+### 11 陆金所 - open marketplace for financial products
+
+Shanghai Lujiazui International Financial Asset Exchange (“Lufax”) is an online marketplace for the origination and trading of financial assets. Lufax has grown into China’s largest internet finance company in less than four years. Lufax takes advantage of the latest big data and IT technologies, and leverages the most advanced risk assessment models and risk control systems.
+
+### 39 WeCash 闪银奇异 the fist online credit assessment platforms and solutions in China
+Wecash is China’s first Internet credit assessment company that provides solutions for technology companies. The development of Wecash is currently the most advanced big data platform credit assessment, using machine learning algorithms to provide credit assessments in under fifteen minutes. Their singular commitment to eliminate information asymmetry with big data, provides faster, more accurate credit decisions. By relying on data mining analysis and machine learning technology, the information submitted by
+the applicant is used to identify and combine personal, social behavior and massive internet information on the personal credit score online.
+
+### 40 房多多 O2O Platform for Real estate powered by agents
+
+FangDD offers an online platform through which home buyers and home sellers can directly connect to each other, working on a “”pay-for-performance”” business model. The goal is to provide accurate information about properties, services and transactions to create an open, cooperative, coexistent and mutually beneficial industrial pattern. In the first 6 months of 2015, more than US$8b worth of real estate transactions took place using this platform. The company’s O2O internet real estate marketing platform is based on big data technology. It integrates online and offline property businesses and buyers on
+a single platform, allowing user friendly property transaction services. FangDD follows a business model of pay–for–performance, catering to customers across 50 cities in China, including Beijing, Shanghai and Shenzhen.
+
+
+### 45 积木盒子 Marketplace Leading Platform
+
+Jimubox is a Beijing-based marketplace lending platform that provides small and medium enterprise loans and individual consumption loans to under banked Chinese borrowers. Jimubox delivers safe and attractive investment opportunities to RMB investors through an innovative online marketplace which leverages transparency and technology to ensure investor safety.
+
+### 47 融360 financial product research and recommendation to consumers and micro companies
+
+Rong360 is China’s leading financial vertical search platform. They are committed to providing financial searches of financial products to consumers and small businesses, giving recommendation and application services, business scope cover loans, credit cards and financial management. Rong360 is free for the user, which provides convenient, cost-effective, secure financial information services, and is currently the most extensive coverage in Beijing, as well as the largest financial service users search platform.
+
+
+### 02 Oscar - smart simple health insurance
+
+The Oscar team is focused on utilizing technology to simplify the entire healthcare experience. A team of technology and healthcare experts looked at the current state of the US healthcare system, and were frustrated by the horrible consumer experience. In response, they decided to reinvent how healthcare is delivered. They are reinventing how to manage care, process medical claims, control healthcare costs, and provide transparency. With all the complexity hidden behind an easy experience for members. Oscar is making the healthcare system simple, smart and friendly.
+
+### 03 Wealthfront - the most-efficient, low-cost, hassle-free way to invest
+
+Wealthfront is an automated investment service which combines world-class financial expertise and leading edge technology to provide sophisticated investment management at prices that are affordable for everyone. Wealthfront makes it easy for anyone to get access to world-class, long-term investment management without the high fees or steep account minimums. Their mission is to provide access to the same high quality financial advice offered by major financial institutions and private wealth managers, like tax-loss harvesting, without the high account minimums or costs.
+
+
+### 05 Funding Circle - better for business, better for investors, better all round
+
+“Our vision is to help millions of businesses across the world sidestep the outdated and inefficient banking system and borrow from investors.” - Samir Desai, Co-Founder & CEO
+
+Funding Circle was created with one big idea; to revolutionise the outdated banking system and secure a better deal for everyone; with offices in the UK, US, Germany, Spain and the Netherlands. Funding Circle is the world’s leading marketplace exclusively focused on small businesses, providing a platform where investors can browse businesses that Funding Circle has credit assessed and approved for lending. Once approved, businesses post their loan request on the Funding Circle marketplace. It is here that investors choose which type of business to lend to, the amount of money they wish to lend, and the interest rate they want to earn.
+
+
+### 06 Kreditech - digital banking for everyone
+
+“In three years, Alexander and I have built Kreditech into an industry leader tackling a serious mission in a very innovative way — and it works.” - Sebastian Diemer, Co-Founder
+
+Kreditech Group is a technology company that delivers a range of custom- tailored financial services with a focus on under banked consumers across the globe. Kreditech uses big data, proprietary algorithms and automated workflows to acquire, identify and underwrite customers within seconds. Automated processes combined with self-learning algorithms ensure fast and convenient customer service, minimizing cost and human error while continually improving by incorporating new customer data.
+
+### 07 Avant - know what you borrow
+
+Avant is a fast-growing marketplace lending platform that is lowering the
+costs and barriers of borrowing for consumers. Through the use of big data
+and machine-learning algorithms, the company offers a unique and highly customized approach to streamlined credit options. At its core, Avant is a tech company that is dedicated to creating innovative and practical financial products for all consumers.
+
+### 08 Atom - we think it's time someone breathed new life into banking
+
+Atom Bank is a new digital banking system, authorised by the Prudential Regulation Authority (PRA) and regulated by the Financial Conduct Authority (FCA). They offer an app-based experience, using leading technology. The digital world is constantly changing and Atom will be changing banking too. Atom Bank is based in the UK and doesn’t have any branches, instead you can do all your banking on your phone, 24/7. Their aim is to breathe new life into banking.
+
+### 09 Klarna - simplifying buying
+
+Klarna is one of Europe’s leading providers of payment solutions for e-commerce. Klarna separates buying from paying by allowing buyers to
+pay for ordered goods after receiving them, providing them with a safe after delivery payment solution. At the same time, Klarna assumes all credit and fraud risk for e-stores so that sellers can rest assured that they will always receive their money. Klarna’s vision is to enable trust and to offer a frictionless buying experience to buyers and sellers across the world.
+
+### 10 Our Crowd - a better way to invest in startups
+
+OurCrowd is the world’s leading equity crowdfunding platform for accredited investors to invest in Israeli and global companies. Managed by a team of seasoned investment professionals and led by serial entrepreneur Jon Medved, OurCrowd vets and selects opportunities, invests its own capital and brings startups to its accredited membership of 10,000 global investors. OurCrowd provides post-investment support to its portfolio companies, assigning industry experts as mentors and taking board seats.
+
+
+### 12 Robinhood - commission-free, mobile-first stock brokerage
+
+Robinhood is a new way to invest in the stock market. They believe that everyone should have access to the financial markets and are on a mission to inspire a new generation of investors. Robinhood is a stock brokerage that allows customers to buy and sell US stocks and ETFs with zero commission. They cut out the fat that makes other brokerages costly — hundreds of storefront locations and manual account management.
+
+### 13 Square - now everyone can accept credit cards
+
+Square helps anyone take care of their business. Their service supports your entire business, from a register in your pocket to reports on your laptop. Square’s register service is a full point of sale with tools for every part of running a business, from accepting credit cards and tracking sales and inventory to small-business financing. Customers also use Square Cash, the easiest way to send and receive money, and Square Order, a new way to pre-order food and drinks for pickup.
+
+### 14 Motif Investing - step up to a new world of investing
+
+Motif Investing is a concept-driven trading platform that allows you to act on your investing desires—whether it’s a hot trend like “robotics revolution,” a trading strategy like “buy the dip,” or an investment style like “Ivy League endowment.” They make it easy to act on these concepts by turning them into motifs— intelligently weighted baskets of up to 30 stocks or ETFs. Based in Silicon Valley they are changing the face of online investing. Their social platform is transparent and allows individuals and investment advisors to invest in stock and bond portfolios built around everyday ideas and broad economic trends, as well as creating brand-new motifs from scratch.
+
+### 15 Xero - beautiful accounting software
+
+Xero is changing the game for small businesses with easy-to-use online accounting software. The cloud-based software connects people with the right numbers anytime, anywhere, on any device. For accountants and bookkeepers, Xero helps build a trusted relationship with small business clients through online collaboration. It includes a full accrual accounting system with a cashbook, automated daily bank feeds, invoicing, debtors, creditors, sales tax and reporting. Xero is designed to be the accounting engine for your small business, giving you real time access to your financial data and access for your accountant or bookkeeper for quicker, easier collaboration at any point.
+
+### Stripe - the best way to accept payments
+
+Stripe provides a developer-friendly way to accept payments online and in mobile apps direct to your bank accounts from a range of local and international cards. Processing billions of dollars a year for thousands of companies of all sizes. The Stripe platform is designed for businesses of all sizes: from public launch to public company, and handles billions of dollars a year for forward- thinking businesses around the world. Stripe is built for developers, makers and creators. They believe that enabling frictionless transactions is a problem rooted in code and design, not finance. Their robust, clean Application Programming Interface lets users focus on building great products.
+
+
+### Collective Health - evolving your healthcare experience
+
+Collective Health was founded to fix what was broken about the healthcare experience. They work as a technology company to improve health insurance by taking better care of their people; bringing together the best medical, pharmacy, dental and vision networks. Collective Health is combining intelligence, empathy and common sense to the health insurance experience.
+
+
+### 24 Lending Club - the leader in peer to peer lending
+
+Lending Club is the world’s largest online credit marketplace, facilitating personal loans, business loans, and financing for elective medical procedures and K-12 education and tutoring. Borrowers access lower interest rate loans through a fast and easy online or mobile interface. Investors provide the capital to enable many of the loans in exchange for earning interest. They operate fully online with no branch infrastructure, and use technology to lower cost and deliver an improved customer experience. Cost savings are passed onto borrowers in the form of lower rates and investors in the form of attractive returns. Lending Club is transforming the banking system into a frictionless, transparent and highly efficient online marketplace, helping people achieve their financial goals every day.
+
+### SoFi - so the life of your loan isn't your life
+
+SoFi is reinventing consumer finance for the better. They are a leader in marketplace lending, with over $5 billion in loans issued to date. SoFi helps
+early stage professionals accelerate their success with student loan refinancing, mortgages, mortgage refinancing, and personal loans. Their non-traditional underwriting approach takes into account merit and employment history among other factors, therefore offering products that can’t be found elsewhere. They offer individual and institutional investors the ability to create positive social impact on the communities they care about while earning compelling rates of return.
+
+### 50 AngelList - where the world meets startups
+
+AngelList is a platform for startups to raise money online, recruit and apply to incubators. They connect startups to angel investors whom they would not otherwise be able to find, and facilitate angel investment through features such as the formation of syndicates. AngelList startups connect to angel investors by creating a profile for their business on AngelList which will then show in
+the feeds of angel investors. Angel investors are also able to form syndicates, whereby they pledge money to mirror the investment backing of prominent angel investors.
+
+
+## 关于榜单:
+http://fintechinnovators.com/about-list
+
+The Fintech 100 is a collaborative effort between H2 Ventures and KPMG and analyses the fintech space globally. The report highlights those companies globally that are taking advantage of technology and driving disruption within the financial services industry.
+
+The benefits of being included on the list go beyond profile. This year, 10 of the top emerging fintech startups will be invited to attend a Fintech Summit in London to pitch their ideas to some of the world’s leading financial institutions, venture capital funds and investors. In addition they will receive professional services support from KPMG, plus membership and discounted deal-success rates with Matchi, the online fintech matchmaking platform.
+
+The Fintech 100 consists of two separate lists: Top 50 Established Fintech List, and the 50 Emerging Stars.
+
+The process for selecting the Top 50 Established Fintech List involves a universal search for the most innovative fintech companies. A comprehensive list is then created, with companies ranked based on four groups of factors: total capital raised, rate of capital raising, location and degree of sub industry disruption and the judging panel's subjective rating of the degree of product, service, customer experience and business model innovation.
+
+The process for selecting the 50 Emerging Stars is necessarily subjective, and involves a search for largely ‘undiscovered’ fintech companies. The judges are looking for the players of the future – a diversity of companies from all over the world with fresh, new, disruptive ideas and industry solutions. The evaluation is far less about size and capital raisings than it is about having an “X factor”.
+
+
+
+
+
+
diff --git a/source/_drafts/googler-decade.md b/source/_drafts/googler-decade.md
new file mode 100644
index 0000000..8efa430
--- /dev/null
+++ b/source/_drafts/googler-decade.md
@@ -0,0 +1,35 @@
+> 翻译自:[A decade at Google](http://wp.sigmod.org/?p=1851)
+
+最近我在庆祝在Google待满的10年,准备借此机会来分享下我对过去十年的一些思考。在加入Google前,我华盛顿大学的计算机科学工程学院工作,在那时我创建了数据库研究小组(目前仍然一派欣欣向荣蒸蒸日上)。在我在学校任职的几年,我创建过两个创业公司,Nimble科技和Transformic企业。在Google的最近8年,我领导Google研究院的结构化数据研究小组。所以我的一些思考集中在从学术界向工业界的转化,我在Google项目的选择上和一些通用的建议。需要我特别指出的是:我的这些观察是建立在Google在研究和工程紧密结合这样的模型上的(所以观点会有些偏颇~)
+
+不管怎么样, 我这里还是想把那些指导我在Google工作的一些原则
+
+## 选择迎合你强项的好项目
+
+在Google,我的优势就是,我们各种类型的海量数据和我们乐于尝试接受我们新产品的用户。 我用会两个例子来说明。
+
+### Google Fusion Tables
+
+### WebTables
+
+## 一些忠告
+
+### 始终写些代码
+
+不管你的角色怎么转变提升,始终要坚持写些代码(如果你不会编程,也要让自己参与到代码审查中)。你用不着写的很多很好很重要,但是确保你能时常写些代码。受我两个好朋友(两位都是在他们各自领域毋庸置疑的领袖)的感染(他们就经常参与到日常编码活动中),我现在也开始编码了。在Google,
+我的一些编码活动总是很有产出。他们要么被作为新产品发行出要么在现有项目转型上起了大作用。编码也能让我和团队成员对于一些技术细节进行详尽的探讨。要知道现在编码实践和工具在快速变动着,写些代码让我能够与时俱进。最重要的是,我非常享受这一过程,让我想起了很多年前吸引我进入这个领域的那种快乐一样~
+
+### 始终关注数据
+
+### 学术界和工业界的权衡
+
+### 工作生活的平衡
+
+已经有很多文章探讨过工作生活的平衡这个话题了。我的建议很简单:你的平衡不是通过强制削减工作达成的。你要通过找到那些你生活中的乐趣和激情来让你离开办公桌!当然,家庭永远是第一选择,但通常我们还需要一些其他的。那我自身说,我通常在写那本关于咖啡书籍时体验最快乐(我不是为了工作生活平衡而特意去奖励自己去做那个,经常是后知后觉)。除了那些配孩子的时间,我发现那些花了很长时间研究和撰写关于咖啡(更不用说在这学习过程中各种新的听闻见识)给了我长时间的放松,不用去思考工作中的烦事。
+
+申明:
+不管你在哪里和你做什么,最重要是确保和那些优秀的人一起共事。
+
+
+
+
diff --git a/source/_drafts/growth-as-systme-not-tricks.md b/source/_drafts/growth-as-systme-not-tricks.md
new file mode 100644
index 0000000..8c4d6f2
--- /dev/null
+++ b/source/_drafts/growth-as-systme-not-tricks.md
@@ -0,0 +1,22 @@
+> 翻译自[Growth is a system, not a bag of tricks](http://andrewchen.co/growth-is-a-system-not-a-bag-of-tricks/) PS:译者也是上过增长黑客这本书作为案例的人呢~。 本文是 Manifesto 大会上通过Q&A和视频编辑而来
+
+最近我被Tim Chang(他是这次 Manifesto 大会的总组织人)采访了,我们对增长这个话题进行探讨,再尝试了多种策略,成功验证过不少增长的试验。
+
+下面是这次分享和Q&A环节的关键点总结。
+
+### 你是如何开始的?
+
+### 关于增长可以分享的:
+
+### 为什么是增长黑客?
+
+### 你做的决策应该可以体现在指标
+
+### 大型社交软件将取代应用市场成为下一个大平台
+
+
+
+
+
+
+
diff --git a/source/_drafts/guide-eliminate-code-smells-in-js.md b/source/_drafts/guide-eliminate-code-smells-in-js.md
new file mode 100644
index 0000000..0d0938f
--- /dev/null
+++ b/source/_drafts/guide-eliminate-code-smells-in-js.md
@@ -0,0 +1,163 @@
+
+针针见血,怎么消除JavaScript中的代码坏味道(1)
+
+## 常见的代码坏味道
+
+### 代码很绕的坏味道
+
+#### 上下文:
+如果单词以辅音开头(或辅音集),把它剩余的步伐移到前面,并且添加上『ay』如pig -> igpay
+如果单词以元音开头,保持顺序但是在结尾加上『way』如,egg->eggway等
+
+#### 糟糕代码:
+```js
+/* const */ var CONSONANTS = 'bcdfghjklmnpqrstvwxyz';
+/* const */ var VOWELS = 'aeiou';
+
+function englishToPigLatin(english) {
+ /* const */ var SYLLABLE = 'ay';
+ var pigLatin = '';
+
+ if (english !== null && english.length > 0 &&
+ (VOWELS.indexOf(english[0]) > -1 ||
+ CONSONANTS.indexOf(english[0]) > -1 )) {
+ if (VOWELS.indexOf(english[0]) > -1) {
+ pigLatin = english + SYLLABLE;
+ } else {
+ var preConsonants = '';
+ for (var i = 0; i < english.length; ++i) {
+ if (CONSONANTS.indexOf(english[i]) > -1) {
+ preConsonants += english[i];
+ if (preConsonants == 'q' &&
+ i+1 < english.length && english[i+1] == 'u') {
+ preConsonants += 'u';
+ i += 2;
+ break;
+ }
+ } else { break; }
+ }
+ pigLatin = english.substring(i) + preConsonants + SYLLABLE;
+ }
+ }
+
+ return pigLatin;
+}
+```
+
+#### 问题在哪:
+
+- 太多语句
+- 太多嵌套
+- 太高复杂度
+
+#### 检测出问题:
+
+关于Lint的配置项:如最大语句数,复杂度,最大嵌套数,最大长度,最多传参,最多嵌套回调
+
+```sh
+/*jshint maxstatements:15, maxdepth:2, maxcomplexity:5 */
+/*eslint max-statements:[2, 15], max-depth:[1, 2], complexity:[2, 5] */
+```
+
+```sh
+7:0 - Function 'englishToPigLatin' has a complexity of 7.
+7:0 - This function has too many statements (16). Maximum allowed is 15.
+22:10 - Blocks are nested too deeply (5).
+```
+
+#### 测试现行:
+
+```js
+describe('Pig Latin', function() {
+ describe('Invalid', function() {
+ it('should return blank if passed null', function() {
+ expect(englishToPigLatin(null)).toBe('');
+ });
+
+ it('should return blank if passed blank', function() {
+ expect(englishToPigLatin('')).toBe('');
+ });
+
+ it('should return blank if passed number', function() {
+ expect(englishToPigLatin('1234567890')).toBe('');
+ });
+
+ it('should return blank if passed symbol', function() {
+ expect(englishToPigLatin('~!@#$%^&*()_+')).toBe('');
+ });
+ });
+
+ describe('Consonants', function() {
+ it('should return eastbay from beast', function() {
+ expect(englishToPigLatin('beast')).toBe('eastbay');
+ });
+
+ it('should return estionquay from question', function() {
+ expect(englishToPigLatin('question')).toBe('estionquay');
+ });
+
+ it('should return eethray from three', function() {
+ expect(englishToPigLatin('three')).toBe('eethray');
+ });
+ });
+
+ describe('Vowels', function() {
+ it('should return appleay from apple', function() {
+ expect(englishToPigLatin('apple')).toBe('appleay');
+ });
+ });
+});
+```
+
+
+#### 重构后代码:
+
+```js
+const CONSONANTS = ['th', 'qu', 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k',
+'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'];
+const VOWELS = ['a', 'e', 'i', 'o', 'u'];
+const ENDING = 'ay';
+
+let isValid = word => startsWithVowel(word) || startsWithConsonant(word);
+let startsWithVowel = word => !!~VOWELS.indexOf(word[0]);
+let startsWithConsonant = word => !!~CONSONANTS.indexOf(word[0]);
+let getConsonants = word => CONSONANTS.reduce((memo, char) => {
+ if (word.startsWith(char)) {
+ memo += char;
+ word = word.substr(char.length);
+ }
+ return memo;
+}, '');
+
+function englishToPigLatin(english='') {
+ if (isValid(english)) {
+ if (startsWithVowel(english)) {
+ english += ENDING;
+ } else {
+ let letters = getConsonants(english);
+ english = `${english.substr(letters.length)}${letters}${ENDING}`;
+ }
+ }
+ return english;
+}
+```
+
+#### 数据对比:
+
+max-statements: 16 → 6
+max-depth: 5 → 2
+complexity: 7 → 3
+max-len: 65 → 73
+max-params: 1 → 2
+max-nested-callbacks: 0 → 1
+
+#### 相关资源:
+jshint - http://jshint.com/
+eslint - http://eslint.org/
+jscomplexity - http://jscomplexity.org/
+escomplex - https://github.com/philbooth/escomplex
+jasmine - http://jasmine.github.io/
+
+Reference: http://elijahmanor.com/talks/js-smells/#/0/3
+
+
diff --git a/source/_drafts/how-music-affect-work.md b/source/_drafts/how-music-affect-work.md
new file mode 100644
index 0000000..79232e6
--- /dev/null
+++ b/source/_drafts/how-music-affect-work.md
@@ -0,0 +1,70 @@
+如果哪个时间段我没带上降噪耳机工作,那我的效率肯定不高,因为我没有进入到属于我自己的由音乐营造的氛围空间中~
+
+编译自[How Music Affects Your Productivity](https://medium.com/life-learning/how-music-affects-your-productivity-42a6dfa6fdfe#.o4igwm3u)
+
+Since music has increasingly become a part the modern-day workplace.
+
+>『Music has a strange temporal permanence; as art decorates space; so does music decorate time』
+
+With so much of our time being spent at work, and so much of our work being done at computers, music has become inseparable from our day-to-day tasks — a way to “optimize the boring” while looking at screens.
+
+
+
+
+### 音乐让重复性的任务更有意思
+
+### 音乐是逃离繁杂办公环境的出口
+
+### 环境噪音是迸发创造力的好方法
+
+### 歌词有时会分散注意力
+
+### 熟悉的音乐让你更容易集中
+
+### 哪些音乐适合长时间的沉浸式任务?
+
+#### 古典乐 Classical Music
+
+为什么有效
+
+听哪些
+
+例子
+
+#### 电子乐 Electronic Music
+
+为什么有效
+
+听哪些
+
+例子
+
+#### 电子游戏乐 Video-game Music
+
+为什么有效
+
+听哪些
+
+例子
+
+#### 换个口味?
+
+为什么有效
+
+听哪些
+
+例子
+
+#### 环境噪音
+
+[SimplyNoise](http://simplynoise.com/)
+
+[RainyMood](http://www.rainymood.com/)
+
+
+### 营造完美的工作环境
+
+the environment you create impacts the behavior you get.
+
+test and tweak until you find the perfect harmony.
+
diff --git a/source/_drafts/how-node.js-work.md b/source/_drafts/how-node.js-work.md
new file mode 100644
index 0000000..9ad16b8
--- /dev/null
+++ b/source/_drafts/how-node.js-work.md
@@ -0,0 +1,37 @@
+> 翻译自[How does NodeJS work?](https://medium.com/eugene-obrezkov/how-nodejs-works-bfe09efc80ca)
+
+
+### Browser
+
+### Virtual Machine
+
+### V8
+
+### V8 Templates
+
+Function Template
+
+Object Template
+
+By now, we learned how to expose C++ methods\structures to JavaScript. We will now learn how to run JavaScript code in those modified contexts. It’s simple. Just compile and run principle.
+
+### V8 Compile && Run JavaScript
+
+### C++ -> V8 Templates -> Run JavaScript -> ?
+
+Modularity
+
+### C++ Module Loader
+
+### JavaScript Module Loader
+
+Let’s start with NativeModule first.
+
+Another thing is Module loader implementation.
+
+### NodeJS Runtime Library?
+
+### Event Loop
+
+
+
diff --git a/source/_drafts/how-popular-github.md b/source/_drafts/how-popular-github.md
new file mode 100644
index 0000000..bcdf301
--- /dev/null
+++ b/source/_drafts/how-popular-github.md
@@ -0,0 +1,187 @@
+
+
+目前为止我已经有五个流行项目(登上Github的Trending页),所以想分享我的一些经验和方法。
+
+如果你开源过代码,就会知道让别人对你的感兴趣是多么困难。这很奇怪,不是吗? 我们花了至少数百小时在这上,把它免费提供给别人却没人感兴趣!!经过几次较为幸运经历,我慢慢发现如何让其他人对我的开源工作感兴趣。如下图展示的:
+
+
+
+
+
+最终你希望得到那些使用你Repo(Github上开源的项目)的开发者的点赞加星。但第一步你需要先获得一些加星,你就是这篇文章的目的。
+
+首先,我介绍下我自己。我目前主要是一名iOS开发者,我在六个月前开始发布自己的开源作品。目前为止,我应该算是能在Github的世界范围顶级iOS开发者榜单上出现了。
+
+
+
+
+事实上我没有Github上显示的那么厉害(谢天谢地,不要鄙视我~)我觉得我能够在开源社区有些影响力,是因为我同时能做些设计工作(你接下来会见识到),下面是我的流行项目:
+
+- [TinderSimpleSwipeCards](https://github.com/cwRichardKim/TinderSimpleSwipeCards) (650+ 加星, 6 个月内)
+- [RKSwipeBetweenViewControllers](https://github.com/cwRichardKim/RKSwipeBetweenViewControllers) (400+ 加星, 4个月内)
+- [RKDropdownAlert](https://github.com/cwRichardKim/RKDropdownAlert) (500+ 加星, 4个月内)
+- [RKCardView](https://github.com/cwrichardkim/rkcardview) (500+ 加星, 2个月内)
+- [RKNotificationHub](https://github.com/cwRichardKim/RKNotificationHub) (500+ 加星, 一星期内)
+
+这上面的5个项目都上过Github流行的页面,我把如何做到如此分为6个步骤。
+
+六步骤(主要秘诀在第四到第六步)
+
+为了行文简短,一到三步骤会简单论诉下,四到六步骤会详细讲解。
+
+- 项目是最重要的
+- 阅读和调研
+- 开搞项目仓库
+- 写好 Readme
+- 配上好图
+- 注重反馈回路
+
+### 项目是最重要的
+
+Repo就是你作为开发者在构建的产品。
+那既然是产品,它就要解决用户的难题。你估计听见过不少那些著名的产品都是创始人正好碰到一些难题需要解决而产生。同样的思路,大部分开源出来的代码也是要解决开发者的一些难题。所以,你不一直的创造新东西你怎么会遇到那些待解决的难题呢~
+
+Twindr(Twitter+Tinder)就是我为了逗乐我朋友和自己这个简单原因做的傻傻的业务项目。不过最后它带来了 RKCardView(500+个加星)
+
+所以做业务项目,参加编程马拉松吧,周末和同事瞎搞搞。*找到你在重复什么样的代码*,从而你可以构建别人也会需要的模块化的东西~
+
+
+### 阅读和调研
+
+大部分问题已经被解决过成百上千万次了,并且它还会被继续重新解决。
+
+每次你想到某些可以开源做成Repo的,先看看是否其他人已经做过类似的了。如果真的已经存在,很多人已经在用了,说明它还不错,那么拿起来用别自己搞了。
+
+如果它还没有被解决,或者没有被优雅的解决,那开始你的调研。看看现有的方案,找出不喜欢它们的原因。我喜欢浏览现有项目的Githu Issues来为如何构建自己类似方案找灵感。如果我有足够时间,我会亲自使用这些项目记录下我遇到的一些问题(或文档上不好的地方),虽然我自己没这么做过,我只是听说过这个方案而且觉得真的不错。
+
+最后,开始真正过下它们现有的代码。譬如我喜欢 SVProgressHUB 这个项目。特别的,我喜欢它仅仅通过一行代码就能调用而不需要创建和维护对象才能实现。最终我以类似的方式实现了 RKDropdwonAlert。
+
+
+### 开搞项目仓库
+
+先快速说5次这句话:『简单,直白,可用』!
+
+我意识到我最近的项目比之前的老项目更快的获得一些关注和加星。可能是因为越来越多人认识我了(我觉得自己非常有名哈哈哈),但我觉得是因为我越来越懒了。一开始我写开源项目时,我会写很多很多代码就为了些不那么明显优化,我因为那些很重要很吸引人。不过现在我会构建优雅好用的东西,却花不少时间来清理接口/界面。
+
+
+
+RKNotificationHub 汉堡菜单按钮的左上角。
+
+我们拿RKNotificationHub(RKNH)来举个例子。
+
+一开始我设想RKNN是当我希望在我项目的菜单按钮上加上一些东西,因为我认为是非常好的懂事吸引用户来检查下新功能。这的确工作的很好,我持续在其他项目中也陆续使用。
+
+一开始我设想这个Repo可以支持大量的后端的全能型通知系统。譬如链接到类似 set,array,dictionary,API hit,APN等上,每次值改变了就更新它。
+
+不过最终,我就实现了简单的UI逻辑,把具体业务逻辑交还给用户自己去实施,使它们有更多精细控制。为什么?因为我变懒了,但是我认为它也有它的优势:足够简单,轻量和直白,非常易于使用。
+
+一句话总结就是:如果没人知道怎么使用你的代码,那么就没有会使用它。
+
+
+### 写好 Readme
+
+Readme(Github允许你创建该文件,通过markdown等语法来在项目主页显示你项目相关内容)是你整个项目中最重要的内容。
+
+如果你最后只能从该文章学到一样的话,我觉得就应该是:
+
+> 你在代码上花多长时间,那么就花同样的时间来写你的 README 吧。
+
+我是认真的!事实上,我认为我在Github上的成功很大部分来自于我认真设计我的 README 让它更具美感(也证明了我就是一般程序员而已)。
+
+下面是我是怎么布局我的 README 文件的:
+
+
+
+
+
+一些关键点是:
+
+- 它是大部分人会停留还是会离开的关键。把它做好些从而开发者更会在走之前给它加星。越多人加星,就说明越多人认可/相信你的项目。
+- 图片,图片,图片!使用类似于 LICEcap 来创建gif图如果它们是些动画效果,把创建好的图片统一放在 imgur 帐号中。
+- 展示,而不是啰嗦讲诉。 不要用文字说它怎么怎么优雅解决什么什么问题了,用一张 GIF 来展示,它比啰啰嗦嗦的废话好用多了。给他们展示代码示例。
+- 你必须有个 HOW-TO 的部分。用的人不会通读你的代码,所以你必须替他写好示例。
+- 用图片辅助你的代码示例来更好展示效果
+- 如果有人提issue了,尽快解决它。如果有人提出同样的问题多次了,那么考虑是否要把这个写到 README 上了。
+
+
+### 配上好图
+
+图片效果是好于文字的。
+
+Repo 中确实需要好代码。不过我敢打赌如果我画一些好看的图片不放代码依然能获得现在60%的加星。*有了好的科技,然后好的设计就随之而来* (wherever tech goes, design eventually follow)。消费硬件,应用,网站,着陆页等都说明了这个趋势。技术我们定位的是Github的浏览用户,而仅仅是开发者。
+
+下面有些当你在做图需要考虑的一些关键点。我还是使用 RKNK 中图作为例子。
+
+> 思考怎么把你的Repo的目的传达出来。
+
+你想要他们能理解为什么这个Repo能有用。RKNK 就是创建出简单的通知图标,所以我决定使用 Facebook 的通知中心作为中心图片。
+
+留意空间
+
+
+
+在顶部的title部分有个特定的短链接,在结尾有我的Twitter。然后把中间部分且为两块。
+
+左边的图来展示如何使用RKNH的使用。它被居中排放(有不少的留白),人们大多都是从左读到右的,所以左面承载了更主要的概念。
+
+右边的图通用被居中并且留有空白。如果说左边是为了说明这是个什么产品,那右边就是来说明你为什么需要使用它。动画很具有吸引力,所以我想用它来展示。
+
+最终效果:
+
+
+
+
+这个图不仅仅是开始一份不错 README 的简单有效的方式,也同样是*适合分享*。
+
+快速说下目前的工具。我绝大部分的设计工作通过 Sketch3 来完成(它是个非常简单的图片设计软件),GIFs 通过 LICEcap 录制,并且在 GIMP 中被编辑。它们有些不太好用,不过也是我目前能发现最好的免费方案了
+
+
+### 关注反馈回路
+
+迭代!开动!可执行的指标!
+
+现在我们有了图片和不错被加了文档的代码。我要向你展示如何玩转整个洗通过你。我首先介绍下 Github 的 Trending 流行页的机制。
+
+
+
+这就是你要努力登上的页面。
+
+
+
+
+数据是 Github 提供的,时间窗口不明确,我觉得应该是一周。
+这就是原因。大于90%的页面流量和跳转来自于 Github 本身,很可能是来自于 trending 流行榜单页。
+
+成千上万的开发者到 Github 的流行页面来看看开发社区中又有哪些流行的东西。更棒的是这些人都有Github帐号并且都登录着。如果你喜欢获得Github加星,这些人就是最好的来源。
+
+流行页的算法也很简单:就是看在特定时间内被加星的次数。当天和一周都是这样。
+
+反馈回路(feedback loop)是我用来让更多观众参与进来的方法(对他们的建议尽快的回复和迭代)。这是从 the lean startup 中获得的启发和也是我第一次获得30个加星的方法。
+
+反馈回路看起来像:
+
+- 贴出带有图片的链接(比单单的Github有效多了)
+- 几分钟内获得反馈
+- 及时回复这些反馈
+- 重复两到三次,直到完成初次的传播
+
+因为之前的不愉快的事,我现在不太喜欢也很警惕在我个人的社交网络中王婆卖瓜似推广自己的东西。所以除了这篇文章,你很少能在Facebook上看我的状态。对我来说, Reddit 就是个不错的地方,我能够获得匿名的反馈(因为那些人也喜欢学习和接受新东西)。它确实是一个积极和提升自信的好环境。
+
+当然你不一定就要选Reddit作为主要平台。我只是觉得它适合我。你可以更倾向于 Product Hunt,Twitter,Facebook,同事间,本地的计算机科学的用户组类似于编程马拉松的群组等。确保记住一下的原则:
+
+- 如果你的作品是垃圾,那反馈很可能也是
+- 如果你的文档是垃圾,那反馈也不会是什么好货
+- 如果你还要和那些花时间给你他们建议的人争吵,那你几乎就会失去他们的后续关注
+
+我们再看看上面的来源网站的截图,可以发现Reddit给我带来了58个人,那我需要从这个58人中取得最初的30个加星。这就是显示出之前我们的工作(如项目文档README和配图)的作用了,所以要加倍努力去取得这最初的加星。
+
+如果我遇到一些举棋不定的时刻,我总会求助于我的部分开发者朋友。他们都会帮我解决难题,所以密切关注他们。
+
+
+
+### 结论
+
+感谢那些读到现在的朋友,我希望你们马上就能够获得你想要的效果,但是要记住这不是一个一撮而就的魔法。你还是需要做你该做的工作,也许需要花上上百个小时。我并没有夸大(当我说编码和写文档的时间应该1:1的对应),越是复杂的大型项目越需要越清晰易懂的文档。
+
+你也许会从你写的小东西上获得好几百的加星,但是如果你真的搞出影响力,你需要做出大型项目。我个人在接下来几个月会继续花时间来维护现有的开源项目,试着理解开发者上什么使用我的Repo的。构建创造是快乐的,不过修复问题也是同样重要的。
+
diff --git a/source/_drafts/how-to-deply-software.md b/source/_drafts/how-to-deply-software.md
new file mode 100644
index 0000000..727a21f
--- /dev/null
+++ b/source/_drafts/how-to-deply-software.md
@@ -0,0 +1,189 @@
+
+不管何时,你对你的代码仓库进行的任何修改,都会有可能搞砸线上的某些服务。
+
+没人喜欢那样(服务downtime),没人喜欢惹怒用户,更没人喜欢惹怒他的经理。所以说每次发布迭代的新代码到线上都是充满压力的事。
+
+不过,事实上不必每次都那么紧张的。在这篇文章我会反复说明这样的观点:
+
+『你的部署应该变得非常无聊,非常直白,从而毫无压力』
+
+部署产品服务新的主要功能到生产环境:
+
+- 应该是像在Hacker News上开始一次关于空格还是Tab的口水战一样简单
+- 应该足够简单,以至于新来的员工都能上手
+- 应该是防止产生错误的
+- 应该是远远在用户看到新代码生效前被反反复复测试验证过的。
+
+这是一篇非常长的(抱歉,但不得已不如此)的关于部署的较高层次的观点文章:协作,安全和节奏。不过文中还是有不少较为底层细节的部分,因为那些很难在语言层面上去抽象,所以不得不撩开袖子去单独解决和说明。我喜欢讨论团队间是如何配合协同,而部署恰恰是最需要和别人(团队)打交道的一件事,我认为你们要时不时花时间去验证下目前团队的一些做法,这很有价值。
+
+这篇文章的内容大部分来自于我在Github长达五年的工作经历和最近一年为大大小小的很多创业公司的建议和咨询的经历(主要集中在提升它们部署流程方面,而它们之前的状况既有『目前还不错的』又有『要紧急救火的』)。特别值得说的是,其中一家叫 Dockbit 的创业公司,它们的产品正是为了在部署时更好协同。所以本文不少来自于我和他们团队城成员的交谈中,这其中有不少我认为是关于部署这个话题很有价值要记录下来与大家分享的。
+
+我非常感谢来自于把不同公司的朋友对此篇文章的不断评审检查和建议(来源于他们自身在部署方面的深刻见解和经验): Corey Donohoe (Heroku), Jesse Toth (GitHub), Aman Gupta (GitHub), and Paul Betts (Slack)。我发现非常有趣的是不同公司在部署这件事上的做法非常不同,但是大家都基于类似的目标和关注点:协作,风险和注意事项。我认为这正是共通东西。
+
+为这么长的开头道歉。不过考虑到这篇是那么的长,也值得如此。
+
+目录:
+
+- 目标
+
+ 部署不是要解决一些问题吗
+
+- 准备
+
+ 开始部署前的热身,让我们关注测试,功能标志位/开关(flag),和你们常用的代码协作方式
+
+- 分支
+
+ 为代码建立分支对于部署非常重要。你要尽量隔离新代码可能导致的一些未知后果。所以我们会讨论分支部署上的一些不同做法:如主分支自动部署和蓝绿部署等
+
+- 控制
+
+ 部署的主要工作。你们控制那些需要发布的代码?需要围绕部署和合并代码设置不同的权限结构,开发和审查你所有部署有迹可循,通过部署锁和部署队列来让一些变得有序。
+
+- 监控
+
+ 酷,我们的代码终于能上线了。接下来你可以关注部署相关的多样监控指标,为部署收集足够的数据,来最终确定部署是否符合预期还是要回滚代码。
+
+- 结论
+
+ 朋友们,你学到了什么?
+ 好像有没什么,大概是不要再犯愚蠢错误了
+
+本篇文章初发宇2016年3月1号。
+
+
+## 目标
+
+当你讨论如何把一行行代码把它们从代码仓库移动到不同的服务器的过程。的确有不少把这个解决的很好很傻瓜方案:Ruby下的Capistrano,Python下的Fabric,Node的Shipit,还有AWS,最差的还有FTP这个几个世纪前的方案。所以说目前工具还不是部署的问题所在。
+
+那既然我们有这多好用的工具,为什么我们的部署还会出错呢?为什么线上还有那多bug呢?为什么服务还会有宕机呢?我们都是完美的程序员交付完美的代码。呵呵!
+
+显然事情不总会按照我们预期的方式进行。所以我才认为部署对于小或中型公司是非常值得集中投入的有趣领域。很少有这么具有高收益的领域了。你能否在你的流程中加入提前预测问题的机制,你能否使用不同工具来帮助使你的部署更容易?
+
+『根本不是工具的问题,是流程问题!』
+
+过去几年我聊过的有大量大量的创业公司,并没有在公司层面上对一个好的部署流程应该是什么样子这件事做上的很好。
+
+你不需要发行(部署)经理。不需要要预留特定某天做部署。你不需要每次部署都xin'sh
+兴师动众。你只需要选择一个明知的部署方案。
+
+
+## 准备
+
+### 先打个好底子
+
+跑之前我们要学会走。我发现现在所有创业公司的都会使用上最新的部署相关的工具链,当他们开始尝试使用却发现在这个过程需要花80%的时间去处理一些基础问题。一旦把一些基础事项准备好,剩下的就很容易按部就班的实施了
+
+### 测试
+
+测试是最容易开始的部分了。它不是正常部署迭代中的一部分,但却对部署有巨大影响。
+
+根据不同的语言,框架和平台,关于测试有不少技巧。但通用建议是:测试你的代码,然后加速你的测试运行。
+
+我一直喜欢引用Ryan Tomayko 在Github内部测试文档写的一句话来说明这个问题:
+
+『我们让好的测试运行的足够快,但不能让那些草率的测试变得足够好而有用』
+
+所以打好基础:写好测试。不要对它敷衍了事,因为它影响你接下来流程的所有其他事。
+
+一旦你有了可以依赖的测试集后,接下来就要花钱处理这个问题。如果你们团队有部分预算和收入,几乎最值得投入的就是优化下你测试运行的机器。如果你运行测试在类似于 Travis CI 或 CircleCI上,并行运行它们,花目前两倍的钱在这上。如果你的测试运行在某些机器上,那么多买些机器。
+
+通过让测试集运行的更快,我觉得是公司能够在效率提升上取得最大成效的不二做法了。因为它毫无意外的影响这反馈迭代速度,部署时间,开发者心情和惯性。在这个问题上花足够的预算吧:服务器很便宜,工程师很贵。
+
+你的测试应该要快到什么程度?我还在Github时,它的测试一般在两三分钟内运行玩。我们并没有太多的整合测试,从而允许相对快的测试运行。
+
+现在有非常多的项目来帮助并行加快你的构建。如 Ruby社区就有 parallel_tests 和 test_queue。
+
+### 功能开关位
+
+从另外的角度看这个问题:开始关注下你们的代码,让它现在就开始支持多部署代码路径?(multiple deployed codepaths)
+
+记住,我们的目标是『你的部署应该变得非常无聊,非常直白,从而毫无压力』。而一般压力来源于你新部署的代码会导致你之前没有预测到的问题。从而最终影响了用户的使用(如它们遇到服务宕机或bug了)即使你有全宇宙最好的工程师但是你还有有可能把糟糕错误的代码部署上线,不过这错误代码影响了100%的用户还是就影响了一个用户区别很大!
+
+一种处理这个问题的好方法是功能开关位[feature flags](https://en.wikipedia.org/wiki/Feature_toggle),功能开关位早就存在了,从if语句被发明时估计就存在了。不过我记得第一次听到有公司使用功能开关位是在Flickr在2009年的一篇博客中:失控([Flipping out](http://code.flickr.net/2009/12/02/flipping-out/))
+
+> These allow us to turn on features that we are actively developing without being affected by the changes other developers are making. It also lets us turn individual features on and off for testing.
+
+在生产环境中使用功能开关位,从而使的一些功能只有你看见,或只有你的团队,你们公司员工才能看到。这提供了两个好处:
+
+- 你可以在真实环境用真实数据测试你的代码,确保所有功能都一切正常。
+- 你可以得到真实的测试性能基础数据和避免如果这个特性上线开放给全部用户是否拖垮服务器的风险
+
+它带了的巨大好处,就意味着当你准备好真正上线你的新功能时候只需要设置之前的开关位置成true就行了,然后所有用户都能使用这些了。这样就让很吓人的发行新版本『变得非常无聊,非常直白,从而毫无压力』。
+
+译者注:好像在Facebook通过WIFI等公司网络的调整,使得类似*.facebook.com等访问自动被切换到最新的UAT环境,使得 eat oneself's dogfood,也是不失为一种好方案。
+
+
+### 能被验证正确的部署
+
+功能开关位跟进一步提供了一种非常好的方式,来证明你要部署的代码不会导致对性能和稳定性上反面效果。最近几年有不苏澳工具来帮助你实现它。
+
+我过去写过类似的([Move Fast and Break Nothing](https://zachholman.com/talk/move-fast-break-nothing/))。这个做法就是在线上同时运行包含开启和关闭功能开关位的代码,从这两个运行环境下收集数据,从而可以产出图表和统计数据来知道你带到线上的新代码是否匹配你准备替换掉代码的功能。一旦有了类似的数据,你就能确保你是否搞糟某些。『部署变得非常无聊,非常直白,从而毫无压力』
+
+
+
+Github开源的叫 Scientist 的Ruby类库来帮助在这方面抽象。这个类库已经被移植到很多流行语言上。如果你感兴趣它们值得你花些时间去研究使用下。
+
+关于此的另一个法子是:逐步发布/灰度发布(percentage rollout)。即使你非常确信你要部署的代码是准确无疑的,明知的做法还是先把代码分发出一部分比例的用户,来再三确认没有什么未预料到的不好后果。因为再不济,影响100%的全部用户肯定比影响5%的用户严重的多。
+
+这也有不少工具类库来帮我们实施,从Ruby社区的Rollout,Java社区的Togglz,Javascript社区的[fflip](https://github.com/FredKSchott/fflip) 等等还有很多。还有一些创业团队来攻克这个难题如LauchDarkly。
+
+这不是仅仅Web上能做的,手机客户端软件也可以得益于此。看看[GroundControl](https://github.com/mattt/GroundControl) 这个类库是怎么在iOS上实现类似行为的。
+
+
+## 分支
+
+### 通过分支来组织
+
+### 代码分支
+
+### 代码审核
+
+### 分支和部署节奏
+
+### 分支部署
+
+### 自动部署
+
+### 蓝绿部署
+
+
+## 控制
+
+### 控制部署流程
+
+### 审查追踪
+
+### 部署锁
+
+### 部署队列
+
+### 权限
+
+
+## 监控
+
+### 检查你的工作
+
+### check the playbook
+
+### 指标
+
+### 部署后的清理
+
+
+### 结论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/_drafts/howto-blog-hexo.md b/source/_drafts/howto-blog-hexo.md
new file mode 100644
index 0000000..b101308
--- /dev/null
+++ b/source/_drafts/howto-blog-hexo.md
@@ -0,0 +1,7 @@
+---
+title: 【HowTo】用 Hexo Next 主题建个博客
+categories: HowTo
+tags: [Node.js, JavaScript]
+date: 2016-02-01 07:56:29
+---
+
diff --git a/source/_drafts/howto-omnioutliner-usage.md b/source/_drafts/howto-omnioutliner-usage.md
new file mode 100644
index 0000000..37be939
--- /dev/null
+++ b/source/_drafts/howto-omnioutliner-usage.md
@@ -0,0 +1,7 @@
+介绍我是怎么使用omnioutliner的
+ 梦想记事本
+ 阅读摘抄
+ 精力积分商场
+
+
+
diff --git a/source/_drafts/interview-question-remote-employer.md b/source/_drafts/interview-question-remote-employer.md
new file mode 100644
index 0000000..b1f787c
--- /dev/null
+++ b/source/_drafts/interview-question-remote-employer.md
@@ -0,0 +1,56 @@
+
+你们中很多人可能注意到了:在职位列表中,最近有个新类别在不断的如雨后春笋般冒出。
+
+你们可能也注意到了有些工作看起来非常有趣,可能比你能接受上下班通勤范围内发现的工作机会都有趣。我认为每个人都应该有机会做他自己真正感兴趣的工作。如果我创办个公司,我找人的第一考察要素就是候选人是否对我们要做的足够有热情,其他的指标都没有这个重要!
+
+那么现在的问题是你该如何面试哪些你们梦寐以求的远程工作机会。接下来我们看看一些指导意见和一些你会向可能的远程工作的老板问的问题。
+
+### 彻底的远程工作
+
+大部分我为之工作和支持过的公司都允许某种程度的远程工作。很明显一些比另一些好,因为远程工作对员工和老板都有一条较为陡峭的学习曲线。
+
+一般而已在职位列表中出现标为远程的工作是指彻底的远程工作。这意味着你可以完全可以飞刀另外的国家去间一个朋友,在一个季度(甚至更少)才见上同事们一面(很显然是除了视频聊天的方式)。有时候你也不一定非要现场见他们。通过类似于Slack/Hipchat,像Skype或Google环聊这样的视频聊天工具,项目灌流工具等,交流沟通工作很容易被完成,对,别忘了还有电话和电子邮件。
+
+### 找什么样的远程工作
+
+我相信有很多重要的事要注意,我建议你们在下面回复评论~
+
+- 你们现在有多少全职的远程员工?
+
+好的回答:『我们员工大概有25%在远程工作』
+不好的回答:『事实上你会是第一个,我听说把职位设成远程可以吸引更多人。对了,你考虑换城市到我们这吗?』
+
+- 你们和远程员工间是如何沟通的?
+
+好的回答:『我们通常在网聊,但是通常在站立式早会上会接视频会议。除了小明(Fred)他在船房上网速带宽不高』
+不好的回答:『我们使用 XXX 项目管理软件和电邮,大概就这样』
+
+- 每天,你们在公司办公室的员工用 Slack/Hipchat 用的多吗?
+
+好的回答:『几乎一整天都在用。他们经常坐在旁边不转头聊却在聊天室中发消息~』
+不好的回答:『既然他们都在办公室那就没必要用网上聊天了』
+
+- 你们是怎么解决和远程项目成员的协作问题的?
+
+好的回答:『我们有个大画板,每个人都有个APP可以在在上面图画,其他人都能看到。我们也会让每个人参加项目的视频会议,如果有需要会定期对一些难题进行探讨』
+不好的回答:『我们通常不会把人都叫上。在办公室的人会在白板上图画,然后就开始实施项目』
+
+- 一般你们什么时候下班每天?
+
+好的回答:『一般会在5,6点,也看他们什么时候开始上班。6点半以后的工作一般会非常低效率。但是偶尔也是需要发一些紧急的消息和文章等』
+不好的回答:『通过IM聊天,我们随时随地交流,让团队在24/7/365都是可联络到的』
+
+- 你们和远程员工一般还有用多少工具?
+
+好的回答:『我们用特定的工具解决特定的问题。我们用Github作为仙姑管理,Slack作为异步沟通工具,Skype来做视频会议。』
+不好的回答:『我们使用邮件,还有不少项目管理软件,bitbucket,github还有一些内部的gitlab项目仓库,一些人在AIM一些人在IRC,其他人用Slack,有个小组用邮件沟通的特别多~』
+
+### 结论
+
+以上各种问题和回答的评判标准,主要是看看管理是否足够好,来利用好远程工作提供的那些好处优势。如果管理层不能100%支持远程员工,那么你可能会有个理想的工作机会,做着自己理想的产品但是事情很快会变得糟糕,让你想要逃离~
+
+你可以试着在多个提供远程工作机会的公司面试,看看他们是怎么回答这些问题的。通过这些不同的回答你可以分辨出哪些在文化骨子中就支持和提倡远程工作的,和那些刚开始转型并没有十分认同这概念的公司~
+
+这篇文章是为了帮助那些开始面试一份远程工作的人。所以请把你的想法和点子评论回复出来,很可能因为你的贡献就能让那些原本很可能进入远程工作的坑的候选人找到份可以和之成长为之奋斗的好远程工作机会!
+
+
diff --git a/source/_drafts/javascript-learn-tools.md b/source/_drafts/javascript-learn-tools.md
new file mode 100644
index 0000000..4e768b5
--- /dev/null
+++ b/source/_drafts/javascript-learn-tools.md
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/source/_drafts/javascript-reason-fatigue.md b/source/_drafts/javascript-reason-fatigue.md
new file mode 100644
index 0000000..8b50137
--- /dev/null
+++ b/source/_drafts/javascript-reason-fatigue.md
@@ -0,0 +1,34 @@
+
+由于项目需要我最近几个月需要重试前端开发的旧业,我立即被一个悲催事实吓到:所有东西都变了!!
+
+当我还在JavaScript或前端社区仅仅参与时,这种改变看起来很小。我们会时不时转换打包工具(从RequireJS 到 Browserify),或者改变框架(从Backbone 到 Web Component),有时候我也会玩玩最新的V8引擎的新特性。大部分时间,这种更迭是增量的。
+
+我只是短暂离开了一会,回来后突然发现JavaScript社区的永不止步(折腾死人)的这种情况。
+
+一些年前,我和朋友还在讨论怎么选择一款合适有正确的模块系统。那时他想要用上RequireJS,我却推荐他参考和选择 Browserify或Component(因为我们刚刚抛弃RequireJS替换为Component)。
+
+昨天晚上和他又聊了会,他说他当时选择了RequireJS。到目前为止,他们公司在此之上构建了大量的代码 - 『我想我押错赛马了』
+
+这让我思考,在JavaScript这个不断更迭的混沌下,没有所谓的正确的赛马可押。你要么要持续的更新你的技术栈来与时俱进,要么就要对你目前所押的技术知足。作为开发者我们为别人构建产品,很难知道什么时候需要投资到新技术栈中。
+
+不管你喜欢不喜欢,JavaScript比现有计算机历史上的所有语言都以更快的速度更迭着。
+
+我们现在用的大部分技术之前都不存在。如:React,Flux,JSX,Redux,ES6,Babel等。甚至为了新建个符合目前选型的项目就需要安装一大帮依赖,构建工具也几乎全是新的。没有其他语言会有这种糟糕的事情发生。顺便做个推荐篇文章[16年JavaScript生态发展趋势和选型](https://github.com/gaohailang/blog/issues/12),这样你能确保目前的选择是大致正确的。
+
+所以,为什么JavaScript这么能折腾?
+
+### 一条孤独旅程
+
+### 浏览器之前
+
+### ES重崛起
+
+### 浏览器
+
+### 构建系统和垫片(Shims)
+
+### 转译器
+
+### 押中赛马
+
+
diff --git a/source/_drafts/learnangular2.com.md b/source/_drafts/learnangular2.com.md
new file mode 100644
index 0000000..c019546
--- /dev/null
+++ b/source/_drafts/learnangular2.com.md
@@ -0,0 +1,160 @@
+learnangular2.com
+
+## Intro
+
+```shell
+Angular 2 is the next version of Google's massively popular MV* framework for building complex applications in the browser (and beyond).
+
+Angular 2 comes with almost everything you need to build a complicated frontend web or mobile apps, from powerful templates to fast rendering, data management, HTTP services, form handling, and so much more.
+
+We hope these simple tutorials help you get up and running with Angular 2 quickly, which cover the basics of using Angular 2, but also ES6 and TypeScript.
+```
+
+## Why
+
+```shell
+When Angular 2 was announced in October 2014 at the ngEurope conference
+a faster, more powerful, cleaner, and easier to use tool than we had with Angular 1. We found a tool that embraced future web standards and brought ES6 to more developers around the world.
+
+In many ways, Angular 2 still felt like Angular, it was just based on new JavaScript standards and using best-practices developed in the years after the first Angular release. "Angular" had become a design pattern with multiple implementations.
+
+We hope you find Angular 2 as inspiring as we have, and we hope this guide helps you get there as quickly as possible.
+```
+
+## 组件
+
+```shell
+在Angular2中,组件是构建和申明页面中元素和逻辑的主要部分。
+
+In Angular 1, we achieved this through directives, controllers, and scope. In Angular 2, all those concepts are combined into Components.
+
+A SIMPLE COMPONENT
+
+Here's a simple Component that renders our name, and a button that triggers a method to print our name to the console:
+
+When we use the tag in our HTML, this component will be created, our constructor called, and rendered.
+
+```
+
+```js
+import {Component} from 'angular2/angular2'
+
+@Component({
+ selector: 'my-component',
+ template: '
Hello my name is {{name}}.
'
+})
+export class MyComponent {
+ constructor() {
+ this.name = 'Max'
+ }
+ sayMyName() {
+ console.log('My name is', this.name)
+ }
+}
+```
+
+## 应用生命周期
+
+Angular apps go through a multi-stage bootstrap and lifecycle process, and we can respond to various events as our app starts, runs, and creates/destroys components.
+
+### BOOTSTRAP
+
+Angular 2 apps (currently) need to be bootstrapped using the root component for the app.
+
+This component is where you can put application-level code and configuration, and its template is where the whole app component chain gets created.
+
+### COMPONENT INIT
+
+When a component is created, its constructor is called. This is where we initialize state for our component, but if we rely on properties or data from child components, we need to wait for our child components to initialize first.
+
+To do this, we can handle the ngOnInit lifecycle event. Optionally, we could call setTimeout in our constructor for a similar effect:
+
+COMPONENT LIFECYCLE
+
+Like ngOnInit, we can track several events through the lifecycle of a component. For a full list, see the official Angular 2 Lifecyle Hooks docs.
+
+如ngOnCheck, destroy, ngAfterContentInit, ngAfterViewInit等等
+
+
+## 模板
+
+{}: RENDERING
+To render a value, we can use the standard double-curly syntax:
+Pipes, previously known as "Filters," transform a value into a new value, like localizing a string or converting a floating point value into a currency representation:
+
+[]: BINDING PROPERTIES
+To resolve and bind a variable to a component, use the [] syntax. If we have this.currentVolume in our component, we will pass this through to our component and the values will stay in sync:
+
+(): HANDLING EVENTS
+To listen for an event on a component, we use the () stynax
+
+[()]: TWO-WAY DATA BINDING
+To keep a binding up to date given user input and other events, use the [()] syntax. Think of it as a combination of handling an event and binding a property:
+(从而你的组件和值会stay in sync with input value)
+
+*: THE ASTERISK
+* indicates that this directive treats this component as a template and will not draw it as-is. For example, ngFor takes our and stamps it out for each item in items, but it never renders our initial since it's a template:
+
+## 事件
+
+Events in Angular 2 use the parentheses notation in templates, and trigger methods in a component's class. For example, assume we have this component class:
+
+``
+Our clicked() method will be called when the button is clicked.
+
+DELEGATION
+
+Events in Angular 2 behave like normal DOM events. They can bubble up and propagate down. Nothing special to do here!
+
+EVENT OBJECT
+To capture the event object, pass $event as a parameter in the event callback from the template:
+
+``
+This is an easy way to modify the event, such as calling preventDefault:
+
+## 表单
+
+http://learnangular2.com/forms/
+
+Forms are the cornerstone of any real app. In Angular 2, forms have changed quite a bit from their v1 counterpart.
+Where we used to use ngModel and map to our internal data model, in Angular 2 we more explicitly build forms and form controls.
+While it feels like more code to write, in practice it's easier to reason about than with v1, and we no longer have to deal with frustrating ngModel and scope data problems.
+
+SIMPLE FORM
+FORMBUILDER
+FORM DIRECTIVES
+CUSTOM VALIDATORS
+HANDLING FORM VALUES
+
+
+## 语言
+
+One of the most difficult things for developers new to modern JavaScript is how to actually write modern JavaScript.
+
+There's ES5, ES6, then ES7, TypeScript, AtScript, Dart, Babel...the list goes on.
+
+JavaScript is largely a standards-driven language. That means a committee agrees on what "JavaScript" is, at least the lowest common denominator of it, and browser vendors work to implement those features. Today (but not for long), ES5 is that version of JS that is most widely supported.
+
+However, committee-driven design is notoriously slow, so everyone from independent developers to browser vendors are eager to use and implement new JS features faster than the standards organization can approve them.
+
+JavaScript as browsers understand it is a bit like the "assembly of the web," meaning that it can correctly run code that was implemented in a higher level language and "compiled" down to JS the browser understands.
+
+That is exactly what CoffeeScript was, which was one of the first very successful higher-level JS languages. A developer would write CoffeeScript, and the compiler tool would generate plain JavaScript underneath.
+
+This is what we see today with ES6 and everything in between. Browsers don't yet implement natively a lot of ES6+ features, and developers want to innovate on what JavaScript is. This means they've gone to building these higher-level JS languages like AtScript, TypeScript, and tools like Babel that implement futuristic JavaScript features and compile down to ES5.
+
+Dart is an experimental language created several years ago by Google. We do not recommend using Dart as new JS features supersede it.
+
+AtScript was an experimental language created by Google to extend JS and Typescript with new features such as annotations and type introspection. It is now defunct.
+
+Typescript is Microsoft's extension of JS that comes with powerful type checking abilities and object oriented features. Both Angular 2 and Ionic 2 use TypeScript.
+
+ES6 is the next version of JavaScript that was just recently approved that comes with a ton of new ways to write JS. ES7 is a future standard of JS that some are already implementing in these higher level languages.
+
+CONCLUSION
+If you'd like to develop with "plain" ES6 and ES7, you can use Babel, the "compiler for writing next generation JavaScript." If you'd like to use Ionic and Angular, we recommend TypeScript which will provide similar features as babel, with extra type checking if you choose to use it.
+
+If you're interested in type checking and new OO features, or want to contribute to Angular 2, check out TypeScript.
+
+
+
diff --git a/source/_drafts/left-bank-to-fintech.md b/source/_drafts/left-bank-to-fintech.md
new file mode 100644
index 0000000..c84de37
--- /dev/null
+++ b/source/_drafts/left-bank-to-fintech.md
@@ -0,0 +1,20 @@
+> 翻译于[Why I left Wall Street for FinTech](https://medium.com/@soppstu/why-i-left-wall-street-for-fintech-7a7ee10bf811),后续会更多选择相关的题材进行关注,来吧,加入Fintech Storm~
+
+# 离开华尔街,走向Fintech公司
+
+做出这个大的职业转变的决定主要是因为一推一拉的原因。当它们同时作用,你就会做出这个决定。
+
+## 推
+
+在2008年,在监管者意识到系统杠杆和复杂度不可能在短期内得到解决,美国银行业迎来了高度的监管。在这样背景下,像摩根斯坦利和高盛这样的投资银行被迫转变为银行控股公司从而获得流动性和融资发债券的可能。银行控股下就限制了类似于会计审计,高风险高获利的机会也少了,导致之前投资银行可以开展的业务都不好开展了
+
+我工作的摩根斯坦利公司也被迫在这样的环境下转型。它把主要资源投入到财富管理业务(通过从花旗银行收购美邦这样的零售经纪公司)。这清晰的标志着它的重心从之前交易回报转变为获取顾客业务。
+
+当时在圈子里,一般有两个选择。要么还是待在着不景气的银行业,要么去对冲基金大业中。大部分交易员选择了后者。
+
+而我,选择了第三个:Fintech 金融科技公司。
+
+## 拉
+
+比特币
+
diff --git a/source/_drafts/math-words-smart.md b/source/_drafts/math-words-smart.md
new file mode 100644
index 0000000..7637a9e
--- /dev/null
+++ b/source/_drafts/math-words-smart.md
@@ -0,0 +1,126 @@
+
+翻译自[How to Use Math Words to Sound Smart](https://medium.com/conquering-corporate-america/how-to-use-math-words-to-sound-smart-7391a5166e1)
+
+你想过为什么每次和工程师们讲话沟通起来都感觉他们好聪gu明guai的样子。很多什么时候会用上不少数学术业来『装逼』。不过又不仅仅是他们才会用这些,快来学起来~
+
+接下来我们来逐一看看这些词,并且学学怎么使用它~
+
+### delta
+
+- not want
+
+这两份Snapchat的市场提议听起来都不错,但是他们之间区别是啥?
+
+- want
+
+what’s the delta here?
+
+
+
+
+### exponential
+
+- not want
+
+our hands-free hand washing app is experiencing massive growth
+
+- want
+
+we’ve got exponential growth 指数级增长
+
+### orthogonal
+
+- not want
+
+Vegan lunches have nothing to do with getting more expresso machines
+
+- want
+
+That's an orthogonal issue
+
+### binary
+
+- not want
+
+Either you're going to give us a million dollars or you're not.
+
+- want
+
+I have binary expectations here
+
+
+### high order bit
+
+- not want
+
+我们应该在那放上申明(不承诺),不过现在最重要的是我们被起诉了
+
+- want
+
+The high order bit is we're being sued.
+
+### 3rd quadrant
+
+- not want
+
+There's nothing positive about this review we got on Bloomberg.
+
+- want
+
+This review is pretty 3rd quadrant.
+
+### t0(tee zero)
+
+- not want
+
+I know the app doesn't really work but is it good enough to launch?
+
+- want
+
+Is it good enough for t0?
+
+### multivaraiate
+
+- not want
+
+We should a/b test calling it "the best app" or "the bestest app"
+
+- want
+
+Let's do a multivaraiate test.
+
+### forcing function
+
+- not want
+
+If no one clicks on this giant red button then we drop the whole project.
+
+- want
+
+This is our forcing function.
+
+### asymptotic
+
+- not want
+
+It's like we keep almost keeping money but then we never do.
+
+- want
+
+We've got asymptotic profit.
+
+### null
+
+- not want
+
+We can't afford to pay this quarter.
+
+- want
+
+Your salary is null.
+
+
+
+你今天用了什么数学术语吗?
+
+
diff --git a/source/_drafts/micro-architecture.md b/source/_drafts/micro-architecture.md
new file mode 100644
index 0000000..e511d1f
--- /dev/null
+++ b/source/_drafts/micro-architecture.md
@@ -0,0 +1,73 @@
+微架构:微服务的设计模式
+
+> 翻译自[Miro architecture & design patterns for microservices](https://blog.micro.mu/2016/04/18/micro-architecture.html)
+
+We’ve had a lot of questions about the micro architecture and design patterns for microservices over the past few months. So today we’ll try cover both.
+
+### 聊聊微型化
+
+### 工具箱
+
+- Go Micro
+- Micro API
+- Micro Web
+- Micro Sidecar
+- Micro CLI
+
+### HTTP to RPC, API...
+
+
+
+
+### 服务类型
+
+#### API
+
+#### Web
+
+#### SRV
+
+
+
+
+#### 命名空间
+
+
+#### 同步还是异步
+
+
+
+
+
+
+
+
+
+
+#### 版本号
+
+
+
+
+
+
+
+### 系统扩容
+
+
+
+
+
+### 综述
+
+Hopefully this blog post provides clarity on the architecture of Micro and how it enables scalable design patterns for microservices.
+
+Microservices is first and foremost about software design patterns. We can enable certain foundational patterns through tooling while providing flexibility for other patterns to emerge or be used.
+
+Because Micro is a pluggable architecture it’s a powerful enabler of a variety of design patterns and can be appropriately used in many scenarios. For example if you’re building video streaming infrastructure you may opt for the HTTP transport for point to point communication. If you are not latency sensitive then you may choose a transport plugin such as NATS or RabbitMQ instead.
+
+The future of software development with a tool such as Micro is very exciting.
+
+If you want to learn more about the services we offer or microservices, check out the blog, the website micro.mu or the github repo.
+
+
diff --git a/source/_drafts/near-future-tech-world.md b/source/_drafts/near-future-tech-world.md
new file mode 100644
index 0000000..fe7ccf3
--- /dev/null
+++ b/source/_drafts/near-future-tech-world.md
@@ -0,0 +1,22 @@
+选自于[The (Near) Future of Technology](https://medium.com/swlh/the-near-future-of-technology-1e7adc3b3bed)
+
+对 VR虚拟现实,AR现实增强,AI人工智能,IoT物联网,Bitcoin比特币,3D Printing3D打印,Drones 无人机,Wearables可穿戴设备 和 Self-Driving Cars无人驾驶汽车等这些热门也慢慢走进人们日常生活的技术进行盘点
+
+
+
+### VR虚拟现实
+### AR现实增强
+
+
+### AI人工智能
+### IoT物联网
+### Bitcoin比特币
+
+
+
+### 3D Printing3D打印
+### Drones 无人机
+### Wearables可穿戴设备
+### Self-Driving Cars无人驾驶汽车
+
+
diff --git a/source/_drafts/near-thirty-american-people.md b/source/_drafts/near-thirty-american-people.md
new file mode 100644
index 0000000..4e768b5
--- /dev/null
+++ b/source/_drafts/near-thirty-american-people.md
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/source/_drafts/netflix-build-code.md b/source/_drafts/netflix-build-code.md
new file mode 100644
index 0000000..a925cb3
--- /dev/null
+++ b/source/_drafts/netflix-build-code.md
@@ -0,0 +1,27 @@
+在网飞我们是如何构建代码的
+
+
+在通过网络部署上云之前,我们网飞是如何编译代码?考虑到之前部分内容已经被讲诉过,这次我们准备分享更多细节。在这篇文章中,我们描述工具和技术用来从源代码到最总部署为线上服务来给全球超过7500w的用户提供电影和电视节目的服务
+
+上述图标对之前博客讲的Spinnaker做了扩展,我们全球的持续交付的平台。如果一行代码需要进入Spinnaker中,这之间还有一系列的步骤用来执行。
+
+- Code is built and tested locally using Nebula
+- Changes are committed to a central git repository
+- A Jenkins job executes Nebula, which builds, tests, and packages the application for deployment
+- Builds are “baked” into Amazon Machine Images
+- Spinnaker pipelines are used to deploy and promote the code change
+
+这篇文章接下来就探索用在上述每个步骤中的工具和流程,也解释了我们为什么这么做的原因。最后通过分享我们现在正在面临的难题结尾。你可以认为这是我们准备详细讲诉在网飞我们如何构建和发布代码的如工具和挑战等方方面面系列文章的第一篇。
+
+### 文化,云和微服务
+
+### 构建
+
+### 整合
+
+### 部署
+
+### 前路挑战
+
+
+
diff --git a/source/_drafts/ng2-awesome.md b/source/_drafts/ng2-awesome.md
new file mode 100644
index 0000000..f4bc9e5
--- /dev/null
+++ b/source/_drafts/ng2-awesome.md
@@ -0,0 +1,32 @@
+
+主要特性:
+
+- simple
+- fast
+- works everywhere
+
+ES5/ES6/TypeScript
+es6: classes, modules, arrow functions
+ts: types, annotations, better editor support
+
+Application Design
+
+组件树 component tree
+http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders
+
+
+
+
+
+'Angular 1 was a framework, Angular 2 is a platform' The father of Angular Misko Hevery http://bit.ly/1RZvST3
+
+
+
+http://slides.com/gerardsans/jazoon-the-amazing-ng2#/
+
+
+
+
+
+
+
diff --git a/source/_drafts/pay-tech-debt-refactor-legecy-code.md b/source/_drafts/pay-tech-debt-refactor-legecy-code.md
new file mode 100644
index 0000000..486bb08
--- /dev/null
+++ b/source/_drafts/pay-tech-debt-refactor-legecy-code.md
@@ -0,0 +1,47 @@
+
+如何重构有问题的老代码
+
+你是如何把一个渐渐失控的遗留代码仓库转变为高可维护性的。下面的文章是我这几年在一个大型老项目中摸爬滚打学的教训和经验的总结。
+
+### 老代码可以通过重构来解救
+
+#### 无所畏惧
+
+### 技术债 - 是怎么一步步走到今天的
+
+#### 代码癌变
+
+### 说服客户/老板
+
+#### 为你的自由而战
+
+### 不要又搞出坑爹
+
+### 让问题可见
+
+### 代码主人公意识
+
+### 构建图书馆
+
+#### 通过新工具重构
+
+### 建立自信:测试
+
+#### 高层级的测试
+
+#### 底层级的测试
+
+#### 不需要测试所有东西
+
+
+### 隔离和替换
+
+### 说服你自己
+
+#### 通过一篇可观的长文来结束
+
+
+### 后记
+
+一些年后,当你沼泽湿地附近闲逛。在你视野所及内,你会发现公爵正在用啤酒的商业广告(庆祝!)替换之前的『危险,这里有恶龙』的标语。 他脸上洋溢着灿烂的笑容
+
diff --git a/source/_drafts/reactive-programming-101.md b/source/_drafts/reactive-programming-101.md
new file mode 100644
index 0000000..909b692
--- /dev/null
+++ b/source/_drafts/reactive-programming-101.md
@@ -0,0 +1,42 @@
+> 翻译自[What is Reactive Programming](https://medium.com/reactive-programming/what-is-reactive-programming-bc9fa7f4a7fc)。 先后阐述了为什么Reactive编程范式应运而生下的背景,然后对它的四个主要原则进行梳理。响应性,弹性,可扩展性和消息驱动等进行讲解~
+
+
+### Why things are different now
+
+
+- 1999
+
+- 2005
+
+- 2014
+
+### Reactive 四原则
+
+### Responsive
+
+#### Consistency at Walmart Canada
+
+#### Responsive retail at Gilt
+
+### Resilient
+
+#### Message-driven resiliency
+#### The 440 million dollar resiliency mistake
+
+### Scalable
+
+#### Thread-based limitations to concurrency
+
+#### Out or up?
+
+### Message-driven
+
+#### Event-driven concurrency
+#### Actor-based concurrency
+
+### 结论
+
+
+
+
+
diff --git a/source/_drafts/resume-anti-pattern.md b/source/_drafts/resume-anti-pattern.md
new file mode 100644
index 0000000..60a0335
--- /dev/null
+++ b/source/_drafts/resume-anti-pattern.md
@@ -0,0 +1,101 @@
+
+找到新工作最简单的方式通过你的个人职场网络。那些认识你的人和你一起共事过的同事,最有资格为你的杰出技术才能和迷人个性背书,通过这些人直接和有HeadCount的HR经理直接联系上是最有效找到新工作机会的方法。不过,你的网络始终是你目前所能看到的一切(从而也限制了你)。如果暂时还不认识你想要的工作机会公司的人,或者你的人际关系不够强。这时候你还是要依赖于你的简历来撬开那家公司的大门。
+
+我不止一次听到过这样的观点:简历对程序员来说根本不重要。这些人认为简历是过去的产物现在我们只需要关注候选人的Github简历就足够了。不过,在我看来,大部分应聘者除了一些简单尝试的小项目或fork别人的项目外,很少在Github上有太多工作。除非你的工作就是围绕开源项目的,所以你的简历是筛选简历的人唯一有的关于你所有信息的一切,通常也是决定你是否能进入下一轮的关键印象。
+
+### 反模式
+
+
+
+
+大部分我见过的简历都没有把能进入我们团队的个人潜在价值沟通好。相反的,这些简历都多多少少了暴露来一些反模式:
+模糊的说明着项目,夹杂着一系列的技术点,流行词汇和所谓的最佳实践。有资格的候选人被拒绝是因为离我的标准还有距离,还有不少候选人根本在简历山筛选上都没有通过。
+
+你的简历上应该把你能够给公司和团队带来的价值阐述表达好(通过你给之前或现在雇主提供的价值说起)。下面我罗列来一些不好的反模式,也给出了相应的改进方案。
+
+### 技术掌握上
+
+作为软件开发者,和潜在的老板聊聊你熟悉的各种编程语言和技术是很有价值的。对于不少职位,熟练掌握(甚至要精通)某项技术是职业必须项。不过,简单罗列技术名词,而对你掌握如何只字不提就不好了。尽管你的简历不必要成为详细的技术评审。你描述对一项技术的掌握可以给筛选简历的人积极的好感,也为将来的面试官看你简历时提供话题。
+
+### 反模式:罗列大量技术工具
+
+就像是购物列表似的罗列语言,技术和工具,没有任何上下文来说明你是如何使用的,或者它们根本与你要申请的职位风马牛不相及。
+
+- 例子:
+
+ 工具:Ruby,JavaScript,jQuery,React,Git,Jira等
+
+- 提升:
+
+ 给我们的Ruby on Rails 项目体检一系列的移动客户端的API,如来记录各个国家地区的爆米花热狗的价格。通过etags实现缓存,来减少移动设备在消费 API时 60%的API响应时间。领导团队升级到 Rails5。在此之前,实施和验证几个 Rails4 的安全补丁。
+
+- 提升:
+
+ 实施聚合各个国家的爆米花热狗价格数据并且通过JSON API的方式提供结果给客户端(符合 Ruby on Rails 的 JSONAPI 标准)。使用 Sidekip 来加速定时任务的执行,它们从第三方的JSON APIs中爬去数据然后把结果存储在MongoDB中。
+
+- 提升:
+
+ 领导和评估迁移到新的JavaScript UI类库的工作。最终在决定使用 Angular 还是 React时。根据 更低实施的成本(不是所有团队成员之前都使用过两个框架),容易实现组件化(我们的UI组件是通过许多小且易于复用的部分组成),方便实现Flux类似的单向数据流 选择了React。
+
+- 提升:
+
+ 由于缺乏明确专职的产品经理,我们的工程团队被分管市场的VP副总监领导着,但是我还是缺乏每天的项目管理指引。我提议和成功的在团队实施JIRA,并且被当做是默认的项目管理角色。除了日常开发工作外,我也和市场VP一起,把产品需求细化和分解到 JIRA 任务中作为每周迭代。
+
+
+### 软技能上
+
+开发者,就想其他职员一样,能够有给团队和组织贡献不止他们专业技能本身的潜能。表达你个人的软实力不仅仅是来展示你价值的好机会,也代表你知道你比你目前的中高阶技术能力外的自信。
+
+### 反模式:『优秀的沟通技巧』
+
+听起来不错。在简历上仅仅写出『拥有优秀的沟通技巧』恰恰体现了你不咋地的沟通能力。
+
+- 例子:
+
+ 优秀的沟通技巧
+
+- 提升:
+
+ 主导和对齐一个正在进展中的平台优化的例会(用来定期偿还我们之前留下的技术债)。我给例会中引入了一套代码准则来避免直接指责同事和确保所有团队成员都能有机会说出和提议对目前技术债的解决方案。
+
+### 反模式:模糊不清的导师工作
+
+没有进一步解释你是如何或为什么指导同事的
+
+- 例子:
+
+ 指导实习生
+
+- 提升:
+
+ 把我们团队的实习工程师招聘项目扩展到我的母校去开展,找到那些合适的候选人
+
+- 提升:
+
+ 每周会花费5个小时左右去指导我手下计算机科学的本科实习生加速学习JavaScript相关最佳实践在他最后一个学期里。最终让他在毕业后能够以全职正式员工身份入职。
+
+- 提升:
+
+ 在得知其他组的同事对学习Ruby很感兴趣后,组织了每周的工程师读书俱乐部,定期指导阅读,布置课后练习和审核他们的相关答案
+
+
+### 文化契合
+
+和软技能一样,表达你对工作的态度和对其他同事如何协同的观点会给你潜在老板很有价值的信息:看你和目前团队的文化是否契合。好的管理者一直都知道一个成功的团队是由很多迥然不同性格和能力的人组成的,在表达你的偏爱和工作风格后,他会知道你是否可以在目前这个团队和在的什么位置什么方面上发光发热。
+
+### 反模式:什么都不提
+
+大部分简历上都对应聘者本身的对于团队结构和组织里同事性格的偏好上缄口不语。
+
+- 提升:
+
+ 我喜欢高度配合协同的工作环境,任何时候都希望能够结对编程。我也喜欢参与在经过完善企划围绕着软件架构和系统设计的例会。我乐于和产品经理一起,把需求一起梳理清楚。但对花大量时间在项目一开始去脑暴和开发不怎么认同。
+
+- 提升:
+
+ 我特别喜欢在早期的创业公司工作,因为有机会去承担产品工程师的角色。我也喜欢在编码实现需求前,和产品,设计团队的成员一起去调研,头脑风暴,和功能原型。
+
+- 提升:
+
+ 我在独立开发时效率最高。我在和同事一起协作做功能设计和定位没有问题,不过作为天生的内向者,我在个人独自编码时效率最高。
+
diff --git a/source/_drafts/self-intro.md b/source/_drafts/self-intro.md
new file mode 100644
index 0000000..2ff15d3
--- /dev/null
+++ b/source/_drafts/self-intro.md
@@ -0,0 +1,6 @@
+SivaGao,广发证券互联网金融组高级研发工程师。先后在百度,豌豆荚做过 Web App,Hybrid App等前端工作,目前主要在做 Node.js 为主的新技术(如微服务架构结合,koa2等)在公司的互联网金融业务上的推广和使用。热衷开源技术,拓宽技术视野
+
+
+
+
+
diff --git a/source/_drafts/signs-not-startup.md b/source/_drafts/signs-not-startup.md
new file mode 100644
index 0000000..381c789
--- /dev/null
+++ b/source/_drafts/signs-not-startup.md
@@ -0,0 +1,17 @@
+[11 Signs You Should NOT Work For A Startup](https://medium.com/keep-learning-keep-growing/11-signs-you-should-not-work-for-a-startup-ba53330e857a#.8uqr3twvx)
+
+
+ - You would rather stick to a specific job description.
+ - When someone says ‘start-up’, you picture a ping-pong table.
+ - You want the 9–5.
+ - You expect to receive rigorous training before you get going.
+ - You seek constant feedback and approval from your boss and colleagues.
+ - You have an ego.
+ - You think a job is just a job.
+ - You seek to stud your CV with prestigious brand names.
+ - You think it’s cool to work in a start-up.
+ - You’re more interested in pursuing existing legacy than building for the future.
+
+
+
+
diff --git a/source/_drafts/source/images/14630333234435.jpg b/source/_drafts/source/images/14630333234435.jpg
new file mode 100644
index 0000000..0e4d19c
Binary files /dev/null and b/source/_drafts/source/images/14630333234435.jpg differ
diff --git a/source/_drafts/source/images/14630333458378.jpg b/source/_drafts/source/images/14630333458378.jpg
new file mode 100644
index 0000000..bee3d83
Binary files /dev/null and b/source/_drafts/source/images/14630333458378.jpg differ
diff --git a/source/_drafts/source/images/14630333613802.jpg b/source/_drafts/source/images/14630333613802.jpg
new file mode 100644
index 0000000..15a23bf
Binary files /dev/null and b/source/_drafts/source/images/14630333613802.jpg differ
diff --git a/source/_drafts/source/images/14630333911101.jpg b/source/_drafts/source/images/14630333911101.jpg
new file mode 100644
index 0000000..fb31fd3
Binary files /dev/null and b/source/_drafts/source/images/14630333911101.jpg differ
diff --git a/source/_drafts/source/images/14630334156557.jpg b/source/_drafts/source/images/14630334156557.jpg
new file mode 100644
index 0000000..f7b0487
Binary files /dev/null and b/source/_drafts/source/images/14630334156557.jpg differ
diff --git a/source/_drafts/source/images/14630334412639.jpg b/source/_drafts/source/images/14630334412639.jpg
new file mode 100644
index 0000000..468014b
Binary files /dev/null and b/source/_drafts/source/images/14630334412639.jpg differ
diff --git a/source/_drafts/source/images/14630334639640.jpg b/source/_drafts/source/images/14630334639640.jpg
new file mode 100644
index 0000000..3433111
Binary files /dev/null and b/source/_drafts/source/images/14630334639640.jpg differ
diff --git a/source/_drafts/source/images/14630334796364.jpg b/source/_drafts/source/images/14630334796364.jpg
new file mode 100644
index 0000000..6e1ec9e
Binary files /dev/null and b/source/_drafts/source/images/14630334796364.jpg differ
diff --git a/source/_drafts/source/images/14630336778041.jpg b/source/_drafts/source/images/14630336778041.jpg
new file mode 100644
index 0000000..d441a3a
Binary files /dev/null and b/source/_drafts/source/images/14630336778041.jpg differ
diff --git a/source/_drafts/source/images/14630336841397.jpg b/source/_drafts/source/images/14630336841397.jpg
new file mode 100644
index 0000000..720d52a
Binary files /dev/null and b/source/_drafts/source/images/14630336841397.jpg differ
diff --git a/source/_drafts/source/images/14630336883879.jpg b/source/_drafts/source/images/14630336883879.jpg
new file mode 100644
index 0000000..5a08605
Binary files /dev/null and b/source/_drafts/source/images/14630336883879.jpg differ
diff --git a/source/_drafts/source/images/14630336989238.jpg b/source/_drafts/source/images/14630336989238.jpg
new file mode 100644
index 0000000..3e3a16b
Binary files /dev/null and b/source/_drafts/source/images/14630336989238.jpg differ
diff --git a/source/_drafts/source/images/14630337068051.jpg b/source/_drafts/source/images/14630337068051.jpg
new file mode 100644
index 0000000..dc958c8
Binary files /dev/null and b/source/_drafts/source/images/14630337068051.jpg differ
diff --git a/source/_drafts/source/images/14630339481787.jpg b/source/_drafts/source/images/14630339481787.jpg
new file mode 100644
index 0000000..3771905
Binary files /dev/null and b/source/_drafts/source/images/14630339481787.jpg differ
diff --git a/source/_drafts/source/images/14631036985841.jpg b/source/_drafts/source/images/14631036985841.jpg
new file mode 100644
index 0000000..a2d1513
Binary files /dev/null and b/source/_drafts/source/images/14631036985841.jpg differ
diff --git a/source/_drafts/source/images/14631038647533.jpg b/source/_drafts/source/images/14631038647533.jpg
new file mode 100644
index 0000000..a4bab95
Binary files /dev/null and b/source/_drafts/source/images/14631038647533.jpg differ
diff --git a/source/_drafts/source/images/14631040433122.jpg b/source/_drafts/source/images/14631040433122.jpg
new file mode 100644
index 0000000..2f42809
Binary files /dev/null and b/source/_drafts/source/images/14631040433122.jpg differ
diff --git a/source/_drafts/state-javascript-2016.md b/source/_drafts/state-javascript-2016.md
new file mode 100644
index 0000000..2072118
--- /dev/null
+++ b/source/_drafts/state-javascript-2016.md
@@ -0,0 +1,156 @@
+
+那么,你要开始一个崭新的Javascript前端项目了,或者被之前老项目折腾半死,你也许并没有和改变进化步伐极快的社区生态保持技术实践的同步,或者你开始了,但是有大量的可选项不知道怎么选。React,Flux,Angular,Aurelia,Mocha,Jasmine,Jasmine,Babel,TypeScript,Flow。哦我的天呐这么多~ 为了让事件变得更简单,我们很多人正陷入一个陷阱:被我喜欢的XKCD漫画描述的很好:
+
+
+
+是的,好消息是现在JS生态开始慢下来了,好项目开始冒出。最佳实践爱你慢慢变得更清晰了。工程师开始在现有项目上构建自己的工程还是重新创造轮子。
+
+作为起点,下面是我对现代化Web应用各个部分的个人选择。一些选择看起来会有些争议,我会在每个选择后附上我的基本推理判断。要注意的是,这些选择通常是我建立在我目前对社区的观察和我个人的经历。你的看法当然会有不同~
+
+### 核心类库:React
+
+
+
+目前胜者很显然就是React(译者:你确定?!)
+
+- Components all the way down makes your application much easier to reason about.
+- The learning curve is very flat. The important APIs would fit on one page.
+- JSX is awesome. You get all the power of JavaScript and its tooling when writing your markup.
+- It is the natural match for Flux and Redux (more on that later).
+- The React community is amazing, and produced many best of breed tools such as Redux (also more on that later).
+- Writing high quality data flow is much easier in large applications than dealing with 2 way data binding (eg: Knockout)
+- If you ever need to do server side rendering, React is where it’s at.
+
+现在不少全能的大型框架如Ember,Angular,它们承诺说帮你处理所有的事。但是在React生态中,尽管需要对组件做一些决定(哈这就是你为什么要阅读本文的原因啦),但是这方案更强壮。很多其他框架,譬如Angular2.0正在快速追赶React。
+
+『选择React不仅是个技术上的选择,更多是个商业决定!』
+
+- 额外奖励:一旦你要着手构建自己的移动应用,你会感谢ReactNative项目的
+
+(很牵强哈,Angular社区的Ionic也是PC Web向移动端迁移的好选择。各自的2.0版本也相辅相成推进上)
+
+
+### 应用生命周期:Redux
+
+
+
+
+### 语言:ES6配合Babel,先不加类型
+
+
+
+
+### 格式和风格:ESlint配合Airbnb指南
+
+
+
+关于ESLint异议也不大。使用它的React插件和良好的es6的支持,几乎非常完美完成lint的工作。JSLint是过时了,ESLint这个软件可以单独完成原本需要 JSHint 和 JSCS 联合起来做的事。
+
+你需要配置他用你的风格约定。我强烈建议你使用 Airbnb的风格指南,大部分可以被 ESLint airbnb config 来严格约束实现。如果你们团队会在代码风格上产生分歧和争超,那么拿出这份指南来终结所有的不服!它也不是完美的(因为完美的风格不存在),但保持统一一致的代码风格是要高度推荐的。
+
+一旦你开始熟悉它,我建议你开启更多的规则。在编辑撰写代码时候越多的捕获不规范(配置你的编辑器IDE使用上这个ESLint插件),就会避免分歧和在决定费神,从而让你和团队更加高效!
+
+
+### 依赖管理:仅考虑NPM,CommonJS 和ES6模块
+
+
+
+这一点很明确 - 就用NPM。所有东西,忘记之前的bower。类似与 Browserify 和 Webpack 的构建工具把npm的强大功能引到了web上。版本处理变得很简单,你也获得了node生态的大部分模块提供的功能。不过CSS的相关处理还是不够完美。
+
+你可能会考虑的一件事:如何在开发服务器构建应用。不想Ruby社区的Bundler,npm 常使用野字符来指定版本号,导致你开始书写代码到最后部署时候版本号很可能已经变化了。使用 shrinkwrap 文件来锁定你的依赖(我建议使用 [Uber的 shrinkwrap](https://github.com/uber/npm-shrinkwrap) 来获得更见一致性的输入)。同时考虑使用利用类似于 [Sinopia](https://www.npmjs.com/package/sinopia) 来构建自己的私有npm服务器。
+
+Babel可以把 ES6 模块语法编译到CommonJS。意味着你可面向未来的语法,和在使用构建工具(如Webpack 2.0)时获得它支持的一些静态代码分析工具如 [tree shaking](http://www.2ality.com/2015/12/webpack-tree-shaking.html) 的优势
+
+
+### 构建工具:Webpack
+
+
+
+
+### 测试:Mocha + Chai + Sinon(但没那么简单)
+
+
+
+目前在 JavaScript 单元测试上,我们有众多选择,你选择任何一个都不会错太多。因为你开始做单元测试,你就走对一大步了。
+
+一些选择包括了 Jasmine,Mocha,[Tape](https://github.com/substack/tape),[AVA](https://github.com/sindresorhus/ava) 和 Jest。我知道我漏掉来一些,它们都有一些比其他做的好的地方。
+
+我对一个测试框架的的选择标准是:
+
+- It should work in the browser for ease of debugging
+- It should be fast
+- It should easily handle asynchronous tests
+- It should be easy to use from the command line
+- It should let me use whatever assertion and mock library I want
+
+第一个指标让AVA脱颖而出(因为它的确做的非常棒)和Jest(自动Mocking并不像它说的那么好,因为它太慢了)
+
+选择Jasmine,Mocha或Tape都不会差太多。我倾向于 Chai 断言因为它拥有很多插件,Sinon's mocks to Jasmine's built in construct。Mocha的异步测试支持很棒(你不用在写类似于 done callback之类的)。[Chai as Promised](https://github.com/domenic/chai-as-promised) 也是很屌。我强烈建议你使用 [Dirty Chai](https://github.com/prodatakey/dirty-chai) 来避免一些让人头疼的问题。Webpack的 [mocha loader](https://github.com/webpack/mocha-loader) 让你编码时自动执行测试。
+
+对于React而言,Airbnb的[Enzyme](https://github.com/airbnb/enzyme)和Teaspoon(不是Rails那个!)是不错的相关工具选择。
+
+我非常喜欢Mocha的特性和支持情况。如果你喜欢一些最小主义的,读读这篇[关于tape的文章](https://medium.com/javascript-scene/why-i-use-tape-instead-of-mocha-so-should-you-6aa105d8eaf4)
+
+PS:
+Facebook在最近的文章中说,它们是如何扩展Jest的。可能对大部分人来说过于复杂了,如果你有那些资源,不关心是否在浏览器中跑测试,那么它就很适合你。
+
+另外,很多人认为我对AVA太武断了。不要误会我,AVA的确很棒。但我有个标准:全浏览器支持。这样我们可以直接从任何浏览器去执行(来测试跨浏览器兼容性)同时要方便调试。如果你不介意那些,你可以使用非常棒的iron-node来debugging。
+
+
+### 工具库:Lodash是绝对王者,但留意 Ramda
+
+JavaScript不像Java或.NET上有很多强大的内置工具集。所以你可能需要引入一个。
+
+Lodash,目前来说应该是杂七杂八都有的首选。同时它类似注入[懒求值](http://filimanjaro.com/blog/2014/introducing-lazy-evaluation/)这样的特性让它成为性能最高的选择之一。如果你不想用你就不要把它全部都导入,同时:lodash能让你仅仅引入哪些你需要的函数(这点尤其重要考虑到它现在变得越来越大)。随着4.x版本带来,它原生支持可选的函数式模式给那些函数式编程的极客们使用。来看看[怎么使用它](https://github.com/lodash/lodash/wiki/FP-Guide)
+
+如果你真的很喜欢函数式编程,那么不管怎么样,留意下优秀的[Ramda](http://ramdajs.com/0.19.1/index.html)。如果你决定用它,你可能还是需要引入一些lodash函数(Ramda目前专注于数据处理和函数式构建),但这样你能在JavaScript中以非常友好方式获得函数式编程的强大功能
+
+
+### Http请求:就只用fetch
+
+许多React应用再也不需要jQuery了。除非你需要使用一些遗留的老旧的第三方组件(它依赖于jQuery),因为根本没必要。同时,意味着你需要一个类似于$.ajax的替代品。
+
+为了保持简单,仅仅使用[fetch](https://fetch.spec.whatwg.org/),它在Firefox和Chrome中内建支持。对于其他浏览器,你可能需要引入polyfill。我推荐使用[isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) 来在服务器端在内覆盖了基础组件选择。
+
+还有一些其他好的类库选择如[Axios](https://github.com/mzabriskie/axios),但目前在fetch之上没有多余需求。
+
+为了更多关于为什么Promise是重要的讨论,请看我们博客异步代码
+
+
+### 样式:考虑CSS模块
+
+### 前后同构:确保你真的需要它
+
+### API接口:暂时没有好方案
+
+看起来每个开发者最后都会疑问那么关于API接口呢?很多人会直接想到[RESTful API](https://en.wikipedia.org/wiki/Representational_state_transfer)(因为太流行了),同时SOAP真的成为过去式了。同时现在也有不少其他标准如:[HATEOAS](https://en.wikipedia.org/wiki/HATEOAS), [JSON API](http://jsonapi.org/),[HAL](http://stateless.co/hal_specification.html),[GraphQL](https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html) 等
+
+GraphQL 赋予客户端强大的能力(也是职责),允许它来实施任意的查询接口。结合Relay,它能为你处理客户端状态和缓存。在服务器端实施GraphQL看起来比较困难而且现有的文档大部分是针对Node.js的
+
+网飞(NetFlix)的[Falcor](https://github.com/Netflix/falcor) 看起来它也能提供那些Relay和GraphQL提供的功能,但是对于服务器端的实现要求很低。但现在它仅仅是开发者预览版没有正式发布。
+
+所有这些有名的标准规范有他们各种的奇怪之处。一些是过于复杂,一些只能处理读取没有覆盖到更新接口。一些又严重和REST走失。许多人选择构建它们自己的,但是最终也要解决它们设计上带来的问题。
+
+我不认为现在有什么方案是个大满贯(完美的),但是下面是我对API应该有的功能的一些思考:
+
+- It should be predictable. Your endpoints should follow consistent conventions.
+- It should allow fetching multiple entities in one round trip: needing 15 queries to fetch everything you need on page load will give poor performance.
+- Make sure you have a good update story: many specifications only covers reads, and you’ll need to update stuff sometimes.
+- It should be easy to debug: looking at the Chrome inspector’s network tab should easily let me see what happened.
+- It should be easy to consume: I should be able to easily consume it with fetch, or have a well supported client library (like Relay)
+
+我没有找到能覆盖这些需求的方案。如果有,务必让我知道。
+同事考虑,如果你实施一个标准化的RESTful资源路径时,使用Swagger来文档化我们的API。
+
+
+### 客户端软件:Electron
+
+### 向谁学习,从哪学起
+
+### 如果你不需要,就别用它!
+
+### 我少了什么吗?
+
+
+
+
diff --git a/source/_drafts/system-design-cheatsheet.md b/source/_drafts/system-design-cheatsheet.md
new file mode 100644
index 0000000..c91ed48
--- /dev/null
+++ b/source/_drafts/system-design-cheatsheet.md
@@ -0,0 +1,121 @@
+翻译自[System Design Cheatsheet](https://gist.github.com/vasanthk/485d1c25737e8e72759f).
+
+Picking the right architecture = Picking the right battles + Managing trade-offs
+
+选对架构就等于选对合适的战场和权衡管理好各种的选项。
+
+
+### 一般步骤
+
+1. 理清和约定好系统的边界
+ - 用例
+ - 谁会使用这系统
+ - 他们会如何使用这个系统
+ - 约束
+ - 主要是识别出流量和数据处理的约束,以便于可扩展
+ - 考虑系统的可扩展性,譬如每秒的请求数量,请求类型,数据写入量,数据读取量
+ - 考虑该系统的特殊需求,譬如是否要多线程,使用场景主要是读取还是写入。
+
+2. 高层次的架构设计(设计抽象)
+3. 组件设计
+ - 组件和所需接口(来相互调用)
+ - 面向对象设计来实现功能
+ - 把功能特性映射为模块:一个场景对应 一个模块
+ - 考虑模块间的关系
+ - 特定的功能必须有特定唯一的实例(单例模式)
+ - 核心对象可以由其他对象一起组成(聚合composite模式)
+ - 一个对象从另一对象而来(继承)
+ - 数据库 Schema 设计
+4. 理解瓶颈所在
+5. 扩展你的设计
+ - 垂直扩展
+ - 水平扩展
+ - 缓存
+ - 负载均衡来帮助你用增加服务器啦水平扩展,但是缓存可以非常有效的利用你已经取回的资源数据,同时实现原本看起来不太好办的产品需求
+ - 应用缓存
+ - 数据库缓存
+ - in-memory 缓存
+ - 譬如预先计算好结果(如昨天来自不同站点的访问数量)
+ - 譬如预先生成很耗时的索引(如根据用户点击流来生成推荐的内容)
+ - 譬如把一些经常要用的数据存在更高性能的数据库中(如Redis而不是直接从PostgreSQL 查询)
+ - 负载均衡
+
+
+ - 数据库复制/主从
+ - 数据库分库
+ - Map-Reduce
+ - 平台层(服务)
+ - 分离平台服务和业务应用使得我们可以独立扩展各部分。譬如添加新的API,你可以通过添加平台服务器而不需要为你的应用层扩容
+ - 通过平台层,你可以为多个产品或多个终端(如Web应用,iPhone应用等)提供基础设施,而不需要多写很多已经在其他应用中已经处理过的模板代码(如缓存,数据库等)
+
+ 
+
+
+### 系统设计的主要考虑点
+
+ 1. 并发性
+你理解线程,死锁和饥饿(starvation)?你知道如何把一些算法并行化吗?你理解一致性 consistency 和内聚性(coherence)?
+
+ 2. 网络
+你大概知道IPC和TCP/IP吗,你知道吞吐量和延迟的区别吗,什么时候它们会想相互影响。
+
+ 3. 抽象
+ 4. 实际场景下性能
+ 5. 评估
+ 6. 可用性和可依赖性
+
+
+### Web App 系统设计的考虑点
+
+- 安全(CORS)
+- 使用CDN
+- 全文搜索
+ - 使用类似于 Sphinx/Lucene/Solr 等,它们搜索响应速度很快(因为不是去搜索内容文本本身,他们搜索索引文件来实现)
+- 离线支持/渐进增强
+- Web Workers
+- 服务端渲染
+- 异步资源加载(数据懒加载)
+- 减少网络请求(Http2 + 资源打包/精灵图等)
+- 开发效率和工具支持
+- 可访问性
+- 国际化
+- 响应式设计
+- 浏览器兼容性
+
+
+
+### 前端架构的各部分
+
+- 代码
+ - HTML5/WAI-ARIA
+ - CSS/Sass 标准规范和代码组织
+ - 面向对象设计(逻辑怎么切分和组合通信等)
+ - JS 框架/代码组织/性能优化技巧
+ - 资源分发 - 前端运维(如接入层,CDN,机房等)
+- 文档
+ - 看板文档
+ - 风格样式指南,UI/UX模式库
+ - 架构图(code flow,工具链)
+- 测试
+ - 性能测试
+ - Visual Regression
+ - 单元测试
+ - E2E测试
+- 流程
+ - Git workflow
+ - 依赖管理(如 npm, bower, bundler)
+ - 构建系统(Grunt/Gulp/Npm Scripts)
+ - 部署流程
+ - 持续集成(Travis CI,Jenkins)
+
+
+一些链接:
+How to rock a systems design interview
+System Design Interviewing
+Scalability for Dummies
+Introduction to Architecting Systems for Scale
+Scalable System Design Patterns
+Scalable Web Architecture and Distributed Systems
+What is the best way to design a web site to be highly scalable?
+How web works?
+
diff --git a/source/_drafts/tech-be-rich.md b/source/_drafts/tech-be-rich.md
new file mode 100644
index 0000000..d687882
--- /dev/null
+++ b/source/_drafts/tech-be-rich.md
@@ -0,0 +1,24 @@
+> 翻译自[How to get rich in tech, guaranteed](http://startupljackson.com/post/135800367395/how-to-get-rich-in-tech-guaranteed)
+
+今天的纽约时报关于职员有时候会破产的文章很值得阅读。不过作为职员应该也会喜欢上周Hunter关于如何在创业公司致富的文章,下面是我在这方面的一些想法。
+
+一个我被变着法子,反复问到的问题就是:『加入创业公司X后,我会赚到大钱吗?』
+
+> 待补充
+
+> If you want to get rich, your best bet on a risk-adjusted basis is to join a profitable and growing public company. Google for short. Make $200-500k all-in a year, work hard and move up a level every 3-5 years, sell options as they vest (in case you joined Enron), and retire at 60, rich. This plan works every time.
+
+但是有一点要记住:永远不要仅仅因为钱才加入一家创业公司!
+
+### 选择好创业公司的通用建议
+
+- `明确自己想要什么`。你希望在产品市场打开前加入,还是希望有清晰商业模式后在加入。你需要薪酬吗,要多少,你介意工作内容是否和自我定位匹配,介意工作地点,是否出差等。大部分人会发现最终发现自己的这份工作并不适合自己(因为他在找之前并没有想清楚想要的完美职位是什么样的)。
+- `主动积极的推进`。很多人并没有做到。创业团队在面试你,实际上你也在面试创业团队。选择是双向的,写出你的评价标准。放眼200个创业团队,联系其中50家,再和20家进行初次的面试,只和挑选的5家进行下一轮,最后在2-3个好的机会中选择。如果你是被动的,你只和很小一部分的创业公司联系,那么你的选择也是受限的。通过[这个](https://angel.co/jobs)你可以在短短几个小时内选到还不错的创业公司。
+- `押宝在好的同事和团队文化上`。除去其他的,我观察到找到优秀的同事(聪明,勤奋,自我驱动的等)和相匹配适应的团队文化,你会工作的很快乐即使公司可能最后黄掉。如果你只是看重要做的产品是否足够吸引人,薪酬回报是否高,那么你可能最后对这段经历不会很开心。
+- `接受薪酬`。
+- `靠实力说话`。不少创业团队招聘开发者把他们叫做CTO架构师之类的。这没什么意义,你没法帮他变成CTO。如果你想成为CXO,那么就靠实力说话。进入创业团队,就意味着发展不受限,和创始人约好,你想在这里学到成长到什么样,然后给这个目标设立对应的里程碑,在各个阶段配备你需要的资源,然后就努力把这创业公司做大,然后自然而然你就是CXO了。
+- `Discount the vertical`
+- `去学点商业知识`。
+- `关于透明和开放`。公司不可能对员工公开所有的信息和细节,尤其是关于招聘薪酬期权等。但是,通常意义上需要给到足够的信息来帮助员工做出明智的决定(译者:之前待的豌豆荚在这方面就做的非常,Google Docs总能找到你想要的需要了解的)。例如说,你的期权占比。信任就像条双向街道,如果公司对员工隐瞒起欺骗,那么之间的信任也很难维持。人生在世不要为这些事烦恼担心咯~
+
+
diff --git a/source/_drafts/tj-company.md b/source/_drafts/tj-company.md
new file mode 100644
index 0000000..dbd64ab
--- /dev/null
+++ b/source/_drafts/tj-company.md
@@ -0,0 +1,13 @@
+翻译自[Announcing Apex Software Inc]().
+
+一直以来,我都是一个富有创造力的人,迫切的尝试一些新的东西,所以有机会能从事于不少小而美的应用之上对我来说非常有有吸引力。生活方式也越来越重要,随着我这些年的工作,我也慢慢意识到我应该做我想做的,
+
+
+往上追溯,考虑到多年高强度工作,去年底我决定离开之前的公司,想好好休息一下。
+
+
+
+
+
+
+
diff --git a/source/_drafts/why-koa2.md b/source/_drafts/why-koa2.md
new file mode 100644
index 0000000..fb7753f
--- /dev/null
+++ b/source/_drafts/why-koa2.md
@@ -0,0 +1,68 @@
+我们为什么选择koa2来写我们的后端代码,我们可以从官方文档看出。然而koa2又让 es7 的async/await 直接可以用在我们的代码编写上,再也不用co来包装函数,用 *,yield 这些看起来语义很奇怪的generator语法了
+
+### 异步代码
+一些例子展示(从search.js等中摘取
+
+```js
+ var {storeUserInsInfo, storeLatestInfo, storeHotInfo} = apiConf;
+ var {externalInfo, portSelfInfo, portSelfStocks} = apiConf;
+
+ ## externalInfoFetch,storeInfoFetch等都是用于规整请求的入参
+
+ router.get('/opt-auth/pickup', async (ctx, next)=>{
+ var userId = ctx.request.get('userId');
+ var reses = await Promise.all(_.map([
+ externalInfoFetch('ZCCJTT'), // 外部精选资讯
+ storeInfoFetch(storeLatestInfo),
+ storeInfoFetch(storeUserInsInfo, userId)
+ ], (opt)=>{
+ return rp(opt);
+ }));
+ ctx.body = {
+ "external-headline": reses[0],
+ "store-latest": reses[1],
+ "store-myinterest": reses[2]
+ };
+ });
+```
+
+### 错误处理
+
+callback: domain, 异步错误需要next(err),同步异常的try-catch等, domain被废弃掉,app.use((err, req, res, next))的忽略
+所以顶层的try-catch 的放置顺序
+
+```js
+// error handler to JSON stringify errors
+const errorRes = require('./middleware/error-res');
+app.use(errorRes);
+
+module.exports = async function(ctx, next) {
+ try {
+ await next();
+ } catch (err) {
+ if (err == null) {
+ err = new Error('Null or undefined error');
+ }
+ // some errors will have .status
+ // however this is not a guarantee
+ ctx.status = err.status || 500;
+ ctx.type = 'application/json';
+ ctx.body = {
+ success: false,
+ message: err.stack
+ };
+ ctx.app.emit('error', err, this);
+ }
+};
+
+// 用于关闭前的一些处理如保存数据,记录错误,发送邮件等等
+process.on('uncaught', ()={});
+```
+
+### 中间件写法
+
+对于response-time的
+对于koa-composite
+
+
+
diff --git a/source/_drafts/work-at-netflix-2016.md b/source/_drafts/work-at-netflix-2016.md
new file mode 100644
index 0000000..a587847
--- /dev/null
+++ b/source/_drafts/work-at-netflix-2016.md
@@ -0,0 +1,5 @@
+> 翻译自[Working at Netflix 2016](http://www.brendangregg.com/blog/2016-03-30/working-at-netflix-2016.html)。每个人都想优秀的公司里工作,和优秀的同事合作,这样才不辜负你的大好年华,那我们看看在Netflix这样一个超一流的科技公司(PS:它家的微服务实践业界一流哈)是什么体验,你还差多少?
+
+
+
+
diff --git a/source/_drafts/writing-books.md b/source/_drafts/writing-books.md
new file mode 100644
index 0000000..fcd2fd4
--- /dev/null
+++ b/source/_drafts/writing-books.md
@@ -0,0 +1,118 @@
+
+
+为了响应杰哥的号召,我们希望在写书过程中实施一套有规范有约束的有指导的流程框架来帮助大家更好的更有目的的来完成该任务。
+
+我们是这么看待写书这件事的,有三个阶段:
+
+- 预备阶段(节点人物,awesome-ng2内容支持,repo信息,营造氛围.
+- 创作阶段(写作工具. markdown,git commit;词汇表,作图,图片,demo.
+- Review阶段(Gitbook,issue提出和管理)
+
+预备阶段解决写什么,写书项目其他人的进展,deadline这些事情
+创造阶段解决怎么写,用什么工具,图表和demo 代码示例怎么处理,一些词汇怎么拿捏的事情
+Review阶段解决其他人如何来帮助你优化文章,借助Review工具来提意见,来整理建议和追踪实施建议。
+
+
+### 节点人物:
+
+项目经理来督促,对自己负责的章节有很明确的意识,写什么内容,怎么写,这些需要不断和具体的作者来沟通和进度把控。
+
+书籍2、4章(李仲辉)
+书籍3、7、8章(唐明)
+书籍5、6章(张淼)
+
+### Repo 信息:
+
+
+
+
+- [+] 提交新的大纲和owner到contents.md
+- [+] 上次商讨的guides 写作规范沉淀到repo中
+- [+] 确定新的workflow.md 等(从awesome-ng2移入)
+- [+] 开始把每次的reversion changelog更新
+- [+] 确定我们的milestone到roadmap中
+- [+] 加入glossary.md 来确定 terminology
+
+我们希望大家的一些工作都能反馈到 github 这个 repo(如提交文章,改善指南等,我们能够明确的知道大家的这周的工作进展,更新了哪些,提交了哪些,是富有余力还是颇有压力需要支持等。
+
+希望在流程和工具上提供支持,我们也是项目开发涉及忍更多,也是每天支持10分钟,为什么没有项目经理来…
+
+### Awesome-ng2 内容支持:
+
+
+
+
+### 词汇表 & Demo
+
+遇到拿捏不准的英文专业术语找龙哥,和龙哥讨论,看龙哥的glossary.md
+
+
+
+
+在文章中需要引入代码示例的,找钱骞Money同学。为了统一的代码风格和统一的领域示例概念。
+
+
+### 书写工具
+
+我们希望我们的书稿文字都以 markdown 的形式提供,这种格式好处不需多说了。
+
+#### 本地编写
+
+在本地编写推荐 MWeb Lite 来实施(最棒的是解决了图片等资源可以copy&paste,drag&drop的方式添加,而且可以在编辑界面的时候就能 preview.
+
+
+
+
+推荐做法,修改或添加文本后,通过git 提交的方式同步到我们的git库
+
+
+#### 在线编写
+
+当然可以直接通过 gitbook 提供的编辑器来,但是这样会造成很多无意义的commit(污染git 提交)同时添加图片也没有那么方便
+
+
+#### Review
+
+当我们提供好基础草稿draft等后,我们就可以开始对我们的内容进行审核了。通过开启gitbook comment来实现inline comment*(选中你要评论的文字,然后在文章的右侧栏有+,点击后可以添加评论)
+
+
+
+对于其他非inline的评论,如通用建议,内容建议等可以在discussion tab页来添加。
+
+
+
+### 画图工具
+
+画图工具有不少,有在线Web版也有软件版,有颜值高的也有功能强的。有可视化编辑的也有文本描述的。选一款让团队满意并且功能好用的着实不好办。
+
+我们建议在一开始通过 mermaid 来用文本的形式来表达自己的想法(如果觉得受限,可以通过喜欢的软件甚至圈画来提供草稿版的图表UML图等
+
+在对比了 draw.io, gliffy, lucidchart, processon 后,最终选择了 processon 来构建。我们觉得它在制图和协作上达到了比较好的平衡(建议有专门的制图同学负责统筹制作如图表颜色,大小,文字,风格等细节确认)
+
+
+
+Generation of diagram and flowchart from text in a similar manner as markdown http://knsv.github.io/mermaid/
+
+
+
+
+
+
+
+
+### 写作思考
+
+> 在无头绪,思路枯竭时,按照套路去写~
+
+MUCE
+
+金字塔
+
+六顶帽子
+
+
+
+
+
+
+
diff --git "a/source/_drafts/\346\234\215\345\212\241\347\253\257\345\274\200\345\217\221\347\232\204GUI\345\267\245\345\205\267.md" "b/source/_drafts/\346\234\215\345\212\241\347\253\257\345\274\200\345\217\221\347\232\204GUI\345\267\245\345\205\267.md"
new file mode 100644
index 0000000..8d63ecb
--- /dev/null
+++ "b/source/_drafts/\346\234\215\345\212\241\347\253\257\345\274\200\345\217\221\347\232\204GUI\345\267\245\345\205\267.md"
@@ -0,0 +1,33 @@
+
+
+
+
+## mongodb - MongoHub
+
+
+
+
+
+
+
+
+## redis - Medis
+
+
+
+## docker - Kitematic
+
+
+
+
+## ftp/scp - Transmit
+
+
+
+
+
+
+****
+
+
+
diff --git a/angular-$http-feedback.md b/source/_posts/angular-$http-feedback.md
similarity index 100%
rename from angular-$http-feedback.md
rename to source/_posts/angular-$http-feedback.md
diff --git a/angular-ngmocke2e-mock-data.md b/source/_posts/angular-ngmocke2e-mock-data.md
similarity index 100%
rename from angular-ngmocke2e-mock-data.md
rename to source/_posts/angular-ngmocke2e-mock-data.md
diff --git a/angular2-transalte-angular2-overview.md b/source/_posts/angular2-transalte-angular2-overview.md
similarity index 100%
rename from angular2-transalte-angular2-overview.md
rename to source/_posts/angular2-transalte-angular2-overview.md
diff --git a/book-emotion-quanity.md b/source/_posts/book-emotion-quanity.md
similarity index 100%
rename from book-emotion-quanity.md
rename to source/_posts/book-emotion-quanity.md
diff --git a/book-note-$100-startups.md b/source/_posts/book-note-$100-startups.md
similarity index 98%
rename from book-note-$100-startups.md
rename to source/_posts/book-note-$100-startups.md
index b36aa9c..52d5c45 100644
--- a/book-note-$100-startups.md
+++ b/source/_posts/book-note-$100-startups.md
@@ -7,7 +7,7 @@ the $100 startup
reinvent the way you make a living, do what you love, and create a new future
重新定义你的生活工作,做你喜欢的,创造未来~
Ps: [豆瓣链接](http://book.douban.com/subject/7015950/)
-
+
## contents
prologue - manifesto a short guide to everything you want 你所需知道的一切在宣言中
@@ -17,7 +17,7 @@ part 1: unexpected entrepreneurs 『另类』企业家
- 1 renaissance 复兴
you already have the skills you need,you just have to know where to look 必须知道哪里去看信息?!
- 2 give them the fish
-how to put happiness in a box and shell it
+how to put happiness in a box and shell it
- 3 follow your passion.. maybe
get paid to do what you love by making sure it connects to what other people want 创造用户需要的产品和服务
- 4 the rise of roaming entrepreneur
@@ -109,14 +109,14 @@ what is the value:
- freedom was Kelly’s primary motivation in making the switch, but the key to her success is the value she provides her clients
- you can pursue freedom for yourself while providing value for others
-
+
the more a business can focus on core benefits instead of boring features, the more customers will connect… and purchase
s1: dig deeper to uncover hidden needs
s2: make your customer a hero (印度Excel老师)
s3: sell what people buy(作者自己的travel ninja 案例)
-
+
six steps to getting started right now:
@@ -150,7 +150,7 @@ have other people asked for your help?
are enough other people willing to pay to gain or otherwise benefit from your expertise?
are there other businesses serving this market but not in the same you would
-
+
(passion + skill) -> (problem + marketplace) = opportunity
key points:
@@ -193,7 +193,7 @@ capture the information in one of three ways:
- write it down
- record audio or video
- produce some combination of a and b
-
+
combine your materials into a product: a e-book or digital package that can be downloaded by buyers
create an offer - what exactly are you selling, and why should people take action on it?
decide a fair, value-based price for your offer.
@@ -246,8 +246,8 @@ seven steps to instant market testing:
good to know if people want what you have to offer before you put a lot of work into making it. through surveys
freely receive, freely give:
-
-
+
+
plan as you go to respond to the changing needs of your customers but launch your business as soon as possible, with a bias toward action
Nick’s first print sale provided far more motivation than the $50 he received. as soon as possible, find a way to get your first sale
@@ -311,7 +311,7 @@ key points:
### 第九章 hustling: the gentile art of self-promotion
advertising is like sex: only losers pay for it
good things happen to those who hustle
-
+
key points:
@@ -383,3 +383,4 @@ opt out of traditional employment
charlatan - 吹牛者忽悠
martyr - 烈士
+
diff --git a/book-note-lead-life-heartly-today.md b/source/_posts/book-note-lead-life-heartly-today.md
similarity index 100%
rename from book-note-lead-life-heartly-today.md
rename to source/_posts/book-note-lead-life-heartly-today.md
diff --git a/book-note-off-from-work.md b/source/_posts/book-note-off-from-work.md
similarity index 100%
rename from book-note-off-from-work.md
rename to source/_posts/book-note-off-from-work.md
diff --git a/book-note-position-of-life.md b/source/_posts/book-note-position-of-life.md
similarity index 100%
rename from book-note-position-of-life.md
rename to source/_posts/book-note-position-of-life.md
diff --git a/book-note-two-things-you-have-to-love.md b/source/_posts/book-note-two-things-you-have-to-love.md
similarity index 96%
rename from book-note-two-things-you-have-to-love.md
rename to source/_posts/book-note-two-things-you-have-to-love.md
index 3c4d512..8ea70af 100644
--- a/book-note-two-things-you-have-to-love.md
+++ b/source/_posts/book-note-two-things-you-have-to-love.md
@@ -32,7 +32,7 @@ Do Next:
与人见面的时候, 试着把自己喜欢的东西和讨厌的事物告诉对方把。
你也可以主动询问对方,『这件事你怎么看』
-
+
### 给戒不掉快乐的你
@@ -47,7 +47,7 @@ Do Next:
请仔细凝视自己的手心
说不定,你能因此发现自己的问题
-
+
### 本章总结课题
@@ -63,7 +63,7 @@ Do Next:
旅行很容易便能达成,你也能因此了解到自己软弱的地方,坚强的地方, 擅长的事情以及不拿手的事。
一个人去旅行把。目的地选在自己陌生的城市,语音不同的国度是最理想的
-
+
## 第二章 去接受那“两件事”
@@ -80,7 +80,7 @@ Do Next:
去思考『如果不做这件事,事情会如何发展』
跨出你的第一步把。
-
+
### 给胆小的你
@@ -95,7 +95,7 @@ Do Next:
Do Next:
如果有根圆木倒在一步之外,你只要跨过去就行了
-
+
### 给害怕孤独的你
@@ -114,7 +114,7 @@ Do Next:
请用今天一整天的时间来好好面对自己,
试着一个人度过吧。
-
+
@@ -123,7 +123,7 @@ Do Next:
### 本章总结课题
只要在身体被逼到极限的时候,才审视自己的心,你会发现自己的意外一面。你会被迫认知到自己并不完美的。但那个你尽可能不想看见的丑陋的自我,才是你应该接受的自我。
-
+
## 第三章 去原谅那“两件事 ”
@@ -137,7 +137,7 @@ Do Next:
方法很简单,就算对方是陌生人
你也主动打招呼,微笑以待,这么做就行你
-
+
### 给想自痛苦中逃离的你
@@ -148,7 +148,7 @@ Do Next:
遇上困难时,就念诵这个咒语:
『正因为我有能力跨越,这个考验才会降临』
-
+
### 给不愿失去的你
@@ -160,7 +160,7 @@ Do Next:
请检索你一个月的金钱使用方式
你是否有效使用你你的财产了?
-
+
### 给害怕贫穷的你
@@ -168,7 +168,7 @@ Do Next:
每个人都会有讨厌自己的时候,没有自信,厌恶自己,无法原谅自己。如果遇到这种时候,就去一件可以立即执行,自己喜欢并且擅长的事情吧。
-
+
## 第四章 去爱那“两件事”
@@ -180,7 +180,7 @@ Do Next:
你唯一必须为自己的外在负责的部分,是你的服装仪容
你是否打理好你的仪容呢?
-
+
### 给讨厌自己的你
@@ -188,7 +188,7 @@ Do Next:
对自己的内在太过敏感的人,『松开脑袋的一两根螺丝钉』偶尔恍惚下,讲通俗点就是装点小傻~
-
+
### 给为生育感到苦恼的你
@@ -200,14 +200,14 @@ Do Next:
那些迅速到手的东西也会轻易的离开我们,这可能就像是临时抱佛脚所背完的书,总是一考完试就忘光。自己投资漫长时间,脚踏实地完成的梦想,才算是真正属于自己
-
+
### 给对一切都感到不安的你
恐怕这世上大部分的人都和你一样有一颗软弱的心,大家都揣着各自的不安和寂寞,如果你能够承认自己心中的不安和寂寞,并且拥抱他,珍爱他,这就是最好的应对方法
-
+
### 本章总结课题
@@ -216,5 +216,5 @@ Do Next:
严于律己的人才有资格享受生活
早上五点起床,跑步,晚上五点半结束工作,七点和家人一起用餐,十点准时睡觉。经年如此。三个人以上的聚会,他尽可能不参加
-
+
diff --git a/gf-archive/gf-alert.md b/source/_posts/gf-alert.md
similarity index 97%
rename from gf-archive/gf-alert.md
rename to source/_posts/gf-alert.md
index 0033fa2..e2bf6dc 100644
--- a/gf-archive/gf-alert.md
+++ b/source/_posts/gf-alert.md
@@ -1,7 +1,3 @@
----
-draft: true
----
-
Zabbix 监控一览和艺术
## 数据源头
@@ -10,7 +6,7 @@ Zabbix 监控一览和艺术
## 收集模式:active(更好性能和安全) vs passive
-- 譬如agent - request frequency set by sent 120 sec. by default
+- 譬如agent - request frequency set by sent 120 sec. by default
- agent -> server request: want to check? response: cpu load... agent -> server 推送 所需的数据
## check的时机
@@ -41,7 +37,7 @@ Zabbix 监控一览和艺术
### problem -> recovery
- 系统overload {server:system.cpu.load.min(5m)}>3 recovery就是min(2m)}<1
- - no free disk space: {server:vfs.fs.size[/.pfree].last()}<10,recovery就[/.pffree].last()是>30
+ - no free disk space: {server:vfs.fs.size[/.pfree].last()}<10,recovery就[/.pffree].last()是>30
- ssh server not avaiable: {server:net.tcp.service[ssh].max(#3)}=0,recovery就是min(#10)=1
### anomaly detection
@@ -71,3 +67,5 @@ Zabbix 监控一览和艺术
如data collection, problem detection, automatic actions,
alertings[escalations], 趋势预测, 等
+
+
diff --git a/gf-archive/gf-devops.md b/source/_posts/gf-devops.md
similarity index 98%
rename from gf-archive/gf-devops.md
rename to source/_posts/gf-devops.md
index 607789e..5decba3 100644
--- a/gf-archive/gf-devops.md
+++ b/source/_posts/gf-devops.md
@@ -1,6 +1,3 @@
----
-draft: true
----
数据采集包括了:
@@ -35,3 +32,4 @@ fluent, statsd, zabbix agent and plugin, logstash
- 监控告警
主要用于对服务进行心跳检测、监控服务的各项指标,当某些指标异常或超过设定的阈值时进行短信、SMS、邮件的报警(实现 escalate! 危机告警升级)。
+
diff --git a/gf-archive/gf-java-spring-101.md b/source/_posts/gf-java-spring-101.md
similarity index 75%
rename from gf-archive/gf-java-spring-101.md
rename to source/_posts/gf-java-spring-101.md
index ddf8146..3bca064 100644
--- a/gf-archive/gf-java-spring-101.md
+++ b/source/_posts/gf-java-spring-101.md
@@ -1,6 +1,3 @@
----
-draft: true
----
PPT 一览,下载见附件。
@@ -26,85 +23,86 @@ PPT 一览,下载见附件。
## Speak Note
-新一代的java会让大家的开发轻松很多,
-java很复杂繁琐头疼(大家提到的时候, think in java, effective java大部头的书,但是现在不用纠结传统的语言层面上的东西了。
+新一代的java会让大家的开发轻松很多,
+java很复杂繁琐头疼(大家提到的时候, think in java, effective java大部头的书,但是现在不用纠结传统的语言层面上的东西了。
-去年是java 20周年,orcale有很大的庆祝活动,收购sun(对community好事坏事,它是律师组成公司),现在java之父已经离开了(oracle对商业和社区规范化很大贡献。
+去年是java 20周年,orcale有很大的庆祝活动,收购sun(对community好事坏事,它是律师组成公司),现在java之父已经离开了(oracle对商业和社区规范化很大贡献。
-对java 编程语言本身
-1.0
-之后的, 基础的JIT compiler,Hotspot的vm,
-从 5.0之后支持泛型,让java类型表达更丰富(这个是非常重要的版本
-c#.net 中早就有了(尤其),即使j8的lambda,closure也在其他中早就有了
-但是选择语言不是只看语言本身,看类库。社区提供了很多强大的工具类库等
+对java 编程语言本身
+1.0
+之后的, 基础的JIT compiler,Hotspot的vm,
+从 5.0之后支持泛型,让java类型表达更丰富(这个是非常重要的版本
+c#.net 中早就有了(尤其),即使j8的lambda,closure也在其他中早就有了
+但是选择语言不是只看语言本身,看类库。社区提供了很多强大的工具类库等
-非常有趣的是不仅仅贡献java语言本身,也贡献了另外的jvm,和在它之上的(业界领先的vm,高性能的,同时(遵循jvm语言规范后)对语言支持很好)
-上面scala「spark选用它作为主要的编程语言」,groovy(很多spring里,很多在用
-JavaScript可以在jvm上跑(
-clojure
+非常有趣的是不仅仅贡献java语言本身,也贡献了另外的jvm,和在它之上的(业界领先的vm,高性能的,同时(遵循jvm语言规范后)对语言支持很好)
+上面scala「spark选用它作为主要的编程语言」,groovy(很多spring里,很多在用
+JavaScript可以在jvm上跑(
+clojure
-java语言本身不足通过库和生态系统去弥补。大概的趋势
-你会看见分为两大阵营(web上,java ee, 和非 java ee)。以为orcale正规军的servlet,jsp,jsf很多东西混在一起没有分离,后面需要model去做binding。虽然它是标准,但是很多人乐于喜欢用spring mvc,很少用structs很多人不用被取代,ssh(spring structs, hibernate)
-总体看有java ee的实现,也有非ee的实现(大部分是spring的实现。所以它是java生态系统非常重要的一点。
+java语言本身不足通过库和生态系统去弥补。大概的趋势
+你会看见分为两大阵营(web上,java ee, 和非 java ee)。以为orcale正规军的servlet,jsp,jsf很多东西混在一起没有分离,后面需要model去做binding。虽然它是标准,但是很多人乐于喜欢用spring mvc,很少用structs很多人不用被取代,ssh(spring structs, hibernate)
+总体看有java ee的实现,也有非ee的实现(大部分是spring的实现。所以它是java生态系统非常重要的一点。
-java和.net还是比较像(静态的,某种意义跨平台,都是比较重
-python,ruby 另外的(数据分析,django, flask 做一些web开发,ruby 本身在rails,
-php不用多说,世界上最好的编程语言(所以不用,facebook第一版,能开发出好的语言就可以
-前端程序员打开新思路(JavaScript居然可以写后端,它的不足有callback hell, quick & dirty但是当你code规模变大,企业开发,但是维护性或者嵌套不容易debug等
+java和.net还是比较像(静态的,某种意义跨平台,都是比较重
+python,ruby 另外的(数据分析,django, flask 做一些web开发,ruby 本身在rails,
+php不用多说,世界上最好的编程语言(所以不用,facebook第一版,能开发出好的语言就可以
+前端程序员打开新思路(JavaScript居然可以写后端,它的不足有callback hell, quick & dirty但是当你code规模变大,企业开发,但是维护性或者嵌套不容易debug等
-java写起来很复杂,verbose,python就很简洁。真的这样吗?
+java写起来很复杂,verbose,python就很简洁。真的这样吗?
-spring 初期,哲学都一样,用xml做configuration,但是Spring经历了这么多,意识到那么多conf有不足*(spring source,pivotal收购各种被收购,对spring做了一些改造,我觉得是比较好的方向,但是介绍之前,我讲些:
+spring 初期,哲学都一样,用xml做configuration,但是Spring经历了这么多,意识到那么多conf有不足*(spring source,pivotal收购各种被收购,对spring做了一些改造,我觉得是比较好的方向,但是介绍之前,我讲些:
-大家看下java招聘,跟web相关,都会要求懂spring。我觉得是整个生态系统
-不仅仅framework,
-spring core 只是bean的container)为什么,听过DI,这个container来维护bean的生命周期。
-除了core之外,包含了web,mvc,
-aop(切面编程)比如logging,security等,这些和业务code是要隔离的,譬如对log改动可以都改动等。
-支持事务,支持JPA,支持ORM等对象关系模型等,ejb(java ee 来控制transaction,而ejb很复杂,大家很struggle)。
+大家看下java招聘,跟web相关,都会要求懂spring。我觉得是整个生态系统
+不仅仅framework,
+spring core 只是bean的container)为什么,听过DI,这个container来维护bean的生命周期。
+除了core之外,包含了web,mvc,
+aop(切面编程)比如logging,security等,这些和业务code是要隔离的,譬如对log改动可以都改动等。
+支持事务,支持JPA,支持ORM等对象关系模型等,ejb(java ee 来控制transaction,而ejb很复杂,大家很struggle)。
-what do you like/dislike spring?
-下面是大家可能喜欢或者不喜欢的Spring的一些点。
-首先DI是大家最有可能,DI其实是一种Design pattern。大家在OO时如果cls a用cls b(new b前需要b是怎么构成的,每个cls需要它依赖是怎么生成的。所以在center的地方来申明b是怎么生成,所以Spring扫描来生成和放置,别人需要用直接autowire就行了)
+what do you like/dislike spring?
+下面是大家可能喜欢或者不喜欢的Spring的一些点。
+首先DI是大家最有可能,DI其实是一种Design pattern。大家在OO时如果cls a用cls b(new b前需要b是怎么构成的,每个cls需要它依赖是怎么生成的。所以在center的地方来申明b是怎么生成,所以Spring扫描来生成和放置,别人需要用直接autowire就行了)
-mvc,spring提供在每一层都提供了很多好用的来帮助开发者
-大家不喜欢的,在spring 是java写的,初期还是繁琐的理念,手动的配置和xml配置的,很多xml要有两千多行来配置。
-可以想想这么多行,那么多bean、component,如果加减改动非常麻烦和不可想象。
-在学校是通过xml来改动,延续下来。变成 legacy的。
+mvc,spring提供在每一层都提供了很多好用的来帮助开发者
+大家不喜欢的,在spring 是java写的,初期还是繁琐的理念,手动的配置和xml配置的,很多xml要有两千多行来配置。
+可以想想这么多行,那么多bean、component,如果加减改动非常麻烦和不可想象。
+在学校是通过xml来改动,延续下来。变成 legacy的。
-Spring和 application server 有冲突的,为什么(application server一开始是code against j2ee standard,而不是spring standard,中间有
-学习曲线很多东西要记住,这样才能处理一个request等
+Spring和 application server 有冲突的,为什么(application server一开始是code against j2ee standard,而不是spring standard,中间有
+学习曲线很多东西要记住,这样才能处理一个request等
-到底是谁的问题,是java本身还是spring社区导致的问题,java ee等
+到底是谁的问题,是java本身还是spring社区导致的问题,java ee等
-于是深思熟虑后,
-所以spring社区就孕育而出的Spring boot。
+于是深思熟虑后,
+所以spring社区就孕育而出的Spring boot。
-为什么是?framework本身提供不同的各种素材(但是你要知道它这些要怎么用,才能做出来好的菜)但是spring boot让你做很少工作,让你做出好吃的菜(能够大部分满足需求
+为什么是?framework本身提供不同的各种素材(但是你要知道它这些要怎么用,才能做出来好的菜)但是spring boot让你做很少工作,让你做出好吃的菜(能够大部分满足需求
-在Spring boot发布后,是非常好的,微服务的开发的方式(非常好的数据,java社区、Spring社区意识到了boot解决了很多问题所以乐于使用。为什么要使用Springboot
+在Spring boot发布后,是非常好的,微服务的开发的方式(非常好的数据,java社区、Spring社区意识到了boot解决了很多问题所以乐于使用。为什么要使用Springboot
-首先:
-CoC,有一些opinionated的帮你auto config很多东西,譬如安全配置,datasource setting,integration各种预设的值,你改改参数,你不用知道那个bean在哪里生成,他们之间什么关系。同时预留接口,不满足后你可以overwrite它(rails更大量用这样的技巧coc)
+首先:
+CoC,有一些opinionated的帮你auto config很多东西,譬如安全配置,datasource setting,integration各种预设的值,你改改参数,你不用知道那个bean在哪里生成,他们之间什么关系。同时预留接口,不满足后你可以overwrite它(rails更大量用这样的技巧coc)
-profiles,本地有开发环境还有staging, production, 等。但是同样code在不同环境需要不同的参数。(spring profiles 来控制 Properties
+profiles,本地有开发环境还有staging, production, 等。但是同样code在不同环境需要不同的参数。(spring profiles 来控制 Properties
-同时结合(war file 打包,下载单独的Tomact,通过Tomact admin console或directory后才能使用。
-但是spring boot 结合到tomcat, jetty不需要单独,完整打包在一起,直接 javac 去run就好了 这个embedded servlet containers 让部署非常方便
+同时结合(war file 打包,下载单独的Tomact,通过Tomact admin console或directory后才能使用。
+但是spring boot 结合到tomcat, jetty不需要单独,完整打包在一起,直接 javac 去run就好了 这个embedded servlet containers 让部署非常方便
-actuator 让operation运维的痛点(譬如application health, 还是启动时ping下还是怎么, monitoring来看它的状态,它依赖的状态,同时ops不同系统负责不同方面,但是actuator包含这些方面,所以是production ready
+actuator 让operation运维的痛点(譬如application health, 还是启动时ping下还是怎么, monitoring来看它的状态,它依赖的状态,同时ops不同系统负责不同方面,但是actuator包含这些方面,所以是production ready
-但是光光boot不能解决所有问题,你的app需要访问底层数据库(如sql写过,select from where xx id = xxx等)这种boilerplate希望系统来帮我们生成(save,delete这些逻辑都很简单,需要被节省下来)
+但是光光boot不能解决所有问题,你的app需要访问底层数据库(如sql写过,select from where xx id = xxx等)这种boilerplate希望系统来帮我们生成(save,delete这些逻辑都很简单,需要被节省下来)
-于是spring想到这点,有spring data项目包含了很多(如spring-data-redis,抽象层在store和在model之间)
-jpa - persistent api 相同的目的,把jpa更加抽象一下(对数据访问更为简单,
-spring data让method name和参数来自动生成sql
+于是spring想到这点,有spring data项目包含了很多(如spring-data-redis,抽象层在store和在model之间)
+jpa - persistent api 相同的目的,把jpa更加抽象一下(对数据访问更为简单,
+spring data让method name和参数来自动生成sql
+
+所以crud(夸得)。这种就非常方便实现xxxx
-所以crud(夸得)。这种就非常方便实现xxxx
diff --git a/gf-archive/gf-log.md b/source/_posts/gf-log.md
similarity index 99%
rename from gf-archive/gf-log.md
rename to source/_posts/gf-log.md
index ccb9db4..4fbab6d 100644
--- a/gf-archive/gf-log.md
+++ b/source/_posts/gf-log.md
@@ -1,6 +1,3 @@
----
-draft: true
----
## 什么是Log
@@ -106,3 +103,5 @@ The Log: What every software engineer should know about real-time data'sunifying
微服务的事件驱动数据管理
I Love Log
+
+
diff --git a/gf-archive/gf-metrics.md b/source/_posts/gf-metrics.md
similarity index 99%
rename from gf-archive/gf-metrics.md
rename to source/_posts/gf-metrics.md
index 5250c3d..44730ef 100644
--- a/gf-archive/gf-metrics.md
+++ b/source/_posts/gf-metrics.md
@@ -1,13 +1,12 @@
----
-draft: true
----
-
▾ ☐ 应用的状态需要上报
• ☐ health check - docker 下
• ☐ spring boot 中
+
+
+
## 时间序列的模式
在时间序列上的数据点会根据值变化体现出趋势特征(当然越精细越小时间范围的,数据起伏尖峰越明显。所以要设置统一的时间范围后在观察)
@@ -67,3 +66,4 @@ Timeseries are two-dimensional with data on the y-axis and time on the x-axis. T
grafana - http://docs.grafana.org/guides/basic_concepts/ Beautiful metric & analytic dashboards
The leading tool for querying and visualizing time series and metrics
+
diff --git a/gf-archive/gf-monitor.md b/source/_posts/gf-monitor.md
similarity index 99%
rename from gf-archive/gf-monitor.md
rename to source/_posts/gf-monitor.md
index d42c367..5b8fc13 100644
--- a/gf-archive/gf-monitor.md
+++ b/source/_posts/gf-monitor.md
@@ -1,7 +1,4 @@
----
-title: 监控 101
-draft: true
----
+# 监控
监控这一过程开始于通过采集器(collection agents,它是运行在被监控节点如主机,数据库或网络设备上程序),agent 采集有意义的系统信息,这些信息被加工量化为数据点,按照一定数据大小量级和时间间隔后定时被agent发送上报到监控服务器。然后被存储、聚合(如存储指标的时间序列数据库 Whisper或InfluxDB,日志存储和索引的ElasticSearch等),最终被绘制到我们的监控面板(dashboard)上(如Kibana,Grafana,Graphite Web等)
@@ -13,7 +10,7 @@ draft: true
- log parsers 解析器。从日志条目中抽取特殊的信息,如从web服务器日志中的状态码,请求的响应时间
- log scanners 扫描器。计算特定字符在日志中出现的次数。譬如要看看普通错误和严重错误的数量,可以看看在日志文件中匹配的 "ERROR|CRITICAL"这个正则的次数。
- interface readers
-
+
- 黑盒
- probers 探针。它们跑在被监控系统的外部,发送请求给系统和检查它们的响应。譬如对网站发送 ping 请求或 http 调用来验证网站是否可用
- sniffers 嗅探器。
@@ -25,9 +22,9 @@ draft: true
完整的监控应该采集和计算包括如下三个部分的指标:
- 资源可用 resource availability
-
+
系统中的每个操作需要消耗 CPU 计算时钟,并且需要内存,信息交互要占用贷款,数据也占用磁盘空间,在不同设备交换消耗 I/O 通量
-
+
- 软件性能 software performance
- 用户行为/业务 user behavior
@@ -35,20 +32,20 @@ draft: true
### 另一个角度:
我们的应用通常包含了三种类型的『软件』:操作系统层面,中间件层面,运行于前两者之上的业务应用层面。每个层面都会产出自己所有组件的特有信息。要对它们进行较为全面的监控,因为系统的短板木桶效用。
-
+
- 操作系统:
-
+
虽然与上面提到的资源可用联系紧密,操作系统监控旨在了解资源如何、以什么比例、以及由谁使用。通常,这个层面的度量报:
-
+
- 可用/已用inode信息,磁盘空间等文件系统
- user-to-system CPU 时间
- 虚拟内存管理(包括swapping交换和内存统计)
- 上下文切换和等待队列状态
-
+
- 中间件:
-
+
提供了一套标准的可组合的,针对目的的软件组件,它们组合起来作为解决方案的引擎。分布式计算中的中间件包括软件Web服务器和应用程序服务器框架。
-
+
- 应用:
应用指标,经常引入特定于业务垂直领域的抽象概念。譬如在批处理系统可以在包含的任务数量和处理时间的指标,内容管理系统可以根据内容条目(如商品,评论,文章等)的变化(新增,更新等)来统计指标。
@@ -87,3 +84,4 @@ Graphite由于三个部分组成:
通常我们用Grafana替换graphite原始的webapp,来作为我们的dashboard可视化应用,在后续的metrics章节会继续介绍。
PS:也有利用时间序列数据库InfluxDB+Grafana来为alternative替代方案
+
diff --git a/gf-archive/gf-new-java-new-spring.md b/source/_posts/gf-new-java-new-spring.md
similarity index 99%
rename from gf-archive/gf-new-java-new-spring.md
rename to source/_posts/gf-new-java-new-spring.md
index b791c2e..9b9fdda 100644
--- a/gf-archive/gf-new-java-new-spring.md
+++ b/source/_posts/gf-new-java-new-spring.md
@@ -1,7 +1,3 @@
----
-draft: true
----
-
# 新 Java,新 Spring
@@ -110,7 +106,7 @@ draft: true
- ③ switch string语法 (⭐️⭐️)
- ④ 泛型类型推断 (⭐️⭐️)
- ⑤ catch捕获多个异常
-
+
### JDK8:
- ① 接口默认方法 default method (⭐️⭐️⭐️)
@@ -169,3 +165,6 @@ draft: true
capable of operating on multiple threads
- ④ Date API
- ⑤ 多重注解
+
+
+
diff --git a/guide-dive-into-react-native-performance.md b/source/_posts/guide-dive-into-react-native-performance.md
similarity index 98%
rename from guide-dive-into-react-native-performance.md
rename to source/_posts/guide-dive-into-react-native-performance.md
index 35a468f..896487e 100644
--- a/guide-dive-into-react-native-performance.md
+++ b/source/_posts/guide-dive-into-react-native-performance.md
@@ -15,7 +15,7 @@ React Native 允许我们运用 React 和 Relay 提供的声明式的编程模
### 量化一切
我们把Facebook的iOS版中的事件主页用RN重新实现(在更多标签页下点击事件进入查看)。这是个非常好的用于测试性能的例子,因为原生版已经做了大量的优化工作,而且该页面也是非常好的典型列表交互的例子。
-
+
接下来,我们自动化的 CT-Scan 性能测试来帮助我们自动定位到我们需要到的标签页。然后反复打开和关闭事件主页50次。在每次交互中,我们能够记录下从点击事件按钮到事件主页能够被完整显示的时间,我们也添加更多详细的性能埋点来告诉我们启动过程哪些步骤是缓慢或消耗CPU的
@@ -30,7 +30,7 @@ React Native 允许我们运用 React 和 Relay 提供的声明式的编程模
6 原生渲染:在shadow线程中先通过根据 FlexBox 布局计算视图大小。然后在主线程中创建和定位这些视图。
-
+
我们根据于此的黄金法则是:永远不要忘了回归测试。我们持续的运行它来追踪性能提升和功能回归。开发者在提交改动的代码之前用它对特定的提交做运行和详细的性能分析。其他的一些测试也需要被同样的方式建立来衡量诸如功能性能和内存使用等
@@ -41,7 +41,7 @@ React Native 允许我们运用 React 和 Relay 提供的声明式的编程模
在RN中,代码是在JavaScript线程中执行的。每次你要写数据到磁盘,在一次网络请求,或者取一些其他原生的资源(如摄像机),你的代码都需要调用原生模块。当你要渲染力你的 React 组件,它们会被转发到界面管理器的原生模块中,它在主线程中来执行布局和创建相应的视图。桥协议来转发请求到原生模块和被回调到你的JS代码(如果需要)。在RN中,所有原生的调用必须是异步的来避免阻塞主线程和JS线程。
在下面的事件组件的启动可视化图中,我们可以看到应用在 JS 队列中运行,为了显示事件列表,触发了相关的缓存读取(在本地存储队列中被异步触发)。一旦它取得了缓存数据,应用在 JS 队列用 React 渲染事件单元格,接着又传给栅格队列来布局和最终传给主队列来创建视图显示。这个例子展示了多个缓存读取(组合成单个常用读取操作可以做到更快)和一些React在JS线程上的渲染操作可以被统一合并。
-
+
### 性能提升
diff --git a/guide-for-engineer-not-want-manage.md b/source/_posts/guide-for-engineer-not-want-manage.md
similarity index 100%
rename from guide-for-engineer-not-want-manage.md
rename to source/_posts/guide-for-engineer-not-want-manage.md
diff --git a/guide-mongdo.md b/source/_posts/guide-mongdo.md
similarity index 100%
rename from guide-mongdo.md
rename to source/_posts/guide-mongdo.md
diff --git a/guide-python.md b/source/_posts/guide-python.md
similarity index 100%
rename from guide-python.md
rename to source/_posts/guide-python.md
diff --git a/guide-top-tech-company-hiring.md b/source/_posts/guide-top-tech-company-hiring.md
similarity index 93%
rename from guide-top-tech-company-hiring.md
rename to source/_posts/guide-top-tech-company-hiring.md
index 54eca1e..c1e6998 100644
--- a/guide-top-tech-company-hiring.md
+++ b/source/_posts/guide-top-tech-company-hiring.md
@@ -14,7 +14,7 @@ keywords: Interview,Hiring
## 不要在约定好的时间电话面试
### 为什么 - 找到那些总是为新工作做好准备的人
-
+
每个人都能在精心准备后在合适面试时间上,回答好一系列的刨根问底的问题。但是想想看,如果你在他们还在睡觉时,在健身课上,甚至在上厕所时,给他们打电话面试。这就是那些顶级技术公司怎么找到哪些永远让自己专业让自己随时准备好应对挑战的方法。
@@ -22,7 +22,7 @@ keywords: Interview,Hiring
## 把面试行程表搞得让人费劲和不可预测
### 为什么 - 找到那些不需要指示能自我驱动的人
-
+
如果在面试中,面试官和面试者在面试都不知道接下来该做什么。这是一个非常好观察时机,来看看谁会在这个沉默的时刻保持主动和发表观点。
@@ -30,7 +30,7 @@ keywords: Interview,Hiring
## 把面试展示中需要的设备搞砸
### 为什么 - 看看面试者在不那么好的环境下的适应
-
+
故意把考察候选人需要做展示的房间中的投影设备『搞坏』。看看候选人逆来顺受和不介意调整,看看他是否足够好相处和合作。如果候选人对展示还有 B 计划,C 计划甚至 D 计划,这就是加分项了,因为这在技术领域非常常见。
@@ -38,7 +38,7 @@ keywords: Interview,Hiring
## 面试中,搞出不少错误假设
### 为什么 - 淘汰那些容易被激怒的人
-
+
如果候选人上家公司是滴滴,试着这样问,『你在快的工作呢多长时间?』注意看候选人改正你时的语调语气,他是保持冷静还是会显得很不舒服。技术公司常常会不可避免的被误解和被背黑锅,通过这个测试可以预测到他那时会怎么处理。
@@ -46,7 +46,7 @@ keywords: Interview,Hiring
## 让候选人解决你真实遇到的难题
### 为什么 - 因为你真的要处理这个问题!!
-
+
技术公司经常让候选人解决它们当前遇到的真实问题。这是一个很好获得免费帮助的方式
@@ -54,7 +54,7 @@ keywords: Interview,Hiring
## 让面试者不断转移面试地点
### 为什么 - 找到那些即使不舒服,但是仍然能保持热情的人
-
+
永远不要让你的职位申请人一直舒服的面试。通过那样的方法,找到那些在自己不舒服时仍然能保持专注,同时真的解决你公司一整天都没有空余会议室的难题。
@@ -62,7 +62,7 @@ keywords: Interview,Hiring
## 同样的问题反复去问
### 为什么 - 测试一致性
-
+
在技术领域,可预测性是一件好事。 在面试时,不要担心一直问同一个问题多次。这是一个很好用于测试候选人一致性的工具。只有在面试高级职位时,候选人才会对他们的回答变得非常不一致。
`ps: 这一段不是很理解,附上原文`
@@ -72,7 +72,7 @@ keywords: Interview,Hiring
## 进行双面试官群面,搞砸气氛
### 为什么 - 找到那些可以在压力下多任务的人
-
+
把候选人安排在会议室中间,两端各有面试官。看看候选人能否同时能取得两位面试官的关注和同时能无压力的回答他们两人提出的各种有跳跃的问题。这是一个很好的机会看看他能否在困难时期把事做成。
@@ -80,7 +80,7 @@ keywords: Interview,Hiring
## 问完问题,开始大声敲键盘
### 为什么 - 找到那些即使有干扰也能保持专注的人
-
+
问候选人问题,然后等他开始回答,就大声敲击键盘,并且向她解释说你在听他回答但是在记录笔记。你可以真的在记录或者仅仅是给朋友写邮件。看看他是否能够专注回答问题还是被打乱思路了。这样可以筛除那些被一些小事就干扰到无法顺利完成工作的人。
@@ -88,7 +88,7 @@ keywords: Interview,Hiring
## 三个月后,再发 offer!
### 为什么 - 找到那些下定决心的人
-
+
这是非常好的用于筛出那些并不是非常看重这份工作的人。看候选人是否为了这个想要 offer 而做出牺牲和努力。他是否认为该份 offer 就是他面前最好的选择。还是拒绝了因为上个月拿到的其他 offer。这就是帮你搞清这些问题的策略。
diff --git a/howto-discourse-forum.md b/source/_posts/howto-discourse-forum.md
similarity index 94%
rename from howto-discourse-forum.md
rename to source/_posts/howto-discourse-forum.md
index 9083399..639d87c 100644
--- a/howto-discourse-forum.md
+++ b/source/_posts/howto-discourse-forum.md
@@ -9,7 +9,7 @@ keywords: HowTO
### 选型
这个几乎没什么好说的,slack 因为可以archive 聊天信息,甚至可以给特定信息 highlight,有作为社区的潜质,但是它更多还仅仅是个聊天工具~ 其他诸如Discuz,NodeBB 都是过去时了,样式和玩法太老旧了。通用的平台也不够强大(如贴吧太low,豆瓣小组太简单,其他web上不容易搜索如陌陌,same等)。但是之前玩 ionic 时候对 forum.ionic.com 一直很喜欢,所以毫不犹豫的选择了 [Discourse](http://www.discourse.org/) 。事实证明它的确很棒(虽然是 Ember 框架写的)
-
+
### 过程
这个部署按照我的一开始打算应该是容易迁移和部署的。 所以毫无疑问选了 [docker镜像](https://github.com/discourse/discourse_docker)。 具体安装步骤和设置更改有[安装文档](https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md)
@@ -62,11 +62,11 @@ todo: 添加 txt 记录dnspod 使得可以用sivagao.com 发送邮件 custom dom
#### 站点后台和配置
很顺畅的就部署完毕,浏览器访问一切正常。进入后台设置站点名称和logo(用keynote和两款漂亮的字体搞定),系统语言等。并且把一些文章如welcome欢迎页等建立起来
-
+
-
+
-
+
### 上线啦,撒花
diff --git a/howto-photos-tidy.md b/source/_posts/howto-photos-tidy.md
similarity index 92%
rename from howto-photos-tidy.md
rename to source/_posts/howto-photos-tidy.md
index 157e655..f902e83 100644
--- a/howto-photos-tidy.md
+++ b/source/_posts/howto-photos-tidy.md
@@ -13,17 +13,17 @@ keywords: Google, Photos, 'Google Photos', 数码照片
通过手机端 iOS APP,安装后进入简单的Google登录后,会提示备份,然后APP就会在后台开始漫长的上传(考虑到我们的网速 - 深圳联通,通过shadowsocks(部署在新加坡的aws节点),来连接Google photos的服务器),具体进度可以在智能助理中看到~
上传完毕后,Google就开始了它的各种计算图像分析和识别(主要是meta信息处理,如geolocation地理位置,拍摄时间等)这样用于生成自动创建的事件『特定时间段通常一天的多张照片组成,按照拍摄时间和地理位置切分』,这样在手机上、浏览器上看到的就是一个非常顺畅的故事连环画了。这个功能的确是十分惊艳,好像其他家都没提供。
-
+
然后高质量的图片上传无限连免费的确很棒,因为很多时候我们并不需要那么大的原图。
自带的人脸识别,把照片中出现的人物识别出来并且以此聚集照片,是一个非常方便的找出人像的方法。(当然了Apple自带的iphoto也提供类似的功能,iphoto的根据geo生成的图片聚合也不错。)
一句话,值得一试,大厂服务值得信赖~
-
+
更多的照片类型筛选,除了人脸~
-
+
{% cq %}
云时代,选好服务,不要再出现图片丢失的蠢事了~
diff --git a/ionic-navigation-history.md b/source/_posts/ionic-navigation-history.md
similarity index 100%
rename from ionic-navigation-history.md
rename to source/_posts/ionic-navigation-history.md
diff --git a/ionic-update.md b/source/_posts/ionic-update.md
similarity index 100%
rename from ionic-update.md
rename to source/_posts/ionic-update.md
diff --git a/ionic-view-cache.md b/source/_posts/ionic-view-cache.md
similarity index 100%
rename from ionic-view-cache.md
rename to source/_posts/ionic-view-cache.md
diff --git a/jokers-developer.md b/source/_posts/jokers-developer.md
similarity index 92%
rename from jokers-developer.md
rename to source/_posts/jokers-developer.md
index 08e9c86..c7659b3 100644
--- a/jokers-developer.md
+++ b/source/_posts/jokers-developer.md
@@ -1,6 +1,6 @@
----
-title: 16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
----
+
+
+16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
本文罗列的这些书籍封面其实是各种典型的反模式,不过它们真的是非常常见以至于大家都习以为常了~
@@ -8,7 +8,7 @@ title: 16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
你最需阅读的一本编程书籍(其实编程书留下这本就够了!)
搞笑的是,在 Gitbook 上真有这样的小书(https://tra38.gitbooks.io/essential-copying-and-pasting-from-stack-overflow/content/code_licensing.html) 从 code licensing issues, code attribution, code selection 上来论述
-
+
@@ -17,7 +17,7 @@ title: 16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
事实上拥有一个不断进化和自我革命的社区是一件很不错的事情,但前提是要你要接受这样的现实。不断学习和充实自己,并且透过变动改变的这些抓住真正永恒和持久的东西。
关于JavaScript社区为什么这么生机勃勃,折腾不止,请看文章[永不停步(折腾死人)的JavaScript 生态](https://github.com/gaohailang/blog/issues/17)
-
+
###《精通为不写测试找借口》
@@ -29,7 +29,7 @@ title: 16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
- 那些有很高复杂度的
- 那些重要功能/常被查看的
-
+
@@ -49,15 +49,15 @@ title: 16年程序员安最需要看的8本小书 - 啪啪啪打脸指南
Dirty hack 不一定总是坏事,如果你没有脸盆、电焊、管钳、女朋友、新水管和防渗胶带,而这套水管系统反正就快整个报废了的话。
-
+
-###《都怪用户口袋书》
+###《都怪用户口袋书》
你还在花时间修复那些挠人的bug?
你是10X工程师,怎么可能出错,肯定是别人的问题。是他们的手机,浏览器的问题,一定是!!很多工程师的确是这样解决问题,一些特殊case,一些在设计代码没有考虑的情况,就这样被他忽悠过去了。
-
+
###《从入门到精通:简历驱动式开发》
@@ -66,7 +66,7 @@ Dirty hack 不一定总是坏事,如果你没有脸盆、电焊、管钳、女
表现型选手就是这样,他们常常需要挑活做,去做那些看起来很高大上的事情,却不愿撩开袖子去处理细节去干脏活累活。
他们也经常在简历上写着 XXX 项目的主要负责任(实际上很可能就是参与了一部分,做了边缘系统的部分功能)。或者在简历毫不谦虚的写着精通XX编程语言(实际上很可能就是用它写过helloworld而已)。或者在简历大大方方的写着熟练使用XX消息队列(实际上可能也就仅仅是看了篇肤浅的博客而已)
-
+
###《写出没人看到代码:权威指南》
@@ -76,7 +76,7 @@ Dirty hack 不一定总是坏事,如果你没有脸盆、电焊、管钳、女
他们对系统代码的要求很低,『它不是能跑吗,你管那么多干什么』
这样的态度,让后来的同事很难推动后续的工作。譬如总是有莫名其妙的错误像是被它黑洞似的吞掉了,让周边模块的开发者背黑锅,一旦定位进去就像是在漆黑伸手不见五指的下水道走路,胆战心惊瑟瑟冷风还有弥漫空中的坏味道(代码逻辑很绕,变量名称很奇葩看不懂,几乎没有log日志打印出等等)
-
+
@@ -84,7 +84,7 @@ Dirty hack 不一定总是坏事,如果你没有脸盆、电焊、管钳、女
在网上总能找到让这些问题消失的方法!
-
+
###《用上无用依赖的开发者指南》
@@ -92,4 +92,5 @@ Dirty hack 不一定总是坏事,如果你没有脸盆、电焊、管钳、女
这些人真是把不重新发明轮子的优良传统发挥到极致,可能就是为了用某个函数方法就把一个巨大的依赖库加入到代码仓库中(后续花费在安装依赖上的时间,很可能超过了那个简单函数方法编写上),更有甚至不把依赖下载类似于 packages.json,bundler,requirements.txt等中,居然让后续协作人去生产机器上把依赖直接copy回来(orz...)PS:要用好类似于 pip freeze, npm shrinkwrap 等功能啊
-
+
+
diff --git a/js-new-trends-alloyteam-lightning-talk.md b/source/_posts/js-new-trends-alloyteam-lightning-talk.md
similarity index 76%
rename from js-new-trends-alloyteam-lightning-talk.md
rename to source/_posts/js-new-trends-alloyteam-lightning-talk.md
index 25a4229..694583b 100644
--- a/js-new-trends-alloyteam-lightning-talk.md
+++ b/source/_posts/js-new-trends-alloyteam-lightning-talk.md
@@ -1,106 +1,102 @@
----
-title: JavaScript 社区的新语言,新趋势
-date: 2017-05-01
----
+# JavaScript 社区的新语言,新趋势
+PS:本文会加工为PPT,在腾讯 AlloyTeam 2016 前端大会,作为 lightning talk(10min)快速分享下~
-PS:本文会加工为PPT,在腾讯 AlloyTeam 2016 前端大会,作为 lightning talk(10min)快速分享下~
-
-由于项目开发需求我离开过前端一阵子,当我回来重操旧业,立即被一个悲催事实吓到:所有东西都变了!PS: 尽管大部分时间,这种更迭是增量的。
+由于项目开发需求我离开过前端一阵子,当我回来重操旧业,立即被一个悲催事实吓到:所有东西都变了!PS: 尽管大部分时间,这种更迭是增量的。


-## fatigue - ppt
-为什么 - 问题越来越复杂了
+## fatigue - ppt
+为什么 - 问题越来越复杂了
-我们试图构建在数十种浏览器中运行的应用程序,在数千个不同的设备上看起来正常(不同的屏幕尺寸不同操作系统不同的WebView),对进出信号不好的电梯地铁的糟糕网络环境,甚至是要对盲人等,都能deliver良好的体验。
+我们试图构建在数十种浏览器中运行的应用程序,在数千个不同的设备上看起来正常(不同的屏幕尺寸不同操作系统不同的WebView),对进出信号不好的电梯地铁的糟糕网络环境,甚至是要对盲人等,都能deliver良好的体验。
-有许多可行的方法来实现所有这些目标。 而一个大型的工具生态系统已经出现 - 每一个从不同的角度攻击不同的问题。
+有许多可行的方法来实现所有这些目标。 而一个大型的工具生态系统已经出现 - 每一个从不同的角度攻击不同的问题。
-解说趋势就少不了调查问卷来的数据,下面会使用state-of-js的开放数据
+解说趋势就少不了调查问卷来的数据,下面会使用state-of-js的开放数据

-## state of js - 选择篇
-一页ppt展示『
-javascript flavors
-front-end frameworks
-css tools
-build tools
-』 目前的不同选择。相信大家都有所耳闻
+## state of js - 选择篇
+一页ppt展示『
+javascript flavors
+front-end frameworks
+css tools
+build tools
+』 目前的不同选择。相信大家都有所耳闻
-### 语言之选
-当谈论“JavaScript”时,我们不只是在谈论单一的语言:它实际上更像是一个密切相关的表兄弟家庭。
+### 语言之选
+当谈论“JavaScript”时,我们不只是在谈论单一的语言:它实际上更像是一个密切相关的表兄弟家庭。
-ES6是新的标准。CoffeeScript已经过去了。新的JavaScript风格即将到来。
-ES6与React,TypeScript与Angular 2,两大框架的站位让趋势更加明朗。
+ES6是新的标准。CoffeeScript已经过去了。新的JavaScript风格即将到来。
+ES6与React,TypeScript与Angular 2,两大框架的站位让趋势更加明朗。

-### 框架之争
-不能错过 React.
-Vue 越来越流行(因为国人?)
-Angular 2 > Angular. 吸引着大量的关注
+### 框架之争
+不能错过 React.
+Vue 越来越流行(因为国人?)
+Angular 2 > Angular. 吸引着大量的关注

-### 样式工具
-SASS / SCSS是目前主流。
-CSS Modules 也许值得研究。
-在React中的CSS: - 如果你想构建可以在其他React应用中可使用的可移植React组件,CSS in JavaScript 是你的最佳选择。 除了CSS Modules,还有 Aphrodite。
+### 样式工具
+SASS / SCSS是目前主流。
+CSS Modules 也许值得研究。
+在React中的CSS: - 如果你想构建可以在其他React应用中可使用的可移植React组件,CSS in JavaScript 是你的最佳选择。 除了CSS Modules,还有 Aphrodite。

-### 构建工具
-Webpack和Gulp是闪亮的未来。
-Grunt可能成为过去的东西
+### 构建工具
+Webpack和Gulp是闪亮的未来。
+Grunt可能成为过去的东西
-Webpack用户与ES6,React,React Native和Redux重叠 - happy family
-Rollup - 声称生成比Browserify或Webpack更小的包,值得关注。 (成为ionic2的default,声称在 es6 module 使用更好,webpack2 开始集成 tree-shaking)
+Webpack用户与ES6,React,React Native和Redux重叠 - happy family
+Rollup - 声称生成比Browserify或Webpack更小的包,值得关注。 (成为ionic2的default,声称在 es6 module 使用更好,webpack2 开始集成 tree-shaking)

-## JS 新趋势
+## JS 新趋势
-Ex极限编程方法的创造者肯特贝克 说过:
+Ex极限编程方法的创造者肯特贝克 说过:
“让它工作,使它正确,使它快速。”
-“Make it work, make it right, make it fast.” — Kent Beck
-在过去的20年,我们专注于使 Web Works~
+“Make it work, make it right, make it fast.” — Kent Beck
+在过去的20年,我们专注于使 Web Works~
-如果你想知道 JavaScript 社区生态朝着什么方向发展,你可能会去关注现在什么特性和工具正在快速流行被高度评价。
+如果你想知道 JavaScript 社区生态朝着什么方向发展,你可能会去关注现在什么特性和工具正在快速流行被高度评价。
-下面是这些:3代表Nice-to-have的,越高越代表是主要feature,越低代表没那么需要。
-PS:我们会发现新实践新潮流会引入新问题,从而循环往复,推着整个技术圈往前波浪式螺旋的发展。
+下面是这些:3代表Nice-to-have的,越高越代表是主要feature,越低代表没那么需要。
+PS:我们会发现新实践新潮流会引入新问题,从而循环往复,推着整个技术圈往前波浪式螺旋的发展。
-The Cambrian explosion of tools you see around you is what rapid progress looks like when it’s not controlled by an Apple or a Microsoft.
-Everyone’s scrambling to make it right, and to make it fast, all at once.
+The Cambrian explosion of tools you see around you is what rapid progress looks like when it’s not controlled by an Apple or a Microsoft.
+Everyone’s scrambling to make it right, and to make it fast, all at once.

-## 开发构建
+## 开发构建
-- Code Splitting
-现在的SPA框架会导致构建的单体应用所有代码被打成bundle一起发给客户端,不少是在特定环境下才会使用到的阻塞的代码的时候。所以社区以 Webpack提供的把 你的代码分离成Chunk,后者可以按需加载,这是 Code Splitting. 在React社区也很流行, Angular 中的lazyload或新路由中的懒加载都能实现。
+- Code Splitting
+现在的SPA框架会导致构建的单体应用所有代码被打成bundle一起发给客户端,不少是在特定环境下才会使用到的阻塞的代码的时候。所以社区以 Webpack提供的把 你的代码分离成Chunk,后者可以按需加载,这是 Code Splitting. 在React社区也很流行, Angular 中的lazyload或新路由中的懒加载都能实现。
-- Dead Code Elimination
-虽然 Code Splitting允许你拆分文件,只发送所需的部分,死代码消除更进一步,挖入你的代码库,以删除不需要的代码。不是导入整个 Undersore 库,可以使用类似于 Rollup 的库遍历源码在bundle打包前把你没有用到的函数方法去掉。以前这是要实现在编译器的优化,现在使用类似于 tree-shaking( possible when the entire code base is ES6 and uses import statements)
+- Dead Code Elimination
+虽然 Code Splitting允许你拆分文件,只发送所需的部分,死代码消除更进一步,挖入你的代码库,以删除不需要的代码。不是导入整个 Undersore 库,可以使用类似于 Rollup 的库遍历源码在bundle打包前把你没有用到的函数方法去掉。以前这是要实现在编译器的优化,现在使用类似于 tree-shaking( possible when the entire code base is ES6 and uses import statements)
## 开发调试
@@ -109,47 +105,49 @@ Everyone’s scrambling to make it right, and to make it fast, all at once.
热模块重新加载意味着能够立即在浏览器中看到JS代码的任何更改,而无需刷新页面。这极大的提升了开发体验
『当您更改文件时,服务器将仅向客户端发送更改(以及可能是其依赖关系)。 “热感知”的模块(导入/要求彼此的文件)然后可以在新代码到达时采取动作来使用新代码。』
-- Time-Travel Debugging
+- Time-Travel Debugging
随着新的类似于Redux这样的状态管理工具的流行,新的编码和调试模式也在涌现。Time-Travel Debugging 就是利用Redux来存储应用的连续状态,从而可以无限的撤销和重做。非常方便如果你改了reducer的代码,被staged的action会被重新全部求值生效。
## 数据交互?
-- Real-Time Operations
+- Real-Time Operations
现在现代浏览器和宽带速度,你几乎可以想象过不了几年,realtime ops/ui 成为默认,而不是一个高级功能。
这种在协同工具中在仪表板中是必须的,但是越来越多的譬如Facebook的,之前养成习惯是要刷新页面才,可能很快会变成历史了(00们... )结合数据库端的livequery/或对oplog的socket.io 广播updates到客户端的状态管理工具处就行了。
-- Optimistic Updates
+- Optimistic Updates
而不是在客户端执行接口操作时等待服务器返回,Optimistic Updates(乐观更新)在客户端上模拟预期的返回,并立即显示它。只有在服务器少数情况下-返回异常时修复冲突回滚状态。新框架新的工具库正在让这件事变得容易
-- Offline Usage /w Service Workers
-我们的应用环境变得苛刻在移动设备中。 上地铁进电梯的使用) - Any app that might conceivably be used from a smartphone should account for the possibility of disconnects, reconnects, and the offline use and data syncing issues that they entail. - 数据拉取是否会reconnect/retry,数据提交是否会重做。Service Workers 会帮助我们更好的实施,这两年浏览器支持情况也会越来越好。
+- Offline Usage /w Service Workers
+我们的应用环境变得苛刻在移动设备中。 上地铁进电梯的使用) - Any app that might conceivably be used from a smartphone should account for the possibility of disconnects, reconnects, and the offline use and data syncing issues that they entail. - 数据拉取是否会reconnect/retry,数据提交是否会重做。Service Workers 会帮助我们更好的实施,这两年浏览器支持情况也会越来越好。
事实上上面特性结合统一的状态管理工具,实施起来会变得相对容易。
## 语言应用
-- Static Type System
+- Static Type System
JavaScript可能没有静态类型系统,但不意味着你不可以使用。Angular 2采用TypeScript和像Flow这样的项目是社区中强类型系统的风向标。这样的好处如果你仅仅只会JavaScript而没有其他语言的基础估计可能体会到。编译前检查来避免runtime error,把一些常规事务延给language platform去做了。
-- Isomorphic Architecture /w Server-Side Render
+- Isomorphic Architecture /w Server-Side Render
你应该能够在客户端和服务器之间共享代码。
构建JavaScript应用程序的最大挑战是管理客户端/服务器分割,因此您希望在两个环境之间共享相同的语言和代码,以尽量减少复杂性和上下文切换。
-## 光明的未来 - Fatigue Fatigue
+## 光明的未来 - Fatigue Fatigue
-“If you’re going through hell, keep going.” — Winston Churchill
+“If you’re going through hell, keep going.” — Winston Churchill
-最后大部分人还是认为JavaScript正在向着一个好的方向去发展:
+最后大部分人还是认为JavaScript正在向着一个好的方向去发展:

## Reference
-[2016/04/12 永不停步(折腾死人)的JavaScript 生态](https://github.com/gaohailang/blog/issues/17)
-[JavaScript Fatigue Fatigue ](https://medium.freecodecamp.com/javascript-fatigue-fatigue-66ffb619f6ce#.urjlv2vyz)
-[the state of javascript in 2016](http://stateofjs.com/)
-[2016/04/07 展望 Javascript 2016年的趋势和生态发展](https://github.com/gaohailang/blog/issues/12)
+[2016/04/12 永不停步(折腾死人)的JavaScript 生态](https://github.com/gaohailang/blog/issues/17)
+[JavaScript Fatigue Fatigue ](https://medium.freecodecamp.com/javascript-fatigue-fatigue-66ffb619f6ce#.urjlv2vyz)
+[the state of javascript in 2016](http://stateofjs.com/)
+[2016/04/07 展望 Javascript 2016年的趋势和生态发展](https://github.com/gaohailang/blog/issues/12)
+
+
diff --git a/media/14763398431486.jpg b/source/_posts/media/14763398431486.jpg
similarity index 100%
rename from media/14763398431486.jpg
rename to source/_posts/media/14763398431486.jpg
diff --git a/media/14763398849592.jpg b/source/_posts/media/14763398849592.jpg
similarity index 100%
rename from media/14763398849592.jpg
rename to source/_posts/media/14763398849592.jpg
diff --git a/media/14763399939236.jpg b/source/_posts/media/14763399939236.jpg
similarity index 100%
rename from media/14763399939236.jpg
rename to source/_posts/media/14763399939236.jpg
diff --git a/media/14763400225085.jpg b/source/_posts/media/14763400225085.jpg
similarity index 100%
rename from media/14763400225085.jpg
rename to source/_posts/media/14763400225085.jpg
diff --git a/media/14763414232647.png b/source/_posts/media/14763414232647.png
similarity index 100%
rename from media/14763414232647.png
rename to source/_posts/media/14763414232647.png
diff --git a/media/14763418507524.jpg b/source/_posts/media/14763418507524.jpg
similarity index 100%
rename from media/14763418507524.jpg
rename to source/_posts/media/14763418507524.jpg
diff --git a/media/14763420997963.jpg b/source/_posts/media/14763420997963.jpg
similarity index 100%
rename from media/14763420997963.jpg
rename to source/_posts/media/14763420997963.jpg
diff --git a/media/14763496126321.png b/source/_posts/media/14763496126321.png
similarity index 100%
rename from media/14763496126321.png
rename to source/_posts/media/14763496126321.png
diff --git a/media/14763504576948.png b/source/_posts/media/14763504576948.png
similarity index 100%
rename from media/14763504576948.png
rename to source/_posts/media/14763504576948.png
diff --git a/media/14764133008212.jpg b/source/_posts/media/14764133008212.jpg
similarity index 100%
rename from media/14764133008212.jpg
rename to source/_posts/media/14764133008212.jpg
diff --git a/media/14764133948101.jpg b/source/_posts/media/14764133948101.jpg
similarity index 100%
rename from media/14764133948101.jpg
rename to source/_posts/media/14764133948101.jpg
diff --git a/media/14764134093311.jpg b/source/_posts/media/14764134093311.jpg
similarity index 100%
rename from media/14764134093311.jpg
rename to source/_posts/media/14764134093311.jpg
diff --git a/media/14764134859113.jpg b/source/_posts/media/14764134859113.jpg
similarity index 100%
rename from media/14764134859113.jpg
rename to source/_posts/media/14764134859113.jpg
diff --git a/media/14764146287786.jpg b/source/_posts/media/14764146287786.jpg
similarity index 100%
rename from media/14764146287786.jpg
rename to source/_posts/media/14764146287786.jpg
diff --git a/media/14764147837370.jpg b/source/_posts/media/14764147837370.jpg
similarity index 100%
rename from media/14764147837370.jpg
rename to source/_posts/media/14764147837370.jpg
diff --git a/media/14767571819005.png b/source/_posts/media/14767571819005.png
similarity index 100%
rename from media/14767571819005.png
rename to source/_posts/media/14767571819005.png
diff --git a/media/14767571923640.png b/source/_posts/media/14767571923640.png
similarity index 100%
rename from media/14767571923640.png
rename to source/_posts/media/14767571923640.png
diff --git a/media/14767572000291.png b/source/_posts/media/14767572000291.png
similarity index 100%
rename from media/14767572000291.png
rename to source/_posts/media/14767572000291.png
diff --git a/media/14767572092927.png b/source/_posts/media/14767572092927.png
similarity index 100%
rename from media/14767572092927.png
rename to source/_posts/media/14767572092927.png
diff --git a/media/14767572153009.png b/source/_posts/media/14767572153009.png
similarity index 100%
rename from media/14767572153009.png
rename to source/_posts/media/14767572153009.png
diff --git a/media/14767572217093.png b/source/_posts/media/14767572217093.png
similarity index 100%
rename from media/14767572217093.png
rename to source/_posts/media/14767572217093.png
diff --git a/media/14767572283416.png b/source/_posts/media/14767572283416.png
similarity index 100%
rename from media/14767572283416.png
rename to source/_posts/media/14767572283416.png
diff --git a/media/14767572437168.png b/source/_posts/media/14767572437168.png
similarity index 100%
rename from media/14767572437168.png
rename to source/_posts/media/14767572437168.png
diff --git a/media/14767572934002.jpg b/source/_posts/media/14767572934002.jpg
similarity index 100%
rename from media/14767572934002.jpg
rename to source/_posts/media/14767572934002.jpg
diff --git a/node-api-gateway.md b/source/_posts/node-api-gateway.md
similarity index 100%
rename from node-api-gateway.md
rename to source/_posts/node-api-gateway.md
diff --git a/node-gateway-choices.md b/source/_posts/node-gateway-choices.md
similarity index 100%
rename from node-gateway-choices.md
rename to source/_posts/node-gateway-choices.md
diff --git a/node-mircoservices.md b/source/_posts/node-mircoservices.md
similarity index 100%
rename from node-mircoservices.md
rename to source/_posts/node-mircoservices.md
diff --git a/node-npm-scripts.md b/source/_posts/node-npm-scripts.md
similarity index 100%
rename from node-npm-scripts.md
rename to source/_posts/node-npm-scripts.md
diff --git "a/node-\346\226\260\351\241\271\347\233\256\346\263\250\346\204\217\347\202\271-2016\347\257\207.md" "b/source/_posts/node-\346\226\260\351\241\271\347\233\256\346\263\250\346\204\217\347\202\271-2016\347\257\207.md"
similarity index 100%
rename from "node-\346\226\260\351\241\271\347\233\256\346\263\250\346\204\217\347\202\271-2016\347\257\207.md"
rename to "source/_posts/node-\346\226\260\351\241\271\347\233\256\346\263\250\346\204\217\347\202\271-2016\347\257\207.md"
diff --git a/react-native-year-review.md b/source/_posts/react-native-year-review.md
similarity index 97%
rename from react-native-year-review.md
rename to source/_posts/react-native-year-review.md
index 7d0f082..81ae6af 100644
--- a/react-native-year-review.md
+++ b/source/_posts/react-native-year-review.md
@@ -1,7 +1,3 @@
----
-title: React Native 的一周年回顾
----
-
> 翻译自Facebook工程团队的官方博客,[React Native: A year in review](https://code.facebook.com/posts/597378980427792/react-native-a-year-in-review),本文分别从 RN 起源,项目过去一年在FB内部的发展,在业界的广泛使用和生态圈的快速建立,在 Github 上的开源协作,核心团队对 RN 的未来展望等进行一一讲述,来吧看看 RN 的传奇之路
@@ -23,7 +19,7 @@ title: React Native 的一周年回顾
在对此任务非常有信心实现后,我们决定尽早让 RN 能够跨平台,在伦敦组建了 RN 的 Android 团队。这团队在14年下半年开始写了最早的 Android 核心运行时和第一个组件。此后我们决定要让 Android 能顺利运行之前的 iOS 广告管理大师的JS代码。到2014年底,我们有个最基础版本,尽管它还缺了不少的界面,在低端Android手机上性能也不行,不过你还是可以看到如下图展示的一列广告和可以用它来创建新的广告。我们当时非常自信能把这项工作推进下去,获得更棒的性能,更强大的功能。
-
+
`Facebook的广告管理大师运行在Android低端机上。2015/01`
@@ -35,7 +31,7 @@ FB 广告管理大师这款应用在2015年2月在iOS在苹果 AppStore 发布
类似于 iOS 部分的发布,我们希望 Android 部分也能尽早发布,从而尽快获得反馈。因此,我们从核心运行时开始,加上一小部分的视图和模块(如文本,图片,ScrollView,Network,AsyncStorage等)的支持。在9月14号,我们把 Android 核心运行时和初始部分的 Android 模块发布到 Github 和 npm 上。在 React Native 的0.11版本上,我们第一次发布了 Android 部分的支持。从开源 Android 部分后,我们也陆续加入这些模块的支持:Alert,APPState,CameraRoll,Clipboard,Date和time pickers,Geolocation,Intent,Modal,NetInfo,Pull to refresh view,Picker,Slider,View pager,WebView等(它们和 iOS 部分的 API 非常类似)
-
+
`从最早 React Native 设想,到我们开源 RN的 Android 部分的时间轴`
@@ -47,32 +43,32 @@ React Native 的流行程度和它的开发者社区都在快速发展,远超
超过650个人给 RN 的代码仓库贡献过代码。在代码仓库的5800个提交,有30%左右都是被不在 FB 工作的贡献者提交的。在2016年2月,第一次超过50%的代码提交来源于这些外部贡献者。随着这么多来着于社区对RN的贡献,我们发现每个月都将近266新的 PR(每天多大10个PR)被要求合入。这些 PR 很多都是高质量的,提供着后续被广泛使用的功能特性。
-
+
`这是RN的Github代码仓库每个月被提交PR数量趋势图`
在一开始,这些暴涨的 PR 数量导致我们很难快速高效的审核合入。每天为这些 PR 找到合适的审核人员都消耗着很多人力成本。为了解决这个问题,我们通过开发两个 Github 机器人来自动化分发 PR 到合适的reviewer头上~
第一个机器人是提醒机器人,为每个PR找出合适的 Reviewer 审核人。
-
+
这个提醒机器人现在被开源了,他的确帮助了我们在一天中更高效的审核这些PR。有趣的是:在上个月(2月份)超过50%的提交来自于社区,提醒机器人总能在社区中找到合适的reviewer来审核(工作原理大概是通过在 Github issues 中定位到提出的人,和 PR 要解决的 issues 关联起来)
很难Merge这些PR是我们遇到的第二个难题。FB 工程师们用的同一个代码仓库(就想你在 Github React Native Repo 上看到的一样),我没有对这个做任何 fork 没有其他的内部 commit 之类的。因此,每次要合入 PR 的代码到我们内部的大型叫做 fbsource 的Mercurial 仓库后我们都会自动执行测试脚本来回归我们类似于 Facebook Ads Manager(广告管理大师?)等应用功能。
-
+
`简化版的单例Mercurial代码仓库fbsource。这个仓库包含所有的移动端和服务端端代码`
之前合入一个 PR 涉及多个手动操作。我们现在把这些简化为仅仅需要在 Github 回复一句评论。
-
+
`@facebook-github-bot-shipit: 如果所有的内部测试运行通过,PR的那些代码会被自动合入到 fbsource 主分支和 Github 主分支中`
感谢这些工具,我们这个项目才能和这么多社区持续贡献的 PR 保持上同一进度。在过去一年,我们总共关闭了2351个 PR!!
-
+
`Github的RN项目上每个月被关闭的PR数量趋势图`
@@ -83,7 +79,7 @@ React Native 的流行程度和它的开发者社区都在快速发展,远超
我们实施了另外一个机器人来使得社区中的任何人都能来帮助管理 Github issues。它可以让任何人(无需push权限)都可以关闭重复的 issues,回答后关闭 issues,给 issues 添加标签等等。你可以参考这篇指南参与进来 [guide to managing Github issues](https://github.com/facebook/react-native/blob/master/docs/IssueGuidelines.md)
-
+
React Native 涉及的 API 面非常广泛。它暴露了构建 iOS 和 Android 应用的绝大部分 JavaScript 调用,同时提供了跨平台的抽象。很难有一个对这些所有APIs都很熟悉的人,即使 FB 中有很多产品团队在使用 RN,我们还是不能保证覆盖到所有的边缘情况。RN 适合我们,但是我们不能保证它绝对完美。这就是需要社区中了解这些代码仓库的人参与进来,这对于我们和更宽泛社区的其他人(那些把自己的应用押宝在 RN 上,在 RN 上构建自己的服务,为 RN 开发第三方类库工具的)都非常重要。
@@ -94,7 +90,7 @@ React Native 开源贡献者组织是由社区中那些提供非常高质量的
下面是我们 RN 开源贡献者组织的大合照,依次是这些人:*省略*
-
+
`开源贡献者组织的不少人,在2016/02/22的旧金山的React.js Conf开发者大会的合照`
@@ -103,7 +99,7 @@ React Native 开源贡献者组织是由社区中那些提供非常高质量的
每两周RN就会有新的发布。意味着在主分支中发布后,你就能在你的应用中立即使用上这些功能特性。仅仅在2016年3月,RN 的代码在 NPM 上的下载次数就达到7w次。在 Github 有着近3w的加星,RN 是 Github 上最受关注的21项目之一。
-
+
`在过去一年,RN在Github的代码仓库的加星数从0到30000之多`
@@ -112,7 +108,7 @@ React Native 开源贡献者组织是由社区中那些提供非常高质量的
自从 iOS 版的 RN 发布后的这一年,有非常多用RN开发的应用被上架到苹果的AppStore,高质量的RN写的的Android应用也慢慢出现了。在[展示页面](https://facebook.github.io/react-native/showcase.html)罗列了107个用 RN 构建的优秀应用,通过提交 PR 把你的 RN 应用也加入其中。
-
+
我们尝试使用这些,发现了不少被精细打磨的RN应用。所以确保你也下载一些来试一试,看看 React Native 能用来干什么。
@@ -137,7 +133,7 @@ React Native 开源贡献者组织是由社区中那些提供非常高质量的
Facebook 中越来越多的产品团队用 RN 来开发新功能和应用。它即被应用在其他业务的单例App中也被集成在大Facebook的iOS/Android App中。
-
+
`Facebook群组应用就是个混合应用,消息流就是用RN实现的`
@@ -169,3 +165,4 @@ Facebook 中越来越多的产品团队用 RN 来开发新功能和应用。它
感谢每一位用 React Native 技术来开发他们优秀应用的开发者,感谢那些在 RN 之上构建工具和服务,开发开源第三方模块,帮助回答问题,提交PR,帮忙组织会议分享,给RN写技术博客等社区中的每一位成员。 继续保持吧!
让我们期待来年的 RN 的大发展吧~
+
diff --git a/state-javascript-2016.md b/source/_posts/state-javascript-2016.md
similarity index 98%
rename from state-javascript-2016.md
rename to source/_posts/state-javascript-2016.md
index bb1b663..407a8de 100644
--- a/state-javascript-2016.md
+++ b/source/_posts/state-javascript-2016.md
@@ -1,15 +1,10 @@
----
-title: 展望 Javascript 2016年的趋势和生态发展
-categories: ['presentation']
----
-
> 本文翻译自[State of the Art JavaScript in 2016](https://medium.com/javascript-and-opinions/state-of-the-art-javascript-in-2016-ab67fc68eb0b),加上了部分译者的观点。就像是隧道终点前的光明,JS生态的最佳实践不再剧烈变更着,现在关于需要学什么越来越明确了。本文就关于核心类库,状态管理,语言特性,构建工具,CSS预处理,API & HTTP 类库,测试工具,依赖管理等等前端开发的方方面面进行了展望和梳理,为你挑出这些最佳实践和面向未来的设计~
## 展望 Javascript 2016年的趋势和生态发展
那么,你要开始一个崭新的Javascript前端项目了,或者被之前老项目折腾半死,你也许并没有和改变进化步伐极快的社区生态保持技术实践的同步,或者你开始了,但是有大量的可选项不知道怎么选。React,Flux,Angular,Aurelia,Mocha,Jasmine,Jasmine,Babel,TypeScript,Flow。哦我的天呐这么多~ 为了让事件变得更简单,我们很多人正陷入一个陷阱:被我喜欢的XKCD漫画描述的很好:
-
+
是的,好消息是现在JS生态开始慢下来了,好项目开始冒出。最佳实践爱你慢慢变得更清晰了。工程师开始在现有项目上构建自己的工程还是重新创造轮子。
@@ -17,7 +12,7 @@ categories: ['presentation']
### 核心类库:React
-
+
目前胜者很显然就是React(译者:你确定?!)
@@ -39,7 +34,7 @@ categories: ['presentation']
### 应用生命周期:Redux
-
+
PS: 以上不是它最终的logo
@@ -60,7 +55,7 @@ Redux的生态系统和Redux本身一样优秀。从神乎其神的开发者工
### 语言:ES6配合Babel,先不加类型
-
+
不用在用CoffeeScript了(译者哭了出来,公司13年大规模的使用它,至今后端JS项目80%都是它的身影)。因为它的大部分好的特性在ES6都有了(它是JavaScript的标准语言规范),而且CoffeeScript的工具很弱(如CoffeeLint),它的社区也在快速的衰落。
@@ -79,7 +74,7 @@ Flow比起来似乎更强大,能捕获到更大范围的bug异常,但是比
### 格式和风格:ESlint配合Airbnb指南
-
+
关于ESLint异议也不大。使用它的React插件和良好的es6的支持,几乎非常完美完成lint的工作。JSLint是过时了,ESLint这个软件可以单独完成原本需要 JSHint 和 JSCS 联合起来做的事。
@@ -90,7 +85,7 @@ Flow比起来似乎更强大,能捕获到更大范围的bug异常,但是比
### 依赖管理:仅考虑NPM,CommonJS 和ES6模块
-
+
这一点很明确 - 就用NPM。所有东西,忘记之前的bower。类似与 Browserify 和 Webpack 的构建工具把npm的强大功能引到了web上。版本处理变得很简单,你也获得了node生态的大部分模块提供的功能。不过CSS的相关处理还是不够完美。
@@ -101,7 +96,7 @@ Babel可以把 ES6 模块语法编译到CommonJS。意味着你可面向未来
### 构建工具:Webpack
-
+
不想在你的页面文件中加入非常多的外链Script引用,那你就需要一个构建工具来打包你的依赖。如果你也需要允许npm包在浏览器运行工作的工具,那么Webpack就是你需要的。
@@ -127,7 +122,7 @@ Webpack目前也是处理大型SPA应用项目的最好方案,利用它的代
### 测试:Mocha + Chai + Sinon(但没那么简单)
-
+
目前在 JavaScript 单元测试上,我们有众多选择,你选择任何一个都不会错太多。因为你开始做单元测试,你就走对一大步了。
@@ -248,3 +243,6 @@ JavaScript生态区发展很快,欣欣向荣,在快速前进着。但是就
### 我少了什么吗?
这就是我对目前JavaScript生态现状的看法和观点。如果你觉得我遗漏了那些类别的讨论,或者你认为我在一些选型上的决定不正确,你有更好的可以推荐。那么留言吧~
+
+
+
diff --git a/tech-the-effective-engineer.md b/source/_posts/tech-the-effective-engineer.md
similarity index 98%
rename from tech-the-effective-engineer.md
rename to source/_posts/tech-the-effective-engineer.md
index 75020e8..ada9d74 100644
--- a/tech-the-effective-engineer.md
+++ b/source/_posts/tech-the-effective-engineer.md
@@ -10,7 +10,7 @@ keywords: review,book, effective, engineer
| 书籍截图 | 作者博客 |
| :------------ |:---------------:|
-|| |
+|| |
这篇文章主要是针对作者在谷歌内部的 Google Talk做的分享,进行总结和整理。[传送门]( https://www.youtube.com/watch?v=BnIz7H5ruy0)
diff --git a/techie-stories.md b/source/_posts/techie-stories.md
similarity index 98%
rename from techie-stories.md
rename to source/_posts/techie-stories.md
index 7e5e8d6..7f3016e 100644
--- a/techie-stories.md
+++ b/source/_posts/techie-stories.md
@@ -18,7 +18,7 @@ keywords: Reading, Sillicon-Valley
这个项目设计的初衷是让你主导怎么使用它。你可以使用过滤器来确保你来排序和探索你感兴趣的内容。也许你想借此机会看看和你工作生活背景迥异的人是怎么进去这个圈子的,或者你也可以看看和你背景相似的人的那些故事。他们和你来自于同一个地方或前行业,或者和你经历过一样的困难~
-
+
我希望感兴趣的人利用好这些内容基于它们做自己想做的东西。他们可以深入追寻,逐个击破和构建新的故事。我希望它让部分人感到不愉快,愤怒和获有灵感。我希望它能激发出更多新的,难以应对的问题,不断想要回答的尝试。
diff --git a/source/_posts/test-pictures.md b/source/_posts/test-pictures.md
new file mode 100644
index 0000000..f543e0d
--- /dev/null
+++ b/source/_posts/test-pictures.md
@@ -0,0 +1,26 @@
+---
+title: 【Node】16年,新 Node 项目注意点
+type: "picture"
+date: 2011-05-29 07:56:29
+---
+
+
+{% centerquote %}blah blah blah{% endcenterquote %}
+
+
+{% cq %} blah blah blah {% endcq %}
+
+
+
+{% fullimage /images/14526815265643.jpg, alt, title %}
+
+
+{% fi /images/14526815265643.jpg, alt, title %}
+
+{% gp 4-2 %}
+
+
+
+
+
+{% endgp %}
\ No newline at end of file
diff --git a/source/about/index.md b/source/about/index.md
new file mode 100644
index 0000000..d67558a
--- /dev/null
+++ b/source/about/index.md
@@ -0,0 +1,23 @@
+---
+title: 关于我
+---
+
+本人男,九零后的小尾巴。先后在北京百度实习和北京豌豆荚,深圳豌豆荚,深圳广发证券工作。喜欢广泛涉猎的阅读和自由自在骑车骑摩托自驾游的旅行,向往 digital nomad(数字游民)的生活方式。
+
+## 摄影 & 旅行
+
+## 社交
+- 微信: ghlndsl
+- 微博
+- 豆瓣
+- Twitter
+
+## More
+- 网易云音乐
+- instagram
+
+## 项目
+- Github
+
+## 联系我
+- Email:
\ No newline at end of file
diff --git a/archsummit16/2016-12-06.md b/source/archsummit16/2016-12-06.md
similarity index 92%
rename from archsummit16/2016-12-06.md
rename to source/archsummit16/2016-12-06.md
index e3b4c70..c6355fd 100644
--- a/archsummit16/2016-12-06.md
+++ b/source/archsummit16/2016-12-06.md
@@ -1,8 +1,4 @@
----
-title: ArchSummit 2016 Beijing 会议纪要 by Siva
-date: 2017-05-01
-categories: ['Conference']
----
+
两天的会议中,先后听了十几篇分享,参加的议题主要集中在“高可用架构”,“云服务架构探索”,“架构演进从0到100”等专场,也参加了诸如“证券极速交易系统关键技术分析以及架构实践”,“QQ Hybrid的演进”,“Twitter从支撑千万到万亿级索引的搜索引擎架构演化” 等其他专场的感兴趣话题。同时,最后一晚参加了“架构师之路夜谈”,收获颇丰。这次和以往不同的事,除了务实的业务细节和技术干货外,也包含了设计妥协和一步步演进推进的过程(算是实施的艺术)这的确是架构师的日常关键工作,而不仅仅是技术点的最优。
@@ -41,31 +37,31 @@ PPT合集已出炉!现提供百度网盘和Github两种方式:
《圆桌活动问答》 崔宝秋
-## 1 Lessons in Internet scale stream processing @Linkedln
-### agenda
+## 1 Lessons in Internet scale stream processing @Linkedln
+### agenda
架构模式,允许我们使用Apache Kafka,Apache Samza,Brooklin,Databus和其他一些数据系统进行大规模流处理。
-- intro
-- typical architecture for data processing
-- data ingestion
-- stream processing
-- future
+- intro
+- typical architecture for data processing
+- data ingestion
+- stream processing
+- future

-### data ingestion
+### data ingestion
数据采集,其中分析了现有采集中间件的优劣(Kafka,EventHub,Kinesis, Pub-Sub 等),给出了 cost based comparison(对于1TB a day、100 Billion messages/day 和 5000 partitions 截点使用云服务提供的还是自己搭建),最后给出了自家的数据采集和消费量(1.2 Trillion Messages, 350TB, 峰值 16 million messages/second,data consumed/day: 1.3PB)
-lessons from running kafka @ scale
+lessons from running kafka @ scale
- machines/disk will die almost day (need auto-healing - Kafka Cruise Control)
- take good care of zookeeper (5 node zookeepers clusters on SSD)
-- monitoring will always reveal problems (Burrow Kafka Monitor)
-- dealing with multi-tenancy (quotas/rate limiting is critical to SAL
+- monitoring will always reveal problems (Burrow Kafka Monitor)
+- dealing with multi-tenancy (quotas/rate limiting is critical to SAL
-#### steam processing
+#### steam processing
流式计算领域:

@@ -88,15 +84,15 @@ SAMZA 支持 Async I/O, incremental checkpoints

-stability,backpressure
-support for variety of souces,通过 Brokolnn 引入
+stability,backpressure
+support for variety of souces,通过 Brokolnn 引入
reprocessing,为什么重新消费(因为业务逻辑更改和软件bug
-case study: title standardizer
-更新你的title,到 member databases(espresso) - profile updates(brooklin) - > Samaza(title-standardizer) -< machine learning model - kafka
-offline processing
+case study: title standardizer
+更新你的title,到 member databases(espresso) - profile updates(brooklin) - > Samaza(title-standardizer) -< machine learning model - kafka
+offline processing
-Batch processing in SAMZA
+Batch processing in SAMZA

@@ -123,7 +119,7 @@ Batch processing in SAMZA
传统思路:以点到面覆盖所有系统(系统的木桶原理-短板,分层评估-如应用层,服务层,存储层。每层都有各自的特点)
-搭建压测平台(使用线上流量压测线上应用,通过压测模型去模拟复制流量,同时要监控和采集)
+搭建压测平台(使用线上流量压测线上应用,通过压测模型去模拟复制流量,同时要监控和采集)

PS:之前阿里有自己的压测团队,然后这套平台开发完后他们就被解散了
@@ -132,8 +128,8 @@ PS:之前阿里有自己的压测团队,然后这套平台开发完后他们
PS:阿里在整个技术架构上保持了一定的统一性,使得容量规划(不只是容量规划等技术)可以被很快进行平台化,各个业务都可以使用(受益于Java 体系的
-通过资源隔离拉平各个系统所需的最小资源。
-
+通过资源隔离拉平各个系统所需的最小资源。
+

@@ -239,25 +235,25 @@ PS:阿里在整个技术架构上保持了一定的统一性,使得容量规
1.介绍量化交易特点、策略、交易需求以及市场状态;
-
+
#### 特点
-
+
量化交易是指借助现代统计学和数学的方法,利用计算机技术来进行 交易的证券投资方式。从庞大的历史数据中海选能带来超额收益的多种“大概率” 事件以制定策略,用数量模型验证及固化这些规律和策略,然后严格 执行已固化的策略来指导投资。
-
+
(概率 - 把小概率频繁交易放大概念(目前最赚钱的),定量套利,策略固化-避免情绪化除非是bugs,交易期间不要改动但是后面可以review自己策略
-
+
#### 方式
-
+
- 择股:以股票基本面因子为主,选取投资股票池,替代公墓基金
-
+
- 择时:选取合适的时间买入或卖出,以市场状态因子、技术分析因子为主,市场博弈行为,具备冲击性极高收益的能力
-
+
- 市场中性:对冲,现货股指市场,未来期权将是市场中性的利器(
- 套利交易:在市场的非理性波 动中寻找存在的价差,并利用价差获取收益、甚至是无风 险收益。比拼技术系统能力,而数学模型固定(ETF套利、期权套利、期现 套利、分级基金套利、可转债套利 - 分级B溢价机会等
-
+
PS:国内绝大部分的量化交易都是赚钱的,因为韭菜太多了。。。海外不是,因为各个机构间的博弈
-
+
量化交易市场基础环境日益改善
@@ -266,7 +262,7 @@ PS:阿里在整个技术架构上保持了一定的统一性,使得容量规
- 国内空间巨大(个位数占比,相比于现货及衍生品市场交易以量化交易为主(交易占比超过70%)
- 2.介绍证券市场整体交易架构和拓扑,以及市场各个参与者的交易系统 ;
+ 2.介绍证券市场整体交易架构和拓扑,以及市场各个参与者的交易系统 ;

投资者交易系统
@@ -281,7 +277,7 @@ PS:阿里在整个技术架构上保持了一定的统一性,使得容量规
券商柜台
- 集中柜台(对接交易所,中登,存管银行,投保等。提交接口给网上交易系统等 - 恒生或金证的,最核心的系统。对券商来说不太好更换这块
-- 极速柜台
+- 极速柜台
交易所交易系统
@@ -294,40 +290,40 @@ PS:阿里在整个技术架构上保持了一定的统一性,使得容量规
Cluster模式,同一个Set双主机构成集群
同城主备实时同步交易模式
- 3.量化交易对证券公司交易系统技术需求的理解和分析;
-
+ 3.量化交易对证券公司交易系统技术需求的理解和分析;
+


- 4.极速交易系统关键技术和架构设计;
+ 4.极速交易系统关键技术和架构设计;

系统指标

-1
-随着今日头条业务的高速发展,对基础设施的要求越来越高,已有的研发模式和效率越来越不能满足业务快速发展的需要,TCE私有云PaaS平台应运而生。平台基于Kubernetes构建,结合今日头条的研发模式,融合微服务的理念,构建一套高效的研发、运维计算平台。本演讲分享今日头条在私有云PaaS的架构设计,技术选型等方面的的思路和经验。
-演讲提纲:
- 1.公有云vs私有云,符合自己需要的云;
- 2.头条私有云的构架设计;
- 3.遇到的问题及未来的规划;
-听众收益:
- 1.私有云平台的设计和实现思路;
- 2.私有云构建相关技术进展分析。
-
-2
-Apache Helix是一个通用的分布式集群资源管理和调度框架,它能被用作构建各种高可用和易伸缩的分布式数据存储和服务系统。 夏磊博士将与大家分享Helix的设计和工作原理,并实例分析Helix如何帮助构建LinkedIn的各类大数据系统, 如LinkedIn的分布式NoSQL数据库Espresso,以及LinkedIn开发的高性能的数据抓取系统Databus等。
-演讲提纲:
- 1. Helix的设计思想和工作原理;
- 2. 快速构建高可用的分布式大数据存储和支持系统;
- 3. 构建用户友好和易伸缩的大数据服务云。
-听众受益:
- 1.分布式大数据系统设计;
- 2.弹性大数据云构建案例分析。
+1
+随着今日头条业务的高速发展,对基础设施的要求越来越高,已有的研发模式和效率越来越不能满足业务快速发展的需要,TCE私有云PaaS平台应运而生。平台基于Kubernetes构建,结合今日头条的研发模式,融合微服务的理念,构建一套高效的研发、运维计算平台。本演讲分享今日头条在私有云PaaS的架构设计,技术选型等方面的的思路和经验。
+演讲提纲:
+ 1.公有云vs私有云,符合自己需要的云;
+ 2.头条私有云的构架设计;
+ 3.遇到的问题及未来的规划;
+听众收益:
+ 1.私有云平台的设计和实现思路;
+ 2.私有云构建相关技术进展分析。
+
+2
+Apache Helix是一个通用的分布式集群资源管理和调度框架,它能被用作构建各种高可用和易伸缩的分布式数据存储和服务系统。 夏磊博士将与大家分享Helix的设计和工作原理,并实例分析Helix如何帮助构建LinkedIn的各类大数据系统, 如LinkedIn的分布式NoSQL数据库Espresso,以及LinkedIn开发的高性能的数据抓取系统Databus等。
+演讲提纲:
+ 1. Helix的设计思想和工作原理;
+ 2. 快速构建高可用的分布式大数据存储和支持系统;
+ 3. 构建用户友好和易伸缩的大数据服务云。
+听众受益:
+ 1.分布式大数据系统设计;
+ 2.弹性大数据云构建案例分析。
## 3 QQHybrid的演进
@@ -409,7 +405,7 @@ Twitter的搜索引擎起初只能检索最近7天的推文,只能满足基本
一些挑战(scaling - 推文会越来越多!架构要调整-之前realtime是把7天内的所有推文放到RAM中去搜索)
设计目标:
-- 模块化(realtime 和 complete index 尽量共享代码 - cleaner system
+- 模块化(realtime 和 complete index 尽量共享代码 - cleaner system
- 可伸缩(应对越来越多的推文
- high parallel ingestion(快速摄取消费从而建索引时间可控)
- simple interface(虽然背后是cluster但是为API消费方提供简单的single point)
@@ -463,8 +459,8 @@ https://blog.twitter.com/2016/superroot-launching-a-high-sla-production-service-
OmniSearch
-5
-阿里云数据库从最初的只支持MySQL,到现在支持关系数据库、NoSQL、HTAP、EMR产品体系,在管控系统和数据链路上做了好几次重大架构迭代,云产品很长的生命周期里面会遇到新老架构共存,如何做到架构连续和系统无缝迁移是个很大的挑战, 本次报告为你分享实践。
+5
+阿里云数据库从最初的只支持MySQL,到现在支持关系数据库、NoSQL、HTAP、EMR产品体系,在管控系统和数据链路上做了好几次重大架构迭代,云产品很长的生命周期里面会遇到新老架构共存,如何做到架构连续和系统无缝迁移是个很大的挑战, 本次报告为你分享实践。
## 6 Go:微服务架构的基⽯石
@@ -472,7 +468,7 @@ OmniSearch
本人挺喜欢这个分享的,孟军在Go社区第一人哈,演讲也是很有激情(《Go Web编程》作者,开源框架 beego 作者)
### 第一部分 微服务架构的核⼼ (小,独,轻,松)
-### 第二部分 基于Go的微服务架构核心系统
+### 第二部分 基于Go的微服务架构核心系统

@@ -491,7 +487,7 @@ APM:appdash,Cloudinsight,opentracing
CI/CD:Drone
熔断器:gateway,Hystrix-go
-### 第三部分 Go语⾔言概述
+### 第三部分 Go语⾔言概述
Go是Google开发,09年发布,12年正式版本的作为系统性语言

@@ -502,7 +498,7 @@ Go是Google开发,09年发布,12年正式版本的作为系统性语言
Russ Cox,Ian Lance Taylor,Brad Fitzpatrick
-### 第四部分 为什什么选择Go
+### 第四部分 为什什么选择Go
“Go is not meant to innovate programming theory. It’s meant to innovate programming practice.”
@@ -529,15 +525,17 @@ Russ Cox,Ian Lance Taylor,Brad Fitzpatrick
容器类系统
-7
+7
+
+随着互联网网民数的爆发式增加以及人们对随时随地接入互联网诉求的加强,互联网产品需要面对的并发请求量越来越大,云计算的诞生和普及为海量并发请求的应用提供了弹性的硬件支撑。本案例分享基于微服务的应用架构设计,内容涉及如何构建一个微服务应用,服务注册与发现,微服务测试和典型的微服务架构设计模式,以及微服务架构在七牛的实践案例。
+演讲提纲:
+ 1. 构建一个微服务应用;
+ 2. 服务注册与发现;
+ 3. 微服务测试;
+ 4. 典型微服务架构设计模式;
+ 5. 七牛微服务架构实践。
+听众受益:
+ 1. 学习如何构建、测试和部署一个高可用应用;
+ 2. 了解常见微服务架构设计模式。
+
-随着互联网网民数的爆发式增加以及人们对随时随地接入互联网诉求的加强,互联网产品需要面对的并发请求量越来越大,云计算的诞生和普及为海量并发请求的应用提供了弹性的硬件支撑。本案例分享基于微服务的应用架构设计,内容涉及如何构建一个微服务应用,服务注册与发现,微服务测试和典型的微服务架构设计模式,以及微服务架构在七牛的实践案例。
-演讲提纲:
- 1. 构建一个微服务应用;
- 2. 服务注册与发现;
- 3. 微服务测试;
- 4. 典型微服务架构设计模式;
- 5. 七牛微服务架构实践。
-听众受益:
- 1. 学习如何构建、测试和部署一个高可用应用;
- 2. 了解常见微服务架构设计模式。
diff --git a/archsummit16/media/14809879414600.jpg b/source/archsummit16/media/14809879414600.jpg
similarity index 100%
rename from archsummit16/media/14809879414600.jpg
rename to source/archsummit16/media/14809879414600.jpg
diff --git a/archsummit16/media/14809887979923.jpg b/source/archsummit16/media/14809887979923.jpg
similarity index 100%
rename from archsummit16/media/14809887979923.jpg
rename to source/archsummit16/media/14809887979923.jpg
diff --git a/archsummit16/media/14809906138736.jpg b/source/archsummit16/media/14809906138736.jpg
similarity index 100%
rename from archsummit16/media/14809906138736.jpg
rename to source/archsummit16/media/14809906138736.jpg
diff --git a/archsummit16/media/14809906638512.jpg b/source/archsummit16/media/14809906638512.jpg
similarity index 100%
rename from archsummit16/media/14809906638512.jpg
rename to source/archsummit16/media/14809906638512.jpg
diff --git a/archsummit16/media/14809907878724.jpg b/source/archsummit16/media/14809907878724.jpg
similarity index 100%
rename from archsummit16/media/14809907878724.jpg
rename to source/archsummit16/media/14809907878724.jpg
diff --git a/archsummit16/media/14809909140354.jpg b/source/archsummit16/media/14809909140354.jpg
similarity index 100%
rename from archsummit16/media/14809909140354.jpg
rename to source/archsummit16/media/14809909140354.jpg
diff --git a/archsummit16/media/14809909822957.jpg b/source/archsummit16/media/14809909822957.jpg
similarity index 100%
rename from archsummit16/media/14809909822957.jpg
rename to source/archsummit16/media/14809909822957.jpg
diff --git a/archsummit16/media/14809912395788.jpg b/source/archsummit16/media/14809912395788.jpg
similarity index 100%
rename from archsummit16/media/14809912395788.jpg
rename to source/archsummit16/media/14809912395788.jpg
diff --git a/archsummit16/media/14809912934267.jpg b/source/archsummit16/media/14809912934267.jpg
similarity index 100%
rename from archsummit16/media/14809912934267.jpg
rename to source/archsummit16/media/14809912934267.jpg
diff --git a/archsummit16/media/14809915420062.jpg b/source/archsummit16/media/14809915420062.jpg
similarity index 100%
rename from archsummit16/media/14809915420062.jpg
rename to source/archsummit16/media/14809915420062.jpg
diff --git a/archsummit16/media/14809950527237.jpg b/source/archsummit16/media/14809950527237.jpg
similarity index 100%
rename from archsummit16/media/14809950527237.jpg
rename to source/archsummit16/media/14809950527237.jpg
diff --git a/archsummit16/media/14809951549797.jpg b/source/archsummit16/media/14809951549797.jpg
similarity index 100%
rename from archsummit16/media/14809951549797.jpg
rename to source/archsummit16/media/14809951549797.jpg
diff --git a/archsummit16/media/14809989581377.jpg b/source/archsummit16/media/14809989581377.jpg
similarity index 100%
rename from archsummit16/media/14809989581377.jpg
rename to source/archsummit16/media/14809989581377.jpg
diff --git a/archsummit16/media/14810008016277.jpg b/source/archsummit16/media/14810008016277.jpg
similarity index 100%
rename from archsummit16/media/14810008016277.jpg
rename to source/archsummit16/media/14810008016277.jpg
diff --git a/archsummit16/media/14810008238044.jpg b/source/archsummit16/media/14810008238044.jpg
similarity index 100%
rename from archsummit16/media/14810008238044.jpg
rename to source/archsummit16/media/14810008238044.jpg
diff --git a/archsummit16/media/14810008451516.jpg b/source/archsummit16/media/14810008451516.jpg
similarity index 100%
rename from archsummit16/media/14810008451516.jpg
rename to source/archsummit16/media/14810008451516.jpg
diff --git a/archsummit16/media/14810008689328.jpg b/source/archsummit16/media/14810008689328.jpg
similarity index 100%
rename from archsummit16/media/14810008689328.jpg
rename to source/archsummit16/media/14810008689328.jpg
diff --git a/archsummit16/media/14810030335775.jpg b/source/archsummit16/media/14810030335775.jpg
similarity index 100%
rename from archsummit16/media/14810030335775.jpg
rename to source/archsummit16/media/14810030335775.jpg
diff --git a/archsummit16/media/14810031473267.jpg b/source/archsummit16/media/14810031473267.jpg
similarity index 100%
rename from archsummit16/media/14810031473267.jpg
rename to source/archsummit16/media/14810031473267.jpg
diff --git a/archsummit16/media/14810031836468.jpg b/source/archsummit16/media/14810031836468.jpg
similarity index 100%
rename from archsummit16/media/14810031836468.jpg
rename to source/archsummit16/media/14810031836468.jpg
diff --git a/archsummit16/media/14810032093118.jpg b/source/archsummit16/media/14810032093118.jpg
similarity index 100%
rename from archsummit16/media/14810032093118.jpg
rename to source/archsummit16/media/14810032093118.jpg
diff --git a/archsummit16/media/14810034360317.jpg b/source/archsummit16/media/14810034360317.jpg
similarity index 100%
rename from archsummit16/media/14810034360317.jpg
rename to source/archsummit16/media/14810034360317.jpg
diff --git a/archsummit16/media/14810037686500.jpg b/source/archsummit16/media/14810037686500.jpg
similarity index 100%
rename from archsummit16/media/14810037686500.jpg
rename to source/archsummit16/media/14810037686500.jpg
diff --git a/archsummit16/media/14810040925029.jpg b/source/archsummit16/media/14810040925029.jpg
similarity index 100%
rename from archsummit16/media/14810040925029.jpg
rename to source/archsummit16/media/14810040925029.jpg
diff --git a/archsummit16/media/14810080240798.jpg b/source/archsummit16/media/14810080240798.jpg
similarity index 100%
rename from archsummit16/media/14810080240798.jpg
rename to source/archsummit16/media/14810080240798.jpg
diff --git a/archsummit16/media/14810080257673.jpg b/source/archsummit16/media/14810080257673.jpg
similarity index 100%
rename from archsummit16/media/14810080257673.jpg
rename to source/archsummit16/media/14810080257673.jpg
diff --git a/archsummit16/media/14810082046155.jpg b/source/archsummit16/media/14810082046155.jpg
similarity index 100%
rename from archsummit16/media/14810082046155.jpg
rename to source/archsummit16/media/14810082046155.jpg
diff --git a/archsummit16/media/14810082563512.jpg b/source/archsummit16/media/14810082563512.jpg
similarity index 100%
rename from archsummit16/media/14810082563512.jpg
rename to source/archsummit16/media/14810082563512.jpg
diff --git a/archsummit16/media/14810082595803.jpg b/source/archsummit16/media/14810082595803.jpg
similarity index 100%
rename from archsummit16/media/14810082595803.jpg
rename to source/archsummit16/media/14810082595803.jpg
diff --git a/archsummit16/media/14810103346103.jpg b/source/archsummit16/media/14810103346103.jpg
similarity index 100%
rename from archsummit16/media/14810103346103.jpg
rename to source/archsummit16/media/14810103346103.jpg
diff --git a/archsummit16/media/14810103423532.jpg b/source/archsummit16/media/14810103423532.jpg
similarity index 100%
rename from archsummit16/media/14810103423532.jpg
rename to source/archsummit16/media/14810103423532.jpg
diff --git a/archsummit16/media/14810103585146.jpg b/source/archsummit16/media/14810103585146.jpg
similarity index 100%
rename from archsummit16/media/14810103585146.jpg
rename to source/archsummit16/media/14810103585146.jpg
diff --git a/archsummit16/media/14810105664979.jpg b/source/archsummit16/media/14810105664979.jpg
similarity index 100%
rename from archsummit16/media/14810105664979.jpg
rename to source/archsummit16/media/14810105664979.jpg
diff --git a/archsummit16/media/14810116726649.jpg b/source/archsummit16/media/14810116726649.jpg
similarity index 100%
rename from archsummit16/media/14810116726649.jpg
rename to source/archsummit16/media/14810116726649.jpg
diff --git a/archsummit16/media/14810118313109.jpg b/source/archsummit16/media/14810118313109.jpg
similarity index 100%
rename from archsummit16/media/14810118313109.jpg
rename to source/archsummit16/media/14810118313109.jpg
diff --git a/archsummit16/media/14810126526359.jpg b/source/archsummit16/media/14810126526359.jpg
similarity index 100%
rename from archsummit16/media/14810126526359.jpg
rename to source/archsummit16/media/14810126526359.jpg
diff --git a/archsummit16/media/14810126846937.jpg b/source/archsummit16/media/14810126846937.jpg
similarity index 100%
rename from archsummit16/media/14810126846937.jpg
rename to source/archsummit16/media/14810126846937.jpg
diff --git a/archsummit16/media/14810236108663.jpg b/source/archsummit16/media/14810236108663.jpg
similarity index 100%
rename from archsummit16/media/14810236108663.jpg
rename to source/archsummit16/media/14810236108663.jpg
diff --git a/archsummit16/media/14810238367696.jpg b/source/archsummit16/media/14810238367696.jpg
similarity index 100%
rename from archsummit16/media/14810238367696.jpg
rename to source/archsummit16/media/14810238367696.jpg
diff --git a/archsummit16/media/14810238557321.jpg b/source/archsummit16/media/14810238557321.jpg
similarity index 100%
rename from archsummit16/media/14810238557321.jpg
rename to source/archsummit16/media/14810238557321.jpg
diff --git a/archsummit16/media/14810240600830.jpg b/source/archsummit16/media/14810240600830.jpg
similarity index 100%
rename from archsummit16/media/14810240600830.jpg
rename to source/archsummit16/media/14810240600830.jpg
diff --git a/archsummit16/media/14810767704678.jpg b/source/archsummit16/media/14810767704678.jpg
similarity index 100%
rename from archsummit16/media/14810767704678.jpg
rename to source/archsummit16/media/14810767704678.jpg
diff --git a/archsummit16/media/14810784106682.jpg b/source/archsummit16/media/14810784106682.jpg
similarity index 100%
rename from archsummit16/media/14810784106682.jpg
rename to source/archsummit16/media/14810784106682.jpg
diff --git a/archsummit16/media/14810797886987.jpg b/source/archsummit16/media/14810797886987.jpg
similarity index 100%
rename from archsummit16/media/14810797886987.jpg
rename to source/archsummit16/media/14810797886987.jpg
diff --git a/source/categories/index.md b/source/categories/index.md
new file mode 100644
index 0000000..72eb84f
--- /dev/null
+++ b/source/categories/index.md
@@ -0,0 +1,4 @@
+---
+type: categories
+title: 分类
+---
\ No newline at end of file
diff --git a/source/favicon.png b/source/favicon.png
new file mode 100755
index 0000000..a7d47b9
Binary files /dev/null and b/source/favicon.png differ
diff --git a/source/gf17q1/githu-serendipity.md b/source/gf17q1/githu-serendipity.md
new file mode 100644
index 0000000..d2fe186
--- /dev/null
+++ b/source/gf17q1/githu-serendipity.md
@@ -0,0 +1,138 @@
+## Background
+
+Programmers who waste their time on Twitter and Facebook, should take some time to navigate through Github Serendipity ~
+
+Serendipity, accidental new discovery; This project(webapp) provides the great opportunity to browse and find high quality repo quickly and elegantly, with trending, rank, awesome, topics, similar dimensions.
+
+Some great data and ideas come from previous other programmers's project, which is addressed at my article [Github Explore Tip]().
+
+the main features:
+
+- Awesome: Show awesome - the Awesome List, the one-stop viewing experience [Awesome - curated list of awesome lists] (https://github.com/sindresorhus/awesome)
+- Trending: Show new trends in nearly ten days of time dimension, catch hot trends, keep pace with the times
+- Rank: Based on the Trending project in the past year, select Repo with no specific programming language. They are mostly guides and tutorials, it provide a chance to find new ideas from these non-hardcode projects
+- Topics: Topics are aggregated from the Backend, FrontEnd, DevOps, Guides, Tools, Design, Mobile and other categories and sorted by popularity. It make you quickly find all the topics popular repos
+- Similar: Find similar repos for the current repo, a good chance to know more, to compare and to combine.
+
+## screenshots
+
+- Auto generated dynamically contents
+- View more repo info at Github
+- Based on Awesome, nearly 600 awesome lists
+- Tick to mark read
+
+
+
+
+
+
+
+
+
+
+
+## 用途
+
+技术人刷微博,朋友圈。不如来刷 Github Serendipity ~
+
+Serendipity, 意外新发现; 巧事; 机缘凑巧; 随意浏览这些高质量的 Repo,可以给我们发现很多可能性『创造生命的惊喜』~
+
+> 花心思花时间选择究竟应该Follow谁,实际上就是在用已有的观念去过滤信息——换言之,就是用自己已有的观念给自己搭建一个新的牢房
+
+- [“为什么我在Twitter上Follow所有Follow我的人”](http://wordpress.lixiaolai.com/archives/8779.html)
+
+> 如若你能做个更开放的人,做个不断学习的人,做个有耐心的人,Serendipity其实是早晚能被你创造出来的东西。祝各位好运!
+
+- [李笑来:如何创造自己生命中的惊喜]()
+
+
+平时我也自己通过去找寻一些热门和优秀的 Github 项目来看,有很多优秀的工具,具体在文章 [Github Tips - Explore]()有提到。但是它们相互比较独立,发现和浏览体验比较割裂。所以就自己撸了一个用于发现和浏览这些优秀项目的 Side Project
+
+它主要包括
+
+- Awesome:展示 [awesome - Curated list of awesome lists ](https://github.com/sindresorhus/awesome) 中收集的众多 Awesome List,一站式观看体验
+- Trending:展示以时间维度的近十天的流行新项目,抓住热点潮流,与时俱进
+- Rank:基于过去一年 Trending 中项目,选择那些无特定编程语言的 Repo,多为 Guides 指南和教程,从这些非 hardcode 的项目中发现新思路和创意吧
+- Topics:从 Backend,FrontEnd,DevOps,Guides,Tools,Design,Mobile 等分类下看对应的热门话题,快速找到这聚类下的流行项目
+- Similar:找到当前项目的类似相关项目,以点带面,对比协同。
+
+
+
+## 功能截图
+
+
+
+
+Trending 日期汇总和菜单折叠 Trending repos collapsed based on date
+Hover 后展示项目描述信息 Show repo description on mouse hover
+滚回到文章顶部 Back to top for very long article
+
+
+
+
+
+
+话题广场页面 Dedicated Topics Page
+话题分类如 Repos categorized under Backend, FrontEnd, Devops, Guides, Tools etc.
+具体话题关注度(基于 Star) Popularity-sorted topics with star count
+
+
+
+
+
+
+
+具体话题页 Specific Topic Page
+罗列选定话题下所有热门项目 List all popular repos in the topic area
+基于 Star 数量排序 Sort by repo's star count
+加该话题的微信群参与讨论和分享 Join Group to discuss and share your opinion
+
+
+
+
+
+
+Rank 页,选出近一年非特定编程语言的流行项目 Rank Page, includes all trending repos with non-specific programming language
+多为 Readme 资料汇总和优秀文章指南等. They are mostly great articles and awesome guides
+Github, as not only code repository
+
+
+
+
+
+
+
+
+
+Similar 页,查看与当前项目类似的相关项目. Similar Page, to view all related and similar repos
+发现对比和协同相关项目 Chance to know more, to compare and to combine.
+
+
+
+
+## Todo
+
+- 优化 markdown 解析 - 全支持 github markdown flavor
+- 展示浏览历史,提供基于日期学习记录
+- 提供基于日期的 diff readme(对比上次浏览的差别)
+- 数据 json 化和 update 机制
+
+
+### 源代码
+
+好久没写前端,第一次写 React,等后续随着不断加些新功能, polish 和 refactor 后再放出
+
+
+### 引用
+
+all credits go to
+
+- [Ant Design](https://ant.design)
+- [react-markdown](https://github.com/rexxars/react-markdown)
+- [create-react-app](https://github.com/facebookincubator/create-react-app)
+- [awesomelists.top/](http://awesomelists.top/)
+- [awesome](https://github.com/sindresorhus/awesome)
+- [smart-toc](https://github.com/FallenMax/smart-toc)
+- [gitlogs](gitlogs.com)
+- [yasiv.com](yasiv.com/github)
+
diff --git a/source/gf17q1/github-author.md b/source/gf17q1/github-author.md
new file mode 100644
index 0000000..13f6d61
--- /dev/null
+++ b/source/gf17q1/github-author.md
@@ -0,0 +1,10 @@
+
+
+https://stories.devacademy.la/how-to-use-github-like-a-proper-human-being-1a9c895c4e13#.8fx7fd7t6
+
+
+从 reamde, commits , branches, issues, pull requests 等提出了建议~
+
+
+
+
diff --git a/source/gf17q1/github-explore-en.md b/source/gf17q1/github-explore-en.md
new file mode 100644
index 0000000..4943e2b
--- /dev/null
+++ b/source/gf17q1/github-explore-en.md
@@ -0,0 +1,244 @@
+## Student Developer Pack
+https://education.github.com/pack?ref=producthunt
+The best developer tools, free for students
+
+for most students, real world tools can be cost prohibitive. That's why we created the GitHub Student Developer Pack with some of our partners and friends: to give students free access to the best developer tools in one place so they can learn by doing.
+
+
+
+https://tilfin.github.io/deck/
+'Deck' is a multi-timeline viewer for GitHub repository events.
+
+
+
+
+
+
+
+
+
+
+## Git Notify - Daily code diffs from public Github repos via Emails | Slack
+
+https://gitnotify.com/home
+
+ • Track awesome lists to get new diffs every day/every week
+ • Observe interesting projects like rails, kafka, storm
+ • Daily updates of code changes from your favorite libraries JQuery, React, Spree, Docker etc.,
+
+
+
+
+
+
+
+
+Github Tips
+
+
+# 探索 Repo
+
+经常的浏览 Github 对于开拓技术眼界,扩宽自己的知识面,更新自己的技术储备非常有帮助。而高效率的找到好的开源项目,定位到热点技术话题的项目,对我们探索学习非常关键。
+
+## git:logs
+
+它提供了 Trending 版本,可以看到基于日期的新晋流行和热点的项目。最近的技术风潮,自己所在领域的新动向和新的实践等,一览无余。
+
+
+
+
+如果是想对一个特定领域和话题,有着更加深入的了解,通过 git:logs topics 界面就可以目前火热的技术热点。它们更加源源不断的 Github 项目做聚类分析,从而汇总出类似于 Design 设计,Frontend 前端,Backend 后端,Tools 工具,Devops 开发运维,Mobile 移动应用等类别。譬如我们查看 Guides 类别下,可以发现有 awesome,教育,编程,社区,数学,课程,清单,书籍资料,文章等形式整理出来的优秀学习资料。这比去看一些肤浅的技术博客,不够深入的个人实践和分析的文章要有效不少~
+
+
+
+
+
+
+
+
+## Yasiv - similar repo
+
+了解了一个项目后,希望找到类似项目从而更好的对比和选择。这也是在技术选型和方案对比中比较关键步骤,同时这也是以点带面的了解这一领域中相关技术的方式。背后的算法应该就算是协同过滤,大家应该对电商类网站的『猜你喜欢,购买相似产品的用户也购买』等产品特性中早已经耳濡目染的啤酒尿布
+
+
+
+
+
+## AwesomeList top
+
+新进入一个领域,可以在 awesome + 或者在 awesome list 中查找相应的 list。当然也可以在 git:logs categories 中快速定位。同时,也可以使用类似于 Yasiv 按图索骥找到和已知项目相似的仓库,进行学习。
+
+PS:浏览 AweSome list 目前不够完善的一点是,对于录入的链接,存在时效性延迟和 Maintainer 个人的喜好,同时没法对 list 中的 link 除了 intro,没有更多的信息展示(如 repo 最新的更新,Star 数,Issues 数等)。还有一份 Awesome 或大而全的 Readme 可能因为时常更新,后续回顾的时候比较难把握住内容的增删改。可以利用 Github 的 Compare 功能对比两个时间段的更新,快速可视化。
+
+
+
+
+
+
+
+# 专注 Repo
+
+
+[Gitter Helper](https://chrome.google.com/webstore/detail/gitter-helper-for-github/apahfabdianobklhejoojcpmoegaolpi)
+
+此扩展可以轻松查看GitHub项目是否具有Gitter空间。而Gitter是一个聊天和网络平台,有助于通过消息,内容和发现来管理,增长和连接社区(Slack 的替代方案),目前已经被 Gitlab 收购。
+这里展示了社区兴旺发达,而不是简单的静态的不及时的 Github issues,用过 Slack 此类工具的就会知道及时沟通的 IM 和便于沉淀内容社区机制,对于一个刚学习一项开源技术和框架工具带来的帮助是有多大了~
+
+
+
+
+现在不少流行的开源项目,都有非常热闹和旺盛的 Gitter 社区,如 keystone,gogs, eslint 等,在碰到棘手问题查找无果的时候,不要忘记到这里来寻求帮助~
+
+
+[Smart TOC](https://chrome.google.com/webstore/detail/smart-toc/lifgeihcfpkmmlfjbailfpfhbahhibba)
+
+
+通过给正在阅读的文章添加动态的目录,来帮助更好的吸收和浏览长文章和文档。通过触手可及的目录,我们对浏览的长文有个大纲式的提纲挈领般的掌控,克服对未知内容的恐惧,便于从整体到局部细节的专研。
+
+
+## Package Hub
+
+在 Github 项目的说明页底部添加依赖说明,它支持多种包管理器,如 npm(Node.js), pip(Python), gem(Ruby) 等。它的工作原理是识别出项目中的 package 文件,从而从中提取依赖,并且展示依赖的版本和说明描述等
+PS:对了解该项目中依赖一目了然,对一些依赖包的简单说明便于浏览项目源码时能有不错的对应项。
+
+
+
+
+
+## [Octotree](https://github.com/buunguyen/octotree)
+
+浏览器扩展(Chrome,Firefox,Opera和Safari)在GitHub上显示代码仓库的文件目录。 非常有趣的探索项目源码,就像是在编辑器中打开一样,而不必将每个单独的代码 Git 库拉取到机器磁盘上,截图如下:
+
+
+
+
+## [OctoLink](https://github.com/octo-linker/chrome-extension/)
+
+browser extension. Once installed, it allows you to navigate through projects on GitHub.com efficiently.
+Most projects consist of many files and third party dependencies. Files are referencing other files and / or dependencies by language specific statements like include or require. Dependencies are most likely declared in a file called manifest e.g. package.json or Gemfile. The OctoLinker browser extensions makes these references clickable. No more copy and search.
+
+OctoLinker is the easiest and best way to navigate between files and projects on GitHub.com. Files containing the following keywords will now have links that redirect you either to the relative file or to the projects GitHub page. Depending on the value, it may redirect you to an external website like a manual page or another service.
+
+
+
+## Refined GitHub
+http://github.com/sindresorhus/refined-github
+We use GitHub a lot and notice many dumb annoyances we'd like to fix. So here be dragons.
+
+其他增强,如 extension to display repository size on GitHub,文件大小,快速 copy 文件内容的按钮等 http://github.com/softvar/github-plus
+
+Displays repo size.
+Displays each file size for every active branch (not applicable for folder / symlink).
+Show download link for each individual file (not applicable for folder / symlink).
+Copy file's contents directly to Clipboard (just won't work for markdown files).
+Download file while viewing it's contents.
+
+
+## Lovely forks
+
+
+
+
+addon to help you notice notable forks of a Github project.
+Sometimes on Github, projects are abandoned by the original authors and the development continues on a fork. However, the original repository is seldom updated to inform newcomers of that fact. I have often wasted effort on making a pull-request or installing old buggy versions of projects when the community had already moved to a fork.
+To make matters worse, the old projects usually have higher search-engine traffic and a lot more stars than the forks. This makes the forks even harder to find. This addon tries to remedy that by adding a subscript under the name of the repository on the Github page of the project with a link to the most notable fork (i.e. the fork with the most stars and at least one star), if such a fork exists.
+Also, if the fork is more recent than the upstream, a flame icon is shown next to it. These are called flamey forks as suggested by Mottie.
+
+## Gitscout
+
+
+
+https://gitscout.com/?ref=producthunt Gitscout is a beautiful GitHub Issues experience for macOS
+
+
+
+## runkit Try any Node.js package right in your browser https://runkit.com/home
+
+
+
+ • all documents on RunKit are public
+ • require() any package directly from npm
+ • use arrow functions, classes, template strings, and most of ES6
+ • await any promise instead of using callbacks (example)
+ • create your own embedded node.js snippets
+
+
+
+
+
+## Tip - Comparing Changes
+
+我们关注的开源项目,可能在快速迭代和发展。当我们需要深入研究该项目时,从项目的 changelog 中可以快速掌握它的迭代更新的具体变化和内容。同时,如果一段时间未关注该项目后,可以通过 Github 提供的 Comparing 功能对比两个不同的分支(提交)等,比较方便的是。这里的分支可以设置为相对日期为对比锚点。譬如上个月我看了[system-design-primer](https://github.com/donnemartin/system-design-primer),通读一变后,觉得收获不少。那么一个月后我再次浏览该文档时,肯定希望可以快速查看在一段时间内的变化,此时基于相对日期的 Comparing 对比就非常方便了~
+
+
+
+https://github.com/donnemartin/system-design-primer/commit/0c8be40660b7ed7262ad1073e2ea794d9d1cbb6d#diff-04c6e90faac2675aa89e2176d2eec7d8
+
+
+# 探寻 Hacker
+
+Repo 在 Github 上是一个纬度,而优秀 Repo 背后的作者:那些高效的10x 程序员也是另一个纬度。通过它,我们可以对编程大牛的技术成长和技术动向(看他们参与的项目,加星的项目,提 PR/Issue 的项目)。有道是观察大师,模仿大师,最后成为大师。
+
+## [CoderStats](http://coderstats.net/github/tj/)
+
+它是用于分析和展示程序员在开源项目(Github)的投入和产出等统计信息的服务
+
+下面是 Tj 大神的信息:
+
+
+通过它提供的 Chrome 插件,可以在当前浏览的 Githuber Profile 页看到链接入口到 CoderStats 的页面
+
+
+
+
+## 各类 Rank
+
+[github-ranking](https://github-ranking.com/)
+提供针对于 Github 上用户,组织和代码仓库的排序
+
+
+
+
+
+http://git-awards.com/about
+
+提供不同语言和不同地区纬度下的优秀 Githuber 和你在各类语言和地区中的排名
+
+
+
+
+
+
+
+
+## Twitter for Githuber
+
+Twitter for GitHub - Shows a user's Twitter handle on their profile page
+https://github.com/bevacqua/twitter-for-github
+
+# Know More 了解自己
+
+https://medium.freecodecamp.com/data-visualization-what-languages-got-the-most-github-stars-in-2016-a4e3908a9532?source=false---------7
+
+[Github 语言投入情况分析](https://starred.jjperezaguinaga.com/), 该项目通过分析你在一年中的对不同编程语言的 Star 加星行为来可视化这样的统计信息。非常直观的展示了一年中我们的动向和学习情况。
+
+譬如下图是我的信息:
+
+
+
+其中五月开始到八月,是我在公司里面接手一个旧的 Java 项目时间段,没有足够的时间来自我学习和浏览 Github。而在年底,我开始对 Golang 语言相关项目开始加到了投入和学习,通过这个主题河流图(参考 ECharts 的说法),一目了然。果然是我们的数据定义了我们(Our data identify us)。
+
+
+放出 Tj 大神的一年状态,持续和逐渐走高的 Golang 关注。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/gf17q1/github-explore.md b/source/gf17q1/github-explore.md
new file mode 100644
index 0000000..1c8ea1a
--- /dev/null
+++ b/source/gf17q1/github-explore.md
@@ -0,0 +1,289 @@
+
+Github Tips
+
+> 为了更好的持续更新和沟通协作,这里使用 Github 形式沉淀该系列文章
+
+本文先后从下面三个方面,整理和讲诉在这个过程中能够帮助我们更有效率和事半功倍的一些好用却不那么被人熟知的工具。
+
+- [探索项目]()
+- [专注项目]()
+- [关注开发者]()
+
+大致的讲诉逻辑是:
+
+- 我们首先要在巨多的开源项目中找到哪些优秀并且我们感兴趣的项目,包括了提供最近流行,历史排行,类似项目和特定领域层面;
+- 然后我们要专注和学习找到的项目,此时有效率的浏览代码,文章甚至依赖,查看项目信息,在活跃的社区沟通和快速 demo 和尝试试用就变得很重要;
+- 最后,我们学习开源项目也是为了成为更好的开发者。通过『观察大师,模仿大师,最终成为大师』,所以要定位到那些厉害的程序员和定期关注他们的动态。
+
+
+# 探索项目
+
+经常的浏览 Github 对于开拓技术眼界,扩宽自己的知识面,更新自己的技术储备非常有帮助。而高效率的找到好的开源项目,定位到热点技术话题的项目,对我们探索学习非常关键。
+
+## git:logs
+
+它提供了 Trending 流行功能,可以看到基于日期的新晋流行和热点的项目。让最近的技术风潮,特定领域的新动向和新实践等,一览无余。
+
+
+
+
+如果是想对一个特定领域和话题有着更加深入的了解或者想系统结构化的浏览 Github,通过 git:logs topics 页面就可以发现目前最热的技术点。它们利用 Github 提供的项目话题 topics 数据对源源不断的 Github 项目做聚类分析,从而汇总出类似于 Design 设计,Frontend 前端,Backend 后端,Tools 工具,Devops 开发运维,Mobile 移动应用等类别领域,在这些类目下是具体的领域话题。
+
+譬如我们查看 Guides 类别下,可以发现有 awesome,教育,编程,社区,数学,课程,清单,书籍资料,文章等形式整理出来的优秀学习资料。这比去看一些肤浅的技术博客,不够深入的个人实践和分析的文章要有效不少~
+
+
+
+PS:项目背后的故事,看 Product Hunt 的页面 (https://www.producthunt.com/posts/git-logs-2, https://www.producthunt.com/posts/awesome-github-topics)
+
+
+
+## AwesomeList top
+
+新进入一个领域,可以在 awesome + 或者在 awesome list 中查找相应的 list。大家都知道近一两年 Github 非常流行 awesome- 类型的项目,它就是把特定领域话题下信息爆炸的众多质量参差不齐的资源(包括文章教程,开源项目工具和服务等)人为的手工整理出。而 awesome list 又是汇总和挑选这些各领域 awesome 的列表(指环王?!one ring to rule them all)
+
+PS:浏览 AweSome list 目前不够完善的一点是,对于录入的链接,存在时效性延迟和 Maintainer 个人的喜好,同时没法对 list 中的 link 除了 intro,没有更多的信息展示(如 repo 最新的更新,Star 数,Issues 数等)。还有一份 Awesome 或大而全的 Readme 可能因为时常更新,后续回顾的时候比较难把握住内容的增删改。可以利用 Github 的 Compare 功能对比两个时间段的更新,快速可视化。
+
+这个项目也是我最终做 [Github Serendipity](https://github-serendipity.github.io) 最初的灵感来源和优化方向~
+
+它提供项目搜索,文章大纲目录和文章类搜索功能~
+
+
+
+
+
+## Yasiv - similar repo
+
+了解了一个项目后,希望找到类似项目从而更好的对比和选择。这也是在技术选型和方案对比中比较关键步骤,同时这也是以点带面的了解这一领域中相关技术的方式。背后的算法应该就算是协同过滤,大家应该对电商类网站的『猜你喜欢,购买相似产品的用户也购买』等产品特性中早已经耳濡目染的啤酒尿布
+
+
+
+
+## Githunt
+
+Githunt,它是 Chrome 浏览器,可以替换 Chrome 的新 tab 页为 Github 流行项目
+
+
+
+
+
+## [deck](https://tilfin.github.io/deck/)
+
+'Deck' 提供对 Github 项目事件动态的多栏时间流查看工具
+
+
+
+
+综上所述:
+
+新进入一个领域,可以在 awesome + 或者在 awesome list 中查找相应的 list。当然也可以在 git:logs categories/topics 中快速定位该领域下的热点和优秀开源项目。同时,也可以使用类似于 Yasiv 按图索骥以点带面找到和已知项目相似的仓库,进行学习。平时可以通过 githunt/deck 等资讯或动态流保持对技术 Sense~
+
+
+# 专注项目
+
+发现项目只是第一步,最重要的是对发现的项目进入深入学习,项目使用和回馈社区。
+
+
+## Gitter
+
+Gitter是一个聊天和网络平台,有助于通过消息,内容和发现来管理,增长和连接社区(Slack 的替代方案),目前已经被 Gitlab 收购。
+这里展示了社区兴旺发达,而不是简单的静态的不及时的 Github issues,用过 Slack 此类工具的就会知道及时沟通的 IM 和便于沉淀内容社区机制,对于一个刚学习一项开源技术和框架工具带来的帮助是有多大了~
+
+提供插件 [Gitter Helper](https://chrome.google.com/webstore/detail/gitter-helper-for-github/apahfabdianobklhejoojcpmoegaolpi) 可以轻松查看 GitHub 项目是否具有Gitter 空间和传送门链接
+
+现在不少流行的开源项目,都有非常热闹和旺盛的 Gitter 社区,如 keystone,gogs, eslint 等,在碰到棘手问题查找无果的时候,不要忘记到这里来寻求帮助~
+
+
+
+
+## [Smart TOC](https://chrome.google.com/webstore/detail/smart-toc/lifgeihcfpkmmlfjbailfpfhbahhibba)
+
+通过给正在阅读的文章添加动态的目录,来帮助更好的吸收和浏览长文章和文档。通过触手可及的目录,我们对浏览的长文有个大纲式的提纲挈领般的掌控,克服对未知内容的恐惧,便于从整体到局部细节的专研。
+
+
+
+
+## Package Hub
+
+通过浏览器插件的形式,当用户在浏览 Github 项目时,在说明页 Readme 底部添加项目的包依赖说明。它支持多种包管理器,如 npm(Node.js), pip(Python), gem(Ruby) 等。它的工作原理是识别出项目中的 package 文件,从而从中提取依赖,并且展示依赖的版本和说明描述等
+PS:对了解该项目中依赖一目了然,对一些依赖包的简单说明便于浏览项目源码时能有不错的对应。
+
+
+
+传送门:
+
+- [安装插件](https://chrome.google.com/webstore/detail/package-hub/hnnjnbmjanpeoeapjllonejjgoonilal)
+- [查看源码](https://github.com/BrainMaestro/packagehub)
+
+
+## Octotree
+
+它是浏览器扩展(Chrome,Firefox,Opera和Safari),在 GitHub 左侧展示文件导航,使目录结构一目了然,这对探索和浏览项目源码非常有帮助,就像是在编辑器/IDE 中打开一样,从而不必将每个单独的代码 Git 库拉取到机器磁盘上才能方便的浏览代码,截图如下:
+
+
+
+传送门:
+
+- [安装插件](https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?hl=en-US)
+- [查看源码](https://github.com/buunguyen/octotree)
+
+
+## [OctoLink](https://github.com/octo-linker/chrome-extension/)
+
+它是浏览器插件,安装后让开发者更加有效率的在 Github 页面代码区域跳转(vim ctags)
+大部分项目包含很多文件模块和第三方依赖,它们通过特定的语法被引用和导入(如 include, require, import 等),而依赖关系可能被罗列在项目的 manifest 文件中(如 package.json, requirements.txt, Gemfile 等),OctoLink 使得这些引用可以被点击跳转,而不用传统的去复制后搜索。
+
+从最早仅仅支持 JavaScript,到现在支持大部分的编程语言,让它的可用性大大提高。
+
+
+
+
+传送门:
+
+- [安装插件](https://chrome.google.com/webstore/detail/octo-linker/jlmafbaeoofdegohdhinkhilhclaklkp)
+- [查看源码](https://github.com/OctoLinker/browser-extension)
+
+
+## Refined GitHub & Github Plus
+
+提供如展示项目大小,文件大小和快速复制文件内容,单独下载文件等功能的增强的浏览器插件
+
+
+
+传送门:
+
+- [安装插件](https://chrome.google.com/webstore/detail/github-plus/anlikcnbgdeidpacdbdljnabclhahhmd)
+- [查看源码](https://github.com/softvar/github-plus)
+
+
+其他:
+refined-github,在使用 Github 过程中对那些不太直观和方便的地方进行 tweak 修改。
+
+- [查看源码](https://github.com/sindresorhus/refined-github)
+- [安装插件](https://chrome.google.com/webstore/detail/refined-github/hlepfoohegkhhmjieoechaddaejaokhf)
+
+
+
+## Lovely forks
+
+
+
+钻研一个具体项目,肯定会时不时冒出因为增加和调整特性从而对它有做修改的冲动。
+该浏览器插件让你直观的查看到 Github 项目中值得注意的分支。有的项目被原作者遗弃,而它新的发展在其他被 fork 出来的分支上进行。糟糕的是,旧项目通常具有较高的搜索引擎排名和流量,这让被 fork 出被社区参与持续发展的项目很难被发现。所以插件在旧项目名称下提供那些值得被关注的分支~
+
+传送门:
+
+- [安装插件](https://chrome.google.com/webstore/detail/lovely-forks/ialbpcipalajnakfondkflpkagbkdoib)
+- [查看源码](https://github.com/musically-ut/lovely-forks)
+
+
+## Gitscout
+
+提供界面美观功能易用的 Github Issues Mac 客户端,浏览组织和管理你参与项目和感兴趣项目的 Github Issues. [传送门](https://gitscout.com)
+
+
+
+
+## Zenhub
+
+为 Github 提供项目管理和敏捷开发功能整合的浏览器插件。如:多项目支持的高级任务板,整合里程碑、issues 和 PR 管理的 reporting 工具集,工作任务分为 Todo、Backlog、In Progress 等列表等。[安装插件](https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd)
+
+
+
+PS:最近 Github 也开发了自己的 [Github Projects](https://github.com/features),来给项目任务加入类似于 Trello 的管理功能.
+
+## RunKit
+
+Node 试验台,几乎预装了所有 npm 包,立即创建自己的 API。
+
+我们在浏览开源项目的时候,肯定想马上 clone 项目下来撩起袖子马上开搞。但是环境搭建,依赖拉取,文件下载等让这个尝试的成本变高,所以这类工具可以显著降低成本,让我们更多更快的原型~ [传送门](https://runkit.com/home)
+
+ • 查看项目和依赖库的文档
+ • 直接 require npm 上的第三方项目,无需等待下载
+ • 使用最新的 ES6 语法,无需 Babel 或 nvm 最新 node engine
+ • 立即试用 async/await 撸直回调代码
+
+
+
+类似项目有
+
+- [Floyd](https://www.floydhub.com/#examples): Zero Setup Deep Learning
+- [codepon project](codepen.io/pro/projects/): Zero setup, full-featured front end web development environment, right here in your web browser.
+
+
+
+
+
+
+
+## Git Notify -
+
+Web 服务,让你长期对所关注项目保持专注和被通知更新汇总,从而每天/每周对它所有的代码提交、分支创建和 issues 讨论完全掌握。[传送门](https://gitnotify.com/home)
+
+
+
+
+
+## Tip - Comparing Changes
+
+我们关注的开源项目,可能在快速迭代和发展。当我们需要深入研究该项目时,从项目的 changelog 中可以快速掌握它的迭代更新的具体变化和内容。同时,如果一段时间未关注该项目后,可以通过 Github 提供的 Comparing 功能对比两个不同的分支(提交)等,比较方便的是。这里的分支可以设置为相对日期为对比锚点。譬如上个月我看了[system-design-primer](https://github.com/donnemartin/system-design-primer),通读一变后,觉得收获不少。那么一个月后我再次浏览该文档时,肯定希望可以快速查看在一段时间内的变化,此时基于相对日期的 Comparing 对比就非常方便了~ [demo](https://github.com/donnemartin/system-design-primer/commit/0c8be40660b7ed7262ad1073e2ea794d9d1cbb6d#diff-04c6e90faac2675aa89e2176d2eec7d8)
+
+
+
+
+
+# 探寻 Hacker
+
+开源项目在 Github 上是了解开源软件的一个纬度,而优秀项目背后的作者(们):那些传说中的高效10x 程序员是另一个纬度。我们对编程大牛的技术成长和技术动向(看他们参与的项目,加星的项目,提 PR/Issue 的项目),来实现观察大师,模仿大师,最后成为大师的套路。
+
+## CoderStats
+
+它是用于分析和展示程序员在开源项目(Github)的投入和产出等统计信息的服务
+
+下面是 Tj 大神的信息,[传送门]((http://coderstats.net/github/tj/)):
+
+
+通过它提供的 Chrome 插件,可以在当前浏览的 Github 作者个人资料页看到链接入口到 CoderStats 的页面
+
+
+
+
+## 各类 Rank
+
+[github-ranking](https://github-ranking.com/)
+提供针对于 Github 上用户,组织和代码仓库的排序
+
+
+
+[git-awards](http://git-awards.com)
+提供不同语言和不同地区纬度下的优秀 Githuber 和你在各类语言和地区中的排名
+
+
+
+
+
+
+
+## Twitter for Githuber
+
+Twitter for GitHub - 在他们的Github 个人资料页面上显示对应的 Twitter
+
+## 可视化:用户在 Github 中对各语言参与情况
+
+[Github 语言投入情况分析](https://starred.jjperezaguinaga.com/), 该项目通过分析你在一年中的对不同编程语言的 Star 加星行为来可视化这样的统计信息。非常直观的展示了一年中我们的动向和学习情况。[传送门:背后的故事](https://medium.freecodecamp.com/data-visualization-what-languages-got-the-most-github-stars-in-2016-a4e3908a9532?source=false---------7)
+
+
+放出 Tj 大神的一年状态,持续和逐渐走高的 Golang 关注。
+
+
+
+同时也是了解自己的一个方法,譬如下图是我的:
+
+
+
+其中五月开始到八月,是我在公司里面接手一个旧的 Java 项目时间段,没有足够的时间来自我学习和浏览 Github。而在年底,我开始对 Golang 语言相关项目开始加到了投入和学习,通过这个主题河流图(参考 ECharts 的说法),一目了然。果然是我们的数据定义了我们(Our data identify us)。
+
+结尾
+以上不少工具是我们在浏览 Product Hunt,浏览自己的 Github Serendipity 中发现,希望大家有用,我们一起利用好 Github,成为优秀的开发者。
+
+广告:Best Way to Browser Github - [github-serendipity](https://github.com/github-serendipity/github-serendipity.github.io)
+
diff --git a/gf17q1/media/14903174964297.jpg b/source/gf17q1/media/14903174964297.jpg
similarity index 100%
rename from gf17q1/media/14903174964297.jpg
rename to source/gf17q1/media/14903174964297.jpg
diff --git a/gf17q1/media/14903190389489.jpg b/source/gf17q1/media/14903190389489.jpg
similarity index 100%
rename from gf17q1/media/14903190389489.jpg
rename to source/gf17q1/media/14903190389489.jpg
diff --git a/gf17q1/media/14903191017439.jpg b/source/gf17q1/media/14903191017439.jpg
similarity index 100%
rename from gf17q1/media/14903191017439.jpg
rename to source/gf17q1/media/14903191017439.jpg
diff --git a/gf17q1/media/14903201209340.jpg b/source/gf17q1/media/14903201209340.jpg
similarity index 100%
rename from gf17q1/media/14903201209340.jpg
rename to source/gf17q1/media/14903201209340.jpg
diff --git a/gf17q1/media/14903203651359.jpg b/source/gf17q1/media/14903203651359.jpg
similarity index 100%
rename from gf17q1/media/14903203651359.jpg
rename to source/gf17q1/media/14903203651359.jpg
diff --git a/gf17q1/media/14903204567229.jpg b/source/gf17q1/media/14903204567229.jpg
similarity index 100%
rename from gf17q1/media/14903204567229.jpg
rename to source/gf17q1/media/14903204567229.jpg
diff --git a/gf17q1/media/14903205083085.jpg b/source/gf17q1/media/14903205083085.jpg
similarity index 100%
rename from gf17q1/media/14903205083085.jpg
rename to source/gf17q1/media/14903205083085.jpg
diff --git a/gf17q1/media/14903205334211.jpg b/source/gf17q1/media/14903205334211.jpg
similarity index 100%
rename from gf17q1/media/14903205334211.jpg
rename to source/gf17q1/media/14903205334211.jpg
diff --git a/gf17q1/media/14903206207143.jpg b/source/gf17q1/media/14903206207143.jpg
similarity index 100%
rename from gf17q1/media/14903206207143.jpg
rename to source/gf17q1/media/14903206207143.jpg
diff --git a/gf17q1/media/14903212092569.jpg b/source/gf17q1/media/14903212092569.jpg
similarity index 100%
rename from gf17q1/media/14903212092569.jpg
rename to source/gf17q1/media/14903212092569.jpg
diff --git a/gf17q1/media/14903213018117.jpg b/source/gf17q1/media/14903213018117.jpg
similarity index 100%
rename from gf17q1/media/14903213018117.jpg
rename to source/gf17q1/media/14903213018117.jpg
diff --git a/gf17q1/media/14903214647582.jpg b/source/gf17q1/media/14903214647582.jpg
similarity index 100%
rename from gf17q1/media/14903214647582.jpg
rename to source/gf17q1/media/14903214647582.jpg
diff --git a/gf17q1/media/14903218246656.jpg b/source/gf17q1/media/14903218246656.jpg
similarity index 100%
rename from gf17q1/media/14903218246656.jpg
rename to source/gf17q1/media/14903218246656.jpg
diff --git a/gf17q1/media/14903218908653.jpg b/source/gf17q1/media/14903218908653.jpg
similarity index 100%
rename from gf17q1/media/14903218908653.jpg
rename to source/gf17q1/media/14903218908653.jpg
diff --git a/gf17q1/media/14903220990895.jpg b/source/gf17q1/media/14903220990895.jpg
similarity index 100%
rename from gf17q1/media/14903220990895.jpg
rename to source/gf17q1/media/14903220990895.jpg
diff --git a/gf17q1/media/14903225257228.jpg b/source/gf17q1/media/14903225257228.jpg
similarity index 100%
rename from gf17q1/media/14903225257228.jpg
rename to source/gf17q1/media/14903225257228.jpg
diff --git a/gf17q1/media/14903238159250.jpg b/source/gf17q1/media/14903238159250.jpg
similarity index 100%
rename from gf17q1/media/14903238159250.jpg
rename to source/gf17q1/media/14903238159250.jpg
diff --git a/gf17q1/media/14903243387772.jpg b/source/gf17q1/media/14903243387772.jpg
similarity index 100%
rename from gf17q1/media/14903243387772.jpg
rename to source/gf17q1/media/14903243387772.jpg
diff --git a/gf17q1/media/14903243571802.jpg b/source/gf17q1/media/14903243571802.jpg
similarity index 100%
rename from gf17q1/media/14903243571802.jpg
rename to source/gf17q1/media/14903243571802.jpg
diff --git a/gf17q1/media/14903244958855.jpg b/source/gf17q1/media/14903244958855.jpg
similarity index 100%
rename from gf17q1/media/14903244958855.jpg
rename to source/gf17q1/media/14903244958855.jpg
diff --git a/gf17q1/media/14903245367211.jpg b/source/gf17q1/media/14903245367211.jpg
similarity index 100%
rename from gf17q1/media/14903245367211.jpg
rename to source/gf17q1/media/14903245367211.jpg
diff --git a/gf17q1/media/14903246204755.jpg b/source/gf17q1/media/14903246204755.jpg
similarity index 100%
rename from gf17q1/media/14903246204755.jpg
rename to source/gf17q1/media/14903246204755.jpg
diff --git a/gf17q1/media/14903246561724.jpg b/source/gf17q1/media/14903246561724.jpg
similarity index 100%
rename from gf17q1/media/14903246561724.jpg
rename to source/gf17q1/media/14903246561724.jpg
diff --git a/gf17q1/media/14909514286397.jpg b/source/gf17q1/media/14909514286397.jpg
similarity index 100%
rename from gf17q1/media/14909514286397.jpg
rename to source/gf17q1/media/14909514286397.jpg
diff --git a/gf17q1/media/14909517815313.jpg b/source/gf17q1/media/14909517815313.jpg
similarity index 100%
rename from gf17q1/media/14909517815313.jpg
rename to source/gf17q1/media/14909517815313.jpg
diff --git a/gf17q1/media/14910058528550.jpg b/source/gf17q1/media/14910058528550.jpg
similarity index 100%
rename from gf17q1/media/14910058528550.jpg
rename to source/gf17q1/media/14910058528550.jpg
diff --git a/gf17q1/media/14910108475013.jpg b/source/gf17q1/media/14910108475013.jpg
similarity index 100%
rename from gf17q1/media/14910108475013.jpg
rename to source/gf17q1/media/14910108475013.jpg
diff --git a/gf17q1/media/14910112197012.jpg b/source/gf17q1/media/14910112197012.jpg
similarity index 100%
rename from gf17q1/media/14910112197012.jpg
rename to source/gf17q1/media/14910112197012.jpg
diff --git a/gf17q1/media/14910114073950.jpg b/source/gf17q1/media/14910114073950.jpg
similarity index 100%
rename from gf17q1/media/14910114073950.jpg
rename to source/gf17q1/media/14910114073950.jpg
diff --git a/gf17q1/media/14910116581746.jpg b/source/gf17q1/media/14910116581746.jpg
similarity index 100%
rename from gf17q1/media/14910116581746.jpg
rename to source/gf17q1/media/14910116581746.jpg
diff --git a/gf17q1/media/14910118427444.jpg b/source/gf17q1/media/14910118427444.jpg
similarity index 100%
rename from gf17q1/media/14910118427444.jpg
rename to source/gf17q1/media/14910118427444.jpg
diff --git a/gf17q1/media/14910127805398.jpg b/source/gf17q1/media/14910127805398.jpg
similarity index 100%
rename from gf17q1/media/14910127805398.jpg
rename to source/gf17q1/media/14910127805398.jpg
diff --git a/gf17q1/media/14910519455765.jpg b/source/gf17q1/media/14910519455765.jpg
similarity index 100%
rename from gf17q1/media/14910519455765.jpg
rename to source/gf17q1/media/14910519455765.jpg
diff --git a/gf17q1/media/14910574736876.png b/source/gf17q1/media/14910574736876.png
similarity index 100%
rename from gf17q1/media/14910574736876.png
rename to source/gf17q1/media/14910574736876.png
diff --git a/gf17q1/media/14912753337669.jpg b/source/gf17q1/media/14912753337669.jpg
similarity index 100%
rename from gf17q1/media/14912753337669.jpg
rename to source/gf17q1/media/14912753337669.jpg
diff --git a/gf17q1/media/14912755290714.jpg b/source/gf17q1/media/14912755290714.jpg
similarity index 100%
rename from gf17q1/media/14912755290714.jpg
rename to source/gf17q1/media/14912755290714.jpg
diff --git a/gf17q1/media/14912763920547.png b/source/gf17q1/media/14912763920547.png
similarity index 100%
rename from gf17q1/media/14912763920547.png
rename to source/gf17q1/media/14912763920547.png
diff --git a/gf17q1/media/14912764006860.png b/source/gf17q1/media/14912764006860.png
similarity index 100%
rename from gf17q1/media/14912764006860.png
rename to source/gf17q1/media/14912764006860.png
diff --git a/gf17q1/media/14912770853416.jpg b/source/gf17q1/media/14912770853416.jpg
similarity index 100%
rename from gf17q1/media/14912770853416.jpg
rename to source/gf17q1/media/14912770853416.jpg
diff --git a/gf17q1/media/14912782383325.jpg b/source/gf17q1/media/14912782383325.jpg
similarity index 100%
rename from gf17q1/media/14912782383325.jpg
rename to source/gf17q1/media/14912782383325.jpg
diff --git a/gf17q1/media/14912815845135.jpg b/source/gf17q1/media/14912815845135.jpg
similarity index 100%
rename from gf17q1/media/14912815845135.jpg
rename to source/gf17q1/media/14912815845135.jpg
diff --git a/gf17q1/media/14912822599680.jpg b/source/gf17q1/media/14912822599680.jpg
similarity index 100%
rename from gf17q1/media/14912822599680.jpg
rename to source/gf17q1/media/14912822599680.jpg
diff --git a/gf17q1/media/14912862742430.jpg b/source/gf17q1/media/14912862742430.jpg
similarity index 100%
rename from gf17q1/media/14912862742430.jpg
rename to source/gf17q1/media/14912862742430.jpg
diff --git a/gf17q1/media/14912865876654.jpg b/source/gf17q1/media/14912865876654.jpg
similarity index 100%
rename from gf17q1/media/14912865876654.jpg
rename to source/gf17q1/media/14912865876654.jpg
diff --git a/gf17q1/media/14912955219984.jpg b/source/gf17q1/media/14912955219984.jpg
similarity index 100%
rename from gf17q1/media/14912955219984.jpg
rename to source/gf17q1/media/14912955219984.jpg
diff --git a/gf17q1/media/14912956622191.jpg b/source/gf17q1/media/14912956622191.jpg
similarity index 100%
rename from gf17q1/media/14912956622191.jpg
rename to source/gf17q1/media/14912956622191.jpg
diff --git a/gf17q1/media/14912967527441.jpg b/source/gf17q1/media/14912967527441.jpg
similarity index 100%
rename from gf17q1/media/14912967527441.jpg
rename to source/gf17q1/media/14912967527441.jpg
diff --git a/gf17q1/media/14912968445752.jpg b/source/gf17q1/media/14912968445752.jpg
similarity index 100%
rename from gf17q1/media/14912968445752.jpg
rename to source/gf17q1/media/14912968445752.jpg
diff --git a/gf17q1/media/14912969678102.jpg b/source/gf17q1/media/14912969678102.jpg
similarity index 100%
rename from gf17q1/media/14912969678102.jpg
rename to source/gf17q1/media/14912969678102.jpg
diff --git a/gf17q1/media/14912970688594.jpg b/source/gf17q1/media/14912970688594.jpg
similarity index 100%
rename from gf17q1/media/14912970688594.jpg
rename to source/gf17q1/media/14912970688594.jpg
diff --git a/gf17q1/media/14912971660013.jpg b/source/gf17q1/media/14912971660013.jpg
similarity index 100%
rename from gf17q1/media/14912971660013.jpg
rename to source/gf17q1/media/14912971660013.jpg
diff --git a/gf17q1/media/14912972594219.jpg b/source/gf17q1/media/14912972594219.jpg
similarity index 100%
rename from gf17q1/media/14912972594219.jpg
rename to source/gf17q1/media/14912972594219.jpg
diff --git a/gf17q1/media/14912973823048.jpg b/source/gf17q1/media/14912973823048.jpg
similarity index 100%
rename from gf17q1/media/14912973823048.jpg
rename to source/gf17q1/media/14912973823048.jpg
diff --git a/gf17q1/media/14912974624939.jpg b/source/gf17q1/media/14912974624939.jpg
similarity index 100%
rename from gf17q1/media/14912974624939.jpg
rename to source/gf17q1/media/14912974624939.jpg
diff --git a/gf17q1/media/14912977360545.jpg b/source/gf17q1/media/14912977360545.jpg
similarity index 100%
rename from gf17q1/media/14912977360545.jpg
rename to source/gf17q1/media/14912977360545.jpg
diff --git a/gf17q1/media/14912978442499.jpg b/source/gf17q1/media/14912978442499.jpg
similarity index 100%
rename from gf17q1/media/14912978442499.jpg
rename to source/gf17q1/media/14912978442499.jpg
diff --git a/gf17q1/media/14913668792104.jpg b/source/gf17q1/media/14913668792104.jpg
similarity index 100%
rename from gf17q1/media/14913668792104.jpg
rename to source/gf17q1/media/14913668792104.jpg
diff --git a/gf17q1/media/14924202628107.jpg b/source/gf17q1/media/14924202628107.jpg
similarity index 100%
rename from gf17q1/media/14924202628107.jpg
rename to source/gf17q1/media/14924202628107.jpg
diff --git a/gf17q1/media/14924211745089.jpg b/source/gf17q1/media/14924211745089.jpg
similarity index 100%
rename from gf17q1/media/14924211745089.jpg
rename to source/gf17q1/media/14924211745089.jpg
diff --git a/gf17q1/media/14924212235151.jpg b/source/gf17q1/media/14924212235151.jpg
similarity index 100%
rename from gf17q1/media/14924212235151.jpg
rename to source/gf17q1/media/14924212235151.jpg
diff --git a/gf17q1/media/14924233630901.jpg b/source/gf17q1/media/14924233630901.jpg
similarity index 100%
rename from gf17q1/media/14924233630901.jpg
rename to source/gf17q1/media/14924233630901.jpg
diff --git a/gf17q1/media/14924233742895.jpg b/source/gf17q1/media/14924233742895.jpg
similarity index 100%
rename from gf17q1/media/14924233742895.jpg
rename to source/gf17q1/media/14924233742895.jpg
diff --git a/gf17q1/media/14924233862265.jpg b/source/gf17q1/media/14924233862265.jpg
similarity index 100%
rename from gf17q1/media/14924233862265.jpg
rename to source/gf17q1/media/14924233862265.jpg
diff --git a/gf17q1/media/14924233993785.jpg b/source/gf17q1/media/14924233993785.jpg
similarity index 100%
rename from gf17q1/media/14924233993785.jpg
rename to source/gf17q1/media/14924233993785.jpg
diff --git a/gf17q1/media/14924234124673.jpg b/source/gf17q1/media/14924234124673.jpg
similarity index 100%
rename from gf17q1/media/14924234124673.jpg
rename to source/gf17q1/media/14924234124673.jpg
diff --git a/gf17q1/media/14924237099083.jpg b/source/gf17q1/media/14924237099083.jpg
similarity index 100%
rename from gf17q1/media/14924237099083.jpg
rename to source/gf17q1/media/14924237099083.jpg
diff --git a/gf17q1/media/14924351210099.jpg b/source/gf17q1/media/14924351210099.jpg
similarity index 100%
rename from gf17q1/media/14924351210099.jpg
rename to source/gf17q1/media/14924351210099.jpg
diff --git a/gf17q1/media/14924353723080.jpg b/source/gf17q1/media/14924353723080.jpg
similarity index 100%
rename from gf17q1/media/14924353723080.jpg
rename to source/gf17q1/media/14924353723080.jpg
diff --git a/gf17q1/media/14924354588718.jpg b/source/gf17q1/media/14924354588718.jpg
similarity index 100%
rename from gf17q1/media/14924354588718.jpg
rename to source/gf17q1/media/14924354588718.jpg
diff --git a/gf17q1/media/14924355789962.jpg b/source/gf17q1/media/14924355789962.jpg
similarity index 100%
rename from gf17q1/media/14924355789962.jpg
rename to source/gf17q1/media/14924355789962.jpg
diff --git a/gf17q1/media/14924357015438.jpg b/source/gf17q1/media/14924357015438.jpg
similarity index 100%
rename from gf17q1/media/14924357015438.jpg
rename to source/gf17q1/media/14924357015438.jpg
diff --git a/gf17q1/media/14924357967172.jpg b/source/gf17q1/media/14924357967172.jpg
similarity index 100%
rename from gf17q1/media/14924357967172.jpg
rename to source/gf17q1/media/14924357967172.jpg
diff --git a/gf17q1/media/14924362055645.jpg b/source/gf17q1/media/14924362055645.jpg
similarity index 100%
rename from gf17q1/media/14924362055645.jpg
rename to source/gf17q1/media/14924362055645.jpg
diff --git a/gf17q1/media/14924364391964.jpg b/source/gf17q1/media/14924364391964.jpg
similarity index 100%
rename from gf17q1/media/14924364391964.jpg
rename to source/gf17q1/media/14924364391964.jpg
diff --git a/gf17q1/media/14924364454607.jpg b/source/gf17q1/media/14924364454607.jpg
similarity index 100%
rename from gf17q1/media/14924364454607.jpg
rename to source/gf17q1/media/14924364454607.jpg
diff --git a/gf17q1/media/14924366767917.jpg b/source/gf17q1/media/14924366767917.jpg
similarity index 100%
rename from gf17q1/media/14924366767917.jpg
rename to source/gf17q1/media/14924366767917.jpg
diff --git a/gf17q1/media/14924369325043.jpg b/source/gf17q1/media/14924369325043.jpg
similarity index 100%
rename from gf17q1/media/14924369325043.jpg
rename to source/gf17q1/media/14924369325043.jpg
diff --git a/gf17q1/media/14926523574484.jpg b/source/gf17q1/media/14926523574484.jpg
similarity index 100%
rename from gf17q1/media/14926523574484.jpg
rename to source/gf17q1/media/14926523574484.jpg
diff --git a/gf17q1/media/14926535216099.jpg b/source/gf17q1/media/14926535216099.jpg
similarity index 100%
rename from gf17q1/media/14926535216099.jpg
rename to source/gf17q1/media/14926535216099.jpg
diff --git a/gf17q1/media/14926537177158.jpg b/source/gf17q1/media/14926537177158.jpg
similarity index 100%
rename from gf17q1/media/14926537177158.jpg
rename to source/gf17q1/media/14926537177158.jpg
diff --git a/gf17q1/media/14926558264539.jpg b/source/gf17q1/media/14926558264539.jpg
similarity index 100%
rename from gf17q1/media/14926558264539.jpg
rename to source/gf17q1/media/14926558264539.jpg
diff --git a/gf17q1/media/14926560753383.jpg b/source/gf17q1/media/14926560753383.jpg
similarity index 100%
rename from gf17q1/media/14926560753383.jpg
rename to source/gf17q1/media/14926560753383.jpg
diff --git a/gf17q1/media/14926561166432.jpg b/source/gf17q1/media/14926561166432.jpg
similarity index 100%
rename from gf17q1/media/14926561166432.jpg
rename to source/gf17q1/media/14926561166432.jpg
diff --git a/gf17q1/media/14926880039763.jpg b/source/gf17q1/media/14926880039763.jpg
similarity index 100%
rename from gf17q1/media/14926880039763.jpg
rename to source/gf17q1/media/14926880039763.jpg
diff --git a/gf17q1/media/14926880235763.jpg b/source/gf17q1/media/14926880235763.jpg
similarity index 100%
rename from gf17q1/media/14926880235763.jpg
rename to source/gf17q1/media/14926880235763.jpg
diff --git a/gf17q1/media/14926885484843.jpg b/source/gf17q1/media/14926885484843.jpg
similarity index 100%
rename from gf17q1/media/14926885484843.jpg
rename to source/gf17q1/media/14926885484843.jpg
diff --git a/gf17q1/media/14926891675584.jpg b/source/gf17q1/media/14926891675584.jpg
similarity index 100%
rename from gf17q1/media/14926891675584.jpg
rename to source/gf17q1/media/14926891675584.jpg
diff --git a/gf17q1/media/14926896013197.jpg b/source/gf17q1/media/14926896013197.jpg
similarity index 100%
rename from gf17q1/media/14926896013197.jpg
rename to source/gf17q1/media/14926896013197.jpg
diff --git a/gf17q1/media/14926899968140.jpg b/source/gf17q1/media/14926899968140.jpg
similarity index 100%
rename from gf17q1/media/14926899968140.jpg
rename to source/gf17q1/media/14926899968140.jpg
diff --git a/gf17q1/media/14926907928923.jpg b/source/gf17q1/media/14926907928923.jpg
similarity index 100%
rename from gf17q1/media/14926907928923.jpg
rename to source/gf17q1/media/14926907928923.jpg
diff --git a/gf17q1/media/14926920836152.jpg b/source/gf17q1/media/14926920836152.jpg
similarity index 100%
rename from gf17q1/media/14926920836152.jpg
rename to source/gf17q1/media/14926920836152.jpg
diff --git a/gf17q1/media/14927406206122.jpg b/source/gf17q1/media/14927406206122.jpg
similarity index 100%
rename from gf17q1/media/14927406206122.jpg
rename to source/gf17q1/media/14927406206122.jpg
diff --git a/gf17q1/media/14927421931818.png b/source/gf17q1/media/14927421931818.png
similarity index 100%
rename from gf17q1/media/14927421931818.png
rename to source/gf17q1/media/14927421931818.png
diff --git a/gf17q1/media/14927635049103.jpg b/source/gf17q1/media/14927635049103.jpg
similarity index 100%
rename from gf17q1/media/14927635049103.jpg
rename to source/gf17q1/media/14927635049103.jpg
diff --git a/gf17q1/media/14927635620481.jpg b/source/gf17q1/media/14927635620481.jpg
similarity index 100%
rename from gf17q1/media/14927635620481.jpg
rename to source/gf17q1/media/14927635620481.jpg
diff --git a/gf17q1/parror-lb.md b/source/gf17q1/parror-lb.md
similarity index 97%
rename from gf17q1/parror-lb.md
rename to source/gf17q1/parror-lb.md
index 02adc26..8b7647f 100644
--- a/gf17q1/parror-lb.md
+++ b/source/gf17q1/parror-lb.md
@@ -1,6 +1,4 @@
----
-draft: true
----
+

@@ -17,7 +15,7 @@ draft: true
• SSL termination - Decrypt incoming requests and encrypt server responses so backend servers do not have to perform these potentially expensive operations
• Session persistence - Issue cookies and route a specific client's requests to same instance if the web apps do not keep track of sessions
-同时为了 Load Balancer 自己的单点故障,可以启动多台。模式可以是 either in active-passive or active-active mode.
+同时为了 Load Balancer 自己的单点故障,可以启动多台。模式可以是 either in active-passive or active-active mode.
应对 HAProxy 的单点问题 (To eliminate this SPOF, you can use keepalived - all you need is an extra virtual IP address http://www.keepalived.org/)
@@ -37,12 +35,12 @@ Layer 4 load balancing 和 Layer 7 load balancing
## 负载均衡算法
-1、roundrobin
-表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
-2、leastconn
-连接数最少的服务器优先接收连接。leastconn建议用于长会话服务,例如LDAP、SQL、TSE等,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
-4、source
-对请求源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器; 该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;
+1、roundrobin
+表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
+2、leastconn
+连接数最少的服务器优先接收连接。leastconn建议用于长会话服务,例如LDAP、SQL、TSE等,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
+4、source
+对请求源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器; 该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;
@@ -122,7 +120,7 @@ The following events can make the hash change and so may redirect traffic differ
The main issue with source IP hash loadbalancing algorithm, is that each change can redirect EVERYBODY to a different server!!! That’s why, some good load-balancers have implemented a consistent hashing method which ensure that if a server fails, for example, only the client connected to this server are redirected. The counterpart of consistent hashing is that it doesn’t provide a perfect hash, and so, in a farm of 4 servers, some may receive more clients than others. Note that when a failed server comes back, its “sticked” users (determined by the hash) will be redirected to it.
使用 stick-table
-to store the source IP address and the affected server from the pool. 使用 non-deterministic load-balance 算法(如 leastconn, roundrobin)Once a client is sticked to a server, he’s sticked until the entry in the table expires OR the server fails.main advantage of using a stick table is that when a failed server comes back, no existing sessions will be redirected to it. Only new incoming IPs can reach it. So no impact on users.possible to synchronize tables in memory between multiple HAProxy
+to store the source IP address and the affected server from the pool. 使用 non-deterministic load-balance 算法(如 leastconn, roundrobin)Once a client is sticked to a server, he’s sticked until the entry in the table expires OR the server fails.main advantage of using a stick table is that when a failed server comes back, no existing sessions will be redirected to it. Only new incoming IPs can reach it. So no impact on users.possible to synchronize tables in memory between multiple HAProxy
stick-table type ip size 1m expire 1h
stick 等指令
@@ -143,7 +141,7 @@ LB 算法 - to pick up server from a web farm to forward your client requests to
第二种是默认的(session等数据是中央存储)
-第三种:source IP affinity is the latest method to use when you want to “stick” a user to a server.()最后之选)-
+第三种:source IP affinity is the latest method to use when you want to “stick” a user to a server.()最后之选)-
第四种:use is the Session Cookie, either set by the load-balancer itself or using one set up by the application server.
注意区分 persistence and affinity
@@ -177,3 +175,4 @@ backend bk_web
(You can use cookie based persistence but socket.io doesn't send a JSESSIONID or the like back to the proxy server)
+
diff --git a/source/gf17q1/rancher-for-gfchat-test.md b/source/gf17q1/rancher-for-gfchat-test.md
new file mode 100644
index 0000000..67c7d4a
--- /dev/null
+++ b/source/gf17q1/rancher-for-gfchat-test.md
@@ -0,0 +1,20 @@
+
+
+- 开通 rancher 测试环境的受限帐号用于测试或前端等人员。
+- 告知应用和 db 的访问方式
+- 告知查看应用的日志,查看mongod 日志,进入 mongodb shell 的方式
+
+
+
+
+
+http://10.2.121.166:8123/env/1a5/apps/stacks/1st5/services/1s6/containers
+
+
+
+
+
+
+
+
+
diff --git a/source/gf17q1/system-design-primer.md b/source/gf17q1/system-design-primer.md
new file mode 100644
index 0000000..5c0b329
--- /dev/null
+++ b/source/gf17q1/system-design-primer.md
@@ -0,0 +1,98 @@
+
+# 架构原则的考量
+
+## Performance vs Scalability
+
+## Latency vs Throughout
+
+## Availability vs Consistency
+
+## CAP theorem
+
+## Consistency Patterns
+
+## Availability Patterns
+
+
+
+# 传统 Web 架构的考量
+
+## Domain name osystem
+
+## CDN
+
+- push CDNs
+- pull CDNs
+
+## Load Balancer
+
+- Availability
+- layer 4 load balancing
+- layer 7 load balancing
+- horizontal scaling
+
+## Reverse proxy
+
+## Application layer
+
+## Database
+
+RDBMS
+
+- master-slave replication
+- master-master replication
+- federation
+- sharding
+- denormalization
+- SQL tunning
+
+NOSQL
+
+- key-value store
+- document store
+- wide column store
+- graph database
+
+SQL or NoSQL 对比
+
+
+## Cache 缓存
+
+- client caching
+- CDN caching
+- web server caching
+- database caching
+- application caching
+- when to update the cache (模式和区别)
+ - cache-aside
+ - write-through
+ - write-behind(write-back)
+ - refresh-ahead
+
+## Async 异步
+
+- message queues
+- task queues
+- back pressure
+
+## Communication 通信
+
+- HTTP
+- TCP
+- UDP
+- RPC
+- REST
+
+
+## Security 安全
+
+## Appendix 附录
+
+- Powers of two table
+- Latency numbers
+- addition system design(各种系统)
+- company architecture
+- company engineering blogs
+
+
+
diff --git a/source/gf17q1/temp.md b/source/gf17q1/temp.md
new file mode 100644
index 0000000..0312b50
--- /dev/null
+++ b/source/gf17q1/temp.md
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+Django Packages is a directory of reusable apps, sites, tools, and more for your Django projects. https://djangopackages.org/
+Grids let you compare Django packages to each other. A grid comes with a number of default items compared, but you can add more features in order to get a more specific comparison.
+For now, we are trying out Django Packages without the traditional tagging system, because we think that grids give us a lot more specificity.
+
+
+
+
+
+GitHut http://githut.info/
+A SMALL PLACE TO DISCOVER LANGUAGES IN GITHUB
+尽管数据过期了(到14年底),但是还是会帮我们发现很多有趣的信息。 GitHub Archive dataset is also available via Google BigQuery.
+The quantitative data used in GitHut is collected from GitHub Archive. The data is updated on a quarterly basis.
+
+
+
+
+
+
+
+
+
+Repo Badge
+
+https://img.shields.io/github/downloads/atom/atom/total.svg
+
+
+https://img.shields.io/github/contributors/cdnjs/cdnjs.svg
+https://img.shields.io/github/issues-pr/cdnjs/cdnjs.svg
+https://img.shields.io/github/issues/badges/shields.svg
+https://img.shields.io/github/stars/facebookincubator/create-react-app.svg
+https://img.shields.io/gitter/room/nwjs/nw.js.svg
+
+Todo: 反应 repo commits frequency 的 badge
+https://github.com/badges/shields/
+
+If your GitHub badge errors, it might be because you hit GitHub's rate limits.
+You can increase Shields.io's rate limit by going to this page to add Shields as a GitHub application on your GitHub account.
+https://img.shields.io/github-auth
+
+
+
+
+
diff --git a/source/gfq4/clickegg-im-monitor.md b/source/gfq4/clickegg-im-monitor.md
new file mode 100644
index 0000000..81a64e5
--- /dev/null
+++ b/source/gfq4/clickegg-im-monitor.md
@@ -0,0 +1,46 @@
+
+
+
+股票黑名单 /parrot/io/periphery/censor.js
+timing('blacklist.elapsedTime', response.elapsedTime);
+
+
+
+
+socket.io 异常 /parrot/io/request-handler.js
+
+
+
+jobs/process-monitor-job:
+gauge('instance.cpu.' + body.replace(/\./g, '_'), _.round(stat.cpu));
+instance.mem
+请求 http://169.254.169.254/latest/meta-data/public-ipv4
+
+
+jobs/update-group-message-count-job:
+gauge('chat.group.hour', sum);
+gauge('chat.private.hour', sum);
+使用mongodb find, distinct, count 等
+
+Route: api/broadcast::
+db.sendMessage.error
+api.lightning.broadcast
+db.sendMessage.broadcast.timeout
+api.broadcast
+api.cache.broadcast
+cache.broadcast.to.length
+
+无效的:
+api.revoke
+
+
+聊天中间件评估
+
+
+
+
+
+
+
+
+
diff --git a/gfq4/go-microservices-base.md b/source/gfq4/go-microservices-base.md
similarity index 90%
rename from gfq4/go-microservices-base.md
rename to source/gfq4/go-microservices-base.md
index 842b1ac..d24e376 100644
--- a/gfq4/go-microservices-base.md
+++ b/source/gfq4/go-microservices-base.md
@@ -1,8 +1,3 @@
----
-title: go microservice basic
-date: 2017-01-11
----
-
对微服务下重要的组件如 Consul (用于服务发现和分布式键值数据库),Prometheus(服务监控系统和时间序列数据库,做应用的instrument),Zipkin/appdash 分布式系统跟踪系统(背后Dapper以低消耗、对应用透明以及良好的扩展性著称(收集性能数据,便于优化性能瓶颈
@@ -41,9 +36,9 @@ biz业务指标 - 最终体现
Prometheus是主动去采集pull,而不是通过agent埋点push
-pull problems - short lived jobs (通过 pushgateway)
-target discovery (结合 consul,新的监控实例通过consul,而不需要动态调整实例后更新'prometheus'配置的targets)
-最好是跑在一个网络下(不需要公网)
+pull problems - short lived jobs (通过 pushgateway)
+target discovery (结合 consul,新的监控实例通过consul,而不需要动态调整实例后更新'prometheus'配置的targets)
+最好是跑在一个网络下(不需要公网)
pull advantages:
multiple prometheus easy (高可用 - run multiple parameters service and point them at the same exports 就可以了),(譬如多个环境的,只需要启动test下的P然后target指定原来的,多pull就好)
@@ -62,7 +57,7 @@ setInterval(function() {
}, 500);
rate(test_counter[20s])
-sum(rate(test_counter[20s])) 多个序列如不同的label的求和(这个metrics每秒变化的个数)
+sum(rate(test_counter[20s])) 多个序列如不同的label的求和(这个metrics每秒变化的个数)
rate - 这个counter 1s中增加x个值(在5m观察范围内 - 小一些可以看出更抖动的速率攀升)
@@ -71,31 +66,31 @@ setInterval(function() {
h.labels('200').observe(Math.random());
}, Math.random()*6000);
-histogram_quantile(
- 0.9, rate(
- test_histogram_bucket[10m]
-))
+histogram_quantile(
+ 0.9, rate(
+ test_histogram_bucket[10m]
+))
## alert
-Prometheus 启动时要被告知 alertmanager.url,同时它的配置文件要知道什么时候告警。rule 如下: 当遇到告警告诉给alertmanager,alert manager 根据它自己的配置怎么怎么处理(如aggregation、silencing、inhibition 后再 send notification via receiver 等)
+Prometheus 启动时要被告知 alertmanager.url,同时它的配置文件要知道什么时候告警。rule 如下: 当遇到告警告诉给alertmanager,alert manager 根据它自己的配置怎么怎么处理(如aggregation、silencing、inhibition 后再 send notification via receiver 等)
-安装:
+安装:
$ GO15VENDOREXPERIMENT=1 go get github.com/prometheus/alertmanager/cmd/...
$ cd $GOPATH/src/github.com/prometheus/alertmanager
$ alertmanager -config.file=
-然后进入到 # cd $GOPATH/src/github.com/prometheus/alertmanager examples 中运行echo 和 ha中的测试
+然后进入到 # cd $GOPATH/src/github.com/prometheus/alertmanager examples 中运行echo 和 ha中的测试
该规则就是当 gauge 指标large then 0.9 就把一些信息汇总并且报告(其他配置在config中如group by, wait, interval 等
-ALERT APIRandomLarge09
- IF test_gauge > 0.9
- ANNOTATIONS {
- summary = "node client gauge random large than 0.95 on {{ $labels.instance }}",
- description = "{{ $labels.instance }} random value is (current value: {{ $value }}s)",
- }
+ALERT APIRandomLarge09
+ IF test_gauge > 0.9
+ ANNOTATIONS {
+ summary = "node client gauge random large than 0.95 on {{ $labels.instance }}",
+ description = "{{ $labels.instance }} random value is (current value: {{ $value }}s)",
+ }
界面:
@@ -115,7 +110,7 @@ Recorder: Recorder是用来发送event给Appdash的Collector的,每个Recorder
Collector: 从Recorder那接收Annotation(即encoded event)。通常一个appdash server会运行一个Collector,监听某个跟踪信息收集端口,将收到的信息存储在Store中
譬如http用户请求背后 by calling other components in your system, which in turn make various API and DB calls(The HTTP handler's span includes all downstream operations and their descendents) appdash constructs a tree of all the oeprations(during the handling of the http request)
-Appdash中SpanId由三部分组成:TraceID/SpanID/parentSpanID
+Appdash中SpanId由三部分组成:TraceID/SpanID/parentSpanID
frontservice: SpanId = xxxxx/nnnn1,该span为root span:traceid=xxxxx, spanid=nnnn1,parent span id为空。
serviceB1: SpanId = xxxxx/nnnn3-1/nnnn3,该span为serviceB的child span,traceid=xxxxx, spanid=nnnn3-1,parent span id为serviceB的spanid:nnnn3
@@ -130,10 +125,14 @@ $GOPATH/bin/appdash demo
构建一个高可用的分布式键值数据库,基于Go。分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题
-运行 consul: consul agent -dev
+运行 consul: consul agent -dev
浏览如下地址: localhost:8500
echo '{"service": {"name": "stringsvc", "tags": [], "port": 8080}}' \
| sudo tee /etc/consul.d/stringsvc.json
-
+

+
+
+
+
diff --git a/gfq4/golang-learn.md b/source/gfq4/golang-learn.md
similarity index 95%
rename from gfq4/golang-learn.md
rename to source/gfq4/golang-learn.md
index ebd79fc..7006b68 100644
--- a/gfq4/golang-learn.md
+++ b/source/gfq4/golang-learn.md
@@ -1,15 +1,11 @@
----
-title: Go Dev Env Setting
-date: 2017-01-08
----
### 安装和上手
安装:
https://golang.org/doc/install#install
-mac package installer -
+mac package installer -
go 执行文件在 /usr/local/go 下
-$PATH 环境变量下添加 /usr/local/go/bin
+$PATH 环境变量下添加 /usr/local/go/bin
使用:
在你的dotfiles中(.bashrc或.zshrc )添加如下:
@@ -101,7 +97,7 @@ Gocode提供上下文敏感的自动完成,并使用客户端/服务器体系
主要讲在 atom 中一些插件和配置的使用
-安装主题(如 monokai-seti),编程字体(Hack或Inconsolata),语法支持(如Docker,protobuf
+安装主题(如 monokai-seti),编程字体(Hack或Inconsolata),语法支持(如Docker,protobuf
安装 go-plus 编辑器插件(提供构建支持,linters检查工具,格式化和覆盖率工具,还有一些代码补全snippets等
它背后需要go-plus支持(通过命令行 go get 安装 go get -u golang.org/x/tools/cmd/...
@@ -115,7 +111,7 @@ PS:网络超时问题可以使用 http_proxy 命令行环境变量设置代理
- debug调试工具 delve
brew install go-delve/delve/delve
https://github.com/derekparker/delve/tree/master/Documentation/cli
-
+
#### 其他 Atom 配置:
@@ -125,15 +121,18 @@ PS:网络超时问题可以使用 http_proxy 命令行环境变量设置代理
- Dash 集成(可以在编辑器中快捷调转到 dash 中对应文档 https://atom.io/packages/dash:
ctrl-h 在dash中查找文档
- terminal集成(对比 terminal-plus 和 atom-term2
-
+
修复term2 安装问题:
cd ~/.atom/packages
git clone https://github.com/svenax/atom-term2.git
cd atom-term2
-git checkout update-pty.js
+git checkout update-pty.js
apm install
-sudo apm link
+sudo apm link
reference:http://marcio.io/2015/07/supercharging-atom-editor-for-go-development/

+
+
+
diff --git a/gfq4/golang-microservices.md b/source/gfq4/golang-microservices.md
similarity index 96%
rename from gfq4/golang-microservices.md
rename to source/gfq4/golang-microservices.md
index 4645106..ef0371e 100644
--- a/gfq4/golang-microservices.md
+++ b/source/gfq4/golang-microservices.md
@@ -1,6 +1,3 @@
----
-title: Go Basic
----
## Golang 语言特点
@@ -40,7 +37,7 @@ CI/CD:Drone
## Golang 编写微服务
-开发一个服务很简单。譬如用户服务,它通过http进行serve(使用简单的net/http.Serve来编写.
+开发一个服务很简单。譬如用户服务,它通过http进行serve(使用简单的net/http.Serve来编写.
但是当你的系统由很多这样的服务组成,它们可能会:不同的管理错误的方法,不同后天日志记录格式,处理malicious请求的理念。同时,这样的架构(微服务)需要不少管道plumbing支持(沟通各个组件和服务之间)。如连接池、安全性校核、从错误中优雅的恢复、管理度量和instrumentation、路由日记等等
所以我们使用 go-kit 来提供这些 microservice plumbing 的工作(对比下来 node社区这些还是比较少,没法容易的cloud-native的应用)
@@ -60,12 +57,12 @@ $GOPATH/bin/stringsvc3 -listen=:8080 -proxy=localhost:8001,localhost:8002,localh
测试:
for s in foo bar baz ; do curl -d"{\"s\":\"$s\"}" localhost:8080/uppercase ; done
-使用 endpoint 中间件来 transport-domain concerns. 譬如 circuit breaking 和 rate limiting.
-使用 service 中间件来 business-domain concerns - 譬如 logging and instrumentation
+使用 endpoint 中间件来 transport-domain concerns. 譬如 circuit breaking 和 rate limiting.
+使用 service 中间件来 business-domain concerns - 譬如 logging and instrumentation
PS:
中间件 - take endpoint and returns endpoint
-pass a logger directly into our stringService implementation, but there’s a better way. Let’s use a middleware, also known as a decorator.
+pass a logger directly into our stringService implementation, but there’s a better way. Let’s use a middleware, also known as a decorator.
代码示例:
@@ -121,3 +118,5 @@ retry := lb.Retry(maxAttempts, maxTime, balancer)
其他术语:
subscriber:adapters(它使用提供的工厂函数将每个发现的实例字符串转换为可用的endpoint)
+
+
diff --git a/gfq4/learning-elk-stack.md b/source/gfq4/learning-elk-stack.md
similarity index 99%
rename from gfq4/learning-elk-stack.md
rename to source/gfq4/learning-elk-stack.md
index d7083db..ff96737 100644
--- a/gfq4/learning-elk-stack.md
+++ b/source/gfq4/learning-elk-stack.md
@@ -1,15 +1,10 @@
----
-title: ELK Stack Learning
-date: 2016-12-30
----
-
最近花了一天时间,根据 ELK 这本书(笔记如下),然后在 AWS 上的机器上搭建做了试验(机器和一些fixtures 数据在),感兴趣的同学可以到机器上继续实验。
机器如下:
Host devaws.gf
Hostname 54.222.242.232
User ubuntu
-
+
目录如下:
```sh
@@ -37,8 +32,8 @@ services:
- "3001:5601"
```
-
-
+
+
## 1: INTRODUCTION TO ELK STACK
@@ -347,3 +342,5 @@ http://[your_host]:9200/[your_index_name_here]/[your_type_here]/[your_doc_id]

+
+
diff --git a/gfq4/lint-nodejs.md b/source/gfq4/lint-nodejs.md
similarity index 97%
rename from gfq4/lint-nodejs.md
rename to source/gfq4/lint-nodejs.md
index 16c1a4c..7372b19 100644
--- a/gfq4/lint-nodejs.md
+++ b/source/gfq4/lint-nodejs.md
@@ -1,8 +1,3 @@
----
-title: 迁移遗留项目 Linting Nodejs
-date: 2017-04-01
----
-
Git 仓库的代码保持良好优化统一的代码风格(style-guide),是该项目是否易于维护和持续开发的基础条件。我们要把linting & formating 加入到开发的workflow中得以保证(如npm test 前或git commit hook前)。
但是难免有时候接受老项目代码或者之前项目没有严格执行 linting 等,这时候就需要我们全局统一做一次 refactor 来处理,便于为以后的良好遵守童子军原则提供好的基础。
PS:童子军原则:eave the campground cleaner than you found it. 他们在离开营地前要收拾自己带来的垃圾甚至是前任留下的,确保走之后被来之前更干净。
@@ -36,7 +31,7 @@ yarn add eslint --dev
配置文件如下:
其中 config-airbnb-base 为 配置文件中 extends 的配置值,它是以 Github 上流行的 airbnb JavaScript StyleGuide 为基础提供的rules配置集合。
-同时 eslint-plugin-import 是 插件,为我们提供额外的 rules
+同时 eslint-plugin-import 是 插件,为我们提供额外的 rules
最后, babel-eslint 是 parser(因为我们代码中涉及ES2016/ES7 code like async and await),用它来取代默认的 Espree parser.
@@ -88,10 +83,10 @@ yarn add eslint --dev
- no-return-assign: Disallow Assignment in return Statement
不要在函数 body 结尾出现类似于 return foo = bar + 2;
--
+-
module.exports = (router) => { 对于arrow function 需要有() 对param
-- no-undef:
+- no-undef:
不要出现使用没有先定义好的变量和函数(global或hoist),对于mocha等测试工具提供的 describe, after, it 等,可以通过配置 .eslintrc 环境有 mocha:
"mocha": true // adds all of the Mocha testing global variables
@@ -111,19 +106,19 @@ module.exports = (router) => { 对于arrow function 需要有() 对param
require require() calls to be placed at top-level module scope
要求把所有的 require(module) 放在文件开头便于明确该文件模块的依赖
-- max-len:
+- max-len:
该行代码字符不要超过100字符
-- no-empty:
+- no-empty:
- camelcase:
变量名风格统一,如 crsf_token 改为 crsfToken
- prefer-rest-params:
-不要在代码中出现使用特殊的 arguments,而是直接使用 rest parameters
+不要在代码中出现使用特殊的 arguments,而是直接使用 rest parameters
- import/no-extraneous-dependencies
-报错信息:'supertest' should be listed in the project's dependencies, not devDependencies. 而我们知道在测试脚本中需要运用在 devDependencies 的依赖,所以需要配置放行如下:
+报错信息:'supertest' should be listed in the project's dependencies, not devDependencies. 而我们知道在测试脚本中需要运用在 devDependencies 的依赖,所以需要配置放行如下:
"import/no-extraneous-dependencies": ["error", {"devDependencies": ["**/test/*.js"]}]
@@ -179,3 +174,6 @@ module.exports = {
};
```
+
+
+
diff --git a/gfq4/media/14834316674994.jpg b/source/gfq4/media/14834316674994.jpg
similarity index 100%
rename from gfq4/media/14834316674994.jpg
rename to source/gfq4/media/14834316674994.jpg
diff --git a/gfq4/media/14834943241158.jpg b/source/gfq4/media/14834943241158.jpg
similarity index 100%
rename from gfq4/media/14834943241158.jpg
rename to source/gfq4/media/14834943241158.jpg
diff --git a/gfq4/media/14834951670141.png b/source/gfq4/media/14834951670141.png
similarity index 100%
rename from gfq4/media/14834951670141.png
rename to source/gfq4/media/14834951670141.png
diff --git a/gfq4/media/14834974901921.jpg b/source/gfq4/media/14834974901921.jpg
similarity index 100%
rename from gfq4/media/14834974901921.jpg
rename to source/gfq4/media/14834974901921.jpg
diff --git a/gfq4/media/14834977968636.jpg b/source/gfq4/media/14834977968636.jpg
similarity index 100%
rename from gfq4/media/14834977968636.jpg
rename to source/gfq4/media/14834977968636.jpg
diff --git a/gfq4/media/14846525018592.jpg b/source/gfq4/media/14846525018592.jpg
similarity index 100%
rename from gfq4/media/14846525018592.jpg
rename to source/gfq4/media/14846525018592.jpg
diff --git a/gfq4/media/14846525311092.jpg b/source/gfq4/media/14846525311092.jpg
similarity index 100%
rename from gfq4/media/14846525311092.jpg
rename to source/gfq4/media/14846525311092.jpg
diff --git a/gfq4/media/14846525923851.jpg b/source/gfq4/media/14846525923851.jpg
similarity index 100%
rename from gfq4/media/14846525923851.jpg
rename to source/gfq4/media/14846525923851.jpg
diff --git a/gfq4/media/14846583335662.jpg b/source/gfq4/media/14846583335662.jpg
similarity index 100%
rename from gfq4/media/14846583335662.jpg
rename to source/gfq4/media/14846583335662.jpg
diff --git a/gfq4/media/14846589219168.jpg b/source/gfq4/media/14846589219168.jpg
similarity index 100%
rename from gfq4/media/14846589219168.jpg
rename to source/gfq4/media/14846589219168.jpg
diff --git a/gfq4/media/14847065322192.jpg b/source/gfq4/media/14847065322192.jpg
similarity index 100%
rename from gfq4/media/14847065322192.jpg
rename to source/gfq4/media/14847065322192.jpg
diff --git a/gfq4/media/14847080378110.jpg b/source/gfq4/media/14847080378110.jpg
similarity index 100%
rename from gfq4/media/14847080378110.jpg
rename to source/gfq4/media/14847080378110.jpg
diff --git a/gfq4/media/14847081372709.jpg b/source/gfq4/media/14847081372709.jpg
similarity index 100%
rename from gfq4/media/14847081372709.jpg
rename to source/gfq4/media/14847081372709.jpg
diff --git a/gfq4/media/14847200609370.jpg b/source/gfq4/media/14847200609370.jpg
similarity index 100%
rename from gfq4/media/14847200609370.jpg
rename to source/gfq4/media/14847200609370.jpg
diff --git a/gfq4/media/14847203020083.jpg b/source/gfq4/media/14847203020083.jpg
similarity index 100%
rename from gfq4/media/14847203020083.jpg
rename to source/gfq4/media/14847203020083.jpg
diff --git a/gfq4/media/14852231170475.jpg b/source/gfq4/media/14852231170475.jpg
similarity index 100%
rename from gfq4/media/14852231170475.jpg
rename to source/gfq4/media/14852231170475.jpg
diff --git a/gfq4/media/14852239280794.jpg b/source/gfq4/media/14852239280794.jpg
similarity index 100%
rename from gfq4/media/14852239280794.jpg
rename to source/gfq4/media/14852239280794.jpg
diff --git a/gfq4/media/14852253516778.jpg b/source/gfq4/media/14852253516778.jpg
similarity index 100%
rename from gfq4/media/14852253516778.jpg
rename to source/gfq4/media/14852253516778.jpg
diff --git a/gfq4/media/14852254541171.jpg b/source/gfq4/media/14852254541171.jpg
similarity index 100%
rename from gfq4/media/14852254541171.jpg
rename to source/gfq4/media/14852254541171.jpg
diff --git a/gfq4/media/14852254787994.jpg b/source/gfq4/media/14852254787994.jpg
similarity index 100%
rename from gfq4/media/14852254787994.jpg
rename to source/gfq4/media/14852254787994.jpg
diff --git a/gfq4/media/14852255045760.jpg b/source/gfq4/media/14852255045760.jpg
similarity index 100%
rename from gfq4/media/14852255045760.jpg
rename to source/gfq4/media/14852255045760.jpg
diff --git a/gfq4/media/14852255832828.jpg b/source/gfq4/media/14852255832828.jpg
similarity index 100%
rename from gfq4/media/14852255832828.jpg
rename to source/gfq4/media/14852255832828.jpg
diff --git a/gfq4/media/14852261321049.jpg b/source/gfq4/media/14852261321049.jpg
similarity index 100%
rename from gfq4/media/14852261321049.jpg
rename to source/gfq4/media/14852261321049.jpg
diff --git a/gfq4/media/14852268968175.jpg b/source/gfq4/media/14852268968175.jpg
similarity index 100%
rename from gfq4/media/14852268968175.jpg
rename to source/gfq4/media/14852268968175.jpg
diff --git a/gfq4/media/14852269146979.jpg b/source/gfq4/media/14852269146979.jpg
similarity index 100%
rename from gfq4/media/14852269146979.jpg
rename to source/gfq4/media/14852269146979.jpg
diff --git a/gfq4/media/14852274622700.jpg b/source/gfq4/media/14852274622700.jpg
similarity index 100%
rename from gfq4/media/14852274622700.jpg
rename to source/gfq4/media/14852274622700.jpg
diff --git a/gfq4/media/14852280998705.jpg b/source/gfq4/media/14852280998705.jpg
similarity index 100%
rename from gfq4/media/14852280998705.jpg
rename to source/gfq4/media/14852280998705.jpg
diff --git a/gfq4/media/14852281023114.jpg b/source/gfq4/media/14852281023114.jpg
similarity index 100%
rename from gfq4/media/14852281023114.jpg
rename to source/gfq4/media/14852281023114.jpg
diff --git a/gfq4/media/14852281051955.jpg b/source/gfq4/media/14852281051955.jpg
similarity index 100%
rename from gfq4/media/14852281051955.jpg
rename to source/gfq4/media/14852281051955.jpg
diff --git a/gfq4/media/14852281094811.jpg b/source/gfq4/media/14852281094811.jpg
similarity index 100%
rename from gfq4/media/14852281094811.jpg
rename to source/gfq4/media/14852281094811.jpg
diff --git a/gfq4/media/14866934548032.jpg b/source/gfq4/media/14866934548032.jpg
similarity index 100%
rename from gfq4/media/14866934548032.jpg
rename to source/gfq4/media/14866934548032.jpg
diff --git a/gfq4/media/14866936893309.jpg b/source/gfq4/media/14866936893309.jpg
similarity index 100%
rename from gfq4/media/14866936893309.jpg
rename to source/gfq4/media/14866936893309.jpg
diff --git a/gfq4/media/14866940745313.jpg b/source/gfq4/media/14866940745313.jpg
similarity index 100%
rename from gfq4/media/14866940745313.jpg
rename to source/gfq4/media/14866940745313.jpg
diff --git a/gfq4/media/14866941483984.jpg b/source/gfq4/media/14866941483984.jpg
similarity index 100%
rename from gfq4/media/14866941483984.jpg
rename to source/gfq4/media/14866941483984.jpg
diff --git a/gfq4/media/14866941509609.jpg b/source/gfq4/media/14866941509609.jpg
similarity index 100%
rename from gfq4/media/14866941509609.jpg
rename to source/gfq4/media/14866941509609.jpg
diff --git a/gfq4/media/14882714600496.jpg b/source/gfq4/media/14882714600496.jpg
similarity index 100%
rename from gfq4/media/14882714600496.jpg
rename to source/gfq4/media/14882714600496.jpg
diff --git a/gfq4/media/14882716888420.jpg b/source/gfq4/media/14882716888420.jpg
similarity index 100%
rename from gfq4/media/14882716888420.jpg
rename to source/gfq4/media/14882716888420.jpg
diff --git a/gfq4/media/14882719182746.jpg b/source/gfq4/media/14882719182746.jpg
similarity index 100%
rename from gfq4/media/14882719182746.jpg
rename to source/gfq4/media/14882719182746.jpg
diff --git a/gfq4/media/14882722775339.jpg b/source/gfq4/media/14882722775339.jpg
similarity index 100%
rename from gfq4/media/14882722775339.jpg
rename to source/gfq4/media/14882722775339.jpg
diff --git a/gfq4/media/14882723710113.jpg b/source/gfq4/media/14882723710113.jpg
similarity index 100%
rename from gfq4/media/14882723710113.jpg
rename to source/gfq4/media/14882723710113.jpg
diff --git a/gfq4/media/14882725923226.jpg b/source/gfq4/media/14882725923226.jpg
similarity index 100%
rename from gfq4/media/14882725923226.jpg
rename to source/gfq4/media/14882725923226.jpg
diff --git a/gfq4/media/14882732338204.jpg b/source/gfq4/media/14882732338204.jpg
similarity index 100%
rename from gfq4/media/14882732338204.jpg
rename to source/gfq4/media/14882732338204.jpg
diff --git a/gfq4/media/14882735890112.jpg b/source/gfq4/media/14882735890112.jpg
similarity index 100%
rename from gfq4/media/14882735890112.jpg
rename to source/gfq4/media/14882735890112.jpg
diff --git a/gfq4/media/14882737314872.jpg b/source/gfq4/media/14882737314872.jpg
similarity index 100%
rename from gfq4/media/14882737314872.jpg
rename to source/gfq4/media/14882737314872.jpg
diff --git a/gfq4/media/14882737381242.jpg b/source/gfq4/media/14882737381242.jpg
similarity index 100%
rename from gfq4/media/14882737381242.jpg
rename to source/gfq4/media/14882737381242.jpg
diff --git a/gfq4/media/14882739459981.jpg b/source/gfq4/media/14882739459981.jpg
similarity index 100%
rename from gfq4/media/14882739459981.jpg
rename to source/gfq4/media/14882739459981.jpg
diff --git a/gfq4/rancher-chat-stack.md b/source/gfq4/rancher-chat-stack.md
similarity index 98%
rename from gfq4/rancher-chat-stack.md
rename to source/gfq4/rancher-chat-stack.md
index cde3a7d..7e462e9 100644
--- a/gfq4/rancher-chat-stack.md
+++ b/source/gfq4/rancher-chat-stack.md
@@ -1,7 +1,3 @@
----
-title: Node.js Chat Service with Rancher
-date: 2017-04-04
----
### 背景介绍:
聊天服务部署在云上 AWS 上,由于费用问题(比起自建机房高出很多,如去年就花费了三四百万元)还有若干网络问题(AWS Zone north-cn 到广发广州的马场机房网络质量很差)等,今年觉得把服务迁移下云。AWS 环境独立存在也部署了不少基础服务如 docker-aws.gf docker registry,stats/graphite/grafana 等。
@@ -93,7 +89,7 @@ services:
- redis
environment:
NODE_ENV_MODIFIER: rancher
- RUNTIME_MODE: rancher
+ RUNTIME_MODE: rancher
# HTTP_PORT: 3001
DISABLE_HEARTBEAT: true
SOCKETIO_LB_HOST: parrot-socketIO:3000
@@ -109,7 +105,7 @@ services:
- redis
environment:
NODE_ENV_MODIFIER: rancher
- RUNTIME_MODE: rancher
+ RUNTIME_MODE: rancher
# HTTP_PORT: 3000
DISABLE_HEARTBEAT: false
REDIS_HOST: redis
@@ -130,7 +126,7 @@ services:
为了数据存储卷的独立和后续更新调整应用stack时,保证数据的迁移和持久化,我们把数据独立出来作为单独的 stack,而应用stack只需要通过external link的形式消费和使用
-这里使用了 io.rancher.sidekicks 帮 mongodata 和 mongo 服务绑在一起,让 rancher cattle 等编排时候确保是同主机同 ratio scale
+这里使用了 io.rancher.sidekicks 帮 mongodata 和 mongo 服务绑在一起,让 rancher cattle 等编排时候确保是同主机同 ratio scale
```yml
version: '2'
@@ -191,7 +187,7 @@ Rancher 内置的LB 服务是使用HAProxy,而它在 1.5 版本就有对 webso
- 通过添加timeout tunnel 配置为 3600s 在自定义的 haproxy.conf 的默认段中来保持链接维持
- balance 的策略使用 source (来自于同一个IP的被分发到同一台主机means that connections will be assigned to a webserver based on IP address. 因为 from socket.io performing its handshake in the beginning. This means that the second request must end up with the same server as the first one
-
+
```yml
backend websockets
balance source
@@ -199,16 +195,16 @@ Rancher 内置的LB 服务是使用HAProxy,而它在 1.5 版本就有对 webso
option forceclose
server ws-server1 [Address]:[Port] weight 1 maxconn 1024 check
```
-
+
后续为了查看 LB 的一些数据,要打开如下配置:
-
+
stats enable
- stats hide-version
+ stats hide-version
stats realm Haproxy\ Statistics
stats uri /haproxy?stats
stats auth Username:Password
-
-
+
+
```yml
socketio-lb:
image: rancher/lb-service-haproxy:v0.4.6
@@ -236,7 +232,7 @@ Rancher 内置的LB 服务是使用HAProxy,而它在 1.5 版本就有对 webso
nocache: false
postonly: false
```
-
+
### 压力测试:
@@ -273,7 +269,7 @@ fab -H [LIST OF HOSTS] -u [USER] -P -- websocket-bench -a 1000 -c 200 http://my-
jsinspect -t 30 --ignore parrot/public/libs -s 5 -D -i .
625 matches found across 181 files
-
+

@@ -281,3 +277,5 @@ jsinspect -t 30 --ignore parrot/public/libs -s 5 -D -i .


+
+
diff --git a/source/gfq4/sentry-intro.md b/source/gfq4/sentry-intro.md
new file mode 100644
index 0000000..379df34
--- /dev/null
+++ b/source/gfq4/sentry-intro.md
@@ -0,0 +1,10 @@
+
+Sentry 错误日志收集
+Sentry是一个错误日志服务器,可以将程序错误的详细情况集中捕获。而且提供各种常见语言的SDK供业务接入。但Sentry在服务器端会有采样,一般不能替代实时错误日志报警的监控。
+
+
+
+
+
+
+
diff --git a/gfq4/using-docker.md b/source/gfq4/using-docker.md
similarity index 98%
rename from gfq4/using-docker.md
rename to source/gfq4/using-docker.md
index 7eaf976..8089822 100644
--- a/gfq4/using-docker.md
+++ b/source/gfq4/using-docker.md
@@ -1,7 +1,3 @@
----
-title: Using Docker 读书笔记
-tags: ['读书笔记']
----
### Running without sudo
@@ -20,7 +16,7 @@ Docker uses union file system(UFS) for containers - which allows multiple filesy
### 容器状态
created, restarting, running, paused, exited.
-status=exited/stopped (可以被restart)
+status=exited/stopped (可以被restart)
docker rm $(docker ps -aq)
@@ -42,7 +38,7 @@ CMD given instruction when the container is started. If an ENTRYPOINT has been d
// chmod +x entrypoint.sh.
#!/bin/bash
if [ $# -eq 0 ]; then
- /usr/games/fortune | /usr/games/cowsay
+ /usr/games/fortune | /usr/games/cowsay
else
/usr/games/cowsay "$@"
fi
@@ -59,7 +55,7 @@ practice is to create data containers—containers whose sole purpose is to shar
docker run --name dbdata postgres echo "Data-only container for postgres"
docker run -d --volumes-from dbdata --name db1 postgres
-后续:a top-level “volume” command that will allow you to list, create, inspect, and remove volumes independent of containers. This is expected to land in 1.9, 避免 orphans files and directories in Docker directory
+后续:a top-level “volume” command that will allow you to list, create, inspect, and remove volumes independent of containers. This is expected to land in 1.9, 避免 orphans files and directories in Docker directory
### 容器 Volume
@@ -136,7 +132,7 @@ focused entirely on running containers 如在数据中心和机器集群中. Cor
A layer is created for each instruction in a Dockerfile and sits on top of the previous layers. When an image is turned into a container (from a docker run or docker create command), the Docker engine takes the image and adds a read-write filesystem on top (as well as initializing various settings such as the IP address, name, ID, and resource limits).
PS: 为了避免多余的layer(limit of 127 layers),try to minimize the number of layers 如 specifying several UNIX commands in a single RUN instruction.
-docker create 为镜像构建容器但不运行.
+docker create 为镜像构建容器但不运行.
build context: the set of local files and directories that can be refer‐ enced from ADD or COPY instructions in the Dockerfile. All the files and directories under the path form the build context and will be sent to the Docker daemon as part of the build process. gathered into a tarball and sent to the Docker daemon, you really don’t want to use a directory with lots of files in it already.
@@ -197,7 +193,7 @@ Copies files and directories between a container and the host.
docker logs Outputs the “logs” for a container. This is simply everything that has been writ‐ ten to STDERR or STDOUT inside the container.
管理容器
-
+
docker diff
Shows changes made to the containers filesystem compared to the image it was launched from. For example:
$ ID=$(docker run -d debian touch /NEW-FILE) $ docker diff $ID A /NEW-FILE
@@ -230,7 +226,7 @@ docker inspect --format {{.NetworkSettings.IPAddress}} PS: 内
image namespace:
Names prefixed with a string and /, such as amouat/revealjs, belong to the “user” namespace. These are images on the Docker Hub that have been uploaded by a given user.
Names such as debian and ubuntu, with no prefixes or /s, belong to “root” name‐ space, which is controlled by Docker Inc. and reserved for the official images for common software and distributions available from the Docker Hub.
-Names prefixed with a hostname or IP are images hosted on third-party regis‐ tries (not the Docker Hub).
+Names prefixed with a hostname or IP are images hosted on third-party regis‐ tries (not the Docker Hub).
@@ -279,7 +275,7 @@ do is aggregate all logs—potentially across hosts—into a single location - m
### ELK 集成
-Logspount:
+Logspount:
use Logspout, a Docker-specific tool that uses the Docker API to stream logs from running containers to a given endpoint (something like rsyslog for Docker).
高效和精简 written in Go and built on top of the extremely minimal Alpine Linux image. + logstash adapter
@@ -303,7 +299,7 @@ Logspout will not gather logs from any container that has the environment vari
Use the “logstash” prefix, which tells Logspout to use the Logstash module for output.
-###
+###
PS:
@@ -318,3 +314,10 @@ to a new file under /etc/logrotate.d/ (e.g., /etc/logrotate.d/docker), or added
missingok
copytruncate
}
+
+
+
+
+
+
+
diff --git a/source/github-serendipity/2017-04-01-1.md b/source/github-serendipity/2017-04-01-1.md
new file mode 100644
index 0000000..5385b5e
--- /dev/null
+++ b/source/github-serendipity/2017-04-01-1.md
@@ -0,0 +1,8 @@
+peek-a-tab, Tabs Manager for Google Chrome. Search, preview, jump across, and close tabs quickly in your chrome browser.
+
+gold-miner项目感觉可以加上一个project,这样文章的翻译进度可以一目了然 (类似于 jira 的 sprint)
+
+
+
+
+
diff --git a/github-serendipity/2017-04-01.md b/source/github-serendipity/2017-04-01.md
similarity index 94%
rename from github-serendipity/2017-04-01.md
rename to source/github-serendipity/2017-04-01.md
index f025b4d..af02559 100644
--- a/github-serendipity/2017-04-01.md
+++ b/source/github-serendipity/2017-04-01.md
@@ -1,17 +1,6 @@
----
-title: 发现项目:2017-04-01
----
Serendipity 漫谈
-peek-a-tab, Tabs Manager for Google Chrome. Search, preview, jump across, and close tabs quickly in your chrome browser.
-
-gold-miner项目感觉可以加上一个project,这样文章的翻译进度可以一目了然 (类似于 jira 的 sprint)
-
-
-
-
-
stdlib: Standard library for JavaScript. 给 JavaScript 提供a collection of robust, high performance libraries for numeric computing, streams, and more.
http://github.com/stdlib-js/stdlib
@@ -31,7 +20,7 @@ tqdm,结合 Loop 展示 ProgressBar。Python
saws - aws cli
haxor-news, haxor-news brings Hacker News to the terminal, allowing you to view/filter the following without leaving your command line:
-
+
Hulk DoS tool - golang 版本(很好利用 goroutine)来allows golang version better consume resources and got much higher connection pool on the same hardware than Python version can.
HULKMAXPROCS=4096 hulk -site http://example.com 2>/tmp/errlog
@@ -100,3 +89,4 @@ https://education.github.com/pack?ref=producthunt
The best developer tools, free for students
for most students, real world tools can be cost prohibitive. That's why we created the GitHub Student Developer Pack with some of our partners and friends: to give students free access to the best developer tools in one place so they can learn by doing.
+
diff --git a/github-serendipity/media/14910520279440.png b/source/github-serendipity/media/14910520279440.png
similarity index 100%
rename from github-serendipity/media/14910520279440.png
rename to source/github-serendipity/media/14910520279440.png
diff --git a/github-serendipity/media/14910524808240.png b/source/github-serendipity/media/14910524808240.png
similarity index 100%
rename from github-serendipity/media/14910524808240.png
rename to source/github-serendipity/media/14910524808240.png
diff --git a/github-serendipity/media/14910531531435.jpg b/source/github-serendipity/media/14910531531435.jpg
similarity index 100%
rename from github-serendipity/media/14910531531435.jpg
rename to source/github-serendipity/media/14910531531435.jpg
diff --git a/github-serendipity/media/14910536801037.png b/source/github-serendipity/media/14910536801037.png
similarity index 100%
rename from github-serendipity/media/14910536801037.png
rename to source/github-serendipity/media/14910536801037.png
diff --git a/github-serendipity/media/14910551281113.png b/source/github-serendipity/media/14910551281113.png
similarity index 100%
rename from github-serendipity/media/14910551281113.png
rename to source/github-serendipity/media/14910551281113.png
diff --git a/github-serendipity/media/14910553554949.png b/source/github-serendipity/media/14910553554949.png
similarity index 100%
rename from github-serendipity/media/14910553554949.png
rename to source/github-serendipity/media/14910553554949.png
diff --git a/github-serendipity/media/14910554816067.jpg b/source/github-serendipity/media/14910554816067.jpg
similarity index 100%
rename from github-serendipity/media/14910554816067.jpg
rename to source/github-serendipity/media/14910554816067.jpg
diff --git a/github-serendipity/media/14910561943685.jpg b/source/github-serendipity/media/14910561943685.jpg
similarity index 100%
rename from github-serendipity/media/14910561943685.jpg
rename to source/github-serendipity/media/14910561943685.jpg
diff --git a/github-serendipity/media/14910564677467.png b/source/github-serendipity/media/14910564677467.png
similarity index 100%
rename from github-serendipity/media/14910564677467.png
rename to source/github-serendipity/media/14910564677467.png
diff --git a/github-serendipity/media/14910565435823.jpg b/source/github-serendipity/media/14910565435823.jpg
similarity index 100%
rename from github-serendipity/media/14910565435823.jpg
rename to source/github-serendipity/media/14910565435823.jpg
diff --git a/github-serendipity/media/14910566449351.png b/source/github-serendipity/media/14910566449351.png
similarity index 100%
rename from github-serendipity/media/14910566449351.png
rename to source/github-serendipity/media/14910566449351.png
diff --git a/github-serendipity/media/14910573638342.png b/source/github-serendipity/media/14910573638342.png
similarity index 100%
rename from github-serendipity/media/14910573638342.png
rename to source/github-serendipity/media/14910573638342.png
diff --git a/github-serendipity/media/14911429565866.jpg b/source/github-serendipity/media/14911429565866.jpg
similarity index 100%
rename from github-serendipity/media/14911429565866.jpg
rename to source/github-serendipity/media/14911429565866.jpg
diff --git a/github-serendipity/media/14911429913283.jpg b/source/github-serendipity/media/14911429913283.jpg
similarity index 100%
rename from github-serendipity/media/14911429913283.jpg
rename to source/github-serendipity/media/14911429913283.jpg
diff --git a/github-serendipity/media/14911447638257.jpg b/source/github-serendipity/media/14911447638257.jpg
similarity index 100%
rename from github-serendipity/media/14911447638257.jpg
rename to source/github-serendipity/media/14911447638257.jpg
diff --git a/github-serendipity/media/14912069721863.jpg b/source/github-serendipity/media/14912069721863.jpg
similarity index 100%
rename from github-serendipity/media/14912069721863.jpg
rename to source/github-serendipity/media/14912069721863.jpg
diff --git a/github-serendipity/media/14912071393811.jpg b/source/github-serendipity/media/14912071393811.jpg
similarity index 100%
rename from github-serendipity/media/14912071393811.jpg
rename to source/github-serendipity/media/14912071393811.jpg
diff --git a/github-serendipity/media/14912100313889.jpg b/source/github-serendipity/media/14912100313889.jpg
similarity index 100%
rename from github-serendipity/media/14912100313889.jpg
rename to source/github-serendipity/media/14912100313889.jpg
diff --git a/github-serendipity/propduct-hunt-0401.md b/source/github-serendipity/propduct-hunt-0401.md
similarity index 96%
rename from github-serendipity/propduct-hunt-0401.md
rename to source/github-serendipity/propduct-hunt-0401.md
index ef5ad8f..44123d0 100644
--- a/github-serendipity/propduct-hunt-0401.md
+++ b/source/github-serendipity/propduct-hunt-0401.md
@@ -1,16 +1,15 @@
----
-draft: true
----
-
Illustrated summaries of bestselling nonfiction books

+
+
+
a smarter place to save anything you find on the internet
1 save any webpage
2 auto categorized
-3
+3
https://stash.ai/skip.html?email=sivagao@126.com (通过隐身窗口打开)
@@ -25,7 +24,7 @@ raindrop.io
收费内容:
Nested collections
-Create as any number of nested collections.
+Create as any number of nested collections.
1 GB of new uploads each month
Images (PNG, JPEG, GIF). Soon: PDF, Mark Down
@@ -62,3 +61,7 @@ So do you have what it takes to build a successful mobile application? Try out M
每天接到一个电话来问你做了什么,然后语音记录等

+
+
+
+
diff --git a/github-serendipity/tool.md b/source/github-serendipity/tool.md
similarity index 78%
rename from github-serendipity/tool.md
rename to source/github-serendipity/tool.md
index 43bc47b..bc4c539 100644
--- a/github-serendipity/tool.md
+++ b/source/github-serendipity/tool.md
@@ -1,6 +1,7 @@
----
-title: 发现项目:命令行工具
----
+
+
+
+
@@ -11,3 +12,5 @@ jid - JSON incremental digger

https://gitscout.com/?ref=producthunt Gitscout is a beautiful GitHub Issues experience for macOS
+
+
diff --git a/github-serendipity/topic-productivity.md b/source/github-serendipity/topic-productivity.md
similarity index 97%
rename from github-serendipity/topic-productivity.md
rename to source/github-serendipity/topic-productivity.md
index e317966..ea42872 100644
--- a/github-serendipity/topic-productivity.md
+++ b/source/github-serendipity/topic-productivity.md
@@ -1,24 +1,18 @@
----
-title: 发现项目:生产力
----
## commitizen
-
http://github.com/commitizen/cz-cli
When you commit with Commitizen, you'll be prompted to fill out any required commit fields at commit time
to use AngularJS's commit message convention also known as conventional-changelog.
-
+

## gitsome
-
http://github.com/donnemartin/gitsome
-
git 命令太多(150+ commands,若干的选项),但是用类似于 sourcetree 等 GUI 心里没安全感?
和 Github 整合良好,在命令查看 Repo 信息,issues 等

@@ -59,3 +53,9 @@ Put noti at the beginning or end of your regular commands.
If you already started a command, but forgot to use noti, then you can do this to get notified when that process' PID disappears.
noti -pwatch $(pgrep docker-machine)
+
+
+
+
+
+
diff --git a/media/1--HXNZeIEorBi_jEoY7MkQA.gif b/source/images/1--HXNZeIEorBi_jEoY7MkQA.gif
similarity index 100%
rename from media/1--HXNZeIEorBi_jEoY7MkQA.gif
rename to source/images/1--HXNZeIEorBi_jEoY7MkQA.gif
diff --git a/media/1-26mhk7bwEfALS54H2lsTYQ.gif b/source/images/1-26mhk7bwEfALS54H2lsTYQ.gif
similarity index 100%
rename from media/1-26mhk7bwEfALS54H2lsTYQ.gif
rename to source/images/1-26mhk7bwEfALS54H2lsTYQ.gif
diff --git a/media/14526817128522.jpg b/source/images/14526817128522.jpg
similarity index 100%
rename from media/14526817128522.jpg
rename to source/images/14526817128522.jpg
diff --git a/media/14526817311407.jpg b/source/images/14526817311407.jpg
similarity index 100%
rename from media/14526817311407.jpg
rename to source/images/14526817311407.jpg
diff --git a/media/14526817434913.jpg b/source/images/14526817434913.jpg
similarity index 100%
rename from media/14526817434913.jpg
rename to source/images/14526817434913.jpg
diff --git a/media/14526824032631.jpg b/source/images/14526824032631.jpg
similarity index 100%
rename from media/14526824032631.jpg
rename to source/images/14526824032631.jpg
diff --git a/media/14527328936077.jpg b/source/images/14527328936077.jpg
similarity index 100%
rename from media/14527328936077.jpg
rename to source/images/14527328936077.jpg
diff --git a/media/14527329067529.jpg b/source/images/14527329067529.jpg
similarity index 100%
rename from media/14527329067529.jpg
rename to source/images/14527329067529.jpg
diff --git a/media/14527329170053.jpg b/source/images/14527329170053.jpg
similarity index 100%
rename from media/14527329170053.jpg
rename to source/images/14527329170053.jpg
diff --git a/media/14527329432396.jpg b/source/images/14527329432396.jpg
similarity index 100%
rename from media/14527329432396.jpg
rename to source/images/14527329432396.jpg
diff --git a/media/14527329524391.jpg b/source/images/14527329524391.jpg
similarity index 100%
rename from media/14527329524391.jpg
rename to source/images/14527329524391.jpg
diff --git a/media/14527329624977.jpg b/source/images/14527329624977.jpg
similarity index 100%
rename from media/14527329624977.jpg
rename to source/images/14527329624977.jpg
diff --git a/media/14527329709983.jpg b/source/images/14527329709983.jpg
similarity index 100%
rename from media/14527329709983.jpg
rename to source/images/14527329709983.jpg
diff --git a/media/14527329848372.jpg b/source/images/14527329848372.jpg
similarity index 100%
rename from media/14527329848372.jpg
rename to source/images/14527329848372.jpg
diff --git a/media/14527330008306.jpg b/source/images/14527330008306.jpg
similarity index 100%
rename from media/14527330008306.jpg
rename to source/images/14527330008306.jpg
diff --git a/media/14527330137694.jpg b/source/images/14527330137694.jpg
similarity index 100%
rename from media/14527330137694.jpg
rename to source/images/14527330137694.jpg
diff --git a/media/14527330229667.jpg b/source/images/14527330229667.jpg
similarity index 100%
rename from media/14527330229667.jpg
rename to source/images/14527330229667.jpg
diff --git a/media/14527330327425.jpg b/source/images/14527330327425.jpg
similarity index 100%
rename from media/14527330327425.jpg
rename to source/images/14527330327425.jpg
diff --git a/media/14527330405103.jpg b/source/images/14527330405103.jpg
similarity index 100%
rename from media/14527330405103.jpg
rename to source/images/14527330405103.jpg
diff --git a/media/14527354396909.jpg b/source/images/14527354396909.jpg
similarity index 100%
rename from media/14527354396909.jpg
rename to source/images/14527354396909.jpg
diff --git a/media/14527354642497.jpg b/source/images/14527354642497.jpg
similarity index 100%
rename from media/14527354642497.jpg
rename to source/images/14527354642497.jpg
diff --git a/media/14527354810274.jpg b/source/images/14527354810274.jpg
similarity index 100%
rename from media/14527354810274.jpg
rename to source/images/14527354810274.jpg
diff --git a/media/14527355073883.jpg b/source/images/14527355073883.jpg
similarity index 100%
rename from media/14527355073883.jpg
rename to source/images/14527355073883.jpg
diff --git a/media/14527355199835.jpg b/source/images/14527355199835.jpg
similarity index 100%
rename from media/14527355199835.jpg
rename to source/images/14527355199835.jpg
diff --git a/media/14527355356903.jpg b/source/images/14527355356903.jpg
similarity index 100%
rename from media/14527355356903.jpg
rename to source/images/14527355356903.jpg
diff --git a/media/14527356318126.jpg b/source/images/14527356318126.jpg
similarity index 100%
rename from media/14527356318126.jpg
rename to source/images/14527356318126.jpg
diff --git a/media/14527529748957.jpg b/source/images/14527529748957.jpg
similarity index 100%
rename from media/14527529748957.jpg
rename to source/images/14527529748957.jpg
diff --git a/media/14527566716026.jpg b/source/images/14527566716026.jpg
similarity index 100%
rename from media/14527566716026.jpg
rename to source/images/14527566716026.jpg
diff --git a/media/14527575575368.jpg b/source/images/14527575575368.jpg
similarity index 100%
rename from media/14527575575368.jpg
rename to source/images/14527575575368.jpg
diff --git a/media/14556087572607.jpg b/source/images/14556087572607.jpg
similarity index 100%
rename from media/14556087572607.jpg
rename to source/images/14556087572607.jpg
diff --git a/media/14556087665219.jpg b/source/images/14556087665219.jpg
similarity index 100%
rename from media/14556087665219.jpg
rename to source/images/14556087665219.jpg
diff --git a/media/14556087795627.jpg b/source/images/14556087795627.jpg
similarity index 100%
rename from media/14556087795627.jpg
rename to source/images/14556087795627.jpg
diff --git a/media/14556088027473.jpg b/source/images/14556088027473.jpg
similarity index 100%
rename from media/14556088027473.jpg
rename to source/images/14556088027473.jpg
diff --git a/media/14556088459561.jpg b/source/images/14556088459561.jpg
similarity index 100%
rename from media/14556088459561.jpg
rename to source/images/14556088459561.jpg
diff --git a/media/14556088608460.jpg b/source/images/14556088608460.jpg
similarity index 100%
rename from media/14556088608460.jpg
rename to source/images/14556088608460.jpg
diff --git a/media/14556089092308.jpg b/source/images/14556089092308.jpg
similarity index 100%
rename from media/14556089092308.jpg
rename to source/images/14556089092308.jpg
diff --git a/media/14563664996223.jpg b/source/images/14563664996223.jpg
similarity index 100%
rename from media/14563664996223.jpg
rename to source/images/14563664996223.jpg
diff --git a/media/14579164597949.jpg b/source/images/14579164597949.jpg
similarity index 100%
rename from media/14579164597949.jpg
rename to source/images/14579164597949.jpg
diff --git a/media/14579164770475.jpg b/source/images/14579164770475.jpg
similarity index 100%
rename from media/14579164770475.jpg
rename to source/images/14579164770475.jpg
diff --git a/media/14590427102784.jpg b/source/images/14590427102784.jpg
similarity index 100%
rename from media/14590427102784.jpg
rename to source/images/14590427102784.jpg
diff --git a/media/14590435335965.jpg b/source/images/14590435335965.jpg
similarity index 100%
rename from media/14590435335965.jpg
rename to source/images/14590435335965.jpg
diff --git a/media/14590458929436.jpg b/source/images/14590458929436.jpg
similarity index 100%
rename from media/14590458929436.jpg
rename to source/images/14590458929436.jpg
diff --git a/media/14590458998187.jpg b/source/images/14590458998187.jpg
similarity index 100%
rename from media/14590458998187.jpg
rename to source/images/14590458998187.jpg
diff --git a/media/14590459078901.jpg b/source/images/14590459078901.jpg
similarity index 100%
rename from media/14590459078901.jpg
rename to source/images/14590459078901.jpg
diff --git a/media/14590459174984.jpg b/source/images/14590459174984.jpg
similarity index 100%
rename from media/14590459174984.jpg
rename to source/images/14590459174984.jpg
diff --git a/media/14590459277855.jpg b/source/images/14590459277855.jpg
similarity index 100%
rename from media/14590459277855.jpg
rename to source/images/14590459277855.jpg
diff --git a/media/14590459334363.jpg b/source/images/14590459334363.jpg
similarity index 100%
rename from media/14590459334363.jpg
rename to source/images/14590459334363.jpg
diff --git a/media/14590459407142.jpg b/source/images/14590459407142.jpg
similarity index 100%
rename from media/14590459407142.jpg
rename to source/images/14590459407142.jpg
diff --git a/media/14590459484745.jpg b/source/images/14590459484745.jpg
similarity index 100%
rename from media/14590459484745.jpg
rename to source/images/14590459484745.jpg
diff --git a/media/14590482229470.jpg b/source/images/14590482229470.jpg
similarity index 100%
rename from media/14590482229470.jpg
rename to source/images/14590482229470.jpg
diff --git a/media/14590483119349.jpg b/source/images/14590483119349.jpg
similarity index 100%
rename from media/14590483119349.jpg
rename to source/images/14590483119349.jpg
diff --git a/media/14590616612531.jpg b/source/images/14590616612531.jpg
similarity index 100%
rename from media/14590616612531.jpg
rename to source/images/14590616612531.jpg
diff --git a/media/14592192506274.jpg b/source/images/14592192506274.jpg
similarity index 100%
rename from media/14592192506274.jpg
rename to source/images/14592192506274.jpg
diff --git a/media/14592193024137.jpg b/source/images/14592193024137.jpg
similarity index 100%
rename from media/14592193024137.jpg
rename to source/images/14592193024137.jpg
diff --git a/media/14593052371578.jpg b/source/images/14593052371578.jpg
similarity index 100%
rename from media/14593052371578.jpg
rename to source/images/14593052371578.jpg
diff --git a/media/14593943566103.jpg b/source/images/14593943566103.jpg
similarity index 100%
rename from media/14593943566103.jpg
rename to source/images/14593943566103.jpg
diff --git a/media/14593943864352.jpg b/source/images/14593943864352.jpg
similarity index 100%
rename from media/14593943864352.jpg
rename to source/images/14593943864352.jpg
diff --git a/media/14594034789400.jpg b/source/images/14594034789400.jpg
similarity index 100%
rename from media/14594034789400.jpg
rename to source/images/14594034789400.jpg
diff --git a/media/14594035416619.jpg b/source/images/14594035416619.jpg
similarity index 100%
rename from media/14594035416619.jpg
rename to source/images/14594035416619.jpg
diff --git a/media/14594037482666.jpg b/source/images/14594037482666.jpg
similarity index 100%
rename from media/14594037482666.jpg
rename to source/images/14594037482666.jpg
diff --git a/media/14594956184984.jpg b/source/images/14594956184984.jpg
similarity index 100%
rename from media/14594956184984.jpg
rename to source/images/14594956184984.jpg
diff --git a/media/14595203155094.jpg b/source/images/14595203155094.jpg
similarity index 100%
rename from media/14595203155094.jpg
rename to source/images/14595203155094.jpg
diff --git a/media/14595203993602.jpg b/source/images/14595203993602.jpg
similarity index 100%
rename from media/14595203993602.jpg
rename to source/images/14595203993602.jpg
diff --git a/media/14595648025392.jpg b/source/images/14595648025392.jpg
similarity index 100%
rename from media/14595648025392.jpg
rename to source/images/14595648025392.jpg
diff --git a/media/14595659003559.jpg b/source/images/14595659003559.jpg
similarity index 100%
rename from media/14595659003559.jpg
rename to source/images/14595659003559.jpg
diff --git a/media/14595659469239.jpg b/source/images/14595659469239.jpg
similarity index 100%
rename from media/14595659469239.jpg
rename to source/images/14595659469239.jpg
diff --git a/media/14595750263914.jpg b/source/images/14595750263914.jpg
similarity index 100%
rename from media/14595750263914.jpg
rename to source/images/14595750263914.jpg
diff --git a/media/14595750392937.jpg b/source/images/14595750392937.jpg
similarity index 100%
rename from media/14595750392937.jpg
rename to source/images/14595750392937.jpg
diff --git a/media/14595750418996.jpg b/source/images/14595750418996.jpg
similarity index 100%
rename from media/14595750418996.jpg
rename to source/images/14595750418996.jpg
diff --git a/media/14595751610038.jpg b/source/images/14595751610038.jpg
similarity index 100%
rename from media/14595751610038.jpg
rename to source/images/14595751610038.jpg
diff --git a/media/14595751679057.jpg b/source/images/14595751679057.jpg
similarity index 100%
rename from media/14595751679057.jpg
rename to source/images/14595751679057.jpg
diff --git a/media/14595751760900.jpg b/source/images/14595751760900.jpg
similarity index 100%
rename from media/14595751760900.jpg
rename to source/images/14595751760900.jpg
diff --git a/media/14595751832101.jpg b/source/images/14595751832101.jpg
similarity index 100%
rename from media/14595751832101.jpg
rename to source/images/14595751832101.jpg
diff --git a/media/14595751900659.jpg b/source/images/14595751900659.jpg
similarity index 100%
rename from media/14595751900659.jpg
rename to source/images/14595751900659.jpg
diff --git a/media/14595751982308.jpg b/source/images/14595751982308.jpg
similarity index 100%
rename from media/14595751982308.jpg
rename to source/images/14595751982308.jpg
diff --git a/media/14595844503905.jpg b/source/images/14595844503905.jpg
similarity index 100%
rename from media/14595844503905.jpg
rename to source/images/14595844503905.jpg
diff --git a/media/14595853856339.jpg b/source/images/14595853856339.jpg
similarity index 100%
rename from media/14595853856339.jpg
rename to source/images/14595853856339.jpg
diff --git a/media/14595853959565.jpg b/source/images/14595853959565.jpg
similarity index 100%
rename from media/14595853959565.jpg
rename to source/images/14595853959565.jpg
diff --git a/media/14595854163232.jpg b/source/images/14595854163232.jpg
similarity index 100%
rename from media/14595854163232.jpg
rename to source/images/14595854163232.jpg
diff --git a/media/14595854257601.jpg b/source/images/14595854257601.jpg
similarity index 100%
rename from media/14595854257601.jpg
rename to source/images/14595854257601.jpg
diff --git a/media/14595854674829.jpg b/source/images/14595854674829.jpg
similarity index 100%
rename from media/14595854674829.jpg
rename to source/images/14595854674829.jpg
diff --git a/media/14596276092399.jpg b/source/images/14596276092399.jpg
similarity index 100%
rename from media/14596276092399.jpg
rename to source/images/14596276092399.jpg
diff --git a/media/14596276657654.jpg b/source/images/14596276657654.jpg
similarity index 100%
rename from media/14596276657654.jpg
rename to source/images/14596276657654.jpg
diff --git a/media/14596276835991.jpg b/source/images/14596276835991.jpg
similarity index 100%
rename from media/14596276835991.jpg
rename to source/images/14596276835991.jpg
diff --git a/media/14596277139997.jpg b/source/images/14596277139997.jpg
similarity index 100%
rename from media/14596277139997.jpg
rename to source/images/14596277139997.jpg
diff --git a/media/14596277254080.jpg b/source/images/14596277254080.jpg
similarity index 100%
rename from media/14596277254080.jpg
rename to source/images/14596277254080.jpg
diff --git a/media/14596277293057.jpg b/source/images/14596277293057.jpg
similarity index 100%
rename from media/14596277293057.jpg
rename to source/images/14596277293057.jpg
diff --git a/media/14596280129574.jpg b/source/images/14596280129574.jpg
similarity index 100%
rename from media/14596280129574.jpg
rename to source/images/14596280129574.jpg
diff --git a/media/14596280330050.jpg b/source/images/14596280330050.jpg
similarity index 100%
rename from media/14596280330050.jpg
rename to source/images/14596280330050.jpg
diff --git a/media/14596281729640.jpg b/source/images/14596281729640.jpg
similarity index 100%
rename from media/14596281729640.jpg
rename to source/images/14596281729640.jpg
diff --git a/media/14596543861071.jpg b/source/images/14596543861071.jpg
similarity index 100%
rename from media/14596543861071.jpg
rename to source/images/14596543861071.jpg
diff --git a/media/14596544195923.jpg b/source/images/14596544195923.jpg
similarity index 100%
rename from media/14596544195923.jpg
rename to source/images/14596544195923.jpg
diff --git a/media/14596544287918.jpg b/source/images/14596544287918.jpg
similarity index 100%
rename from media/14596544287918.jpg
rename to source/images/14596544287918.jpg
diff --git a/media/14596544468414.jpg b/source/images/14596544468414.jpg
similarity index 100%
rename from media/14596544468414.jpg
rename to source/images/14596544468414.jpg
diff --git a/media/14596560604518.jpg b/source/images/14596560604518.jpg
similarity index 100%
rename from media/14596560604518.jpg
rename to source/images/14596560604518.jpg
diff --git a/media/14596673745562.jpg b/source/images/14596673745562.jpg
similarity index 100%
rename from media/14596673745562.jpg
rename to source/images/14596673745562.jpg
diff --git a/media/14596674076109.jpg b/source/images/14596674076109.jpg
similarity index 100%
rename from media/14596674076109.jpg
rename to source/images/14596674076109.jpg
diff --git a/media/14596674272604.jpg b/source/images/14596674272604.jpg
similarity index 100%
rename from media/14596674272604.jpg
rename to source/images/14596674272604.jpg
diff --git a/media/14596674425400.jpg b/source/images/14596674425400.jpg
similarity index 100%
rename from media/14596674425400.jpg
rename to source/images/14596674425400.jpg
diff --git a/media/14596674576024.gif b/source/images/14596674576024.gif
similarity index 100%
rename from media/14596674576024.gif
rename to source/images/14596674576024.gif
diff --git a/media/14596676197225.jpg b/source/images/14596676197225.jpg
similarity index 100%
rename from media/14596676197225.jpg
rename to source/images/14596676197225.jpg
diff --git a/media/14596676283556.jpg b/source/images/14596676283556.jpg
similarity index 100%
rename from media/14596676283556.jpg
rename to source/images/14596676283556.jpg
diff --git a/media/14596792012604.jpg b/source/images/14596792012604.jpg
similarity index 100%
rename from media/14596792012604.jpg
rename to source/images/14596792012604.jpg
diff --git a/media/14596822613255.jpg b/source/images/14596822613255.jpg
similarity index 100%
rename from media/14596822613255.jpg
rename to source/images/14596822613255.jpg
diff --git a/media/14598766996574.jpg b/source/images/14598766996574.jpg
similarity index 100%
rename from media/14598766996574.jpg
rename to source/images/14598766996574.jpg
diff --git a/media/14599285872337.jpg b/source/images/14599285872337.jpg
similarity index 100%
rename from media/14599285872337.jpg
rename to source/images/14599285872337.jpg
diff --git a/media/14599298644351.jpg b/source/images/14599298644351.jpg
similarity index 100%
rename from media/14599298644351.jpg
rename to source/images/14599298644351.jpg
diff --git a/media/14604458199055.jpg b/source/images/14604458199055.jpg
similarity index 100%
rename from media/14604458199055.jpg
rename to source/images/14604458199055.jpg
diff --git a/media/14604458326124.jpg b/source/images/14604458326124.jpg
similarity index 100%
rename from media/14604458326124.jpg
rename to source/images/14604458326124.jpg
diff --git a/media/14604458570371.jpg b/source/images/14604458570371.jpg
similarity index 100%
rename from media/14604458570371.jpg
rename to source/images/14604458570371.jpg
diff --git a/media/14604460680078.jpg b/source/images/14604460680078.jpg
similarity index 100%
rename from media/14604460680078.jpg
rename to source/images/14604460680078.jpg
diff --git a/media/14604460759283.jpg b/source/images/14604460759283.jpg
similarity index 100%
rename from media/14604460759283.jpg
rename to source/images/14604460759283.jpg
diff --git a/media/14604460830136.jpg b/source/images/14604460830136.jpg
similarity index 100%
rename from media/14604460830136.jpg
rename to source/images/14604460830136.jpg
diff --git a/media/14604976511056.jpg b/source/images/14604976511056.jpg
similarity index 100%
rename from media/14604976511056.jpg
rename to source/images/14604976511056.jpg
diff --git a/media/14606262285312.jpg b/source/images/14606262285312.jpg
similarity index 100%
rename from media/14606262285312.jpg
rename to source/images/14606262285312.jpg
diff --git a/media/14606771381058.jpg b/source/images/14606771381058.jpg
similarity index 100%
rename from media/14606771381058.jpg
rename to source/images/14606771381058.jpg
diff --git a/media/14607823429057.jpg b/source/images/14607823429057.jpg
similarity index 100%
rename from media/14607823429057.jpg
rename to source/images/14607823429057.jpg
diff --git a/media/14607850063978.jpg b/source/images/14607850063978.jpg
similarity index 100%
rename from media/14607850063978.jpg
rename to source/images/14607850063978.jpg
diff --git a/media/14607863461307.jpg b/source/images/14607863461307.jpg
similarity index 100%
rename from media/14607863461307.jpg
rename to source/images/14607863461307.jpg
diff --git a/media/14607867504699.jpg b/source/images/14607867504699.jpg
similarity index 100%
rename from media/14607867504699.jpg
rename to source/images/14607867504699.jpg
diff --git a/media/14607871287611.jpg b/source/images/14607871287611.jpg
similarity index 100%
rename from media/14607871287611.jpg
rename to source/images/14607871287611.jpg
diff --git a/media/14607875415387.jpg b/source/images/14607875415387.jpg
similarity index 100%
rename from media/14607875415387.jpg
rename to source/images/14607875415387.jpg
diff --git a/media/14607876610981.jpg b/source/images/14607876610981.jpg
similarity index 100%
rename from media/14607876610981.jpg
rename to source/images/14607876610981.jpg
diff --git a/media/14607877841379.jpg b/source/images/14607877841379.jpg
similarity index 100%
rename from media/14607877841379.jpg
rename to source/images/14607877841379.jpg
diff --git a/media/14607880798120.jpg b/source/images/14607880798120.jpg
similarity index 100%
rename from media/14607880798120.jpg
rename to source/images/14607880798120.jpg
diff --git a/media/14607886543196.jpg b/source/images/14607886543196.jpg
similarity index 100%
rename from media/14607886543196.jpg
rename to source/images/14607886543196.jpg
diff --git a/media/14607887374520.jpg b/source/images/14607887374520.jpg
similarity index 100%
rename from media/14607887374520.jpg
rename to source/images/14607887374520.jpg
diff --git a/media/14607888929753.jpg b/source/images/14607888929753.jpg
similarity index 100%
rename from media/14607888929753.jpg
rename to source/images/14607888929753.jpg
diff --git a/media/14614094309803.jpg b/source/images/14614094309803.jpg
similarity index 100%
rename from media/14614094309803.jpg
rename to source/images/14614094309803.jpg
diff --git a/media/14614094409013.jpg b/source/images/14614094409013.jpg
similarity index 100%
rename from media/14614094409013.jpg
rename to source/images/14614094409013.jpg
diff --git a/media/14614094433019.jpg b/source/images/14614094433019.jpg
similarity index 100%
rename from media/14614094433019.jpg
rename to source/images/14614094433019.jpg
diff --git a/media/14614193678754.jpg b/source/images/14614193678754.jpg
similarity index 100%
rename from media/14614193678754.jpg
rename to source/images/14614193678754.jpg
diff --git a/media/14614193866187.jpg b/source/images/14614193866187.jpg
similarity index 100%
rename from media/14614193866187.jpg
rename to source/images/14614193866187.jpg
diff --git a/media/14614198380249.jpg b/source/images/14614198380249.jpg
similarity index 100%
rename from media/14614198380249.jpg
rename to source/images/14614198380249.jpg
diff --git a/media/14614199241017.jpg b/source/images/14614199241017.jpg
similarity index 100%
rename from media/14614199241017.jpg
rename to source/images/14614199241017.jpg
diff --git a/media/14618966565484.jpg b/source/images/14618966565484.jpg
similarity index 100%
rename from media/14618966565484.jpg
rename to source/images/14618966565484.jpg
diff --git a/media/14618980407241.jpg b/source/images/14618980407241.jpg
similarity index 100%
rename from media/14618980407241.jpg
rename to source/images/14618980407241.jpg
diff --git a/media/14619003175171.jpg b/source/images/14619003175171.jpg
similarity index 100%
rename from media/14619003175171.jpg
rename to source/images/14619003175171.jpg
diff --git a/media/14619003463986.jpg b/source/images/14619003463986.jpg
similarity index 100%
rename from media/14619003463986.jpg
rename to source/images/14619003463986.jpg
diff --git a/media/14619003774084.jpg b/source/images/14619003774084.jpg
similarity index 100%
rename from media/14619003774084.jpg
rename to source/images/14619003774084.jpg
diff --git a/media/14619003834720.jpg b/source/images/14619003834720.jpg
similarity index 100%
rename from media/14619003834720.jpg
rename to source/images/14619003834720.jpg
diff --git a/media/14619003942736.jpg b/source/images/14619003942736.jpg
similarity index 100%
rename from media/14619003942736.jpg
rename to source/images/14619003942736.jpg
diff --git a/media/14619004127541.jpg b/source/images/14619004127541.jpg
similarity index 100%
rename from media/14619004127541.jpg
rename to source/images/14619004127541.jpg
diff --git a/media/14619004169060.jpg b/source/images/14619004169060.jpg
similarity index 100%
rename from media/14619004169060.jpg
rename to source/images/14619004169060.jpg
diff --git a/media/14619004293317.jpg b/source/images/14619004293317.jpg
similarity index 100%
rename from media/14619004293317.jpg
rename to source/images/14619004293317.jpg
diff --git a/media/14624578504856.jpg b/source/images/14624578504856.jpg
similarity index 100%
rename from media/14624578504856.jpg
rename to source/images/14624578504856.jpg
diff --git a/media/14630327951795.jpg b/source/images/14630327951795.jpg
similarity index 100%
rename from media/14630327951795.jpg
rename to source/images/14630327951795.jpg
diff --git a/media/14630328144108.jpg b/source/images/14630328144108.jpg
similarity index 100%
rename from media/14630328144108.jpg
rename to source/images/14630328144108.jpg
diff --git a/media/14630330452786.jpg b/source/images/14630330452786.jpg
similarity index 100%
rename from media/14630330452786.jpg
rename to source/images/14630330452786.jpg
diff --git a/media/14630330714323.jpg b/source/images/14630330714323.jpg
similarity index 100%
rename from media/14630330714323.jpg
rename to source/images/14630330714323.jpg
diff --git a/media/14630330991625.jpg b/source/images/14630330991625.jpg
similarity index 100%
rename from media/14630330991625.jpg
rename to source/images/14630330991625.jpg
diff --git a/media/14630331376758.jpg b/source/images/14630331376758.jpg
similarity index 100%
rename from media/14630331376758.jpg
rename to source/images/14630331376758.jpg
diff --git a/media/14630331546350.jpg b/source/images/14630331546350.jpg
similarity index 100%
rename from media/14630331546350.jpg
rename to source/images/14630331546350.jpg
diff --git a/media/94419d84gw1f2jqooa7i9j213y10an94.jpg b/source/images/94419d84gw1f2jqooa7i9j213y10an94.jpg
similarity index 100%
rename from media/94419d84gw1f2jqooa7i9j213y10an94.jpg
rename to source/images/94419d84gw1f2jqooa7i9j213y10an94.jpg
diff --git a/media/QQ20160131-0.jpg b/source/images/QQ20160131-0.jpg
similarity index 100%
rename from media/QQ20160131-0.jpg
rename to source/images/QQ20160131-0.jpg
diff --git a/media/QQ20160131-0.png b/source/images/QQ20160131-0.png
similarity index 100%
rename from media/QQ20160131-0.png
rename to source/images/QQ20160131-0.png
diff --git a/media/QQ20160131-1.jpg b/source/images/QQ20160131-1.jpg
similarity index 100%
rename from media/QQ20160131-1.jpg
rename to source/images/QQ20160131-1.jpg
diff --git a/media/QQ20160131-1.png b/source/images/QQ20160131-1.png
similarity index 100%
rename from media/QQ20160131-1.png
rename to source/images/QQ20160131-1.png
diff --git a/media/QQ20160131-2.jpg b/source/images/QQ20160131-2.jpg
similarity index 100%
rename from media/QQ20160131-2.jpg
rename to source/images/QQ20160131-2.jpg
diff --git a/media/QQ20160131-2.png b/source/images/QQ20160131-2.png
similarity index 100%
rename from media/QQ20160131-2.png
rename to source/images/QQ20160131-2.png
diff --git a/media/QQ20160131-3.jpg b/source/images/QQ20160131-3.jpg
similarity index 100%
rename from media/QQ20160131-3.jpg
rename to source/images/QQ20160131-3.jpg
diff --git a/media/QQ20160131-3.png b/source/images/QQ20160131-3.png
similarity index 100%
rename from media/QQ20160131-3.png
rename to source/images/QQ20160131-3.png
diff --git a/media/QQ20160204-0.jpg b/source/images/QQ20160204-0.jpg
similarity index 100%
rename from media/QQ20160204-0.jpg
rename to source/images/QQ20160204-0.jpg
diff --git a/media/QQ20160331-0.jpg b/source/images/QQ20160331-0.jpg
similarity index 100%
rename from media/QQ20160331-0.jpg
rename to source/images/QQ20160331-0.jpg
diff --git a/media/QQ20160331-1.jpg b/source/images/QQ20160331-1.jpg
similarity index 100%
rename from media/QQ20160331-1.jpg
rename to source/images/QQ20160331-1.jpg
diff --git a/media/QQ20160331-2.jpg b/source/images/QQ20160331-2.jpg
similarity index 100%
rename from media/QQ20160331-2.jpg
rename to source/images/QQ20160331-2.jpg
diff --git a/media/QQ20160331-3.jpg b/source/images/QQ20160331-3.jpg
similarity index 100%
rename from media/QQ20160331-3.jpg
rename to source/images/QQ20160331-3.jpg
diff --git a/media/QQ20160331-4.jpg b/source/images/QQ20160331-4.jpg
similarity index 100%
rename from media/QQ20160331-4.jpg
rename to source/images/QQ20160331-4.jpg
diff --git a/media/QQ20160331-5.jpg b/source/images/QQ20160331-5.jpg
similarity index 100%
rename from media/QQ20160331-5.jpg
rename to source/images/QQ20160331-5.jpg
diff --git a/media/angular/2-1.png b/source/images/angular/2-1.png
similarity index 100%
rename from media/angular/2-1.png
rename to source/images/angular/2-1.png
diff --git a/media/angular/2-2.png b/source/images/angular/2-2.png
similarity index 100%
rename from media/angular/2-2.png
rename to source/images/angular/2-2.png
diff --git a/media/angular/2-3.png b/source/images/angular/2-3.png
similarity index 100%
rename from media/angular/2-3.png
rename to source/images/angular/2-3.png
diff --git a/media/angular/2-4.png b/source/images/angular/2-4.png
similarity index 100%
rename from media/angular/2-4.png
rename to source/images/angular/2-4.png
diff --git a/media/angular/3-1.png b/source/images/angular/3-1.png
similarity index 100%
rename from media/angular/3-1.png
rename to source/images/angular/3-1.png
diff --git a/media/angular/4-1.png b/source/images/angular/4-1.png
similarity index 100%
rename from media/angular/4-1.png
rename to source/images/angular/4-1.png
diff --git a/media/angular/4-2.png b/source/images/angular/4-2.png
similarity index 100%
rename from media/angular/4-2.png
rename to source/images/angular/4-2.png
diff --git a/media/angular/4-3.png b/source/images/angular/4-3.png
similarity index 100%
rename from media/angular/4-3.png
rename to source/images/angular/4-3.png
diff --git a/media/angular/4-4.png b/source/images/angular/4-4.png
similarity index 100%
rename from media/angular/4-4.png
rename to source/images/angular/4-4.png
diff --git a/media/angular/4-5.png b/source/images/angular/4-5.png
similarity index 100%
rename from media/angular/4-5.png
rename to source/images/angular/4-5.png
diff --git a/media/angular/4-6.png b/source/images/angular/4-6.png
similarity index 100%
rename from media/angular/4-6.png
rename to source/images/angular/4-6.png
diff --git a/media/angular/4-7.png b/source/images/angular/4-7.png
similarity index 100%
rename from media/angular/4-7.png
rename to source/images/angular/4-7.png
diff --git a/media/angular/4-8.png b/source/images/angular/4-8.png
similarity index 100%
rename from media/angular/4-8.png
rename to source/images/angular/4-8.png
diff --git a/media/angular/5-1.png b/source/images/angular/5-1.png
similarity index 100%
rename from media/angular/5-1.png
rename to source/images/angular/5-1.png
diff --git a/media/angular/5-10.png b/source/images/angular/5-10.png
similarity index 100%
rename from media/angular/5-10.png
rename to source/images/angular/5-10.png
diff --git a/media/angular/5-11.png b/source/images/angular/5-11.png
similarity index 100%
rename from media/angular/5-11.png
rename to source/images/angular/5-11.png
diff --git a/media/angular/5-12.png b/source/images/angular/5-12.png
similarity index 100%
rename from media/angular/5-12.png
rename to source/images/angular/5-12.png
diff --git a/media/angular/5-13.png b/source/images/angular/5-13.png
similarity index 100%
rename from media/angular/5-13.png
rename to source/images/angular/5-13.png
diff --git a/media/angular/5-2.png b/source/images/angular/5-2.png
similarity index 100%
rename from media/angular/5-2.png
rename to source/images/angular/5-2.png
diff --git a/media/angular/5-3.png b/source/images/angular/5-3.png
similarity index 100%
rename from media/angular/5-3.png
rename to source/images/angular/5-3.png
diff --git a/media/angular/5-4.png b/source/images/angular/5-4.png
similarity index 100%
rename from media/angular/5-4.png
rename to source/images/angular/5-4.png
diff --git a/media/angular/5-5.png b/source/images/angular/5-5.png
similarity index 100%
rename from media/angular/5-5.png
rename to source/images/angular/5-5.png
diff --git a/media/angular/5-6.png b/source/images/angular/5-6.png
similarity index 100%
rename from media/angular/5-6.png
rename to source/images/angular/5-6.png
diff --git a/media/angular/5-7.png b/source/images/angular/5-7.png
similarity index 100%
rename from media/angular/5-7.png
rename to source/images/angular/5-7.png
diff --git a/media/angular/5-8.png b/source/images/angular/5-8.png
similarity index 100%
rename from media/angular/5-8.png
rename to source/images/angular/5-8.png
diff --git a/media/angular/5-9.png b/source/images/angular/5-9.png
similarity index 100%
rename from media/angular/5-9.png
rename to source/images/angular/5-9.png
diff --git a/media/wechat-qrcode.jpg b/source/images/wechat-qrcode.jpg
similarity index 100%
rename from media/wechat-qrcode.jpg
rename to source/images/wechat-qrcode.jpg
diff --git a/media/xitu-myshare.png b/source/images/xitu-myshare.png
similarity index 100%
rename from media/xitu-myshare.png
rename to source/images/xitu-myshare.png
diff --git a/source/mircoservices-go/go-kit.md b/source/mircoservices-go/go-kit.md
new file mode 100644
index 0000000..3126177
--- /dev/null
+++ b/source/mircoservices-go/go-kit.md
@@ -0,0 +1,22 @@
+引用 tj 说的 跳出 bubble(leave node)
+
+
+
+
+
+
+
+
+
+打开蓝色盒子内部:
+
+
+
+
+
+
+
+1 试着关闭一个 实例(因为有retry 所以
+
+docker pull consul
+
diff --git a/source/mircoservices-go/media/14816079421001.jpg b/source/mircoservices-go/media/14816079421001.jpg
new file mode 100644
index 0000000..5dcae1a
Binary files /dev/null and b/source/mircoservices-go/media/14816079421001.jpg differ
diff --git a/source/mircoservices-go/media/14816079457176.jpg b/source/mircoservices-go/media/14816079457176.jpg
new file mode 100644
index 0000000..bfd4575
Binary files /dev/null and b/source/mircoservices-go/media/14816079457176.jpg differ
diff --git a/source/mircoservices-go/media/14816143021328.jpg b/source/mircoservices-go/media/14816143021328.jpg
new file mode 100644
index 0000000..fb5c7bd
Binary files /dev/null and b/source/mircoservices-go/media/14816143021328.jpg differ
diff --git a/source/mircoservices-go/media/14816143830303.jpg b/source/mircoservices-go/media/14816143830303.jpg
new file mode 100644
index 0000000..081c66c
Binary files /dev/null and b/source/mircoservices-go/media/14816143830303.jpg differ
diff --git a/source/tags/index.md b/source/tags/index.md
new file mode 100644
index 0000000..971b9a4
--- /dev/null
+++ b/source/tags/index.md
@@ -0,0 +1,4 @@
+---
+type: tags
+title: 标签
+---
\ No newline at end of file
diff --git a/themes/next/_config.yml b/themes/next/_config.yml
new file mode 100755
index 0000000..b280246
--- /dev/null
+++ b/themes/next/_config.yml
@@ -0,0 +1,234 @@
+# ---------------------------------------------------------------
+# Site Information Settings
+# ---------------------------------------------------------------
+
+# Place your favicon.ico to /source directory.
+favicon: /favicon.ico
+
+# Set default keywords (Use a comma to separate)
+
+# Set rss to false to disable feed link.
+# Leave rss as empty to use site's feed link.
+# Set rss to specific value if you have burned your feed already.
+rss:
+
+# Specify the date when the site was setup
+#since: 2015
+
+
+
+
+# ---------------------------------------------------------------
+# Menu Settings
+# ---------------------------------------------------------------
+
+# When running hexo in a subdirectory (e.g. domain.tld/blog)
+# Remove leading slashes ( "/archives" -> "archives" )
+menu:
+ home: /
+ categories: /categories
+ about: /about
+ archives: /archives
+ tags: /tags
+ # commonweal: /404.html
+
+
+# Enable/Disable menu icons.
+# Icon Mapping:
+# Map a menu item to a specific FontAwesome icon name.
+# Key is the name of menu item and value is the name of FontAwsome icon.
+# When an question mask icon presenting up means that the item has no mapping icon.
+menu_icons:
+ enable: true
+ # Icon Mapping.
+ home: home
+ about: user
+ categories: th
+ tags: tags
+ archives: archive
+ commonweal: heartbeat
+
+
+
+
+# ---------------------------------------------------------------
+# Scheme Settings
+# ---------------------------------------------------------------
+
+# Schemes
+# scheme: Muse
+#scheme: Mist
+scheme: Pisces
+
+
+
+# ---------------------------------------------------------------
+# Sidebar Settings
+# ---------------------------------------------------------------
+
+
+# Social links
+# social:
+ #GitHub:
+ #Others:
+
+# Social Icons
+social_icons:
+ enable: true
+ # Icon Mappings
+ GitHub: github
+ Twitter: twitter
+ Weibo: weibo
+
+
+# Sidebar Avatar
+# in theme directory(source/images): /images/avatar.jpg
+# in site directory(source/uploads): /uploads/avatar.jpg
+# default : /images/default_avatar.jpg
+#avatar:
+
+
+# TOC in the Sidebar
+toc:
+ enable: true
+
+ # Automatically add list number to toc.
+ number: false
+
+
+# Creative Commons 4.0 International License.
+# http://creativecommons.org/
+# Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero
+#creative_commons: by-nc-sa
+#creative_commons:
+
+sidebar:
+ # Sidebar Position, available value: left | right
+ position: left
+ #position: right
+
+ # Sidebar Display, available value:
+ # - post expand on posts automatically. Default.
+ # - always expand for all pages automatically
+ # - hide expand only when click on the sidebar toggle icon.
+ # - remove Totally remove sidebar including sidebar toggle icon.
+ display: post
+ #display: always
+ #display: hide
+ #display: remove
+
+
+
+# ---------------------------------------------------------------
+# Misc Theme Settings
+# ---------------------------------------------------------------
+
+# Custom Logo.
+# !!Only available for Default Scheme currently.
+# Options:
+# enabled: [true/false] - Replace with specific image
+# image: url-of-image - Images's url
+custom_logo:
+ enabled: false
+ image:
+
+
+# Code Highlight theme
+# Available value:
+# normal | night | night eighties | night blue | night bright
+# https://github.com/chriskempson/tomorrow-theme
+highlight_theme: normal
+
+# Automatically scroll page to section which is under mark.
+scroll_to_more: true
+
+# Use Lato font
+use_font_lato: true
+
+
+
+# ---------------------------------------------------------------
+# Third Party Services Settings
+# ---------------------------------------------------------------
+
+# MathJax Support
+mathjax:
+
+
+# Swiftype Search API Key
+#swiftype_key:
+
+# Baidu Analytics ID
+#baidu_analytics:
+
+# Duoshuo ShortName
+#duoshuo_shortname:
+
+# Disqus
+#disqus_shortname:
+
+# Share
+#jiathis:
+
+# Share
+#duoshuo_share: true
+
+# Google Webmaster tools verification setting
+# See: https://www.google.com/webmasters/
+#google_site_verification:
+
+
+# Google Analytics
+#google_analytics:
+
+
+# Make duoshuo show UA
+# user_id must NOT be null when admin_enable is true!
+# you can visit http://dev.duoshuo.com get duoshuo user id.
+duoshuo_info:
+ ua_enable: true
+ admin_enable: false
+ user_id: 0
+ #admin_nickname: ROOT
+
+
+# Facebook SDK Support.
+# https://github.com/iissnan/hexo-theme-next/pull/410
+facebook_sdk:
+ enable: false
+ app_id: #
+ fb_admin: #
+ like_button: #true
+ webmaster: #true
+
+
+# Show number of visitors to each article.
+# You can visit https://leancloud.cn get AppID and AppKey.
+leancloud_visitors:
+ enable: true
+ app_id: keYWlIGy4iO5M1C29zrEkLXI-gzGzoHsz
+ app_key: Mtn7M5zjpMfEHLBnkOwcTuRK
+
+auto_excerpt:
+ enable: true
+ length: 150
+
+#! ---------------------------------------------------------------
+#! DO NOT EDIT THE FOLLOWING SETTINGS
+#! UNLESS YOU KNOW WHAT YOU ARE DOING
+#! ---------------------------------------------------------------
+
+# Motion
+use_motion: true
+
+# Fancybox
+fancybox: true
+
+# Static files
+vendors: vendors
+css: css
+js: js
+images: images
+
+# Theme version
+version: 5.0.0