显示标签为“昨日的世界”的博文。显示所有博文
显示标签为“昨日的世界”的博文。显示所有博文

2016年2月22日星期一

昨日的世界(八)

404 NOT Found

在程序的世界里,有一大类问题都可以划分到404 NOT Found的类别里,一大票问题都可以归结于查表找不到

构造函数

class Dispatch{
  Dispatch(int i){}
};
Dispatch a;// Compile Error
最早学C++的时候,总是被这个问题搞的莫名奇妙,原来C++编译器会给一个class偷偷添加默认构造函数
但是,如果用户自己定义了一个,则编译器不再提供默认构造函数。此时上述代码要通过的话需要我们
自己给Dispatch添加一个无参数构造函数,方可通过。
class Dispatch{
  Dispatch(){}
  Dispatch(int i){}
};
void DoSomething(){
  Dispatch a;// Compile Error
}
我们可以说
404 NOT Found:您调用的构造函数不存在
  • 添加explicit关键字的单参数构造函数,刻意让想要隐式转换并调用构造函数的时候,404 NOT Found…:
    see:what does the explicit keyword in c mean
  • 至于当时为什么我会在没有无参构造函数的时候写Dispatch a;这样的语句,应该是以为所有的变量都可以这样声明吧。可惜C++里这里的行为就是在栈上分配了内存,调用了无参构造函数。
  • 默认构造函数无参构造函数是两个概念。默认行为往往是坑,一旦使用方的需求和默认行为不匹配,而使用者又对默认行为不清楚,就会出现各种诡异的问题。
    see:Do the parentheses after the type name make a difference with new?
  • 比如说当使用STL的时候,class的拷贝构造函数、赋值操作符,小于比较操作符等都在模板算法里被使用,一个学习STL的新手一定会在不了解模板的duck type interface原理时被这种默认行为坑到。
    see:What is The Rule of Three?
  • C++03里构造函数不能调用别的构造函数,因为class还没构造完呢。。C++11添加了语法糖,支持了…

数组名和指针

C的数组和指针的区别在于,数组名只是数组起始地址的别名,编译器编译后就被替换成了数组的首地址,而一个指向数组的指针则是一个变量,是运行期行为。下面的代码:
char array_place[100] = "don't panic";
char* ptr_place = "don't panic";

int main()
{
    char a = array_place[7];
    char b = ptr_place[7];

    return 0;
}
编译后的汇编是
    char a = array_place[7];

0041137E  mov  al,byte ptr [_array_place+7 (417007h)]
00411383  mov  byte ptr [a],al

    char b = ptr_place[7];

00411386  mov  eax,dword ptr [_ptr_place (417064h)]
0041138B  mov  cl,byte ptr [eax+7]
0041138E  mov  byte ptr [b],cl
所以,而一个函数的数组参数
void foo(char arr_arg[], char* ptr_arg)
{
    char a = arr_arg[7];
    char b = ptr_arg[7];
}
编译后是:
char a = arr_arg[7];

00412DCE  mov  eax,dword ptr [arr_arg]
00412DD1  mov  cl,byte ptr [eax+7]
00412DD4  mov  byte ptr [a],cl

    char b = ptr_arg[7];

00412DD7  mov  eax,dword ptr [ptr_arg]
00412DDA  mov  cl,byte ptr [eax+7]
00412DDD  mov  byte ptr [b],cl
则是一模一样的,这是因为编译的时候,函数并没有被调用,所以编译器并不知道arr_arg的实际地址是什么,所以编译器就只能把它向指针一样处理。
这部分内容源自:are pointer and arrays equivalent in c?
我们可以说
404 NOT Found:函数编译时,数组的实际地址找不到,请看:https://lkml.org/lkml/2015/9/3/428,“because array arguments in C don't
actually exist”

野指针

一个class的指针成员变量,如果未被初始化,则是一个野指针,它不是NULL。
于是在运行的时候,它指向的内存(并不是有效的该类数据)被解码成这个类的数据,此时实际上是乱码的。
这样的乱码数据运行下去,就会有运行期的未定义行为
我们可以说
404 NOT Found:野指针,指针指向的数据并不是有效的对象数据,您要的数据不存在
又:函数里返回局部栈上变量的引用或者指针,函数调用完的时候,函数的Stack被ret掉,局部变量的引用或指针就指向了已经被ret了的内存,
在后续的stack变来边去的时候,那块内存的数据早就不是原来的了。
404 NOT Found:您指向的栈地址的数据早就不是当初那个东西了...
此处有人还长篇大论:Can a local variable’s memory be accessed outside its scope?

未定义符号

C/C++ 编译的时候,出现未定义符号,原因可能是这个符号所在的头文件并没有被包含。
为了找到它,可能的行为包括
1. 指定Include查找目录
2. 添加必要的头文件
我们可以说
404 NOT Found:符号所定义的文件找不到

未解决的符号

C/C++链接的时候,出现未解决的符号,原因可能是这个符号的定义虽然在编译的时候找到了,但是链接的时候没发现它的实现。
为了找到它,可能的行为包括
0. 比如说函数在头文件里实现了,在.c或者.cpp里却没有实现,那么实现它
1. 添加Lib查找的目录
2. 添加需要连接的Lib文件
我们可以说
404 NOT Found:符号没有被实现或者找不到obj,或者找不到库(一堆obj的合集)
又:它的反面是同一个符号有多个实现的版本,比如多个同时链接了多个不同实现的C运行时。此时不是找不到,而是找到了多个不知道用哪个,解决也很简单,明确指定要用的是哪个。
又:还有一种是同时只有多个弱符号,没有一个强符号,则不知道用哪个。
这两种情况,可以说
404 NOT Found: 有多个版本,找不到一个最强的来用

模板的具现化

#define type_zero 0
#define type_one 1
#define type_two 2

template <int type>
struct trait;          //Declare

template <>
struct trait<type_zero>{ //A
  enum {value=0}; 
};

template <>
struct trait<type_one>{ //B
  enum {value=1};
};

template <>
struct trait<type_two>{ //B
  enum {value=2};
}

void DoSomething(){
  std::cout<<trait<2>::value<<std::endl;//(1) 
  std::cout<<trait<3>::value<<std::endl;//(2),Compile Error
}
对于(1):
1. 编译器尝试使用A版本具现化,不匹配,错误A,先不出错,下一步;
2. 编译器尝试使用B版本具现化,不匹配,错误B,先不出错,下一步;
3. 编译器尝试使用C版本具现化,匹配,忽略错误A和错误B
对于(2):
1. 编译器尝试使用A版本具现化,不匹配,错误A,先不出错,下一步;
2. 编译器尝试使用B版本具现化,不匹配,错误B,先不出错,下一步;
2. 编译器尝试使用C版本具现化,不匹配,错误C,抛出编译错误。
如果编译器在错误A的时候就直接编译错误,那就没什么好说了,但编译器会尝试找重载的模板尝试具现化,直到所有的尝试都失败时才认为是真的失败了。
我们可以说
404 NOT Found:找不到可以具现化的模板
在尝试具现化的过程中遇到失败的情况先不抛出的特性也被起了个名字:
SFINAE: "Substitution Failure Is Not An Error"
再来一个例子:
struct example
{
    template <typename T>
    static void pass_test(typename T::inner_type); // A

    template <typename T>
    static void pass_test(T); // B

    template <typename T>
    static void fail_test(typename T::inner_type); // C
};

int main()
{
    // enumerates all the possible functions to call: A and B
    // tries A, fails with error; error withheld to try others
    // tries B, works without error; previous error ignored
    example::pass_test(5);

    // enumerates all the possible functions to call: C
    // tries C, fails with error; error withheld to try others
    // no other functions to try, call failed: emit error
    example::fail_test(5);
}
see: Substitution Failure Is Not An Error

竞态条件

class Dispatch{

public:
  void AddObserver(Observerable* o){
      AutoSpinLock lock(m_lock);
      ...  
  }
  void RemoveObserver(Observerable* o){
      AutoSpinLock lock(m_lock);
      ...
  }
  void NotifyObservers(){
     AutoSpinLock lock(m_lock);
     Observers::iterator it=m_observers.begin();
     while(it!=m_observers.end()){
       Observer* o = *it;
       o.DoSomething();
       ++it;
     }
  }
private:
  typedef std::vector<Observerable*> Observers;   
  SpinLock m_lock;
  Observers m_observers;
}
发生的情况
1. 线程A:NotifyObservers。
2. 线程B:Observer要delete之前,调用Remove,成功,然后就析构自己。
3. 此时A线程的DoSomething还在过程中,崩溃。
此时我们可以说
404 NOT Found:您要通知的对象已被析构...
解决的办法就是用引用计数智能指针+弱引用智能指针
class Dispatch{

public:
  void AddObserver(weak_ptr<Observerable> o){
      AutoSpinLock lock(m_lock);
      ...  
  }
  void RemoveObserver(weak_ptr<Observerable> o){
      AutoSpinLock lock(m_lock);
      ...
  }
  void NotifyObservers(){
     AutoSpinLock lock(m_lock);
     Observers::iterator it=m_observers.begin();
     while(it!=m_observers.end()){
       shared_ptr<Observer> obj(it->lock());// 如果存活,增持,避免被析构
       if(obj){
         o.DoSomething();
         ++it;
       }else{
         it = observers.erase(it);
       }
     }
  }
private:
  typedef std::vector<std::weak_ptr<Observerable>> Observers;   
  SpinLock m_lock;
  Observers m_observers;
}
see:Linux多线程服务端编程
如果不用智能指针,不带引用计数,那么,可以在NotifyObservers的时候,不立刻执行DoSomething,而是投递到目标线程去执行。假设Observer的工作线程是B,Dispatch在线程A,则NotifyObservers可以投递到线程B,在线程B才做真正的遍历触发,则保证Observer的Add、Remove、Find都在线程B,从而避免线程问题。

切换脚本语言

一个同学写了一段时间的lua代码
for i,v in pairs(nodes) do
  --//do something
end
有一天切换成到Python环境下写代码,同样遍历字典
for i,v in pairs(nodes):
  ## do something
404 NOT Found:paris是个什么鬼...
去掉
for i,v in nodes:
  ## do something
404 NOT Found:没有迭代器...
好吧:
for i,v in nodes.items():
  ## do something

声明的时候还没有定义

C的例子

typedef struct{
  ...
  list_node *next; // error
} list_node;
解决:
typedef struct list_node list_node;
struct list_node{
  ...
  list_node *next; 
};
ps,C和C++的tag

C++的例子

典型的C++ 前置声明用来做PIMPL (Private Implementation) 惯用法,避免循环include头文件
class A;
class B;
class C{
public:
  A* GetA();
  B* GetB();
}

Lua的例子

function fac()
  print(fac())--//error, 递归定义,此时fac还不存在
end
解决:
local fac
function fac()
  print(fac())
end
语法糖:
local function fac()
  print(fac())
end

scheme的例子

Y Combinator:http://mvanier.livejournal.com/2897.html
Y Combinator想要使用lambda搞出递归,最后办法就是把代码拷贝一份传递进去..
我们可以说
404 NOT Found:定义还没完成呢,想要用它的话,加个中介待定系数法吧
作为反例,switch-case的case里不能直接定义变量,因为case只是个可以goto的label,如果没有被goto到,这样的变量就只定义而没有初始化…,see:Why can’t variables be declared in a switch statement?

版本

  • A:哥,测一个
  • B:好的,马上布下新服务,
  • 10秒过去..
  • A:哥,协议不对啊,好像你还是旧的协议
  • B:咦,怎么上传的还是旧的
404 NOT Found: 需要的协议版本不对,测试部署最好也做版本号区分

心跳

https://en.wikipedia.org/wiki/Heartbeat_(computing)
https://en.wikipedia.org/wiki/Keepalive
无论是Tcp还是Udp,连接中都会使用心跳包,每隔n秒发送一次心跳包给服务器,每隔m秒判断是否有回包。如果没有回包,则判断连接断开。在某些情况下,允许中间断开一段时间,这样会在稍后重试心跳。程序如下:
1. 开始心跳,如果心跳失败,每个n秒重试,
2. 连续重试m次如果失败,就会等待一个大的时间x秒,x秒后重新开始1
利用心跳,可以做到:
- 在客户端,如果心跳失败,说明要么网络出问题,要么服务器出问题,则客户端可以连不上服务器,在P2P网络里则该客户端甚至无法与其他节点做打洞或者反连。
- 在服务端,根据心跳可以判断在线节点的个数,如果出现大面积不在线,则要么网络出问题,要么客户端出现某种未知异常。
404 NOT Found: 心跳失败,既死亡

分支闭合

分支似乎不用说。编程里最基础的便是if else。然而我们流行一句话: 很多bug最后定位到的时候往往发现是一个很2的问题。
为什么会这样呢?根据我的经验,我觉得还是因为if else没做到处处闭合(封闭性)。编程语言并不强调有if就要有else,这是语法级别的。而且我们很多时候为了避免代码嵌套过深,采用卫语句的方式提前返回。当情况复杂时,就容易漏掉某个分支。
所以,编程还是回归到了最最基本的逻辑,在语义上要强调分支的闭合,有if就要有else,即使你不写出来。而且工程健壮的程序,就是在处理各种错误分支,好的程序对所有的错误分支都是有意识并且有处理的,缺一不可。所谓测试,核心其实就是对分支闭合的测试,这也是体现工程师逻辑是否严密的地方。
404 NOT Found: 这个分支你没处理

IP and Port

Ip和端口构成了一个EndPoint。
网络的世界里,两个EndPoint,A和B之间唯一定位彼此的是靠Ip和Port。可是,中间是各种墙(NAT,Router),只要任何一个地方把src和dest的Ip,Port封掉,它们之间就无法通信。网络上的可靠通信,基本原理是,三次握手打开连接,四次挥手关闭连接。放开关闭不说,单说握手。
1. A send syn to B
2. B send ack to A
3. A send ackack to B
三个步骤中的syn、ack、ackack任何一个包发送失败,都会导致该连接不能建立。而一般来说,如何把syn包从A发给B就是一个难题.
首先要对NAT分类:
see:wiki-NAT
  1. Full-cone NAT, also known as one-to-one NAT.
    • Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
    • Any external host can send packets to iAddr:iPort by sending packets to eAddr:ePort.
  2. (Address)-restricted-cone NAT.
    • Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
    • An external host (hAddr:any) can send packets to iAddr:iPort by sending packets to eAddr:ePort only if iAddr:iPort has previously sent a packet to hAddr:any. “Any” means the port number doesn’t matter.
  3. Port-restricted cone NAT.
    • Like an address restricted cone NAT, but the restriction includes port numbers.
    • Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
    • An external host (hAddr:hPort) can send packets to iAddr:iPort by sending packets to eAddr:ePort only if iAddr:iPort has previously sent a packet to hAddr:hPort.
  4. Symmetric NAT
    • Each request from the same internal IP address and port to a specific destination IP address and port is mapped to a unique external source IP address and port; if the same internal host sends a packet even with the same source address and port but to a different destination, a different mapping is used.
    • Only an external host that receives a packet from an internal host can send a packet back.
根据情况,1,2,3都可以利用规则把完成语义上的syn的动作,如果两端都是Symmetric NAT就没救了。在NAT后面的,要想连接,就得trick NAT的映射机制。
其次对A和B分类,其中,2和3是同一种类型:
1. A和B都在外网
2. A在外网,B在内网(NAT后面)
3. A在内网(NAT后面),B在外网
4. A和B都在内网(NAT后面)
根据情况,1可以直连,2和3可以反连,4可以通过打洞方式,完成syn动作。如果把1,2,3,4做merge,即实现了一个混合多路发syn的connector。
再次,对使用的协议做分类:
1. 使用Tcp
2. 使用Udp
根据情况,1可以做直连和反连,打洞相对困难,但也不是不可以做,用Tcp不用自己做错误处理、拥赛控制。2可以做直连、反连、打洞,但是用Udp需要自己重新实现各种错误处理、拥赛控制以实现可靠连接。
最后,对Ip和端口的恶劣场景做分类
1. 频繁换IP,双网卡
2. 某些端口被NAT和Router封杀
对于这两点,只能通过:
1. 重新绑定Ip和端口
2. 随机化端口,但如果用户有Upnp的情况下,随机的端口可能未必能用。
以上没有说明的一点是A和B在应用层是用什么互相标识的。举例常见的Id情况:直接用Ip,用域名,P2P网络里用PeerId。无论是直连、反连还是打洞、本质上都是在做Id到可达EndPoint之间的转换,在域名系统里,这就是DNS的职责,常见的网络污染就发生在DNS这个环节。
404 NOT Found: Ip和端口不对。

Function

很多时候,我们都在做翻译工作。

跨语言函数调用

比如说跨语言的函数调用,就是在不同语言之间通过在某一个语言端的中介的API做函数调用翻译工作。
  • JNI,通过Java Native Interface,我们的本地代码直接调用JVM(Java Virtual Machine)的指针和Java代码之间跨语言交互。实际上对于JNI代码来说,并不是和Java代码交互,而是和JNIEnv的API交互。
  • Lua,通过Lua的C函数接口,我们可以给Lua注册一堆的C接口。我们的本地代码直接调用的lua_State* 和Lua代码之间跨语言交互。实际上对于Lua的C接口函数来说,并不是和Lua代码交互,而是在lua_State的API交互。
  • P/Inovke,通过.NET P/Invoke,我们可以在.NET里调用C的动态链接库。本地代码只要是标准C导出接口即可。
对比之下,区别在于谁来做
- Lua是固定了接口,参数传递基于lua_State的栈去传递。lua_State做查找工作,程序员手工做了翻译以及参数的出栈、入栈。
- JNI是让C++接口去声明参数类型信息。编译器根据用户在Java和C端声明,做了查找工作。
- P/Invoke是让.NET自己去声明参数类型信息。编译器根据用户的声明做了自动查找翻译工作。
这三者做做了两件事情
1. 约定参数类型映射。
- JNI是在C++端声明Java的参数类型所映射的本地类型。
- P/Invoke是在.NET端声明本地类型到.NET类型的映射
- Lua是在C/C++端让程序员直接隐式假设lua_State栈上每个槽应该放的是什么类型的数据。
2. 约定参数入栈顺序
- JNI和P/Invoke遵循C/C++的调用约定
- Lua则规定了参数的出栈入栈规则
逻辑上跨语言调用做的是在语言之间规定怎样调用对方的函数的规则,是属于函数调用的范畴。
我们考虑每一个函数都有输入参数和返回值。函数可以有单参数和多参数,而多参数可以通过柯里化变成单参数。
所以,函数问题可以简化为单参数单返回值函数的问题。可以用符号表示 r=f(a)
这假设了f总是顺序执行。我们可以通过Continuation的概念把函数表示为f(a,c)的形式,
f接收a,同步或者异步执行完毕后把结果传递给Continuation,也就是c去处理,c的一个例子是
function(r) print(r) end

网络协议

任何和约定相关的,都可以称之为协议。和协议伴生的一般就是协议包,和协议包伴生的一般就是协议包的编码解码。可以看下典型的网络协议。
  • TCP协议和TCP协议包;
  • Udp协议和Udp协议包;
  • 基于TCP的Http协议和Http协议包。
  • 基于Udp的P2P协议和P2P协议包;
一个网络协议是建立在发送一个包a,返回一个包r这样的基本操作之上的。比如说TCP握手:
client a         client b
send syn   ----> recv syn
recv ack   <---- send ack
send ackack----> recv ackack     
我们可以定义函数
send(request,function(response) end)
则TCP握手可以表示为
--client a                       
send(syn,function(ack) 
  send(ack,ignoreresponse)
  send(data,function(dataack)
     send(data,function(dataack)
      ...
     end)  
  end)
end)

--client b
send(nothing,function(syn)
  send(ack,function(ackack)
     send(data,function(dataack)
        ...
     end) 
  end)
end)
Udp协议和TCP协议的区别在于,TCP处理了每个函数调用的异常,例如超时没有返回,我们可以调整send函数原型
send(request,function(response) 
     --// 返回了期待的值 
  end,function(timeout) 
     --// 没收到期待的值,某种重发机制
  end,function(error)
     --// 彻底超时了,失败
  end)
所以,网络上发包和收包可以规约为函数调用。
ps:一个网络协议包可以拆开成包头和包体,而一条汇编指令、一条.NET的IL指令,一条JVM的bytecode,一个Lua的指令,也同样可以有进一步拆开成opcode+register。可以把一个网络协议包看成一条网络汇编指令
网络协议包的包头一般包含有packagetype,可以当作是opcode,包体则是register里的数据。
ps:编程语言的指令,都喜欢把int拆开去使用,前几个位表示什么,接着几个位表示什么。网络协议包也类似。我觉的对bit的操作是编程世界里的最低粒度的封装抽象

RPC

基于网络协议,就可以实现网络通信。在应用层,我们更喜欢把网络通信当成是函数调用了。于是有了RPC.
无论是Apache Thrift还是Google Protocol Buffer还是.NET WCF,都用某种代码生成器去生成网络通信封装成函数的事情。

函数、对象和闭包

无论是函数还是对象,都是一堆数据。不能闭包的语言里,函数只有代码数据。可以闭包的语言里,闭包了的函数除了代码数据还有被捕获的变量的数据(所谓upvalue,up是是upstream,也就是上游,可见只能捕获自己上游作用域的变量)。
在命令式语言里,对象是一个状态机,状态的维护在并发的时候遇到了data race的问题。在纯函数式语言里,数据是不可变的,无副作用的,并发的时候就消除了data race。在一个命令式语言里的函数式特性里还是会遇到data race。

重入

references

Burn Down chart

S型的燃尽图

在一次milestone开发过程中,开发者会持续编辑issue列表,每个issue都有自己的生命周期。燃尽图预期这些issues会被线性的消灭掉,所以从第一天直接到最后一天画个直线表示预期进度变化,然而实际开发会遇到各种困难,所以实际的进度变化曲线往往不是线性变化的,下面这篇文章给出了S型燃尽图:
https://sandofsky.com/blog/the-s-curve.html

三进制

计算机是基于二进制的,有一句经典的台词是:这个世界上有两种人,一种是懂10进制的,另一种是懂10进制的。但是在开发中,我们常常要接触三进制。程序开发中有一个Keep it simple, stupid的所谓KISS原则,就是说我们写程序,在没有必要的情况下,不要增加不必要的抽象层。例如很多初学者在刚接触了设计模式之后,就会在很简单的程序上不必要或者不正确的使用各种模式去写代码,但实际上那种程度的代码只需要把面向过程代码写好,做好函数这个级别的抽象即可。函数简洁但并不就简单,和通常的初学者相反,有经验的程序员更愿意用简洁的代码解决问题,而不会为了用上一堆所谓特性把代码写成花拳绣腿。一个函数需要考虑入口条件,出口条件,是否可重入,是否线程安全,所依赖的状态变化…等等。所以,有时如果你不放弃装饰,你就得放弃本质。
但是,程序从开发的第一天开始就被持续迭代。有一句话说:程序从被写下的第一天开始就开始腐烂的过程,这是说程序会因为需求的不断变化而需要不断的被重构,一开始几行的代码可能会膨胀,再压缩,再膨胀,再压缩。不同地方的代码会出现重复,各种各样的重复。于是,光有KISS是不够的,我们需要另外一个东西:Do Not Repeat Yourself,也就是所谓的DRY原则。怎样才能不自我重复呢?这就是所谓的三进制原则,同样一件事,重复做三次,就可以考虑批处理,计算机是最擅长做批量处理的事情,例如for循环,递归等。批处理的前提是结构的一致性,结构的一致为将他们装到容器里创造了可能。所以,为了批处理,我们常常需要在结构上做抽象。一致性可能是数据上的,也可能是行为上的,根据程序即数据的原理,数据的一致性可以用行为的一致性表示,所以我们可以只对行为的一致性考虑。在面向过程语言里,可能就是在函数这个级别考虑,在面向对象语言里,则更多可以在接口层体现。把共同的结构装到容器里的过程,就是组合的过程。
好了,三进制大概说到这里。

我们需要专职的TA么?

从我一开始进入程序员这个行业开始,我就也会被软件开发中的人员配置问题困扰。一个团队,是否要有专职的项目经理,美工,测试,产品设计,以及并不讨人喜欢的行政,人力资源?从程序员的角度来说,属于技术偏好型,能用技术解决的,绝不愿意通过增加一个人去解决,能用工具解决的,一定批量处理之。先进技术和工具,常常在效率上是数量级的压倒性优势。
回到小题,通过几年的过程,我想角色上很多时候这些角色都有其必要性,但是,一个角色要有多个人还是一个人甚至直接由工具取代,则是可以因团队而不同。怎样取舍和适应?我认为关键在于:是否有效率的解决问题,例如开发和测试,如果开发和测试两个人不能很好的协作,共同有效率解决问题,而一个两者皆做的更有效率,那么明显后者更好,反之则选择前者。
因此,角色分离,但人员可以合一。也就是人剑合一。

持续迭代

前面说燃尽图,软件开发,常常是一个长期过程。不是一锤子买卖,一个基础类库开发加一个上层产品开发就可能两年。但市场常常不等人,因此我们要紧凑的过程和质量,那么就需要持续迭代。持续迭代体现在一个milestone之内的每一天之间,需要每天跟踪昨天,今天,明天的进度,解决的issue,新产生的issue,代码的提交,测试的通过率,发布的版本,用户的反馈等等。持续迭代同时体现在milestone和milestone之间,粒度会更大一些。
一个理解持续迭代的地方是解bug,任何bug,我们都需要首先尝试去重现它,做二分排除定位,做单元测试刷豆子,搜集证据链,一步步掐头去尾缩小范围,最后解决。这也需要持续迭代。
持续迭代不仅在节奏上保持紧凑,而且把过程渐进展开,我们都知道软件开发的敌人是黑盒子,不能预期的时间和进度,所以持续迭代的过程,我们通过燃尽图,issue管理,bug跟踪,反复把过程dump出来,让进度可视化,促进软件开发的正面化学反应和收敛。
while(rest>e){ step(); }

充分必要

软件开发,涉及到很多需要推理的地方,例如每天的解bug,这里需要逻辑,也就需要充分必要。一个论点,它的论据是否是充分必要的,就是体现逻辑的地方。
其他地方,例如做案例分析,我们训练思辨和分析,我想也应当是基于逻辑的。例如做需求分析,也是应该以是否符合逻辑为核心,如果连自己都说服不了,泛泛而谈的形式化需求分析,多半是需要被重新做的。所以,原则应当是,写完自己读一遍,根据是否充分必要去复审,也许需要补充数据,真实的数据很重要,有数据就可以拿数据说话,一个断言在有数据支撑的情况下,更可能有效。但使用数据要避免单样本统计学家式的武断,同时也要不失管中窥豹的洞察力,这大概需要反复锻炼,反复成功或者失败。

工具

程序员是带工具属性的,工程上,每个小事情都可能有相关的工具可以利用,如果没有,我们就造工具。同样的管理源代码,我们有svn,git,当我们赤手空拳,我们合并别人的代码,可能会先临时拷贝自己新改动的代码到某个临时文件夹S,然后把别人的代码覆盖进来,完了再把S和其diff,再修改。用git,这个过程就是git stash,git pull,git stash pop,所以有时候只要想一下一个操作过程当自己没有工具是是怎么做的,可能工具也大概就是这么做的,只是变成了更有效率的命令。工具也是符合逻辑的。
两个团队A和B。A没做事,B不用工具做事,B比A强;A不用工具做事,B用工具做事,期待的是B比A更有效率的解决问题,否则B并不就比A强;如果两队都做事也都有效率使用工具,则可以开始比内容。所以把那些提高效率的工具都用到习以为常,瓶颈不卡在那些上面,我们就进入比拼真正的最终目标上。反复的训练和使用,可以达到这点。

重试

一个任务,耗时估计的靠谱度跟做过这件事的次数有关,一般来说做过两三次额估计就靠谱点。这也是有经验公式可用。如果它是一个普遍原理,我们可以利用它。从概率上来说,一个事情一次的成功率为a,那么,多次之后的成功率是可计算的,手机打字就不展开了。可以验证,重试可以增加成功率。所以,很多事第一次做,可以预估会有失败和错误,所以失败和犯错时冷静的保存数据,证据,记录,探测的这些点,都可以用来在重试时做可能的规避。不过很多人只尝试了一次,这就回到了经典论述:写100个helloworld不如对一个程序迭代100次。当然,我们要考虑到人是复杂的,喜新厌旧是常态,并不能一概而论。因为,每个人都是独立的个体,选择的自由正是这种平均值。重试要注意两次之间是否收敛,如果不收敛,则重试只会导致队列堆积,甚至引起雪崩,此时要检查更深的问题。

基本和到位

我常常做过一件事以后,发现很多事情并不需要各种奇葩的创新点子之类。做着做着就会看到,做好一件事最需要的并不是创新什么的,而是:概念界定之后的基本功。说概念界定,是因为很多人对自己的职业角色定位不清,就会导致做的事情不能抓住基本点。而一旦界定了角色边界,明确了基本点,那么工作就变成如何完美的把那些基本点做到位上面。例如,保持节奏,从不拖延,持续迭代,细节的完备,以及坚持不越界的做不应该自己做(你得让该做这件事的人去做,有原则对彼此都是一种轻松)。把基本功的细节做到位,就是一种职业素养,和专业主义。我想,这是重要的。我最怕角色不清,要么认为你应该什么都做,要么认为你什么都不要做,角色不清,系统的调度会混乱而没有效率。一个人可以做不同的事情,但最好在角色的语义上区分之。
因此,我也觉得很多事,其实能做到这些的人自己也都可以做好,未必得找别人。这和我经历过到处找控件来组装,到掌握组合控件的基本原理后不认为有魔法控件一样,省去了拿来主义。

提前量和惰性求值

当我们预估,我们会没有充裕的时间做完整的过程,我们可以打时间差。我们说对一个系统做性能优化,不外乎在时间和空间上做优化。如果一个系统或者一个过程要到达预期质量所要消耗的最低时间已经不可再压缩,并且预估到时间整体上将呈现下滑趋势,那么就应该在一开始时间还足够充裕的情况下打提前量,通过一开始的紧凑有序的节奏把大部分脚手架都搭建起来,那么越到后期越会从容和有条不紊,反之则会手忙脚乱。凡事预则立,不预则废。
相反的做法是,对事情做惰性求值,直到我们真正需要一个事情的结果时,才会去做这件事,惰性求值有时候能最大限度减少当前要做的事情。但是,惰性求值相当于一次异步投递任务到队列的过程,队列里等待被做的事情会堆积,当需要在限定时间内求某个事情的结果时,队列可能已经雪崩了。所以有队列的地方就要防雪崩,队列不能过长(根据优先级丢弃),保证你的队列可以在最低粒度时间片内被有序求值。如果你不想你必须要做的事情被丢弃,那么那些事情可以通过打时间差提前做掉,达到超出预期的效果。再说异步任务,异步任务都可能由于各种原因而不会有返回值,所以有异步就要有定时器,做超时监听,一旦超时,做对应的处理。

版本号

无论是10进制,还是10进制,亦或是点分10进制。它们都是版本号。我们的人生就是在年轮的版本之间迭代。认真对待每个版本,麻雀虽小,五脏俱全。每个版本开始,明确本次版本的目标,屏蔽其他,只指目标,当其达成,测试通过,打包,发布,写上:
版本 0.0.3
- 修订了xxx
- 移除了yyy
- 改进了zzz
- 新增了abc
版本和版本之间,贵在持续,节奏均匀。版本的发布日志,就是一个diff。两个集合,A和B的对称差,就是发版的日志。这让我想起,从写程序到现在,在各种场合写过两个数组,区间列表等的diff。很多时候,我们都在做diff,我常常从程序处理的过程得到一些概念,借以类比或者理解生活的事情,然而并不将其泛化,人太容易只看到类比事物之间共性的地方,而其实事物的复杂更在于那些不同的地方。手里有一把锤子,就到处找钉子的事情,永远都有。

拥塞控制

经典的生产者,消费者情景是这样的:
- 过程中会不断产生任务,加入任务队列,这是生产者
- 处理器会定时刷帧,每一帧都会检查当前的窗口,在窗口内的任务就会被执行
- 每个任务执行完都会更新系统的资源状态,这些状态用来更新窗口,超时的任务可能没执行完需要重新投递到队列里。
这样的过程,不断执行的任务,获取或者释放系统资源,而系统资源变化可以反馈到调度器的允许执行窗口,每一帧则从队列里取出窗口内的任务执行。
我们说,这是一个拥塞控制。不做拥塞控制的情况下,在执行的任务可能太少而没有充分利用系统资源,或者在执行的任务太多而把系统资源竞争到卡死,无论怎样,系统的资源利用率最饱和和任务的执行最多,是一个优化目标。所以,一个健壮的系统,有队列的情况下,要做拥塞控制。
拥赛控制的核心法则是:多还少补,在慢启动、拥赛避免、快速恢复3个阶段来回切换。

分段燃尽

从瀑布到敏捷,有的人说我是classical的,严格的瀑布有序经典;有的人说,我是删繁就简的,小步敏捷迭代,蚂蚁搬家。
就像我认为角色需要分开,人员可以合一。无论是学理上还是实践上,过程的不同阶段是存在的,但是具体实施上可能会压缩和合并。
Plan, Build,Test,基本的控制点在于这三者,侧重点各不相同。全局一次,还是反复多次,只是调度策略的不同。
假设过程是一条插值曲线,那么分段插值曲线比全局插值曲线有更好的局部性,学过数值分析的应该都知道全局插值曲线在控制点多了之后,插值多项式的次数高,会有振荡现象,就是由于局部性不好。

State of Machine

许多东西都可以看成是状态机,我们只看有限状态机的维基:
Finite-state_machine
A finite-state machine (FSM) or finite-state automaton (plural: automata), or simply a state machine, is a mathematical model of computation used to design both computer programs and sequential logic circuits. It is conceived as an abstract machine that can be in one of a finite number of states. The machine is in only one state at a time; the state it is in at any given time is called the current state. It can change from one state to another when initiated by a triggering event or condition; this is called a transition. A particular FSM is defined by a list of its states, and the triggering condition for each transition.
在非函数式语言里,一个结构体+一组API,或者一个类的接口,都可以看作是一组操作一个状态机的函数。
在网络编程中,一个发包和一个回包,是最基本的收发操作(Atom Operation)。当我们引入状态机,将连续的收、发包操作组装起来,就构成了某个网络协议,一组有效的收发包要么让这个状态机保持某种状态,要么切换到另一个状态。
最早接触状态机是在写OpenGL的时候,知道了OpenGL是一个全局状态机:
OpenGL是一个状态机
OpenGL是一个状态机,它维持自己的状态,并根据用户调用的函数来改变自己的状态。根据状态的不同,调用同样的函数也可能产生不同的效果。
为什么OpenGL的状态机是全局的呢?
Why does OpenGL be designed as a state machine originally?
The reason for this kind of “state machine” is simple: that’s how the hardware generally works.
Because originally, back in OpenGL 1.0, there were no objects (besides display lists). Yes, not even texture objects. When they decided that this was stupid and that they needed objects, they decided to implement them in a backwards compatible way. Everyone was already using functions that operated on global state. So they just said that by binding an object, you override the global state. Those functions that used to change global state now change the object’s state.
OpenGL已经很久没用来写代码干点什么。但是OpenGL的几个模式却常见。

开关

if( glIsEnabled(GL_BLEND) ) {
     // 当前开启了混合功能
} else {
     // 当前没有开启混合功能
}
  • 照相机或者其他设备,常常需要打开某种开关后,某些操作才有效。
  • VIM编辑器,某些操作需要先打开一些开关后,才有效。

出栈、入栈

glPushMatrix();
  // 里面干什么都不会影响到外面的矩阵世界
glPopMatrix();
  • C函数的调用栈
  • Lua的扁平展开的栈
  • Call/CC说的是Stack在Functional语言里的形式
  • GUI渲染的栈
  • 写代码生成器,嵌套的block栈让事情变的简单:
.Line("int test()")
.PushLine("{")
    .Code()
.PopLine("}");

模式

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); 
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
我记得小时候,去别人家看录像机,大人们操作几次之后,一帮小孩把大人们按哪个键开关、播放、切换什么的都会记得清晰。后面好几年,接触电子设备少,偶尔来一个相机都不知道那么多按钮是干嘛用的,为什么一会儿这个按钮是干这个用的,一会儿又是那个效果。绕了一圈,后面学了VIM,VIM的每个快捷键的是什么效果会取决于编辑器当前处于什么模式,例如编辑模式、命令模式、可视模式等等。后面我再次用相机的时候,一下就想明白了,电子设备的按钮不可能无限多个,所以引入“模式”即可解决。某个按钮用来控制当前的模式,切换到不同模式后,同一个按钮的作用可以不同。OpenGL的glMatrixMode这个套路在很多场景下都一再的被使用。
写一个代码生成器,先给一组最简单的渲染操作:
private static int indent=0;
public static StringBuilder Push(this StringBuilder sb) {
    indent++;
    return sb;
}
public static StringBuilder Pop(this StringBuilder sb) {
    indent--;
    return sb;
}
public static StringBuilder Line(this StringBuilder sb, string text, bool ignoreIndent=false) {
    if (ignoreIndent) {
        sb.AppendLine(text);
    } else {
        var space=new string('\t', indent);
        sb.AppendFormat("{0}{1}\n", space, text);
    }
    return sb;
}
public static StringBuilder Line(this StringBuilder sb) {
    sb.AppendLine();
    return sb;
}
public static StringBuilder FormatLine(this StringBuilder sb, string format, params object[] args) {
    var space=new string('\t', indent);
    var text=string.Format(format, args);
    sb.AppendFormat("{0}{1}\n", space, text);
    return sb;
}
public static StringBuilder PushLine(this StringBuilder sb, string text) {
    return sb.Line(text).Push();
}
public static StringBuilder PopLine(this StringBuilder sb, string text) {
    return sb.Pop().Line(text);
}
public static StringBuilder PopLine(this StringBuilder sb) {
    return sb.Pop().Line();
}
其中Push和Pop正是借用Stack的概念,来简化block块代码的生成。我们可以如下使用:
var sb = new StringBuilder();
sb.Line("#include \"./PackageUtil.h\"")
  .Line("PACKAGE_HANDLE PackageUtil::CreateEmptyPackage( PackageHeader& header )")
  .PushLine("{")
  .Line("int ret = RESULT_FAILED;")
  .Line("PackageInitData initData = {PackageInitDataType_Header,&header};")
  .Line("switch(header.PackageType)")
  .PushLine("{");

foreach (var p in protocols) {
    sb.FormatLine("case XXX_PACKAGE_{0}:",p.Name)
      .Push()
      .FormatLine("return CreatePackage(PackageTrait<XXX_PACKAGE_{0}>::GetClassName(),&initData,&ret);", p.Name.ToUpper())
      .Pop();
}

sb.Line("default:")
  .Push().Line("return NULL;").Pop()
  .PopLine("}")
  .PopLine("}");
然而,这里的foreach打断了代码的链式形式,实际上这样也就够用了,但我们可以再折腾一下,做点无聊的事情:
public class EachBuilder<T> {
    public IEnumerable<T> List;
    public StringBuilder Builder;
    public List<Action<T>> Actions;
}
public static EachBuilder<T> BeginEach<T>(this StringBuilder sb, IEnumerable<T> list) {
    return new EachBuilder<T>(){
        List = list,
        Builder = sb
    };
}
public static EachBuilder<T> Push<T>(this EachBuilder<T> sbe) {
    var action=new Action<T>(t => sbe.Builder.Push());
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> Line<T>(this EachBuilder<T> sbe, string text, bool ignoreIndent=false) {
    var action=new Action<T>(t => sbe.Builder.Line(text, ignoreIndent));
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> Line<T>(this EachBuilder<T> sbe) {
    var action=new Action<T>(t => sbe.Builder.Line());
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> PushLine<T>(this EachBuilder<T> sbe, string text){
    var action=new Action<T>(t => sbe.Builder.PushLine(text));
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> PopLine<T>(this EachBuilder<T> sbe, string text) {
    var action=new Action<T>(t => sbe.Builder.PopLine(text));
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> PopLine<T>(this EachBuilder<T> sbe) {
    var action=new Action<T>(t => sbe.Builder.PopLine());
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> Pop<T>(this EachBuilder<T> sbe) {
    var action=new Action<T>(t => sbe.Builder.Pop());
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> FormatLine<T>(this EachBuilder<T> sbe, string format, Func<T,string> args){
    var action=new Action<T>(t => sbe.Builder.FormatLine(format, args(t)));
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> FormatLine<T>(this EachBuilder<T> sbe, string format, Func<T, string> args1, Func<T, string> args2) {
    var action=new Action<T>(t => sbe.Builder.FormatLine(format, args1(t),args2(t)));
    sbe.Actions.Add(action);
    return sbe;
}
public static EachBuilder<T> FormatLine<T>(this EachBuilder<T> sbe, string format, Func<T, string> args1, Func<T, string> args2, Func<T, string> args3) {
    var action=new Action<T>(t => sbe.Builder.FormatLine(format, args1(t), args2(t), args3(t)));
    sbe.Actions.Add(action);
    return sbe;
}
public static StringBuilder EndEach<T>(this EachBuilder<T> sbe){
    foreach (var item in sbe.List){
        foreach (var action in sbe.Actions){
            action(item);
        }
    }
    return sbe.Builder;
}
我们把StringBuilder通过通过BeginEach绑定一个IEnumearble变成一个EachBuilder,然后为EachBuilder提供一组同之前同语义的操作,这些操作内部只是把要做的事情通过Action的形式收集起来,保持顺序。在EndEach的时候,再一次性对之前绑定的List做操作。这里我希望使用者感觉这些API和之前的版本没有太大差别。当EndEach完成的时候,EachBuilder就再次转回到StringBuilder。从而,我们可以把代码写成:
sb.Line("#include \"./PackageUtil.h\"")
    .Line("PACKAGE_HANDLE PackageUtil::CreateEmptyPackage( PackageHeader& header )")
    .PushLine("{")
        .Line("int ret = RESULT_FAILED;")
        .Line("PackageInitData initData = {PackageInitDataType_Header,&header};")
        .Line("switch(header.PackageType)")
        .PushLine("{")
        .BeginEach(protocols)
            .FormatLine("case XXX_PACKAGE_{0}:", p => p.Name)
            .Push()
            .FormatLine("return CreatePackage(PackageTrait<XXX_PACKAGE_{0}>::GetClassName(),&initData,&ret);", 
               p => p.Name.ToUpper())
            .Pop()
        .EndEach()
        .Line("default:")
        .Push().Line("return NULL;").Pop()
        .PopLine("}")
    .PopLine("}");
这样,通过切换模式的上下文,就达到了对API语义的切换,使之适用于批处理。可以看到上面的代码的结构和目标生成代码之间具有结构的一致性。如果我们再无聊点,折腾一些模板语言来“声明性”表达这个过程,再写一个parser把它转换为上述代码的逻辑,我们就可以定义一个DSL,这是后话。通过同样的方式,我们可以为树形结构设计BeginTree、EndTree。为图结构设计BeginGraphics、EndGraphics,and so on。

渲染

从上面的过程,我们可以说代码生成器和渲染器(至少OpenGl)有诸多共同的地方,我们可以说代码生成就是在做文本渲染。开头说过网络协议本身是一个状态机,传统上,认为写网络层代码是一件“难”的事情,然而,网络协议状态机是一种适合严格的形式化方法的场景。协议包可以被生成、协议的状态机可以被生成、这样我们可以把精力放在如何设计协议、如何设计好的拥塞控制算法等等真正需要数学和脑力的地方。

2015年2月27日星期五

昨日的世界(七)

【注】早期的笔记本里的东西,不修改地数字化。持续更新中...

2004/12/25 圣诞节
又是一个圣诞节,清冷的夜里,你我独步天涯,风卷残荷般的凄清,雨打芭蕉似的冷静。心灵深处无尽的愁丝在骨子里渗透,挥之不去。手中的笔如当初一样朴素,生活亦不随时空转移而失去永恒不变的生命主题:矛盾。在这个少雨多风的海边大学里,继续延续着所执着的梦想。慢慢淡去了情绪化的极端思想,而对健康更关注了。
走过之后,才发觉没有想象中的惊奇,反而寄注了深深怀念。多少人或沉或浮,心却总是平静的,不应失去天枰,理应不卑不亢。任然需要勇气面对每个海风轻吹的日子。善于安排精神家具,便织出五彩生活。或忧郁或坦然,全在于对自己的把握。理性与感性交织在一起。理想的至善、至美、至健、至洁、生发出平淡隽永的生命资本,在心灵的港湾荡漾。
携一丝风,圣诞快乐。

2005/1/17 海风
依然是不成熟的一个人,还是在寻找,有些已经找到。想是这样的。虽然有些小隙,毕竟是很幸福的了。
明明是一个很善于思考的人,明明有时会出奇的有创造性思维,却常常像一个反应迟钝的人,有时很搞笑。所谓本性难改,可是生活里应该慢慢。不,应快点成熟,还有开朗点,常说包容,其实自己并不包容,应该做到。
孤独吗?不再孤独,心灵有时依靠,挫折常常犯,1+1=3的“错”。可是天性如此,极力改之,只有学会随时随地可以保持稳重,保持冷静的思维,不可以头脑发热。
荷尽香来。

2005/1/17 风很紧
哭吧,2003很快就变成了2005,这本日记本横跨了过来,所有的辛酸、快乐、悲痛、幸福全在它的背后。虽然只是记录着某一个人的感情,前后却不知有多少个人穿插其中,多少感情交织于字里行间。忧伤似乎是主旋律。然而,性格使然,如我所言:性格加生命、生活,忧伤留在心里,真的没法消除宿命?
笑吧,尽量记忆那些值得我为之灿烂地哭的影子,每一个细节,我都回忆的起来,甚至于每一个文字、话语、动作、特别是眼神。我的生活还是有那么多可以为之一笑的!
然后静静的,净净的。每片发黄的旧纸都是带有感情的,让我哭,让我笑,成为我所拥有的!?

2002/11/23 书摘:刘墉《无聊人生》,汗,我还以为我写的...
有时候,在白天或夜晚,不为什么地,你无法让自己安静的做事,或者,只是安静地坐在房间里。于是,你翻遍电话簿,找到一些朋友或熟人,约他们去某个地方,与他们聊天,与他们打牌,......,但是,那些熟悉的笑声与话语及游戏,不能让你安静,虽然坐在那儿,却不断地有离开的冲动,当聚会结束,你感到说过的一切和听到的一切,竟然那么无聊。你想你应当一个人独自面对世界,但你无法安静地坐下来,于是沿着街道,你从城市的东方向西方漫游,又在西方与南方之间徘徊,你觉得你想找寻一些什么,然而又不太知道要找寻什么,于是就这样飘荡着,像水中失去了根的水草,飘落的花...

2005/1/17 窗外有风
今天是17号。
肖诗以前的号码是17号。
也是妹妹,如同13号。13号终于成了我现在的号码。给我带来天上注定的一切?
难道对妹妹肖诗没有悔疚吗?不,只是一直找借口,但是我写下记下这悔疚有用吗?她还是受到伤害,...,我是自私的,对她而言。
一颗心,善感孤独的自私、复杂、沧桑(没活力?)的心在寻找减轻父母担子的路上犯错(获取不是)。
知道吗?我只是真真的把肖诗当妹妹的。可是,这却也错?现在要真真当Donkey为妹妹,亲妹妹。
时间让痛苦都覆灭,怀念让心灵沉淀。

2006/1/18 奇点
夜深了,我还在听着音乐,写着自己的世界。
真的解析不了自己,像个不连续点函数,到处都是奇点。肖诗曾说我会在这个社会里碰一鼻子灰,甚至会是个流浪汉。当时我说,那总得有人收留我。
我的信仰就是雨,只要下雨,我就会没有烦恼。我以为雨把世界洗涤的干净了。喜欢“雨道”,喜欢“在雨道里奋然前行”这句话。“山村的门虚掩着”也是喜欢的话。喜欢“...”
既然在过程中可以无所谓,也该有勇气为结果负责。能在每一步都走好当然最好,只是强求着避免某些错也不是办法,经历过,然后不在犯,就很好了。















2015年1月16日星期五

昨日的世界(六)

鸿沟 2013-6-x

前阵子看《了不起的狐狸爸爸》,感悟很深。对现在的我来说,你就像片子里的那只狼,无法对话。

只能求同存异了。2年前的不同还只是出于被洗脑的状态。但现在无论如何我是自己独立思考形成的世界观。我在一个一个概念的去区分开来。以前很多东西都混在一起,比如善良、正确就是两个概念,他们是正交的。我想我的世界观倾向于解构,而你越来越倾向于综合。并且你现在观于神的那部分我想我还只是简单排除并未真正自己去系统思考。你知道,像我们这样的人,是无法不经过自己严肃思考而就选择认同的。

不过。我不信神,但我认同人要谦卑、守信、尊重这些理念。

所以,历史上我曾经犯过的那些不谦卑,不守信,不尊重,都属于我的需要自省的部分。我无意逃避这些,面对自己才能活得真实。只是我的这些东西不需要外在的更高级别的存在去支撑。

我承认,这些描述都不严谨。

有时候我会想,或者我选一个大心灵鸡汤就信了就得了,也许就安心了。

但是,你觉得可能么?

我想要的生活 2013-7-x

所有人都在说这句话的各种翻版,「关键是你要做什么」,对我来说挺明确的:酸甜苦辣的生活(ing,basic),探究本质(认知,我认为活着的一大意义就是探究世界,并且我认为科学是人类目前为止最靠谱的),活得真实(不想被各种虚妄的概念所欺骗,这就是我所说的MetaDebug),自由(这个暂时不说,没想好什么是自由)。



如何理解一座城市 2013-10-9

在厦门路痴了10年,靠被动式的[熟悉]建立起了在厦门生存的惯性,反而只在厦门住过一年的萍儿比我还熟。

换了一座城市,深圳。多种原因导致无法再像之前那样做惰性熟悉。如生活上,衣食住行都需要对这个城市有一定的熟悉度;如精神上,需要建立起对新城市的好感和熟悉度以平衡厦门在我脑海中建立起来的偏好;如思维方式上的改变,无法再像过去一样思考,如今的思维方式更加理性,而理性告诉我需要懂机理,对于城市而言,理解其机理就显得尤为重要。

标题是如何理解一座城市。我正在理解深圳这座城市的开头,为哈却急着写下这篇帖子呢?原因很简单,我需要梳理下理解的步骤,这样才能有条不紊,循序渐进。

工具。
1、google地图。
2、百度地图。
3、街上买的纸地图(上面有居家旅行饮食公交等各种信息)。
4、触摸式手机。
5、公交车。
6、城市生活线上社区,比如对于厦门来说有小鱼网,对于深圳来说估计就只能是58同城之类。
7、网上信息和电话查询。

人物。
1、自己。
2、同学。
3、同事。
4、以前来过这里又离开的人。

硬件内容。
1、城市的周边接壤城市。城市的大分区界限,以及大分区之间的主干道。
2、锁定主要需要熟悉的分区边界。
3、主分区的小分区,小分区之间的干道,河流,山,小分区之间的干道。
4、主分区的主要地点,景点,公园,美食街,大学,企业群。
5、主分区的各大超市分布。
6、主分区的各大菜市场分布。
7、主分区的银行分布。
8、主分区的公交路线。
9、主分区的便利店分分布。
10、主分区的功能分类。
11、主分区的幼儿园、小学分布。
12、主分区的政府办公分布。

软件内容。
1、饮食文化。
2、购物文化。
3、社交文化。
4、教育文化。
5、企业文化。
6、政府文化。

大致先写这些内容,需要按分辨率,从轮廓到细节逐步去记忆、体验、理解和内化。我希望自己不肤浅的去理解一座城市,而不是只缘生在此山中。


经过1-2天研究地图,我明白了理解一个城市,需要优先对着地图把主干道的方位识别清楚。以深圳为例,深圳自东向西,分别是罗湖、福田、南山、宝安。然后我在南山这边,所以就先不管罗湖、福田了,只要记住从罗湖到南山是有一个地铁东西横穿就可以。对于南山,中间有条大沙河,我在科技园,是在大沙河的西侧,所以大沙河东侧就不用细究,只要记住有华侨城、世界之窗、红树林等就可以。到了南山大沙河左侧,主干道从北到南有:北环、滨海大道;从东到西:科苑路、南海大道、南山大道、月亮湾。滨海大道北侧是科技园,南侧是深圳大学。科技园里,北到南有:高新1、2、3、4道;西到东有:科技中1、2、3道。科技园再往西,是麒麟花园等生活区,再往西,是中山公园;通过这种对主干道,主要地点的不同分辨率识别和记忆,我很快就理解了深圳的轮廓。

深圳的商业城跟厦门没太大去吧,海岸城类似厦门的中华城。深圳的小吃店则地沟油貌似居多,厦门的话在厦门大学西门那边还是有几家非地沟油的好去处,深圳这边目前看来只有麦当劳最放心。我发现南油这边的面店喜欢做猪杂、三极第等,这实际上是很不健康的,猪肉本来就不如牛肉,加入内脏就更差了,要少吃。

深圳的公交车比厦门的干净。公交车有专门的乘务员,手持移动刷卡设备逐个乘客去刷卡。刷卡起步价是2块钱,跨段加钱。厦门则岛内都是1块,只需在上车的地方固定位置主动刷卡即可。不过深圳公交车的乘务员很专业,是否有人上车,是否有人下车,是否开门,是否关门,到哪站了,有座位了啥的都很周到的调度,乘务员要一直站着,一天下来很辛苦,但她们是我见过最专业的调度员。


深圳的软件园其实并没厦门的大,但这边的大公司多,厦门是个好地方,我觉的厦门如果增加点什么政策好处的话,其实是很有希望吸引大公司去那边落户的。毕竟厦门的空气和城市环境整体比深圳好很多。

这几天找房子,有实地去很多地方走,经验是如果靠近工厂,靠近北环这种大马路的小区不应该租,太吵或者空气不好。

先写到这里,其他时间有想到就再补充,目前看来只会是流水账了。

2014年2月10日星期一

昨日的世界(五)

最喜欢这样的日子了,雾白充斥着整个天地,世界只剩下门前屋后的房子、田地、小鸡、小鸭和每个天真可爱的小女孩,还有屋旁的十几棵参天大树。周围的一切都隐没了,隐没在那白茫茫的雾里。家里只有奶奶和爷爷,所有的因素都是宁静的,雾里飘散着对面的柔和的歌声,如雾般柔和。独坐在屋檐下,止水般宁静地望着小鸡欢叫、小鸭梳理羽毛,有时跑过去和无忧的小孩一起吹泡泡,然后看着那泡泡飘向柔白的雾天里。好漂亮的泡泡,感觉真好,让宁静的心只剩下快乐,或许还有幻想。
霜冻过的竹叶有些发黄,掺和着雾白,朦胧地留在这幅完美简单的画里。那如影母子大杉,依然如故,一高一矮,一胖一瘦。再简单宁静,莫过于春影似雾的山村了。荒芜也隐于雾里,忧伤也隐于雾里,所有都隐在了雾里。你想听吗?听雾里的猪叫,听雾里的鸟鸣,听雾里的车响,听雾里的欢闹。雾里有一切一切的现实和幻想。没有不和谐的因素,只有雾白,雾白,雾白。
延伸到天尽的雾白中的电线,或许代表那漫漫长路,那路的开端永远是这端的静静站立等待的电线杆和这房子。每次都回到这电线杆,回到这雾里,回到这宁静,回到这和谐。
最是今年雾迷人。
——2005.1.29
 
人是会长大的,会的。
时间依然是最公平的,对每个人都是一样的。总有一天,我们都不得不面对这世上我们会碰到的许多事。所以我们终于会学会自己去处理,去接受,而不再幼稚。
命运如此地安排,谁又能抗拒得了那样一种平稳的框架呢?平淡地看待和成熟地面对似乎一开始就成为我们要去实现的。
继续吧,没必要刻意去规划,却要做好准备,毕竟生活还是无常的。
——2005.9.3

当一切都结束时,不属于我的一切人、物都从我的世界里消失的时候,我还会剩下什么呢?什么是值得我去付出的呢?有人说当我们都成为一坯黄土的时候,我们只剩下别人对我们的记忆,只活在那些依然想着我们的人心中。
所以呢,还要多说些什么呢?平静地去好好把握每一天,不要虚度年华,而今,依然不晚。自尊,自信,自理,慢慢地走出一条路。
——2005.9.11 

记不得今天是几号了,一段时间沉在书里之后,今天突然又觉容而怕,似乎有什么东西没做好。不知道哪里来的压力?好像没有什么是能真正留下来的。喧嚣之后那种人去楼空的感觉突然在心里扎根?不要。
电话卡里剩下3、4元,一直没再去充值,只是没有零现金了。想打电话没得打,即便卡里有钱又能打给谁呢?那些逝去飘去的东西加上这样冷风拌成的凉意荡在心里,使感情真心的人难过,别人怎会理解呢?
一丝感伤随着知秋的一叶徐徐飘落,想就叫人心痛。
——2005.11
 
翻开旧旧的《视野》杂志,是今年年初买的,有几段话真的不错,摘其精华如下:
只有完全成熟的人,才有真正的秘密;不太成熟的人,只有暂时的秘密;不成熟的人,没有秘密。
如果你是个铁骨铮铮的好男儿,就应该学会把痛苦作为一种秘密深埋在自己宽厚的胸膛里,永远用你的微笑去面对父母,去感染妻子,永远的用你的笑声去浇灌孩子烂漫的心灵。
意志薄弱的人,为了摆脱孤独,便去寻找安慰和刺激;意志坚强的人,为了摆脱孤独,便去追寻充实和超脱。
感情上的幸与不幸,只有当事者心里最清楚,旁人常常在妄加猜测。有的人脸上有太多太多的微笑,是因为心中有太多太多泪水。
——2005.11

以后应该少吃些泡面。
泡面的味道总是那么迷人,泡面对于我而言还有许多特别的意义。泡面伴我至今,有许多事情和泡面扯上关系,所以吃泡面总会令我想起许多许多的情景,有许多美好的回忆拌在泡面的香喷喷热气里,有许多伤感的回忆混杂着泡面辛辣的味里。
时间在前进,泡面在变化,心情却总会流连、重复、循环。
吃泡面的时候是幸福的。
——2005.11
 
很想事情都朝着好的方向发展。理性的白天里,应该知道如何去做。背负着的令人不安的因素深埋在地下。
飘流着是没有理由、没有借口的,此而让自己放游的。每个海风于吹的日子都该有所得,为了心中遥想的路而奋斗。
毕竟要为自己负责,稳健的心态才能成为真正成熟的人。付出才有回报,真诚做人的原则永不悔。
——2005.11
 
我思故我在。想象的天空里梦想在延伸,荷默有自己理性的原则,用心真诚地为人,坦然面对挫折和胜利,健康成长,梦想会实现。
做有建设性的努力,不再孩子般思考问题,成熟是稳健的。美好的回忆留下,伤感的故事沉淀。亡羊补牢,犹未晚。
每天都是新开始,好好地把握才能成功。
——2005.12.17
 
得失之间,存乎一心。
平凡的或伟大的都是一样的。学会做一个普通人有时候很有必要的。所谓善者,才会是大家。开阔的,包容的,才会是精华的。视野大,才不会留于一时的捉襟见肘。所谓大家亦有相同之处。或者称之为修养,文明的成分。
美好才能赏心悦目,至于糟粕自当远之。勤快是可以弥补环境的先天的缺失。不怀偏见与明亮的胸怀是应该自然流畅地融入本身。
至于拍案而起之锋则可取其气而隐其形,不必拳脚相加、口诛笔伐,礼仪相待,当之谓修为、教养。
——2005.12
 
没有任何进展,效率很低的时候是最让我伤心的时候,希望还只是遥不可及的梦想,或幻想。I want to catch something,但是事实让人很失望,心里真是莫名地难受,好难受,好难受。除了努力,就是泪了,真希望事情早点做好。
——2006.3
 
感冒了,昨天头非常的痛,浑身无力,多亏了同学的感冒药。折腾一天之后,头不痛了,然今天开始流鼻涕了,好难受。但相对于昨天那种程度来说已是不可多得的好,至少有力气,可以吃点东西,不至于爬都爬不起来。仍旧是不停喝水,汗水也就不停地浸透全身衣物。想哭,真想回家。什么都做不了,也什么都不想做,只想早点结束这非人的日子。
——2006.7
 
台风真频繁。六月、七月、八月、九月的时候,台风会有好几次。
台风来的时候总会带来风雨,心里就总会凉凉的,不知道以后台风的时候自己会是在哪里度过的。
梦里的泪光,枝枝节节,牵牵连连。漂走了,永远不会回来的似乎只有自己懂。
空间要撑起来,生活总是挤压空间。
萍真的很忙,我要去打扰她么?一个老是不成熟的人,可恨。
有时偶尔觉得自己漂的好远了。悲伤深处的圣光还是没见到。
伤神的台风,凌乱的夜晚。
——2006.7
 
当许多人都不再写日记的时候,我却还把自己置于这字里行间。
迂腐的只是形式而已。
跃跳度太快意味着不合逻辑,而不合逻辑的就是可笑的。
不懂你在说什么!
当然我明白你想说什么,你想表达什么,然而你没表达清楚。
天真,幼稚。
真的是这样吗?
你相信吗?
梦里的月光迷人,人憔悴。
——2006.7
 
治一种病症的药是好药,
治多种病症的是止痛药,
包治百病的是假药,
药到病除的是毒药。
——读者小语
——2006.9
 
对于爱情,是不能说的,写的。
爱情就多用心,感觉,把握。
婚姻就微调。
——2006.10
 
当然,又是过了很久,才坐下来思考。平常的时候,有时会突然不知道身在何处,将来要做些什么。常常情况是这样的,郁闷大了,失落极了,全身上下充满不安全感。迷惘是非常容易的,但是因为这样,所以努力的时候有个方向、目标。又常常是这样的,挺高兴的。这次一不小心咸鱼翻身了,然而一小段兴奋期过后,你才发觉其实自己依旧是那个自己,前进的路上更需要静下心来去做些什么,踏实地努力着,点点滴滴地把握和渲染,也许这样心灵才会平静,生活才有意义,生命才具价值。
——2006.10.11
 
曾经有一段话陪伴了我。
想永久地记住:
面对失落的痛楚,不要把悔恨的旧梦重拾。沉浸往事只能倾斜心灵的天秤,寻觅过去只能拾回尘土的梦幻。面对失落,应勇敢地追求新的目标,找回精神的追求。失去太阳,请不要流泪,我们还有群星。
——2006.10.11
 
希望能成熟点,让自己的优点发挥的作用大些,不要被缺点绊住脚,要懂得扬长避短。
如果一个环境下没法改变自己的形象,那就换一个好了。某些不可能擅长的东西不如放弃,尽量不要被生活激怒,让平和的心态,坚韧的心占重点。回忆是个漫长的过程,相信自己可以的。头脑要会冷静,尽量不要得意忘形或自以为是,不可以轻视任何人,平等地对待自己与他人。
坚持这样,才会充实,才不会给自己抱怨和后悔的机会。一个人可以哭泣,绝不可以失去自我和没有勇气。
就这样。
——2006.10
 
当我试着给未来一段日子列出一串长长的清单时,当然是指专业书目,我突然想,人的精力有限,而这个世界上的书何其多也,难道我真的会将如此众多繁杂的知识都弄个清楚?况且并未深究,而只是想管窥一斑,都已有如此之多的了。
于是我想是否该重新考虑一下舍取,因为大部分时候要想做出精品只有一种办法,那就是:只做一件事。许多人坚持不涉及另外领域而只是专心一事,但他们做的却绝对是这世上做这事做得最好的。也许,我也因此该专心一事了。
想要的太多、太离谱,反而什么也要不到。明白了这一点,也就懂得如何活得快乐,活得踏实了。
——2006.10.29
 
注定着我不是个甘于平淡的人,看过别人的奋斗历程尤其如此。然而每每只能在想象里看到那些行动,注定我极少地实现那些想来令人激动的事业。原来我是如此的保守与不敢冒险。
心里的躁动与不安总是要涌出来的,有时候显得只有去等待与忍耐,也就是说总有一天要去实现那样的抱负吧。
然而我的性格与环境常显得不谐调。也许我还缺少一些实现梦想的要素,譬如说一个伙伴。实力呢?
难道注定我是个学者?
学海无涯,生存的压力又是常有的。也许眼光该放长点。可能环境影响,有时显得不如别人那样大方,或许我无法不去想这些,因为我不是别人的缘故吧。
——2006.10.30
 
一个人默然前行的时候,有时会感到渺茫与失望之极,不知道从何拾起。猛然间会发现自己能会的原来如此稀少,那种失落的感觉会使我沮丧。
为何自我组织也许是要解决的更为本质的东西吧。
分形,如此美妙的数学我喜欢。

2014年2月8日星期六

昨日的世界(四)

每次整理旧文档,都能在角落里找到以前写的碎片文字,故曰「昨日的世界」。下面这些是写博士毕业论文的那段时间的碎片。无论想法我现在是否还赞同,都在此记录,保持原本的内容,以时间为序。

----------
 20120312
----------
1、开源的本质是我想用我开发,我开发自己用,觉得别人也可能要用,于是我开源。我开源,如果有人觉得他也想用,于是他可以参与开发。并不是我要参与开源,所以开发。

2、封闭的坏处是把人绑定在一个平台上,限制选择,20年前是微软,如今是苹果,如果以前微软是邪恶的,如今之苹果亦然。

3、使用CMD的理由是,windows原生的,不是用第三方exe的原因是保证任何pc上都可以用,js和vb脚本可以用的原因类似。

4、苹果的AppStore依然是卖盒装软件的思想,其做IPAD,提出postpc的目的很可能是为了把pc干掉,因为pc上的盒装软件已经死亡,所以他要创造一个新的封闭环境来维持盒装软件的思维。其对手是Google和亚马逊。

5、所有的AppStore最终都会饱和,每个领域的软件都只剩下一些强势软件,于是开发者在上面的利益渐渐变薄,开发者生态链无法维持而走下坡路,走HTML5之web路线才是正确的路线。做客户端也类似,要摆脱盒装软件思维,这也是互联网企业的精髓。苹果不是一家互联网企业。

6、豌豆荚这种可以随意下载各种盗版软件的软件是会毁掉Android的,原因是因为盗版软件并不是专有软件的死敌,而是开源软件的死敌,盗版软件使得普通用户不会想到去用开源软件。这对开放的Android来说是不利的,正如过去30年来pc上的盗版软件一直都是开源软件的死敌一样。由此可见李开复的创新工厂是一个没有多少原则和理念坚持的拷贝工厂,与YCombinate有天然之别的差距,Y Combinate的创新理念很多都很让人震撼。

7、版本管理是需要的,即使只是自己写自己用,如果有个版本管理,比如使用Google Code svn仓库,哪天有人需要用最近版本的时候就可以去直接checkout出来。

8、GOF设计模式是针对OOP编程打的各种补丁,在非OOP语言里面未必适用,比如javascript里面生搬硬套GOF的设计模式就很奇怪了,javascript更多的语义是函式的,而不是物件导向的。

9、专注是很重要的,专注于那些你认为更有价值能让你举一反三的东西上,而不要被那些繁华喧闹的表面的东西所累赘。只有坚持一点一滴去积累,才能厚积薄发。而每一次的前进并不就代表使命的完成,而只是进阶路上的一小小步伐。业精于勤荒于嬉。

10、专注的技术是否真的能改变世界,我觉得我们还是要首先让自己懂得沉淀。有一颗坚韧的心,不被外界的各种走捷径的坏习惯所诱惑,坚持原则的一致性,努力的实践性。这样无论如何,你是能做点扎实的东西出来的,未必会如现今这个言必称成功的世界所定义的那样成功,但在于修为上的自我完成。

----------
 20120315
----------
1、任何一件事,都应该用技术的方式去对待。何谓技术?技术意味着专业,不是像门外汉那样手忙脚乱,行事没有章法。所谓章法,就是纲举目张,凡事都得有个清晰的目录式设计在脑海中。好记性不如烂笔头,作为专业技术人,应当时刻用手中的工具将抽象和模糊的东西具象化,并且有高效的执行效率。什么叫高效的执行效率?想到一个东西,一个点子,一个解法,都立刻记录下来,形成文档,是一种高效。做事情懂随时懂得遇3则优的原则,批处理的思维运用自如。专业是与差不多先生格格不入的,比如对于汉字,决不允许错别字的存在便是一种每个人都可做到的专业。对于一个事件,是人云亦云,还是独立思考,这便是区别。专业和技术,意味着举一反三,知识和能力的迁移。
2、气质,是一种心态和形态。30而立,很多以前吊儿拦挡的习惯都得改掉。
3、几句从小到大的名言重新拾起来。所谓「朝花夕拾」?
   凡事预则立,不预则废
   业精于勤荒于嬉
   行成于思毁于随
   千里之堤,毁于足下
   静坐常思己过,闲谈莫论人非
   人生在世学几何,学了几何又几何,不学几何又几何。

4、白天忽然想怂恿spacenet去读研,觉得如spacenet这般不做则已,一但认真去做一件事,必然在技术上吃的很透彻,做出来的东西绝不是忽悠人的,很精品很精髓的风格,如果去读研,比然能留下一段传奇。在等公交车时半开玩笑的跟spacenet说起,他立即用自己一贯的迅速回应说,他就本科生水平,在美国他就是本科生水平,研究生的东西(比如数字图像处理,上次他说过),他是看不懂的,他现在就是本科生水平。姑且不论spacenet是否属于自我设限,就我所知,他在很多方面,包括实践能力、方法论等等都是属于上乘的,至少在厦门,他是当之无愧的windows cmd脚本之王。解决问题的方式方法,完全符合计算机科学的内涵。而且他看过诸多各类技术和哲学类书籍,在逻辑方面的反应其实远超过我的速度。我只是在抽象层理解上比他多训练了好多年,我这边博士生很多时候啃东西未必有他那么透彻和精髓。spacenet说自己只有本科生水平,多半是指在计算机科学的数学部分上他看的吃力。而据我看过的书《黑客与画家》分析,计算机科学本质上是一个多学科的杂物,比如涉及到硬件部分实际上可看做是物理学的部分,而涉及到软件部分,则属于编程部分,而涉及到目前的很多研究上,特别是发paper的那部分,实际上很多人做的是数学,而非计算机,计算机只是他们的一种实验。这可以举图像处理,我跟过一小段时间,用到的很多论文都实际上都属于应用数学,只是带有很大比重的实现算法的编程部分,许多计算机系的硕士或者博士,压根就没把那些数学部分理解掉,甚至推导都没过一遍,这是糊涂账部分。当然,并不是说你数学很牛逼就可以把这块做的很好,就像一个英文很好的人未必能写出莎士比亚的作品一样,数学只是一个基本的行内人都看得懂你在说什么的通用科学语言和工具;同样道理,不是你编程很牛逼就能做好研究,编程很牛逼只是说明你对某种语言掌握的很到位,你对软件设计很到位,但计算机的科研,不只是做软件这么简单的事。我理解起来,计算机科研真正做的好,是必须综合以上几部分的理解力之后,加上创造力和持续探索的精神才可能做出点什么出来。一如我在数学领域所理解的一样,能把数学的知识层面吃透的人实际上很多,但是真正有创新力的不多,创新是需要有想象力和构造能力的。我最欣赏的莫过于欧拉、高斯、黎曼、拉格朗日等等构造大师。再提起,创新之前得会找问题,好的问题是我们所缺失的,100多年前希尔伯特提出23个数学问题,使得数学在上个世纪上半叶取得了辉煌的成就。我们国人学生,甚至老师,往往提不出什么问题来做,一般都是所谓跟踪热点,在哪个方面上都落后于人,这当然有多种原因,比如没有专业方向所对应的发达产业,实际上你提的问题都是闭门造车。

5、电子书实际上并不会真得就完全取代纸书,因为电子书再怎么发展,也无法取代实体书的那种质感,随意翻页翻阅的感觉。Apple的新版电子书阅读器诚然在书籍的领域取得了挺大的进步,然而据spacenet观察,那种加入多媒体的手法,在精确性敏感的理工科书籍上有明显的优点,但是在人文哲学领域未必有优点。打一个比喻,很多电影再怎么好看,也总是无法取代原著。我越发喜欢看小说甚过看电影,电影的画面定格给于观众的想象力空间有限,书则不同,带有大量的想象空间。这其实涉及到1对1映射,还是1对多映射,甚至多对多映射信息的关系。一千个读者就有一千个哈姆雷特,多媒体恐怕在这方面未必胜于文本。再罗嗦一句,象形文字最早就是图画。

6、我讨厌病毒和木马,不过我更讨厌杀毒软件制造虚假的病毒和木马威胁感。自由和安全,都应该交予自己。

7、封闭的格式应该去兼容开放的格式,而不是开放的格式必须去兼容封闭的格式。

8、IT产业,什么才是其核心的价值?信息,意味着什么?

----------
 20120316
----------
1、遇到一个问题,从现在开始,要避免不分析问题的前因后果,不对问题的上下文做一番调查就开始做出回应,或者试图毛毛糙糙的把问题推给非义务人去解决。从现在开始,放弃一切试图让非义务方解决自己造成的问题的思维方式。独立之思考,当然需要以独立之解决问题为支撑,否则,独立之思考只是及其狭隘的。

2、谨慎让朋友帮忙,很多时候,你认为不是问题的事情,可能对朋友来说是很为难的事。没有对你有这种义务,这个经常会犯的错误,早该反思反思了。任何情况下,对有隐式和显式雇佣关系的对方,不要混淆雇佣关系下形成的习惯和友谊关系下形成的习惯。否则,会造成很多问题。

3、spacenet人很好,我没说要他帮我弄一个充电器,他却虽然吐槽了好几次,今天却给我弄了个5.3伏的充电器,我突然觉得很惭愧,跟spacenet接触这么久,明明很多正确做人做事的道路都听过无数次,还是在自己身上残留很多坏习惯,很多时候却试图用自己吐槽过无数次的那种思维方式去解决自己遇到的问题。这算是一种隐性的叶公好龙吧,静坐常思己过,我会一点一滴改掉的。

4、毕业这件事上,自己一直没能正式面对,论文投稿的事也怪自己。想想5年前本科毕业的时候对论文的差不多先生思维导致自己的本科毕业论文很一般,几乎是很水,现在难道要让自己重复当年之遗憾么,我想我不应该让历史重复,所以,我决定把最后的时间好好用上,认真把自己的论文写出色。人生难得几回搏,此时不搏何时搏。

5、重构c++代码的时候,觉得以前的很多代码特装B,明明不需要用到那么复杂的东西,却设计成那样的复杂,一个人想要提高对代码的敏感度,最好的方式是每隔一段时间都去重构自己之前的代码,长久习之,定能成大器。现在我也开始讨厌随意使用模板类,感觉模板类只应该由基础类库提供,自己的代码非不得以不要使用,尽量用简单的方法去解决问题,而不要使用各种所谓高级语言特性,对语言特性的热衷现在开始衰退了,不过并不意味着语言是无所谓的,只是说在使用任何一个语言的时候,都能够控制得住自己,保持简洁。不过度设计,过度实现。这很符合人生哲理。

----------
 20120324
----------
1、凡事预则立,不预则废。


----------
 20120522
----------
→白驹过隙
打开log文件夹一看,上次写点随笔已是两个月之前的事了。时过境不迁,翻看当时的日志,犹如昨日之记录。毕业季的这几个月是煎熬的时光,也是磨炼心境的阶段。之前几年欠下的一屁股时间债都堆积在那,我只有一段一段去偿还。凌云六725楼、海运实验楼301和芙蓉餐厅之间三点一线,简单的重复累积着效率、沉淀着心情。未来不再迷茫,梦想不再模糊,依旧的追寻梦想和理想。人说三十而立,我不知道别人在靠近三十岁时是怎样的心情,我自己则是对「三十而立」有着一丝丝感觉了。读书二十年,在书堆中坚持过、在游戏中沉迷过、在亲情中哭泣过、在爱情中执着过、在数学中抽象过、在程序中编织过,不变的是追寻。









2013年8月14日星期三

昨日的世界(三)

tablization
2013-02-06
在公司加班到3点多,回家睡意全无,当年通宵写代码,通宵写论文,通宵看博客,通宵看视频,通宵看书,通宵开心快乐,通宵黯然神伤,各种通宵的那种感觉似曾相识.角色切换,一介码农,所思所想唯有代码.
连续写了3个多月写lua和c#代码,到最好都代码疲劳了,不过我总体来说还是控制住了代码的腐烂速度,没有变的不可收拾,这主要是得益于坚持随时随地的重构工作.尤其是最近这种探索性带有点个人创造性的工作被任务压力紧堆着的时候,总是容易写出一些烂代码出来.可见自己功力还不够,道行还不够深,希望明年内能深入体会和实践kiss原则,唯有内化了的kiss原则才能让自己的代码保持精简而结实.否则的话低级偷懒所带来的重构和测试成本是很高的.
应题,我想要讨论的主要是tab,是的,tab.你正在用tab化的浏览器看我这篇文章,我这篇文章也是在tab化的后台里写的.整个计算机UI史几乎就是在有限屏幕里各种变形tab进行乾坤大挪移的历史.无论是windows的任务栏,还是mac的悬浮Dock,无论是各种客户端软件还是各种网站设计,几乎都是在进行tab的设计.设计好tab,组织和管理好tab,美化好tab,这是UI里最重要的一个环节.设计和实现tab应该要重点考虑哪些要素呢?

以我所见,至少有以下几点需要考虑周到.
1.tab的独立.
2.tab的同步.
3.tab的嵌套.
4.tab的跟随.
5.tab的变形.
6.tab的层次.
7.tab的一致.
8.tab的排斥.
暂时能想到的是这些,有空的话会更仔细琢磨.想要掌控UI,就得不断思考和改进.做UI的程序不能被tab玩死,要玩活tab.我最佩服和欣赏的tab是看不见的tab,存在于你的指尖之下.那就是,the vim editor,vim的有模式编辑,在我看来就是一种顶级的tab,你看不见,不过你却切切实实感受到它的存在,它的犀利,正如命令行是黑客的tab利器.
不过,写tab是很蛋疼的,每次我写到郁闷的时候,就发誓"以后我再也不写tab式软件了!",至少以前跟舍友一起讨论的时候,我们都很唾弃"PPT式"软件.是的,PPT式软件,实际上就是Tab式软件,众观IT世界,PPT式软件无所不在,无所不能,无论什么东西,它都能用PPT给你装进去.PPT是伟大的发明,然而也是偷懒的发明.我们都知道好的PPT和差的PPT会差好几个档次,PPT本身只是一种事物的组织方式,如何用这种组织方式把你的内容,条清缕析,引人入胜的进行组织是一门学问.多思考这些,我们就会发现生活,离不开排版.每次见排版高手们的作品,都很喜欢.不过说到排版,排版式思想只是做UI的一种方法,有其优点亦有缺点,不好的排版策略,会成为"智能的就是傻逼的".比如早期的word.比如LaTeX的图片排版,真是蛋疼.容我吐槽,我现在觉的TeX的精髓应该是在TeX内核本身,而绝不是LaTeX.使用LaTeX并不能带给你排版的真正自由,我觉的TeX内核+宏机制才是能真正带给你自由排版的东西.而不是有限定制的LaTeX.这跟UI一样,只会拖拉控件做UI的永远无法接触到UI的精髓.
今天先写到这,下次,我想谈谈"老头滚动条",或者"上古卷轴".old scroll.

while switch
2013-01-27
2012年写的代码,还是单机版偏多,很多比较核心的模块代码,写起来后发现软件工程神马的都可以去死了,本质上最最最最有趣的居然就是while-switch.while表示要不断去做,switch表示状态切换.与while-switch相伴的几个词是:queue,productor-consumer,thread,try;lock;...
[01].win32消息循环,是一个while-switch,是一个典型的productor-consumer;消息就是个队列.消息循环可以嵌套,内层消息循环和外层消息循环都可以去消费message.message并不只属于外层!程序即数据,把消息即ID.
[02].分组线程池,可分组的线程池;我们本质上也是做成一个productor-consumer,每个threadpool的workitemsgroup就是一个productor,每个threadpool的workitemrunner就是一个consumer;
[03].服务推送,也是一个while-switch.本地应用while监听服务器消息,switch分发给处理者.自动更新只是一个consumer行为.进程间通讯,更多的是互相推送和监听.thrift和WCF都对底层实现做了封装.WCF的概念定义比thrift更具学理:A,B,C.其中A是Adress,通讯的地址;B是Binding,绑定的协议;C是Concat,服务-数据-策略的约定.
[04].下载行为,隐性的while,显性的switch-case;一个典型的有限状态机,下载的行为与状态,界面的更新等等都是很常见的UI场景,这块逻辑一开始写都是比较随意的打补丁,多做几次自然可以在以后新写的时候有干净清爽的设计和实现.
[05].switch-case的关键词是状态,case的是状态的唯一ID.实际编程中很多地方都本质上是用唯一ID定位的,windows下有一个名词叫handle,这东西跟message一样,本质上就是唯一ID.另一个例子是在OOP宿主语言里注册对象给Lua,本质上就是注册唯一ID给Lua就可以.唯一ID要看上下文,唯一并非要全局唯一,有时候只要局部唯一就可以.
[06].while的退出,win32message的例子是发送一个WM_QUIT的消息去结束while.如果是一个异步循环操作,则可以通过一个简单的bool变量在每次循环执行时判断下是否退出,本质上也就是一个if-else.
[07].while的阻塞,win32message的例子是内部的死循环弹出模态对话框.异步操作的例子,是通过每次操作都加锁,需要阻塞时在其他线程获取锁,一旦获取到锁即可阻塞掉循环的下一次执行.

a few tips 4 program
2013-01-27
program是一种技术&艺术.<人月神话>说,没有银弹.对于真正的program来说:向下不断接近硬件,理清大厦的基石如何层层层层构建而来;向上不断面向用户,通过抽象-封装-组合-重构-迭代创造虚拟世界.program有狭义,广义之分:失之狭义,无法享受实做带来的深刻理解和快乐;失之广义,无法由里及外地迁移知识迭代人生.小而庖丁解牛,大而胸怀天下,program的本质在于smart.
1.UML图,流程图,文档本质上都应该是草稿,不是教条,不是目标.是教条是目标是标准化产品;是草稿是脚手架是技艺之结晶.
2.小而精,是为美;大而清,是为良;
3.保持简单,可组合.
4.小偷懒,大成本.
5.简单可并行优于复杂单线程.
6.螳螂捕蝉,黄雀在后.事情往往没那么简单.
7.折腾使人进步,焦虑使人智慧.
8.自由创造.

代码整洁之道
2013-03-09
摘要
本贴记录日常开发中所使用的各种代码整洁技术。在日常开发中,我们需要随时发现重构点,并通过重构使代码保持整洁,从而达到代码的易于阅读、易于维护的目的。开发者总喜欢使用各种其他行业的东西对编程本身做各种隐喻。譬如「建筑」、「写作」、「工程」等等。虽然有的程序员反对这种隐喻,认为编程本身的概念解释就足以阐明程序之道,但软件工程从一开始就借助这些隐喻达到对并不成体系的软件思想的描述和传播。阅读这类软件工程的书,并内化软件工程思想是可以让程序员从普通到优秀,从优秀到卓越。具体来说,有《人月神话》、《代码大全》、《程序员修炼之道-从小工到专家》、《代码整洁之道》、《重构-改善既有代码的设计》、《设计模式-可复用面向对象软件的基础》等等。回顾上述的各种隐喻,我认为用「写作」来对编程做某些方面的隐喻是很恰当的。写作意味着谋篇布局,纲举目张,乾坤大挪移;写作意味着大量阅读优秀作品,不断实践并内化各种软件工程思想,并最终创新作品;写作意味着随时积累小片段,蚂蚁搬家,积少成多,厚积薄发。正是基于上述理由,我认为有必要将日常开发中的小片段条分缕析,归档供查。本贴即是专门积累「代码整洁」相关的小碎片,同时实践“从小工到专家”的思想。

[bolt#]滚动条
2013-02-23
一、折腾。
  今天折腾了一整天没搞定一个问题。下班的时候特别郁闷地发现自己犯了个错误,白白浪费了时间。晚上回来深刻反省,突然明白了很多东西。我觉的有必要在这里记录下,避免以后再折腾。这事得从昨日做程序时间和内存优化说起。
1.时间优化
程序是.NET宿主+BOLT界面组合成的,刚开始我按部就班地先优化程序启动部分的加载时间。基本上是针对程序启动阶段的每个模块的加载做时间分析,按耗时大小顺序进行优化。这部分的优化技术主要包括:
移除无用的加载代码。
延迟加载未直接使用到的模块。
并发加载无空间和时间耦合的模块。
合并和提取重复执行的相同代码。
减少耗时的通信。
尽量减少Dictionary,这是由于string的Hash值计算并不快,数据量大查找慢。

2.空间优化
紧接着第二部分是做空间优化,一开始我只是随意做点能肉眼能看得出来的数据内存优化,比如
- 查找是否有耗时string拼接,改为StringBuilder。这个倒是由于习惯良好,并没有发现。
- 查找无用数据,并去除。
- 查找冗余的数据,合并之。
- 查找大量临时变量产生的地方,添加垃圾收集。
- 用.NET Memory Profile做分析,找出可以优化的内存优化掉。
- 网上搜了下各种内存优化技术,感觉靠谱的做一下,感觉好奇的做下实验。
- 通过二分搜索,找到内存变化比较大的地方进行代码行定位

这个过程并不总是按顺序进行的,交叉进行,然后有一处BOLT调用C#的委托被我注释掉后,神奇的事情发生了,物理内存一下子从100多M减少到30多M,如果加上这句代码内存又会是100多M。然后,我就喊jennal一起来看这句神奇的代码,两个人一起做了半个多小时的测试,最后发现只要在这个调用的函数里循环产生大量临时对象就会导致物理内存是100多M,否则就是30多M。中间我们去吃了个饭,回来继续折腾到10点多没搞定,我就先放弃了,结果坐公交车回来还睡过头,往回走了两站。
今天早上我就早起了去公司继续做单元测试。起初我以为是P/Invoke的问题,经过测试发现不是;接着我怀疑BOLT调用C#导致的问题,做了几组测试后发现只要在这个函数里做GC.Collect()就会导致问题的出现。我就拿这个现象找BOLT群里的几位群主咨询,结果自然是交流了很多意见还是没能解决这个诡异的问题。时间一直在流逝....

等快下班的时候,我发现我在程序启动的地方有调用了一句代码:SetProcessWorkingSetSize(),我把它注释掉后物理内存就是100多M,并不会减少到30多M。这句话这么神奇?马上Google了下,结果发现我被坑了,这句代码压根就是坑爹的。
使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的物理内存.当应用程序被闲置或系统物理内存太低时,操作系统会自动调用这个机制来设置应用程序的物理内存.
这句代码只是把程序的物理内存里没有用到的部分移到虚拟内存,如果对应的内存再次被用到时,会重新从虚拟内存加载到物理内存。这非但不能减少内存,反而增加了内存页错误,降低了程序的性能!我认真想了下,应该是我看到某个博客上的这句话时加过来做实验的,但忘记了删除。结果,就这样浪费了我一天时间。

二、高效
虽然我被坑爹了,但晚上跟BOLT的聪哥聊天,再结合用bolt开发过程的经验,突然我把很多东西串起来了。首先还是从上述折腾说起,这次折腾的过程中我理解到做内存优化必须老老实实地去做减少不必要资源的创建,增加资源的重用(内存池,对象池,连接池,线程池,享元模式【内蕴状态-外蕴状态】,共享对象...),及时释放可释放的资源(智能指针,IDispose,...),延迟加载。简单说就说:减少创建,增加重用,及时释放,延迟加载。具体在语言层面,又可以针对不同的场景优化数据结构的使用,如果是代码过程中的临时变量则应该对代码做调整减少不必要对象的创建等等。
SetProcessWorkingSetSize这个函数会引起内存页错误,当我跟聪哥说出我感觉内存优化的核心是:减少创建,增加重用,及时释放,延迟加载时,聪哥提到OS本身也是大量使用这样的技术,比如物理内存页,虚拟内存页本身就是按需加载,增加命中率(重用)的典型。我一下子就想起来我做的几个支持大数据的BOLT按需加载控件,不也是这样做的么?

我那几个控件都是带滚动条的支持大数据的控件,我归纳的核心做法是(以列表控件为例子):
- 设计两层结构的UI组织模式:ListControl,ListItem
- 设计ListItem的数据模型(ViewModel)比如叫ListItemData,用数组或者其他容器存储,根据不同场景可能有多层次结构。
- 为ListControl设计数据模型ADT:AddListItemData,RemoveListItemData,InsertListItemData,Clear
- 为ListControl设计UI刷新模型ADT:BeginUpdate、EndUpdate

使用方法是如下的Begin、End模式:
BeginUpdate()
   for ....
     AddListItemData()
   end
EndUpdate()

这里的核心原则是:
- ListControl最多只创建可视区域可以容纳的下的ListItem,一开始全部不可见。
- 在BeginUpdate的时候设置一个变量,挂起UI更新
- 在BeginUpdate和EndUpdate之间的代码负责更新ListControl的ViewModel。
- 整个ListControl只在EndUpdate这个函数里更新界面,包括重新绑定可视区域ListItem当前所绑定的ListItemData,设置可见性等等。
- 根据上一条,需要维护一堆ListItem和ListItemData之间的映射
- 所有交互操作,都会导致当前可视区域的ListItem所绑定的ListItemData的映射表的变动,所以全部交互都会采用上面的BeginUpdate和EndUpdate更新界面。

好了,这就是做按需加载支持大数据的控件的核心内容了。但这与操作系统内存有什么关系呢?也许你已经发现了,物理内存和虚拟内存之间的映射关系和ListItem与ListItemData之间的映射关系几乎一样!CPU执行代码就像是我们在操作界面,CPU执行代码时,指令流发现变化,当发现物理内存不存在时就去从虚拟内存按需加载。所以我们可以把物理内存看成是CPU的可见UI,CPU执行代码看成是UI交互,内存换页看成是动态绑定UI数据。这样我就成功地把带滚动条交互的UI模型用在了理解CPU,内存换页上了。然后,所有你在滚动条上做刷新优化的东西都可以用来理解OS,所有OS的优化技术应该也都可以用来优化滚动条控件。今天就写到这里,下次有时间再写其他的东西。

2011年5月25日星期三

昨日的世界(二)

雨丝风片(一)
发布时间:2011-05-19 00:49
许多年前,许多事,久了,就远离那时的环境,然而,文字却还记录着。
夜深读起来,想象着她那时的心境,经历时间,也许她也忘记当时的感觉了吧。
读之,体会之,融入心底。

文/斯雨
我一个人坐在这里,一个可以静坐的很好的角落,倚靠在这棵树下,我以为我会流泪的。
相片中的姐姐的双眼清纯的如一湾碧水,心底流淌着一丝伤感,眼睛里流露着一层疲惫,我不知道我是否累了。不想
回宿舍,那个没有空气的空间。我不懂怎样才能豁达,不懂如何才能坚强,苦苦寻觅,累累伤痕,依然执着。
我不想也不愿让自己变得麻木,眼泪可以温暖我受伤的心,风大了,回去吧,不要苛求,也要学会不变的欣赏。
生命是可贵的,要对得起生命才好,不要轻易放弃自己的执着,都是善良的。

凯奇·中尉
发布时间:2011-05-12 01:21
http://v.youku.com/v_show/id_XMjY0NDkxMjQw.html
尼古拉斯凯奇·坏中尉 09版
观看·5dg·fanfeilong
2011·5·12

什么是幸福,幸福不是房子、车子、票子。
幸福是亲情、友情、爱情。

无题·书摘
发布时间:2011-04-22 09:47
摘自「反省...」
①停车场里有一百个停车位,德国人停一百辆车,因为他们精确。日本人停一百二十辆,因为他们车小。美国人停八十辆,因为他们车大。中国人停两辆。为什么?一辆停入口,一辆停出口。
②一家餐厅为了招徕早起的顾客,推出早上第一个客人免费的策略。第一天,来了一个黑人,吃完后免费,隔天早上,老板一开门,发现门口一篮花,是昨天那个黑人送的。第二天第一个客人是白人,也免费,隔天早上老板一开门,门口摆着一篮苹果,是那白人送的。第三天早上第一个客人是老中,免费,隔天早上老板移开门,发现什么?门口站满了老中。

引号、以及字体
发布时间:2011-04-17 19:28
我不喜欢简体字风格的 “双引号” 和 ‘单引号’ ,以及【】,[]则还行。简体输入法打「」和『』不是很方便。不过我用的是Google输入法,单引号『』可以直接按Shit+[,Shit+]输入,而双引号「」我则是通过在Google输入法自定义词汇里面设置小写字母组合 lr 映射成「」。
最早我不知道用什么字体,看侯捷的书多了后便喜欢上MingLiu字体,再后来写程序用Lucida Console字体偏多,不过MingLiu对中文支持比较好,对英文支持不怎么好,Lucida Console对英文感觉比较好,中文则得看是否开反锯齿。现在我喜欢用对中英支持都不错的Palatino Linotype字体。

记一次纸上测试
发布时间:2011-04-09 16:48
gtalkfriend: 不使用条件判断和绝对值运算,如何用一个表达式返回给定整数的正负符号?
比如f(-7)=-1
f(8)=1
这样子
f(x)改如何构造?
有没有招?

我: ?
刚才不再
来了 我看看

gtalkfriend: 嗯
帮我想想
没招就算了

我: 什么语言

gtalkfriend: cli
允许使用四则运算

我: 你如何表示正负号

gtalkfriend: 前面带-的就是负数了

我: 返回-1和1就可以是吧

gtalkfriend: 对
最简单的就是x/abs(x)
但是现在没有绝对值运算
我又不想用条件判断

我: cli里面的做一个abs不是很简单

gtalkfriend: 就是不想用条件判断

我: 哦

gtalkfriend: 你能直接用表达式做abs?
我知道c语言可以用移位
但是cli的移位做不到这点

我: cli没有位移吧
问一下
cli里面提取子字符串有用到判断么

gtalkfriend: 提取出来你也得做判断啊

我: 我只想提取-
在加上1

gtalkfriend: 正数前面是不带+的

我: 就可以
我不需要加
提取出-或者没有
再组合1就可以

gtalkfriend: 你没办法提取一个不存在的数
不存在的字符

我: 不存在返回是什么

gtalkfriend: “提取首字符”这样一个操作,对于负数返回-,对于正数返回它的最高位
你想让它对于正数返回空串?

我: 恩 我有办法了

gtalkfriend: 啥?

我: 额 再==

我: -77我能返回-1,77我能返回-100
或者返回1和100

gtalkfriend: 什么办法

我: 这样有用么?

gtalkfriend: 怎么做的?

我: 1A-A
1-77-(-77)=1

gtalkfriend: 哦

我: 177-77=100
肯定是这样的规律
看看怎么再转成你要的

gtalkfriend: 我想想

我: 我觉的cli下只能充分挖掘 其 字符串就是一切 的 这个特性
你顺着这个思路来想

gtalkfriend: 好
我: 恩 可以进一步转成0和1
1/77=0
额 错了

gtalkfriend: 还是没招
没有办法直接转+1 -1

我: 1/1A=0或者1
错了
(1A-(A))/A=0或者1
你返回去要做什么?

gtalkfriend: 然后如何转成-1 +1
我想不出来

我: 正在想如何进一步
恩 这个肯定能做到

gtalkfriend: 我可以直接生成f(-)=0 f(+)=-1
然后涅?

我: 恩 哈哈肯定可以
2x-1
这就一个简单的线性函数。。。

gtalkfriend: 呃

我: 待定系数法求一下就出来了
哈哈哈
恩 我刚才给的都是公式
你看看用cli实现有没有问题
其中第一步很重要,用到cli字符串 1A要么是个数 要么是个表达式的特性

gtalkfriend: 已经搞出来了

我: 哈哈 这个真无敌 第一步纯粹在纸上乱试的

gtalkfriend: set /a aaa=2*-(~aaa/aaa)-1

我: 代码发给我。。
恩,嘿嘿 测试了 确实可以

gtalkfriend: 我直接用了补码运算~

我: 补码是什么鸟
我基础太差

gtalkfriend: 求补码
呃,设计计算机中二进制表示
就是按位取反
按位取反的结果,就是-a-1

我: 哦!
这个又简化了计算
只要能得到0和1就可以
你不早说 害我在纸上测试。。

gtalkfriend: 我也是刚想到

gtalkfriend:

昨天讨论的那个咚咚,有问题
gtalkfriend is online.
gtalkfriend:
使用除法会出现除数0的情况
正确的解法是移位
右移31位

发生灾难时我们能做什么
发布时间:2011-03-17 16:39
个人认为至少以下2几点应该要学会。
1、不转发谣言和缪想,很多谣言漏洞百出,稍微思考或者查阅下相关信息就可以判断出其混缪性。
2、不转发阴谋论思维文章,阴谋论文章往往刻意聚合某些好无关联的论据,并加以夸张化、或者偷梁换柱式手法支撑其论点。
3、不转发没人性,没人权思维的文章。

Digital Signal Processing
发布时间:2011-02-22 14:39
看论文,查Impulse response相关资料,是属于数字信号处理的内容。发现一个很棒的Digital Signal Processing课程,在此记录。我看过其中的第四章,老外的课件做的真是棒。实际上我搜索到的只是 http://users.rowan.edu/~polikar/CLASSES/ECE351/Lecture4.pdf 这个第四章的课件,一般我顺藤摸瓜,打开 http://users.rowan.edu/~polikar/CLASSES/ 即可得到该站点所有相关课件。这个简单的小技巧帮助我找到过很多课件,希望对你也有帮助,:)。

用Google学习
发布时间:2011-01-18 02:51
知识大爆炸的年代,书多的跟米一样,一抓一大把。而人生苦短,活到老,学到老,但是我们要速度。如果你可以一目十行,时间一抓一大把,大可拿一本书去找个安静的角落蹲下看一天,这样也能很快掌握。我看整本书效率比较高的时间是大三到研一上学期,那段时间看了挺多整本书,此后编程的时间占用了我大半时间,编程类书籍看的速度还不错。

但很多时候有很多书,比如,数学类的,或者编程类但是偏细致的书,需要花很多时间才能看完。我看<<金字塔算法>>一书时,其中有两章我看了3个星期才看完,而且那时是只做这件事,理解其中的关键思想绕了很大一个圈,但是一旦点破要点,整本书接下来就很好理解了,非常优美的技术和思想,对于此类需要细致啃的书,别无捷径,因为作者说了,如果一开始就告诉你真相,你不会觉得那东西有什么好,确实如此,当我们跟随着作者绕了一圈之后,发现原来是这样的,因此而整个结构清晰起来,因此而发现关键处确实是宝,我们读到了书的精髓,那是怎样一种开心。这是基于作者写书写的好的情况。

有的书,虽然内容对,但是没法达到如<<金字塔算法>>那样好书的境界,读起来犹如翻字典,激不起兴趣一直看,没有像阅读<<冒号课堂>>那种书的一连几天把它看完的激动,但是内容又是需要学的,怎么办呢?

恩,我像可以通过Google来学习,书是死的,Google是活的,可以Google到原书被授课时的PPT,而我们知道好的大学的PPT能帮助你过滤掉很多无关的东西,突出重点,加入有趣的资料于其中。而我们也能快速看到关键点,这样加速了学习效率。Google另外能带来许多周边链接,也许同一个主题,在Google帮助下,能得到好几个不同的PPT,不同的PDF,不同的视频,不同的代码,只要你觉得你没理解透,你可以一直Google,下载,快速找到你感兴趣的点,串联起来,阅读,对比,编码,交叉学习。

这不是课堂上能呈现的了的,你可以去Wiki看看,可以去Google学术搜索看看,可以去TED搜索相关视频,也可以去MIT的OCW下载最新的课件,只要你愿意,这是一个扁平的世界。传统的教育体系,总所周知,大家都知道,填鸭式教育,金字塔体系教育,从塔底一直到塔顶你才有机会接触到顶层的东西,然而在扁平化的网络世界,你可以直接接触之。

我认识到这个东西是在2007年,这几年在潜意识里逐渐实践着,每当我需要学一个东西时,我总是这样,当然,我想我需要有意识去做,而不是无意识。书非借不能读也,古人说的话,如今有了新解。当然了,去图书馆搜索是个不错的方式,图书馆有现成的书,也有国外大型数据库的资料,你可以搜索Paper,可以借书。当是我想,这依然是金字塔顶端的方式,并不是扁平结构的。扁平结构应该是人人可得之,人人可分享之,也就是说,你也可以。当然,有借有回,礼尚往来,有自己制作的好东西也应该分享,别人给我们力,我们也应该给别人力。

细分、滤波、卷积
发布时间:2011-01-18 02:23
我们小队搞图像MAP,以前我一直做的是图形的东西,转过来,需要恶补下图像基础知识,手头有一本冈萨雷斯的<<数字图像处理>>,看书的话需要按顺序。我找了南京大学的这个ppt来快速过一遍:http://cs.nju.edu.cn/rinc/course.htm ,看到滤波这边,用模板来对图像进行滤波,这实际上就是一个卷积的过程,我一直想图像可以转化成图形来处理,或者图形也可以转化成图像来处理。这学期写了一下Loop细分,一直没意识到细分和其他概念的联系,看到滤波、卷积,突然想,图形一向只是用细分,其实也可以用滤波的。细分虽然增加了点,但是本质上也是一种“卷积”效果,卷积这东西实在是作用广泛,用的地方太多太多了,马尔可夫链是什么?我想,本质上也是卷积效应吧。我可以不严格的说卷积是累加效应,累加某个拓扑结构定义下自己的某种领域定义下的相邻效果应用到自身。我想到了水波,07年学OPENGL时,做过离散水波效果,当时做的效果一般,呵呵。

关于画图
发布时间:2011-01-02 16:55
经常遇到同学问我用什么画图,其实我回答用opengl画图的话,肯定没人用,对于日常使用来说如果不是很熟练,肯定效率低了点。我自己也是写3D程序的时候才去用。实际上,很多人会用matlab或者mathematical科学计算软件,我也曾经用过,或者帮人写过matlab代码。不过说实话,我心里是很抵触这两个东西的,虽然大家用的多,也很方便,但这东西不是免费的,是要钱的,免费或者盗版使用这东西也并不会很爽,一来这些东西挺大的,装到你机子上估计会很臃肿,一般机子跑这些都会很卡,二来matlab的语言是很浮云的,写matlab代码只能让你快速验证你的结论,但是很多东西你根本不知道它里面怎么搞的,错过了一次学习机会,另外,写它的语言,你没有什么可积累的,久了也就那样,这东西就是直接带help文件就直接拿来用的。如果你想要小一点的,但是库功能弱很多的开源的东东,那就用scilab,上scilab.org上可以下载。不说它了,mathematical倒是不错,那几个程序员一直在写这个计算软件,把生活也拿来计算,可以玩玩这个http://www.wolframalpha.com/ 。 但是我也因为它是需要钱的就没装。另外的画图工具,所见即所得的有我在博客里面有介绍一个比较弱的Compass and Ruler Construct and Rule  http://zirkel.sourceforge.net/doc_en/index.html 。我没玩过GNUplot,不过也可以去玩玩。如果有学过scheme,可以装Dr.Sheme,然后利用scheme的绘图库方便绘图,当然了,如果要用到此类脚本代码绘图的话,lua也是不错的,这就要学一个个语言了,相信很小众。

那些
发布时间:2010-12-24 23:43
有时候,看着那些人和事,很想去干涉下帮上忙,然而明白根本是帮不上的。只有当事人自己面对才能真正解决问题。我们总是站在外面着急,轮到自己的时候也许该多想想我们站在外面的时候的感觉。

多年前给自己发的邮件
发布时间:2010-12-17 21:11
亲爱的朋友:
您好!
这个夏天,真的很热,   
时间很慢,时间很快,  
很快平静,想的不多,
事情很多,何时做完,
我不知道,没有想过,
分手时刻,没有眼泪,
回到学校,有点难过,
友情还在,原来珍贵,
原谅过去,才能解脱,
眼睛坏了,等待修复,
真的发生,可以接受,
一份感情,一份依恋,
等待时间,需要勇气,
........ ........
      致
礼!

-------------------------------------
和AP坚持了这么多年,现在儿子出生了快两个月了,是对多年两地爱情的一个肯定,回想起来,很多回忆。
会更加珍惜和努力。

谈大学
应“重建象牙之塔”
易中天:这也是我十几年来想的一个问题。从大学学术量化管理那一天开始,我就决定走一条自己的路。我不要填那些表格,我不想说自己不想说的话,我不想写自己不想写的字,也不想申请什么别人规定的“课题”。
李泽厚:但没有多少人能像你这样冲出来,不容易。
易中天:不管是谁,也都要养家糊口过日子啊!所以,我还是坚持十年前的那句话:没有经济独立,就没有人格独立;没有人格独立,就没有思想独立。
李泽厚:也有人辛辛苦苦地在做学问,坐冷板凳,不管东南西北风,却非常清贫。
易中天:这样的人我很敬佩,但不是所有的人都能做到。正所谓“墨子独能任,奈天下何”?何况清贫也不等于一文不名,基本的生活总要有保障。陶渊明“不为五斗米折腰”,是因为还可以“种豆南山下”。一旦上无片瓦,下无立锥之地,餐餐饭都要靠别人施舍,想到庙里挂单都不行,有几个人能不被收买?人,总有扛不住的时候,除非下定决心饿死在首阳山。可是,就算你自己扛得住,老婆孩子呢?要不要管?
李泽厚:所以,现在应提出“重建象牙之塔”,这也要有巨大资金保证才行。
易中天:重建象牙之塔,十分必要。巨大资金保证,也很重要。但关键是“象牙塔”里的人,不能有“后顾之忧”,更不能“卖论求资”,靠出卖观点去获得“资金保证”。所以我强调“经济独立”。经济独立,不等于“富可敌国”,只不过是“不必看人脸色”。这跟“安贫乐道”不矛盾。一个人再清贫,只要那为数不多的钱是自己的,照样可以保持“人格独立”。

格拉斯曼快速普及
mhsy2003: 有接触过格拉斯曼空间没

gtalkfriend: never heard of it

mhsy2003: 仿射空间呢

gtalkfriend: neither

mhsy2003: 向量空间

gtalkfriend: 这个应该知道一点吧

mhsy2003: 射影空间?

gtalkfriend: 不知道啊

gtalkfriend: 隔行如隔山

mhsy2003: tmd,计算机显示器上的点都是仿射空间中的点呐
我给你简单普及下
向量空间你总知道吧?

gtalkfriend: 嗯

mhsy2003: 由一组线性无关的基唯一决定
这个知道吧?

gtalkfriend: 线性代数
的基础知识

mhsy2003: 准确的说是一组线性无关的向量唯一决定
实际上,这不是最准确的
最准确的是 由一组线性无关的向量+原点 唯一决定
理解?

gtalkfriend: 嗯

mhsy2003: 由于原点是0
所以分配在原点上的系数都被你们忽略了
简单说吧,把原点改成空间中任意一点
由向量基加上这一点,张成的空间就是仿射空间
这个时候,任意一个向量相对于这一组向量基+那个点的坐标是,让点的系数为0

gtalkfriend: 平移?

mhsy2003: 差不多可以这么理解
但是还没完
这个时候 任意一个点就能被这一组向量基+那个点表示出来
知道为什么吧?
因为任意一个点减去那个点是一个向量,能被那组向量表出

gtalkfriend: 嗯

mhsy2003: 嘿嘿 这个时候 很有意思
任意点 在那个点上的系数可以取1
OK了
v->(x,y,z,0)
p->(x,y,z,1)
理解?
这是仿射空间内的

gtalkfriend: 我突然想起一个图像的术语

mhsy2003: 泛化下 (mx,my,mz,m)就是格拉斯曼空间中的点

gtalkfriend: 仿射不变性

mhsy2003: m不同 点就不同
仿射空间中由于“原点”是内在的,所以仿射变换后,坐标系是相对于那个点的,所以坐标不变。。
这是仿射不变的原理
为什么3D里面的点要用仿射空间中的点来处理?
因为,要保证仿射不变性
所以,你看一个平移变换实际上是一个4×4的矩阵

gtalkfriend: 我想起一点东西来了

mhsy2003: 那是因为,仿射空间中本来3维的点已经多出来一维链

gtalkfriend: 计算机图形学里是这么弄的

mhsy2003: 是啊
那些是只是告诉你是那样弄得
没告诉你为什么
这东西很有意思的
射影空间里面, 如果m非零
(mx,my,mz,m)等价于(x,y,z,1),只要m非零不管m取多少都是同一个点

跟格拉斯曼空间不一样
-------------------
格拉斯曼空间中的点是带有重量的
m就是重量
可以称为质点
------------
射影空间的好处是能处理无穷远点
仿射空间映射到格拉斯曼空间在代数上完备,映射到射影空间让其几何上完备。
OK了,废话完毕。。


十字入口
发布时间:2010-09-28 00:00
何去何从,未来5年,10年,15年,20年,该是我担心的么?一晃一个4年的本科过去了,一晃一个3三年的硕士过去了,一晃半个博士快结束了。未来,我该去向何方,哪一条路是我继续前行的方向。这是一个很平常的十字路口。我知道这个路口即将决定的是未来5年,10年,15年,20年我会做什么,怎样发展,以及可预见的将来有哪些精彩与辛酸。人这一辈子不可能两次站在同一个路口。决定了方向就不轻易去反悔,并为之奋斗下去。理想与现实之间选择,哪些是浮云,哪些是对自己来说是真实的,都值得好好考虑下。人生如棋,好招是需要进退有据,要有根,根是什么,对每个人而言都是不同的。年轻的时候,欠考虑到事很多,因为年轻的时候有资本,可以犯错,因为有补救的机会。岁月却让这种机会越来越少,不是人人都能有机会重头再来一次。当身份逐渐转变,要考虑到事自然就多了起来,一旦进入角色,自然会去在角色的位置上考虑事情,不需要特别的去说和引导,每个人都会经历这种内心的变化的。如何走好未来的整5整10,需要淡定、勇气、努力与智慧。脱离幼稚的年代,进入一个新的周期,不变得是积累和沉淀下来的东西。

最近工作有点紧
发布时间:2010-09-20 01:34
回来2周多,连续写代码。
设计框架
完成原型
重构
迭代
期间夹杂着
迎新2天
高中同学聚会一个下午
薄饼办货一天
薄饼一个晚上
去学校结账半天
上课3个下午
教师节和几个师弟师妹一起去导师家一个晚上
其余时间都在海运或者海景以及宿舍做项目。连着下来,工作挺紧的,
有时候会随意说话,看来还是要低调点,在自己忙的时候还是少说话为好,
能节省时间尽快把东西做完是主要的,毕竟后面还有非常多事要做,
没多少时间让我浪费,现在真的很高节奏,从白城打个的士赶去给同学带东西,
在环岛路上感觉风景很美丽,台风要来了,海边挺安静的。
感觉加油,不管怎样,得尽快去平衡下来。 

Simplify
我们的目标是什么?技术的本质是什么?
每每留连在书堆中,次次探索网络资料链中,我总会下意识地过滤掉一些资源,那些让我感觉不协调的内容。什么是我的过滤条件呢?一开始,我也说不清楚。是我没有耐心看完或者浏览完那些文章么?有一点儿,但不是本质的吧,在那些没有被我忽略的选项里,我想我是用足够的耐心去认真理解机理,完整阅读下来的。是英文阅读能力不足导致我放弃那些么?也不完全是,有一部分英文资料我会认真去看,并且步步实践,而且在我慢慢习惯了看英文资料的过程中,我开始有意识去把某些好的英文资料看下来,打印成pdf保存下来。这说明我在挑选,也即过滤。一直以来,我都在追求机理的理解,追究局部的细枝末节,常常陷入细节而不能自拔。然而几年,十几年下来,我一直在追求的也是抽象的层面的提升,在不同层面上,每个层面上都有无数的Hello world!哪些东西是值得我们收藏并深入学习、研究的?
追寻了许久。我想,为什么我不能换个角度去想呢,简单点,我过滤了什么?恩,片刻,我的答案是“复杂与难看”。是的,我追求的解决方案,不论是文章的排版样式,还是文章的细节,还是文章的抽象层面。我希望我收藏的是简洁优雅的文章与内容,那些一眼看过去就不对劲的形式与内容,注定被淘汰的技术,有着某种难闻的味道。判断方法也足够简洁,大致浏览下,看下要点,所谓纲举目张,目录会说话,目录告诉我,每个片段在做什么,多一点耐心的话,看看那些图片,或者代码,或者流程,大致即可判断出是否简洁与优雅。这就是潜意识里我养成了的过滤习惯。
一旦决定收藏所遇到的,那么有些苦力活是肯定免不了的,世界上有很多好东西是需要懂了才体会到美丽的。一开始,某些绊脚石可能让你觉的难受,为什么我就看不懂呢,这些非人的牛在讲些什么东西啊。额,下点苦力吧,蜻蜓点水是没有什么作用的,只有让眼睛疲劳,脑袋发闷的效用。我们需要做点功课,也就是看懂文章的前提。这种事一般就是钥匙,一旦打开,就能看懂一票东西,我终于用上东西这个词。
初中时我和同桌每次上几何课就会说"人生短短几十年,何必苦苦学几何,学了几何又几何,不学几何又几何",好绕的口令,我其实想说,我们应该要让自己的每次挑选都围绕自己感兴趣的主题以及周边去跟踪,什么叫跟踪?跟踪又有什么好处呢?如果你理解了我上一篇的上一篇博文里面讲到的卷积的最后一个链接里面的那些笑话,你就知道跟踪学习是有着卷积效果的。人生短短几十年,何不开心做卷积。这也符合我们中国人常说的厚积薄发,总有一天,积累所沉淀下来的会发挥作用。或者,仅仅就是享受积累的过程本身就很有价值。
理想是追求简洁么?

万能遥控器
发布时间:2010-08-29 15:14
昨晚想,如果设计一个万能遥控器,能够下载各种程序,然后将所有的电器上都装一个接受指令并执行的芯片,仅需保存少量指令,一旦执行完毕就不存储。遥控器里面的程序执行时会通过发射器将指令传递给接收器。将所有的存储工作都交给遥控器。

卷积
发布时间:2010-08-27 11:59
我特别喜欢卷积。关于卷积,给出几个链接。
维基百科: http://en.wikipedia.org/wiki/Convolution
中文维基百科:http://zh.wikipedia.org/zh-cn/卷积
百度百科:http://baike.baidu.com/view/523298.htm
从以上几个链接可以大概学习下卷积的数学意义和解释。

行者的学习博客上有一些搞笑幽默的解释:http://www.cnblogs.com/ylhome/archive/2010/01/07/1641121.html


//原先这段代码只有我和上帝可以读懂
发布时间:2010-08-27 09:11
//现在,我想只有上帝可以读懂了

第一次看3D动画电影
发布时间:2010-08-17 10:53
昨天是中国的传统情人节,77。老婆说要去看电影,于是我们和她同事以及另一个同学4个人一起去看《怪物史瑞克4》,第一次在电影院看3D电影,感觉效果不错,我很好奇那个眼镜如何将模糊的2D画面聚焦出3D的效果。第一次,总应该留点纪念什么的。 我觉得老外拍的动画片,技术并不是其成功的主要原因,而是包含在其中的一直在描述的关于亲情,友情,爱情等等。一直在体现这些人类最根本的价值在其中,而且整个表现过程自然,生动,到位。另一方面,动画片能够用其特有的夸张、幽默、和搞笑将深刻的感情直观的呈现出来,以动画片特有的魅力包含人生深刻的感情于其中,不管是老人,中年人,青年人还是孩子都能在享受视觉和感情的双重经历。这也是为什么国产动画片总是只能是幼稚园里的小孩子看看的原因。围绕几个人类基本感情要素不断探索设计和表现技术,我们没有看到灵魂,只看到形式。看看最近2年火爆的《喜洋洋与灰太郎》,只有猫和老鼠的形,没有猫和老鼠的神。我不清楚看过《喜洋洋与灰太郎》的这一代小孩子们能从中受到什么好的影响呢。不过这也算一点点进步了。 

我们做点技术,容易迷失在技术的细节中,忘记了生活本来是什么。去看看电影,也许就能回头重新审阅下。无论什么技术,都是服务于人的,人的感情才是本质的,核心的价值。以前跟人讨论智慧生命,有人认为只有智慧生命才能创造智能,认为机器人被创造出了一定是人这种智慧生命将自己的智慧以某种载体嵌入其中。以此类推,认为神,或者上帝是存在的,只是也许应该叫高级智能生物或者高级智能体更适合。达尔文的进化论只是一种理论,认为人是由低等生物进化而来,这也许是一种错觉。为什么这么说呢?想想未来机器人真被创造出来,机器人有了智能。假设人类从此退出地球,地球上只剩下机器人,所有关于人类的资料都先天的被删除。若干年后,机器人中出现了一位叫达尔文的家伙,考察了从低级机器人到高级机器人的各种机器人形态,然后得出结论“高级机器智能人 是由 低级机器人 进化 而来的”。怎么说呢?绕了一圈又回来了,对于机器人达尔文来说,这个结论也是对的,只是它们可能不曾想到这种“进化”是由人类在实验室里一次次创造出来的。有点扯远了.... 其实我上一段开头想说的是,人的感情才是重要的。无论你做什么,有价值的东西一定是融入了人的感情的。

【后记】2015/01/16
汗,如今我当然不这么认为了,10年的时候我还只是处于蒙昧状态,三观未建立,对科学的理解也只是低水平。这在中国算是正常的,在读博期间到现在,经历无比纠结的各种思考、探索才想清楚。不过这并不意味着我要否定以前的自己,一个人在不同阶段会有不同的状态,恰恰上面最后一段是我在未经过系统思考的时候的随机“怀疑论”。但因为这个观点有悖于我现在的三观,还是在此注释下。
难得午睡一下
发布时间:2010-05-08 15:01
很久以前开始没有午睡的习惯,实际上中午的时候一般很困,中午难得小睡了一下,结果学校洗空调小分队在14点的时候到处窍门把我吵醒了,刚醒来还迷迷糊糊破口大骂搞什么鬼中午让不让人休息了,最后总之是开门让把空调洗了,然后开始继续重构代码,很久没开音乐了,想起google music是google.cn上唯一貌似没有被水产的服务,于是就开了来听听,最近也没什么好听的歌,虽然我也很久没听什么歌了。重构了一个小类后,很瞬间的茫然,不想开gmail。想想自己最近几年看得最多的书都是技术书籍,老外的偏多,国内的渐渐也有许多好书出来,持续积累的人写的好书,或者有新意的人写的好书,不过我看有些人也渐渐不热衷于这些了,就跟房地产一样,制造业不好混了后就很多钱都跑去混房地产了,杯具,国家最近好像出了十条来治标。认真搞技术的貌似少了不少,许多人开口不是讨论技术而是讨论炒股,讨论赚钱,这虽然也是形势所逼,不过我不觉得长期以来有什么好处,过了几十年几百年,这些东西有个屁价值,岁月流逝,还有多少人在执着于追求自己童年的梦想,自己曾经的理想?还是有很多的,为了养家糊口混口饭吃暂时做着不同方向的人只是在等待,等待平台的成熟,岁月的洗礼,积累的厚度。激情的消失,人生也就失去了一大块东西了,是否你还有激情,还是已经麻木于城市之间?我总怀疑那么多人孜孜以求的东西真是自己喜欢和感兴趣的么,那么多人号称自己很喜欢某些东西是真的么,还只是赶潮流,集体无意识的被动式寻找,也许我也只是小小的一份子自欺欺人的家伙。最近几年开始到处云计算,云计蒜,人云亦云,搜狗搞个输入法还要整天升级,整天细胞词汇,还会弹窗,360搞个木马查杀工具就云查杀,金山的木马查杀也学,还双引擎,本地和云查杀同时进行,我还不知道么,你们这些打着各种名号让用户联网做事的同时难道没有偷偷上传点用户资料么?我才不信。反正现在除了txt不联网外其他都要连网,靠。最近老是穿梭于城市农村之间,农村的教育环境貌似不怎么好,以前,我在念初中的时候我们还有好老师,好的老师还会去我们那教书,现在却是有下降的趋势,我上次问一个小学老师,她说老师都得想着不找老师来做伴侣,因为两个都是老师就买不起房,不做评论。额,不知道到说什么,写代码去。

持续做,不用理会专业人士的评论
发布时间:2010-04-27 22:16
这个世界上没什么是静止的,持续做,就能把过时的淘汰掉。

努力努力努力
发布时间:2010-04-22 09:26
加油,完了我就可以换一种方式思考了,去做纯脑力劳动吧,体力+脑力劳动真累。

盖章=打怪升级
发布时间:2010-03-17 14:37
盖章原来是有等级的,跑了N个地方盖了N个低等级的章换来一个高等级的章,再去另外一个地方盖一个同等级的章,然后寄回家换一个可以使用的章,办一件事我居然盖了15个章。我得出的结论是盖章等于打怪升级。

清晨
发布时间:2010-03-02 05:15
昨晚比较早睡,7点多就开睡,灯也忘记关了,就这么迷迷糊糊的睡了,一个美梦伴我到清晨。醒来感觉真好,发现这个时候没睡有两种情况,一种是写代码写到现在,一种是睡爽了早起。比较喜欢后者,早起能吃到早餐,稀饭最好,还能见到早上的太阳。在我们的理解里时间是单程的,很快2010过了很久了,没有多少剩余的时间会被拿去消耗,大家都要忙的要死,工作,学习,写代码,谈婚论嫁等等,青春眼看就那么点时间,再怎样,未来是否会如期而至,我们的努力是否真的会改变未来,不得而知,而我也渐渐不再为此花时间去想,把眼下事做好,短期该做什么就做什么,长期的事,谁知道呢,如果需要改变,是需要同时瞬间跳出的,等待只能是现状的延续,跳出并不难,灵感到的瞬间。

纪念连黎明学长
发布时间:2010-02-21 21:24
与君一面,竟成永别,唯此纪念,留下痕迹。 http://www.foa.cn/blog/

sun lost
发布时间:2010-01-08 05:51
醒着的时候,寻寻觅觅,你不在 找不到你的温度,只感觉得到肌肤的冰冷 等到海枯石烂,热水几回冰, 再等一等,你就可以到达我的世界,我却已乏困 于是,我去睡了, 等待漫长的梦醒时分 期待浸透你的温度

所谓抽丝剥茧
发布时间:2009-12-15 00:55
其实只要是人类造或者发明出来的东西就几乎并非没有破绽。所谓完美并不存在,有,那也是相对的,因时因地因人而异。只要你有着一颗发现的心,以及相信破绽的存在的习惯和习惯,没错,除了习惯还是习惯,因为只有习惯才能一以贯之,那么,几乎你就能够找到蛛丝马迹,庖丁解牛,抽丝剥茧。于是,人类造的东西几乎顷刻间掌握于你的手中,脑袋瓜里。当然,这需要些天分加一定的努力,有的人天生就具备这种天分,有的人在不断归纳演绎之中领悟,其实,还有一部分人因为压根就不感兴趣而选择路过。恩,路过而非错过,因为,据说选择是没有优劣之分的。

在我眼里,一切都是PPT
发布时间:2009-12-09 00:36
做了100页PPT,在我眼里,一切都是PPT。
人生就是个PPT,每天都是一个幻灯片。
做好PPT要求大标题,列表或者图表优先使用,拒绝为了将密密麻麻的文字在一个幻灯片里面挤。
生活需要空间,每天应该有个粗线条,拒绝被琐碎的细节淹没,你应该突出主线。
一个好的PPT背景主题能给PPT带来主色掉,生活需要主题,当然你可以选择简洁如空白背景。
文字需要合理搭配颜色,生活需要颜色缤纷。
粘贴数学公式很麻烦,做点数学研究也真不容易。
人生啊,PPT啊。

极其讨厌手工处理
发布时间:2009-12-07 01:02
批处理啊批处理,为什么要浪费时间在手工处理上。
为批处理而奋斗。

帮我翻译下如何?
发布时间:2009-12-05 03:59
If art interprets our dreams, the computer executes them in the guise
of programs!
以下是机器翻译:
如果艺术解释我们的梦想,计算机在执行他们的伪装
的节目!
以下是我人工翻译:
如果艺术是梦,那么程序运行着她。
不知道你觉得应该如何翻译?

深夜无睡意
发布时间:2009-11-14 03:51
想想,该洗洗睡了,熄灯,上床,睡觉,盖被子。······ 10秒钟过去了,开始思考持续一段时间想着的问题,数学问题。······ 30秒钟过去了,睡不着,无法入睡。 像骨子里的东西一样,那思维不受我掌控,在黑夜里,深夜里,左边,右边,脑袋瓜里,心里,发酵。 纠结的,也许是个做不出来的东西,每天,有一丁点儿新的东西就很兴奋,然而很快又被新的失望替代。 本质上来说也许并没什么用,只是痴迷那个结构,暂时抛开一切其他想法,有没意义关我屁事,努力思考,计算,想象,发挥 把我想做要做出来的那个结构弄出来,只是为了有意思。 等待,等待秒杀它的瞬间,我就去寻找新的东西,下一个,也许是个不错的东西,如今,持续发酵与思维。 深夜无睡意。

模糊
发布时间:2009-09-13 22:38
生病的时候,才知道健康多么重要

恐慌
发布时间:2009-08-27 01:08
突然感觉恐慌,以前未曾有过的感觉,不知道我是否能静如止水撑过去。

深深思念
发布时间:2009-08-25 23:40
海边夜色一样深。 随风吹到你身边。 轻轻拂过,勾起你一丝回忆。 心底深处会共鸣么。 平平凡凡,点点滴滴,阵阵涟漪。

昨日的世界(一)

雨过,天晴。
发布时间:2009-08-11 16:25
台风又过去了,下了几天的雨随风而去。看了下新闻,台湾南部好像受灾很严重,哎,台风还是少点好。多下下雷阵雨多好,可惜厦门这边几乎没有雷阵雨,以前在家里的时候夏天几乎是每个下午都有雷雨,又凉快。这边就不行了,本来我对夏天的印象还不错,就这么只剩下闷热的感觉了。空调不是个好东西,吹多了鼻子难受。大睡了一觉。梦里的故事总是由带有过去记忆的碎片无缝拼接而成,又那么真切,醒来总是能记住每一个细节,好像真的发生过一样。人的脑子里到底储存了多少记忆碎片呢,总是跟做菜一样,随便一调就一道菜,一个梦,暗示着很多事很多人,依旧在那碎片库里,也许梦里的故事是某种可能的过去的未来,也就是现在,只是未被选中的方案。

着凉了
发布时间:2009-07-18 01:27
头痛。               
          
悲伤的深处有圣光 欢乐的顶峰有泪泉
发布时间:2009-05-30 20:33
初中的时候听说的

恢复斗志
发布时间:2009-05-04 01:44
突然地我就再次打起了精神,打开我的Chandler安排了脑子里立马能够想起来我要做的Items。
自组织,再一次的我就想起了这个词,每一次,当我迷茫,每一次,当我漂流,总有触底
的那一刻。不会被淹没,不会被淹没。梦想还未知,追寻还依旧,结构的递归,距离的缩减,
the way to approximation the truth。我不知道别人是否已放弃,是否已妥协,反正我没有。
一定要进入良性循环,可恶的时间机器总是试图磨平,但是坚持的心不会妥协。
是否已放弃追求,是否已接受事实,是否安逸而忘记了起点,一次次拷问,短暂的消失,
只为更强烈的回归。

岁月的流逝
发布时间:2009-04-29 21:58
可以触摸到的流水,可以感受到岁月的流逝。
珍惜生命,珍惜时间和感觉。

外面下着雨
发布时间:2009-04-19 19:11
外面下着雨,开着门,睡着了。雨声就在梦里。很久,醒过来。原来如此困。雨下的很清凉。

冷飕飕的天
发布时间:2009-01-12 23:53
虽然在南方,还是一如既往的偏温暖,海边的风却一直在吹,吹在路边,吹进门缝。很久才去教室一趟,穿行于小街小道,冷飕飕的风吹的我只打寒颤,谁叫我只穿了两件衣服就出门了呢。冷冷的风,让自己小小的感动了一下,伤神。过去了一年,来来回回的在停靠,休息,工作,学习中穿行。年终,又突然怀疑08是否我真的做过那些事,一贯的睡到10点多,似曾相识的被电话打破了我的美梦。也许上天在提示着我什么,前半年兼职的那家公司的同事打电话咨询了一个以前解决过的问题,我才意识到很久了的事,我确实经历过吧。然后接着,吃过午饭,接到初中同学的电话,也很久没联系了的哥们,叙旧了几下,恩,今年貌似有很多同学都结婚了,岁月不饶人,时光似箭,老旧的语句,土土地,却回旋在空中。对着电脑,对着前天才被告知的一个紧急任务,我也是一下子没什么想法,这年头人怎么能这样提要求呢,我又不是神,三天叫我完成这么个我还不熟悉的东西?但是,没了抱怨,还是把时间花在思考如何最有效解决它比较现实。一个下午下来,也是这冷冷的天能做出什么呢,看到时间由16:59很神奇的变成17:00后,我立刻就找到了理由,去吃饭了。吃饭的时候又很巧的碰到一个以前的同学的同学,老乡吧,今天真怀旧。回来我就不行了,发了几封邮件后,直接给lisir发了句“ 太困了,先去睡一觉,有事call我”。好像我真的小睡了一下,就被电话告知带上小本本去实验室,迷迷糊糊的就过去了,头有点疼,呆做了一个晚上,惯性的查了一些资料。后面lisir的老婆带饭过来了,好像多带来一份,后面成了我的夜宵,又想起前半年在lisir家做项目的时光,今天真是什么事都齐了,傍晚我老大电话交代下科研的事,哎,迷迷糊糊的一天,很久才反应过来今天是个索引,是个缩影。冷飕飕的风吹,吹掉了今天。

多给家里打打电话
发布时间:2008-11-27 22:13
常年在外,经常很久都忘记了给家里打打电话,实在是不应该,晚上给家里打了一个,老爸还又告诉我学习要认真,做人要踏实。从小到大,他都一次次的跟我说他的那些大道理,我也慢慢的在骨子里留下了那些东西,老爸说的东西总是那么朴实,但是很受用。在外面这么多年,自己慢慢努力,自己开始能做决定和设计人生路线,老爸总算负担少了,这点蛮开心的。还有我妈妈,妈妈总是那么善良勤劳,我们家最勤劳的应该就数妈妈了,我小时候比较懒惰,总是被妈妈打,不过她是很偏爱我的,哥哥为我挨了不少打骂,经常是因为我告假状。小学的时候我都书包都是姐姐背的,长大后姐姐也总是很关心我,姐姐出嫁的时候我还在偷哭了。其实我是很想念家的,只是一直放在心里 吧,我还没有安定感,所以会隐藏一些东西。然而那些,永远在心里,适当的时候,过了很久还会发现没怎么变。这边还有很多很多事要做,我也会一件一件去做好的,在身边的好朋友和同学各自打拼也慢慢都去属于自己的地方了,有时候我会觉得很孤单,会怀疑我坚持的理由,我会想这些真的很重要么。恩,喜欢做就去做,也许我就是那样的带着这样的想法的,谁说这样不好呢,顺着感觉,实现我所希望的价值,那才叫人生吧。

秋天来了
发布时间:2008-10-16 21:25
小时候,在那个山村里的初中,住宿的时候经常衣服没穿够,经常感冒,不过我却能够每天早上都是全校第一个起来的,那时候住的是一排床铺的集体宿舍,说是宿舍,其实就是一间大教室,窗户上的玻璃还至少有一半是由空气构成的,我们只好把纸箱拆开自己钉好。因为是山里,特别适合我,我和我的兄弟门几个在那破中学里留下了无数的奇迹,最开心的时间就那三年了。那时每天早上5点我就起来,摸黑拿着吊水的水桶去井里提水,简易洗刷后就去爬窗进教室看书。每天最重要的事便是看书,做作业,剩下的就是各种乡下学校特有的业余活动,那时候不懂事,有在教室通宵被老师集体抓住过,有把十几桌桌子拆开加上滚珠制造我们特有的全能型组合桌,有集体在宿舍吵,老师来抓的时候集体都装做睡着了,灯开着也没人敢去关,就听生管在外面大发雷霆,第二天被集体罚做俯卧撑的,学校不允许我们穿拖鞋,每次课间操检查的时候就有一半以上光脚的----拖鞋扔到窗外的那个小山坡了,包括女生也有,有一次课间操后教务处长把穿拖鞋的都留下来训话,有个人急忙把拖鞋扔到一旁,刚好被看见了,结果教务处长还幽默了一回,宣布光脚的留下其他人可以走,哈,结果当然是就那人很可怜得站在那...。有一次国庆,我们每人出了两毛钱在教室煮米粉,去老师的菜地里"借"了菜,后面被校长叫去狠批了一顿。很奇怪,最容易想起来的居然是的这些调皮捣蛋的事。可惜了,兄弟们如今都在不同的地方,工作的工作,结婚的结婚了,虽然有个群,我却极少会在那说话,也许我更希望看到他们在各个方面上都顺利一些,或者成熟一些,其实我自己也是,我们过了调皮捣蛋的年龄和资本了,从初三毕业的时候就过了。

失落的漂流
发布时间:2008-10-05 22:34
发现http://mhsy.blogspot.com/又可以用了,可惜一晃两年过去了。
那个黑色的角落里只静静的留着几行,当初如是。
WEDNESDAY, DECEMBER 20, 2006
走在街头,
阴沉的天,
灰色的云,
乏困的眼,
失落的心,
莫名的挫折感,
就象每个冬天的阴天,
一样的迷失,
漂流的角落,
属于一个人的心情,
是心底的难过?
是外在的情绪?
街头的音乐,
迷人的遥远,
融进了我空空的脑袋,
短短的马路,
延伸着远远的大海,
透视着高高的天空,
小时候的影子,
印在似雾的云层里,
很想说,
很想写,
失落的心,
找不到梦境的出口,
就失落的漂流在笔直弯曲的街头...

回归宁静
发布时间:2008-09-20 23:10
答应了的事就好好做完整,不麻烦朋友做麻烦的事,宁可自己多花点时间去做。少说废话,多做实事。 回归宁静。

唯偏执狂才能生存
发布时间:2008-09-10 19:50
又是自组织,从混乱中整理出思路。连续的无纪律边际效应是递减的,有纪律才会随时间积累出数量级别的飞跃。否则时间只会使得我更疲劳。唯偏执狂才能生存。

美感
发布时间:2008-08-30 02:46
再好的工具,你若不能正确使用,对它有感情,那么你就可能做出很差劲的产品出来,不但功能很差,而且一点都没有美感。反之,若能好好使用手头所拥有的工具,即使是小小的工具也能造出精巧和具有美感的东西来,一切还是跟心有关,人若对工具有感情,那工具便好使,反之,人若并不认同自己所使用和拥有的东西,即使是宝贝也便是当石头用了。所以呢,好与差,美感只在一线之间。美感可以不是别人看着美,美感可以只是你自己欣赏起来感觉很舒服很切当的样子,传统的美感有一种是属于追求简约素雅的,我自认为我心底是这样的一种感觉,所以能体现出来一丁点儿吧。别人不认同,自己要有信心,美感不是朝夕之间能得到深化的,日积月累,便是了。我追求不急躁,急躁会让我猴急,那可完蛋了,什么逻辑都全抛脑后去了,所以切莫急躁。

主意
发布时间:2008-08-21 19:11
去电子城跑了一天,最后还是没买成本本。得到的感想如下:赚钱不容易,不能随便就花了,遇事还是自己拿主意的好。
天上好多鱼
发布时间:2008-07-18 23:37
傍晚一场暴雨下到夜里依然不停,我就在那迷迷糊糊的从傍晚一直睡到23点,开着灯,开着门。醒来的时候雨变小了点,出去买了点水果回来吃。出门在外常常会忘记身体的疲劳,不懂的自己调整,难得在雨声中睡大觉。
天上好多鱼。

电脑搬回宿舍了
发布时间:2008-06-24 12:35
昨天早上把电脑搬回宿舍了,又开始了全职的宿舍生活。在宿舍生活,一个人的高效。因为性格使然,我不太喜欢繁琐和多余的东西,一个人的时候我的生活简单的要死,宿舍->食堂->图书馆->教室->其他,基本上处于宅男级别的生活,而且没人跟我搭腔我就一个人可以专注的做着自己喜欢的事,感觉良好,这个时候的自己反而很自信,做事也很有条理。一再的发现自己适合的就是简单的生活,所以经常碰到生活丰富的人说我死板,无趣或者落伍等等。其实我不介意别人这么说我,因为我确实就那么简单,很多他们觉的好玩的东西我觉的一般般,也许他们很难理解什么叫性格以及每个人都是个独立的个体,就算你认为自己这样很好,自己这样才看的爽,但是其实每个人都有适合自己的生活和思考方式,也许,对他来说,那才是最适合的,这个世界没有最好,只有最适合,强加的东西总会有问题。每个人都只是从自己的那个方向看过去,也许从这个方向看过去的恰好放大 了。

仅仅需要简单,那就是我,不论从哪个方向来说,简单能让我觉的清净和自我的存在。屋外的蝉鸣也听着舒服,我会想起以前在农村老家的夏天,老旧的大土房下,蜿蜒的溪边小道好几棵老树,蝉鸣多的是,在树下很清凉的。还有其实我也不喜欢东西太庞大,精致的东西才好,可惜世界总是膨胀的,如果不常整理,堆积久了总是要变乱的,或许“常常勤拂拭,莫使惹尘埃”是需要成为习惯的吧。曾经认为自己是个完美主义者,其实我不是,如果说有什么主义,那就是简单主义。斯雨常常说我太理想化了,总是告诫我这个世界还是很现实的,这个我知道,但是我总是顽固的认为纯净的理想与之并不矛盾,虽然总是有长辈告诉我说等你碰壁了你就知道,可我也总是以我碰壁多的去了回应之,得到的进一步回复是“你还没吃大亏”。吃亏也要坚持自己的方式,所谓“虚心接收,坚决不改”,固执有时候也不是坏事。

人与人之间的平等对待是一件很难的事,常常听别人告诉我说“你应该学会懂的倾听别人的意见“,我承认大部分时间我在自言自语,以后改改吧,不过我估计又会忘记掉,我的生活和我说做的从来都是与计划偏离的,生活是不可计划的,我总认为生活本身就是随意的行为,然而世界却在随意中得到平衡。以前我记得很喜欢“balance yourself”这个词,找一个平衡点有时候很难,从理论上来说应该是可以找到的,实际的情况往往是在那个点上下摇摆,摆得过渡了就一下子失去了平衡点的重心,事情就玩完了。感觉就是为了维持平衡,付出总是难免的。昨天有个人说自己一直付出,感觉得到的总是空白的。我也不知道,付出应该总是有回报的,”一分耕耘,一分收获“应该是对的,只是那收获以各种看得到的看不到的形式存在着吧,现在看不到以后也许就看到了。肚子饿了,吃饭去。

还有一次考试
发布时间:2008-06-12 19:16
瞬间,只剩下一门考试了。想想,原来我还有一门考试,或许,最后一次考试吧,研一就这样要过去了,过去了永不再回来,回也回不来。听说这差不多就是最后一次算正式的考试了,考试突然就将离我而去。其实已经很久没有那种大兵压境的感觉了。考试是学生生活中占很大比例的东西,考试的作用也是五花八门,也不知道自己考的是什么,只知道最近有考试,就去准备考试,就这样一路考过啦,考试对于学生来说也许无所谓,也许很重要,改卷子的人未必在意你做的如何,或许只是他的一个任务而已,心情好改松点,心情不好随手就给你多扣几分,然而这样带有很大随意性的考试却能有时左右你的选择,各种各样的选择,时隔多年,看上去都是些小事,却是慢慢堆积起来的,或许这种随意性带有某种分布吧。早晚,得告别考试,曾经盼着早点告别考试,后来想,跟自由一样,没了外在的约束,就得自己负责吧。曾经纷飞的试卷,片片飞走,飘落,成了记忆的泥土,没有了意义,没有了关注,只剩下些许空白的影子。还有一次考试,好好珍惜,留作记忆的碎片。

回归的家园
发布时间:2008-05-28 02:08
忍无可忍无需再忍。以前我同学最喜欢说的就这句话。放到自己身上,自从打算念书以资生活以来,性格由显急性子变为隐急性子。虽然看上去不急,实际上很容易抓狂,最近两周发现有所改观,偶尔会死几个脑细胞了,我知道有一个坎在这摆着,初夏的闷热,人容易感性,想的也多,无数梦想与回忆总不免触景生情涌上心头,越发封闭的心,总觉的孤独。然而我明白了一个道理,越是难过的坎,越要抱着一颗忍者的心去坚持渡过,急着是一点也没用,只能一小步一小步的坚持着,想要别人理解也挺难的,干脆让自己学会用心去过每一天,或许我该多多换位思考下,很多事情很多时候是无法改变什么的,然而心理可以理解为什么会面对这样一种情况,因为我什么都没有,所以我应该要会耐心的让自己积累多一点再多一点,每一次的改变都足以证明前进了一步,也不用夸夸其谈,也不用承诺多少,也不用羡慕自己没有的东西,该怎样的还得怎样,只要保持一颗心,追求自己心里的那种感觉就好,我们习惯了跟随他人的语句来行文,其实没必要的,重要的是不能封闭,一旦我封闭,狭小的空间足以窒息,宽容是一个古老的话题,宽容他人,他人才会宽容我,如果说曾今迷茫的狭隘,那么现在就是个回归。人参,当归。

today is the first day of your rest life.
发布时间:2008-05-23 01:58
突然的,一面大大的镜子摆在了那。于是,还有什么东西不应该好好珍惜呢,活着,就是幸福,活着,就应该好好珍惜,生命诚可贵,活着就应该对生命负责,逝去的时光,就是幸福,逝去的毕竟存在过了,存在是幸福的,时间每多一秒,每少一秒,存在就多了一秒,幸福就多了一秒。珍惜和负责,对的起生命,过多繁杂的世界,不需要太多无谓的顾虑,需要的仅仅是一分简单深刻的心,追求也许永远不容易实现,心却可以一直一直在,心在,生命在。不知道多大改变算改变,只知道小小的改变,随时的改变,积少可以成多。悄悄的,轻轻的,不经意之间有着微妙的改变。如果说逝去的岁月带着过多的稚嫩,那么总有一天,可以改变。已经没有专门的时空可以专门做一件事,那不如随时积累呢,坚持着就会是一种好习惯。

荒芜
发布时间:2008-05-13 17:57
一片荒芜,没有浇水,也没有雨滴路过。
空有一副骨架,形销骨立。
因为你不曾眷顾,因为你忙碌,因为你无心路过。
出生的时候,虽然稚嫩却充满了朝气,停滞的时候,臃肿而没精打采。
总是要经过死寂的煎熬,也许在等待着什么,或许是戈多他老人家吧。
如果说习惯造就了今天,那么值得期待的明天是否已经改掉习惯呢。
无数次的说要改掉的习惯依旧,什么时候你才不荒芜呢。

写在五一前
发布时间:2008-04-29 19:43
新的五一只剩下一个天的假期了,我却是第一次五一准备回家,忙忙多的日子就这样过去了将近一半了,很想说时间要是能多出来该多好。于是回顾一下就发现和明白了效率其实并不高,断断续续的,也发现了原来看外文文献很吃力,开始怀疑科研是否适合你呢,不甘心的是理解力其实还好,不至于那么差。问题是,没有花连续的时间实践,某个阶段某个总结告诉我软件工程虽然很技巧,很系统,很华丽,却是一种技术,不是心里希望追求的,两个不同的方向,不同的世界,尝试才知道是否适合。生活怎样才算踏实与充实呢,体验才知道没有看上去那样的。很多人,或者有的人,以为那样是对的,以及那样的世界观很好,嗯,想了想,每个世界观仅仅只适合一个个体,真的。个体的差异是必然的,才发现怎样是繁华褪尽,只剩简洁。不需要依赖的个体,独立的人格。需要一种赞赏,欣赏的眼光来面对世界。总是习惯于发现别人的缺点的思维是注定要淘汰掉的,给别人一分欣赏,别人才会给你两分欣赏。改变那种先否定再接受的思维,学会惊讶的发现世界原来还可以这样。这样才不至于走到一条死胡同吧,天天如此,静坐常思己过。半年以来,更加客观看待问题,接受现实,继续前进。回家的时候可以好好休息两天。

坚持
发布时间:2008-03-13 17:48
过了一段时间的学习和思考之后,认为真正能称之为“者”的人都是那些纯正的人,至少在某些信念上及其的坚定,不为为界所变,世界上有很多诱惑,各种各样的,人很容易的就失去自己的判断,很容易的就被别人陈述的或者行为的所吸引,然而,不应该被遮住了自己的眼睛,唯有坚持下来的,才有价值,没有核心与前进,徒具华丽的言辞与修饰,一切都不是看上去那样的,信念与坚持,追求内心最值得努力的目标,无论身在何方,做什么事,只求内心的耐性与坚持,坚持是一道可以让繁杂相形见绌的骨气。
心存感激
发布时间:2008-01-30 00:09
对我来说,春节才是过年,过了春节才是新的一年,元旦只是个玩的节日。
恩,再过一天就回家了,又过去了一年,勉强赶上来搭建好了答应别人做的框架,虽然简陋了点,恩,过去了的一年,我做了许多事,很多错事,也很多转折点,虽然简陋了点,勉强凑合着。也许又得回去写春联了,又是那句“又是一年芳草绿,依然十里杏花香”么?从小到大,那个风吹雨打日晒了几十年的木门,微微褪色的红色的纸屑撕了又撕,每次,我都给它贴这对春联。确实,也只有那边剩下了静静的感觉,老房子沧桑感十足,看了叫人回忆起无尽。一年下来可以留下很多遗憾,很多很多,简单着重复着,周期性的徘徊着。人去楼空,勉强做 好吧,终于静的下心的时候,发现了快乐也发现了缺失。
不能抱怨,而要心存感激,也许吧,总有时刻,静静的时刻,被和谐了心态。淡淡叙述着流水的咚咚声,总不见得会有知音,心静静的才接收的了事物吧,今天在小孩宿舍临场展示封装socket,以及一些已经习以为常的操作,那些被称为“工程”性的东西,小孩觉的学了很多东西,就像我总是觉的白痴的操作令我羡慕一样,好像是个普遍现象。
回家,春节快乐^_^。

失误的角落
发布时间:2008-01-28 05:42
当看着那些影子,那些可能是你的影子,当然,也可能是我的。您一定觉的难过,是的,我们有时候倾向于讨厌自己的影子。额,这是废话。
到底是什么驱使我们去掌握一个东西呢,肯定有一大票一大票的人跳出来汗死你:兴趣,just for fun。恩,我相信这很对,一般情况下也很能忽悠您的。借用以前语文老师一句名言:”从某种意义上来说(鬼知道从哪个意义上...)“这句话本身也没错。额,这是废话。
然而,据所接触的这个小样本而言,除了那极个别不是脑子特简单的那种(恩,不是贬义)和那种已经到了一定层面,已经可以被称为”非人“的牛之外,大部分人,在角落里挣扎着学这学那,出于无意识的”恩,别人学了,我也去学吧“,”恩, 这个以后工作很有用,我一定要学会“,”额,为了比赛,啃死它吧“,”靠,老师布置的这个是人做的么”,“晕死,老师又没教这个,我怎么会”...。不一而足,偶尔看到在那啃着的,都是夜猫子,一脸的憔悴,一看就营养不良。去死吧“just for fun”,去死吧“兴趣”,通通去死吧。nothing,都即将或者已经是打工仔了,也许吧,有的能做的很棒,恩,优秀员工,好样的,明天给我7点到办公室安排任务。追求,去死吧,少数者的追求。大部分人即将为了或者正为了有钱,买房子,取个老婆而努力,工作就是理想,理想就是更好的工作。为了什么呢,生存。额,这是废话。
曾经在路上跟人讨论过个问题,讨论为什么零用钱大战能让我们的那个牌精着迷,以至于沉迷。得出的结论是,控制的快感,特别是有人看着你那apm***多的行云流水,啧啧称奇,您一定很满足很有成就感吧,哈哈,说到底什么操作性的都是这样的。justforfun???,可惜用错了地方。没人说错在了哪里,可也没人说没错。恩,这就是问题。问题就是没人说。嘻嘻,一定又绕晕了吧,绕晕了好,绕晕了就睡觉阿,睡觉能解百忧。额,这是废话。
如果爱,就爱,喜欢就喜欢,why i love you ?恩,you ask me,i ask who..。然后就有人汗如雨下-_--|||。额,这是废话。
天街小雨润如酥, 草色遥看近却无。 最是一年春好处, 绝胜烟柳满皇都。下雨了今天。

痛恨坐车(深度着凉)
发布时间:2008-01-23 16:46
非常非常非常的讨厌痛恨坐车,以后工作了我一定要住工作地点旁边,每天早上赶车会让我的健康度降低10倍。深度着凉了,睡了一天还是难受,喜欢夏天,讨厌冬天。我挂了,单向的时间和并行的事件几乎可以撕裂你,极限点一过,就粉碎了。有时候很佩服那些神经大条的人,总是能从容应付,并行不悖。偶看来是没希望了,同一时间,你能把握好几件事呢?也许我注定只是单线程的。
为了洗掉的卡
发布时间:2008-01-19 18:25
积累了一周的衣服,大概有一桶吧,实在是不好意思继续堆积了。昨天在超市买水的时候跟那个小气鬼营业员磨了好一会儿才给我换了两个硬币,亨,这么小气,我宿舍那一个储蓄罐的一角和五角的硬币打死也不拿过来给你们换,本来还准备过两天拿过来换掉算了,哈哈这回吃亏了吧(额,好久没啊Q了^-^)。昨晚看丁俊晖和傅家俊的台球赛了,....所以,所以今天中午才醒过来的,那比赛的转折点就一个失误,真是可惜,似乎又一次验证了细节决定成败的定律。说到定律,最近看了那本《溯本探幽--熵的世界》,发现那热力学第二定律蛮有意思的,知道了“熵增原理”和“能量守恒定律”原来是同一等级的东东,也对文献里面的那些个“信息熵”啊什么的不感冒了,熵跟分形几何,混沌都一样好玩,不过如果看的糊涂的就算了,只会增加点神秘感,其实...,也没什么神秘的,只是思维观念更新了呗。废话少说,刚说到我换了两个硬币,再翻箱倒柜找出了一个一块的硬币,把一周的衣服往桶里挤,然后就拿去自助洗衣机房洗了,哎,我总是在做完某一个动作后就马上后悔了,...我的卡...,我的饭卡...,我赖以生存的饭卡...,在那正在搅动的衣服口袋里...,汗...等吧,等衣服洗完了才能拿出来,额,一天没吃东西了,这个时候居然开始感觉饿了,饿肚子的时候人总是感性的,哎,为了我那洗掉的卡,我决定...,我决定等下出去好好吃一顿,哈哈.

过去了好久
发布时间:2008-01-15 16:47
过去了好久。这些天一个劲想不起来原来是怎样的,过去了好久,迷失的城堡里。就这样挣扎着,回忆起来的时候,过去的几个月就这样变模糊了,一个人在这里在那里,闷热的夏天,冰冷的冬天,还是在这里,还是在那里。三三三地我就分解了时间,我就被时间分解了。过去的夏天涌起了的勇气,依旧在冷冷的天气里飞着,飞着。过去了好久,寻找着最简洁最优美的感觉,细节模糊了。