今年的校园招聘应该说是历届最大的一次,无论是腾讯,百度,网易还是其他大公司都排出了豪华阵容进行招聘,腾讯派出了600人的团队参与,可谓盛况空前。阿里巴巴集团包括旗下子公司也要在这次校园招聘中引进1800名应届毕业生。今年毕业的大学生应该是610万,应该说这么大规模的校园招聘对目前失业率高,金融危机中的中国是一大喜事。
但是亲爱的应届毕业生们,不要以为自己的身价上涨了,几大互联网公司都来了,可以牛一把了。昨天看了Donews的新闻,看到阿里在招聘的时候使用的一种态度,超赞,如下:
据了解,阿里巴巴集团今年趁着十周年庆展开了全国范围最大规模的一次招聘,其中在南京将投放300名左右的招聘计划,涉及开发工程师、网站运营师、市场分析师、客户服务、销售等诸多岗位,今后将供职阿里集团旗下的B2B、淘宝、支付宝、雅虎、集团技术部工作。此次招聘,吸引了大批南大、东大等名校毕业生的关注。
很多学生很关心阿里巴巴的待遇,但是在昨天的南大宣讲会上,招聘方却闭口不提。负责招聘活动的资深总监陆凯薇向同学们明言:"以往参加宣讲会时,有的学生会半途退场,原因是嫌我们讲得太空,没有谈到工资待遇这些具体问题。我可以肯定地说,今天我还是不会讲。如果学生关心的只有这个,你们可以随时选择退场。"
第二段Echo陆说的话,也正是我想说的。作为阿里的一名面试官,我也有很多忠告给应届毕业生。
1、钱重要还是梦想重要?
别再说钱和梦想都重要这样的话,坦率的说如今的院校培养出来的大部分应届毕业生的能力,我作为几年校园招聘面试官和技术管理者来看,和社会需要的能力还是有差距的,这不是你们的错,是中国教育的错,美国的计算机的学生都要学会自己写操作系统。所以现阶段,钱和梦想有时候不一定能兼得,如果两者一定要让你做个选择,排在第一的是哪个?这个问题各位应届毕业生请在面试任何一家企业之前,务必要考虑清楚,记住是务必。对不起,我收回我的话,我说错了,不是在面试任何一家企业之前,是各位在进入校园的时候,就应该考虑这个问题,这个问题可能会让你整整考虑四年,中间有过彷徨,有过动摇,但请在大三下半学期或者在研一的时候,务必坚定地想清楚。我并不奢望100%的同学会选择梦想,希望有80%是这样想的,至少80%的人迈出了成功的第一步,这是心态问题。这步迈错了,后面可能要用十几年的时间来弥补甚至永远都没有机会了。记住,钱只是你实现梦想的一个副产品!
2、知识重要还是思考重要?
大多数的应届毕业生在刚迈入社会的时候,会感觉自己空虚的一塌糊涂,感觉要学的东西简直太多了,自己好像就是一个在沙漠中行走了一个星期没喝水的人,看到一片绿洲湖泊那种发自内心的饥渴欲望。请各位应届毕业生先冷静,一天吃不成一个胖子,你什么都不会是正常的,谁生下来就什么都会呢?相反你要是什么都会才是不正常的,除非你是天才,我们都是凡人,所以放下心里的包袱,没有人来嘲笑你能力差,就和你去驾校学车一样,教官会嘲笑你不会开车吗?这是很自然的事情。你是需要立刻补充知识,但是重要的是,要在信息泛滥的当下补充什么样的知识和技能。我看到90%以上的应届毕业生在刚开始工作的时候面临显得无所适从,光知道要拼命学习,补充知识提高技能,你没有停下来思考一下,究竟哪些东西是要先学的,哪些优先级低的,哪些是可以问人的,哪些是自己可以看的,哪些是一定要通过项目实践才能学会的,如果你能停下来仔细考虑你学习的优先级,三思而后行,就是一个很好的开始。当然还有一些应届毕业生就是在思考力上很无助,他们不能思考清楚自己到底应该学什么东西,这就是为什么在很多大公司会有一个老人(在阿里称之为"导师")带着应届毕业生工作,但是我还是真诚地希望大家认识到思考力是多么的重要,有了它,你才能更好的运用知识,往往它比知识更重要。举个例子,当你在Word中发现了Ctrl+B是将选定的文字加粗后,是否去思考了一下,是否在Excel中同样也有这样的功能,试过后发现一样的,那么在PowerPoint中呢,也可以,那么说明了什么了呢?思考一下会发现,哦,原来Office中很多功能在不同的软件中是一样的,例如格式刷,缩进等,不久之后,你就会有了这样的判断力,这个功能不可能在PowerPoint中没有,因为Word中曾经使用过,并且这个功能是一个很普遍的功能,唯一的问题是可能在快捷菜单中没有显示出来。这就是思考力。
3、经验重要还是激情重要?
现在的应届毕业生从经验上可以分两种,一种是学术研究型,一种是有过实际工作经验型。其实有没有经验从面试官的角度来说不是最重要的考核维度,至少我是这么认为的,因为毕竟是校园招聘,我们不可能对大家有过高的要求。普遍说来,研究生毕业生要比本科毕业生要有很多的实践机会,可能在研一的时候,就已经开始在某个公司实习或者在教授这里做项目做课题,在知识积累和经验上要比本科生来的多。但是面试官和一个企业的主管或者用人部门真正关注的你是否有激情。什么叫激情?那是一种发自内心的对自己生活,工作,人生的渴望和呐喊,我喜欢,我要努力,我热爱,我要奋斗这样的心态,有了激情,才有了动力去学习,去提升。一个有激情的本科生在面试官眼中比那些做了N多项目却惶然找不到人生方向的研究生来说要可贵的多。在情景辅导中,有两个维度,意愿和能力,有激情的人都是有意愿去提高的,能力的培养只是时间和刻苦程度的问题。一个没有激情的人,就好比一头不肯拉磨的骡子,一定要主人在后面用鞭子抽才会走路,这样对自己对公司都是无比痛苦的。说到激情,又要回到梦想,你希望未来的你成为一个什么样的人,你希望未来自己能实现什么,想清楚了,哪怕再困难,咬着牙也要去实现,这就是激情,最大的失败就是自暴自弃,半途而废,这些土的不能再土的话请大家考虑后再考虑,没有道理,就不会被人们一次次拿出来说了。
4、是单纯还是圆滑世故?
随着现代社会越来越浮躁,越来越急功近利,一切都是向"钱"看。很多大学生在未走出校园前,已经被社会污染得失去了纯真的心灵,男大学生们寝室变成了游戏室,棋牌室,网吧,垃圾场,女大学生们一个个争奇斗艳,右手挎着LV包,左手挽着大款的胳膊,穿着性感的衣服玩夜总会,逛夜店。这在10年前,20年前的中国简直是很难想象的,在如此恶劣的环境和纸醉金迷的诱惑下,很多大学生开始走向了自我毁灭的道路,开始了得过且过,花言巧语,不诚信,玩世不恭,违背道德,甚至出卖自己的灵魂,以为这是一条成功之路。有一颗单纯,成熟的,执着的心灵在任何年代都是吃得开的而且是难能可贵的,让自己的心静下来,好好想想此时此刻的你是真正的自己,还是伪自己,你的理想我是什么,你的自我和社会我匹配吗?不要怀疑在面试的时候,这些深层次的东西面试官发掘不了,即使蒙骗了面试官,在实际工作中总归是要暴露无遗的,拥有一颗单纯且成熟的心灵才是自己应该去做的。
5、是大公司还是小公司?外企还是民企?
这几年的校园招聘下来,我看到了这些情况,每当大公司来校园招聘了,同学们趋之若骛,宣讲会上热闹非凡,人山人海,大家挤破头也要冲进去。小公司来招聘了,门可罗雀,景象十分凄惨。大公司有大公司的好处,例如有发展的平台,学习和培训的机会也多,能接触的东西也多,看起来不错,但是大公司也有弱势,你在很长时间内只可能按部就班做好自己的工作,你很难有机会去了解或者涉及与工作相关的上下游,左右部门的工作内容,也就是你有时候很难看到全部,例如你没有权限登录到生产环境去实际体验一把,只能通过PPT,培训有点感性的认识。小公司虽然规模小,但是你接触全套的东西,同时你也是一个人当几个人用,虽然累点,但是在这段时间内,相信我,你的进步是最大的。我自己对过去感悟了很多,发现我对互联网之所以有全面的了解,从底层硬件基础建设到网络部署,架构等方面,是因为以前在小公司的时候,接触过小型机,网络,等等现在基本不能接触到的东西,这样一来自己的知识体系就很全面了。另外任何大公司都是从小公司做起的,腾讯,百度,阿里都是这样,有很多年轻人喜欢尝试创业的感觉,这是我极力推荐的方式,因为这样会极有成就感,随着公司的成长,你自己的成长也是显而易见的,如果你还有更加崇高的梦想,也可以试着自己去创业。因此不论是大公司还是小公司,都有各自的优势和劣势,要看每个人的意愿和想法。至于外企还是民企,我个人想法还是让大家重点考虑民企,大家说知道的百度,腾讯,华为,阿里,联想等公司,都是民企出身,在民企中工作,你会有一种同舟共济,生死与共的感觉,大家都是一家人,所有东西都是从无到有,我们一起建立,而且最重要的是都是中国人自己的公司,为中国做着贡献。而在外企,你加入后,就只是一颗螺丝钉,当然我不能说全都是螺丝钉,至少大部分是,我面试过很多外企工作的工程师,绝大部分拿着很高的薪水,但是却只会做那么一件事情,在外企,好比就是温水煮青蛙,让你不知不觉觉得你很难跳出这壶温水了,你仅仅知道流程中一部分环节的工作,而且也只会做这部分,外企为了控制知识产权和核心技术,是肯定不可能将重要的知识点,技能放开给中国员工的,你所要做的事情,就是follow
the order, finish the
task,可能外企员工拿的薪水比其他企业多,但是绝大部分是青蛙,很多在金融危机中被裁员的外企员工找不到工作,第一是因为原来较高的物质收入水平让自己的心理接受不了过低的offer,第二因为原来就只会做这样的事情,其他的部分在外企中很难全面了解,不符合其他企业的要求。例如在外企的IT企业中,很多核心技术都是美国团队研发好,到了中国只是做二次开发或者边缘开发,排列组合已经开发好的组件而已,他们至所以雇佣中国工程师的目的很简单,成本低廉(虽然很多人认为即使这样也比民企的收入要高)。渐渐地,外企中绝大部分的中国员工被固化,也不怕你跳槽,知道你跳不到哪里去,因为你的能力是垂直型的,不具备水平扩展的能力,再加上较高的offer也让你永远呆在了外企中,直到下一次裁员,这些人就惨了!当然在外企也不是绝对的,Nokia就是一家不错的外企,另外我也曾经招聘过在外企中觉醒过来的工程师,能力很不错,自己也想通了,再这样下去,自己要被固化住,所以要寻求其他更高的发展。总之大小企业,因人而异,外企民企,推荐民企。
6、是出去呢?还是留下?
说实话,清华的,北大等很多一流院校的毕业生有很多是选择了前者,甚至是在大二,大三的时候,整个班就已经被国外著名的学校盯上。确实这些国内一流学校的学生在国际人才上很抢手,但是从另一个角度来看,这也是西方国家对中国一种赤裸裸的人才掠夺战略,而且这样的战略毫不夸张得讲是建立在国家战略的基础上的。不要和我说,他们都是国际主义战士,为全世界人民服务,可能吗?这些人的境界没有像罗永浩这么高,绝大部分是从私利出发。当然我们欢迎那些在国外学成归来的同学,虽然少得可怜。国家培养一个大学生这么多年,结果翅膀一硬就投靠其他国家去了,有人说这是吃不到葡萄嫌葡萄酸,有本事就像钱学森,李政道,杨振宁一样研究出一点成果,回报祖国,回报全世界。当然我不是鄙视那些出去的同学,而是出去的时候是否带着一颗赤子之心,而且始终不变,很难的,经过了资本主义发达社会的诱惑,确实能回来的很少,我的同学中凡是出去的,基本上都没回来,而且都不愿意回来,从内心讲我还是有点鄙视的。这就是现状,讲了这么多,这个选择题留个大家做,毕竟人各有志。
最后希望各位应届生和明年的应届生都好好考虑以上几点,我真心希望大家看过后,用真诚的态度去面对一切,仔细思考自己的未来,有志者事竟成!
最后给阿里巴巴在招聘中做一个简短的广告,"阿里开创未来,技术成就梦想",希望在10月长假之后,在合肥,成都和广州的校园招聘中见到大家,谢谢!
2009年10月12日星期一
V4L2开发
正文:要做的任务是,把一块板子上的摄像头采集的图像和声卡采集的声音(貌似很啰嗦哈)通过TCP/IP协议传输到另一块板子上。第一步,先把视频获取并且在本地LCD上显示。看了板子提供的文档,视频传输需要用V4L2的API。
一.什么是video4linux
Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。
二、一般操作流程(视频设备):
1. 打开设备文件。 int fd=open("/dev/video0″,O_RDWR);
2.
取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct
v4l2_capability
3. 选择视频输入,一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,struct
v4l2_input
4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
6.
将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap
7. 将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct
v4l2_buffer
8. 开始视频的采集。VIDIOC_STREAMON
9. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
10. 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
11. 停止视频的采集。VIDIOC_STREAMOFF
12. 关闭视频设备。close(fd);
三、常用的结构体(参见/usr/include/linux/videodev2.h):
struct v4l2_requestbuffers
reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备
struct v4l2_input input; //视频输入
struct v4l2_standard std;//视频的制式,比如PAL,NTSC
struct v4l2_format fmt;//帧的格式,比如宽度,高度等
struct v4l2_buffer buf;//代表驱动中的一帧
v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query;//查询的控制
struct v4l2_control control;//具体控制的值
下面具体说明开发流程(网上找的啦,也在学习么)
打开视频设备
在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备:
// 用非阻塞模式打开摄像头设备
int cameraFd;
cameraFd = open("/dev/video0″, O_RDWR | O_NONBLOCK, 0);
// 如果用阻塞模式打开摄像头设备,上述代码变为:
//cameraFd = open("/dev/video0″, O_RDWR, 0);
关于阻塞模式和非阻塞模式
应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。
设定属性及采集方式
打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:
extern int ioctl (int __fd, unsigned long int __request, …) __THROW;
__fd:设备的ID,例如刚才用open函数打开视频通道后返回的cameraFd;
__request:具体的命令标志符。
在进行V4L2开发中,一般会用到以下的命令标志符:
1. VIDIOC_REQBUFS:分配内存
2. VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
3. VIDIOC_QUERYCAP:查询驱动功能
4. VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
5. VIDIOC_S_FMT:设置当前驱动的频捕获格式
6. VIDIOC_G_FMT:读取当前驱动的频捕获格式
7. VIDIOC_TRY_FMT:验证当前驱动的显示格式
8. VIDIOC_CROPCAP:查询驱动的修剪能力
9. VIDIOC_S_CROP:设置视频信号的边框
10. VIDIOC_G_CROP:读取视频信号的边框
11. VIDIOC_QBUF:把数据从缓存中读取出来
12. VIDIOC_DQBUF:把数据放回缓存队列
13. VIDIOC_STREAMON:开始视频显示函数
14. VIDIOC_STREAMOFF:结束视频显示函数
15. VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。
这些IO调用,有些是必须的,有些是可选择的。
检查当前视频设备支持的标准
在亚洲,一般使用PAL(720X576)制式的摄像头,而欧洲一般使用NTSC(720X480),使用VIDIOC_QUERYSTD来检测:
v4l2_std_id std;
do {
ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
} while (ret == -1 && errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
设置视频捕获格式
当检测完视频设备支持的标准后,还需要设定视频捕获格式:
struct v4l2_format fmt;
memset ( &fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 720;
fmt.fmt.pix.height = 576;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) {
return -1;
}
v4l2_format结构体定义如下:
struct v4l2_format
{
enum v4l2_buf_type type; //
数据流类型,必须永远是//V4L2_BUF_TYPE_VIDEO_CAPTURE
union
{
struct v4l2_pix_format pix;
struct v4l2_window win;
struct v4l2_vbi_format vbi;
__u8 raw_data[200];
} fmt;
};
struct v4l2_pix_format
{
__u32 width; // 宽,必须是16的倍数
__u32 height; // 高,必须是16的倍数
__u32 pixelformat; //
视频数据存储类型,例如是//YUV4:2:2还是RGB
enum v4l2_field field;
__u32 bytesperline;
__u32 sizeimage;
enum v4l2_colorspace colorspace;
__u32 priv;
};
分配内存
接下来可以为视频捕获分配内存:
struct v4l2_requestbuffers req;
if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
return -1;
}
v4l2_requestbuffers定义如下:
struct v4l2_requestbuffers
{
__u32 count; // 缓存数量,也就是说在缓存队列里保持多少张照片
enum v4l2_buf_type type; //
数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
enum v4l2_memory memory; // V4L2_MEMORY_MMAP 或 V4L2_MEMORY_USERPTR
__u32 reserved[2];
};
获取并记录缓存的物理空间
使用VIDIOC_REQBUFS,我们获取了req.count个缓存,下一步通过调用VIDIOC_QUERYBUF命令来获取这些缓存的地址,然后使用mmap函数转换成应用程序中的绝对地址,最后把这段缓存放入缓存队列:
typedef struct VideoBuffer {
void *start;
size_t length;
} VideoBuffer;
VideoBuffer* buffers = calloc( req.count, sizeof(*buffers) );
struct v4l2_buffer buf;
for (numBufs = 0; numBufs < req.count; numBufs++) {
memset( &buf, 0, sizeof(buf) );
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = numBufs;
// 读取缓存
if (ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1) {
return -1;
}
buffers[numBufs].length = buf.length;
// 转换成相对地址
buffers[numBufs].start = mmap(NULL, buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd, buf.m.offset);
if (buffers[numBufs].start == MAP_FAILED) {
return -1;
}
// 放入缓存队列
if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) {
return -1;
}
}
关于视频采集方式
操作系统一般把系统使用的内存划分成用户空间和内核空间,分别由应用程序管理和操作系统管理。应用程序可以直接访问内存的地址,而内核空间存放的是
供内核访问的代码和数据,用户不能直接访问。v4l2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,必须通过某些手段来转换地
址。
一共有三种视频采集方式:使用read、write方式;内存映射方式和用户指针模式。
read、write方式:在用户空间和内核空间不断拷贝数据,占用了大量用户内存空间,效率不高。
内存映射方式:把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这是一种有效的方式。上面的mmap函数就是使用这种方式。
用户指针模式:内存片段由应用程序自己分配。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR。
处理采集数据
V4L2有一个数据缓存,存放req.count数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,缓存队列将最先采集到的
视频数据缓存送出,并重新采集一张视频数据。这个过程需要用到两个ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF:
struct v4l2_buffer buf;
memset(&buf,0,sizeof(buf));
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=0;
//读取缓存
if (ioctl(cameraFd, VIDIOC_DQBUF, &buf) == -1)
{
return -1;
}
//…………视频处理算法
//重新放入缓存队列
if (ioctl(cameraFd, VIDIOC_QBUF, &buf) == -1) {
return -1;
}
关闭视频设备
使用close函数关闭一个视频设备
close(cameraFd)
还需要使用munmap方法。
附录:标准的V4l2的API
http://v4l.videotechnology.com/dwg/v4l2.pdf
一.什么是video4linux
Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。
二、一般操作流程(视频设备):
1. 打开设备文件。 int fd=open("/dev/video0″,O_RDWR);
2.
取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct
v4l2_capability
3. 选择视频输入,一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,struct
v4l2_input
4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
6.
将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap
7. 将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct
v4l2_buffer
8. 开始视频的采集。VIDIOC_STREAMON
9. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
10. 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
11. 停止视频的采集。VIDIOC_STREAMOFF
12. 关闭视频设备。close(fd);
三、常用的结构体(参见/usr/include/linux/videodev2.h):
struct v4l2_requestbuffers
reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备
struct v4l2_input input; //视频输入
struct v4l2_standard std;//视频的制式,比如PAL,NTSC
struct v4l2_format fmt;//帧的格式,比如宽度,高度等
struct v4l2_buffer buf;//代表驱动中的一帧
v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query;//查询的控制
struct v4l2_control control;//具体控制的值
下面具体说明开发流程(网上找的啦,也在学习么)
打开视频设备
在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备:
// 用非阻塞模式打开摄像头设备
int cameraFd;
cameraFd = open("/dev/video0″, O_RDWR | O_NONBLOCK, 0);
// 如果用阻塞模式打开摄像头设备,上述代码变为:
//cameraFd = open("/dev/video0″, O_RDWR, 0);
关于阻塞模式和非阻塞模式
应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。
设定属性及采集方式
打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:
extern int ioctl (int __fd, unsigned long int __request, …) __THROW;
__fd:设备的ID,例如刚才用open函数打开视频通道后返回的cameraFd;
__request:具体的命令标志符。
在进行V4L2开发中,一般会用到以下的命令标志符:
1. VIDIOC_REQBUFS:分配内存
2. VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
3. VIDIOC_QUERYCAP:查询驱动功能
4. VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
5. VIDIOC_S_FMT:设置当前驱动的频捕获格式
6. VIDIOC_G_FMT:读取当前驱动的频捕获格式
7. VIDIOC_TRY_FMT:验证当前驱动的显示格式
8. VIDIOC_CROPCAP:查询驱动的修剪能力
9. VIDIOC_S_CROP:设置视频信号的边框
10. VIDIOC_G_CROP:读取视频信号的边框
11. VIDIOC_QBUF:把数据从缓存中读取出来
12. VIDIOC_DQBUF:把数据放回缓存队列
13. VIDIOC_STREAMON:开始视频显示函数
14. VIDIOC_STREAMOFF:结束视频显示函数
15. VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。
这些IO调用,有些是必须的,有些是可选择的。
检查当前视频设备支持的标准
在亚洲,一般使用PAL(720X576)制式的摄像头,而欧洲一般使用NTSC(720X480),使用VIDIOC_QUERYSTD来检测:
v4l2_std_id std;
do {
ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
} while (ret == -1 && errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
设置视频捕获格式
当检测完视频设备支持的标准后,还需要设定视频捕获格式:
struct v4l2_format fmt;
memset ( &fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 720;
fmt.fmt.pix.height = 576;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) {
return -1;
}
v4l2_format结构体定义如下:
struct v4l2_format
{
enum v4l2_buf_type type; //
数据流类型,必须永远是//V4L2_BUF_TYPE_VIDEO_CAPTURE
union
{
struct v4l2_pix_format pix;
struct v4l2_window win;
struct v4l2_vbi_format vbi;
__u8 raw_data[200];
} fmt;
};
struct v4l2_pix_format
{
__u32 width; // 宽,必须是16的倍数
__u32 height; // 高,必须是16的倍数
__u32 pixelformat; //
视频数据存储类型,例如是//YUV4:2:2还是RGB
enum v4l2_field field;
__u32 bytesperline;
__u32 sizeimage;
enum v4l2_colorspace colorspace;
__u32 priv;
};
分配内存
接下来可以为视频捕获分配内存:
struct v4l2_requestbuffers req;
if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
return -1;
}
v4l2_requestbuffers定义如下:
struct v4l2_requestbuffers
{
__u32 count; // 缓存数量,也就是说在缓存队列里保持多少张照片
enum v4l2_buf_type type; //
数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
enum v4l2_memory memory; // V4L2_MEMORY_MMAP 或 V4L2_MEMORY_USERPTR
__u32 reserved[2];
};
获取并记录缓存的物理空间
使用VIDIOC_REQBUFS,我们获取了req.count个缓存,下一步通过调用VIDIOC_QUERYBUF命令来获取这些缓存的地址,然后使用mmap函数转换成应用程序中的绝对地址,最后把这段缓存放入缓存队列:
typedef struct VideoBuffer {
void *start;
size_t length;
} VideoBuffer;
VideoBuffer* buffers = calloc( req.count, sizeof(*buffers) );
struct v4l2_buffer buf;
for (numBufs = 0; numBufs < req.count; numBufs++) {
memset( &buf, 0, sizeof(buf) );
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = numBufs;
// 读取缓存
if (ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1) {
return -1;
}
buffers[numBufs].length = buf.length;
// 转换成相对地址
buffers[numBufs].start = mmap(NULL, buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd, buf.m.offset);
if (buffers[numBufs].start == MAP_FAILED) {
return -1;
}
// 放入缓存队列
if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) {
return -1;
}
}
关于视频采集方式
操作系统一般把系统使用的内存划分成用户空间和内核空间,分别由应用程序管理和操作系统管理。应用程序可以直接访问内存的地址,而内核空间存放的是
供内核访问的代码和数据,用户不能直接访问。v4l2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,必须通过某些手段来转换地
址。
一共有三种视频采集方式:使用read、write方式;内存映射方式和用户指针模式。
read、write方式:在用户空间和内核空间不断拷贝数据,占用了大量用户内存空间,效率不高。
内存映射方式:把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这是一种有效的方式。上面的mmap函数就是使用这种方式。
用户指针模式:内存片段由应用程序自己分配。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR。
处理采集数据
V4L2有一个数据缓存,存放req.count数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,缓存队列将最先采集到的
视频数据缓存送出,并重新采集一张视频数据。这个过程需要用到两个ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF:
struct v4l2_buffer buf;
memset(&buf,0,sizeof(buf));
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=0;
//读取缓存
if (ioctl(cameraFd, VIDIOC_DQBUF, &buf) == -1)
{
return -1;
}
//…………视频处理算法
//重新放入缓存队列
if (ioctl(cameraFd, VIDIOC_QBUF, &buf) == -1) {
return -1;
}
关闭视频设备
使用close函数关闭一个视频设备
close(cameraFd)
还需要使用munmap方法。
附录:标准的V4l2的API
http://v4l.videotechnology.com/dwg/v4l2.pdf
价值投资的灵魂
价值投资的灵魂是企业内在价值的成长。趋势投资者不必过于关心企业的成长性,他们更多是看重短期资金的流向,量价关系,以及K线的组合形态。巴菲特的老师格雷厄姆注重绝对的价值,寻找绝对价值低估的品种,他说过超过15倍市盈率的股票不买。后来的投资者发现,在一个有效的市场中,绝对低估的品种很难找到。于是,他们放宽了标准:从企业长期成长的全过程看,只要现在仍是相对较低的位置,尽管市盈率不低,仍然是可以买进。彼得•林奇说过,一只股票年成长速度达到30%,我原意接受30倍的市盈率。我们现在再度面临一个不再便宜的市场,认真地从成长性角度选择股票,尤为重要。
企业的成长有各种不同的类型。从市场占有率角度看,我定义为两种:同步成长和挤压式成长。同步成长是指市场占有率并没有提高,但是所处国家,所处行业在成长,企业也跟随大的形势一起成长。对于同步成长,在选择个股的时候,看重他所在的国家,所处的行业。所谓"男怕入错行,女怕嫁错郎",行业处于下降周期,企业再努力,也很难取得好的经营业绩。 比如现在的钢铁业、航运业、造船业等强周期行业;反之,行业好,不那么优秀的企业也可能会取得好的经营业绩,比方铁路建设、煤炭等。挤压式成长是指企业的 竞争能力在行业中领先,它能把其他企业的市场份额攫为己有,逐渐成长为行业內的巨头。行业成长,这类企业可以取得超越平均水平的成长的速度,行业即使不再 成长,或者成长缓慢,它仍可通过挤占其他企业的市场份额获得成长。比如水泥行业的海螺水泥,空调行业的格力电器,他们在行业成长缓慢的阶段,都取得了不俗 的业绩。我们在选择上市公司的时候,要选择既能同步成长,又能实现挤压式成长的好企业。即:行业要好,行业內的竞争能力要强。其中行业內的竞争能力是我们 尤为关注的,行业內竞争力薄弱,最终成长也是昙花一现,免不了在行业低潮期被收购兼并的命运。
从企业获得成长的手段看,成长分为内涵式 成长和外延式成长。内涵式成长是通过劳动生产率的提升获得的成长,比如技术进步,企业生产的产品从低附加值变为高附加值;品牌价值提高,售价上升;知名 度、用户忠诚度提高,客流量增大等。外延式成长是资本投入增加、收购兼并带来的成长,最典型的 有银行业的高成长,银行贷款增长,在资本充足率的约束下,就要不断的再融资,而且金额巨大,这是二级市场银行股市盈率偏低的一个重要原因。对于银行来讲, 中间业务的增长不消耗大量资本金,是内涵式增长,我们在考察银行股价值的时候,看它中间业务占收入的比重以及成长速度是重要的内容。对于两种成长,应该说 内涵式成长优于外延式成长,但外延式成长在某些阶段是必不可少的一环。比如啤酒行业通过收购兼并之后,现在基本上是以青岛、燕京、华润雪花三家占主导地 位,价格战不再激烈,整体盈利水平稳步提升。现在连锁超市业、农业食品业也正处在跑马圈地的历史阶段,在这个阶段,企业的盈利能力可能并不理想,但是一旦 行业整合结束,企业经营业绩就有可能出现迅速回升,对这类企业的估值,我们要有前瞻性。内涵式成长给股东的回报更大,内涵式成长优于外延式成长,但是不可 偏废,两者都很重要。
从企业成长周期过程看,成长分为线性成长和非线性成长。线性成长就是企业在成长过程中表现的非常平稳,每年都能保 持较一定的成长速度。如万科、招行、贵州茅台、苏宁电器这样的企业,尽管每一年成长速度还是有起伏,但是不会让我们太意外。但是有一些企业可能一直都在亏 损,在烧钱,可是一旦认知度提高,商业模式得到认可,业绩可能出现爆炸式成长。典型的就是互联网企业,才开始就是烧钱,不看业绩,看点击率,可是到他开始 收费的时候业绩好的惊人,比如腾讯、百度等。在纳斯达克上市的百度,其搜索服务模式得到认同后,每年净利润以100%以上的速度成长,其中2005年及 2006年分别增长了297%和534%。现在的淘宝网对于买卖双方都免费,现在不怎么赚钱,但人流量大的惊人,一旦确立好的盈利模式,业绩也会令人惊 叹。再比如新能源行业,一旦技术取得突破,市场会迅速扩大,将来的业绩也会超出我们的想象。对于这种非线性成长的可能性我们要特别留意。另外,资产重组也 是一种非线性成长,突然之间脱胎换股,业绩好的惊人,给投资者带来巨大回报。应该说非线性成长,更不易被投资者认识,也就潜伏者更大的机会,也更有魅力。
关注企业成长,还要看企业可能的成长空间,也就是市场的容量。有些行业很小,全世界加在一起可能就百十亿,几百亿,一旦企业占据了足够的份额,就没有成 长的空间了,企业就碰到了天花板。就需要企业重新做战略选择,开始"二次创业"。"二次创业"风险很大,不要以为别人那碗饭好吃,所以巴菲特有时候就劝企 业别再扩张,而是选择分红或者是回购股票,这样也能增加股东的价值。我们市场中中集集团、瑞贝卡(假发行业的龙头)等世界第一的企业就是如此,虽然是世界 第一,但成长性不再,投资价值也不大。此外,一个企业占整个行业的30%,就居于相对垄断的地位,进一步增长市场占有率就要遭遇许许多多的障碍,所以 30%市场占有率也往往被视作一个成长的瓶颈。在做个股选择的时候我们强调要选大行业的小龙头,就是在于成长空间巨大,股价具备上涨十倍的可能。如果是大 行业的大龙头,像中石油、工商银行,市场占有率那么高,已经不具备高成长的可能,或者像瑞贝卡这样小行业的小龙头,也不具备高成长的空间。虽然是龙头股, 都没有太大的投资价值,至少对于我们这样张口闭口涨十倍的投资者是如此。
网易历六年耗亿资打造,3D国韵网游《天下贰》,免费领光盘
2009年10月10日星期六
不是书评 :《我是一只IT小小鸟》
设计你自己的进度条
进度条的设计是一个很多人都知道的故事:同样的耗时,如果不给任何进度提示,只是在完成之后才弹出一个完成消息,中间没有任何动态变化,那么整个过程就会让人等得非常焦急,导致一些人干脆把程序关了了事。如果有进度不断更新,那么对整个过程耗时的心理感受就会远低于实际值,用户也不会郁闷到把程序关了。(你有多少次在银行处理手续的时候,看着工作人员把一堆材料不停地倒腾来去,心里多希望他们可以在柜台小窗口上投影一个进度条?)
这里的原因在于,没有进度提示的话,我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条,那么我们对于什么时候会达到100%就会有一个粗略的估计,这个估计是一剂定心丸,让我们知道这事情总会并且会在不久的将来完成。
做事情也是同样的道理,善于规划的人,会将目标分割成一个个的里程碑,再将里程碑分割成TODO列表。前阵子流行的GTD方法学,核心的理念就在于,如果你把任务分割了,你就有了进度条,你就知道,事情在不断的进展,你总会完成任务或到达你的目标,你会有一个时间估计。反之如果没有这个分割,整个的任务或目标对你来说就只有两种状态——"完成"和"未完成",如果不幸是一个比较漫长的目标,那么你会发现你的进度条总是"未完成",一次又一次的等待未果会耗尽你的耐心,让你下意识的产生"这事什么时候才能完呢?"的疑惑,没有分而治之,你就不知道未来还需要付出多少努力才能达到目的,这就会让你心生怯意,不敢进一步投入时间,免得血本无归。在这样的心理下,不少人就会选择保守策略——退出,以免到头来花了时间还一事无成。
而所谓的规划其实就是针对这种心理弱点的做事方法。如果你对整个目标的几个重大步骤有清晰的界定,能够对每个步骤的耗时作出靠谱的上界估计,你就不会被不确定的未来,不确定的时间投入感到恐惧,就不会被这种不确定感压迫到过早退出。
不要过早退出循环
我们在尝试新的事物的时候,总是会遇到各种各样的困难,不同的人会在碰壁不同的次数之后退出。用程序员喜欢的话来说就是,我们都在for循环,区别在于你是什么情况下break;的。有的人退出阈值高,这是能坚持的一类人,有的人退出阈值低,这类人很可能遇到一些障碍就退出了。
过早退出的原因往往在于对于未来的不确定性,对于投资时间最终无法收到回报的恐惧,感受到的困难越大,这种恐惧越大,因为越大的困难往往暗示着这个任务需要投资的时间越大。所以其实我们都是直觉经济学家,当我们说"畏难"的时候,其实我们畏惧的不是困难本身,而是困难所暗示的时间经济学意义。
然而,我们的情绪大脑毕竟比较原始,仅根据碰壁的次数或硬度来判断事情的难易并不一定靠谱,如果你遇到困难,不妨用一用互联网,用一用群体的智慧,看看别人当时是怎么想怎么办的,绝大多数情况下你并不孤单,你遇到的问题早就有人遇到过,你踩过的坑里面尽是前人的脚印,不要仅仅因为一时摸不着头绪,找不着出路就退出,这不是informed
decision,问一问自己作出退出的决策是否基于足够的信息,我是否进行了足够的调查,至少,是否去简单用了用搜索引擎。
模仿高德纳先生的名言:过早退出是一切失败的根源。
兴趣遍地都是,专注和持之以恒才是真正稀缺的。
很多人看了书中的故事之后得出这样的结论:兴趣最重要。然而,我觉得区别他们和其他人的,并不是他们拥有超过常人的兴趣,而是他们拥有超过常人的毅力。
其实人天生就对新事物怀有好奇心,难以找出谁没有对任何事物或领域产生过兴趣,然而不同的是,有些人的兴趣只能持续几天,当遇到第一个困难,第一道坎的时候,他们就熄灭了,然而另一些人的兴趣火花会变成火苗,火苗会变成火种,一直稳定的燃烧很多年。区别他们的并不是兴趣的有无,而是他们的性格里面有没有维持兴趣的火种一直燃烧下去的燃料。
一个人有专注和持之以恒的性格,即便在一个没有多大兴趣的领域也能成为专家(更何况,兴趣的很大一类来源就是"我擅长做这件事情");反之就算有兴趣也很快会被一些冷水泼灭。
生活中的选择远比我们想象得要多,细微的选择差异造就了不同的人生
唐雅薇同学的故事中,有这么一个细节吸引了我的注意:当时她正在找工作阶段,对女生在IT行业的发展很迷茫,恰逢微软的郭蓓菁女士到他们学校演讲,演讲完了之后她立即就奔上讲台拦住郭女士询问女生与IT的问题。
这是一个细节,但我相信不是所有人都有勇气上去拦住名人问普通问题的,我们会给自己找很多很多的理由和接口,我想最常见的应该是两个原因:1.
如果被批评了自尊心会受到打击。2.认为问了也问不出特别的信息。然而事实却是相反:1.
自尊心受到打击算不上实质性的损失。2.
你想不出能问出什么特别的信息并不代表就真的问不到重要的信息。别把不知道当成没有。
一个小小的思维差异,可能导致很多人在遇到困惑的时候原地打转,冲突不出,而另一些人则取经得到宝贵的经验,站在别人的肩膀上越过了障碍。唐雅薇从郭女士那儿得到了最宝贵的信息:女生在IT行业也能有很好的发展。信心,是这样一种奇怪的东西,就算你没有确切的证明未来会更好,你也会坚持下去,你不会过早退出循环;而来源于过来人的信息则是信心最靠谱的保障。
你是不是意识到,在平常的生活中,你所作出的选择比你想象的要多得多呢?有没有想过有一些看似细小的选择可能会产生巨大的影响?
想想看,试一下,是不是真的没什么损失,还有可能得到巨大的回报呢?
靠专业技能的成功是最具可复制性的
它需要的只是你在一个领域坚持不懈地专注下去,只需要选择一个不算太不靠谱的方向,然后专心致志的专下去,最后必然能成为高手或者绝顶高手。世上有很多成功带有偶然因素和运气成分或出身环境,但至少这一样,被无数人复制了无数遍,否则就不会存在学校和教育了。
反思是让人得以改进自己的最重要的思维品质
很多人在成年之后甚至未及成年,性格就难以再发生大的变化。性格是这样一种自我实现和强化的陷阱:如果你是不容易专注的人,你会发现生活中处处都是分散你注意力的东西,你的思维难以在一个事情上停留半小时,于是你的时间变得琐碎,你很难在一个领域有长久的积累和深入的思考,这样的现实可能会让你感到沮丧,后者让你更加无法专心,这样的现实可能会让你感到焦虑,为了避开焦虑你又会去寻求其他的刺激,结果是恶性循环。
反思是改变自己的第一步,我们常常容易发现别人的问题,别人的错误,却难以发现自己思维中的问题,因为我们很少会把自己的思维当成目标去思考。
作为程序员,相信没有人不知道能修改自身的程序,而能修改自身的程序的前提就是,首先这个程序必须有法子能够指向自身。
饿死在干草堆之间的驴子
有很多在迷茫期的同学,迷茫都是相似的:面前有两条路,到底选哪一条?"转行还是不转行?""学C++还是学Java。?"做管理还是做程序员?"有些问题其实不是问题:比如"学C++还是学Java。"答案是都学而且还不仅学两个。有些问题不是一个泛泛的答案能够适合的,比如转行还是不转行,需要考虑很多自身因素。
但更重要的是,有人会因为无法作出决定就推迟决定,然而实际上推迟决定是最差的决定,在推迟决定期间,时间悄悄流逝,你却没有任何一条路上的积累,白白浪费了时间。
如果你有一些钱不知道花在A还是B上,你先不作决定,没问题,因为钱还是你的,但如果你有一些时间,不知道花在A上还是B上,不行,因为过了这段时间,这段时间就不是你的了。
所以,不管有多纠结,也不要从纠结中逃离,试图推延决定,既然终究是个痛苦的决定,就痛一回,好好思考和调查之后作出一个决定并坚持下去,只要不是太不靠谱的行业(相信也没谁会在纠结了之后却选了一个不靠谱的行业的),经过你的积累总会成为高手。
一生的知识积累,自学的起码占90%
你会在这本书当中看到的一个重复出现的现象就是自学,大规模的自学,逃课自学,上网找书自学,程序员行业是最适合自学的行业,网络是程序员的天堂,需要的资源、工具,比课堂上的多出何止百倍,如果说还有一个学科,并不需要传统的教育就可以成才,估计非程序员莫属了。作为程序员如果没有查过wikipedia,没有看过几本原版电子书,没有在国内外主要邮件列表里面提过问题吵过架,没有用技术博客记录学习的独特体会,没有订阅技术牛人们的博客,怎么好意思说身在这个行业呢?
最后,看完了书还是说"说起来容易做起来难"的,怪自己,不怪书。
进度条的设计是一个很多人都知道的故事:同样的耗时,如果不给任何进度提示,只是在完成之后才弹出一个完成消息,中间没有任何动态变化,那么整个过程就会让人等得非常焦急,导致一些人干脆把程序关了了事。如果有进度不断更新,那么对整个过程耗时的心理感受就会远低于实际值,用户也不会郁闷到把程序关了。(你有多少次在银行处理手续的时候,看着工作人员把一堆材料不停地倒腾来去,心里多希望他们可以在柜台小窗口上投影一个进度条?)
这里的原因在于,没有进度提示的话,我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条,那么我们对于什么时候会达到100%就会有一个粗略的估计,这个估计是一剂定心丸,让我们知道这事情总会并且会在不久的将来完成。
做事情也是同样的道理,善于规划的人,会将目标分割成一个个的里程碑,再将里程碑分割成TODO列表。前阵子流行的GTD方法学,核心的理念就在于,如果你把任务分割了,你就有了进度条,你就知道,事情在不断的进展,你总会完成任务或到达你的目标,你会有一个时间估计。反之如果没有这个分割,整个的任务或目标对你来说就只有两种状态——"完成"和"未完成",如果不幸是一个比较漫长的目标,那么你会发现你的进度条总是"未完成",一次又一次的等待未果会耗尽你的耐心,让你下意识的产生"这事什么时候才能完呢?"的疑惑,没有分而治之,你就不知道未来还需要付出多少努力才能达到目的,这就会让你心生怯意,不敢进一步投入时间,免得血本无归。在这样的心理下,不少人就会选择保守策略——退出,以免到头来花了时间还一事无成。
而所谓的规划其实就是针对这种心理弱点的做事方法。如果你对整个目标的几个重大步骤有清晰的界定,能够对每个步骤的耗时作出靠谱的上界估计,你就不会被不确定的未来,不确定的时间投入感到恐惧,就不会被这种不确定感压迫到过早退出。
不要过早退出循环
我们在尝试新的事物的时候,总是会遇到各种各样的困难,不同的人会在碰壁不同的次数之后退出。用程序员喜欢的话来说就是,我们都在for循环,区别在于你是什么情况下break;的。有的人退出阈值高,这是能坚持的一类人,有的人退出阈值低,这类人很可能遇到一些障碍就退出了。
过早退出的原因往往在于对于未来的不确定性,对于投资时间最终无法收到回报的恐惧,感受到的困难越大,这种恐惧越大,因为越大的困难往往暗示着这个任务需要投资的时间越大。所以其实我们都是直觉经济学家,当我们说"畏难"的时候,其实我们畏惧的不是困难本身,而是困难所暗示的时间经济学意义。
然而,我们的情绪大脑毕竟比较原始,仅根据碰壁的次数或硬度来判断事情的难易并不一定靠谱,如果你遇到困难,不妨用一用互联网,用一用群体的智慧,看看别人当时是怎么想怎么办的,绝大多数情况下你并不孤单,你遇到的问题早就有人遇到过,你踩过的坑里面尽是前人的脚印,不要仅仅因为一时摸不着头绪,找不着出路就退出,这不是informed
decision,问一问自己作出退出的决策是否基于足够的信息,我是否进行了足够的调查,至少,是否去简单用了用搜索引擎。
模仿高德纳先生的名言:过早退出是一切失败的根源。
兴趣遍地都是,专注和持之以恒才是真正稀缺的。
很多人看了书中的故事之后得出这样的结论:兴趣最重要。然而,我觉得区别他们和其他人的,并不是他们拥有超过常人的兴趣,而是他们拥有超过常人的毅力。
其实人天生就对新事物怀有好奇心,难以找出谁没有对任何事物或领域产生过兴趣,然而不同的是,有些人的兴趣只能持续几天,当遇到第一个困难,第一道坎的时候,他们就熄灭了,然而另一些人的兴趣火花会变成火苗,火苗会变成火种,一直稳定的燃烧很多年。区别他们的并不是兴趣的有无,而是他们的性格里面有没有维持兴趣的火种一直燃烧下去的燃料。
一个人有专注和持之以恒的性格,即便在一个没有多大兴趣的领域也能成为专家(更何况,兴趣的很大一类来源就是"我擅长做这件事情");反之就算有兴趣也很快会被一些冷水泼灭。
生活中的选择远比我们想象得要多,细微的选择差异造就了不同的人生
唐雅薇同学的故事中,有这么一个细节吸引了我的注意:当时她正在找工作阶段,对女生在IT行业的发展很迷茫,恰逢微软的郭蓓菁女士到他们学校演讲,演讲完了之后她立即就奔上讲台拦住郭女士询问女生与IT的问题。
这是一个细节,但我相信不是所有人都有勇气上去拦住名人问普通问题的,我们会给自己找很多很多的理由和接口,我想最常见的应该是两个原因:1.
如果被批评了自尊心会受到打击。2.认为问了也问不出特别的信息。然而事实却是相反:1.
自尊心受到打击算不上实质性的损失。2.
你想不出能问出什么特别的信息并不代表就真的问不到重要的信息。别把不知道当成没有。
一个小小的思维差异,可能导致很多人在遇到困惑的时候原地打转,冲突不出,而另一些人则取经得到宝贵的经验,站在别人的肩膀上越过了障碍。唐雅薇从郭女士那儿得到了最宝贵的信息:女生在IT行业也能有很好的发展。信心,是这样一种奇怪的东西,就算你没有确切的证明未来会更好,你也会坚持下去,你不会过早退出循环;而来源于过来人的信息则是信心最靠谱的保障。
你是不是意识到,在平常的生活中,你所作出的选择比你想象的要多得多呢?有没有想过有一些看似细小的选择可能会产生巨大的影响?
想想看,试一下,是不是真的没什么损失,还有可能得到巨大的回报呢?
靠专业技能的成功是最具可复制性的
它需要的只是你在一个领域坚持不懈地专注下去,只需要选择一个不算太不靠谱的方向,然后专心致志的专下去,最后必然能成为高手或者绝顶高手。世上有很多成功带有偶然因素和运气成分或出身环境,但至少这一样,被无数人复制了无数遍,否则就不会存在学校和教育了。
反思是让人得以改进自己的最重要的思维品质
很多人在成年之后甚至未及成年,性格就难以再发生大的变化。性格是这样一种自我实现和强化的陷阱:如果你是不容易专注的人,你会发现生活中处处都是分散你注意力的东西,你的思维难以在一个事情上停留半小时,于是你的时间变得琐碎,你很难在一个领域有长久的积累和深入的思考,这样的现实可能会让你感到沮丧,后者让你更加无法专心,这样的现实可能会让你感到焦虑,为了避开焦虑你又会去寻求其他的刺激,结果是恶性循环。
反思是改变自己的第一步,我们常常容易发现别人的问题,别人的错误,却难以发现自己思维中的问题,因为我们很少会把自己的思维当成目标去思考。
作为程序员,相信没有人不知道能修改自身的程序,而能修改自身的程序的前提就是,首先这个程序必须有法子能够指向自身。
饿死在干草堆之间的驴子
有很多在迷茫期的同学,迷茫都是相似的:面前有两条路,到底选哪一条?"转行还是不转行?""学C++还是学Java。?"做管理还是做程序员?"有些问题其实不是问题:比如"学C++还是学Java。"答案是都学而且还不仅学两个。有些问题不是一个泛泛的答案能够适合的,比如转行还是不转行,需要考虑很多自身因素。
但更重要的是,有人会因为无法作出决定就推迟决定,然而实际上推迟决定是最差的决定,在推迟决定期间,时间悄悄流逝,你却没有任何一条路上的积累,白白浪费了时间。
如果你有一些钱不知道花在A还是B上,你先不作决定,没问题,因为钱还是你的,但如果你有一些时间,不知道花在A上还是B上,不行,因为过了这段时间,这段时间就不是你的了。
所以,不管有多纠结,也不要从纠结中逃离,试图推延决定,既然终究是个痛苦的决定,就痛一回,好好思考和调查之后作出一个决定并坚持下去,只要不是太不靠谱的行业(相信也没谁会在纠结了之后却选了一个不靠谱的行业的),经过你的积累总会成为高手。
一生的知识积累,自学的起码占90%
你会在这本书当中看到的一个重复出现的现象就是自学,大规模的自学,逃课自学,上网找书自学,程序员行业是最适合自学的行业,网络是程序员的天堂,需要的资源、工具,比课堂上的多出何止百倍,如果说还有一个学科,并不需要传统的教育就可以成才,估计非程序员莫属了。作为程序员如果没有查过wikipedia,没有看过几本原版电子书,没有在国内外主要邮件列表里面提过问题吵过架,没有用技术博客记录学习的独特体会,没有订阅技术牛人们的博客,怎么好意思说身在这个行业呢?
最后,看完了书还是说"说起来容易做起来难"的,怪自己,不怪书。
Linux文件编码格式转换
在Linux命令行下查看看文件的编码
enca 文件名
linux文件名编码批量转换
convmv -f 源编码 -t 新编码 [选项] 文件名
enca 文件名
linux文件名编码批量转换
convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest
真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK --notest utf8编码的文件名
Linux下批量转换文件内容编码
1.使用enca,例如要把当前目录下的所有文件都转成utf-8
$enca -x utf-8 *
2,使用iconv 转换
iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
比如将一个UTF-8 编码的文件转换成GBK编码
iconv -f GBK -t UTF-8 file1 -o file2
2009年10月9日星期五
何以富裕
假期里原来的同事聚会,众人感慨,A城市的居民如何如何地富裕。正好我刚从那里回来,有些所见所闻。试想一下,一个工薪阶层的人,依靠工资如何能够达到富裕的程度?有句老话说:人无外财不富,马无夜草不肥。不过能够捞得外财的人,多是有些权力在手,并需要冒着风险去做某种交换的。这当然不是我们普通人发财的途径,也不是值得讨论在这里讨论的路子,虽然此种途径已经成为当今社会的"发财捷径"。
其实,A地人有钱的原因是他们手里的房子升值很多,因为当地财政收入的连年增长,城市的发展速度很快,导致手中的房产翻倍地上涨。更有些聪明的,卖出再买进,于是房子也有了,还有了赚到的可以消费的现金,给人感觉很有钱的样子。
从这里,我们能够看到致富的基本道路,就是要拥有资产。
从赚钱的角度来说,最有用的和最没用的都是货币。最有用好理解,最没用是因为货币本身的回报率很低,你想想银行存款的利息收入就明白。所以,要想富,必须把货币转化为某种资产,然后再转回到货币。
经营企业的人都明白这个道理,一旦募集到资金,总是尽快地把现金变成土地、房子或者原材料,让现金以不同的资产状态运行起来。工作的人,却因为害怕风险,一旦工资到手,便紧紧握住,存入银行,赚取点滴的利息。而这些存起来的钱,被敢冒风险的人借去,变化成各种资产形态进行经营。由此,穷者愈穷、富者愈富。这背后的逻辑或许就在于两类人群对现金的不同用法。
把现金转换为"资产"的过程,我们称为投资,所以,投资是富裕的基本途径。
即是投资,那一定有风险。根据投资对象的不同,比如房产投资和股票投资,投资的风险也有很大差别。另外,投资风险与个人的判断力也有很大关系。即使是股票投资,不是也有很多人讲"只做自己能够熟悉的行业"吗?理解投资对象,是风险控制的前提。
其次投资还有一个核心要点,是要有长远的眼光。投资股票,你选择未来很长一段时间,发展会有保障的那些企业,风险小得多,投资成功的希望大得多。投资房地产也是,持续繁荣的地方,升值潜力要大很多。
这方面,讲讲做企业的例子可能更有启发。
曾见过不少人感叹,我如果还在某某企业一直做到现在,也已经拿到不少股权了,算算帐我也是百万千万富翁的了。那为什么没有坚持下来?核心的问题是他需要"当下兑现"。我做得好,那就要高的薪水,如果你不能支付,我换一家。或者是说,我这人就是"卖技术的",一单一算好了,那些"商业的规则"我也不懂。看明白了?他要的是"薪水"。后来发现股权值钱的时候,他又想要"股权"。其实什么是商业规则?规则就是如果你想要股权,你就得像股东一样思考,然后向股东一样行为。这样,你的努力和时间应折算的"薪水",就会像公司股东的投资资本一样注入企业,不能"当下兑现"。而且,一旦企业完蛋了,你的"投资"也就没了。
还是那句话"鱼与熊掌,不可兼得",因为,鱼在海里,熊在山里。你只能选择去一个地方,一旦选择,不能后悔。后悔了,还诉说"假如",或者"酸讽"坚持下来的人"愚忠",那你不仅失去了下一次成为股东的机会,更贻笑大方。
所以,致富需要投资。但投资这件事情,既需要冒风险,也需要长远的眼光,孰非易事。可见,致富非易事。
其实,A地人有钱的原因是他们手里的房子升值很多,因为当地财政收入的连年增长,城市的发展速度很快,导致手中的房产翻倍地上涨。更有些聪明的,卖出再买进,于是房子也有了,还有了赚到的可以消费的现金,给人感觉很有钱的样子。
从这里,我们能够看到致富的基本道路,就是要拥有资产。
从赚钱的角度来说,最有用的和最没用的都是货币。最有用好理解,最没用是因为货币本身的回报率很低,你想想银行存款的利息收入就明白。所以,要想富,必须把货币转化为某种资产,然后再转回到货币。
经营企业的人都明白这个道理,一旦募集到资金,总是尽快地把现金变成土地、房子或者原材料,让现金以不同的资产状态运行起来。工作的人,却因为害怕风险,一旦工资到手,便紧紧握住,存入银行,赚取点滴的利息。而这些存起来的钱,被敢冒风险的人借去,变化成各种资产形态进行经营。由此,穷者愈穷、富者愈富。这背后的逻辑或许就在于两类人群对现金的不同用法。
把现金转换为"资产"的过程,我们称为投资,所以,投资是富裕的基本途径。
即是投资,那一定有风险。根据投资对象的不同,比如房产投资和股票投资,投资的风险也有很大差别。另外,投资风险与个人的判断力也有很大关系。即使是股票投资,不是也有很多人讲"只做自己能够熟悉的行业"吗?理解投资对象,是风险控制的前提。
其次投资还有一个核心要点,是要有长远的眼光。投资股票,你选择未来很长一段时间,发展会有保障的那些企业,风险小得多,投资成功的希望大得多。投资房地产也是,持续繁荣的地方,升值潜力要大很多。
这方面,讲讲做企业的例子可能更有启发。
曾见过不少人感叹,我如果还在某某企业一直做到现在,也已经拿到不少股权了,算算帐我也是百万千万富翁的了。那为什么没有坚持下来?核心的问题是他需要"当下兑现"。我做得好,那就要高的薪水,如果你不能支付,我换一家。或者是说,我这人就是"卖技术的",一单一算好了,那些"商业的规则"我也不懂。看明白了?他要的是"薪水"。后来发现股权值钱的时候,他又想要"股权"。其实什么是商业规则?规则就是如果你想要股权,你就得像股东一样思考,然后向股东一样行为。这样,你的努力和时间应折算的"薪水",就会像公司股东的投资资本一样注入企业,不能"当下兑现"。而且,一旦企业完蛋了,你的"投资"也就没了。
还是那句话"鱼与熊掌,不可兼得",因为,鱼在海里,熊在山里。你只能选择去一个地方,一旦选择,不能后悔。后悔了,还诉说"假如",或者"酸讽"坚持下来的人"愚忠",那你不仅失去了下一次成为股东的机会,更贻笑大方。
所以,致富需要投资。但投资这件事情,既需要冒风险,也需要长远的眼光,孰非易事。可见,致富非易事。
2009年10月8日星期四
我和脂肪做斗争,差点没牺牲
1、执子之手,将子拖走。子若不走,拍晕了继续拖走~!
2、夏天就是不好,穷的时候连西北风都没得喝。
3、我和脂肪做斗争,差点没牺牲
4、啥,就给我个经济适用坟好了。
5. 将薪比薪的想一下,算了,不想活了。
6. 只要给够加班费 ~当牛作马无所谓~~
7. 再丑也要谈恋爱,谈到世界充满爱。
8. 不吃饱哪有力气减肥!!
9. 所谓的单纯,长了翅膀的就是天使,没长翅膀的就是白痴。
10.除了诱惑,我什么都能抵挡~~
11. 老子曰:睡可睡,非常睡。
12. 老婆说要看闪电,我拿菜刀砍电线。
13. 最近工作不突出,业绩不突出,腰椎间盘有点突出。
14. 我人生只会两件事 1 这也不会 2 那也不会
15. 除了金庸,J.K.罗琳写的7本书也可以连成一句话:"哈哈哈哈哈哈哈"
16. 人不犯我~~我不犯人~~人若犯我~~我就生气~~~
17. 关门一个月,不要叫我,因为一叫我我就会出来……
18. 出租车司机,司机中的战斗机,噢耶!
19. 康夫你辞职的时候有没有考虑过哆啦A梦的感受!(去年日本首相宣布辞职时写的)
20. 你给我滚,马不停蹄的滚……
21. 人生最大的悲哀是青春不在,青春痘却还在。
22. 我走我的阳光道,你过你的奈何桥。
23. 我们的宗旨是:为人民币服务!
24. 当你披上了婚纱 我也披上了袈裟~~
25. 每当困难的时候我就念藏经:"噢嘛呢哞嘛哄",翻译成英文就是:All money go my home!
26. 最简单的长寿秘决--------------保持呼吸,不要断气~~
27. 等我有钱了,我就买一辆公交车,专门走公交专用车道,专门停在公交车站,等有人想上车了,我就说:对不起,这是私家车~~
28. 善良就是别人挨饿的时候,我吃肉不bia ji 嘴~~
29. 钱对你真的就那么重要吗?讲了3个多小时了一分钱都不降。
30. 你曾经对我说,会永远爱着我,爱情这东西我明白,但永远是什么?
31. 七岁的小男孩是地球上最可怕的生物,他们有好奇心、行动力、破坏力以及《未成年人保护法》。
32. 人贵在言而有信——我说不还钱就不还钱!
33. 我说:"要有上班以外的生活!"于是,有了加班。
2、夏天就是不好,穷的时候连西北风都没得喝。
3、我和脂肪做斗争,差点没牺牲
4、啥,就给我个经济适用坟好了。
5. 将薪比薪的想一下,算了,不想活了。
6. 只要给够加班费 ~当牛作马无所谓~~
7. 再丑也要谈恋爱,谈到世界充满爱。
8. 不吃饱哪有力气减肥!!
9. 所谓的单纯,长了翅膀的就是天使,没长翅膀的就是白痴。
10.除了诱惑,我什么都能抵挡~~
11. 老子曰:睡可睡,非常睡。
12. 老婆说要看闪电,我拿菜刀砍电线。
13. 最近工作不突出,业绩不突出,腰椎间盘有点突出。
14. 我人生只会两件事 1 这也不会 2 那也不会
15. 除了金庸,J.K.罗琳写的7本书也可以连成一句话:"哈哈哈哈哈哈哈"
16. 人不犯我~~我不犯人~~人若犯我~~我就生气~~~
17. 关门一个月,不要叫我,因为一叫我我就会出来……
18. 出租车司机,司机中的战斗机,噢耶!
19. 康夫你辞职的时候有没有考虑过哆啦A梦的感受!(去年日本首相宣布辞职时写的)
20. 你给我滚,马不停蹄的滚……
21. 人生最大的悲哀是青春不在,青春痘却还在。
22. 我走我的阳光道,你过你的奈何桥。
23. 我们的宗旨是:为人民币服务!
24. 当你披上了婚纱 我也披上了袈裟~~
25. 每当困难的时候我就念藏经:"噢嘛呢哞嘛哄",翻译成英文就是:All money go my home!
26. 最简单的长寿秘决--------------保持呼吸,不要断气~~
27. 等我有钱了,我就买一辆公交车,专门走公交专用车道,专门停在公交车站,等有人想上车了,我就说:对不起,这是私家车~~
28. 善良就是别人挨饿的时候,我吃肉不bia ji 嘴~~
29. 钱对你真的就那么重要吗?讲了3个多小时了一分钱都不降。
30. 你曾经对我说,会永远爱着我,爱情这东西我明白,但永远是什么?
31. 七岁的小男孩是地球上最可怕的生物,他们有好奇心、行动力、破坏力以及《未成年人保护法》。
32. 人贵在言而有信——我说不还钱就不还钱!
33. 我说:"要有上班以外的生活!"于是,有了加班。
09年新晋3D主流网游《天下贰》,网易六年亿资打造
订阅:
博文 (Atom)