学会放弃多余的负担

拥有多少似乎跟快乐没有什么关系,我们不断地扩充自己的欲望名单,这就确保了我们的不满足感。你的心理机制说:“当满足这项欲望时,我一定就会快乐起来。”可是一旦欲望得到满足后,这种心理作用却不断重复。因此,学会放弃是必须的。放弃得当,是对围剿自己的藩篱的一次突围,是对消耗你的精力的事件的有力回击,是对浪费你生命的敌人的扫射,是你在更大范围去发展生存的前提。
拥有一个东西是一体两面,如你我拥有一个东西,享受它,同时你也是受到它的支配。这个东西让你付出的代价是时间、精力、金钱和精神。就好比我们拥有一辆车,它虽然为我们带来了很多方便 ,可我们在享受它带来的利益的同时,需要去驾车、遵守交通规则,还要考虑汽车的保养,停车等问题一样。
凡事适可而止,欲念只求适度而已,不宜过火,太过犹如不及。对事情过分追求,效果反而不美。不如放宽胸怀,追求另一种残缺的美,这里更能将美发挥得淋漓尽致。
快乐不是拥有的多,而是计较的少。为什么有的人一生郁郁寡欢,是因为这样的人心里装有太多的无用的东西在左右着,因而使其变得斤斤计较、偏激、固执甚至于痛苦。
有人讲起自己的一段经历:
还记得很久以前在装修房子时的那件事,虽然事情过去多年,但带给我的记忆却恍如昨天。那是我的新房装修工作进入尾声的那天下午,随着油漆师傅一声“全部装修好了”,我也抱着高兴的心情来到我将要入住的新房。
我从楼上走到楼下,察看整体的成果。却赫然发现厨房水槽下的那个旧水泵,锈迹斑驳的样子,在经过粉刷后的墙面衬托下,显得异常刺眼。
我不好意思请师傅去处理那个不属于他工作的旧水泵,便跟母亲建议,向师傅借一些油漆,将水泵外壳上漆,让两者之间的差距小些。好心的师傅一听到我们要借油漆,便又从他家中赶过来,表示可以帮我们处理。
就当师傅打算动手时,他和母亲闲聊:“这个水泵既然没有用,为什么要漆,不干脆整个拔掉?”现场一阵默然,大家面面相觑。对啊,为什么不拔掉呢?最后不到三分钟,油漆师傅就处理好了那个放在那儿好几年的旧水泵。
人的心不就是这样的吗?
在我们的心中,也许就会有着这样一个旧水泵–有时候,那是我们错爱了的一个人;有时候,那是我们曾经在生命历程中遭遇的挫折伤害;有时候,那是我们习以为常的偏见与固执–明明已经生锈败坏且不堪用了,但我们却缺少将它除去的动力,就任它一年又一年在我们的心中摆放着,以为那是无法除去且不能搬移的。甚至,有时还企图用浓厚的妆,去掩饰它本质的残破。
我们心中到底有多少东西,是我们错误摆置却始终以为是无法搬移的呢?学会选择,懂得放弃是一种智慧更是一种幸福,人生只有放下该放下的才能真正得到快乐。给自己勇气,搬移你心中的“旧的水泵”,别让它成为你快乐的累赘。
为什么很多人成功了反而感到失落?许多人在埋头苦干时,尚未发掘人生的终极目标,只是为忙碌而忙碌着,未曾洞悉自己心灵深处的所欲所求,也不曾审视过自己的人生信条:你到底要做什么?什么是你生命中最重要的?你生活的重心是什么?只有确立了符合价值观的人生目标,才能凝聚意志力,全力以赴且持之以恒地付诸实现,才有可能获得内心最大的满足。
人生就是一个不断追求的过程,追求让自己的生命变得圆满。然而追求也并不是事事都要争到底,恰恰相反的是我们要随时准备放弃。放弃那些沉重的包袱,你才能继续你的追求之旅。
如果我们永远凭着过去生活的习惯,日常世故的经验,固守已经获得的功名利实录,为了进一步的权钱职位、风头利益去争夺,什么样的生活方式都让我们眼花缭乱,什么朋友熟人都不愿得罪,这样我们会疲于应付,把很多时间和精力都花在无谓的纷争和无穷的耗费上。不仅自己的正常发展受到限制,甚至还会迷失自己的方向。

节选自《情绪掌控术》 87-90页.

重新做的红外传感设备

上次做的由于一个红外线传感器感应范围比较小,所以重新做了板子,换成三个传感器共同探测,效果好多了。

这次直接找的厂家帮忙帖片,上次自己焊那个接到电脑上偶尔有脱焊现象导致USB无法被识别。

烧写单片机程序会遇到麻烦,就是串口烧写时正好与板上的CH340T冲突,导致无法烧写,最后我干脆用板子上的CH340T来烧写了,烧写方法是首先接通VCC和RST,然后电脑插上USB,用STC-ISP直接向串口烧写程序,当提示给单片机供电时断开VCC和RST的连接。

设备比较简单,布线比较随意。

Sail on through

很老的一首歌了,百听不厌啊。

well if I could stay with you night and day I would
but we're miles apart don't know where to start 
no way
as winters turning into spring 
don't know what life is gonna bring today
I'm sure we'll be ok
and I can not wait till we're back 
together love conquers all kinds of weather
when your true to what you believe
we'll sail on through
when your true to what you believe
we'll sail on through
well if I could say I'll be back 
some day would you wait
would you wait, would you wait
I can't bear the thought that your
hearts with someone else
that your hearts with someone else
when spring has gone and summer here
I feel there's nothing left to fear
because I know you'll there soon
and I cannot wait till we're back 
together love conquers 
all kinds of weather
when your true to what you believe
we'll sail on through
when your true to what you believe
we'll sail on through
la la la la....la la la
when spring has gone and summer here
I feel there's nothing left to fear
because I know you'll there soon
and I can not wait till we're back 
together love conquers 
all kinds of weather
when your true to what you believe
we'll sail on through
when your true to what you believe
we'll sail on through
and I can not wait till we're back 
together love conquers 
all kinds of weather
when your true to what you believe
we'll sail on through
when your true to what you believe

javascript面向对象写法经验分享

这是本人比较习惯的javascript面象对象写法,里面有一些关于包、类、抽象函数、继承、重载的一些写法,供有兴趣的朋友参考,也期待宝贵的建议。

代码中实现的是一个“车辆”类,并用Car和Tank继承,其中Tank具有攻击性。最后以console的方式表现了三个对象之间的攻击效果。

Continue reading “javascript面向对象写法经验分享”

javascript中prototype方式面向对象编程注意事项

javascript的prototype在新对象创建时会复制这个类的prototype到新的实例,但要注意,它不会完全复制值是对象的属性,而是复制对象的指针。另一方面,这样可以达到面象对象中的静态变量效果。

如下面的示例代码所示:

function A(num){
    this.num=num;
    this.inner.instanceNum++;
}
A.prototype={
    num:0,
    inner:{
        instanceNum:0,
        invokeNum:0
    },
    setNum:function(num){
        this.num=num;
        this.inner.invokeNum++;
    },
    toString:function(){
        return "Num:"+this.num+" instanceNum:"+this.inner.instanceNum+" setNum:"+this.inner.invokeNum;
    }
};
var a=new A(10);
var b=new A(20);
var c=new A(30);
a.setNum(100);
b.setNum(200);
b.setNum(200);
c.setNum(300);
c.setNum(300);
c.setNum(300);
alert(a);
alert(b);
alert(c);

这段代码咋一看,执行完成后所有对象inner.instanceNum都应该等于1,a的inner.invokeNum=1,b的是2,c的是3
而程序的真正输出是
Num:100 instanceNum:3 setNum:6
Num:200 instanceNum:3 setNum:6
Num:300 instanceNum:3 setNum:6

所以如果使用prototype方式的面向对象编程,在原型的定义里,属性的值不能是对象,否则它相当于标准面象对象里的静态变量了(但这正好是js的静态变量定义方式呢)
正确的方式应该是在构造函数里声明对象,如下

function A(num){
    this.num=num;
    this.inner={
        instanceNum:0,
        invokeNum:0
    };
    this.inner.instanceNum++;
}
A.prototype={
    num:0,
    inner:null,
    setNum:function(num){
        this.num=num;
        this.inner.invokeNum++;
    },
    toString:function(){
        return "Num:"+this.num+" instanceNum:"+this.inner.instanceNum+" setNum:"+this.inner.invokeNum;
    }
};
var a=new A(10);
var b=new A(20);
var c=new A(30);
a.setNum(100);
b.setNum(200);
b.setNum(200);
c.setNum(300);
c.setNum(300);
c.setNum(300);
alert(a);
alert(b);
alert(c);

TP-Link mini路由器拆机

以前在一个项目中用过这个路由器,后来出于对内部的好奇,又买了一个来玩。拆机一看,不意外地,IEEE 802.11n路由支持的atheros ar9331的CPU,内存和背面的SPI Flash.以后要自己做无线设备就可以拿它来驱动,85元钱,比自己去设计成本低多了,到时候只需要把RJ45和电平转换芯片拆掉,组合到自己的板子上就行了,当然自己设计板子然后装一个openwrt上去做扩展的话自由开发性会更强.

仔细看板子会发现右边还有一个USB接口没有焊上去,很明显是跟TP-Link的3G路由器用同样的板子,至于内部有没有烧程序就不知道了,要是有的话直接焊上USB口就可以做3G路由了。呵呵。

Linux 内核驱动中申请大块内存

在linux的内核模块中要申请内存,一般都是使用kmalloc的方式申请一块指定大小的内存,但这个函数有一定的限制,一般只能申请到几M到十几M的内存空间,申请内存太多将会失败。这样的限制是好的,保证具有完全权限的内核程序不会无意地过度浪费内存资源(例如通过变量a进行kmalloc(a),但因为程序员的问题,导致a是一个非常大的数字,如果不限制就会因为内存不足就导致内核崩溃了。),如果要进行DMA操作,使用几M的内存已经能达到很好的效率。

但是肯定有在内核中使用超大块内存的情况,例如vmware,它可以预分配虚拟机的所有内存。这时候,就应该自己去按页分配并自己进行页管理。

这里有一个我以前写的内核中大型内存数组管理函数,提供给大家参考参考。没有写太多的注释,仅供有兴趣的参考哈

kvector.h

#ifndef _HOVERLEES_KVECTOR_H
#define _HOVERLEES_KVECTOR_H
#include <linux/slab.h>

#define ELEMENT_LENGTH	8

#define INDEX_LINK_EACH_NUM (PAGE_SIZE/sizeof(void*)-1)
#define ELEMENTS_PER_PAGE PAGE_SIZE/ELEMENT_LENGTH

typedef struct _index_link_node{
	void* data_pages[INDEX_LINK_EACH_NUM];
	struct _index_link_node * next;
}index_link_node;

typedef struct _kvector{
	int size;
	int current_index_pos;
	int total_index_elements;
	int index_node_num;
	index_link_node* index;
}kvector;

typedef int (*KVECTOR_EACH_PAGE_CB)(void* p,void* param);

/*初始化数组*/
int kvector_init(kvector* vector,int init_size);
/*销毁数组*/
void kvector_destroy(kvector* vector);
/*数组大小更改*/
int kvector_resize(kvector* vector,int new_size);
/*设置数组中的第index个元素*/
int kvector_set(kvector* vector,int index,void* mem);
/*取得数组中的第index个元素*/
int kvector_get(kvector* vector,int index,void* mem);

void kvector_foreach_page(kvector* vector,KVECTOR_EACH_PAGE_CB callback,void* param);

#endif

Continue reading “Linux 内核驱动中申请大块内存”