在nginx上使用php代理运行cgi程序

我们用到的很多开源程序比如mailman, nagios等等,都有WEB端管理界面。在那个Apache一家独大的年代,这个问题可以很好解决,因为apache本身可以运行cgi程序。但随着 nginx服务器的大规模应用,而恰好nginx又没有cgi模块,所以我们不得不采用一些变通的手段来解决它。

在网上广为流传的解决方法是一个老外写的perl脚本,但这个脚本本身有很多问题,而且需要在后台启动一个守护进程,本人对用perl写的网络服务守护进程的稳定性很怀疑,在看了它的代码后,发现用PHP即可很好的解决这个问题。

CGI其实本质上就是一个普通的二进制程序,你可以在后台直接运行它。而服务器要做的事就是将WEB传递的变量作为参数传递给这个程序并执行,而将执行返回的结果显示到页面上。

明白了这个道理,我们就可以开始着手解决这个问题了。其过程无非就是将PHP作为一个proxy,使其运行指定的程序,并把程序输出结果echo出来。

我们把这个PHP脚本命名为cgi.php,把它随便放到一个你认为合适的位置,然后用rewrite将后缀为cgi的请求都转发到cgi.php上。以下为参考的配置格式

#rewrite cgi请求到cgi.php上,并把cgi文件名作为php的pathinfo
rewrite ^/nagios/cgi-bin/(.*) /cgi.php/$1 break;
 
location /nagios/
{
    gzip off;
    alias /usr/local/nagios/share/;
    index index.html index.htm index.php;
}
 
location ~ .*\.php(\/.*)*$ {
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    include fcgi.conf;
    fastcgi_param SCRIPT_FILENAME /usr/local/nagios/share$fastcgi_script_name;
 
    #pathinfo必须设置
    fastcgi_param  PATH_INFO $fastcgi_script_name;
 
    #以下两个为cgi.php需要用到的变量名,分别为cgi程序目录,和cgi默认index程序
    fastcgi_param  CGI_BASE  /usr/local/nagios/sbin;
    fastcgi_param  CGI_INDEX status.cgi;
}

注意上面配置文件的注释部分,在你自己设置的时候必须填上合适的值。下面就是最重要的cgi.php文件了

<?php
/*
   use php to execute mailman cgi app
   hack by 70 (magike.net@gmail.com)
   https://joyqi.com
 */
 
// get cgi base from fastcgi param
$cgi_base = '';
if (isset($_SERVER['CGI_BASE'])) {
    $cgi_base = rtrim($_SERVER['CGI_BASE'], '/') . '/';
} else {
    die('PLEASE CONFIGURE YOUR CGI_BASE PARAM');
}
 
// get pathinfo
$pathinfo = '';
if (isset($_SERVER['PATH_INFO'])) {
    $pathinfo = $_SERVER['PATH_INFO'];
} else if (isset($_SERVER['CGI_INDEX'])) {
    $pathinfo = $_SERVER['CGI_INDEX'];
} else {
    die('PLEASE CONFIGURE YOUR PATH_INFO PARAM');
}
 
// get real cgi path
$cgi_path = $cgi_base;
$cgi_file = trim($pathinfo, '/');
$cgi_file_levels = explode('/', $cgi_file);
$cgi_file_exists = false;
 
while (count($cgi_file_levels) > 0) {
    $cgi_path = $cgi_path . '/' . array_shift($cgi_file_levels);
 
    if (is_file($cgi_path)) {
        $cgi_file_exists = true;
        break;
    }
}
 
if (!$cgi_file_exists) {
    die('NOT EXISTS PAGE!' . $cgi_file);
}
 
$cgi_pathinfo = '';
if (!empty($cgi_file_levels)) {
    $cgi_pathinfo = '/' . implode('/', $cgi_file_levels);
}
 
if (is_readable($cgi_path)) {
 
    $descriptorspec = array(
            0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
            1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
            2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
            );
 
    $cwd = $cgi_base;
    $env = $_ENV;
 
    $env['SCRIPT_FILENAME'] = $cgi_path;
    $env['SCRIPT_NAME'] = $cgi_file;
    $env['DOCUMENT_ROOT'] = CGI_BASE;
    $env['PATH_INFO'] = $cgi_pathinfo;
 
    // http auth support (nagios etc.)
    if (isset($_SERVER['PHP_AUTH_USER'])) {
        $env['REMOTE_USER'] = $_SERVER['PHP_AUTH_USER'];
    }
 
    $process = proc_open($cgi_path, $descriptorspec, $pipes, $cwd, $env);
    if (is_resource($process)) {
        $stdin = file_get_contents("php://input");
 
        if (!empty($stdin)) {
            fwrite($pipes[0], $stdin);
            fclose($pipes[0]);
        }
 
        //stream_set_blocking($pipes[1], 0);
        stream_set_timeout($pipes[1], 3);
        $result = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        $return_value = proc_close($process);
 
        list($header, $body) = preg_split("/\r?\n\r?\n/", $result, 2);
 
        $headers = explode("\n", $header);
        foreach ($headers as $line) {
            header(trim($line));
        }
 
        echo $body;
    } else {
        die('ERROR APPLICATION!');
    }
 
} else {
    die('ERROR PAGE!' . $cgi_path);
}

Nginx配置免费SSL证书StartSSL,解决Firefox不信任问题

先在StartSSL上申请免费一年的SSL证书,具体过程网上很多教程。然后把申请到的key和crt文件上传到服务器,比如/usr/local/nginx/certs/.

 Nginx配置SSL证书

直接贴上我的nginx的部分配置:

server {
        listen 443;
	server_name   liuzhichao.com www.liuzhichao.com ;
        ssl on;
        ssl_certificate /usr/local/nginx/ssl/ssl.crt;
        ssl_certificate_key /usr/local/nginx/ssl/ssl.key;if($http_transfer_encoding ~* chunked){return444;}

	gzip on;if(-d $request_filename){
		rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;}

	 root   /home/wwwroot/;

	 ssi off;
	 ssi_silent_errors off;
	 ssi_types text/shtml;

	 location /{
		 index  index.html index.htm index.shtml index.php;
		 autoindex	off;}

	location /nginx_status {
		stub_status on;
		access_log off;}

	 location ~(favicon.ico){ 
		 log_not_found off;
		 access_log   off;}

	 location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
		 expires 1y;}

	 location ~* \.(js|css)$ {
		 expires 7d;}#------------
	 location ~*^(.+)\.(php[3-9]?|phtm[l]?)(\/.*)*$ {set $real_script_name $1.$2;set $path_info $3;if(!-f $document_root$real_script_name){return404;}

		  fastcgi_pass 127.0.0.1:8999; fastcgi_param HTTPS on;
		  include enable_php.conf;}}

现在重启Nginx,Chrome应该能正常显示Https.如果只想使用Https连接,可以再添加一个server,然后跳转到https

server {
        listen 80;
	server_name   liuzhichao.com www.liuzhichao.com ;
        rewrite     ^   https://$server_name$request_uri? permanent;}

 解决Firefox不信任StartSSL证书问题

wget http://cert.startssl.com/certs/ca.pem
wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
cat ca.pem sub.class1.server.ca.pem >> ca-certs.crt
cat ca-certs.crt >> ssl.crt

再次重启Nginx,本想这下Firefox也应该能正常识别证书了,但是重启Nginx遇到了SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line error错误。

[emerg]: SSL_CTX_use_certificate_chain_file("/usr/local/nginx/certs/ssl.crt")
 failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib)
configuration file /usr/local/nginx/conf/nginx.conf test failed

这个的意思就是server.crt读取到意外错误行.这是因为我们在合并StartSSL提供的crt证书时,直接cat到了ssl.crt里。使用vi或者nano命令打开并编辑ssl.crt,找到:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

修改为:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

保存这个crt文件,再次重启Nginx服务,输入申请证书时私钥的密码,启动成功后,现在使用Firefox访问网站也能信任证书了。

Discover Meteor Book 中文

Meteor 是一个构建在 Node.js 之上的平台,用来开发实时网页程序。Meteor 位于程序数据库和用户界面之间,保持二者之间的数据同步更新。

因为 Meteor 是基于 Node.js 开发的,所以在客户端和服务器端都使用 JavaScript 作为开发语言。而且,Meteor 程序的代码还能在前后两端共用。

Meteor 这个平台很强大,网页程序开发过程中的很多复杂、容易出错的功能都能抽象出来,实现起来很简单。

那么,你为什么要花时间学习 Meteor,而不去学其他框架呢?拨开 Meteor 的各种功能,我们认为原因只有一个:因为 Meteor 易于学习。

http://zh.discovermeteor.com/pdf

Git工作流指南:Gitflow工作流

常用的分支约定:

用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*

维护分支

git-workflow-release-cycle-4maintenance

维护分支或说是热修复(hotfix)分支用于生成快速给产品发布版本(production releases)打补丁,这是唯一可以直接从master分支fork出来的分支。修复完成,修改应该马上合并回master分支和develop分支(当前的发布分支),master分支应该用新的版本号打好Tag

Bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。你可以把维护分支想成是一个直接在master分支上处理的临时发布。

 

https://github.com/oldratlee/translations/blob/master/git-workflows-and-tutorials/workflow-feature-branch.md

 

 

 

自定义元素:在 HTML 中定义新元素

Eric Bidelman
翻译: 米粽 (Leo Deng) 已发布: 八月 28th, 2013  已更新: 十二月 18th, 2013

This article discusses APIs that are not yet fully standardized and still in flux. Be cautious when using experimental APIs in your own projects.

引言

现在的 web 严重缺乏表达能力。你只要瞧一眼“现代”的 web 应用,比如 GMail,就会明白我的意思:

现代 web 应用:使用

堆砌而成。
堆砌

一点都不现代。然而可悲的是,这就是我们构建 web 应用的方式。在现有基础上我们不应该有更高的追求吗?

时髦的标记,行动起来!

HTML 为我们提供了一个完美的文档组织工具,然而 HTML 规范定义的元素却很有限。

假如 GMail 的标记不那么糟糕,而是像下面这样漂亮,那会怎样?

真是令人耳目一新!这个应用太合理了,既有意义,又容易理解。最妙的是,它是可维护的,只要查看声明结构就可以清楚地知道它的作用。

自定义元素,救救我们!就指望你了!
赶紧开始吧

自定义元素 允许开发者定义新的 HTML 元素类型。该规范只是 Web 组件模块提供的众多新 API 中的一个,但它也很可能是最重要的一个。没有自定义元素带来的以下特性,Web 组件都不会存在:

定义新的 HTML/DOM 元素
基于其他元素创建扩展元素
给一个标签绑定一组自定义功能
扩展已有 DOM 元素的 API
注册新元素

使用 document.registerElement() 可以创建一个自定义元素:

var XFoo = document.registerElement(‘x-foo’);
document.body.appendChild(new XFoo());
document.registerElement()

的第一个参数是元素的标签名。这个标签名必须包括一个连字符(-)。因此,诸如 、 和 都是合法的标签名,而 和 <foo_bar> 则不是。这个限定使解析器能很容易地区分自定义元素和 HTML 规范定义的元素,同时确保了 HTML 增加新标签时的向前兼容。

第二个参数是一个(可选的)对象,用于描述该元素的 prototype。在这里可以为元素添加自定义功能(例如:公开属性和方法)。稍后详述。

自定义元素默认继承自 HTMLElement,因此上一个示例等同于:

var XFoo = document.registerElement(‘x-foo’, {
prototype: Object.create(HTMLElement.prototype)
});

调用 document.registerElement(‘x-foo’) 向浏览器注册了这个新元素,并返回一个可以用来创建 元素实例的构造器。如果你不想使用构造器,也可以使用其他实例化元素的技术。

如果你不希望在 window 全局对象中创建元素构造器,还可以把它放进命名空间(var myapp = {}; myapp.XFoo = document.registerElement(‘x-foo’);)。

然后直接上代码了~~

<!DOCTYPE html>
<!–
Copyright 2013 The Polymer Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file.
–>
<html>
<head>
<title></title>
<meta charset=”UTF-8″>
<link rel=”import” href=”test-component.html”>
</head>
<body>

<x-foo-shadowdom></x-foo-shadowdom>
<script>

var XFooProto = Object.create(HTMLElement.prototype);

XFooProto.createdCallback = function() {
// 1. 为元素附加一个 shadow root。
var shadow = this.createShadowRoot();

// 2. 填入标记。
shadow.innerHTML = “<b>I’m in the element’s Shadow DOM!</b>”;
};

var XFoo = document.registerElement(‘x-foo-shadowdom’, {prototype: XFooProto});

</script>
</body>
</html>

http://www.html5rocks.com/zh/tutorials/webcomponents/customelements/#intro

Mac 电脑 装机必备软件 推荐

一、输入法

Mac 自带的中文输入法确实很不好用,因此建议安装第三方输入法,至于搜狗、QQ、百度三个输入法的选择,主要看个人习惯了,功能上差不多,笔者使用的是搜狗。

1.搜狗输入法:http://ifunapple.com/2014/06/sougou-pinyin-29/
2.QQ输入法:http://ifunapple.com/2013/09/qqime/
3.百度输入法:http://ifunapple.com/2013/06/baidu-ime/

二、浏览器

Mac 上的流行浏览器和 Windows 上差不多,除了 IE 被 Safari 替代,个人感觉 Chrome 性能最高,Safari 也不错,而 Firefox 作为开发者一定要安装。
1.Chrome:http://ifunapple.com/2014/08/chrome-36/
2.Safari:系统自带
3.Firefox:http://ifunapple.com/2014/08/firefox-31/

三、下载工具

Mac 上的下载工具并不多,大部分时候使用浏览器直接下载就可以,迅雷和Folx是比较不错的两款下载工具。
1.迅雷:http://ifunapple.com/2014/06/thunder-2-6/
2.Folx:http://ifunapple.com/2014/05/folx-go/

四、看图工具

Mac 系统默认使用「预览」打开图片,但「预览」最大的不足是不支持图片上一张、下一张的切换,很不方便,因此建议安装第三方看图软件
1.ArcSoft Photo+:http://ifunapple.com/2013/12/arcsoft-photo-3/

五、音乐播放器

音乐播放直接使用iTunes就可以,而在线音乐播放软件目前「百度音乐」和「QQ 音乐」做的比较不错,其中百度音乐支持音乐下载。
1.百度音乐:http://ifunapple.com/2014/01/baidu-music-103/
2.QQ 音乐:http://ifunapple.com/2014/08/qq-music-1-4/
3.iTunes:系统自带

六、视频播放器

Quicktime 支持的视频格式太少了,MPlayerX和KPlayer都可以作为首选视频播放器,支持几乎所有常见的视频格式。
1.MPlayerX:http://ifunapple.com/2014/03/mplayerx-1022/
2.KPlayer:http://ifunapple.com/2014/05/kplayer-143/

七、压缩解压工具

BetterZip和Entropy都是很不错的压缩解压缩工具,支持 ZIP、RAR、TAR 等几乎所有常见的压缩格式。
1.BetterZip:http://ifunapple.com/2014/03/betterzip-233/
2.Entropy:http://ifunapple.com/2013/12/entropy/

八、聊天社交工具

1.QQ:http://ifunapple.com/2014/05/qq-3-1-2/
2.微信:http://ifunapple.com/2014/02/weichat/

九、系统增强

这六款软件是站长认为必须安装的系统增强工具,能够大大提升使用 Mac 的效率
1.Parallels Desktop 9:Mac 上最好用的虚拟机,虽然说 Mac 上的软件已经够多,但肯定有一些软件需要你必须在 Windows 上运行,比如网银插件等,因此安装个 Windows 系统以备不时之需,但站长不建议安装双系统,主要是来回切换太麻烦了,建议在 Mac 上安装Parallels Desktop虚拟机,然后在虚拟机中安装 Windows。

http://ifunapple.com/2014/07/parallels-desktop-9-0-24237/
2.Paragon NTFS:解决你的移动硬盘或 U 盘在 Mac 上只能读不能写的问题。
http://ifunapple.com/2014/04/ntfs-11-2/

3.CleanMyMac:系统清理和应用卸载工具。
http://ifunapple.com/2014/07/cleanmymac-2-2-7-b1/

4.iStat Menus:系统监控工具,如 CPU、网速、温度等等。
http://ifunapple.com/2014/08/istat-menus-5/

5.TotalFinder:Finder 增强工具,如剪切、多 Tab、显示隐藏文件、复制路径等。
http://ifunapple.com/2014/07/totalfinder-1-6-2/

6.BetterSnapTool:窗口大小和位置控制工具,比如拖拽窗口完成最大化。
http://ifunapple.com/2014/05/bettersnaptool/

十、文档办公

Mac 上的办公软件就是微软的Office和苹果的iWork了,如果习惯了 Office,就安装 Office 吧。
1.Microsoft Office:http://ifunapple.com/2014/06/office/
2.iWork:http://ifunapple.com/2013/10/iwork-2013/

十一、其他

1.邮件客户端:推荐使用系统自带的
2.PDF阅读工具:推荐使用系统预览应用
3.文本编辑:简单的使用系统的「文本编辑」就够用了

http://ifunapple.com/2014/08/subject-zjbb/

初创团队如何提高工作效率?

http://jianshu.io/p/e61e458dbfe0

条件
初创团队:3-5人(或远程)。
工作效率:
问题1:和大公司不同,没有成熟的架构、流程,一个人往往要承担多人的工作。
问题2:时间窗问题,如果效率不高,短时间内做不到一定的质和量,就要被竞争对手搞死啦~
所以:工作效率对于早期初创团队至关重要。
本质:专注核心业务。以最短的资金和时间投入,完成非核心、但是必须要完成的事情。
要素
要素1:不要重新发明轮子。
要素2:以最低的成本(包含资金和学习成本),发现和使用最高效的工具。
个人时间管理
日历
Google:国内速度极慢,不间断被屏蔽。
Calendar(Apple):苹果设备间同步。
重点:个人时间管理。我没有用Any.do、WunderList等。暂时用不同颜色,来区分:1、公司项目,2、兴趣项目,3、个人安排。技巧:每周末需要花足够多的时间,安排下周的工作,确定重点。
硬件配置
多屏幕切换:扩展屏幕。浏览器、Evernote等放在大屏幕。聊天窗、邮件回复等放在小屏幕。
键盘、鼠标:对于每天和电脑打交道的人来说,一个机械键盘真的能提高打击的愉悦感和效率。
Mac/iPad/iPhone:Mac处理工作。iPad回复邮件。iPhone回复微信。
重点:很多人以为是装逼,其实真的是,也不全是。多屏幕解决的第1个问题是:同步处理多件小事情。举例:日历、微信、QQ、换歌同步处理。多屏幕解决的第2个问题是:平行的思考一件大事情的几个部分。举例:浏览器查资料、Evernote记录内容、回邮件。
思考内容沉淀
简书:把重要的内容沉淀下来,避免重新思考一样的事情,方便把问题的核心复制、传递~
翻墙
云梯:不解释…云梯的一个好处是,可以自由选择台湾、日本、美国、香港等不同线路,选择其中速度最快的一条。
公司内部管理
项目管理
Fengche:前一个月免费,后续收费。
TeamBition:对于互联网、设计、广告、传媒行业有流程优化。
Pivotal Tracker:程序员专用利器。
重点:任务的布置最好由Team Leader来做。这是一个思考项目整体的机会,以及静下来思考每个任务如何落地操作、难以程度、安排多少时间、几个人、任务顺序、优先级、性价比的最好的机会。即是Team Leader静下心来反思整体项目最好的机会。
文件共享工具
百度云盘:酷盘自从被收购之后,整个人都不好了…
Dropbox:对于小团队来说Dropbox基本够用了,功能也够全(或者Box)。
Google Drive:需翻墙,你懂得…
重点:合理地利用文件共享工具,能够避免很多邮件传来传去的时间。另外,高阶的文件协同编辑的功能也可以考虑~
实施会议
Fuze:远程团队沟通非常适用。
iPhone:如果只是通话,苹果自带的多人通话已经非常好用。
微信群
微信:多人工作交流不二之选。
重点:合理设置群名称、针对性挑选置顶群是一门学问。
Evernote
项目知识树链条:TeamBition、Evernote、简书。Evernote在整条知识树链条中处于中间环节。上游由TeamBition来梳理项目的整体和每个任务。下游由简书来沉淀思考、进行分享。Evernote在中游承担零星知识点的积累、梳理、归档的功能。Evernote同时也可以部分承担CRM管理、项目管理的职责。
重点:技巧1:合理地设置笔记本组、笔记本、笔记的三层关系。技巧2:充分适用Evernote提供的小功能,比如:演示、分享等。
企业邮箱
QQ企业邮箱:免费、设置方便、速度快、超大附件上传。
客户关系管理
MikeCRM:HighRise在国内的速度实在太慢。
重点:MikeCRM的几项功能:XLS导入联系人、联系人分组、邮件群发、在线问卷调查/回收。
其它
财务管理:挖财。
易耗品管理(InnoSpace广告贴):R2
项目运营
活动发布平台(做活动)
活动行:针对国内。
EventBrite:针对国外。
视频制作(做视频)
Powtoon:傻瓜式视频制作工具,整个视频制作过程和PPT制作类似。长于1分钟的视频,收费15美金/月。
重点:对于质量要求比高的视频,字幕和背景音乐是个难点。
海报(做海报)
简图:iOS APP,简洁的排版、文字少、速度快。微信转发适用~
Phoster:iOS APP,模板多。
海报工场:iOS APP,模板多(美图秀秀出品)。
Canvas:适合对设计要求较高的人群。
核心:学会”Say No”
提高工作效率的目的是:争取更多的时间段,在状态最好的时间窗内,集中处理最重要的事情~
最核心的技巧是:学会”Say No”。不要让不重要的人和事打断你。如果不确定,要有能力在最短的时间内做出判断,然后坚定地”Say No”。
“一个好销售的核心能力,是能在最短的时间内精确判断这个人是不是值得花时间去争取的客户。”

初创团队工作流与开发模式探讨

2012年版本

http://saturn.yoozi.org/iTalk/#title-slide

初创团队工作流与开发模式探讨胡杨刚(a.k.a. Saturn)
Slides and Source on Github Me 2012/11/18 ku6.com, Beijing Video
主题 Walkthrough

初创团队协作工具选型及各自角色
高效协作开发三剑客:Basecamp、Github、QQ 企业邮箱

基于 Git-Flow 的 Web 开发模型
简单介绍 Git 及 Git-Flow 开发模型

使用 Git 对 CI 应用进行自动化部署
Case Study: 利用 Github Service WebHook 调用脚本执行自动化部署

协作/开发工具选型标准 Considerations

体验:是否简单易用?
降低因引入新的工作软件/模式所带来的学习成本。

协作:是否方便多人远程协作?
完全线上协作,集中资源闹革命;不必再为无法找到合适的本地人才而烦恼。

信息整合:是否支持丰富的 API 功能?
API 方便将团队所有工具信息流进行整合、归档,形成团队专属知识库/Bug集中营。

成本:是否需要花费精力维护?是否便宜?
选用在业界具有知名度的 SaaS 型工具,降低软件维护成本和财务成本。

推荐方案 Recommendation

适合 10~50 人之间的开发团队,每月固定财务花费约 200 USD(~ 1400 CNY)。

Basecamp:产品设计与规划执行
用例:产品功能讨论(Messages)、文档协同撰写(Writeboards)、待办事项(To-Dos)、团队日历(Calendar)和时间管理(Time Tracking)

Github:源代码管理与缺陷跟踪
用例:代码托管(Git)、产品功能路线图(Milestone)、代码审查(Code Review)、Bug 跟踪(Issues)

QQ 企业邮箱:信息中心与消息推送
用例:通过绑定 QQ 或微信,将开发相关任务即时、准确的传达到每位订阅成员。

工作信息流 A Workflow for startup

Basecamp:制定产品规划与开发分工
QQ企业邮箱:成员参与讨论与制定规划
微信/QQ:推送订阅信息到指定成员
Github:开发所需功能、缺陷跟踪
生产环境服务器:自动部署上线

Why Git?

Git – the stupid content tracker
Git Manual
相较集中式版本控制工具 CVS / SVN 等,Git 的特点主要包括:

分支(Branching)成本较低。
合并(Merging)操作简单直观。
分布式离线操作。
Why Git?

Photo credit to nvie.com.

Git-Flow:一个 Git 分支模型

Photo credit to nvie.com.

简单部署模型:架构

Photo credit to https://github.com/logsol/Github-Auto-Deploy.

开发人员将代码 push 到 Github 远程服务器(Remotes/Origin)时:

触发 Git Post-Receive Hook(Git Origin 接收并处理完当前 Push 请求后均执行此钩子)。
Github 将当前 push 信息以 HTTP POST 方式调用给事先定义好的 WebHook Url(s)。
WebHook Url(s) 对应一个或多个专门用于处理产品部署逻辑的 HTTP 服务。
HTTP 服务接收 POST 数据、执行部署逻辑(如压缩合并文件和重置缓存等)、完成部署。
简单部署模型:HTTP 服务配置

HTTP 部署服务需以 Daemon 形式长期驻留系统,推荐使用 Python/Node.js 编写。

{
“port”: 8001,
“repositories”:
[{
“url”: “https://github.com/cnsaturn/iTalk”,
“path”: “/your/local/path/on/target/server/here”,
“deploy”: “make deploy” // 自定义 makefile
}]
}
简单部署模型:HTTP 服务

采用 Python 编写、用于解析 Post-Receive Hook POST 请求的 HTTP 示例服务核心逻辑:

def pull(self, path):
if(not self.quiet):
print “\nPost push request received”
print ‘Updating ‘ + path
call([‘cd “‘ + path + ‘” && git pull’], shell=True)

def deploy(self, path):
config = self.getConfig()
for repository in config[‘repositories’]:
if(repository[‘path’] == path):
if ‘deploy’ in repository:
if(not self.quiet):
print ‘Executing deploy command’
call([‘cd “‘ + path + ‘” && ‘ + repository[‘deploy’]], shell=True)
break
简单部署模型:部署逻辑(1)

程序部署除代码直接更新外,通常我们还需要处理如下问题:

前端代码优化
如压缩合并 JavaScript/CSS 文件、压缩和优化图片、CDN 文件同步。

更新程序运行环境变量
如 CI 入口文件 index.php 中的 ENVIRONMENT 常量。

数据库结构变更
重置/预加载系统缓存等其他部署逻辑。
简单部署模型:部署逻辑(2)

为了解决此问题,通常会使用 Make / Ant / Maven 等 Build 工具来实现自动化操作:

前端文件的处理使用比如 uglifyjs(npm包)、jshint(npm包)、yuicompressor(jar包)来实现。
环境变量的替换可以事先制作成模板,然后按需替换。
数据库结构变更在 CI 中可使用 DB Migration 库轻松实现。

一个想法变成靠谱的创业项目

大部分的创业想法一开始都是十分不靠谱的,都是满怀对理想中的未来充满憧憬,觉得所有人未来应该是这样,客户对这个需求庞大甚至超出预估值,自己找到了新蓝海,自己在改变世界,那么理想与现实差距到底有多大呢?这次我把朋友的一个创业想法的演变过程展现给大家看看,这样可以让大家看到更多细节,可以更清晰地了解一个不靠谱的创业项目想法如何变成一个靠谱的创业项目。
从一个想法,变成一个靠谱的想法
文浩是在一次偶然的机会下看到刘子骏创办的小猫家网站后认识的,他加了我在网站上留下的QQ号与我交流他的创业计划。文浩之前是在四大会计事务所之一的机构工作,是项目组的经理,虽然待遇还可以,但他每天的工作就是要对着一大堆渺无生趣的数字,然而他觉得这不是他想要的生活,所以他开始计划起自己的创业项目,当他看到小猫家的网站后觉得这很符合他创业的风格,所以主动与我交流,并约我出来面谈。
我有一个想法
在他朋友的酒吧里,文浩拿出iphone手机给我展示了一些国外知名的创意家具品牌,还有一些做创意家居概念设计师做的作品,他说他有一个想法,想创办一家专为年轻人打造的创意家居公司,并且联系了一些国外的设计师可以帮忙做家具的设计,希望可以打造出国内知名的家具品牌出来,然后问我觉得怎么样。其实我做小猫家也是因为对创意家具产品有浓厚的兴趣才创办的,文浩的想法跟我的兴趣点很合拍,所以我很赞赏他的创业项目。不过这次见面我们也只是闲聊了一些家居网站和家居款式,没有聊到具体如何开展如何经营等问题。
然后接下来的几次我们都是约在这家酒吧里聊,但是聊了好几次之后我发现每次跟文浩聊的很多都是行业趋势,行业动态和概念性的东西,没有聊到具体应该如何把想法实现的层面上。所以有一晚我就跟文浩说,这样聊下去是不会有结果的,我们应该聊的是如何把想法落实到行动上,这样我们的交流才有意义,否则我们的思路一直在场外跑,这不会有任何进展的。当时我们是在聊的很开心的情况下,突然被我杀出这句话,文浩立刻被震惊到了。其实在当时聊天的过程中,我大概知道文浩一直有一些顾虑,家具不像快消品,买了一次可能要很久很久才会买第二次,所以用户黏性和用户的边际价值不会很大,这样是很难形成规模式的增长。而且生产能力也是一个很大的问题,所以综合各种原因让文浩开始犹豫不决。
第一次转变
在相隔几个月之后,文浩再次联系我,这次他说已经找到很好的方向了,这次依然是做家居产品,但是不再做大型的家具,只做小型的家居用品,例如泰国进口的手工皂,还有一些小型的收纳柜子等等。并且还屯了不少货,看上去比之前更有信心了。毕竟这次选的都是小件物品,而且都是家居型的快消品,这些产品不再有之前的众多顾虑了。不过他进的这些产品在网上同类太多了,加上价格没有太多优势,而且他的业务市场就是在互联网,所以最后也只能先放放。
第二次转变
就在前两个月文浩再次联系我,不过这次转变很大,可以说是直接转型了,确实让我很惊讶。这次不是做家居产品,而是直接转成做蛋糕了。他觉得生活只需多一点情趣,多一点惊喜,多一点味道就能让生活品质变得更美好,所以他的品牌叫”一点”,英文名Little&CO。选择蛋糕是因为蛋糕是最好的媒介,蛋糕给人的感觉就是快乐和喜悦,所以他要从这一点开始为顾客的生活带来惊喜。他借鉴了很多蛋糕店和蛋糕培训机构,他觉得去蛋糕店完全直接购买一个现成的,太没有心思了。但是如果完完全全靠自己去学习去制作,这要花费太多的精力和时间了,而且自己去采购所有的原材料确实挺麻烦的,所以他这次采用的是提供一整套完整的原材料和工具,并且把部分材料优先处理好,这样顾客就不需要电子秤,量杯,量勺等工具了,让原本需要1个多小时完成的蛋糕,现在只需20分钟即可做完所有功夫。这样对于客户来说既减少了原材料采购的时间和麻烦,也加快了制作蛋糕的速度,而且这块还没有任何蛋糕企业在做,所以他对这块蓝海充满信心。
考虑到目标消费群体都是年轻一族,所以他选择了冻酸奶蛋糕作为主打产品,蛋糕的主要材料就是冻酸奶,饼底采用消化饼+黄油,这样感觉会更香脆。选择这款蛋糕也是考虑到很多家庭都没有烤箱,而这款蛋糕只需要有冰箱就可以制作了,这确实能让顾客可以更简便地操作和降低了顾客的成本。这款蛋糕吃起来不会像传统用奶油制作的蛋糕那么腻,而且夏天吃会有种吃雪糕的感觉口感特好,确实挺适合夏季推出。很快文浩就买齐所有的工具和设备,然后邀请我过去体验了一下制作蛋糕的过程,这个过程确实很快,对于一个没有制作蛋糕经验的我来说确实能在20分钟左右就可以完成蛋糕的制作,当然这是有文浩的帮忙才这么顺利。当时就只差设计师出外包装和LOGO,项目就可以完全启动了。
第一个顾客发现的硬伤
我把我第一个亲手做的蛋糕带回公司与同事们分享,同事们品尝后都觉得味道不错,总共15人,14人给了好评,1人觉得还可以,成绩不错。最后大家都给了不少建议,觉得饼底可以再做厚一些,口味可以再多一些等等。我把信息反馈给文浩,他也很高兴,毕竟他的产品获得了大家的认可。
隔了一个多星期之后,同事小强走进了我的办公室,说他女朋友下个星期二生日,他品尝过我做的蛋糕,觉得很不错,所以自己也想做一个送给他的女朋友,给她一个惊喜。我立刻把这个好消息告诉文浩,他也非常高兴,这是第一个真正付费的顾客,然后文浩就立刻去安排材料等事情了。我也很高兴的去跟小强说一切都没有问题,但是突然我想到了一个问题,我问小强你家有没有打蛋器,因为做蛋糕手打是不行的,不单止效率慢,而且能把蛋糕做好的几率几乎为零。当小强回复” 木有”的时候,我的大脑跳了一下,这怎么办呢?小强也不会为了做个蛋糕专门去买一个可能一年才用一次的打蛋器。如果借打蛋器给小强用,这是可以的,毕竟是同事,但是其他顾客呢?不可能每次都连打蛋器一起卖吧,当然这也可以,但是如果我们的目标顾客群体是针对每天早九晚六的年轻上班族,他们有多少愿意这样来配套购买呢?首先在我面前的小强一定不会,很多顾客也不会,因为他们要的是蛋糕,而不是打蛋器。
这个周末我约了文浩出来给他说我想到的东西,我把小强的情况跟他讲了一遍,确实有很多年轻人家里都没有打蛋器等工具,所以如果这样看来这项目的经营模式对于顾客端来说太重了不够轻,顾客除了购买我们的产品,而且还需要购买其他配套的东西,这是很难推广项目的便利性的,所以说这是这个项目的一大硬伤。
还有顾客购买的是半加工后的原材料,虽然减少了部分工作量,但是针对的用户群会非常模糊,喜欢做蛋糕或会做蛋糕的专业人群一定不会给你指定的原材料绑死,他们会自己采购喜欢的原材料来制作蛋糕,普通消费群体对做蛋糕一窍不通,单纯给原材料和教程他们一定只会做出一个失败的作品,就像我没有了文浩这样有制作蛋糕经验的人带着做,我做的蛋糕也会失败。而且这还没有完,当顾客购买你的东西制作失败后,他们会觉得你品牌的产品真烂,心里各种负面情绪都会展现出来,在这个自媒体时代,负面信息传播速度是最快的,后果可想而知。
最后我给文浩建议把模式改成直接做好整个蛋糕基底卖给顾客,然后让顾客在上面自己DIY放水果放自己喜爱的食物,这样不但可以大大减少了顾客很多不必要的劳动,而且增加了客户参与感和乐趣。毕竟做蛋糕基底又繁琐又无趣,而且又凸显不了顾客的自我价值,但是如果顾客可以在一个现成的蛋糕基底上发挥自己的想象力和创意,我觉得这才是顾客想要的,而且这对于顾客来说非常轻便,只需要去买点水果什么的就可以自己设计了。这种模式最最大的好处是带给顾客更轻便的体验,而且又不丢失顾客的参与感。
这模式还能延伸很多周边消费,例如我们可以提供蛋糕花样的制作教程,我们可以把材料和制作教程一起卖,还有如果顾客需要制作特殊的花纹图案,我们也可以销售花纹磨具给顾客,而且我们还可以定制包装盒,让收到蛋糕的对象获得更多惊喜。
其实我们公司之前同事生日的时候,我们就尝试问过很多蛋糕店,蛋糕店基本都不干,他们就是靠蛋糕上面的花纹样式设计来赚钱,单单卖个蛋糕基底给顾客看上去就不那么值钱了,而且这样也卖不出多少钱,所以蛋糕店一定不会这样干。而蛋糕培训中心呢,他们主要是培训做蛋糕的整个流程,如果只是教教他们在蛋糕基底上设计样式,可能就收取不了几千块甚至上万块的培训费了。所以这样的模式才有突围的可能,项目的运营和推广工作才会更容易开展。
以上就是一个创业项目想法的整个演变过程,我们注意到一开始大家都是很理想化地思考项目的前景而忽视了项目要面对的诸多问题,所以不要被你理想化的思路忽悠到,大量现实的问题都隐藏在理想化的下面。就像我提醒文浩要把思路回归到执行上面后,他就发现原来项目要实现起来会有这么多阻力,考虑到阻力太大并且无法解决的时候,适当作出改变是很好的解决方式。有很多创业者盲目地信奉坚持就是胜利,最后越做越困难越做越不好做,最终导致失败。所以当你准备执行你的创业项目时,发现原来有很多顾虑都没有很好的方式来解决的时候,这就表明你的地利不足,可以适当考虑调整业务模式或转型,甚至停止,没必要去硬碰南墙。
没有完美的想法和计划,只有执行时不断的补丁
其实当所有产品和想法都没有触碰到真正消费者的时候,这个项目都只是个人的猜想或个人的需求而已,并不代表市场。你看做这个蛋糕项目大家都觉得想法不错,大家品尝蛋糕的时候都给予了相当好的评价。但是当遇到第一个真正顾客小强的时候,项目的硬伤立刻就凸显出来了。注意,这个消费者并不是你请朋友品尝,请朋友评价就能获取到真正需要的信息,必须是消费对象有这样的需求,并且愿意付费的情况下,这样才能发现真正的问题。
还有现在的创业模式必须够轻才能快速走起,这个轻不单指企业的经营模式,消费者那边的使用也要够轻才行。像刚刚蛋糕的项目,企业要花时间来把原材料加工,消费者也需要购买工具,有了工具还未必能把蛋糕做好,所以这种模式对于企业和消费者来说太重太麻烦了。经过改良后,企业直接批量制作蛋糕底盘就可以,而消费者买了蛋糕底盘只需要买些水果等材料就可以轻松实现DIY蛋糕的梦想了,两边都轻松,而且够简便。
可能最初的那个想法是你一直想做,但是鉴于现在的能力和资源不能实现,那可以先放放,找一个能符合你现状的项目启动它,当你有钱、有人脉、有资源的时候回头过来再做也不迟。或许到那个时候你会发现现在做的项目原来是可以跟最初的想法完美结合成一个新产品或新模式。就像上面的例子,文浩一开始想做的是家居产品,后来改做蛋糕,说不定以后家居产品和蛋糕可以结合成新的商业模式呢。
所以说创业是没有完美的想法和计划,只有执行时不断的补丁!