Archive

Author Archive

zz 浅谈CSRF攻击方式

September 19, 2017 Leave a comment

浅谈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

Advertisements
Categories: life is fun

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

September 10, 2017 Leave a comment

zz湾区买房必看: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)。大家先来看看两个队的队员情况:

白富美区的房价15年底均值大概是 2.3 million, 土肥圆地区15年底均价差不多是77万。相差三倍。我们来看看这两个团队在11 – 16年的增长率。

上图中,红色代表的是低价区每年的涨幅,蓝色代表的是高价区每年涨幅。哎呀,15-16年高价区怎么突然矮了那么一大截?没有增长啊!往年高价区每年都有10%以上的增长率,而16年只有0。相反,虽然低房价地区增长也不如往年,但怎么都还是有6%的增长。这种高房价地区slow down在很多人看来是一种危险的信号,人民的affordability不太跟的上了!大家实在买不起高房价地区的房子只好转战低房价区。这其实是房市的一种历史规律。好区先涨,涨到一定高峰带领差区上涨。差区因为基数小,上去的百分比更大。但大跌来临差区先跌,跌幅较猛,而好区相对坚挺,跌幅较小。
因为高房价地区疲软,16年可以算作屌丝逆袭年了。
租金回调
去年中期,各大新闻机构普大喜奔 — 美国租房最贵的三番,租金终于降了。很多有经验的投资者都用租金作为房市的market indicator, 租金下调也是一个房价危险的信号。

 

本来各大地产经纪看着16年平淡无味的房市,都告诉客人房市要降温了,估计17年会撑不住了。结果却出乎人们的意料。自从16年底Z*F决定加息以来,湾区房市突然变的火热起来。虽然阴雨连绵让被好天气宠坏了的湾区人民没法出门,但open house里人来人往,熙熙攘攘,每次去都能感受到清明上河图里那种盛景。以前半岛大部分房子都得open house两个周末才成交,12月底的时候基本都只需要一个open house,甚至有些周三上市,周五就pending了。从成交上来看,好房子20多个offer不是新鲜事,大家加价也比较放得开。看来不少童鞋都想赶在加息前搞定房子,不管怎么说,现在的利率还算是史上最低,能踏上这班车当然是最好。
可能有小伙伴要问了,那我要不要加入抢房大军,不顾一切地抢到一个房子?小编认为,不管在任何市场下,买房都要慎重。房子是大部分人人生最大的投资,而且总体说来很不liquid, 买起来容易脱手难。其实,虽然14年到15年我们看到了房价大幅度上涨,但14年疯狂加价拿下来的房子也不一定比15年低价买的房子便宜。其实每年的开春房市都会稍稍火爆一下的,我们目前看到的这种火爆有一部分是季节性因素。去年开春也有不少通稿说房市火爆了。另外,17年房市的这种热潮到底能否维持下去还有很多不确定性,小编来给大家列一列17年房价的不确定因素:
interest rate

根据现在的利率来看,如果想买一个在旧金山地区中等价位的房子(median house price  = 1.3 Million), 家庭收入差不多得17万 。 但如果利率涨到5%, 买同样的房子家庭收入得20万左右,当利率涨到6%的时候,收入得达到21.5万。所以利率上升房子就更买不起了。

affordability
湾区房价经过几年疯狂增长,到底有多少人能买的起一个旧金山地区中等价位 (median value = 130万) 的房子呢?研究证明,湾区大概有14% 的家庭能买的起。和全美国比,这个数字差了点,房价相对于人民的收入来说确实太贵了。但这个数字比07年的时候强多了,07年的时候只有8%的人能买的起中等价位的房子。所以目前的AFFORDABILITY还不算湾区最差。
这就是房价翻了翻,但人民的收入也提高了太多。最新的经纪人协会数据表明,湾区几个比较大的county 大概有6%左右的家庭收入都超过500K。大家收入很牛呀!
国内汇款政策收紧
如果党真的不让咱们寄钱投资了,那影响可能真不小。毕竟华人是湾区买房的主力军。虽然湾区的工程师们个个收入都吓死人,但说到首付不少还是得靠家里。到底我党有多大的决心整治这事现在还不太好说,我们只能静观其变。党的事情小编也不好多说。
最最最重要的,IT公司的就业形势
IT公司是湾区这几年房价跳跃式发展的第一功臣。湾区目前产业还比较单一,对IT业的依赖性很强。笔者认为,IT产业的发展会是湾区房价最重要的因素。现在要买的起湾区的中等房子(130万)大概需要家里至少有一个不错的IT收入(250K),如果IT业面临裁员,这部分人的购买能力会大受影响,也可能有部分家庭无法继续支付贷款,foreclosure数量大增导致房价跳水。相反,IT业发展了,会带来大量的高收入年轻人,目前湾区收入250K的家庭每年增长2%。这批人买房是刚需,而且买得起房。
相比13/14/15的快速发展期,16年**公司招人也有一些slow down。一些公司招人的重点也从new grads变成了experienced。相对应的,也有不少报道说独角兽公司处境比前几年艰难了许多,VC给funding也没有以前大方了。这些算是不利因素。但fb google最近在earning上的表现还算不错,year to year growth大多超过华尔街预期,所以笔者估计如果没有大的金融危机的影响,在17年这些IT公司不会有太大的问题,虽然也很难看到13年那样疯狂招人的局面。
Categories: 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市场上,创业者可能是需要一点忽悠的能力,但这个度怎么把握确实很难说清楚。很多企业级服务和医疗项目的创业者之前是工程师、产品经理,都不知道怎么宣传自己和公司,但作为创始人你要学会怎么把自己的公司和产品从更高的角度、用更大的概念讲好。不管我们喜欢不喜欢,融资的时候不会讲故事就会吃亏

Categories: 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!

Categories: life is fun

Nvidia Tesla K20c on Ubuntu 16.04

February 4, 2017 Leave a comment

Spent 2 days to sort this out.  To install Nvidia Tesla K20c on Ubuntu 16.04.

My hardware + OS env :

  • Nvidia Tesla K20c
  • Nvidia GT 520 (graphic card to monitor)
  • Intel i5 CPU
  • 16GB RAM
  • Ubuntu 16.04 on SSD

Initially, I installed the Nvidia official driver, and CUDA using :

  • sudo apt-get install nvidia-cuda-toolkit
  • sudo ./NVIDIA-Linux-x86_64-331.89.run

But then ran into several weird errors like below.

“`
victor@ubuntu-tesla:~/Downloads$ cat /var/log/nvidia-installer.log
nvidia-installer log file ‘/var/log/nvidia-installer.log’
creation time: Sat Feb 4 11:15:23 2017
installer version: 331.89

PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

nvidia-installer command line:
./nvidia-installer
–no-cc-version-check

Using: nvidia-installer ncurses user interface
-> License accepted.
-> Installing NVIDIA driver version 331.89.
-> There appears to already be a driver installed on your system (version: 331.89). As part of installing this driver (version: 331.89), the existing driver will be uninstalled. Are you sure you want to continue? (‘no’ will abort installation) (Answer: Yes)
-> Running distribution scripts
executing: ‘/usr/lib/nvidia/pre-install’…
-> done.
-> The distribution-provided pre-install script failed! Continue installation anyway? (Answer: Yes)
-> Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later. (Answer: No)
-> Performing CC sanity check with CC=”cc”.
-> Kernel source path: ‘/lib/modules/4.4.0-59-generic/build’
-> Kernel output path: ‘/lib/modules/4.4.0-59-generic/build’
-> Performing rivafb check.
-> Performing nvidiafb check.
-> Performing Xen check.
-> Performing PREEMPT_RT check.
-> Cleaning kernel module build directory.
executing: ‘cd ./kernel; make clean’…
-> Building NVIDIA kernel module:
executing: ‘cd ./kernel; make module SYSSRC=/lib/modules/4.4.0-59-generic/build SYSOUT=/lib/modules/4.4.0-59-generic/build NV_BUILD_MODULE_INSTANCES=’…
NVIDIA: calling KBUILD…
make[1]: Entering directory ‘/usr/src/linux-headers-4.4.0-59-generic’
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo >&2; \
echo >&2 ” ERROR: Kernel configuration is invalid.”; \
echo >&2 ” include/generated/autoconf.h or include/config/auto.conf are missing.”;\
echo >&2 ” Run ‘make oldconfig && make prepare’ on kernel src to fix it.”; \
echo >&2 ; \
/bin/false)
mkdir -p /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/.tmp_versions ; rm -f /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/.tmp_versions/*
make -f ./scripts/Makefile.build obj=/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel
cc -Wp,-MD,/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/.nv.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/5/include -I./arch/x86/include -Iarch/x86/include/generated/uapi -Iarch/x86/include/generated -Iinclude -I./arch/x86/include/uapi -Iarch/x86/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi –
include ./include/linux/kconfig.h -Iubuntu/include -D__KERNEL__ -fno-pie -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-PIE -fno-pie -no-pie -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -fno-delete-null-pointer-checks -Wno-maybe-uninitialized -O2 –param=allow-store-data-races=0 -Wframe-larger-than=1024 -fstack-protector-strong -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls
-fno-var-tracking-assignments -pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -DCC_HAVE_ASM_GOTO -DNV_MODULE_INSTANCE=0 -DNV_BUILD_MODULE_INSTANCES=0 -UDEBUG -U_DEBUG -DNDEBUG -I/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel -Wall -MD -Wsign-compare -Wno-cast-qual -Wno-error -D__KERNEL__ -DMODULE -DNVRM -DNV_VERSION_STRING=\”331.89\” -Wno-unused-function -Wuninitialized -mno-red-zone -mcmodel=kernel -DNV_UVM_ENABLE -D__linux__ -DNV_DEV_NAME=\”nvidia\” -DMODULE -D”KBUILD_STR(s)=#s” -D”KBUILD_BASENAME=KBUILD_STR(nv)” -D”KBUILD_MODNAME=KBUILD_STR(nvidia)” -c -o /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/.tmp_nv.o /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c
In file included from include/uapi/linux/stddef.h:1:0,
from include/linux/stddef.h:4,
from ./include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/uapi/linux/capability.h:16,
from include/linux/capability.h:15,
from include/linux/sched.h:15,
from include/linux/utsname.h:5,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv-linux.h:44,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c:13:
include/asm-generic/qrwlock.h: In function ‘queued_write_trylock’:
include/asm-generic/qrwlock.h:93:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
cnts, cnts | _QW_LOCKED) == cnts);
^
include/linux/compiler.h:165:40: note: in definition of macro ‘likely’
# define likely(x) __builtin_expect(!!(x), 1)
^
In file included from ./arch/x86/include/asm/preempt.h:5:0,
from include/linux/preempt.h:59,
from include/linux/spinlock.h:50,
from include/linux/seqlock.h:35,
from include/linux/time.h:5,
from include/uapi/linux/timex.h:56,
from include/linux/timex.h:56,
from include/linux/sched.h:19,
from include/linux/utsname.h:5,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv-linux.h:44,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c:13:
include/linux/percpu-refcount.h: In function ‘percpu_ref_get_many’:
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:419:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_1(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:364:11: note: in expansion of macro ‘this_cpu_add_1’
case 1: stem##1(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-refcount.h:177:3: note: in expansion of macro ‘this_cpu_add’
this_cpu_add(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:420:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_2(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:365:11: note: in expansion of macro ‘this_cpu_add_2’
case 2: stem##2(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-refcount.h:177:3: note: in expansion of macro ‘this_cpu_add’
this_cpu_add(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:421:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_4(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:366:11: note: in expansion of macro ‘this_cpu_add_4’
case 4: stem##4(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-refcount.h:177:3: note: in expansion of macro ‘this_cpu_add’
this_cpu_add(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:478:35: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_8(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:367:11: note: in expansion of macro ‘this_cpu_add_8’
case 8: stem##8(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-refcount.h:177:3: note: in expansion of macro ‘this_cpu_add’
this_cpu_add(*percpu_count, nr);
^
include/linux/percpu-refcount.h: In function ‘percpu_ref_put_many’:
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:419:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_1(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:364:11: note: in expansion of macro ‘this_cpu_add_1’
case 1: stem##1(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-defs.h:506:33: note: in expansion of macro ‘this_cpu_add’
#define this_cpu_sub(pcp, val) this_cpu_add(pcp, -(typeof(pcp))(val))
^
include/linux/percpu-refcount.h:276:3: note: in expansion of macro ‘this_cpu_sub’
this_cpu_sub(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:420:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_2(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:365:11: note: in expansion of macro ‘this_cpu_add_2’
case 2: stem##2(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-defs.h:506:33: note: in expansion of macro ‘this_cpu_add’
#define this_cpu_sub(pcp, val) this_cpu_add(pcp, -(typeof(pcp))(val))
^
include/linux/percpu-refcount.h:276:3: note: in expansion of macro ‘this_cpu_sub’
this_cpu_sub(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:421:34: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_4(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:366:11: note: in expansion of macro ‘this_cpu_add_4’
case 4: stem##4(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-defs.h:506:33: note: in expansion of macro ‘this_cpu_add’
#define this_cpu_sub(pcp, val) this_cpu_add(pcp, -(typeof(pcp))(val))
^
include/linux/percpu-refcount.h:276:3: note: in expansion of macro ‘this_cpu_sub’
this_cpu_sub(*percpu_count, nr);
^
./arch/x86/include/asm/percpu.h:130:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
((val) == 1 || (val) == -1)) ? \
^
./arch/x86/include/asm/percpu.h:478:35: note: in expansion of macro ‘percpu_add_op’
#define this_cpu_add_8(pcp, val) percpu_add_op((pcp), val)
^
include/linux/percpu-defs.h:367:11: note: in expansion of macro ‘this_cpu_add_8’
case 8: stem##8(variable, __VA_ARGS__);break; \
^
include/linux/percpu-defs.h:496:33: note: in expansion of macro ‘__pcpu_size_call’
#define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
^
include/linux/percpu-defs.h:506:33: note: in expansion of macro ‘this_cpu_add’
#define this_cpu_sub(pcp, val) this_cpu_add(pcp, -(typeof(pcp))(val))
^
include/linux/percpu-refcount.h:276:3: note: in expansion of macro ‘this_cpu_sub’
this_cpu_sub(*percpu_count, nr);
^
In file included from include/uapi/linux/stddef.h:1:0,
from include/linux/stddef.h:4,
from ./include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/uapi/linux/capability.h:16,
from include/linux/capability.h:15,
from include/linux/sched.h:15,
from include/linux/utsname.h:5,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv-linux.h:44,
from /tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c:13:
./arch/x86/include/asm/uaccess.h: In function ‘copy_from_user’:
./arch/x86/include/asm/uaccess.h:717:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (likely(sz < 0 || sz >= n))
^
include/linux/compiler.h:165:40: note: in definition of macro ‘likely’
# define likely(x) __builtin_expect(!!(x), 1)
^
./arch/x86/include/asm/uaccess.h: In function ‘copy_to_user’:
./arch/x86/include/asm/uaccess.h:735:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (likely(sz < 0 || sz >= n))
^
include/linux/compiler.h:165:40: note: in definition of macro ‘likely’
# define likely(x) __builtin_expect(!!(x), 1)
^
/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c: In function ‘nvidia_unlocked_ioctl’:
/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.c:2027:29: error: ‘struct file’ has no member named ‘f_dentry’
return nvidia_ioctl(file->f_dentry->d_inode, file, cmd, i_arg);
^
scripts/Makefile.build:258: recipe for target ‘/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.o’ failed
make[2]: *** [/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel/nv.o] Error 1
Makefile:1420: recipe for target ‘_module_/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel’ failed
make[1]: *** [_module_/tmp/selfgz26270/NVIDIA-Linux-x86_64-331.89/kernel] Error 2
make[1]: Leaving directory ‘/usr/src/linux-headers-4.4.0-59-generic’
NVIDIA: left KBUILD.
nvidia.ko failed to build!
Makefile:178: recipe for target ‘nvidia.ko’ failed
make: *** [nvidia.ko] Error 1
-> Error.
ERROR: Unable to build the NVIDIA kernel module.
ERROR: Installation has failed. Please see the file ‘/var/log/nvidia-installer.log’ for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at http://www.nvidia.com.

“`

 

The solution is the DKMS !

“`

sudo dkms remove nvidia-current-updates/331.89

sudo apt-get install nvidia-current-updates

“`

Then re-install them:

“`

sudo ./NVIDIA-Linux-x86_64-331.89.run
sudo apt-get install nvidia-cuda-toolkit

“`

Ta-da! all works!!!!!!

“`

victor@ubuntu-tesla:~/$ nvidia-smi
Sat Feb 4 12:11:39 2017
+—————————————————————————–+
| NVIDIA-SMI 367.57 Driver Version: 367.57 |
|——————————-+———————-+———————-+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K20c Off | 0000:01:00.0 Off | 0 |
| 30% 35C P8 27W / 225W | 0MiB / 4742MiB | 0% Default |
+——————————-+———————-+———————-+
| 1 GeForce GT 520 Off | 0000:02:00.0 N/A | N/A |
| 40% 40C P0 N/A / N/A | 348MiB / 955MiB | N/A Default |
+——————————-+———————-+———————-+

+—————————————————————————–+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 1 Not Supported |
+—————————————————————————–+
“`

 

 

Categories: life is fun

关于lease bmw的好处,和具体操作

October 1, 2016 Leave a comment

关于lease bmw的好处,和具体操作

先说结论: 如果不是要开的里程特别高,比如一年两三万mile这种

或者是要keep一辆车很久而且自己还会动手修车

否则lease bmw是经济上和体验上都更好的选择,相对购买.

下面说原因.

首先大方向上,如果自己不会修车,bmw不算是适合长期持有的车,

因为整体上一方面它的可靠性只算中规中矩,另一方面它不是很repair friendly

那么意味着出了保修,无论是必须要进行的保养,还是可能出现的故障及维修

都不是一笔小花销.

而如果购买延保,quote出来的原厂warranty+maintenance价格相当不菲,

回头买了你车不坏,纠结,没买车坏了一笔几千块账单跳出来,也纠结

最后一算出保后平均每年的cost to own,恐怕没比再lease个新车省多少

另一方面,在保修期内的bmw则非常省心,因为它是同时包warranty和maintenance,

可以说除了胎,别的上不用花什么钱

所以很多买家选择把车在过保前处理掉

那么如果确定车到手不会keep超过保修,面临的就是买来三年多卖掉,

还是lease三年.

这里面lease的优势是很明显的,体现在以下几个方面:

1.只有车的使用权,而不拥有车.这意味着不用对车特别照顾,有些轻微磕碰也不用在乎.

而且比方说一旦车出现不大不小的事故,有carfax记录但又没到报废的程度,

也不用担心以后不好卖或者卖不上价.

2.bmw和很多豪华车都算上,精髓很多是在选配里面.但这些选配有一个问题,就是你

到卖的时候,卖不上价.比方说55k起价的x5,你配到70k算是well equipped,

但三年后卖,很可能你70k的x5,也就比55k的乞丐版x5多卖五千块钱,

这意味着选配对应的售价部分会有超过车起价以上的更高折旧.

问题在于买豪华车本来就是图个体验好,弄个没啥选配的乞丐版,那体验也要大打折扣.

而在lease的时候,情况则完全不同.

首先lease的残值百分比是作用在整个车价上,意味着选配部分

对应的车价按照起价相同的比例计算折旧.其次高配的车通常更好砍价,意味着

实际上按成交价看,高配车相对乞丐版的溢价就要比两者msrp差价更低.

结果就是如果lease车,选配部分的cost to own比buy and sell的情况低很多.

3.以bmw而言,其设定的残值比例通常是比你三年后卖掉能卖出来的价高的,

且不说lease三年后直接把车还掉,不用再折腾自己卖车(费时间)或者再多被

dealer砍一刀(tradein亏钱).

综合以上三点,lease bmw,当lease是个选择的时候(有时候不是选择,比如如果

你要一年开两三万mile的话,那通常lease没这么高里程的选项),它常常是那个

更好的选择.

那么接下来说说bmw lease的基本情况和计算方法.

lease一辆车,其成本主要来自三个方面:

1. lease acquisition fee, doc fee, tax

像bmw的acq fee在795,doc fee取决于具体dealer, tax取决于具体州

这里面acq fee和tax是固定的,doc fee则可以视情况和dealer砍

2.车辆折旧,也就是车在lease期间产生的贬值.

其计算方法就是成交价-lease到期残值百分比*MSRP.

比方说我一辆70k msrp的x5,三年36kmile残值是60%,成交价65k,

那么折旧就是65-70*0.6=23k

3.财务成本.lease期间车的所有权在车厂的财务部门,那么对方持有这个车辆会占款,

因此也就会产生财务成本.这个的计算,是用成交价和到期残值的均值,

结合当前利率算出每月的财务成本.

举一例,比方说现在的apr是3.12%,那么每月的财务成本就是

(成交价+残值)/2*(3.12%/12)=(成交价+残值)*(3.12%/24)

而这里3.12%/24这一项就被命名为money factor

那么实际上1是会打到2的成交价中,所以进一步可以说,

最后决定整个lease期间支出的,就是折旧及财务支出.

对于bmw来说,对于某个型号,某段时间内它会确定一个残值百分比,

比如15款x5目前就是3年36k残值60%.而money factor也是相对固定的,

目前是0.0013(对应的apr则是3.12%)

那么实际上可以和dealer商定的就是成交价这一项(也包含doc fee).

需要提及的是,bmw官网,乃至dealer店里,常常会贴出来一个广告,

说xxxx down, yyy/month for zz (通常是30/36) month.

实际上这组数字,就是基于当前的money factor和残值设定,以及一个bmw

设定的成交价来计算出来的.而这成交价多半是不太厚道的.所以切记不要直接

从了这个lease term.如果要看某个车的当前残值设定是多少,可以直接去

bmwusa官网点special offer->lease offer.对目标车型,点进去之后看

lease offer下面的小字部分,里面都会给出说本lease offer基于msrp xxxxx,

到期残值yyyyy进行计算.用yyyyy/xxxxx,就能得到这车型当前的残值百分比.

前面已经说了,lease的折旧部分,成交价用的是实际价格,而残值百分比是作用在

msrp上,也就是说当看好了一款车,那么对应的残值就固定了.成交价砍的越低,

折旧就越少.而且这里面的成交价砍价有杠杆效应:还是以x5为例,三年残值60%,

意味着如果成交价从msrp砍到10%off msrp,那么折旧支出就从40%*msrp减到

30%*msrp,也即是说降低25%.那么如果再遇到bmw某些时候搞活动,弄出来一个

非常高的残值百分比,而车价又砍掉比较多,那么最后的折旧就会低到令人发指的程度.

比方说前一阵子bmw对15款x1给到3年68%的残值,而x1通常能搞到10%off或更高,

那么这车三年只需要付出22%msrp就能搞定,意味着一辆40k的x1,三年折旧只有8.8k

平均到每月只有244.44usd,这就是超好的deal了.

另一方面是财务成本部分.显然的,砍成交价意味着可以降低money factor作用的本金,

因此有额外的好处.但更好的一点就是bmw有一个monthly security deposit(msd)

的政策,也就是说每压一个monthly payment的钱给bmw financial services,

就可以把money factor降低0.00007,最多可以压7个.这个钱在lease结束后会退回.

那么压7个之后,原来0.0013的mf会降到0.00081,也就是等效apr从3.12降到1.94,

或者更直观的,可以将财务成本支出降低37.7%,这也相当可观.

还是大致算一笔账,70k的x5,65k成交,60%残值,那么暂时忽略手续费,

每月的财务成本,原本是(65k+42k)*0.0013=139.1,7个msd后是86.67,

意味着36个月下来可以省1887.48usd.

那么同时大致计算一个msd是(65k-42k)/36+139.1=778

意味着5446usd带来的三年回报是1887.48,以单利计算年回报率在11.6%,

这是很划算的买卖,所以基本上7个msd是lease bmw必搞的.

最后,关于lease payment.bmw广告里常常会说要downpay三千多再每个月付多少

但实际上更合适的选择是0 downpay,直接每月付款.

这里主要顾虑是一旦出了一些意外事件,比如你要转lease,或者车total了

那么downpay的部分你是拿不回来的,白白损失了.所以宁可每个月按月支付折旧.

更新:以下是cassis网友在本线程下的回复,关于lease downpay的

很有信息量,所以全文引用如下:

发信人: cassis (KW), 信区: Automobile
标  题: Re: 稍微多说几句关于lease bmw的好处,和具体操作 (转载)
发信站: BBS 未名空间站 (Sat Mar 21 03:16:50 2015, 美东)

我觉得他说的大体上是对的,至少中心思想上。

Lease的车total掉的话,原则上你欠car company的钱相当于early buyout。这个early
buyout具体怎么算我不是很清楚,应该不完全是随时间线性递减的。保险公司陪的钱
比这个early buyout少得话,有GAP insurance的话由GAP insurance负责差价,否则是
你付。

举个极端例子吧,你lease个5万卖价的车,开出去第一天就total掉。假设没有down
payment,这时候的early buyout就应该是5万。保险公司多半不会按新车全价陪,假如
它只陪4万5的话,你(或者GAP)陪剩余的5千。

假如你事先付了5千首付,这时候early buyout应该是4万5,刚好和保险公司陪的一样
,所以GAP也不会启用。这种情况下你开了一天车就完全损失掉5千首付。这就是为什么
lease一般不推荐down payment(注意trade-in也相当于down payment)。GAP
insurance一般都是包在lease的acquisition fee里的,所以total了应该可以拍屁股走
人。

对BMW的lease,补充几点:

1) Acquisition fee is $725 standard, but the dealer is allowed to mark it up
to $925. This is $200 extra profit for the dealer.
2) Money factor is 0.0013 standard (at least for much of the time). Again
the dealer is allowed to mark it up by 0.0004 to 0.0017. Multiply it by 2400
you will know this means 1% higher interest. If you lease a $50K car, this
means roughly an extra $400/year on interest, or $1200 total for a 3 year
lease. This is a common trick by the dealer. You should absolutely insist on
the standard MF.
3) There is also a $300 disposition fee when you return the car at the lease
end. It can be waived if you lease another BMW.
4) Not sure if there is also a buyout fee. I won’t buy out at the end (as it
defeats the purpose of leasing) so I didn’t do much research. If you do buy
out at the end, then you paid extra money (acquisition + buyout fees)
compared to buy directly at the beginning.

对于上述帖子,我的推论就是,当车total,如果是0 downpay,total时的保险公司

赔付和尚未支付的cap cost与到期残值之和(也就是上文中的“early buyout value”)

之间有差距(后者大于前者),这个差距也就是所谓的gap

则acquisition fee中包含的gap insurance负责付这个gap,lease车主不需额外付款。

而如果downpay付的多,本质上相当于downpay的全部或部分来支付上述gap,

结果就是很可能已经付掉的downpay也拿不回来,因此带来额外的损失。

基于上述考虑,选择0 downpay可以规避上述风险,因此是更好的选择。

最后,关于如何和dealer周旋.

和买车不同,很多人对lease的价格构成和计算是不太熟悉的,那么dealer因此也习惯

去宰lease客户,这带来的一个副产品就是对于lease客户,dealer默认更不愿意妥协,

因为会认为对方好忽悠.所以更好的方法,如@Leasing所说,去dealer先别提lease的事,

事先把功课做好,公式放手机里备用,直接就按买车来砍价.同时,如果手里有什么

厂方给的折扣,比如test drive credit, new graduate credit,等等,一律握住先不要提

等把价格砍好了,再说要按这个价格lease,并且提出压msd降mf,然后如果遇到doc fee

收的离谱的,再往下砍.到最后要成交打单子了,再把厂方给的credit提出来要求再减,

否则无良dealer会把这部分折扣直接当成自己给的来议价,增加砍价难度.

不小心敲了一大篇,已经记不得前面都说了什么,先发这些,

大伙如果有问题再回复,我试着解答.

另外我手里有带我入门的哥们儿发给我的excel,据说是完全复制了dealer的lease计算
程序

有兴趣的朋友可以回复留个邮箱,我跟大家分享一下:)

————————-
5月19日更新:

还有一点需要补充的好处,是消费税上的优势。

在那些不需对lease车进行全额缴纳消费税(比如德州就如此规定)的州

消费税仅作用在downpay和monthly payment上

也即是说残值部分不需要交税。

而对应无论cash还是finance购买,都要对车的全款进行缴税。

以一辆65k的x5来看,如果按60%残值,6%消费税计算,则意味着节省2340usd的税

而在消费税比较高的州,比如消费税到了9%左右,则可节省更多(3510usd)

当然,如果车去tradein,那么也能得到买下一辆车的消费税抵扣,

但通常tradein给dealer时,对方给的offer都会偏低。如果卖给私人,

则无法得到消费税抵扣。

Categories: life is fun

如何通过房屋租售比来判断房产的价值或泡沫?

October 1, 2016 Leave a comment

链接:https://www.zhihu.com/question/20799544/answer/44545583
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

【4月14日的更新】
感谢 @chenqin老师对售租比数据取值范围的建议,我们前后各去除了2%之后,那些比较奇葩的售租比超过2000的值(估计是挂牌价错误或单位宿舍之类的)被剔除出去了。相应的部分图纸也进行了更新,其中那张散点图的趋势变得更为明显,售租比离散区从距市中心20km处即显现了出来。
—————————————————————————————————————————————–
【4月12日的原文】
最近一直和一位师兄在研究上海的房价,有点初步的结果,拿出来跟大家讨论一下。内容有点长,先说结论吧:

就上海而言,观察所谓“房价泡沫”的问题,房屋租售比在空间上的离散程度(而非其数值)有可能是一个更好的视角。

具体内容如下:

房屋租售比是什么?一般而言,“房屋租售比”= “每平方米建筑面积的月租金”/ “每平方米建筑面积的房价”。但为了便于理解,我们可以把这个概念颠倒一下,转变为“房屋售租比”。

倒过来,“房屋售租比”=“每平方米建筑面积的房价”/“每平方米建筑面积的月租金”,其含义可以简单理解为:“在保持当前的房价和租金条件不变的情况下,完全收回投资需要多少个月”。

一般而言,按照国际经验,在一个房产运行情况良好的区域,应该可以在200-300个月内完全回收投资。如果少于200个月(17年)就能收回投资,说明这个地区有较高的投资价值;如果一个地区需要高于300个月(25年),比如1200个月(100年)才能回收投资,则说明该地区有潜在的房产泡沫风险。

200~300个月的安全区间,这是怎么算出来的呢?

简单举个例子吧,我准备投资一套房产,不想占用太多现金流,怎么办?付个首付,问银行贷款呗,能贷多少贷多少,大不了租金全部用来还按揭。好的没问题,这样的话,假如房价和租金均保持不变,租金也必须能够跑赢贷款利率才行。所以,一般国际上所认为的合理的租售比本质上是一个与贷款利率挂钩的指标。

以上海为例,现行贷款利率差不多算是6%吧(新政前后有高有低),那么按照这套租金跑赢贷款利率的逻辑,合理的售租比应该是多少呢?粗算一下,就是差不多200个月。

那么,上海有多少房子的售租比能达到200呢?

我们搜集了上海4月份的37000余套住房的租金数据和34000余套住房的房价数据,并按照小区(约12000个)进行了匹配,将每一个小区的租售比汇总到了每一平方公里的城市空间当中,并以200个月为分界值制作出下图:
&lt;img src=”https://pic1.zhimg.com/dea82966bdca9fc3e579ec43c303cb3c_b.jpg&#8221; data-rawwidth=”405″ data-rawheight=”405″ class=”content_image” width=”405″&gt;
是的,你没有看错,上图中的红点表示了售租比高于200个月的栅格空间,而白点则表示了售租比在200个月以下的栅格空间。也就是说,现阶段上海几乎没有什么所有地区的房价租金是能跑赢房贷的。

真是痛(hao)心(bu)疾(yi)首(wai)的结果啊。

不要紧,痛定思痛,再来看一下,上海的售租比到底是一个什么水平呢?我们将所有小区的租售比数值进行了排序,求出了其中位数值:

522个月。

什么概念?假设我25岁研究生一毕业,就立刻全款买了一套房,然后放出去收租,那么,在我约69岁时,这44年来陆陆续续所收的租金总数就可以达到了25岁时买房所付的钱啦。(而且还不考虑什么净现值折算之类的)。

好开心啊。才44年,竟然没有超过房屋的70年产权期呢。

高兴归高兴,我们由这些数据暂时可以得到以下两个结论:

1、在不考虑房产增值的情况下,上海绝大多数地方的房子的房租收入都跑不赢当下的商业贷款利率的。如果房价不持续上涨的话,即使以市场价出租,也是买一个月亏一个月,亏的程度不同而已;

2,如果仅靠租金收入的话,上海全市平均回收投资需要522个月,折算下来,只有约2.3%的收益。而这种格局的维持,必须有赖于购房者对上海的房价上升的持续预期。也就是说,在上海,投资房产绝不是利率收益,而是预期收益。

那么大家不禁要问了,参考国际惯例不是200到300个月么,那522个月的上海,仅靠预期收益,其房价是否有泡沫呢?

答案是:我不关心。

是的,即使租售比能够在某种程度上代表房产潜在的泡沫程度,这对于像我这样的一般购房者而言也毫无意义。为什么?很简单,买房是刚需啊。对于刚需购房者而言,他们需要做出的权衡并不是买不买房;而是怎么买一个泡沫小、风险低、收益预期高的房子。因此,我并不关心全上海的售租比包含多少绝对意义上的泡沫概念。我关心的问题是:

上海具体哪些房子的相对意义上的资产泡沫小一些?

我们先以户型分类,可以看到下图:
&lt;img src=”https://pic3.zhimg.com/32f59abba1b4259c668a0a9c67ddfd4a_b.jpg&#8221; data-rawwidth=”504″ data-rawheight=”360″ class=”origin_image zh-lightbox-thumb” width=”504″ data-original=”https://pic3.zhimg.com/32f59abba1b4259c668a0a9c67ddfd4a_r.jpg”&gt;
总体而言,售租比随着套型的增大而增大。其中一室户的租售比最低,中位数值为455个月,低于上海的全市值522个月,相对比较健康。而四室以上的豪宅则达到了590个月。

毫无疑问,这个结果令只买得起一室户的我十分欣喜(是的,这个分析毫无必要)。

那么,接下来的问题是,哪些区域售租比较低呢?

在看租售比的空间分布前,我们先研究一下房价和房租的空间分布。看下图。
&lt;img src=”https://pic2.zhimg.com/d8faa6fd13ed3242e6d89f462ec37e85_b.jpg&#8221; data-rawwidth=”841″ data-rawheight=”414″ class=”origin_image zh-lightbox-thumb” width=”841″ data-original=”https://pic2.zhimg.com/d8faa6fd13ed3242e6d89f462ec37e85_r.jpg”&gt;

左图是上海全市房价的空间分布,右图是上海房租的空间分布,可以发现,两者均表现为明显的向心性的圈层特征,而且分布的模式也基本一致。 左图是上海全市房价的空间分布,右图是上海房租的空间分布,可以发现,两者均表现为明显的向心性的圈层特征,而且分布的模式也基本一致。

那么租售比呢?再看下图。
&lt;img src=”https://pic1.zhimg.com/008a014936c064f026bcaf9a2f7ccb0c_b.jpg&#8221; data-rawwidth=”414″ data-rawheight=”414″ class=”content_image” width=”414″&gt; 毫无疑问,既然房价和租金在空间上表现为同质的圈层模式,那么作为两者相除的结果,售租比自然抹去了向心性的圈层分布特征,呈现出相对均质的扁平化分布特征,基本上看不出什么明显的特征。 毫无疑问,既然房价和租金在空间上表现为同质的圈层模式,那么作为两者相除的结果,售租比自然抹去了向心性的圈层分布特征,呈现出相对均质的扁平化分布特征,基本上看不出什么明显的特征。

那么,在这张混乱斑驳的图纸下面,到底隐藏着哪些因素影响了售租比呢?

理论上说,在一个完全理性的房产市场上,租金更多体现功能性,因此,售租比应该与每个地块轨道交通可达性、是否学区房、就业密度、以及高学历人口比例、人口密度等空间因素有关。
现实当中呢?是否如此?我们将这些因素分别代入到租售比模型当中,弄出一堆枯燥的统计学数字之后,结果出来了。请看下图:
&lt;img src=”https://pic2.zhimg.com/ca220dbbfe9d58e42f93482c7abaaecd_b.jpg&#8221; data-rawwidth=”163″ data-rawheight=”145″ class=”content_image” width=”163″&gt;
这张表是什么意思?简单一句话来解释吧:在上海全市层面,无论是学区房、轨交、就业密度还是人口,上述因素与售租比的关联均不显著

这是什么结论?难道这些经典理论中谈到的空间因素都不影响房屋租售比?这不科学啊!

别着急,我们的研究精神是百折不挠的。既然结果不显著,那么必然是某种变量没有被控制住嘛。让我们找到它。会不会是空间距离的关系呢?

于是,我们又将每一个空间栅格的售租比按照距市中心的距离排序,制作出了下面这张散点图:
&lt;img src=”https://pic4.zhimg.com/fafda18cd57fee62776927b491ceea67_b.jpg&#8221; data-rawwidth=”583″ data-rawheight=”363″ class=”origin_image zh-lightbox-thumb” width=”583″ data-original=”https://pic4.zhimg.com/fafda18cd57fee62776927b491ceea67_r.jpg”&gt;
在上图中,一个规律隐约地浮现出来:租售比的数值虽然并不随着空间距离增大或衰减,但其数值的离散程度却和空间距离有关。简单来说:

售租比越远离市中心越离散,越靠近市中心则越收敛。

其分界线大约是在20到30公里处,差不多就是上海中心城区和郊区的分野。是的,上海的租售比格局就是呈现这样一种“中心城区——郊区”分化特征的。

在获得这个认识后,我们再将轨交、学区、人口、就业等要素分为中心城区和郊区两个区间,分别代入到租售比模型中,便可以得到下表:
&lt;img src=”https://pic1.zhimg.com/6f719405b1b0b7e2c410622d6e8a16d8_b.jpg&#8221; data-rawwidth=”402″ data-rawheight=”217″ class=”content_image” width=”402″&gt;
注:* p < 0.05 ** p < 0.01

一句话解释一下吧:

中心城区的餐饮价格就业岗位密度产业结构这三个指标与房屋售租比有显著的相关性。总体来说,但在中心城区内部,人少岗位多、生产性服务业比例高、餐饮价格高的地方售租比会更低。但是这种关系在郊区并不成立。

这一结果说明了什么呢?

简单来说,中心城区的房产市场对空间因素的响应更加敏锐,而郊区则迟钝的多。这在某种程度上暗示着,在上海的郊区房产市场上,租金市场和住房市场可能是不重合的。

从理论上看,对于上海这个超大型城市,租金市场往往是本地化的,更注重房屋的功能性,因此就近的就业密度、产业结构、餐饮价格等等与之有紧密关联;但是,住房市场却是全市(国)的,包含了很强的投资性,而对于投资性购房者而言,他们看中的并非是租金收入而是预期收益,因而其选购房屋和就近的设施、就业密度、产业结构、餐饮价格等等的关联度就会较弱。

我们将这一理论假设回应到现实的结果中,就可以得出这样一个结论:

中心城区的房屋售租比的离散程度低,对空间因素的响应也更合理,说明该地区租房市场更成熟,房屋价格中包含的功能性价值也更强;而郊区的房产市场离散程度高,对空间因素无响应,说明该地区租房市场发育较弱,而房屋价格中包含的功能性也较弱,相应地更依赖投资性(或者叫预期性)价值。

在一栋房子所包含的价格中,究竟是功能性价值更安全,还是投资性(预期性)价值更安全呢?这个答案不言而喻了吧。

写到这里,我默默地在朋友圈里翻了一遍,发现在郊区买房的朋友其实不少。不止是我,大概每个漂在魔都的人都有那么几个在郊区置业的朋友、亲戚、或者同事吧。那些年,连夜排队、摇号购房的狂热景象刺激了很多买不起市中心的房子,但工资又没有房子涨的快的白领们。他们有些人选择在郊区买了房,也许目的并不是居住,而是在一轮风起云涌的大泡沫开始翻滚的时候,以正常人的理性选择来买一个泡沫而已。

那么现在呢?房价进入滞涨时代,他们是选择回归郊区的居住,还是卖掉郊区的房子然后努力置换到离工作岗位更近的市中心?我身边更多的案例往往是后者。

事实上,我并不知道上海的房地产市场是不是泡沫,这个问题需要更多的数据和更深入的探讨。我只知道,无论它是不是,我们这些漂在魔都的人也都会奋不顾身地去买一个泡沫。问题更多在于:

你是希望选择一个可能会涨得更大的泡沫,还选择一个破了之后不会溅到自己一身一脸的泡沫呢?

换个问题可能就会是,你要选择郊区,还是市区呢?

我想这是一个属于每一个人的自己的选择。

哦对了,很多北京的朋友总是向我咨询帝都的问题。说实在的,首都的问题高深莫测,一直无法摸到门径。但今天简单看了一眼,根据今年四月份的数据,帝都的全市售租比中位数是555个月,比上海还要多33个月。唉,上海总是赶不上北京啊,魔都加油吧,请把泡泡吹得更大一些。

Categories: life is fun