life is fun

用小米盒子和酷我K歌将客厅变身卡拉OK厅(解决麦克问题)

发表在玩机教程2014-07-02 15:48:15 来自老版论坛复制链接手机看帖52131582

我从来没觉得自己是个米粉,但我喜欢小米这个朝气蓬勃的公司,从小米创办开始,绝大部分小米的产品我都买过,其中最喜欢的莫过于小米盒子。简单易用,老少皆宜。自从装了电视猫视频能看电视直播后,老爸老妈干脆连电视机顶盒都不用了,每天就盯着小米盒子消磨时光。

Continue reading
Standard
技术

zz 浅谈CSRF攻击方式

浅谈CSRF攻击方式

2009-04-09 22:44 by hyddd, 216765 阅读, 118 评论, 收藏编辑

一.CSRF是什么?

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

二.CSRF可以做什么?

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

三.CSRF漏洞现状

CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。

四.CSRF的原理

下图简单阐述了CSRF攻击的思想:

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。

2.在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)

3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

 

上面大概地讲了一下CSRF攻击的思想,下面我将用几个例子详细说说具体的CSRF攻击,这里我以一个银行转账的操作作为例子(仅仅是例子,真实的银行网站没这么傻:>)

  示例1:

银行网站A,它以GET请求来完成银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000

危险网站B,它里面有一段HTML的代码如下:

  <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块……

为什么会这样呢?原因是银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中的<img>以GET的方式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏览器会带上你的银行网站A的Cookie发出Get请求,去获取资源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作……

示例2:

为了杜绝上面的问题,银行决定改用POST请求完成转账操作。

银行网站A的WEB表单如下:

  <form action=”Transfer.php” method=”POST”>
<p>ToBankId: <input type=”text” name=”toBankId” /></p>
<p>Money: <input type=”text” name=”money” /></p>
<p><input type=”submit” value=”Transfer” /></p>
</form>

后台处理页面Transfer.php如下:

复制代码

<?php
session_start();
if (isset($_REQUEST[‘toBankId’] && isset($_REQUEST[‘money’]))
{
buy_stocks($_REQUEST[‘toBankId’], $_REQUEST[‘money’]);
}
?>

复制代码

危险网站B,仍然只是包含那句HTML代码:

  <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

和示例1中的操作一样,你首先登录了银行网站A,然后访问危险网站B,结果…..和示例1一样,你再次没了1000块~T_T,这次事故的原因是:银行后台使用了$_REQUEST去获取请求的数据,而$_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用$_GET和$_POST分别获取GET请求和POST请求的数据。在JAVA中,用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。

示例3:

经过前面2个惨痛的教训,银行决定把获取请求数据的方法也改了,改用$_POST,只获取POST请求的数据,后台处理页面Transfer.php代码如下:

复制代码

<?php
session_start();
if (isset($_POST[‘toBankId’] && isset($_POST[‘money’]))
{
buy_stocks($_POST[‘toBankId’], $_POST[‘money’]);
}
?>

复制代码

然而,危险网站B与时俱进,它改了一下代码:

复制代码

<html>
<head>

function steal()
{
iframe = document.frames[“steal”];
iframe.document.Submit(“transfer”);
}

</head>

<body onload=”steal()”>

</body>
</html>

复制代码

如果用户仍是继续上面的操作,很不幸,结果将会是再次不见1000块……因为这里危险网站B暗地里发送了POST请求到银行!

总结一下上面3个例子,CSRF主要的攻击模式基本上是以上的3种,其中以第1,2种最为严重,因为触发条件很简单,一个<img>就可以了,而第3种比较麻烦,需要使用JavaScript,所以使用的机会会比前面的少很多,但无论是哪种情况,只要触发了CSRF攻击,后果都有可能很严重。

理解上面的3种攻击模式,其实可以看出,CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

五.CSRF的防御

我总结了一下看到的资料,CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

1.服务端进行CSRF防御

服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。

(1).Cookie Hashing(所有表单都包含同一个伪随机值):

这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了:>

  <?php
//构造加密的Cookie信息
$value = “DefenseSCRF”;
setcookie(”cookie”, $value, time()+3600);
?>

在表单里增加Hash值,以认证这确实是用户发送的请求。

复制代码

<?php
$hash = md5($_COOKIE[‘cookie’]);
?>
<form method=”POST” action=”transfer.php”>
<input type=”text” name=”toBankId”>
<input type=”text” name=”money”>
<input type=”hidden” name=”hash” value=”<?=$hash;?>”>
<input type=”submit” name=”submit” value=”Submit”>
</form>

复制代码

然后在服务器端进行Hash值验证

复制代码

<?php
if(isset($_POST[‘check’])) {
$hash = md5($_COOKIE[‘cookie’]);
if($_POST[‘check’] == $hash) {
doJob();
} else {
//…
}
} else {
//…
}
?>

复制代码

这个方法个人觉得已经可以杜绝99%的CSRF攻击了,那还有1%呢….由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,这就另外的1%。一般的攻击者看到有需要算Hash值,基本都会放弃了,某些除外,所以如果需要100%的杜绝,这个不是最好的方法。
(2).验证码

这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄….这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。

(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)

在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

以下我的实现:

1).先是令牌生成函数(gen_token()):

复制代码

<?php
function gen_token() {
//这里我是贪方便,实际上单使用Rand()得出的随机数作为令牌,也是不安全的。
//这个可以参考我写的Findbugs笔记中的《Random object created and used only once》
$token = md5(uniqid(rand(), true));
return $token;
}

复制代码

2).然后是Session令牌生成函数(gen_stoken()):

复制代码

<?php
function gen_stoken() {
$pToken = “”;
if($_SESSION[STOKEN_NAME]  == $pToken){
//没有值,赋新值
$_SESSION[STOKEN_NAME] = gen_token();
}
else{
//继续使用旧的值
}
}
?>

复制代码

3).WEB表单生成隐藏输入域的函数:

复制代码

<?php
function gen_input() {
gen_stoken();
echo “<input type=\”hidden\” name=\”” . FTOKEN_NAME . “\”
value=\”” . $_SESSION[STOKEN_NAME] . “\”> “;
}
?>

复制代码

4).WEB表单结构:

复制代码

<?php
session_start();
include(”functions.php”);
?>
<form method=”POST” action=”transfer.php”>
<input type=”text” name=”toBankId”>
<input type=”text” name=”money”>
<? gen_input(); ?>
<input type=”submit” name=”submit” value=”Submit”>
</FORM>

复制代码

5).服务端核对令牌:

这个很简单,这里就不再啰嗦了。

上面这个其实不完全符合“并行会话的兼容”的规则,大家可以在此基础上修改。

 

其实还有很多想写,无奈精力有限,暂且打住,日后补充,如果错漏,请指出:>

PS:今天下午写这篇文档的时候FF崩溃了一次,写了一半文章的全没了,郁闷好久T_T…….

转载请说明出处,谢谢[hyddd(http://www.cnblogs.com/hyddd/)%5D

六.参考文献

[1].Preventing CSRF

[2].Security Corner: Cross-Site Request Forgeries

[3].《深入解析跨站请求伪造漏洞:原理剖析》

[4].《Web安全测试之跨站请求伪造(CSRF)》

[5].《深入解析跨站请求伪造漏洞:实例讲解》

[6].http://baike.baidu.com/view/1609487.htm

Standard
life is fun

湾区买房必看 2017年房市走势分析

2017-02-17 15:47
 moonbbs | 月下闲聊
我们是华尔街的前trader, 开了一个分析湾区房市的公众号:bayareahousingmarket, 专门分析湾区(今后也会讨论全美国的)房市投资, 以及投资中的各种理念方法等。欢迎大家订阅。

经历了09年房市大跌,11年重现生气,湾区已经经历了以palo alto为首的4个疯狂上涨的年头。和前几年相比,16年出现了很多slow down的迹象,要分析17年的房市,咱们就不得不回顾16年的房市走势。
整体表现一般,尤其是高房价地区

16年湾区房市总体表现不怎么样,很多排名都被甩出美国前10。要知道以前湾区总是稳坐冠军宝座的,排名下跌这么厉害,不知道它会不会很失落 . 16年最强烈的一个信号就是高房价区房价平稳甚至微跌,低房价区仍有大幅上涨。为了方便大家阅读理解,小编把10个湾区华人中出镜率很高的区分为两个团队 — 白富美团队 (high price area) 和土肥圆团队 (low price area)。大家先来看看两个队的队员情况:

Continue reading

Standard
life is fun

北极光创投邓锋:红海竞争将越来越多,而胜负取决于创始人特质

北极光创投邓锋:红海竞争将越来越多,而胜负取决于创始人特质

2017-07-15 邓锋 捕手志

 

 

有人评价,邓锋先生总能较为全面地看待一个问题,而且还能提出一些建设性意见。这与他过去的经历有着密不可分的关系,作为一位出色的投资人与成功创业者,他早年创办的NetScreen(网屏技术)在纳斯达克上市,后以42亿美金成功出售。之后他回国创办了北极光创投,成功投资了一批公司,包括美团网、汉庭酒店、WIFI万能钥匙、酷我、百合网、纷享销客等。

这一期,捕Sir要与你分享邓锋先生的一篇文章,文中他详细回顾了自己早年创办NetScreen公司的细节,分享了这些年来他在陪伴创业者成长的过程中,所观察提炼出的优秀创业者的特质,以及大多数创业者在早期都会感到困惑的一个问题。

 红海竞争将越来越多,而胜负取决于创始人特质

作者|邓锋   编辑|潘宇波

文章来源:北极光创投、盛景网联

*转载请留言后台

创业经历

我大学毕业后,自己就跑去国外读研究生,后去了Intel,做了几年工程师。1997年11月我在美国硅谷和几个清华同学一起创办了一个信息安全的企业——NetScreen,花了4年的时间将公司送上了纳斯达克,2004年以42亿美金把公司卖给了另一家大的互联网公司Juniper(瞻博网络)。

当时,互联网泡沫已经破灭了,所以我们能在较短的时间内取得这样一个成绩,还是挺不错的。到公司卖掉时,我们的产品一共销售到了110多个国家,团队大概1000多人,营业额一年有近6亿美金。

表面上看去,你可能会觉得我们整个创业过程很顺利,但实际上公司从成立到上市的4年时间中也经历了很多不为人知的波折。我们创业时,几个人一共放弃了差不多100多万美金的股票期权,所以当时我们想,只要能挣到200万美金就算值了。当公司做到1年零9个月时,有一个上市公司要来收购我们,出价是4.5亿美金,我当时挺高兴的,觉得不到2年就做到4.5亿美金,远超我们当初的设想,所以当然要卖了。

于是,我们就兴高采烈地配合人家做了尽职调查,结果谁知到了正式签合同那天对方突然不签了,我们这才发现对方已经买下了竞争对手。当时我们就傻了,公司没卖成,还把信息都告诉了别人,在员工面前觉得一点面子都没有。后来,经过一番安抚,才让我们的员工继续好好工作。

三个月后,又一家纳斯达克上市公司找我们,又是谈收购的事。

这次,我就不敢和员工讲了。对方觉得我们公司不错,出价9亿美金,我当时想:幸亏上次没卖,3个月就翻倍啊!这次我们直到尽职调查做完,签了Definitive Agreement(最终合同)后才和员工说这次收购的事。那时候虽然还没有完成交割,但在法律上等于对方已经购买了我们公司,员工也都为公司卖了个更高的价钱而高兴,但厄运又来到了。

我们都不曾想到,几乎在签合同的同时股票市场突然暴跌,而且买我们的这家公司是当时受打击最严重的公司之一。我们签了合同一个多星期后,高兴劲儿还没过去,公司股票一天就下跌了20%,签合同不到一个月,股票价值还剩不到原来的1/3,这就是说原来的9亿美金变成3亿美金。这时候所有员工都觉得,犯一次错误并不算什么,但在这么短的时间内连续犯同样的错误,实在是太糟糕了!

那时硅谷的所有公司都在到处挖人,我的每个员工手里都拿到了不少Offer,好在我原来在清华是做辅导员的,就和员工谈心,一谈就是14个小时。硅谷的高科技公司说到根本还是靠人,关键员工如果留不住,公司马上就没了。我就和员工说,虽然我们和这家公司领了结婚证,不过还没进洞房嘛,可以想办法往回退。好在收购我们的这家公司整个团队都很好,也没在这方面太为难我们,所以我们就顺利退出来了。

经过这两次收购后,我最终决定谁也不卖了,自己去上市。团队也都愿意再相信我一次,所以大家就都奔着上市的目标前进。因为我们的收入不断增长,技术产品也一直很好,当我们开始找华尔街的投行时,高盛觉得我们不错,答应带着我们上市。员工们很高兴,意气风发,又重新找回了创业的激情,但意料之外的事又发生了。

在我们还差三天就要报美国证监会的时,突然做审计的E&Y(安永)说:「抱歉,我们不能给你们出好的审计报告,你们公司有实质性的弱点。虽然你们的业绩非常不错,但是财务一塌糊涂,管理极其混乱。」高盛一看就说那算了,他们也选择不带我们上了,这使得我又没办法和员工交代了。

在硅谷,员工真的是老大,在这种情况下,我们也得和员工交代。我们开掉了财务部门所有的人,重新招人,这是一件很痛苦的事,我们花了一年的时间才把财务给调整过来。然后我们又和高盛聊了一次,高盛认为我们公司真不错,这么大的问题很快都改过来了,而且现在一切变得极其规范,所以愿意和我们合作。

很快一切准备就绪,马上就要上市了,但谁知道又突然发生了9·11,纳斯达克从5000点跌到1400点。可是已经和员工说好了上市,上市的路线图都设计好了,没办法我们只能咬着牙,甭管是不是9·11该上还得上。

2001年12月11号,公司终于上市了。

我们是9·11之后第一家上市的公司,所有华尔街投资经理没别的公司可投,就我们这么一家,所以我们得到了很多投资,最后竟有了30倍的超购,当天公司的市值达到了26亿美金。这里我想说,有些企业你不要看表面,说4年时间成长又快又好,但这中间它一定经历了各种的起起伏伏。

创业,有时候真的是靠技术、产品、聪明、勤奋;有时候看不清楚,靠的就是信念,外加一些运气,总之是各个方面糅合在一起的结果。很多时候,我们都不能预料到明天公司又会发生什么事情,但我们必须要一步步往前

 成功者的特质

现在大家都把企业做多大、有没有上市、收入利润多少、创始人有多少钱当成是一个成功创业者的标准,其实不尽然。我看到有很多企业做得很大,但创始人未必很幸福,也没有得到社会的尊重;也有很多我认为他的企业没做得很大,也没有多么赚钱,但是他的心态很好,大家很认可他。

这些年,我也在想如何定义一个企业的成功?

后来,我认为要做一个成功的企业就要看你是否能平衡好与客户、员工、投资人这三方的关系,并使得他们与你合作能感到快乐。如果只是为了赚钱,虽然能给股东带来不错的回报,但这未必能让员工感到快乐。如果企业能够提供客户所喜欢的服务或产品,在业界有品牌能得到尊重,公司的员工流失率很低,大家感觉工作环境是愉快的,每个人不仅能获得物质上的回报还有精神上的满足,在我看来这会是一家成功的企业,不管它规模大小、上市与否

一个企业做到最后就是人的问题,而能解决这个问题的只有创始人,他(她)对企业的发展最为重要。投资人看企业的时候,最主要的就是看企业的创始人,毕竟中国的商业环境正在逐渐成熟,之前靠一些特权、批文,可以走在灰色地带,但这种赚钱的机会将越来越少,越来越多的机会是在阳光下、在成熟市场的环境下竞争,红海竞争的局面也会越来越多。

在这种情况下创始人的重要性将会更为突出,创始人的特质也会更重要。我个人认为有些特质是在做企业之前必须有的,如果你做企业之后再去培养的话已经晚了。比如,我们世界观的形成、思维方式、做事行为方式,这其实是在自己年轻的时候就已经基本形成了。所以,投资人大多数的时候是在选人而不是在培养人,以下是我理解的成功创业者所具备的特质:

1)要具备快速学习的能力。大多数创业者刚开始创业时,可能只有一方面很强,其它方面都能可能是缺点。做早期投资,也存在两种不同的思维方式:一种是看这个创业者有多少缺点;一种看这个创业者有多少优点。

创业者能走多远多快,决定着企业能做多大。比如说一个工程师技术能力很强,没有管理团队的能力,没有用技术去定义一款产品的能力,没有做市场营销的能力,更谈不到去制订战略,在一个大公司里训练很多年然后出来创业也未必能成功。真正好的创业者从跨国企业中高管出来的很少,大多数都是草根创业,在学习中不断挑战自我,变成技术的观察者或管理营销专家

2)具备持续创新的能力非常重要。如果一个企业没有创新的基因,企业是很难做得很远,也很难做大的。有些创业者认为自己的创意属机密,其实好的点子不能成就一个企业,一个伟大的企业一定要不断的创新,如果建立不了壁垒,别人可以很快超越你。创新是做出优秀企业非常重要的基因。

3)创业者要具备「赢」的雄心。创业者一定要有雄心,一定要敢于挑战,不惧怕权威,甚至面对大企业要有必胜的信念。胆子要大,要有野心。如果没有「我要赢」这种雄心,碰到困难就往后缩,企业是做不了的。

4)创业者要有理想。理想不等于激情,激情可能能持续一年或者更长时间,但未必能坚持很长时间。一些优秀创业者的理想不是「我要赚钱成为中国的首富」,他们都有着超越物质财富回报的理想,之所以选择创业完全来自于他们强烈的兴趣爱好。

5)要能坚持不懈。马云讲过今天很残酷,明天更残酷,后天很美好。有时候企业要靠你的才干往前走,有时候靠运气,创业者总要能坚信些什么才行,毕竟周围有很多诱惑,能够坚持下来最后做成的概率会高一些。在企业最困难的时候没有掉头,坚持往下做,最后做出来了,今天中国最优秀的创业者都是这样的。

6)具备责任感。创业者能够坚持、能够成功,很重要的是来自于他的责任。对家人、亲人、朋友、员工及投资人的责任,上下游可能也是依靠这个企业成长而成长的,创业者必须要付起这个责任,这件事不干好对不起他们。

7)胸怀是最终成事的重要因素。我们最不愿意投资自私的创业者,把自己利益放在企业之上,这样的企业发展再好,技术再创新也不投,因为它绝对是做不成长久的。创业者学习能力可以不断培养,胸怀等特质是培养不了的。

8)有智商还要有情商。企业做得越大情商越高。真正优秀的创业者具有很强的领导力,他不是技术专家,不是营销专家,但他有很向心的领导力把这些人吸引过来,把企业做大做强。

在公司运营当中,虽然你也不是公司的每个战略决定都要告诉员工,但你一定要将自己的真实想法与团队分享,让他们和你同喜同忧。千万别装酷,别装得自己什么都行。我们公司经营4年就成功上市了,这个过程并不是一帆风顺,而是经历了三起三落。低谷的时候我会和员工开诚布公,对他们说,很抱歉,我们真的犯错误了。

 

融资后的六个注意事项

2005年,我从硅谷回国,创立了北极光创投。截至目前,我们有幸与很多优秀的创业者合作,在陪伴创业者成长的过程中,我们发现一个相对明显的问题——有不少创业者,在拿到天使轮或者Pre-A轮融资后,作为企业的创始CEO或创始团队成员,不知道应该注意些什么?其实,我认为六点是值得很多创业者注意的:

1)现金流

在当前的市场环境下,这尤其是CEO的第一大要务。有很多本身不错的公司,因为花钱速度太快,结果自己败在了现金流失控的问题上。再好的企业,如果现金流突然断了,团队也没有办法稳定。

创始人对公司员工负责、对公司股东负责的首要任务是把公司的现金流控制好。当现金还有六个月就要花完的时就要开始注意了,尤其是当公司只够三个月的时,公司的处境就更危险了。CEO要保证哪怕公司没有融到资,还能运转至少半年,把控好公司的现金流,这个说多少遍都不为过。

2)

创业者一旦拿到钱后,从第一天起就要把注意力放在人身上。做企业最关键是建立一个组织,这其中,人是最重要的。招人、留人、用人、培养人都很重要。招人是CEO最重要的工作,创始人要评估自己每周有多少时间花在招人和与员工的沟通上。

时间的分配是衡量自己聚焦点的好方法。判断在人上的聚焦够不够的标准,就是统计自己在人上花了多少时间。我认为花在招人、与内部员工沟通、与外部客户沟通的时间应该占到一个CEO的50%以上的时间

3)执行力和速度

执行力是能把想的事情在多快的时间内执行到位,而且要能看得出效果。最怕的是事情没做成,但却不知道自己是战略错误还是执行不到位

速度也是一个很关键的判断执行力的指标,就像前面我们说时间分配是衡量聚焦点的重要指标。速度的重要性不是说销售成长快,而在于一个事情能不能解决,解决的到不到位。小企业要以快取胜,这里的快不是销售产生的速度,而是事情执行到位的速度

4)产品

公司早期要把产品放在第一位,而不是技术也不是营销(Marketing)。所谓做产品,最关键的是对客户需求的不断定位,找到客户的需求,把自己的资源和客户进行匹配,在很快的时间内把产品做出来。

在中国创业,技术很重要,但很多技术导向型的企业一定不是靠技术来做生意的,尤其是一些To B方向的企业,这是一个强关系型的生意,要知道买你产品的决策人是谁。比如,面向大企业的业务一定是部门做决策的,那影响他们决策的因素是什么,这些都是你在做产品的时候需要想到的。

归根结底,作为公司的老大,在一开始的阶段对产品的关心要高于对技术的关心,以及对市场营销的关心。你要能将销售和营销分开来看,产品刚出来的时候要重视Sales、轻视Marketing。

5)企业文化

很多创业者在初期不太注意这一点,其实企业文化从企业早期就逐渐形成了。如果早期有意培养了优秀的企业文化,那么在企业文化内核确定了之后,只要进新人的速度不是太快,公司文化就会沿着这个方向发展。

创始人应该好好想一想公司企业文化的这个「核」是什么。各家有各家的选择,但我要特别提醒一下,企业文化不是靠口号宣传出来的,是要靠创始人在点点滴滴的小事儿上实际出来的。比如,如果你的企业文化是关爱员工,那么一个新员工加入后,你能不能第一次见面就叫出他(她)的名字。企业文化的本质是创始人领导力的体现,创始人是什么样的人,创办的企业就会是什么模样的。

6)融资能力

创业者的融资能力正在变得很重要,这是我不愿意看到但在中国市场正在发生的事实。今天的中国VC市场上,创业者可能是需要一点忽悠的能力,但这个度怎么把握确实很难说清楚。很多企业级服务和医疗项目的创业者之前是工程师、产品经理,都不知道怎么宣传自己和公司,但作为创始人你要学会怎么把自己的公司和产品从更高的角度、用更大的概念讲好。不管我们喜欢不喜欢,融资的时候不会讲故事就会吃亏

Standard
life is fun

Natural Language Pipeline for Chatbots

Natural Language Pipeline for Chatbots

Chatbot developers usually use two technologies to make the bot understand the meaning of user messages: machine learning andhardcoded rules. See more details on chatbot architecture in my previous article.

Machine learning can help you to identify the intent of the message and extract named entities. It is quite powerful but requires lots of data to train the model. Rule of thumb is to have around 1000 examples for each class for classification problems.

 

If you don’t have enough labeled data then you can handcraft rules which will identify the intent of a message. Rules can be as simple as “if a sentence contains words ‘pay’ and ‘order’ then the user is asking to pay for an order”. And the simplest implementation in your favorite programming language could look like this:

def isRefundRequest(message):
    return 'pay' in message or 'order' in message

Any intent classification code can make errors of two types. True positives: the user doesn’t express an intent, but the chatbot identifies an intent. False positives: the user expresses an intent, but the chatbot doesn’t find it. This simple solution will make lots of errors:

  1. The user can use words “pay” and “order” in different sentences: “I make an order by mistake. I won’t pay.”
  2. A keyword is a substring of another word: “Can I use paypal for order #123?”
  3. Spelling errors: “My orrder number is #123. How can I pay?”
  4. Different forms of words: “How can I pay for my orders?”

 

Your chatbot needs a preprocessing NLP pipeline to handle typical errors. It may include these steps:

  1. Spellcheck

Get the raw input and fix spelling errors. You can do something very simple  or build a spell checker using deep learning.

  1. Split into sentences

It is very helpful to analyze every sentence separately. Splitting the text into sentences is easy, you can use one of NLP libraries, e.g. NLTK, StanfordNLP, SpaCy.

  1. Split into words

This is also very important because hardcoded rules typically operate with words. Same NLP libraries can do it.

  1. POS tagging

Some words have multiple meanings, for an example “charge” as a noun and “charge” as a verb. Knowing a part of speech can help to disambiguate the meaning. You can use same NLP libraries, or Google SyntaxNet, that is a little bit more accurate and supports multiple languages.

  1. Lemmatize words

One word can have many forms: “pay”, “paying”, “paid”. In many cases, an exact form of the word is not important for writing a hardcoded rule. If preprocessing code can identify a lemma, a canonical form of the word, it helps to simplify the rule. Lemmatization, identifying lemmas, is based on dictionaries which list all forms of every word. The most popular dictionary for English is WordNet. NLTK and some other libraries allow using it for lemmatization.

  1. Entity recognition: dates, numbers, proper nouns

Dates and numbers can be expressed in different formats: “3/1/2016″, “1st of March”, “next Wednesday”, “2016-03-01″, “123″, “one hundred”, etc. It may be helpful to convert them to unified format before doing pattern matching. Other entities which require special treatment: locations (countries, regions, cities, street addresses, places), people, phone numbers.

  1. Find concepts/synonyms

If you want to search for a breed of a dog, you don’t want to list all the dog breeds in the rule, because there are hundreds of them. It is nice if preprocessing code identified a dog breed in the message and marked the word with  a special tag. Then you can just look for that tag when applying the rule.

WordNet can be used to identify common concepts. You may need to add domain specific concept libraries, e.g. a list of drug names if you are building a healthcare bot.

 

After preprocessing is done you have a nice clean list of sentences and lists of words inside each sentence. Each word is marked with a part of speech and concepts, and you have a lemma for every word. The next step is to define patterns for intent identification.

You can invent your own pattern language using common logical operators AND, OR, NOT. The rule can look like this if you create an internal DSL (domain-specific language) based on Python:

r = Rule(
    And(
        Or('cancel', 'close'),
        'membership',
    Respond('Would you like to cancel your membership immediately?'))

Alternatively, you can invent external DSL, which can be more readable, but you will need extra work to create a compiler or an interpreter for that language. If you use a ChatScript language, it can look like this:

u: (<<[cancel close] membership>>)
    Would you like to cancel your membership immediately?

Do you use a chatbot engine with hardcoded rules? Have your developed your own? What issues have you encountered when building or using a chatbot engine? Please share in comments!

Standard