2010年2月27日星期六

C++开发游戏手柄代码 (Developing the Joystick Code)

还是坚持每周一博,照例写正文前废话一段:最近天气越来越好,不下雪了,偶尔下点雨,下了一次冰雹,但可以看到10+的温度了,晚上6点坐车回家的时候天还是是微亮。哈,德国的春天终于来了。
迫于项目时间的压力,项目只剩下最后一周的时间,本周的工作效率还不错,写了非常多的代码,突然发现,我最近最能集中心力,最具生产力的时段是下午5到6点,就是回家前一个小时,似乎所有最有创造力的生产和想法都是在这个小时产生的,很奇怪。最近,所里的咖啡机又坏了,苦了很多人,有一个意大利同事对我说说,没有咖啡就不能Coffee in, Code out,没法编程了。还好我不喝咖啡,每天只喝茶,所里提供的各种奇怪的茶包(德国的茶包的种类真是多的恐怖,各种奇怪的口味都有,喝过一种咖喱口味的茶)。

好了闲话不多谈,今天谈谈关于游戏手柄joystick的代码开发,最近接触了一些多媒体子系统的Win32 API,其实非常容易,通过一些google可以找到非常多的源代码和示例代码,可以非常快的利用多媒体的Win32 API开发出一些很有趣的东西,游戏手柄joystick代码开发就是一个很经典的例子。支持游戏手柄现在是一个Win32的标准的一部分,多媒体子系统单独的Win32 API,其中支持游戏手柄是一个组成部分。但是关于游戏手柄的功能和数据结构没有定义在标准windows.h头文件,而是位于mmsystem.h中头文件。
上代码之前,一些说明:

[1]

要使用游戏手柄的Win32 API
#include <windows.h>
#include <mmsystem.h>

编译器请使用VS2005以上版本。

[2]

当然了不要忘记加入winmm.lib

[3]

JOYSTATE数据类型包括描述游戏手柄的State
例如

1: typedef WORD JOYSTATE; 
2: const JOYSTATE JOY_NONE = 0x0000L, 
3: JOY_LEFT = 0x0001L, 
4: JOY_RIGHT = 0x0002L, 
5: JOY_UP = 0x0004L, 
6: JOY_DOWN = 0x0008L,


[4]

我们要做的事就是,写出以下方法:

BOOL InitJoystick(); 
void CaptureJoystick(); 
void ReleaseJoystick(); 
void CheckJoystick();

 

[5]

CaptureJoystick()ReleaseJoystick()的方法就是使用使用两个Win32 functions就是:joySetCapture()joyReleaseCapture()
JOYINFO structure用于检索游戏手柄状态通过joyGetPos() function。

[6]

以下代码结合了Qt,也可以不需要Qt运行,只需要删除Qt部分的代码即可,使用了Qt的signal slot机制,利用了QTime的timeout()不断对CheckJoystick()进行调用,以及时更新Joystick状态。

[7]

BTP_Joystick以下的代码的主体部分来自网上的一些示例代码,我进行了一些修改和裁剪,编译和使用没有任何问题,我使用的是北通小手柄 BTP-C024 USB游戏手柄(如附图所示)进行测试,运行很好。以下代码非常简单,应该很容易理解,不要问我,为什么不能用,或者如何使用,如果不能用,请google或再看看代码(你已经有了完整的代码),呵呵。

 

 

 

 

/*
 * \file GameEngine.h
 * \class GameEngine
 * \date   2010
 * \bug
 * \warning
 *
 */

10 #ifndef GAMEENGINE_H_
11 #define GAMEENGINE_H_
12
13 #include <QtGui>
14
15 #include <windows.h>
16 #include <mmsystem.h>
17
18 //-----------------------------------------------------------------
19 // Joystick Flags
20 //-----------------------------------------------------------------
21 typedef WORD    JOYSTATE;
22 const JOYSTATE  JOY_NONE  = 0x0000L,
23                 JOY_LEFT  = 0x0001L,
24                 JOY_RIGHT = 0x0002L,
25                 JOY_UP    = 0x0004L,
26                 JOY_DOWN  = 0x0008L,
27                 JOY_FIRE1 = 0x0010L,
28                 JOY_FIRE2 = 0x0020L,
29                 JOY_FIRE3 = 0x0030L,
30                 JOY_FIRE4 = 0x0040L;
31
32 class GameEngine : public QObject
33 {
34     Q_OBJECT
35
36 public:
37
38     GameEngine();
39     ~GameEngine();
40
41     void HandleJoystick(JOYSTATE jsJoystickState);
42    
43     BOOL InitJoystick();
44     void CaptureJoystick();
45     void ReleaseJoystick();
46    
47     UINT m_uiJoystickID;
48     RECT m_rcJoystickTrip;
49     HWND m_hWindow;
50
51 protected:
52
53 private slots:
54     void CheckJoystick();
55
56 signals:
57     void joystickLeft();
58     void joystickRight();
59     void joystickUp();
60     void joystickDown();
61     void joystickButton1();
62     void joystickButton2();
63     void joystickButton3();
64     void joystickButton4();
65
66 private:
67     QTimer *_poller;
68
69 };
70
71 #endif /* GAMEENGINE_H_ */

 

1   /*
2    * \file GameEngine.cpp
3    * \class GameEngine
4    * \date   2010
5    * \bug
6    * \warning
7    *
8    */
9  
10  #include <QDebug>
11 
12  #include "GameEngine.h"
13 
14 
15  GameEngine::GameEngine()
16  {
17   
18      InitJoystick();
19      CaptureJoystick();
20 
21      //start timer to trigger every 100 ms 
22      _poller = new QTimer(this);
23      connect(_poller, SIGNAL(timeout()), this, SLOT(CheckJoystick()));
24      _poller->start(100); 
25  }
26 
27  GameEngine::~GameEngine()
28  {
29 
30  }
31 
32  BOOL GameEngine::InitJoystick()
33  {
34      // Make sure joystick driver is present
35      UINT uiNumJoysticks;
36      if ((uiNumJoysticks = joyGetNumDevs()) == 0)
37          return FALSE;
38 
39      // Make sure the joystick is attached
40      JOYINFO jiInfo;
41      if (joyGetPos(JOYSTICKID1, &jiInfo) != JOYERR_UNPLUGGED)
42          m_uiJoystickID = JOYSTICKID1;
43      else
44          return FALSE;
45     
46      // Calculate the trip values
47      JOYCAPS jcCaps;
48      joyGetDevCaps(m_uiJoystickID, &jcCaps, sizeof(JOYCAPS));
49      DWORD dwXCenter = ((DWORD)jcCaps.wXmin + jcCaps.wXmax) / 2;
50      DWORD dwYCenter = ((DWORD)jcCaps.wYmin + jcCaps.wYmax) / 2;
51      m_rcJoystickTrip.left = (jcCaps.wXmin + (WORD)dwXCenter) / 2;
52      m_rcJoystickTrip.right = (jcCaps.wXmax + (WORD)dwXCenter) / 2;
53      m_rcJoystickTrip.top = (jcCaps.wYmin + (WORD)dwYCenter) / 2;
54      m_rcJoystickTrip.bottom = (jcCaps.wYmax + (WORD)dwYCenter) / 2;
55      return TRUE;
56  }
57 
58  void GameEngine::CaptureJoystick()
59  {
60      // Capture the joystick
61      if (m_uiJoystickID == JOYSTICKID1)
62      {
63         joySetCapture(m_hWindow, m_uiJoystickID, NULL, TRUE);
64          qDebug() << " Capture Joystick success!";
65      }
66  }
67 
68  void GameEngine::ReleaseJoystick()
69  {
70      // Release the joystick
71      if (m_uiJoystickID == JOYSTICKID1)
72      joyReleaseCapture(m_uiJoystickID);
73  }
74 
75  void GameEngine::CheckJoystick()
76  {
77  if (m_uiJoystickID == JOYSTICKID1)
78  {
79     JOYINFO jiInfo;
80     JOYSTATE jsJoystickState = 0;
81     if (joyGetPos(m_uiJoystickID, &jiInfo) == JOYERR_NOERROR)
82     {
83          // Check horizontal movement
84          if (jiInfo.wXpos < (WORD)m_rcJoystickTrip.left)
85              jsJoystickState |= JOY_LEFT;
86            else if (jiInfo.wXpos > (WORD)m_rcJoystickTrip.right)
87              jsJoystickState |= JOY_RIGHT;
88             // Check vertical movement
89             if (jiInfo.wYpos < (WORD)m_rcJoystickTrip.top)
90              jsJoystickState |= JOY_UP;
91             else if (jiInfo.wYpos > (WORD)m_rcJoystickTrip.bottom)
92              jsJoystickState |= JOY_DOWN;
93             // Check buttons
94             if(jiInfo.wButtons & JOY_BUTTON1)
95              jsJoystickState |= JOY_FIRE1;
96             if(jiInfo.wButtons & JOY_BUTTON2)
97              jsJoystickState |= JOY_FIRE2;
98          if(jiInfo.wButtons & JOY_BUTTON3)
99              jsJoystickState |= JOY_FIRE3;
100         if(jiInfo.wButtons & JOY_BUTTON4)
101             jsJoystickState |= JOY_FIRE4;
102     }
103
104     // Allow the game to handle the joystick
105     HandleJoystick(jsJoystickState);
106     }
107 }
108
109 void GameEngine::HandleJoystick(JOYSTATE jsJoystickState)
110 {
111     //这里加入你自己对jsJoystickState的处理,以下只是极简单的示范
112     //通过HandleJoystick得到JOYSTATE
113    
114     //qDebug() << " get information about Joystick!" ;
115     if (jsJoystickState == JOY_UP)
116     {
117         qDebug() << " get Joystick -- JOY_UP!" ;   
118     }
119     else if (jsJoystickState == JOY_DOWN)
120     {
121         qDebug() << " get Joystick -- JOY_DOWN!" ;
122     }
123     else if (jsJoystickState == JOY_LEFT)
124     {
125         qDebug() << " get Joystick -- JOY_LEFT!" ;
126     }
127     else if (jsJoystickState == JOY_RIGHT)
128     {
129         qDebug() << " get Joystick -- JOY_RIGHT!" ;
130     }
131     else if (jsJoystickState == JOY_FIRE1)
132     {
133         qDebug() << " get Joystick -- JOY_FIRE1!" ;
134     }
135     else if (jsJoystickState == JOY_FIRE2)
136     {
137         qDebug() << " get Joystick -- JOY_FIRE2!" ;
138     }
139     else if (jsJoystickState == JOY_FIRE3)
140     {
141         qDebug() << " get Joystick -- JOY_FIRE3!" ;
142     }
143     else if (jsJoystickState == JOY_FIRE4)
144     {
145         qDebug() << " get Joystick -- JOY_FIRE4!" ;
146     }
147 }
148

Enjoy!

2010年2月20日星期六

Qt 自定义 Combo Box

这星期效率还不错,延续了上周的状态,写了非常多的代码,但是大部分都是低复杂度的”简单代码”,写了一些Gui。和一些同事不一样,我很喜欢写Gui,因为写完马上就可以看到成果,很有成就感,而且用Qt写Gui感觉就像堆积木,很简单,只要找到自己需要的API,我个人非常喜欢Qt风格的C++的应用程序接口,很清晰且简单,相当直觉化

customize_combo_box_qt这里和大家很简单谈一些我最近用Qt写Gui的发现的好玩特性,也许Qt的标准控件已经不能满足你了,其实,我们同样可以很容易地进行自定义控件,这里使用Combo Box作为例子。

以下代码会构建出我们自定义的Combo Box,如附图所示,这里使用了Qt Style Sheet

 

 

// set some self defined colors
QColor royalBlue;
QColor orange;
royalBlue.setRgb(65, 105, 225);
orange.setRgb(255, 165, 000);

// set default color
myComboBox->setStyleSheet("* { background-color: rgb(65, 105, 225) }");

myComboBox->insertItem(0, "blue");
myComboBox->setItemData(0, royalBlue, Qt::BackgroundRole);

myComboBox->insertItem(1, "red");
myComboBox->setItemData(1, Qt::red, Qt::BackgroundRole);

myComboBox->insertItem(2, "green");
myComboBox->setItemData(2, Qt::green, Qt::BackgroundRole);

myComboBox->insertItem(3, "yellow");
myComboBox->setItemData(3, Qt::yellow, Qt::BackgroundRole);

myComboBox->insertItem(4, "orange");
myComboBox->setItemData(4, orange, Qt::BackgroundRole);

myComboBox->insertItem(5, "cyan");
myComboBox->setItemData(5, Qt::cyan, Qt::BackgroundRole);

myComboBox->insertItem(6, "purple");
myComboBox->setItemData(6, Qt::magenta, Qt::BackgroundRole);

 

 

也许还不过瘾,我们还可以通过QPalette来自定义我们的Combo Box,以下是一个简单例子。

 QPalette myPalette = myComboBox->palette();

 // outline around the menu
 myPalette.setColor(QPalette::Window, Qt::red);    
 myPalette.setColor(QPalette::WindowText, Qt::white);

 // customize myComboBox button
 myPalette.setColor(QPalette::Button, Qt::darkCyan);  
 myPalette.setColor(QPalette::ButtonText, Qt::white);
 
 // customize myComboBox menu
 myPalette.setColor(QPalette::Base, Qt::darkCyan);  
 myPalette.setColor(QPalette::Text, Qt::white);

 // customize highlight button and menu
 myPalette.setColor(QPalette::Highlight, Qt::blue);   
 myPalette.setColor(QPalette::HighlightedText, Qt::red);
 
 // customize the disabled color
 myPalette.setColor(QPalette::Disabled, QPalette::Button, Qt::gray);
 myPalette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::lightGray);
 
 myComboBox->setPalette(myPalette);

2010年2月13日星期六

牛年最后一周碎碎念

虎年快乐 最近实在太冷了,天天下雪,附图是法国鳄鱼牌的一个平面广告,我觉得很应景,简单改造成贺卡,祝大家虎年快乐!!每到春节,就好想回国过年。当然了,在这里,我还是有一些小聚餐,譬如吃一些远不如国内丰盛的火锅,哈,聊补思乡之情。

 

关于工作,这个星期开始集中使用Googletest进行单元测试(Googletest架构不仅可以很好自动化执行,可以很方便地包含在持续开发构建中,更重要的是极度简单易用,我非常喜爱),新项目的“业务逻辑层”一部份采用了测试驱动开发。这个星期比较能够集中心力,大概写了>3000行的代码,这对于我来说已经是一个相当相当的高产的一周,个人相当满意进度。

 

本周还继续丢弃了一些旧模块(内部结构很混乱,复杂),重新设计并重写,其实很早以前就想重写,但是一直下不了决心,在代码的复杂度面前总是显得相当软弱,只有当代码几乎彻底“腐烂”,不能适应新系统,才不得不重写,这真是非常不好的习惯。一定要改掉这个恶习。这次重构采用了同事介绍的一个很简单的方法,我认为还不错,个人命名为“小任务驱动重构”。方法如下:先彻底地理解一下以前的代码,然后重新设计结构接口等等,再对整个重构写一个非常细致(一定要非常非常细致)的计划,然后得到一个长长的由一个个小任务组成的“计划书”,以极微小的“粒度”进行重写,每完成一个小任务,在计划中将其删除,这样做比较有成就感,重写的过程就像自己和自己竞赛,例如可以给自己定一些每天必须要完成小任务的数量,并时刻注意代码风格,变量命名和错误处理,如果觉得编码枯燥时,可以进行一些文档编写。

 

我最近写的机器人控制程序,只剩下一些系统同步模块还需完善,完成后就可以进行和机器人的联机测试了,很是兴奋,因为可以使用所里最新购买的迷你机器人Khepera 3进行实验,对这个新的“大玩具”很是期待。

2010年2月7日星期日

本周编程乱弹及《编程匠艺》书评

snow_upb_2010 附图是家附近的雪景,大概一个月雪都没化,德国今年真是非常非常冷,雪也下得相当疯狂,地球变暖?还是真的似乎进入了“小冰河时期”。这个星期当然还是继续坚持“每周五天,信息斋戒”。

这星期接触了ICE,相当不错并很有趣(简介:“Internet Communications Engine”,是一个中间件平台。作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插件,并且简单、高效和强大。与硬件架构无关,编程语言无关,完全线程化,采用TCP、IP 和UDP作为传输协议,客户端和服务器代码都不需要了解底层的传输机制。),并实现了一个应用。还在做一个重构,进行中,采用了一个方法,就是对这个重构任务进行分解,把他们分成非常小的工作单元。并使用了原型设计过程,创建一些可丢弃的原型。个人认为原型设计过程在一定程度上可以说是非常高效和稳定。最近还改了一些编码风格,以便更为适应我们内部的编码风格。

这个星期也和一些bug战斗很久,因为一些指针的输入错误或糟糕的指针算法在以前的代码中,产生了很多的段错误(简介:也称为“保护缺陷”。源自程序访问那些并没有分配给它们的存储单元,涉及,都非常容易造成这种错误。说白了就是“访问了不可访问的内存”)。个人经验教训就是: 千万不能盲目,一定要清楚这些代码如何运行,编写代码一定要谨慎,并做到更谨慎做更多“防御性编程”,这样才能更好地防止bug出现。

但是这个星期最大的经验教训,就是明白了一个道理:“程序的记录分类很重要,一定要要好好总结整理”。以前编过一个测试服务器网络的程序,居然忘记曾经编过,这个星期四又编了一遍,而且还不会编了:-( 极度痛苦,最后,突然发现以前的代码,当时真是泪流满面。这个星期,师兄对我上传的代码进行了代码审查据说这是提高自己的最佳方式。这也的确提高了我对代码的责任感,强迫自己提高代码质量,修正自己的代码更加易于理解,消除所有重复代码。

最近进行了很多思考,项目压力下,反而进行了更多的思考,总结。常常在想如何能够“创作出组织良好而且易于理解的代码”,并阅读了《编程匠艺》,挺值得推荐的。这里将我在豆瓣的书评附上。

 

据说,传说中理想的程序员应该具有以下品质:
政治家。必须很老练,去应付那些怪异代码猴子的小过失,能够协调人员。
亲切。可以愉快的和别人合作。
艺术感。可以设计出优雅的解决方案。
技术天才。编写的代码可靠耐用。
也许我们还远未达到这种地步。但是从这本书中可以体会并学习:理想的程序员的“一些实践经验,一些思考方式,一些正确的心态”。
我很喜欢阅读这种类型的书,读起来非常轻松,不是什么纯技术类的图书,但是从中又可以获得很多系统化的知识。这本书共有24章,很厚,但是每个章节间是“松耦合”,每章的结构相似,先分要点讨论一些问题如编程的各个要素或一些编程问题,最后总结,思考,再提出一些深入思考等等,我们大可以每天随意的找一些有兴趣的东西读一读。
书中有很多生动,睿智之语,有一句话印象比较深刻:“构建软件就像犯罪一样:当有组织时,就会做得更好。”
个人认为,程序员不要一味学习高深的编程技术,要更加关注编程的思想,方法,态度,这本书绝对适合放在案头,偶尔翻一翻,提醒自己是否像优秀的程序员一样思考和行动。当然了知易行难,将这些思想,方法,态度应用在实际工作中是一个很困难或“痛苦”的过程,但如果可以坚持实践,并结合自己进行深入思考,这样定可以向传说中理想的程序员前进。
附注,网上有很好的读书笔记,做的很仔细很完整,推荐,如果没有时间阅读本书,可以直接阅读这份笔记,网址如下:
http://www.cnblogs.com/wing011203/tag/编程匠艺/

2010年1月31日星期日

本星期的碎碎念

google_reader_week4 附图这是我这周的google reader的记录,已经坚持“每周五天,信息斋戒”4周了,赶快记录一下,肯定一下自己。应用积极心理学,将开心的事情,需要感激的事情,你被“自己”或其他人肯定的事情记录下来,这是一个获取幸福感的小窍门。

 

 


最近加入到一个师兄的项目,项目的难度对我而言比较大,但是当完成了一些部分,将代码上传后的幸福感和成就感真的是非常大的,以下我最近的一点小感悟:

    • 进入一个新的难度比较大的项目的时候,必须进行更有效的自我管理,还有必须学会更好的沟通(这个星期和师兄进行了很多沟通,他不愧是博士,在一些技术交流中学到了非常多的技术经验和思维方式,在有效的沟通中,也会有比较快的提高),然后找到属于自己的位置
    • 必须要承担尽可能多的责任,只有勇于承担责任,才会被赋予更大的责任,其实我们每个人的身上都蕴涵着极大的潜能,如果可以向一些困难的任务挑战,就可以不断打破我们内心的自我限制,充分发挥出自我潜能。
    • 当这个项目需要的能力远超过自身的能力的时候,应用积极心理学告诉自己,其实是一件好事,拼命让自己达到完成这个项目的能力。我很喜欢的一句话:"本周要努力得感动了自己","拼命","努力"其实没有什么标准,对我而言,最好的标准就是“是否能感动自己”。
    • 如果仔细观察每天我们花费时间的情况,就会发现其实我们每天都有很多空当,如果善用也会有很多的收获的。
    • 当遇到技术瓶颈,技术难题的时候,比较好的办法就是,先将问题划分成一些小部分(用上纸笔),再问问自己,看看是否自己可以把这些问题都说出来,然后将所有所需的知识点补齐,资料找齐,最后再根据情况对划分好的小问题进行各个击破。

 

 

继续碎碎念,我不谈经济,政治,来谈谈文化。只谈一点如何抗拒对“强势文化帝国主义”。随便写点什么,思维比较混乱。

这里当然说的是美国啦,美国文化殖民很恐怖,举一个例子,德国已经几乎沦陷,青少年看的都是MTV,VIVA(也属于美国MTV旗下),小朋友看的是迪斯尼卡通。新的一代听的都是美国流行Hip Hop,R&B,德国的音乐排行榜几乎被英语歌垄断,连选秀节目,选手唱的几乎都是英文歌,电影院里放映的几乎都是好莱坞电影... ...

如何对自己的文化更好的传承和发扬,找回对自己文化的自信,自豪和爱戴,这是很多国家当前面临很大的问题,当我们在不停的谩骂,调侃,批评,华语电影,音乐的时候,其实也应该庆幸,就是这些东西在抵御着强势文化帝国的侵袭。现在很多人都缺乏一种对自己文化的自尊和自信,如果能发挥出文化自信,这就是抗拒“强势文化帝国主义”的最好策略。

2010年1月23日星期六

继续削减不必要的事,提高时间使用效率

google_reader_week_3个人认为时间管理的关键第一点就是,就要先削减不必要的事,第二点是继续削减不必要的事,第三点才是使用一些方法提高时间的使用效率。附图是我最近google reader的阅读记录,我继续坚持了“每周五天,信息斋戒”,已经第三周,感觉真的不错。今天想讨论一下如何继续削减不必要的事,和提高时间使用效率的方法。

 

 

继续削减不必要的事:

#减少无意义的人际交流

关于这点,无需多言。

 

#减少无意义的搜索

看了一篇报道,探索系统的燃料是神经递质多巴胺,所以当我们搜索出什么的时候,那感觉非常好,感谢多巴胺吧——就像可卡因、安非他命这些毒品带来的刺激一样。几分钟就能完成的事,结果却发现不知不觉已经Google或百度了一个多小时? 这就是无意义的搜索,这个行为已经超出了我们搜索的本质目的,而是一种非常厉害的“杀时间的方法”。


#减少SNS(社交网络服务)的使用

滥用SNS这已经不是一种“杀时间的方法”,而是一种“时间自杀”。常常看到一些朋友“深陷”开心网,facebook也许还有豆瓣等等。请别过分地打发时间。一些时间管理的书谈到所谓时间管理的大智慧就是“取舍”,我们面对SNS的使用就是一种“取舍”,因人而异,请做出一些“取舍”。哈,也许可以采用“每周五天,SNS斋戒”这种比较极端的方法,我就是使用这种极端的方法。

 

提高时间使用效率:

使用一些方法提高时间使用效率,工作效率,方法很多,因人而异,我的原则就是选择容易坚持的手段,看一些书了解一些关于时间管理理论原则与方法后,结合个人生活实践进行使用。这里提供一些个人认为比较简单,经个人实践,认为容易实行的方法。

#把小事一件一件完成

切批萨的方式,将大任务细分,掌控时间进度是很重要的,每天花一点时间,把小事一件一件完成,过了一阵子就会发现,整个项目或任务已经做完了,自己也提高很多,这就是所谓积累时间的力量。 

 

#优先事务管理系统

简化生活,因为过于忙碌的时间安排会让人产生焦虑的感觉。使用所谓的“优先事务管理系统”,优先专注于工作和生活的最重要的事情或任务还有一些“关乎未来”的工作或学习。

 

(以下方法针对IT从业人员,其他行业的朋友可忽略以下内容)

#安静的工作环境

网上很出名的The Joel Test的第八条 Do programmers have quiet working conditions?程序员是否有个安静的工作环境?----请找个可以集中心力的地方,这也是时间管理的一部分,好的环境就会提高工作效率,提高时间利用水平。

 

#工欲善其事,必先利其器----使用最好的硬件软件,提高工作效率

The Joel Test的第九条 Do you use the best tools money can buy?是否在使用金钱可以买到的最好的工具?

关于软件

常常问问自己我是否是最高效率的做这件事。应该学习通过shell进行编程, 用它构建复杂的宏命令,用来完经常进行的各种活动。Linux本身提供了很多“锋利的小工具”,首先就是学会使用它。Windows下也可以使用一些很好的小工具以提高效率,例如Everything来搜索文件,google desktop来搜索文件内容。

请使用金钱可以买到的最好的软件工具,例子我就不举了。

关于硬件设备

sony_vaio_new_hni高科技行业最贵的是工程师,程序员,而硬件软件相对人的时间成本来说是非常便宜的(相对于生产力的提高,在硬件上的投入是相当划算的)。譬如,我工作的地方就依照几乎按摩尔定律给员工换电脑,也就是大概18个月换一次,每次都换顶级配置的台式电脑。这个星期刚刚得到一台新的Sony笔记本,以方便我们在家里工作(在家工作常常会更有效率),比较夸张的是这台笔记本居然有8个G的内存,附图是这台笔记本的照片,先照一张全新的样子,Windows 7的评分,哈,比我家的台式机还好非常多。

  sony_vaio_leistung

2010年1月16日星期六

坚持“每周五天,信息斋戒”--第二周心得

google_reader_trend_2 个人认为我们做时间管理,就要先削减不必要的事,生活中有一个的不必要的事就是“过度的信息接受”,它们就像“时间窃贼”或“时间黑洞”一般偷窃或吞噬我们宝贵的时间。我所提倡的“每周五天,信息斋戒”其实是一个比较容易坚持和相对可行的手段。只要将注意力放在行为上,就能坚持下去,我已经坚持了两周,感觉很好,这一周我只接受了少于2个小时的信息,但是在这两个小时集中阅读我也接受了很多信息,“集中阅读”有很多好处,例如当积累了一周的rss总共几百篇的时候,我们就会进行真正的“选择性”(而不是一般性的相对盲目)的阅读,这在阅读高质量文章的同时,也极大的减少了我们的无谓阅读量,同时节约了宝贵的时间。附图为我的google reader的阅读记录,每周就进行一次集中的阅读。

 

最近翻阅了胜间和代《时间投资法》一书,其中也提到了相同观点----“时间管理等于削减不必要的事”。这本书中提到了一些时间管理策略,很值得推荐,例如,每天尝试新的方法,选择容易坚持的手段,关注“行为”而不是“目标”,一定要测评结果。还有“选定“不必做的事”比选定“需要做的事”更重要”。“用“胡萝卜加大棒”制造动机”。“奖励自己,要用轻松好操作的形式,并使有效的时间管理手段制度化”。

 

有时候喜欢翻翻豆瓣的各种小组,很多小组的名字很有创意,这对提高自己的思考维度还挺有帮助的。 我认为小组还有一个作用就是提供一个“个性化”标签。也许很多人,加入小组很多情况并不是为了讨论问题,而是为自己贴上个性化标签。因此我也成立了一个小组“每周五天,信息斋戒”,地址为:http://www.douban.com/group/209222/。欢迎大家加入。给自己贴上这个标签,告诉大家“我要开始信息斋戒运动,现在开始掌控自己的时间”。

 

这个星期对时间管理还有一点小心得,这里和大家分享:
其实我们可以试着最大限度地利用每一点空闲时间,然后使用它们去做现在对我们最重要的事情,或者对将来有很大影响的事情或任务(例如进一步地进行一些深入的学习)。这样其实是挺有用,不要看短短的几分钟时间,可以进行一些很简单的任务,做什么都行只要和现在手头上重要的任务或事情有关就行,这常常会给我们的复杂的任务带来很多意想不到的突破。

2010年1月13日星期三

Notepad++,Eclipse和Visual Studio 2005常用快捷键对比

NP_Eclipse_VS_images 因为常常使用Notepad++,Eclipse和Visual Studio 2005来写程序。三个都有各自定义的快捷键,因为Notepad++最经常使用,所以是常常在使用Eclipse和Visual Studio 2005和Notepad++的快捷键搞混,很头疼,今天花几分钟做一个比较表格。

 

 

 

 

 

Notepad++

Eclipse

Visual Studio 2005

打开Find / Replace 对话框

Ctrl+F, Ctrl+H

Ctrl+F

Ctrl+F

复制当前行

Ctrl+D

Alt+ Ctrl+↓

Ctrl+L (编辑.剪切行)

删除当前行

Ctrl+L

Ctrl+D

Ctrl+Shift+L

上下行交换

Ctrl+T

Alt+↓, Alt+↑

Ctrl+Shift+T

找下一个

F3

F3, Ctrl+J

F3

找上一个

Shift+F3

Shift+F3, Ctrl+Shift+J

Shift+F3

在文件中找

Ctrl+Shift+F

Ctrl+H

Ctrl+H, Ctrl+Shift+F

到前一个书签

F2

Ctrl+Tab

Ctrl+Tab

到下一个书签

Shift+F2

Ctrl+Tab

Ctrl+Tab

打开run对话框

F5

Ctrl+F11

F5:启动;Ctrl+F5:开始执行(不调试);

打开CallTip列表框,代码助手

Ctrl+Space

Ctrl+Space

智能感知:Ctrl+J, 列出成员Ctrl+Shift+空格

加入Space

Tab (selection of several lines)

Tab (selection of several lines)

Tab (selection of several lines)

移除Space

Shift+Tab (selection of several lines)

Shift+Tab (selection of several lines)

Shift+Tab (selection of several lines)

全屏/最大化当前的Edit或View

F11

Ctrl+M

Shift+Alt+Enter

折叠全部

Alt+0

Ctrl+/(小键盘)

Ctrl+M,Ctrl+O

展开全部

Alt+Shift+0

Ctrl+×(小键盘)

Ctrl+M,Ctrl+M

变为小写

Ctrl+U

Ctrl+Shift+X

Ctrl+U

变为大写

Ctrl+Shift+U

Ctrl+Shift+Y

Ctrl+Shift+U

块注释/消除注释

Ctrl+Q

Ctrl+/

Ctrl+K+C,

Ctrl+K+U

关闭当前Editer

Ctrl+W

Ctrl+W

Ctrl+F4

编辑.选择当前字

   

Ctrl+W

2010年1月9日星期六

每周五天,信息斋戒运动


google_reader_tend这个星期我开始了“轰轰烈烈”的“每周五天,信息斋戒运动”,开始这个活动是受到蒂莫西·费里斯的《每周工作4小时》一书的启发。

 

  “养成和保持低信息食谱的习惯。信息的消耗能力显而易见:信息消耗了接收者的注意力。因此,大量的信息造成了有限的注意力的分散,也产生了在过多信息源中合理有效的分配有限注意力的需要。”

“就如同现代人吸收了过多的卡路里和没有营养价值的卡路里一样,信息工作者也从错误的来源吸收了信息数据。输出--大量的输出是生活方式设计的基础。要增加输出,只有减少输入。大多数信息耗时、消极,与目标无关,也在你的能力之外。”


当你把信息之门关上的时候,地球照样转动,更不用说终结。要认识到这一点,最好采用"邦迪"之法而且立即开始:一周的传媒斋戒。戒掉信息有时非常像戒掉冰淇淋。"我只想再上网看一分钟"就和"哦,我只是再吃一勺"一样寻常。必须快刀斩乱麻。”----《每周工作4小时》

 

这五天里我坚持以下原则,(《每周工作4小时》里的原则加入我的一点改进,你也可以根据自的情况进行改进),这个原则是1.0版的:


每周五天,不接触任何报纸、杂志,不上任何新闻门户网站,不读RSS等 等,不接受任何信息。

只进行有意义的阅读,如一些比较好的书。

不看任何电视,视频,最多每天晚上可以看一点“纯娱乐性”节目。

 

其他两天,总共只能接触1到2小时的信息,看多少是多少,如果时间到了,立即停止接触任何信息。

 

坚持了这个“信息斋戒运动”后,我发现,我每天的时间变多了,不接触任何信息,对我的生活没有任何改变。但是我还是每天坚持看一些书,看书比读各种新闻,信息好多了,可以系统地完整地进行真正的知识和深层信息的摄取。

这个星期四和星期五,我休息两天在家,有了大块的时间,很痛快,看了很多书,有电子版的,也有纸质的,把身边有的大前研一的书系统地读了一遍,对我很有触动,转变了我一些思想和观念,也提升了一些世界观,值得推荐一读。这个星期也读了我很久以来很想读的书如《异类》和《美元大崩溃》。下星期就无法拥有那么多时间看书了,下星期要开始项目的收尾阶段。

 

下星期我继续我的“每周五天,信息斋戒运动”,并执行的1.1版规范,在1.0版上加上以下一条,这样可以减少更多无谓时间浪费:

 

上网仅仅读电邮和回电邮和进行一些和工作有关的活动(例如使用google的在线工具,进行一些资料搜索等等),其他无益的网络活动尽量减少。

 

今天的附图为我google reader的阅读记录,看吧,1月4日到8日,5天没有阅读任何博文,这也算是我的“每周五天,信息斋戒运动”的第一个小小的成功的记录吧。