nonocast

Stay Hungry, Stay Foolish.

在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...

中文竟然被杯具的译成销售如何搞定人,真心吃不消。

C1. 怎样才算是一个优秀的销售人员?

  • 大多数销售人员是在“向”顾客推荐商品,而非“为”他们推荐商品。一般的销售人员所推销的都是能为自己带来最大收益的产品或服务,而不去考虑顾客的真正需求。设想一下,如果销售人员是设身处地为顾客着想,结果会是怎样呢?对了,就是这么回事!他们的眼睛将不再紧盯销售指标、业务提成等事情,而变得真正设身处地为顾客着想。这种总是把你放在首位的销售人员,是否正是顾客想要的呢?反过来说,你有没有遇到过这样的销售人员:他们说你穿某件衣服堪比西施潘安,而你的家人朋友却说丑得才不忍睹...这样的例子举不胜举。而当你遇到一个真心为你着想的售货员时,你是不是因为信任他而愿意在他这里多买点东西?
  • 那些志向远大,想要做出一番成绩的人,可以借鉴我表哥的思路,将病人(顾客)放在首位,然后你就可以安心看着自己的销售业绩增长了,因为顾客信任你。
  • 优秀的销售人员应具备两个素质,即“移情”和“内驱力”。移情即体会到别人的感受,将顾客放在生意之上,尝试换位思考。内驱力即积极性,优秀的销售人员在销售成功时能体会到一种成就感;若是销售失败,则会更加努力工作,而不是为自己找借口或变得垂头丧气。

C2. 优秀的销售人员该知道的东西

  • 销售6原则
    • 了解产品
    • 了解竞争对手
    • 勤奋
    • 有条理
    • 坚定自信
    • 真诚
  • 不要以牺牲真诚为代价换取合同。从没有一单生意能够改变你的人生,也许它能给你带来一个月或一年的好处,但改变人生的合同时不存在的。
  • 销售时人际宣传的结果,而在大多数情况下,人们只听取自己信任的人的推荐。这些人就是你需要“攻克”的对象。如果别人对你的印象是一个真诚的销售人员,他们就会替你做宣传,而你的路子也就躲起来了。名声是你唯一的招牌。
  • 销售的本质是人际传播。销售问询,而非叙述;是倾听,而非倾述。
  • 优秀的销售人员,其探索之心永不停歇。也就是说,他们时时刻刻都在探寻客户的意愿和需求--通过问问题,而不是滔滔不绝一味推销。很多销售一开口就是谈自己的事,谈自己公司的事,谈自己公司产品的事,自我感觉非常好,殊不知,客户早就对他的话充耳不闻,脑子里想的全是中午到哪里吃饭的念头。
  • 销售其实是一个非常简单的过程,在此过程中,你要通过合理安排的问题来弄明白如何迎合对方的需求,而不是无休止地单方阐述。通过问题,你能够深入了解客户的情况,他们所关心在意的东西也会浮出水面,从而可以因势利导直奔主题。

continue reading...

在写到img标签的时候,我又一次犹豫了,因为知道script是必须关闭,而meta, br是不需要关闭的,为什么呢?

StackOverflow给出的解释是这样的,

As Nikita Skvortsov pointed out, a self-closing div will not validate. This is because a div is a normal element, not a void element. According to the spec, tags that cannot have any contents (known as void elements) can be self-closing*. This includes the following tags:

area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr

The "/" is completely optional on the above tags, however, so <img/> is not different from <img>, but <img></img> is invalid.

*Note: foreign elements can also be self-closing, but I don't think that's in scope for this answer.

然后再来看w3的html5文档中关于Element的说明,

8.1.2 Elements

There are five different kinds of elementsvoid elementsraw text elementsescapable raw text elements,foreign elements, and normal elements.

Void elements
areabasebrcolembedhrimginputkeygenlinkmetaparamsourcetrackwbr
Raw text elements
scriptstyle
escapable raw text elements
textareatitle
Foreign elements
Elements from the MathML namespace and the SVG namespace.
Normal elements
All other allowed HTML elements are normal elements.

现在就很清楚了,除void element以外的都需要关闭,void element仅包括area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, war这16个。

Connect作为Express基础架构由TJ出品,Connect 3.0将所有middleware以独立npm出现,不再内置middleware,所以整个Connect 3.0仅有119行代码,connect.js和proto.js 2个文件,整个119行就是在做一个职责链CoR,这次从代码具体看看实现过程和作者意图。

connect.js

首先来看connect.js, 14行代码,看了等于白看,因为根本不知道他意图是什么,

var EventEmitter = require('events').EventEmitter;
var merge = require('utils-merge');
var proto = require('./proto');

module.exports = createServer;

function createServer() {
  function app(req, res, next) { app.handle(req, res, next); }
  merge(app, proto);
  merge(app, EventEmitter.prototype);
  app.route = '/';
  app.stack = [];
  return app;
}

我们来拆解TJ的意图,首先我们知道作为connect的使用方,我们通常会这样来写,

var connect = require('connect');
app = connect().use(...).use(...);
http.createServer(app).listen(3000);

关键就在于http.createServer的这个参数,根据Node API可以看出, createServer需要传入一个function,签名如下,
function (request, response) { }
而TJ为了不改变http.createSever使用惯例,换句话说从legacy切换到connect只需改变createSever参数即可,所以app就必须是一个function,而不能是常规object,所以这里需要借用merge来过渡的唯一理由。

将上述意图用Coffee重写,

http = require 'http'
EventEmitter = require('events').EventEmitter
merge = (a, b) -> a[k] = v for k,v of b if a? and b?

proto =
  use: ->
  handle: -> console.log 'handle..'
  listen: ->
    server = http.createServer this
    server.listen.apply server, arguments

app = (req, res, next) -> app.handle req, res, next
merge app, proto
app.listen 3000

continue reading...


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