nonocast

Stay Hungry, Stay Foolish.

接着Part 1,这里介绍一下Upstart操作方式,首先安装Upstart, debian下直接apt-get install upstart,然后输入确认内容即可。

在/etc/init下编写配置文件,如hello.conf

description "hello service"
author "nonocast"

start on startup
stop on shutdown

respawn                # restart when job dies
respawn limit 5 60     # give up restart after 5 respawns in 60 seconds

script
  # Node needs HOME to be set
  export HOME="/home/www"
  chdir /home/www/gitd
  exec sudo -u www sh -c "/usr/local/bin/coffee /home/www/gitd/app.coffee >> /var/log/hello.log 2>&1"
end script

exec表示需要upstart控制的主程序,upstart会替我们很好的照顾exec启动的程序。

然后通过sudo start hello即可启动程序,同时还支持stop, restart, status,这里的start,stop命令都是initctl start,stop的link,提一下。
如果配置文件有问题,通过/var/log/upstart下的日志查看错误原因。
通过tail -f /var/log/hello.log即时查看node日志。
通过sudo initctl list可以查看upstart所有执行的服务。
同时,如果只是修改coffee内容,对应restart就可以重新加载,而如果修改了hello.conf,则需要sudo initctl reload hello更新upstart script。

关于upstart最后再补充一句,看上去upstart只是一个更好的init.d,事实上,更好的理解是upstart是一个系统级的hook,当收到系统的event时做出对应的响应,好比说插入U盘也能触发script,同时支持自定义Event,然后通过initctl emit触发,这个和node中event/emit异曲同工,而系统启动和系统关闭只是众多event其中的一种而已,所以不要曲解了upstart。

upstart中respawn虽然也能做到程序意外退出的重启,但始终还是不够的,就像StackOverflow上所说,

I highly recommend using both Monit AND upstart. Upstart makes it easy to deamonize node.js and Monit comes packed with tons of useful app checks including memory usage, http requests, cpu usage, ...

比如说程序虽然运行,但http请求无法响应,这种情况只能依靠Monit来做更复杂的判断,保证你的服务可持续性,同时他还可以在监测异常给出邮件、短信提示,让一切尽在掌握中。

debian下sudo apt-get install monit安装。安装完成后/etc/monit/monitrc是整个monit的配置文件,而/etc/monit/conf.d下放置针对你要监控的所有script,

vi /etc/monit/conf.d/hello.monitrc

check host hello with address 127.0.0.1
     start "/sbin/start hello"
     stop "/sbin/stop hello"
     if failed port 4000 protocol HTTP
          request /
          with timeout 5 seconds
          then restart

安装monit后,monit会自动生成一个init.d script,所以还需要sudo update-rc.d hello enable将monit加入启动,重启后通过monit status就可以查看服务状态了,如果手动关闭hello(sudo stop hello),monit status会看到应用offline,如下图,

再次刷新后,就自动还原为online,同时浏览器也可以继续访问网页,所以说Upstart+Monit就基本很好的照顾了Node,Enjoy it.

参考内容:

继续上一篇的话题,debian启动默认走init.d,不过随着upstart的出现,选择差不多如下,

选择的关键指标:

  • 通用性:Debian, CentOS and others
  • 先进性:实现方式
  • 功能性:start, stop, restart, status, reload
  • 易用性:script尽可能简单
  • 依赖性:越少依赖越好
  • 容错性:支持自动重启

就当我还在纠结init.d和upstart时,突然发现pm2 startup debian就直接将pm2部署到init.d中,才发现pm2才是终极方法,当然搞清楚背后的原理总是必须的。终于体会到众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

不过,pm2由于封装的太多,以至于很难透过操作看到背后运行的机理,而且文档少得可怜,同样的操作在虚拟机上就ok,但VPS怎么折腾启动都不能resurrect,一定要手动才行,很多人说竟然要cron配合手动resurrect,OMG。最后还是用了Upstart,合理的封装机制,透明的运作方式,详尽的文档,就它了。

参考内容:

Linux上的daemon等同于Windows上的service,我们更多的用Linux是作为设备服务,而非桌面交互,所以daemon就显得无比重要,因为不管是node, 还是socket server都是以daemon的形式出现,即开机启动立即提供服务,而不是需要shell进行交互。

阮一峰的blog已经将Linux的启动从宏观面上说的很清楚了,基本过程如下,

  • 加载内核: /boot
  • 启动初始化进程: /sbin/init
  • 确定运行级别: init首先加载/etc/inittab确定runlevel
  • 加载开机启动程序: init根据runlevel对应加载/etc/rcN.d下的script(rc:run command)
  • 用户登录: 完成rc后才准备用户登录,3个途径: shell, ssh, x。换句话说,在登录前服务都已经运行了。

以debian为例,daemon需要script驱动,管理方式如下,

  • 编写daemon script,放入init.d
  • update-rc.d管理script
    • update-rc.d script-name defaults, 将script在rcN.d下建立对应的link
    • update-rc.d -f script-name remove, 从rcN.d下移除script的link
    • 所有的script都应放在init.d目录下,而rcN.d仅作link即可

这里再解释一下daemon script,事实上script的生命周期很短,脚本执行完自然就结束,所以真正提供服务的程序只是在script中被调用,script只是用来控制服务而已。这个地方不是说不容易理解,而是和windows上的service有所不同,仔细体会一下。

一个最简单的daemon script如下,

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    ;;
  stop)
    echo "Stopping script blah"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

blah一旦update-rc.d后就可以开机后自行启动,同时在shell中也可以控制script,比如/init.d/blah start或/init.d/blah stop。

参考内容:

在linode上部署ssh服务最简单的方式还是走ssh,访问的url如下,

ssh://git@vpn.nonocast.cn/~/test.git

简单说明一下,git是linode上debian的用户名,vpn.nonocast.cn是域名,也可以是ip address,~/test.git是路径,对应到/home/git/test.git,test.git是一个文件目录。

基于上述描述,需要执行一下动作,

创建用户

注:以下内容基于debian 7.5,其他系统自行对应即可。
$ useradd -m git
$ passwd git
这里要说明的是为什么不用已经创建好的用户呢,比如nonocast?考虑到权限问题,一旦你放开账号和密码给你的同事,那么你的同事就能访问你home下的所有文件,这肯定是你不愿意的,所以单独开一个git account,那么将来公开git account,那么也仅仅能访问git账户中home的内容。如果git库本身还区分security level,那么开不同的account对应即可。

最后关闭git账号访问shell,防止直接操作服务器上文件,将/bin/sh替换为/usr/bin/git-shell,vi /etc/passwd修改为如下,

git:x:1001:1001::/home/git:/usr/bin/git-shell

再次以git登录会显示,

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to vpn.nonocast.cn closed.

continue reading...

花了一天的时间搞定vpn,首先说一下思路,vpn是虚拟网络,就是在TCP/IP之上的网络,非常高级,后面解释。所以我们要做的就是在你的电脑和linode主机间建立一个连接,然后让你电脑的所有数据包都发送至linode后返回。比如说你要访问twitter,那么请求从shanghai发起,经tokyo(linode)然后到us,us的web server返回到tokyo最后返回到shanghai。

vpn是一个大的框架,其中PPTP(Point to Point Tunneling Protocol)是vpn的一种实现,这种实现较之其他实现的优势是速度快,普及性强(mac, iOS, linux, windows都支持),缺点就是对网络设备有点要求,差点就死在这里。

continue reading...

最近一直沉溺于写文档,OMG,晚上思路实在一泡5,所以一不小心注册了Linode,虽然之前一直在Linode和DO间犹豫,最后还是选择了Linode,关键是DO还是有点慢,另外国内什么什么云的就算了,就翻墙和稳定这2点就出局了。

VPN能干什么? website, mail server, blog, git server关键还有vpn。

回顾一下整个流程,

  • 注册账号,然后选择了Linode 1024 ($10/mo),1 CPU CORE/1GB RAM/24G SSD
  • 选择tokyo,你懂的,不用解释了吧
  • 1分钟安装CentOS
  • 安装完毕后ssh root@<your-ip-address>
  • 新建用户
    [root@h705c /]# useradd nonocast
    [root@h705c /]# passwd nonocast
  • 升级权限
    $ su
    $ vi /etc/sudoers

    在root ALL=(ALL) ALL下加入nonocast ALL=(ALL) ALL即可,这个在之前的blog中介绍过。

  • 安装nginx,从nginx官网下载main version然后yum install一番,最后就是configure --prefix=/opt/nginx, make, make install
  • sudo /opt/nginx/sbin/nginx
  • http://<your-address>
  • 最后将域名指过去,万事大吉

最后效果如下图:

补充一下关于ssh lish key这样可以避免每次输入密码,这个和github一样的,

  • 首先在你的电脑上生成key: ssh-keygen,在~/.ssh下id_rsa为私钥,而id_rsa.pub则为公钥
  • ssh进入linode远端电脑,把目录建好,mkdir ~/.ssh
  • 回到你的电脑上传公钥至远端电脑,
    scp ~/.ssh/id_rsa.pub nonocast@linode.nonocast.cn:/home/nonocast/.ssh/uploaded_key.pub

    上文的格式差不多可以理解为: scp 本地文件路径 用户名@域名:远端目标文件路径,其中用户名省略即采用当前shell的用户名。

  • 确认sshd_config以下三行没有注释掉,
    RSAAuthentication yes #启用 RSA 认证
    PubkeyAuthentication yes #启用公钥私钥配对认证方式
    AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径
  • 下次从我的电脑登录就无需密码牵挂

Enjoy!


如果是debian,那么步骤如下,

  • $useradd -m username //-m 自动创建home目录
  • $userdel -r username //-r 删除home目录和mail
  • ssh-keygen + ssh-copy-id, vi /etc/ssh/sshd_config中去掉AuthorizedKeysFile的注释,然后/etc/init.d/ssh restart即可
  • chsh到/bin/bash或者安装zsh (apt-get install zsh然后wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh最后chsh -s /bin/zsh)
  • apt-get install nginx然后sudo service nginx start

参考文档:

尝试了Page, LaTex之后发现还是用HTML写文档最爽,控制力度绝对大,而且又有bootstrap支援,同时支持Git,当然为了避免中英文反复切换可以采用Jade。由于每次修改后都需要到Safari中cmd-r,有点麻烦。配合grunt, grunt-contrib-watch以及osascript就可以完美完成safari自动刷新,包括本地文件。

grunt中本身的Livereload对safari支持非常不好,而Chrome就很OK,不管是嵌入script还是browser extension,所以 safari还是需要osascript来搞定。

打开safari显示localhost:3000对应的script如下,

#!/usr/bin/osascript
tell application "Safari"
  open location "localhost:3000"
  activate
end tell

通过grunt则需要配合watch,内容如下,

module.exports = (grunt) ->
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-contrib-jade'
  grunt.loadNpmTasks 'grunt-contrib-watch'

  grunt.initConfig
    watch:
      files: ['view/*.jade']
      tasks: ['reload']

  grunt.registerTask "reload", "reload safari on OS X", ->
    script = "osascript " +
        "-e 'tell application \"Safari\"' " +
        "-e 'open location \"localhost:3000\"' " +
        "-e 'activate' " +
        "-e 'end tell'"

    require("child_process").exec script

  grunt.registerTask 'default', ['watch']

Enjoy!

参考内容:

背景

1942年,郭士纳出生于纽约长岛。1965年,23岁的郭士纳获得哈佛商学院的MBA学位,随即加入麦肯锡管理咨询公司,28岁成为麦肯锡最年轻的合伙人,33岁成为麦肯锡最年轻的总监,13年的麦肯锡磨练和实践奠定了扎实的基础。

1993年4月1日,担任IBM CEO,此时的IBM可以说是最为危险的时候,分分秒秒破产的节奏,9年后,2002年,郭士纳离开IBM,此时的IBM股价上涨1200%,完成逆转。

P1. 掌舵领航

郭士纳第一次会见搞IBM管理高层时是这样介绍他的管理哲学和管理实践,

  • 我将按照原则而不是程序实施管理。
  • 市场决定我们的一切行为。
  • 我是一个深信质量、强有力竞争战略和规划、团队合作、绩效工资制和尚烨道德责任的人。
  • 我渴求那些能够解决问题并能帮助同事解决问题的人,我会开除那些政客式的人。
  • 我将致力于战略的制定,执行战略的任务就是你们的事了。只需以非正式的方式让我知道相关的信息,但不要隐瞒坏消息--我痛恨意外之事,不要试图在我面前说谎,要在生产线以外解决问题,不要把问题带到生产线上。
  • 动作要快。不要怕犯错误,即便是犯错误,我们也宁愿是因为行动太快而不是行动太慢。
  • 我很少有等级制度的观念。无论是谁,也无论其职务高低,只要有助于解决问题,大家就要在一起商量解决。要将委员会会议和各种会议减少到最低限度。取消委员会决策制度,让我们更多一些坦率和直截了当的交流。
  • 我对技术并不精通,我需要学习,但是不要指望我能够成为一名技术专家,分公司的负责人必须能够为我解释各种商业用语。

*高层/管理层负责战略制定,经理们负责战略执行。责任一定分清。

然后为上任90天制定了5各优先级任务,分别是:

  • 暂时冻结流动资金。
  • 确保我们将在1994年实现盈利,并向全世界以及IBM各分公司穿个口信:公司经营已稳定。
  • 开发和实施1993-1994年的关键客户战略,这将会使客户相信,我们又回来为他们的利益提供服务了,而不是强迫他们接受我们的“固定产品”(电脑主机),以便减缓我们自己短期的财务压力。
  • 在第三季度开始的时候要完成精简裁员任务。
  • 开发一个中期的商业战略。

最后,我对这5个90天优先性任务做了分配。我要求每个分公司的负责人都要交给我一分10页纸的报告,内容包括:客户需求、产品种类、竞争力分析、技术前景、经济情况、长期和短期的关键问题以及1993-1994年的发展前景。

我还要求所有的与会者想我描述他们对IBM公司的总体看法:我们将采取什么样的短期步骤以进一步加强客户关系、提高销售业绩以及应对激烈的竞争?我们应该如何思考我们的长期和短期商业战略?

continue reading...

今天从Infoq上看到文章有关微服务架构的争论:更简单还是更复杂?时,然后又跟进了MF的Microservices,坦白说这是我的菜,但问题的关键是我们需要有质疑精神。

很多年前我就开始抛弃结构化数据库,仅仅作为非结构的持久话容器,通过内存来做对象模型的载体,然后又通过嵌入HTTP服务提供Restful API,SQL、ORM、存储过程这种变态的东西实在不值得花时间,不管是HANA,还是Mongodb, Couchdb都一一证明这个思路,而MF从ORM倡导者也逐渐退出。很多事情其实从开始就错了,每种应用都有他适合的环境,你就几百M的数据有必要上Oracle吗?

另外我绝对看死所谓的View Engine,即esp, jade。HTML早晚需要和Web Framework分离,HTML+JS/CS就构成了完整的前台网页应用,而后台就是以json/xml的方式提供服务,当然你可以说过往浏览器不那么好支持JS,那不过就是多一个过渡缓冲层罢了。所以说一旦后端以服务出现,只要你结合Nginx这类反向代理的思路你一定会迅速拆分服务,做到服务可替换,基本设计原则(LSP,Liskov Substitution principle)。

所以Microservices不过是对Restful下SOA重新的定义,所以在虚拟化的大背景下,HTML/JS APP配合服务群是必然的。

C5. 提问的重要性

  • 销售不是说,而是问。
  • 两个关键点:一是问的问题,二是从对方回答中获取的信息。补充一点,问的对象很重要。
  • 销售中的一个原则是,把70%的会面时间用于问问题,而己方用于阐述的时间不要多余30%。
  • 问题需要提前设计,做到有备而问。比如这位客户的决策权有多少?有权签单吗?他过去买的产品是什么?为什么会买它?对现有的供货商满意吗?上一个供货商是谁?为什么不再于对方合作了?希望现在供货商能做出什么养的改变?等等
  • 有时候,在你发现客户其实不需要你的产品或服务时,最好直接对他们说:“不用买这个。”这么做能真正体现出你是个真诚的人,而这一点正是优秀销售人员的必备品质。并且,此举会给客户留下难以磨灭的印象,加深他们对你的信任,从而为今后的合作打下良好的基础。
  • 了解了过去才能把握现在,继而着眼未来。把每次与客户会面的机会看作一次实际情况调查,在谈到目前的情况时,先了解一下过去的情况。通过聊过去,你已经从客户以往的产品体验中了解到了他的喜好,所以“未来”这个步骤基本都能顺利完成,你甚至还能从他那里得到回馈,在策略和步骤方面加以提高改善,把这些意见和建议带回公司。这个方法一定好用,因为你是以客户以往的产品体验和最关心的问题为起点,而不是只盯着现在而向客户巧言游说。
  • 在大多数场合下,一个精心准备的问题就是一个能瞬间搭建联系的桥梁。这样的问题不仅会引起别人对你的兴趣,还能促使他们更愿与你分享他们的信息和故事,从而在你们之间建立一个沟通的渠道。
  • 举个例子,你在参加公司大会时注意到公司的CEO在那里,于是就想过去自我介绍一番。你可以这样说:“您好,我是xxx,我在公司的销售部门工作。我想问您一个问题:开办公司以来您最得意的成就是什么?“我敢打赌,他一定会回答这个问题,并且对你留下很深的印象。为什么呢?因为这个问题的主体是他,而不是你。

C6. 提升销售业绩

  • 真正的人际交往是以建立长久关系为目的,而不是为了推销。我这一生中的人际交往都是为了与人结交并在团体和行业中保持知名度。人们愿意跟他们认识、喜欢、信任的人做生意,而不是那些发张名片,只有过一面之缘的人。
  • 以医生为例,从没有医生让我向别人推荐他。一个医生要花很多年时间才能积累一个好名声,不能投机取巧,也没有捷径。要达到这个目标,一是要努力工作,二是要紧跟医学发展的步伐,三是要为每位患者都尽心尽力,四是要让患者感到贴心舒服。
  • 三年不走动,再亲也不亲,我想让客户们记得我。如果我觉得会对客户的事业有帮助,我甚至会把我的竞争对手推荐给他们。有时候我打电话只是向他们问个好。不论是何种情况,关键是我对他们是真诚的,并真的能把他们当回事。这才是我要做的事。
  • “神奇问题”到底是什么呢? “可以跟我说说你们公司里现在的销售培训情况吗?”看到没有?这就是我作为一名销售培训师的“Magic Question”。所谓的神奇问题就是可以撬开对方嘴巴,引领对方谈论你所关心的事情的问题,其要点是真实而直接,最好是从未从其他销售人员那里听到过的问题。
  • 大多数销售人员满嘴废话,只知道跟客户大谈天气和体育。这种对话看起来安全无害,其实是在浪费大家的时间,也不会与对方建立起真正的人际关系。记住,只有通过问问题才能了解客户的需求。
  • 这个方法在30年前我就开始用了,效果很不错。那时我总是随身带一个6分钟的沙漏计时器,每当走进客户办公室,我都会告诉对方,沙子漏完的时候我的讲话就会介绍,这样以来对方将更乐于跟我会面,试想一下,在一天的时间里,谁真的抽不出6分钟的时间呢?
  • 在与对方约定会面事宜时,你可以这样说,“您好,我是xx公司的xxx,我想跟您预约一次6分钟的会面,您可以亲自计时。6分钟的时间里,您或者会对我们公司的产品感兴趣,或者会了解到一些新知识资讯。1分钟我都不多占。”到了与其会面时,我会将沙漏拿出来放在对方面前:“我想问您3个简单的问题,时间一到我就走。”接下来我会问:
    1. 您对我们公司熟悉吗? IF YES THEN 您熟悉那些方面? ELSE 为什么会不知道我们公司呢?
    2. 您对现有的供应商(我的竞争对手)有什么满意以及不满的地方?
    3. 如果您觉得跟我们公司合作会更好一些,您现在是否打算深入了解一下我们的情况呢?

    6分钟一过,接着我就想对方表示感谢,谢谢他为我抽出时间,然后问对方是否可以保持联系,然后告辞离开。桌子后面那个人此时感到惊奇不已,因为我严格遵守了约定。如果他对我推销的产品有兴趣,他肯定会愿意再次与我联系;并且,我严守诺言的表现给他留下了深刻印象,他会从此更加信任我。

  • 这是我以前接到的一个推销电话,打电话的推销员是一家汽车挡风玻璃维修公司的,他先是做了简要的自我介绍,然后问了我一个问题:“您汽车的挡风玻璃上有没有缺口或裂纹?”如果我的回答是“没有”,那么估计他就会说再见了。我的汽车挡风玻璃上恰巧还真有一个小缺口,于是我的回答是“有”。他接着说:“我们可以到您家或您单位为您修补好它,只需要40美元,您觉得怎么样?”我同意了。--就这么简单。

continue reading...


Powered by WordPress © 2014 nonocast   沪ICP备09095148号 Design by SRS Solutions