我们居住的城市,处处与人为敌

作者:李迪华
来源:一席(ID:yixiclub)

大家好,我叫李迪华,我是北京大学建筑与景观设计学院的老师。接受邀请前,我很犹豫要不要来。
大家知道北大的老师很怕出名,因为我们太有名了,真的。可是我的朋友们反复劝我,说去吧去吧。
有一天,我突然想起我在跟学生一起读书的时候,读过爱默生的一句话:你的善良必须有一点锋芒,不然就等于零。
20年以前,我的一位忘年交老朋友,他已经八十几岁了,但是每年他都要反复去西南部的少数民族地区扶贫。
有一年,因为城市中一个非常小的坎,他把自己的肩胛骨给摔折了。

回到北京以后,他去医院治疗,大夫说,你都八十几了,就这样吧。
这件事情让老人非常地失望,同时他失去了继续去西南地区参与挚爱的扶贫事业的机会,没过多久,我的这位朋友就走了。
从那个时候开始,我就开始关注我们的城市到底怎么了。

Read More

病人崔永元

最近,崔永元因为《手机2》与冯小刚、刘震云和范冰冰又“掐”了起来。2005年,离开《实话实说》、在《手机》“事件”后,从抑郁症走出来的崔永元第一次接受媒体采访,与南方人物周刊记者易立竞进行了长达七小时的长谈。重读此文,会让你深度认识崔永元,了解小崔与《手机》的恩怨。

《超级女声》的那些评委一塌糊涂

人物周刊:先求证一下,“收视率是万恶之源”这句话确实是你说的吗?
崔永元:那天通知我去开一个播音员和主持人的会,去了后看到标题,才知道是《抵制庸俗化》。这个会我可以参加,我有话要说,我也想听听别人的说法。
“收视率是万恶之源”这个话不是我说的,是中国社会科学院新闻研究所的时统宇说的,他是很有名的媒介研究者。他讲这话时,既有前提,又有论据,而不是喊口号。我说不是我说的,没有推卸责任的意思,我是坚决同意他的这一说法的,我今天可以在这个场合正式说这话:收视率是万恶之源,没有问题。
时统宇准确的意思是片面追求收视率会造成很坏很坏的影响,他说之所以出现电视节目低俗化,是收视率闹的鬼,所以“收视率是万恶之源”,表述得非常清楚。他说这话时,我注意到现场有很多记者,大概20多家媒体,他们在那儿聊天,发短信,没有一个人在认真听,当时我就想,可能会出问题。
那天两个人的发言最精彩,一个是时统宇,一个是清华大学的尹鸿,他们的发言对我们从业者是最有帮助的,但是后来的报道几乎没有他们的声音,都是我和李咏、朱军的。这就是媒体的问题了。多万恶啊你说,一个很好的学术研讨活动,那么多明确的、清晰的、真实的观点,最后给描述成一个批判会、批斗会,这不万恶吗?非常万恶。 Read More

技术进步会逆转城市聚集吗?

技术进步增加了人们见面的需求,城市聚集会持续、加剧,而不是逆转。
我们看到,在人口聚集度已经很高的国家比如日本、美国,人口依然在向大城市聚集,东京、纽约依然在吸附人口。从这个观察中,我们隐约看到人口的聚集是没有止境的。不过,我们也要反过来问:过去人口是往城市聚集的,未来一定会这样吗?交通、通讯技术的快速进步,会逆转这一趋势吗?
这一问题提出的背景,是信息技术的进步,使得很多时候人们不需要面对面就可以完成交流。电话会议,视频会议慢慢成为很多企业的常备设施,很多人甚至可以远程上班,还需要拥挤在密密麻麻的城市里吗?虚拟现实常常可以以假乱真,真需要面对面交流的话,借助现代交通工具和发达的道路系统,人们可以很快见面。未来从杭州到北京的时间可能就是半个小时,那么未来城市聚集的趋势会不会逆转呢?

现实中的两个额外的考虑,使得人们希望城市聚集的趋势被扭转。一个是房价。现在大城市房价这么高,很多中低收入家庭不堪重负,希望能够逃离大城市,卸下沉重的住房负担。逃离北上广的声音,在每次房价上涨的浪潮中都会响起来。第二个是城市的拥堵、污染、噪音等不太舒适的因素,使人们开始怀念“花园城市”的小镇生活,甚至“田园牧歌”的乡村生活。
 
Read More

【程序员的不同境遇:少抱怨 多解决问题】

很久以前有两个程序,当时的水准都差不多,现在A是上市公司的技术总监,B还在不停的跳槽,反反复复在“小团队主程”和“大公司打杂”的两种岗位之间不停切换。B一直把这些不同归咎于自己没有遇到A那样子的机遇,经常在群里和微博抱怨自己的运气。那天我终于忍不住了,在他再一次抱怨之后,我开始喷他,我说你就从来没有想过自己的原因么?同样是一个临时小活动,我叫A做的时候,A都会告诉我,他手上现在有什么,大概多久能做完,做完之后就可以做这个活动了。而你永远都是说现在很忙,什么时候做不完不知道,因为总有不可预知的东西,我们这些外行人问时间掐进度都是很愚蠢的。

同样在计算自己的开发时间的时候,A说三天做完就一定要三天做完,做不完的就会周六周日来加班,你说一周做完的工作能拖一个月,而且拖欠那么多工作还永远觉得无所谓,永远准时 6 点走人,质问你的时候,你还振振有词说没人付你加班费。

同样是手上的工作做完了,A会找我问有没有后继的工作,而你只会浪费贷款在那边看肥皂剧,直到有人发现你为止。

同样是大家吃完饭回来,A会立刻开始工作,你会一定要把剩下的午餐时间拿来玩一把游戏,逛一下淘宝。 Read More

哈佛关于气场的培养

哈佛关于气场的培养:

一,沉稳:

(1)不要随便显露你的情绪。

(2)不要逢人就诉说你的困难和遭遇

(3)在征询别人的意见之前,自己先思考,但不要先讲。

(4)不要一有机会就唠叨你的不满。

(5)重要的决定尽量有别人商量,最好隔一天再发布。

(6)讲话不要有任何的慌张,走路也是。

Read More

Java程序员应该知道的10个调试技巧(转)

调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序。但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运行时上面。

在开始之前,推荐大家去看看Eclipse shortcuts这篇文章,它将会给你带来很多方便。在本文中使用的是Eclipse Juno版(Eclipse 4.2),在开始前给大家提3点建议!

  1. 不要使用System.out.println作为调试工具
  2. 把所有涉及到的组件日志级别激活并使用
  3. 使用日志分析器来读取日志

1.条件断点

如果你不知道如何添加断点,只需点击左边面板(行号前面)断点即被创建。在调试界面中,“断点”视图会把所有被创建的断点列出来。我们可以给它加一个布尔条件,也就是说,该断点会被激活并且如果布尔条件为真,就会执行该断点,否则将会跳过往下执行。

2.异常断点

在断点视图中,有一个J!标记按钮!我们可以使用该按钮来添加一个Java异常断点。例如,我们想让程序在遇到空指针异常(NullPointerException)时,仍然能继续调试,那么我们可以使用该按钮来添加一个异常断点!

3.监视点

这是一个非常好的功能,当选定的属性访问或修改程序时,程序会停止执行并允许进行调试。在Outline视图中选择一个类变量并从上下文菜单中选择切换监视点,属性监视点将会被创建,在断点(Breakpoints)视图中会把所有监视点用列表的形式显示出来。

4.评估/检查

按Ctrl+Shift+D或者Ctrl+Shift+I来显示选定变量或者表达式的值。我们也可以给一个变量或表达式添加永久观察点,当程序在调试时,这些观察点就会在表达式视图(Expression view)中显示出来。

5.修改变量值

在调试过程中,我们可以修改变量值。先选好一个变量然后进入变量视图(Variables view),根据变量类型在其对应的Value列里输入值即可。

6.在Main函数里面停止执行

在运行/调试设置中,编辑配置对话框中有“Main”这个选项卡,我们可以勾选“Stop in main”这个复选框。如果选中,那么在调试一个基于main方法的Java程序时,程序会在main方法第一行位置便停止执行。

7.环境变量

并不是在系统属性中添加环境变量,我们可以在编辑配置对话框中很方便地进行添加。

8.Drop to Frame

这也是我最喜欢的一个功能。调试期间,可以重新跳到调用堆栈框架的开始处执行,并且变量值也会回到最初。根据回档调整堆栈的深度,这个功能的主要用途是所有变量状态可以快速回到方法开始执行时候的样子,然后你可以重新进行一遍一遍执行,这样就可以在你关注的地方进行多次调试,但是在执行过程中也会产生一些副作用,比如插入到数据库里面的数据是无法删除的!

9.分布过滤

当我们进入(F5)方法的时候,我们还可以访问其外部库(比如java.*),我们可能不需要这个库,就可以在Perference选项卡页面添加一个过滤器来排除这个包。

10.进入、跳出和返回

我把这个放在最后一点,在调试过程中,这些是必须要了解(最好掌握)的东西:

F5——进入:移动到下一个步骤,如果当前行有一个方法调用,该控件将会跳转到被调用方法的第一行执行。

F6——跳出:移动到下一行。如果在当前行有方法调用,那么会直接移动到下一行执行。不会进入被调用方法体里面。

F7——返回:从当前方法中跳出,继续往下执行。

F8——移动到下一个断点处执行。

不管你有再多的兴趣爱好

不管你有再多的兴趣爱好,再多的社会关系,再深的对努力学习的厌恶之感。在你青春期的某一个时间点,你都会明白,学习的重要性高过所有。你要无欲则刚,你要学会孤独,你要把自己逼出最大的潜能,没有人会为了你的未来买单;你要么努力向上爬,要么烂在社会最底层的泥淖里。这就是生活

建议PHP组以后统一运用此框架开发应用-YAF

开发环境

yaf开发环境建议 lamp,目前yaf的最新版本为2.1.18(建议使用),php version 5.3+

apache 必须开启rewrite模块

yaf框架是基于C扩展写的,调试起来相对麻烦。建议你的开发环境中,php.ini应如下配置:

display_errors = on
log_errors = on
html_errors = on
error_reporting= E_ERROR | E_WARNING | E_PARSE | E_NOTICE

目录结构

+ public  //网站根目录
   - index.php //入口文件
   - .htaccess //重写规则    
+ conf
  |- application.ini //配置文件   
application/
  + controllers
     - Index.php //默认控制器
  + views    
     |+ index   //控制器
        - index.phtml //默认视图
  + modules //其他模块
  - library    //组件目录
  - models  //model目录
  - plugins //插件目录
复制代码

命名规范

同Pear命名规范,@see http://www.wzjs163.com/tangshan/knowledge/php/41.html#1

补充 :

变量命名,全小写字母,单词用下划线分割,非驼峰

类方法命名,采用驼峰命名

类命名,应注意类与父目录之间的关系, 通常“目录名_类名”,  目录首字母和类首字母大写, 例 “Base_Func”, 类文件存储位置为Base目录下的Func.php

部件(library)加载

      默认规则

yaf框架的默认设置是,只要是符合命名规则类,只要放在APPLICATION_PATH/library下的类目录都会被加载,因为此时的APPLICATION_PATH/library目录

为全局目录. 所以我们不需要去注册本地类。

      全局类

我们开发的时候,通常会遇到这样的情形。多个应用同时公用一些类,我们常常把这些类称为全局类。

为了使这些类得到统一管理,避免这些类的反复修改,我们通常会把这些类的全局空间里。

我们需在php.ini文件夹下做如下配置:

yaf.library=/var/www/yaf_global

这样,我们的全局空间默认的路径就在”/var/www/yaf_global”下了,所有存放在全局空间的类,符合yaf命名的规则类都将被加载

      本地类

本地类是指应用的自身类库.

我们要修改本地类的存放路径,只需在应用的配置文件增加:

application.library = 本地类空间的路径(绝对路径)

      Yaf_loader::import

      既然有了autoloader,那么什么时候我们需要使用Yaf_loader::import

第一种,你的类属于第三方类,也就是不属于YAF命名规范的

第二种,你的文件不是一个类,它可能只是一个存放很多方法的文件

第三种,你的文件没有存放在自动加载的空间里,你依然想使用

YAF单例模式类

Yaf_Application,  Yaf_Loader,  Yaf_Dispatcher, Yaf_Registry, Yaf_Session,这些类都是单例模式类。反之,其他类不是

你可以通过它们的getInstance() 来获取它们的单例,也可以通过Yaf_dispatcher::getXXX方法来获取实例

YAF 链式操作

     Yaf的很多类提供的api都是直接返回自身对象的,这样我们可以很方便的进行链式操作。

Yaf_Session::getInstance()->set('name', "alex")->set('sex',"男");

YAF 默认url访问规则

     Yaf默认开启的路由是static路由模式.

static路由模式的访问规则为,http://domain-name/module-name/controller-name/action-name/param1/value1…..

     如果你想切换路由模式,那么需在应用的配置文件增加:

application.dispatcher.defaultRouter =  默认的路由形式

Yaf默认的模块为Index, 默认的Controller为Index,默认的Action为Idex,这些你也可以通过框架进行配置更改

application.dispatcher.defaultController = 默认的控制器
application.dispatcher.defaultModule = 默认的模块
application.dispatcher.defaultAction = 默认的动作

YAF 路由

Yaf支持5种默认路由模式.  注:以下规则示例中省略了入口文件

static 路由(不支持参数映射), 访问规则

http://domain-name/module-name/controller-name/action-name/param1/value1…….

supervar 路由(不支持参数映射),访问规则

http://domain-name/?r=/module-name/controller-name/action-name/&param1=value1……

simple 路由(不支持参数映射),访问规则

http://domain-name/?m=module-name&c=controller-name&a=action-name http://domain-name/?m=module-name&c=controller-name&a=action-name&param1=value1……

rewrite 路由(支持参数映射),支持REST, 访问规则

@see http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.rewrite

regex 路由(支持参数映射),支持REST, 访问规则

@see  http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.regex

yaf 支持多种路由同时共存,是优点也是缺点. 假设情景路由只支持rewrite路由模式,而不支持regex路由,但这两种路由都存在,我们如何

用最有效的方法的去处理.代码如下

复制代码
class UserPlugin extends Yaf_Plugin_Abstract {

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        $router = Yaf_Dispatcher::getInstance()->getRouter()->getCurrentRoute();
             if ($router == 'regex')  {
                   throw new Exception("not found page");
             }
    }
}
复制代码

另,配置路由的时候,请注意路由配置的顺序

Yaf 插件

yaf 插件主要用来增强Yaf框架功能,网上有人利用yaf的6个hook实现了YAF框架调试日志功能, 也有人利用插件实现了yaf的layout,

还有象上例实现路由的再次重定向,譬如我们可以通过IP段,UA,将请求重定向不同的模块,Controller,来处理

如何来写一个插件呢,我们只需写一个类去实现Yaf_Plugin_Abstract, 并将插件注册一下.

复制代码
class SamplePlugin extends Yaf_Plugin_Abstract {

    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //在路由之前触发
    }

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //路由结束之后触发
    }

    public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发循环开始之前触发    
    }

    public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发之前触发
    }

    public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发结束之后触发
    }

    public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发循环结束之后触发
    }
}
复制代码

注册需在bootstrap进行

   public function _initPlugin(Yaf_Dispatcher $dispatcher) {
        //注册一个插件
        $sample_plugin = new SamplePlugin();
        $dispatcher->registerPlugin($sample_dplugin);
   }

 

Yaf 模块

模块的使用再日常开发的情景非常多.比如CMS 前台后后台,可以定义为Index和Admin,这样它们可以共用配置文件和library.而且url也更加友好。

开发过程中也能分模块开发.  我们可以把一个搜索栏目,拆为新闻模块,供应模块,求购模块,产品模块,公司模块。或者分得更细些

模块在Yaf中的配置

application.modules = admin,index

 

参考资料 

yaf.laruence.com/manual/

项目地址

https://github.com/laruence/php-yaf

解剖Facebook部落式架构(转)

Facebook 的Director of Engineering(工程总监)Aditya Agarwal,在2008年和2010年,在QCon国际会议上的两篇演讲 [3,4],谈及Facebook的系统架构,见图一。

解剖Facebook架构:传统烟囱解决不了新需求

图一. Facebook 的系统架构

 

由此可见,目前 Facebook 的系统架构,类似于早期 Yahoo! 的系统架构。作为门户,Yahoo! 是一大堆各色服务的汇集,包括新闻,财经,求职,Email 等等。Yahoo! 内部把每个服务称为 “部落”,每个部落自成一体,有各自的酋长, Yahoo! CEO 杨致远自称是大统领。

国内的门户网站,如新浪和搜狐,它们的系统架构大多也与 Yahoo! 的类似。

部落式的系统架构,有什么问题呢?

澳拜客(Outback Steakhouse)是一家全球连锁牛排餐厅,北京有两家分店,在王府井和工体院内,口味地道。澳拜客的正餐前的开胃菜,开花洋葱(Bloomin’ Onion),很受顾客青睐。

去年,澳拜客决定通过 Facebook 发放优惠券,以免费 ”开花洋葱“ 为号召,吸引顾客。促销活动从 2009 年 11 月 5 日开始,原订计划是做 30 天的活动,吸引 50 万顾客。

Facebook 的传染性果然威力惊人,活动开始后仅仅一周,就已经吸引了超过 20 万顾客,仅仅 18 天,就圆满完成了吸引 50 万顾客的任务 [5]。

对于 Facebook 来说,这不仅是一次赢利机会,而且也是一次绝好的宣传机会,今后可以举一反三,向其它商家推荐这种促销方式。但是 Facebook 没赚到什么钱,洋洋得意的,却是微软 [6]。

解剖Facebook架构:传统烟囱解决不了新需求

图二. 澳拜客(Outback)在 Facebook 上的 ”开花洋葱“ 优惠券

 

澳拜客的强项是烧菜,所以澳拜客的市场部把网络促销的实现工作,外包给了一家名叫Thuzi 的公司。Thuzi 的 CTO 认为,由于难以事先预料促销活动开始以后,会有多少顾客会光顾澳拜客的主页。流量难以预测,所以无法预先确定需要多少台服务器。合理的解决方案,是租赁云计算平台,根据实时流量,即时动态地分配服务器。多用多付钱,少用少付钱。

Thuzi 接到澳拜客的项目,是 2009 年 9 月的事儿,这时离促销开始的 11 月,只有两个月的时间。Thuzi 先是考虑租赁 Amazon 的云计算平台,但是开发工作量太大。又考虑了 Google 的云计算平台,但是使用太复杂。最后 Thuzi 选择了微软的 Azure 云计算平台,结果圆满完成任务 [6]。

在可见的未来,类似澳拜客这样的促销活动,将越来越多。Facebook 急需建设自己的云计算平台,而且还必须易学易用,把两个月的开发周期,最好降低到几天,甚至几个小时。

因为没有云,Facebook 丢了商机。而且丢掉的,不仅仅是市场促销活动这一类商机。

有个制作视频的服务,Animoto,在 Facebook 登台亮相之初,宾客盈门。Animoto 后台服务器在三天内,需求量从 40 台一下子猛增到 5000 台。热闹了一阵子以后,宾客热情消退,门可罗雀,根本用不了 5000 服务器。

如果在用户人数大增时,Animoto 不迅速增加后台服务器的数量,用户无法正常使用该服务,失去的是市场。但是用户人数大跌以后,这 5000 台服务器闲置,又造成对现金流的无意义的侵蚀。

所幸的是,Animoto 当初没有自己购置服务器,而是租用了 Amazon EC2 云计算服务,一场左右两难的惊悚,被云计算服务化解于无形 [7,8]。

Facebook 平台上,有 55 万个这样的服务。假如 Facebook 有自己的云,租赁云计算这笔大生意,就不至于落入 Amazon 和微软之手。

解剖Facebook架构:传统烟囱解决不了新需求

图三. Animoto 租用 Amazon 云计算服务

 

从这两个例子中,我们看到 “部落式” 的系统架构存在的一个问题。由于各个部落自成一体,不共享资源,造成各部落平时资源冗余,高峰时却又疲于应付。

无法实时地弹性地分配资源,这只是部落式系统架构存在的,诸多隐患中的一个。

业界经常把 Yahoo! 部落式系统架构,形象地称为 “烟囱”。烟囱式系统架构,虽然存在很多问题,但是技术门槛低,各部落各司其职,责任分明。从历史上看,曾经助力 Yahoo! 等等门户网站,迅速走向市场,这是烟囱的历史功绩。

但是随着时代的发展,传统的烟囱,解决不了新需求新问题。新需求新问题,需要云计算这个新技术。

Facebook 不是不明白这个道理,它正在逐步构筑自己的云计算平台。

本文参考文献:

[1] Apple SEC Filings.

http://finance.yahoo.com/q/sec?s=AAPL+SEC+Filings

[2] Warren Buffett and the Interpretation of Financial Statements

[3] Facebook: Science and the Social Graph

http://www.infoq.com/presentations/Facebook-Software-Stack

[4] Scale at Facebook.

http://www.infoq.com/presentations/Scale-at-Facebook

[5] Facebook + Cloud Computing = A Perfect Marriage for Social Media Marketing?

http://blogs.msdn.com/b/ingitaraj/archive/2010/03/29/facebook-cloud-computing-is-this-the-perfect-marriage-for-social-media-marketing.aspx

[6] Microsoft Case Studies: Outback Steakhouse.

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000005861

[7] Above the Clouds: A Berkeley View of Cloud Computing

http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf

[8] Animoto ramped up in the cloud.

http://www.informationweek.com/blog/main/archives/2009/01/behind_the_musi.html