文章归档

python中unicode、utf8、gbk等编码问题

11 | 07 | 2015

                                                                                      ——-网摘
1.普通字符串与unicode转换

无论是什么平台什么编码格式都能转换为unicode格式。

以utf8编码方式把字符串转换为unicode:

‘aaa’.decode(‘utf8′)

等同于

unicode(‘aaa’, ‘utf8′)

把unicode字符串转换为utf8编码格式字符串:

‘aaa’.decode(‘utf8′)

注意:这样写已经表示’aaa’是一个unicode格式的字符串了,等同于

u’aaa’.decode(‘utf8′)

如果全部是英文字符或者数字,则utf8与gbk输出结果一致,而且带不带u都一样

2.有汉字的字符串

这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的,伤不起!

把普通中午字符串转换为unicode:

‘也有’.decode(‘gbk’)

注意:此时字符串前不能加u,而且汉字编码只能写gbk或者gb2312等

把上面的结果再转成gbk

print  u’\u4e5f\u6709′.encode(‘gbk’)

当然unicode可以转成utf8,但是要看你的终端支持什么编码了,要不然就会乱码,我用的WIN,所以就用gbk测试

如果不用print输出,直接

u’\u4e5f\u6709′.encode(‘gbk’)

或者

u’\u4e5f\u6709′.encode(‘utf8′)

你会看到这两个汉字在gbk和utf8编码格式下的字符,这里不多研究了(utf8汉字编码比gbk多一个字符)

下面把运行的结果输出:

>>> ‘aaa’.decode(‘utf8′)
u’aaa’
>>> unicode(‘aaa’, ‘utf8′)
u’aaa’
>>> ‘aaa’.decode(‘utf8′)
u’aaa’
>>> u’aaa’.decode(‘utf8′)
u’aaa’
>>> ‘也有’.decode(‘gbk’)
u’\u4e5f\u6709′
>>> print  u’\u4e5f\u6709′.encode(‘gbk’)
也有
>>> u’\u4e5f\u6709′.encode(‘gbk’)
‘\xd2\xb2\xd3\xd0′
>>> u’\u4e5f\u6709′.encode(‘utf8′)
‘\xe4\xb9\x9f\xe6\x9c\x89′

说明:str()函数,有时候我们要借助它来过度转换,比如u’长春市’,这就是我下午遇到的问题,把urlencode转换的编码经过urldecode解码,结果前面多个u,此时是utf8编码,然后decode成unicode,出问题了:

>>> s = u’长春市’
>>> import urllib
>>> urllib.unquote(s)
u’\xe9\x95\xbf\xe6\x98\xa5\xe5\xb8\x82′
>>> urllib.unquote(s).decode(‘utf8′)
Traceback (most recent call last):
File “”, line 1, in
File “D:\Python26\lib\encodings\utf_8.py”, line 16, in decode
   return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-8: ordin
al not in range(128)

特别注意:utf8编码、gbk编码的原型加上u然后再转unicode是错误写法,肯定转不了,那怎样去掉u呢?str()函数也不能直接转,只好把u’长春市’用str()处理去掉u,然后一切都OK了。

>>> urllib.unquote(str(s)).decode(‘utf8′)
u’\u957f\u6625\u5e02′
>>> print urllib.unquote(str(s)).decode(‘utf8′)
长春市

转载:http://luchanghong.com/python/2012/07/06/python-encoding-with-unicode-and-gbk-and-utf8.html

正则表达式(转)

09 | 07 | 2015

第一章        正则表达式概述

正则表达式(Regular Expression)起源于人类神经系统的研究。正则表达式的定义有以下几种:

l         用某种模式去匹配一类字符串的公式,它主要是用来描述字符串匹配的工具。

l         描述了一种字符串匹配的模式。可以用来检查字符串是否含有某种子串、将匹配的子串做替换或者从中取出符合某个条件的子串等。

l         由普通字符(a-z)以及特殊字符(元字符)组成的文字模式,正则表达式作为一个模版,将某个字符模式与所搜索的字符串进行匹配。

l         用于描述某些规则的的工具。这些规则经常用于处理字符串中的查找或替换字符串。也就是说正则表达式就是记录文本规则的代码。

l         用一个字符串来描述一个特征,然后去验证另一个字符串是否符合这个特征。

以上这些定义其实也就是正则表达式的作用。

第二章 正则表达式基础理论

这些理论将为编写正则表达式提供法则和规范,正则表达式主要包括以下基础理论:

l         元字符

l         字符串

l         字符转义

l         反义

l         限定符

l         替换

l         分组

l         反向引用

l         零宽度断言

l         匹配选项

l         注释

l         优先级顺序

l         递归匹配

2.1 元字符

在正则表达式中,元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,如:、 \w等。根据功能,元字符可以分为两种类型:匹配位置的元字符和匹配字符的元字符。

2.1.1 匹配位置的元字符

包括:^、$、和\b。其中^(脱字符号)和$(美元符号)都匹配一个位置,分别匹配行的开始和结尾。比如,^string匹配以string开头的行,string$匹配以string结尾的行。^string$匹配以string开始和结尾的行。单个$匹配一个空行。单个^匹配任意行。\b匹配单词的开始和结尾,如:\bstr匹配以str开始的单词,但\b不匹配空格、标点符号或换行符号,所以,\bstr可以匹配string、string fomat等单词。\bstr正则表达式匹配的字符串必须以str开头,并且str以前是单词的分界处,但此正则表达式不能限定str之后的字符串形式。以下正则表达式匹配以ing结尾的字符串,如string、This is a string等

Ing\b

正则表达式ing\b匹配的字符串必须以ing结尾,并且ing后是分界符,以下正则表达式匹配一个完整的单词:\bstring\b。

2.1.2 匹配字符的元字符

匹配字符的元字符有7个:.(点号)\w\W、、s\\S\d\D。其中点号匹配除换行之外的任意字符;\w匹配单词字符(包括字母、汉字、下划线和数字);\W匹配任意非单词字符、\s匹配任意的空白字符,如空格、制表符、换行等;\S匹配任意的非空白字符;\d匹配任意数字字符;\D匹配任意的非数字字符。如:

^.$匹配一个非空行,在该行中可以包含除了换行符以外的任意字符。

 

^\w$匹配一个非空行,并且该行中只能包含字母、数字、下划线和汉字中的任意字符。

 

\ba\w\w\w\w\w\w\\b匹配以字母a开头长度等于7的任意单词

 

\ba\w\w\w\d\d\d\D\b匹配以字母a开头后面有3个字符三个数字和1个非数字字符长度等于8的单词

 

2.2 字符类

字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在[](方括号)中定义。如:

[012345]可以匹配数字0到5中的任意一个。

<H[123456]>可以匹配HTML标签中的H1到H6。

[Jj]ack可以匹配字符串Jack或jack。

但是,由于表达式[0123456789]书写非常不方便,连字符(-)便应用而生,[0-9]等价于[0123456789]。[a-z]匹配任何小写字母,[A-Z]匹配任意大写字母。如果要在字符类中包含连字符,则必须包含在第一位,如:[-a]表示表达式匹配-或者a。在字符类中如果^是字符类的第一个字符表示否定该字符串,也就是匹配该字符串外的任意字符,如:[^abc]匹配除了abc以外的任意字符,[^-]匹配除了连字符以外的任意字符,a[^b]匹配a之后不是b的字符串。

表2-1 常用的字符类

字符或表达式 说明
\w 匹配单词字符(包括字母、数字、下划线和汉字)
\W 匹配任意的非单词字符(包括字母、数字、下划线和汉字)
\s 匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等
\S 匹配任意的非空白字符
\d 匹配任意数字
\D 匹配任意的非数字字符
[abc] 匹配字符集中的任何字符
[^abc] 匹配除了字符集中包含字符的任意字符
[0-9a-z_A-Z_] 匹配任何数字、字母、下划线。等同于\w
\p{name} 匹配{name}指定的命名字符类中的任何字符
\P{name} 匹配除了{name}指定的命名字符类中之外的任何字符
. 匹配除了换行符号之外的任意字符
[^0-9a-zA-Z_] 等同于\W

2.3 字符转义

表2-2:常用的转义字符

表达式

可匹配

\r, \n

代表回车和换行符

\t

制表符

\\

代表 “\” 本身

还有其他一些在后边章节中有特殊用处的标点符号,在前面加 “\” 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 “^” 和 “$” 字符,则表达式就需要写成 “\^” 和 “\$”。

表达式

可匹配

\^

匹配 ^ 符号本身

\$

匹配 $ 符号本身

\.

匹配小数点(.)本身

2.4 反义

在使用正则表达式时,如果需要匹配不在字符类指定的范围内的字符时,可以使用反义规则。其实我们已经使用过反义表达式,如\W、\S、\D、[^abc]等。常用的反义表如下:

表2-3:常用的反义表达式

字符或表达式 说明

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

2.4 限定符

正则表达式的元字符一次只能匹配一个位置或一个字符,如果需要匹配零个一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。如{n}表示出现n次;{n,}表示重复至少n次;{n,m}表示至少出现n次最

多m次。常用限定符如下表:

表2-4:常用限定符

字符

描述

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。 * 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。

?

匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。

{n,}

n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。

{n,m}

mn 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, “o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

*?

尽可能少的使用重复的第一个匹配

+?

尽可能少的使用重复但至少使用一次

??

如果有可能使用零次重复或一次重复。

{n}?

等同于{n}

{n,}?

尽可能少的使用重复但至少重复n次

{n,m}?

介于n次和m次之间,尽可能少的使用重复。

2.5 贪婪、惰性和支配性匹配

惰性匹配:先看字符串中的第一个字母是不是一个匹配,如果单独一个字符还不够就读入下一个字符,如果还没有发现匹配,就不断地从后续字符中读取,只道发现一个合适的匹配,然后开始下一次的匹配。

贪婪匹配:先看整个字符串是不是一个匹配,如果没有发现匹配,它去掉字符串中最后一个字符并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或字符串不剩一个字符为止。

支配性匹配:只尝试匹配整个字符串,如果整个字符串不能产生一个匹配,则不再进行尝试。

我们普通的字符类均是贪婪匹配,如果在字符类后加个问号(?)则表示懒惰匹配,要成为支配性匹配则在懒惰匹配后加个问号(?).

2.6替换

正则表达式0\d{2}-\d{8}和0\d{3}-\d{7}分别匹配区号为3位和4位的固定电话号码,如果需要同时匹配区号为3位和4位的固定电话号码,可以使用替换满足这一需求。最简单的替换是使用竖线(|)表示。以下表达式匹配了区号为3位号码为8位和区号为4位号码为7位的的电话号码,区号和号码均使用-连接,0\d{2}-\d{8}|0\d{3}-\d{7}

表2-5 常用替换

字符或表达式 说明
| 匹配竖线(|)左侧或右侧
(?(表达式)yes|no) 表达式要么与yes部分匹配要么与no部分匹配,其中no部分可以省略。
(?(name)yes|no) 以name命名的字符串要么与yas部分匹配,要么与no部分pp,其中no部分可以省略

2.7 分组

分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中分组使用圆括号(),分组后把圆括号中的表达式看做一个整体来处理,比如:(abc){1,2}表示abc出现一次或两次的字符串,其中把abc看做一个整体来进行匹配。

2.8 后向引用

当一个正则表达式被分组后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右,以分组的左括号为标志,第一个组号为1,第二个分组号为2,以此类推。如:(A?(B?(C?)))将产生3个组号,第一组为:(A?(B?(C?)));第二组为: (B?(C?));第三组为:(C?)。

反向引用提供了查找重复字符组的方便方法,反向引用可以使用数字命名(默认名称)的组号,也可以使用指定命名的组号。比如:\b(\w)\1\b匹配两个字符一样的单词,此表达式和\b(\w)\w\b不一样,后者两个字符可以不一样。再看,\b(\w)(\d)\1\2\b,匹配一个字符和一个数字然后重复字符和数字。\b\w*(\w+)\1\b匹配以至少两个字符一样结尾的单词。\b(\w+)\b\s+\1\b此正则表达式匹配的具体过程如下:

a.       表达式\b(\w+)\b匹配一个单词并且单词的长度至少为1

b.       表达式\s+匹配一个或多个空白字符

c.       表达式\1将重复子表达式(\w+)匹配的内容,及匹配重复的单词

d.       匹配单词的结束位置。

分组不仅可以使用数字作为组号,还可以使用自定义名称作为组号。以下两个正则表达式都是将分组后的子表达式\w+命名为word.

(?<word>\w+)

(?’word’\w+)

因此\b(\w+)\b\s+\1\b和以下正则表达式是等价的,都匹配重复的单词:

\b(?<word>\w+)\b\s+\k<word>\b

表2-5 后向引用说明表

表达式 说明
\数字 使用数字命名的后向引用
\k<name> 使用指定命名的后向引用

表2-6 常用分组说明

字符 说明
(expression) 匹配字符串expression,并将匹配的文本保存到自动命名的组里
(?<nane> expression) 匹配字符串expression,并将匹配的文本保存到以name命名的变量中,该名称不能包含标点符号,不能以数字开头。
(?:expression) 匹配字符串expression,不保存匹配的文本,也不分配组号
(?!expression) 匹配后面不是字符串expression的位置
(?=expression) 匹配字符串expression前面的位置
(?<=expression) 匹配字符串expression后面的位置
(?<!expression) 匹配前面不是字符串expression的位置
(?>expression) 只匹配expression一次

2.9 零宽度断言

元字符^、\b、$都匹配一个位置,并且这个位置满足一定条件。在此把满足一个条件称为断言或零宽度断言。正则表达式中零宽度断言说明如下表:

表2-6 零宽度断言

字符(断言) 说明
^ 匹配行的开始位置
$ 匹配行的结束位置
\A 匹配必须出现在字符串的开头
\Z 匹配必须出现在字符串的结尾或字符串结尾处的换行符(\n)前
\z 匹配必须出现在字符串的结尾
\G 匹配必须出现在上个匹配结束的地方
\b 匹配单词的开始或结束的位置
\B 匹配不是单词的开始或结束的位置

表达式(?=expression)、(?!expression)、(?<=expression)、和(?<!expression)都是匹配一个位置。下面将详细介绍表达式(?=expression)和(?<=expression)。

(?=expression)又称为零宽度正预测先行断言,它断言自身位置的前面能够匹配表达式expression。以下正则表达式匹配以ed结尾的单词的前面部分:\b\w+(?=ed\b)。

(?<=expression)又称为零宽度正回顾后发断言,它断言自身位置的后面能够匹配表达式expression,以下正则表达式匹配以an开头的单词的后面部分,即匹配单词除了字符串an之外的部分:(?<=\ban)\w+\b

2.10 负向零宽度断言

零宽度断言只能指定或匹配一个位置,而负向零宽度断言与零宽度断言正好相反,它能指定或匹配不是一个位置,即所说的反义。特别是在匹配字符串中不包含指定的字符时,负向零宽度断言特别有用,比如要匹配断言字符a之后不能是字符b的表达式为:

\b\w*a(?!b)\w*\b

因此该表达式匹配一个单词,并且这个包含字符a并且a后面不是紧随着b

表达式(?!expression)称为负向零宽度断言,它断言自身位置后不能包含expression。以下正则表达式匹配一个z字符串,字符串前三位为字符并且后边不是紧随着数字:\b\w{3} (?!\d+);表达式(?<!expression)称为零宽度回顾后发断言,它断言自身位置的前面不能匹配字符串expression。以下表达式匹配不以数字开头、并且字符串中只包含大写字母、小写字母或下划线。

(?<!\d+) [a-z-A-Z]+

2.11匹配选项

匹配选项可以指定正则表达式匹配中的行为,如忽略大小写、处理多行、处理单行、从右到左开始匹配等。常用的匹配选项如下:

表2-7 常用匹配选项

RegexOptions枚举值

内联标志

简单说明

ExplicitCapture

n

只有定义了命名或编号的组才捕获

IgnoreCase

i

不区分大小写

IgnorePatternWhitespace

x

消除模式中的非转义空白并启用由#标记的注释。

MultiLine

m

多行模式,其原理是修改了^和$的含义

SingleLine

s

单行模式,和MultiLine相对应

2.12 优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

表2-8:优先级说明

运算符

说明

\

转义符

(), (?:), (?=), []

括号和中括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, \anymetacharacter, anycharacter

定位点和序列

|

替换

字符的优先级比替换运算符高,替换运算符允许“m|food”与“m”或“food”匹配。若要匹配“mood”或“food”,请使用括号创建子表达式,从而产生“(m|f)ood”。

2.12 递归匹配

递归匹配在匹配具有嵌套结构的字符串时特别有效。比如算术表达式((1+2)*(3+4))具有嵌套结构,如果要使用正则表达式检查该表达式是否正确,则可以使用递归匹配解决该问题。

这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法。

有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?

为了避免(和\(把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?

这里需要用到以下的语法构造:

  • (?’group’) 把捕获的内容命名为group,并压入堆栈(Stack)
  • (?’-group’) 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  • (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  • (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个”group”,第二个就是从黑板上擦掉一个”group”,第三个就是看黑板上写的还有没有”group”,如果有就继续匹配yes部分,否则就匹配no部分。

我们需要做的是每碰到了左括号,就在压入一个”Open”,每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。

<                         #最外层的左括号

    [^<>]*                #最外层的左括号后面的不是括号的内容

    (

        (

            (?’Open'<)    #碰到了左括号,在黑板上写一个”Open”

            [^<>]*       #匹配左括号后面的不是括号的内容

        )+

        (

            (?’-Open’>)   #碰到了右括号,擦掉一个”Open”

            [^<>]*        #匹配右括号后面不是括号的内容

        )+

    )*

    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的”Open”;如果还有,则匹配失败

>                         #最外层的右括号

平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?’Open'<div[^>]*>)[^<>]*)+((?’-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

 

值不值?

23 | 04 | 2015

先写注释:在知乎上看到的,通俗易懂的解释,附上原始链接:http://www.zhihu.com/question/27410891/answer/41064037 原作者是:徐元直  徐庶大人~~

判断一件事值不值得牵涉非常多的因素,有理性的方面也有非理性的方面。既然题目标签为心理学,我想人们的关注点不在于高帅富A不在乎价格、矮穷挫B根本买不起,或者不同的人兴趣爱好三观有别这种显而易见的答案。从心理角度来说,除了消费能力和个人价值观之外,还有什么心理因素影响人们对价值的判断,是一个值得探讨的问题,而这其实是行为经济学的研究对象。这里略提一下两个影响深远的理论:

一个是卡尼曼(Daniel Kahneman)和特沃斯基(Amos Tversky)的前景理论。根据前景理论,人们从不同的角度权衡本质上一样的选项,会得到不同的判断。简单来说,想着收益的时候人们规避风险,宁愿要必然到手的50元也不选1/2机会到手的100元,想着损失的时候人们追逐风险, 宁愿赌1/2的机会不被拿走100元,也不要乖乖交出50元。买耳机也可以 是一种风险决策(你不确定它的表现是否对得起你的期望),那么根据前景理论,即使两个人对耳机有着同样的期望 X,这两人也有着同样的消费能力,但如果一个人想的是「有了这个耳机我听歌的感受能有 X 的提升」,而另一人想的是「若没有这个耳机我听歌就得不到 X 的感受」,两人的决策也可能完全不同。甚至我们可以说,就算是同一个人,他购买与否的决定很可能取决于他采用了上述哪种思维。所以一个出色的推销员不会一味强调买了这个你就能得到什么,而是要引导客户去想没了这个你将失去甚么,这就是对心理学的一种应用。

第二个是塞勒(Richard Thaler)受卡尼曼启发提出的心理账户理论。心理账户理论说的是我们心里会把自身的经济活动归类于不同的「账户」中,而这会导致我们对同样数量的钱作出不同的价值判断——仅取决于这些钱「存」在哪个心理账户。一个简单的例子是,你今天打算一个人去看电影,结果准备出门的时候发现你的车被罚了一张 100元的罚单,那你还去不去?再换一种情况,你今天打算一个人看电影,早前已经买好了100元的电影票,结果今天发现票弄丢了,不过票没卖完,你仍然可 以去电影院再买一张100元的票入场,你还去不去?同样是100元的损失,但因为这100元所属的心理账户不同,很多人就会作出不同的决定,车被开了罚单多数人还是会去,但丢了电影票就未必了。虽然在经济学的角度上看,100元就是100元,是付罚单还是再买电影票并没有分别。

心理账户的另一层意义在于人对价值并不只看绝对值,也看比较值。10元商品折扣5元,跟100元商品折扣5元,前一个5元的分量往往高于后一个5元,那是五折vs九五折的差距嘛(这里假设你只需要一件商品,不是批量购买)。省钱如此,花钱也如此,比如一个美国人花了一大笔积蓄去欧洲旅游,其中在德国商店买了个数千美元的森海耳机,这个消费在他心里面,往往就没有平时在家直接订购这耳机来得「肉痛」,哪怕价格是一样的。因为耳机本身的价格跟旅游中其他高昂消费放在同一本帐上,心理负担也就冲淡了,平时不舍得买的,那时候也就买买买了。对了,为啥特别说明是美国人呢?因为我讲中国人的话,有人肯定要吐槽他是怕在国内买到假货啊。

这些理论能不能套用在其他非金钱消费,比如时间消费、感情消费上面?我觉得是可以的。至于怎么套用,不妨脑补一下。

vs2008编译boost

20 | 03 | 2015

【一、Boost库的介绍】

Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。

Boost库中比较有名的几个库:

(1)Regex,正则表达式库;

(2)Spirit,LL parser framework,用C++代码直接表达EBNF;

(3)Graph,图组件和算法;

(4)Lambda,在调用的地方定义短小匿名的函数对象,很实用的functional功能;

(5)concept check,检查泛型编程中的concept;

(6)Mpl,用模板实现的元编程框架;

(7)Thread,可移植的C++多线程库;

(8)Python,把C++类和函数映射到Python之中;

(9)Pool,内存池管理;

(10)smart_ptr,智能指针。

 

 

【二、Boost库的编译】

【Setp1 准备工作】:

(1)Boost 下载可以到官方网站下载:

http://www.boost.org/

 

(2)安装VS2008 IDE

 

 

【Setp2 编译Boost】

1.打开Visual Studio 2008 命令提示窗口

2.进入D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/boost_1_44_0/tools/jam/src

3.执行 build.bat 会在D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/boost_1_44_0

/tools/jam/src/bin.ntx86 生成 bjam.exe文件.

4.Copy bjam.exe 文件到 D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/boost_1_44_0 下

6.进入D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/boost_1_44_0 目录

7.执行bjam.exe 编译命令,如下:

 

 

(1)编译所有boost动态库 (release|debug),包括头文件和库文件

bjam –toolset=msvc-9.0 –prefix=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output –without-python –build-type=complete  link=shared  threading=multi install

 

(2)只编译 release 版本 regex 动态库,包括头文件和库文件

bjam –toolset=msvc-9.0 –prefix=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output1 –with-regex link=shared threading=multi variant=release runtime-link=shared  install

 

(3)只编译 release 版本 regex 动态库,包括库文件

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output2

–with-regex link=shared  threading=multi variant=release runtime-link=shared  stage

 

 

【注意】: Boost 源代码所在路径最好全英文,不要有空格、特殊字符、中文等

 

编译要花上30分钟左右(根据PC性能所定), 会在指定生成目录:

D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output下生成对应库文件和头文件。

 

8.设置开发环境

打开VS2008 创建工程, 配置工程属性

设置包含文件目录F:/Develop/BoostlibAndDll/include/boost-1_37/boost

设置引用文件目录:F:/Develop/BoostlibAndDll/lib

完成后,可以使用。

 

 

【三、介绍Bjam使用】

Usage:

Bjam  [options]  [properties]  [install|stage]

 

 

install                 Install  headers and compiled library files to the

=======               configured locations (below).

在“–prefix=”指定的目录下生成所有头文件

(boost源代码下boost文件夹下所有文件)和指定库文件

 

–prefix=<PREFIX>       Install architecture independent files here.

Default; C:/Boost on Win32

Default; /usr/local on Unix. Linux, etc.

 

–exec-prefix=<EPREFIX>  Install architecture dependent files here.

Default; <PREFIX>

 

–libdir=<DIR>          Install library files here.

Default; <EPREFIX>/lib

 

–includedir=<HDRDIR>   Install header files here.

Default; <PREFIX>/include

 

stage                 Build and install only compiled library files

======               to the stage directory.

在“–stagedir=”指定的目录下生成指定库文件

 

 

–stagedir=<STAGEDIR>   Install library files here

Default; ./stage

 

 

【Other Options】:

–build-type=<type>     Build the specified pre-defined set of variations

of the libraries. Note, that which variants get

built depends on what each library supports.

 

minimal (default) – Builds the single

“release” version of the libraries. This

release corresponds to specifying:

“release  <threading>multi  <link>shared

<link>static  <runtime-link>shared” as the

Build variant to build.

complete – Attempts to build all possible

variations.

 

–build-dir=DIR         Build in this location instead of building

within the distribution tree. Recommended!

 

–show-libraries        Displays the list of Boost libraries that require

build and installation steps, then exit.

 

–layout=<layout>       Determines whether to choose library names

and header locations such that multiple

versions of Boost or multiple compilers can

be used on the same system.

 

versioned (default) – Names of boost

binaries include the Boost version

number and the name and version of the

compiler. Boost headers are installed

in a subdirectory of <HDRDIR> whose

name contains the Boost version number.

 

system – Binaries names do not include

the Boost version number or the name

and version number of the compiler.

Boost headers are installed directly

into <HDRDIR>. This option is

intended for system integrators who

are building distribution packages.

 

–buildid=ID                    Adds the specified ID to the name of built

libraries. The default is to not add anything.

 

–help                     This message.

 

–with-<library>                Build and install the specified <library>

If this option is used, only libraries

specified using this option will be built.

 

–without-<library>              Do not build, stage, or install the specified

<library>. By default, all libraries are built.

 

 

【Properties】:

toolset=toolset            Indicates the toolset to build with.

msvc-6.0 :  VC6.0

msvc-7.0:  VS2003

msvc-8.0:  VS2005

msvc-9.0:  VS2008

msvc-10.0:  VS2010

 

variant=debug|release      Select the build variant

 

link=static|shared          Whether to build static or shared libraries

 

threading=single|multi      Whether to build single or multithreaded binaries

 

runtime-link=static|shared   Whether to link to static or shared C and C++ runtime.

决定是静态还是动态链接C/C++标准库

 

 

Bjam 选项、参数说明
–build-dir=<builddir> 编译的临时文件会放在builddir里(编译完就可以把它删除了)
–stagedir=<stagedir> 存放编译后库文件的路径,默认是stage
–build-type=complete 编译所有版本,不然只会编译一小部分版本(相当于:
variant=release,threading=multi;
link=shared|static;runtime-link=shared)
variant=debug|release 决定编译什么版本(Debug or Release)
link=static|shared 决定使用静态库还是动态库
threading=single|multi 决定使用单线程还是多线程库
runtime-link=static|shared 决定是静态还是动态链接C/C++标准库
–with-<library> 只编译指定的库,如输入–with-regex就只编译regex库了
–show-libraries 显示需要编译的库名称

 

 

 

【四、Bjam 生成文件的分析】

 

(1)生成 Release 版本,多线程,动态链接C++标准库 的regex 动态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output2

–with-regex   link=shared  threading=multi  variant=release  runtime-link=shared  stage

 

— 输出: boost_regex-vc90-mt.lib

boost_regex-vc90-mt-1_44.lib

boost_regex-vc90-mt-1_44.dll

 

 

(2)生成 Release 版本,多线程,静态链接C++标准库 的regex 动态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output2

–with-regex   link=shared  threading=multi  variant=release  runtime-link= static  stage

 

— 输出: 没有这种配置

 

 

(3)生成 Release 版本,多线程,动态链接C++标准库 的regex静态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output2

–with-regex   link= static  threading=multi  variant=release  runtime-link=shared  stage

 

— 输出: libboost_regex-vc90-mt-s.lib

libboost_regex-vc90-mt-1_44.lib

 

 

 

(4)生成 Release 版本,多线程,静态链接C++标准库 的regex 静态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output3

–with-regex  link=static  threading=multi  variant=release  runtime-link=static  stage

 

— 输出:libboost_regex-vc90-mt-s.lib

libboost_regex-vc90-mt-s-1_44.lib

 

 

 

——————————————————————————————————————–

 

(1)生成 Debug 版本,多线程,动态链接C++标准库 的regex 静态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output4

–with-regex  link=static  threading=multi  variant=debug runtime-link=shared  stage

 

— 输出: libboost_regex-vc90-mt-gd.lib

libboost_regex-vc90-mt-gd-1_44.lib

 

 

 

(2)生成 Debug 版本,多线程,静态链接C++标准库 的regex 静态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output5

–with-regex   link=static  threading=multi  variant=debug  runtime-link=static  stage

 

— 输出: libboost_regex-vc90-mt-sgd.lib

libboost_regex-vc90-mt-sgd-1_44.lib

 

 

(3)生成 Debug 版本,多线程,动态链接C++标准库 的regex 动态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output5

–with-regex   link=shared  threading=multi  variant=debug  runtime-link=shared  stage

 

– 输出: boost_regex-vc90-mt-gd.lib

boost_regex-vc90-mt-gd-1_44.lib

boost_regex-vc90-mt-gd-1_44.dll

 

 

(4)生成 Debug 版本,多线程,静态链接C++标准库 的regex动态库

bjam –toolset=msvc-9.0

–stagedir=D:/05_Computer/04_3rdPatry/02Boost/boost_1_44_0/output5

–with-regex   link=shared  threading=multi  variant=debug  runtime-link=static  stage

 

— 输出:没有这种配置

 

 

【总结】:

(1)       编译成功后,Bjam 都会给你生成一对一样的导入库文件或者静态库文件(如下),

唯一不同的是两个文件名称一个在后面加上了boost版本信息, 为了让用户知道使用的boost的版本信息。

 

boost_regex-vc90-xxxxx.lib

boost_regex-vc90-xxxxx-1_44.lib

 

(2)       Bjam编译选项 有4个, 理论上应该有 2*2*2*2 = 16 种配置

ink= static| shared

threading= single |multi

variant=release|debug

runtime-link= static |shared

 

实际使用的多为多线程, 所以 threading= multi, 这样剩下的3个选项组成的编译配置就是上面所罗列的, 其中静态链接C++标准库的boost动态库这种配置也不存在, 所以就只有4种情况。

 

(3)

link= static : 静态库。 生成的库文件名称以 “lib”开头

link= shared : 动态库。生成的库文件名称无“lib”开头

 

threading= mult : 支持多线程。 生成的库文件名称中包含 “-mt”

 

variant=release  生成的库文件名称不包含 “-gd”

variant= debug  生成的库文件名称包含 “-gd”

 

runtime-link= static  生成的库文件名称包含 “-s”

runtime-link= shared  生成的库文件名称不包含 “-s”

VIM按键大全

12 | 03 | 2015

很久以前,我是一个VS程序员,后来,我把VS的很多按键改成了Emacs的按键,成了一个伪Emacs程序员,现在,开始装置为伪Vim程序员。

命令历史

以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。

启动vim

在命令行窗口中输入以下命令即可

vim 直接启动vim

vim filename 打开vim并创建名为filename的文件

文件命令

打开单个文件

vim file

同时打开多个文件

vim file1 file2 file3 …

在vim窗口中打开一个新文件

:open file

在新窗口中打开文件

:split file

切换到下一个文件

:bn

切换到上一个文件

:bp

查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。

:args

打开远程文件,比如ftp或者share folder

:e ftp://192.168.10.76/abc.txt

:e \\qadrive\test\1.txt

vim的模式

正常模式(按Esc或Ctrl+[进入) 左下角显示文件名或为空
插入模式(按i键进入) 左下角显示–INSERT–
可视模式(不知道如何进入) 左下角显示–VISUAL–

导航命令

% 括号匹配

插入命令

i 在当前位置生前插入

I 在当前行首插入

a 在当前位置后插入

A 在当前行尾插入

o 在当前行之后插入一行

O 在当前行之前插入一行

查找命令

/text  查找text,按n健查找下一个,按N健查找前一个。

?text  查找text,反向查找,按n健查找下一个,按N健查找前一个。

vim中有一些特殊字符在查找时需要转义  .*[]^%/?~$

:set ignorecase  忽略大小写的查找

:set noignorecase  不忽略大小写的查找

查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。

:set hlsearch  高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。

:set nohlsearch  关闭高亮搜索显示

:nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。

:set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。

:set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。

替换命令

ra 将当前字符替换为a,当期字符即光标所在字符。

s/old/new/ 用old替换new,替换当前行的第一个匹配

s/old/new/g 用old替换new,替换当前行的所有匹配

%s/old/new/ 用old替换new,替换所有行的第一个匹配

%s/old/new/g 用old替换new,替换整个文件的所有匹配

:10,20 s/^/    /g 在第10行知第20行每行前面加四个空格,用于缩进。

ddp 交换光标所在行和其下紧邻的一行。

移动命令

h 左移一个字符
l 右移一个字符,这个命令很少用,一般用w代替。
k 上移一个字符
j 下移一个字符
以上四个命令可以配合数字使用,比如20j就是向下移动20行,5h就是向左移动5个字符,在Vim中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!<Esc>,这里的Esc是必须的,否则命令不生效。

w 向前移动一个单词(光标停在单词首部),如果已到行尾,则转至下一行行首。此命令快,可以代替l命令。

b 向后移动一个单词 2b 向后移动2个单词

e,同w,只不过是光标停在单词尾部

ge,同b,光标停在单词尾部。

^ 移动到本行第一个非空白字符上。

0(数字0)移动到本行第一个字符上,

<HOME> 移动到本行第一个字符。同0健。

$ 移动到行尾 3$ 移动到下面3行的行尾

gg 移动到文件头。 = [[

G(shift + g) 移动到文件尾。 = ]]

f(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符。

F 同f,反向查找。

跳到指定行,冒号+行号,回车,比如跳到240行就是 :240回车。另一个方法是行号+G,比如230G跳到230行。

Ctrl + e 向下滚动一行

Ctrl + y 向上滚动一行

Ctrl + d 向下滚动半屏

Ctrl + u 向上滚动半屏

Ctrl + f 向下滚动一屏

Ctrl + b 向上滚动一屏

撤销和重做

u 撤销(Undo)
U 撤销对整行的操作
Ctrl + r 重做(Redo),即撤销的撤销。

删除命令

x 删除当前字符

3x 删除当前光标开始向后三个字符

X 删除当前字符的前一个字符。X=dh

dl 删除当前字符, dl=x

dh 删除前一个字符

dd 删除当前行

dj 删除上一行

dk 删除下一行

10d 删除当前行开始的10行。

D 删除当前字符至行尾。D=d$

d$ 删除当前字符之后的所有字符(本行)

kdgg 删除当前行之前所有行(不包括当前行)

jdG(jd shift + g)   删除当前行之后所有行(不包括当前行)

:1,10d 删除1-10行

:11,$d 删除11行及以后所有的行

:1,$d 删除所有行

J(shift + j)  删除两行之间的空行,实际上是合并两行。

拷贝和粘贴

yy 拷贝当前行

nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。

p  在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。

shift+p 在当前行前粘贴

:1,10 co 20 将1-10行插入到第20行之后。

:1,$ co $ 将整个文件复制一份并添加到文件尾部。

正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制

ddp交换当前行和其下一行

xp交换当前字符和其后一个字符

剪切命令

正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切

ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴

:1,10d 将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。

:1, 10 m 20 将第1-10行移动到第20行之后。

退出命令

:wq 保存并退出

ZZ 保存并退出

:q! 强制退出并忽略所有更改

:e! 放弃所有修改,并打开原来文件。

窗口命令

:split或new 打开一个新窗口,光标停在顶层的窗口上

:split file或:new file 用新窗口打开文件

split打开的窗口都是横向的,使用vsplit可以纵向打开窗口。

Ctrl+ww 移动到下一个窗口

Ctrl+wj 移动到下方的窗口

Ctrl+wk 移动到上方的窗口

关闭窗口

:close 最后一个窗口不能使用此命令,可以防止意外退出vim。

:q 如果是最后一个被关闭的窗口,那么将退出vim。

ZZ 保存并退出。

关闭所有窗口,只保留当前窗口

:only

录制宏

按q键加任意字母开始录制,再按q键结束录制(这意味着vim中的宏不可嵌套),使用的时候@加宏名,比如qa。。。q录制名为a的宏,@a使用这个宏。

执行shell命令

:!command

:!ls 列出当前目录下文件

:!perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。

:!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。

:suspend或Ctrl – Z 挂起vim,回到shell,按fg可以返回vim。

注释命令

perl程序中#开始的行为注释,所以要注释某些行,只需在行首加入#

3,5 s/^/#/g 注释第3-5行

3,5 s/^#//g 解除3-5行的注释

1,$ s/^/#/g 注释整个文档。

:%s/^/#/g 注释整个文档,此法更快。

帮助命令

:help or F1 显示整个帮助
:help xxx 显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。
:help ‘number’ Vim选项的帮助用单引号括起
:help <Esc> 特殊键的帮助用<>扩起
:help -t Vim启动参数的帮助用-
:help i_<Esc> 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式
帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回

其他非编辑命令

. 重复前一次命令

:set ruler?  查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看

:scriptnames  查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等。

:set list 显示非打印字符,如tab,空格,行尾等。如果tab无法显示,请确定用set lcs=tab:>-命令设置了.vimrc文件,并确保你的文件中的确有tab,如果开启了expendtab,那么tab将被扩展为空格。

Vim教程
在Unix系统上
$ vimtutor
在Windows系统上
:help tutor

:syntax 列出已经定义的语法项
:syntax clear 清除已定义的语法规则
:syntax case match 大小写敏感,int和Int将视为不同的语法元素
:syntax case ignore 大小写无关,int和Int将视为相同的语法元素,并使用同样的配色方案

[一种声音]学了13年环境,试解析柴静雾霾纪录片

03 | 03 | 2015
本文欢迎转载,仅需保留原始链接。如果在您的专业领域,发现本文有表述错误的地方,欢迎给我的微博发私信指正。

看到柴静的雾霾调查《穹顶之下》非常激动。七年前我选择了以PM2.5暴露模拟为博士课题,后来又在美国南加州(洛杉矶一带)从事了两年空气质量与人体健康的环境咨询工作。对照发达国家经验,对中国的雾霾问题有着深深的怨念。柴静作为一个新闻人,把几个关键问题都找出来并说清楚了,在科学事实上没有明显的错误,这真的不是一件容易的事。更不容易的是她采访到了许多当事人,触动了长期以来敏感的话题;最重要的是可能她让许多人第一次认识到,雾霾不仅和自己息息相关,而且自己是可以推动改变的力量。这部片子必将载入史册。


吹捧过了,也吹毛求疵一下,以期作为补充。毕竟100分钟的视频没有可能把所有问题都讲得让所有人理解和满意。有三点:

  • 有些更敏感的问题,这个视频上其实没提。
  • 提出的一些解决办法,其弊病只是三言两语带过。然而既然引发了讨论,就不能停留在表面。
  • 所涉及的解决方案实际上很传统,都是发达国家几十年前就开始采用的。中国和印度这两个发展中大国,人口几乎占世界40%,大约是世界其他发达国家总人口的3倍。我疑心,沿袭传统解决路径是会撞墙的。特别是,中国的环境问题远远不止雾霾。我们能不能借鉴一点新办法,避免走传统途径的弯路?

接下来结合她的主要观点说说自己的看法,另外结合最近看到的资料提供一些新的思路。


首先:雾霾真的很毒。对于雾霾,不存在“适应性”问题。这句话我再重复一遍:对于雾霾,不存在“适应性”问题。吸得越多,危害越大,特别是对小孩子。柴静视频中关于PM2.5的化学成分分析非常专业,健康危害的动画短片近乎完美。唯一的问题是,PM2.5的健康危害,除了影响呼吸道和肺功能,更为公认的是心血管疾病。公众更关注肺部疾病和肺癌容易理解,但是别忽略PM2.5对心血管的影响。如果家有老人或家族内有人有心血管疾病史,对雾霾天需要有更多关注。


而谈到重现APEC蓝需要减少一半排放的问题,我们不该忘记,这个一半只是以我国的“蓝天”标准而定的,并不意味着只要减少一半就能实现民众健康的需要。2013年,欧洲一项涉及九个国家31万人的研究表明,PM10与肺癌的相关性显著,PM10和PM2.5与肺腺癌的相关性显著。每提高10微克/立方米的PM10浓度,肺癌发病率上升22%。http://www.ncbi.nlm.nih.gov/pubmed/23849838.肺癌已经如此,其他相关疾病呢?慢性疾病给人带来的终身痛苦又该如何计算呢?


(随手搜个数据作比较:2014年,北京PM10的年均值是115.8微克/立方米:http://health.people.com.cn/n/2015/0105/c14739-26323653.html)


那么,我们该怎么办?这部片子中给出了一些方法和思路。总的来说有这么几项:提高标准,严格执法,对垄断的能源行业开放市场竞争。而它也难得地明确了这么做的阻力和要付出的代价。在以往的报导中,我们总是看到说“很难”,但是难在哪里?利益相关方如何思考这些问题?别的国家如何能做到?柴静以贴近大众的方式做了呈现。几个主要的论点是:

  • 论点一:导致雾霾的燃煤中,劣质煤占了很大成分,劣质煤被用在过剩产能上,形成的是浪费,但是却一直接受国家财政输血。对劣质煤的监管不力来自于对影响就业的担忧。环保部门没有否决的权力。

如果要淘汰这些产能,结果会是什么呢?一是原先的煤矿工人会失业,二是成本要提高(洗煤或是控制排放)。片中有三个人为“淘汰产能”的合理性说了话:英国的煤矿工人认为,自己重新找工作就行了,没有这份工还有其他的。英国的能源大臣表示,环保不是负担,环保会催动创新,让新产业淘汰旧产业。发改委副部长则认为,以绿色低碳倒逼产业转型是出路。清洁产业也能吸纳就业。


我们也不该忘记,环保需要付出代价,不环保同样有代价,甚至代价更大。该片对“环保是奢侈品”的概念发出了挑战。事实上,长期生活在高污染地区的底层劳动者,才是污染的最大受害者。肺癌村的环境难民,从小看不到蓝天的小姑娘,都在承受着沉重的代价。而千千万万的城市居民,无论是看不见西山的北京人,还是看不真西湖的杭州人,已经在漫天雾霾中,呼吸了至少十年。人们需要工作,也需要健康,需要自在地生活。


在“环境污染是经济发展所必须付出的代价”这一观念甚嚣尘上的今天,这种声音非常难得。然而,我认为视频中的这些观点说服力还有欠缺。“失业了重新找份工作就好”,实在有点何不食肉糜的感觉。也许我们更应该问的是:如果造成工人失业,我们如何帮他们重新找到工作?如果倒逼企业转型,利益又将如何分配?造成的能源和资源价格提升又将由谁承担?我们必须以科学的态度回答这些问题,而不是以盲目的乐观搪塞,更不能以“难以回答”为借口,拒绝讨论。


片中为了拒绝煤炭而采用“油气时代”的提法,更令我有些诧异。片中已经说明,煤炭经过清洁化可以减少污染物排放,并不需要完全否定。燃油并非清洁能源;天然气虽然较为清洁,但是燃烧过程中照样会产生氮氧化物(PM2.5前体物)。更不用说他们都是化石能源,既不可再生,又不低碳。视油气为未来,有点自相矛盾。有可能只是把污染从一个区域转移到另一个区域……正因如此,全世界都在呼唤对能源的节约,能效的提高,以及更清洁的替代能源。我们真的必须重走油气时代的老路吗?

  • 论点二:燃油品质是导致车辆污染物排放标准迟迟无法提高的限制因素。而无法提高油品则是由于利益集团掌握了标准制定的权力。发达国家的燃油品质标准由环保部门制定,但中国标准制定中,环保部门缺少专业人员。允许各利益相关方进行协商,将相关信息公开,是本片提出的解决油品之道。片中还提出,应当放开能源市场,允许民营天然气进入市场竞争。

油品确实需要提高。但是将市场作为解决问题的捷径,则为不择手段的竞争留下了一扇后门。在片中我们屡屡看到监管不力造成的环保困局,又怎能保证,天然气的开采和运输,不会因此产生新的环境污染?这种污染可能不如雾霾那么近在眼前,却不会凭空消失。水电是一项早就允许民营投资的能源产业,但是不同于一般人所想象的“清洁能源”,其带来的环境和生态问题颇为严重。相关报道连篇累牍,这里不予展开。以市场竞争促进创新,把环保作为创新的动力,这是我们的美好愿望,也并非不可实现。但,要令它成为现实,除了去掉垄断保护的枷锁,更需培育生长的土壤。


为什么发达国家放开市场没有导致这样的问题?他们的环保部门为何具有极大的权力?爱荷华州立大学周江评老师的这篇文章很好地回答了这个问题:周江评:洛杉矶的治霾经验。在这里面,公众的参与权和知情权,NGO的参与,环境诉讼的威力,都是极为关键的。在我国的语境下,却有些水土不服。或者,从今天开始,我们可以改造水土……


关于机动车,轮船,飞机带来的污染,柴静的报告都试图涉及,却未曾明确指出:交通和消费需求才是驱动这一切经济活动的内在因素。很难说这是一种取舍还是一种忽视。唯一谈到的是减少开车次数,短距离不用车。其实,我们即使不自己开车,也难免由于所购买的商品在运输中的交通需求,给污染带来贡献。在轮船和飞机运输的货物中,有我们的海淘代购,也有从世界各地进口的原料。你,意识到了吗?


而片中谈到个人对污染行为所能做的,似乎只能是不断的举报。这种结果,不能怪柴静和她身后的制作团队。我却不愿意停留在这一层面。

雾霾治理只是中国环境问题的缩影。我们羡慕发达国家的蓝天白云,但是他们同样在被环境问题所困扰。要让经济绿色化,除了传统上的监管和污染控制,他们还有更多值得参考的办法。


接下来的阐述,主要思路参考瑞典Lund大学的Greening theEconomy课程资料。如何使经济发展绿色化,而不是演出猫捉老鼠的低效内耗,你死我活的零和游戏?这门课程以丹麦、瑞典、挪威的绿色经济之路,为其他国家提供启示。确实,北欧有自然资源丰富,人口密度小,人均收入高的优势;而且他们也确实进行了一定的污染转嫁。但每个国家都有其自身的特征,牌发完了抱怨别人牌好是没用的,把自己手上的牌打好才是正经。这些方法能否在中国奏效?答案需要靠每个人共同塑造。我能做的只是通过告诉更多的人,希望引发讨论和改变。


个人层面:商品购买、交通出行、家庭能耗构成了个人对环境影响的主要部分。

  • 如前所述,商品购买中的运输能耗和尾气排放,同样对雾霾有所贡献。而商品制造过程及其原料供应链,都在对环境产生影响。家庭电器的持续能源消耗更难以忽视。在欧洲,许多商品都有绿色标识(Ecolabel),帮助消费者进行绿色选择。消费者选择进一步影响商品制造者注重环保。

    中国有绿色标识吗?其实有的。但是你会注意吗?我想也许很少。我没有深入研究无法为任何绿色标识背书,不过起码有一种标识是国家强制的,那就是能效标识,详见官方网站:中国能效标识网
    遗憾的是,如同柴静视频中的机动车排放标识一样,中国的能效标识还存在造假现象。欧洲和美国的绿色标识都是由NGO发起的,而NGO通过公信力发展自身,倾向于站在消费者这边。关键在于,消费者自己得去在意,得去用钞票投票,得去关注和了解相关标识。从另一个角度来说,教育消费者了解相关知识,监督相关部门履责,也是媒体、专家、政府、社会组织都可以去做的

  • 若是你嫌绿色商品价格高,还有一种选择:就是不买那么多东西。人们购买商品的动力深受消费主义的影响:我们认为消费会带来快乐,认为商品会提升我们的社会形象。然而越来越多的研究表明,人的整体幸福感在收入达到一定程度后不再随着收入上升而升高,与家人、朋友、社区共享的快乐才带来更深刻的幸福感。

  • 共享消费也是一种提高资源利用率的解决办法,比如共享用车。随着信息流动的便捷,这方面我们未来势必会看到更多的解决方案,在经济上也更划算。更难的也许是观念上从“拥有”到“共享”的转变。观念的转变,依赖于有影响力的先行者的带动,依赖于社会对环境的重视,依赖于每一个人,对这种现象的支持

国家层面:除了制定排放标准并实行监管,政府其实还有许多办法可用。令我在意的是,至少在美国,国家的各种政策在实施前会进行经济上的成本-收益分析并将结果公示。这一点对于环境问题尤为重要。因为环境方面的收益是隐性的,长期的,覆盖全社会的,更不容易看到直观效果。也正因为没有相应的分析,我们有时往往注意不到环境政策对经济的正面作用,将环保支出视作负担。


欧洲国家的政策有这些值得注意的地方:

  • 政府采购。欧洲发达国家政府将环保作为政府采购的要求之一,尽管欧盟不允许在国家政策中规定具体的绿色标识,以免造成对特定组织的偏袒,但是计划制定一系列原则,来协助各国在政府采购中考虑到可持续发展。
  • Deposit-RefundSystem(DRS)。购买消费品时先交容器(如酒瓶)费用,用完后交还商家。国家层面实行这一政策能够大幅提高回收率。你可能觉得酒瓶而已,有那么重要吗?其实玻璃生产是能源消耗大户:”据玻璃包装协会统计,回收一个玻璃瓶节省的能量,可以让一个100瓦的灯泡点亮4个小时,可以让一台电脑运行30分钟,可以收看20分钟的电视节目。” (玻璃瓶回收体系亟待建立玻璃瓶回收体系亟待建立)
  • 国家强制要求采用节能灯具。你知道吗?中国照明用电占所有用电量13%。欧盟通过使用节能灯,每年节约400亿度电。目前中国已有淘汰白炽灯路线图(国内照明用电节电潜力达480亿千瓦时 )。
  • 经济激励。这点我们在其他经济活动中并不陌生,现在是时候把他们用到环保上了!环境问题的形成源于污染的外部性未能市场化。政府对此进行的调节有利于释放正确的市场信号,例如对高排放车辆征收碳税或生态税,对电动车等予以税费减免甚至经济补贴。然而,环境经济政策的实施效果在实践中会引发一系列连锁效应;而单纯的经济激励如果不辅以监管和充分的信息提供,则未必能达到预想的效果。此外经济激励必须考虑实际中的公平,而不仅仅是对环境水平的提升促进。

让所有人都满意的公共政策很罕见。如果你不介入改变,就是在等待其他人来改变你。个人如何影响国家政策制定?这个问题有点超出我回答的能力。希望两会的开场,能让大家往这个方向多思考一些。

企业层面

我们所关注的就业和经济发展,最终大部分还是靠企业解决。而企业相对于个人有更多资源,相对国家有更大灵活性,是创新的主要力量。关于传统环境领域的企业发展所带来的工作机会这里就不多说,毕竟整体市场规模还不大。斯堪的纳维亚国家提出的企业层面可持续发展趋势是什么呢?

  • 首先,针对消费者日益增长的环保意识,企业不仅得考虑“环保需要我付出什么”,更要考虑“不环保我是否能承担得起后果”。企业若能利用好环境需求,则能变成本为机遇,创造自己独特的价值和竞争力。环境污染的产生本来就是由于未能成为产品的资源被废弃。如果能增加资源利用效率,则可以在环保的同时增加收益。为此需要进行技术上的创新投入。
  • 租赁而非售卖也日渐成为消费者愿意接受的商业模式,这能够促进货品的循环使用,也鼓励生产有更长生命周期的高质量货品。
  • 绿色供应链:发达国家的消费者和NGO都开始注意供应链所牵涉的环境和社会问题,例如原料生产和运输中的污染,对工人的环境健康是否重视,给不发达地区的供应商提供的价格是否合理。企业的供应链是否绿色,也通过绿色标识和NGO调查报告的方式进入了公众视野。即使中国消费者对绿色供应链还没有那么大关注,作为制造业大国、出口大国,中国的企业也必须审视自己的环境标准是否符合发达国家的环境意识需要。
  • 绿色营销:企业可以加强对绿色标识的宣传,和绿色标识组织一起对公众进行教育,增加自己的品牌竞争力。当然,消费者选择是一个错综复杂的过程,这种改变不会一帆风顺,需要小步走,制定最符合自己的策略。
  • 绿色过程:在企业的运营、制造、工业流程设计中考虑环保和高效。
  • 电子物资和远程办公:通过提供数字化产品而不是实物产品,既满足某种消费者需求,又不必消耗大量物质资源。在办公过程中使用远程和虚拟的工具,减少出差开支和上下班交通,也可以在降低企业运营成本的同时减少环境影响。

关于企业在绿色经济中的作用,还有太多可能性。看到这里,你还觉得环保和经济发展非此即彼吗?


城市层面:我们所生活的城市,和我们能呼吸到怎样的空气最为相关。所能采取的办法,和其自身的城市特点有很大关联。欧洲的经验主要有这么几点:

  • 能源供应:城市的能源选择和能源管理,影响着能源的价格,左右着能源的利用效率。
  • 城市基础设施建设和规划:我们在谈到城市管理对人们出行的影响时,不仅仅是在说公共交通的便利程度,也是在说城市的布局。在欧洲,城市规划中经常需要听取公众意见和各行各业的看法,长期讨论。因为城市的建设一旦确立,将会影响未来数十年或是更久。
  • 可持续发展社区:社区成员使用可再生能源发电自给自足,共同协商确定环境友好的生活方式。
  • 绿色生活方式:城市鼓励绿色的生活方式,例如提供公共自行车,便利的废品回收地点,方便的户外活动地点等等。(如果走路10分钟就有绿地公园,或许周末自驾出游的人,会减少许多)

城市规划和建设这一块我了解不多,有待专业人士补充。

写了两天,终于大致更新完毕。虽然学识有限,难免错漏,只愿有那么几点会触动你;无论是关注,是行动,是传播,都是当下所需要的力量。这已经是篇长文,但,请让讨论从这里开始,而不是到这里结束。

本文欢迎转载,仅需保留原始链接。

 

来源:刘虓震

链接:http://weibo.com/p/2304186207f5e70102vk6v

 


【转】必胜客贵吗– 转自知乎,知乎真的是一个很神奇的地方

06 | 02 | 2015

你去上海上大学之前你不知道披萨是什么,大学期间,一个长辈的上海朋友来看你,带着你和他的女儿去吃必胜客。

对于一个乡下小伙子来说,同龄的那个上海女生简直是女神一样的存在,你本就有些不自在,再加上还要去一个用刀叉吃饭的地方,你就更加的局促不安了。

记得那时的必胜客还有按盘算的沙拉,就是一人一个盘子,可以装一次,装多少都一个价钱。你就傻傻一样挑几片,然后回头一看那个女生,沙拉的高度几乎遮住她的脸!你不由自主的说好厉害,她笑着回答你说这个是有技巧的,哪些水果放哪一层,怎么搭结构巴拉巴拉,似乎在她们的圈子里,沙拉堆的越高的女生,意味着荣耀和胜利。

对那时候的你而言,必胜客不仅仅是一个很贵的吃“西餐”的地方,更意味着一个不同的世界,让你望而却步的世界。

说实话哪怕家境不好,吃个把月泡面也还是可以去一次必胜客的,但是你就是单纯的不敢去,似乎是怕自己的土气暴露给了全世界,你不知道咖啡原来还分种类(不是都叫雀巢),你也不知道端上来的意大利面是不是没煮熟(咬着硬邦邦的),更别说牛排还要告诉别人几分熟这种高难度的事情了!

恐怖的必胜客,不仅仅贵,更把你无情的拒之门外。为什么要去吃必胜客,湖南餐馆 12 块的盖浇饭根本就是人间美味,还可以送餐到寝室,为什么要去吃必胜客!万恶的资本主义!

然而,城市终于还是改变了你,由不得你。别人拿着最新的 N73 看无间道的时候,你也拼了命的想存点钱买一个 K750C 跨入智能机的行列,别人拿着 MacBook 打 wow 的时候你也想要一个 256M 显卡的笔记本,别人带着妹子在南京西路买买买的时候,你也想去正大广场给女朋友买双英文名字的鞋(妈蛋,后来才知道英文名字的都 TM 的是东莞产的)。

你会遇到一个心仪的女孩子,浑身散发着淡淡的香水味,讲话轻声细语,掩着嘴巴笑起来的眼睛好动人,她半开玩笑的说,怎么不是要请我吃饭吗?吃什么呀?

你突然意识到,湖南餐馆的小板凳连个靠背都没有,大热天也没空调,辣椒放这么多,菜这么咸,旁边桌挤过来的胖子哥一身汗臭味,和眼前人格格不入。

必胜客怎么样,你仿佛一瞬间找到了救星。对,必胜客很好,贵?老子赚点钱这时候不用他妈的什么时候用?

“必胜客啊,可我昨天刚吃过诶。”女生说。

你慌了吧,恨自己为什么不多记住几个名字,那个什么上鸟咖啡,还有那个什么爬爬琼斯,你一时想不起来,愣住了。

她冲你潇洒的一挥手,不介意的话,陪我吃沙县拌面吧,我知道一家花生酱特别浓的。

你 2 了,脱口而出,你也吃沙县拌面吗?

她不假思索的说,是啊,我超喜欢的,不过好久没吃了。

你们旁边桌的大哥袒露着上半身拿鸭脖子下酒,你点了沙县套餐(拌面 + 蒸饺),她则点了拌面和云吞,她认真的对你说,拌面和蒸饺也是不错,但是拌面比较干,配云吞会好。

吃着吃着,你忍不住问了一个很傻的问题,必胜客的沙拉,你是不是可以堆很高啊?

必胜客早就没有自助沙拉了,披萨也越来越不好吃了呢。

是吗,原来必胜客早就没有自助沙拉了啊!原来必胜客早就没有自助沙拉了啊!

你仿佛下定了决心,很认真的对女生说,下次陪我去吃必胜客吧!

干嘛啦,早知道你那么喜欢吃披萨刚才就答应你去吃了。

“不,我不是去吃披萨的,我是去征服他的。”这句话你没说出口,低头吸掉了碗里的面条。

Cheat Engine 教程通关篇

04 | 02 | 2015

最近闲来无事,又准备重新拾起来曾经丢下的Cheat Engine教程了,然后发现N年没见,更新到6.4版本了,再重新拾起来练练手吧

【转】为什么我们那么害怕死亡?怎样才能坦然面对死亡?

04 | 02 | 2015

为什么我们那么害怕死亡?

没有任何一个人能够不被存在的内含悲剧所影响。

大多数时候,对于死亡的焦虑潜伏在无意识中,当一些事件发生的时候,提醒我们,它才会冲破思想的禁忌,萦绕人的脑海,带来挥之不去的焦虑与恐惧。

这些事件包括但不限于:见证身边的人伤逝,校友重聚,重大的周年纪念,生日,哀伤之梦,一段关系的结束等。

这些事件有一个共同的特点,它们都是一个阶段结束的见证,它们提醒着我们,一切都会过去,一切都有结束。

怎样才能坦然面对死亡? 我给你五个锦囊。

一、

存在主义心理学家欧文亚隆有一句话:虽然肉体上的死亡可以摧毁我们,但是对于死亡的观念可能会拯救我们。

因为,我们从对于死亡的认知而来的所有焦虑,其实都是非理性的。

你问,我们如何坦然面对死亡。可是,我们每个人其实都不用面对死亡。

我们担心死亡,大多数是在担心死亡会有怎样的滋味,如你所说「真的很害怕突然之间失去一些感觉,失去思考问题的能力」。但当你死时,却并无知觉意识,你并不用去面对「失去一些感觉,失去思考问题的能力」,因为这样的你,并不存在。因此,我们每个人并不用面对自己的死亡。

就如海德格尔所说:「死在,我就不在;我在,死就不在」。

二、

当然,这种形而上的思考似乎不能解决问题。那么我们来一次尼采在《查拉图斯特拉如是说》中提出的思想实验。这个实验操作性还不错,当大家看到这些文字的时候,就可以追随我一起来做(我略作修改,以符合我们大家的阅读习惯):

前些年穿越剧十分火热的时候,有一部 50 集大片,叫《神话》,大家跟我一起回顾其中剧情。男主角易小川(胡歌饰)穿越到 2000 年前,爱上了玉漱公主(白冰饰),种种原因,他们获得了长生不老的能力,却被迫分离。两人苦苦生活等待了 2000 年,到了现代才终于团聚,却因此失去了长生不老的能力,迅速衰老。

现在跟我一起想象,你成为了易小川,不过你没那么帅,你还是你现在的模样(照一照镜子,我说真的),现在的智商(想想期末考试的成绩),现在的赘肉和零武功(再照一照镜子)。你也没有爱上一个白富美(例如,范冰冰,嗯,你应该不会爱上她,我说的是爱情的那种。),你知道你高攀不上,所以审美也和现在一样(中学的同桌,大学学生会的学妹,单位里新来的妹纸。嗯,就是这种。)。你唯一拥有的,是易小川那长生不老的能力。你的生命从此没有了终点。

你的生活就是目前所过的和往昔所过的生活。将来仍将不断重演,没有任何新鲜之处。每一样痛苦、欢乐、离愁、叹息,日复一日,永不停息。你现在每天生活中的大大小小无法言传的事情皆会再度重现,而所有的结局也都一样——同样的鲜红朝阳、同样的风中匆忙的街边烧饼作为早餐、同样喋喋不休的老板或同事、同样的又卡又破的笔记本电脑、同样的思维停滞写不出好代码的星期一、同样的末班公交车、同样的睡到中午的周末。那存在的永恒沙漏不停转动。你不会死亡,这样的日子没有终点。

怎么样?假设你将重复同样的生活直至永远,没有尽头。这依旧让人震撼,让人恐惧。不是吗?我们对于死亡的恐惧里很核心的一个要素也是,这种状态持续的时间是无限的。我们恐惧的是这种无限。一切有终点的事物,不论多么糟糕透顶,似乎都不能让人产生无边无尽的恐惧。

所以,我们似乎恐惧的并不是死亡这件事情本身。

托尔斯泰在其小说《伊凡伊里奇之死》中讲述,伊凡伊里奇是一个品性卑劣的地主,在痛苦中面临死亡,但是在生命结束之前,他突然意识到他的死亡是如此糟糕,正是因为他一直生活得如此糟糕。

这给我们以最大的启示是:学会很好地生活就是学习如何能够很好地死去。

三、

「我每天都拼命地在工作和学习,努力尝试忘掉这个问题」

题主,你每天都在拼命工作和学习,但是这种努力和拼命背后的动机却是去逃避去忘记这个问题。

你把不断的工作和学习当做酒精来麻痹自己,你恐惧死亡的债务,结果拒绝生命的借贷。你因恐惧死亡,因而不敢进入生命。就像你害怕会用完你的生命似的。

别如此胆小好嘛,去热爱你的生活吧,去做你爱做的事情,把自己沉浸在生活的河流之中,去感受生活中的悲欢离合、酸甜苦辣,去泡妹纸、去开公司、去巴厘岛度假、去上周末的兴趣班、去交有趣的朋友、去谈让你血脉偾张的恋爱。一切你觉得有意义的事情,就去做它。

不要问我生命的意义是什么,它并不能教导,一个人必须把自己完全沉浸在生活的河流之中,这样的问题就不复存在了。

四、

你想,在我们出生之前,已经有很多很多年,多到数不清楚,在我们死后也会有很多很多年,多到数不清楚。因此,我们把自己的生命想象成一团耀眼的火化,它夹在前后两大团黑暗中间:在我们出生之前的黑暗和再我们死后的黑暗。可是我们多么恐惧后面那团黑暗,而对前面那团黑暗毫不在意。

伊壁鸠鲁曾提出,我们死后「不存在」的状态和出生之前一样。去想象我们生前和死后并无区别,去试图相信这样一个观念:人死之后一定是回到生前的状态了。这或许能给你以安慰。

五、

欧文亚隆在他的《直视骄阳》中提出了许多征服死亡焦虑的办法(强烈推荐本书)。

他在第四章:观念的力量中,提到一个观念,我觉得对我面对死亡焦虑最有效,叫「波动影响」

我们对其他人的影响会再传递给更多的人,就好像池塘中的涟漪一样,一圈一圈地扩散出去。我们可以留下一些东西,留下一些自己或许并不知晓的东西。

死并不像你所想的那样——一切都会完全消亡;最重要的是,你的影响力依然存在,你的言行、你的思想所带来的「波动影响」能够使别人得到快乐

最显著的例子的通过生育下一代来传递我们的基因,或是器官捐献例如眼角膜让另一个重见光明,或是你的一个不经意的善举改变了一个陌生人的一生。创造一些可以传递给他人,并丰富他人人生的事物可以让你的波纹扩散,你的影响力一直存在。

就拿最近的事说,姚贝娜去世了,她的「波动影响」还在,我们依然听着她的歌,甚至或许有很多人从她的歌声中汲取了许多力量,从而生活得更丰富更快乐。

当然我们不是姚贝娜,我们每一个普通人产生不了那么大的影响,但是哪怕再小,你也得知道,我们每个人最基本的「波动影响」——每个人死后在分子水平上又将重新成为自然的一部分,重新为未来的世界添砖加瓦。

亚隆说,正是由于他希望对他人有所助益,所以才会选择在远超过退休年龄之后,依然笔耕不辍。

转自  http://daily.zhihu.com/story/4496024

下一页