作者:牛三羊

对生理心理学的粗浅理解

生理心理学对来我来说是比较陌生的学科,理解非常有限,所以想到什么就写什么了,希望不要贻笑大方,哈哈⋯⋯

初识生理学应是在上学期的普心课上,教科书中有很多篇幅是对生物进化理论、神经系统和脑的介绍和讲解,很多同学不能理解为何心理学还要学习这些看似不相关的知识。随着学习的深入,我了解到:生物的进化是人类产生的理论基础,大脑、神经、内分泌等系统是人类产生心理活动的基础,从人类生理活动方面进行的心理研究,被称为生理心理学。

我觉得心理学可以从研究方式可以分为二大类:一类研究精神、思维、意识,有些接近人文研究,比如勒庞的大众心理学,马斯洛的层次需求理论,甚至荣格的曼陀罗。在一些人看来这类研究或者理论,都算不上科学,因为很难在实验室中进行量化或验证。另一类倾向自然科学的研究方式,如生理心理学就是这方面的代表。生理心理学使用多种现代化的科技手段,比如EEG(脑波记录)、fMRi(核磁共振)、GSR(皮电反应)等,这种研究方式保证了结论的严谨性和科学性。

两类研究方式看似差异很大,但我认为他们之间并非是对立的关系。人本身就是很复杂的生物,在不同的环境下又塑造了迥异的人格,这就让研究心理的过程变得更加复杂。人文的研究方式像是从外部观察和总结,而生理心理学更像是从人的内部进行精细的分析,两者是相辅相成,相互促进的关系。

读书笔记:《乌合之众》

作者是古斯塔夫·勒庞,在百度百科可以找到比较详细的介绍。这本书买了许久,在几个月前,终于断断续续地把它读完。这是我读到的第一本关于大众心理学的书籍,在此之前只听说过”从众心理“,读完此书,让我对大众心理有了更深的了解和认识。现在凭着回忆,将一些感悟记录下来,可能会有与原著出入的地方。

俗话说:“三个臭皮匠赛过诸葛亮”,世人大多认为群体的智慧或经验将大于个人,对于事情能起到积极的作用。但是作者却认为在构成群体之后,首先是个体的才智被平均化,原本有智力超群的人也将反应平平,总体来讲是降低。我觉得这不矛盾,因为勒庞所指的群体是一群已经进入狂热状态的人,而非理性思考,群策群力的小团体。他认为群体中的智力几乎到了泯灭的地步,观察能力大幅缺失,谎言层出,尤其妇幼之言不可信。正是由于这些原因,很多历史都是根据群众的喜好杜撰,非常靠不住。”历史是任人打扮的小姑娘“,想必作者也会非常认同这句话吧。勒庞在书中举了一些欧洲中世纪和法国大革命时候的例子,大都比较血腥,在狂热的群体中,个人失去了独立思考的能力,很自然地就体现出了本能需要,他们野蛮、急躁、易冲动、易接受暗示,这倒是让我想到了佛洛依德所说的Death Wish。勒庞还认为一个民族会产生自己的精神和文化,群体会受到这种精神和文化的影响,而创造了独有的历史。那在当今社会,全球文化的融合已经开始,人们正在书写同一部地球的历史,人类也会最终走到一起吧。

群体是强大的,如果能够控制和利用,就有如获得了无比的力量。勒庞指出,首先群体是盼望一个强力的领袖,在强权的领导下群体会更加狂热。在法国大革命时期,拿破仑王朝的复辟受到了极大欢迎,人们几乎忘记了拿破仑任职时曾经对着反抗的人群进行炮击。针对群体的弱点如何去利用,我根据书中所写,总结了几点值得关注的地方:其一、群体只接受简单的概念,不要讲复杂的道理。易于传播的标语,脍炙人口的漫画都是很好的手段。其二、群体喜欢偶像崇拜,建立偶像会控制群体的想象力,有助于群体的持久性。崇拜的力量是盲目的,也是强大的。我认为崇拜可能来自于人类的遗传,是天生的,就像荣格说的集体潜意识,在中国的文化环境下尤为明显。其三、在面对群体,发动群体的时候,要大胆断言,是否可信是次要的,关键是要让人们认为事实就是如此,你不得不相信,没有选择。另外还要不断的重复,因为群体是很容易受到暗示,重复对于催眠有着很好的效果。其四、一种言论在群体中很容易传染、发酵,所以要对群体中的言论进行控制,一旦发现不同的声音就应该立即制止和纠正,使其不至于扩散到无法控制的地步,这尤能突显宣传部门的重要性。其五、勒庞非常看重名望的价值,他认为名望在群体中起着非常重要的作用,是人们盲从的一个指标。

写到这里,不得不让我想起了文革时期针对上述的五点运用得是多么娴熟,那时的人们是多么狂热、无情,不免让人感到恐怖。好在当今已不再搞个人崇拜,但造神的运动没有停止,宣传机器一直在运转,言论的控制也紧抓不放,这多少为其复辟保留了环境,一旦条件合适,历史必将重演,中华民族又要经历一场浩劫。

扯远了,整体来讲,作者的观点非常值得关注和学习,但是在阐述观点的时候,叙述性的文字太多,举的例子有些少。何况大多数事情都是发生在欧洲,理解起来有些障碍,要是译者能介绍一下历史背景就好了。另外,在书中还有一些观点我并不认同。比如,勒庞认为在社会中应该按照人种进行等级划分,近些年的研究表明人种的差异并不明显,后期的教育与成长环境更加关键。此外,勒庞认为陪审团和议会也是群体,也会有群体的弱点。我觉得他的观点没什么错,但这个群体多数时刻还是能够保持离职,能够保持独立的个人思考,再加上透彻的信息交流,还有媒体的监督,总比一人专断独裁的强太多了,尤其是对一个国家而言。

自定义Zend Framework模块的异常处理

Zend Framework(ZF)可以根据业务需求配置成多模块的方式,这时我们可能需要在不同模块中采用不同的方式来处理各种错误和异常。在处理错误的时候,可以使用_forward直接跳转和显示,但是如何处理异常呢?官方手册中对此没有明确的说明。经过一番测试之后,发现可以通过以插件的方式进行处理。

比如有一个名为API的module,需要在此模块下对异常进行单独处理。我们只要在application/bootstrap.php中添加一个初始化方法,将错误处理以插件的方式注册就可以了,内容见下:

<?php
class Api_Bootstrap extends Zend_Application_Module_Bootstrap
{
	/**
	 * 注册错误处理插件,使此Module的错误处理定向到apiModule/errorController/errorAction
	 * 
	 */
	protected function _initPluginErrorHandler()
	{
		$front = Zend_Controller_Front::getInstance();
		$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
		    'module'     => 'api',
		    'controller' => 'error',
		    'action'     => 'error'
		)));
	}
	
}

此时,如果api模块下有任何异常抛出,都将使用modules/api/controllers/errorController/errorAction进行处理了~

判断PHP运行系统是32位还是64位

有些时候根据业务的需求会在32位和64位系统上采用不同的处理方式,在PHP中也有有很多方法可以实现,下面是我以前用到过的一种方式:

/**
 * 判断运行环境是否为64位系统
 *
 * @return bool
 */
function isOn64bitsSystem(){
    // 左移32位之后会超过32位系统的限制,如果64位系统则不会
    return (1<<32)==1 ? false : true;
}

更简单的方法,判断PHP_INT_SIZE:

echo PHP_INT_SIZE===8 ? 'on 64 bit System' : 'on 32 bit System';

记录Zend Framework运行时间

前几天看到有人问在Zend Framework中如何获取运行时间,如果只是用于debug,非常简单,我们只要在public/index.php中的第一行加入:

define('ZF_START_TIME', microtime(true));

最后一行加入:

echo number_format(microtime(true)-ZF_START_TIME, 8, '.', '');

这样,运行时间就会直接打印到页面的最下方。

当然,这会破坏框架的整体结构,但也是最直接,最简单的方式,debug么,嘿嘿。

解决mac更新慢的问题

最近几次在MAC OSX更新的时候极慢,很多时候只有10k/s的样子。以前的更新包只有几十M,也就忍了,但今天足足有250M,按照这个速度,恐怕需要20个小时。我记得刚买回macbook的时候,更新速度还是很快的,不知为何现在如此之慢。今天早晨和一个朋友聊起此事,他说在host文件中配置一下指向速度会有提升。这句话提醒了我。我为了解决国内DNS污染的问题,使用了美国DNS地址,所以在解析的时候,把我指向了美国的服务器。dig一下果然如此:

swcdn.apple.com.	1602	IN	CNAME	swcdn.apple.com.akadns.net.
swcdn.apple.com.akadns.net. 124	IN	CNAME	swcdn.apple.com.edgesuite.net.
swcdn.apple.com.edgesuite.net. 1386 IN	CNAME	swcdn.apple.com.edgesuite.net.globalredir.akadns.net.
swcdn.apple.com.edgesuite.net.globalredir.akadns.net. 380 IN CNAME a950.gi3.akamai.net.
a950.gi3.akamai.net.	8	IN	A	96.17.180.146
a950.gi3.akamai.net.	8	IN	A	96.17.180.147
a950.gi3.akamai.net.	8	IN	A	96.17.180.136

我的ISP是网通,使用国内的DNS,dig出来的内容:

;; ANSWER SECTION:
swcdn.apple.com.	1732	IN	CNAME	swcdn.apple.com.akadns.net.
swcdn.apple.com.akadns.net. 43	IN	CNAME	swcdn.apple.ccgslb.com.cn.
swcdn.apple.ccgslb.com.cn. 1355	IN	CNAME	download011.cncssr.chinacache.net.
download011.cncssr.chinacache.net. 93 IN A	175.22.6.16
download011.cncssr.chinacache.net. 93 IN A	182.118.9.194

哈哈,这样就简单了,直接在host文件中将域名swcdn.apple.com指向175.22.6.16和182.118.9.194就可以了。现在的速度太爽了,250M,小case。

脑的可塑性给我的启示

我们知道到大脑是人类最复杂的器官,大约有140亿个脑细胞,是人类的控制中枢,影响人体内部与外部的各种活动。近些年来脑成像技术的发展和使用还让我们知道大脑的每个区域承载不同的功能,这些区域是相对固定的,并可以进行一定的动态调整。曾经有这样的一个病例:有一位患者在幼儿时期因疾病切除部分大脑,当他成年之后,却没有因此丧失这部分的脑功能,他仍然可以像正常人一样生活。通过脑成像技术进行观测,发现剩余的这部分大脑已经具有正常完整脑的功能,但是功能区域已经有很大不同,这说明大脑具有很强的可塑性。当然,这种事情发生在正常人的身上可能性非常之小,但我们仍能从中得到一些启迪。

在出生时,大脑还处于快速发育的时期,很多组织功能并没有发育完成。直到12个月后,大脑才基本定型,逐步具有一些成人大脑所具有的功能。这时的大脑就像一张刚刚准备好的画布,外界的各种刺激如同彩笔,将在这块画布上描绘各种图像。但是画布接受画笔的色彩是有“期限”的,有研究表明:7岁以前是少儿左右脑的敏感期,如果在这个时期得不到充足的开发或者刺激,会对以后造成极为严重的影响。现实中存在的狼孩就是一个悲惨的例子。在1940年左右,人们捕获了一个被狼群抚养长大的孩子,他只能用四肢行走;白天睡觉,晚上活动, 怕火、光和水;不会讲话,每到午夜后就会像狼似地长嚎。后来经过7年的教育和学习,他能够掌握4-5个词,勉强地学几句话。直到死去,他的智力水平也只相当于3、4岁的孩子。之后的几年,在世界的不同地区,也发现了类似的狼孩,结果都非常相似。从上面的例子我们可以看出,在少儿时期,行为、语言、记忆等方面的刺激将会很大程度的影响大脑的开发程度。因此我们一定要注重少儿时期的早期培养、甚至可以给予适当强度的提升训练,开发大脑潜质,使孩子在幼年和成年之后,面对问题、思考问题时,能够强有力的解决。 (更多…)

一点星光

人活在世,少不了迷茫,就像在漆黑的夜里迷失了方向,找不到脚下的路。也许有人会不知所措,也许有人会心悸彷徨,也许有人再也不能前行。此时请不要惊慌,或许应该抬头看看天上的点点繁星,他们在向你眨眼,在向你微笑。星光虽然暗淡,不及太阳的无限光芒,但在漆黑的夜里也会给人以安慰。心理学就如此般,帮助你从不同的角度看待问题,又或者像北斗星帮你辨别方向,指引一条新的道路。正因如此,在博客创建了一个新栏目:《点点星光》,放一些心理学方面的文章,会涉及研习记录、文章摘要等等。

F5旁路模式下nginx获取真实IP

在公司的网络中,使用F5工作在旁路模式,这样的好处是在不调整网络的基础架构上做负载均衡。但是在调整好网络之后,发现作为node(节点)的nginx已经不能正确获取到用户的IP地址,这导致之前使用nginx做的IP白名单策略失效。后来发现这是由于F5在旁路模式下将请求的头信息进行了修改,将源地址放到了X-Real-IP或X-Forwarded-For中。以这种情况来看,通过web应用程序应该可以很容易的获取这个地址,但这样就需要修改程序的业务逻辑,最好的办法还是让nginx支持读取真实IP。写到这里,回想起在使用HAProxy做LB的时候,需要配置类似于x-forwarded-for的选项了,所以,nginx还是有办法的。

nginx提供了这种获取方法,但是默认的编译参数中并没有支持,需要在编译的时候增加“–http-realip-module”作为参数。在重新编译完成之后,还需要对配置文件做一些修改,增加如下2项配置:

set_real_ip_from   192.168.160.8;
real_ip_header     X-Forwarded-For;

其中的192.168.160.8为F5的IP地址。OK,大功告成,再次查看access log,发现client IP地址已经生效,IP白名单也工作正常了。

在nginx的官方wiki中有关于“http realip module”的说明,文中提到:“如果nginx工作在一些7层负载均衡机之后,收到的请求来自本地IP(代理服务器),但是代理服务器又在头信息中添加了源IP,这时此模块就有用啦”,言外之意,如果有些L7的代理没有在头信息中增加源地址,这个模块也就没辙了。

PHP中兼容JAVA的DES加密

在项目中PHP与JAVA通信时需要使用DES进行数据加密,但PHP对字符串进行DES加密之后,使用JAVA无法解开,反之也是。这是因为PHP的DES加密与JAVA略有不同。JAVA在使用DES方式加密的时候,如果字符串长度不足将补位,但是PHP并未这样做。因此我们只要在PHP进行DES加密时进行补位处理,就解决了兼容性的问题。CBC模式下采用的是pkcs#5补位方式,就是差N位补几个0xN,比如说差3位,就补充3个0x03。在网上也看到文章说补00或FF的,但是测试结果不好用。

// 定义key与iv
define('DES_KEY', '12345678');
define('DES_VI', '12345678');
/**
* des加密:兼容java
*/
function des_encrypt_java($str)
{
	$blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
	// 计算相差位数,并补位
	$slice = $blocksize - (strlen($str) % $blocksize);
	$str .= str_repeat(chr($slice), $slice);
	return mcrypt_cbc(MCRYPT_DES, DES_KEY, $str, MCRYPT_ENCRYPT, DES_VI);
}
/**
* des解密:兼容java
*/
function des_decrypt_java($str)
{
	$str = mcrypt_cbc(MCRYPT_DES, DES_KEY, $str, MCRYPT_DECRYPT, DES_VI);
	// 解密的结果可能还含有补位数据,所以要把补位去掉
	$slice = ord($str{strlen($str) - 1});
	return substr($str, 0, -1*$slice);
}