private constructor? 静态工厂?

今天卡在了这样一段代码里:

Thread ** m_ppThreads;      (code 1)

……

m_ppThreads = new Thread*[NUM];    (code 2)

其中,Thread是一个构造函数为private的类:

class Thread{

private:

Thread(…….) { …… }

public:

Thread * create_obj(……) { …… }

……

};

由于Thread类的构造函数是私有的,因此只能通过其提供的一个静态函数接口创建该类的对象。

对于code 2,我感到疑惑的地方在于:Thread类的构造函数函数是私有的,而new一个Thread数组是必定会调用Thread类的构造函数,这样会造成编译时出错。实际上,code 2所做的并不是new一个Thread数组,而是new一个Thread类的指针数组,new的是指针而不是类。因此,code 2并不会出错:-)

附注:

在网上搜索了一下关于private constructor的资料,发现这种奇怪的类是专用于实现设计模式(design pattern)里说的singlton pattern(中文叫什么?)。通过静态函数创建类实例,又叫静态工厂方法。这样可以控制创建类实例时的行为,使得全局范围内仅创建有限个实例。

Posted in TECH | Leave a comment

偶遇字节序

一直没有搞懂某个脚本的这句代码:
printf “\x01\x00\x00\x00” > $out_file
运行时,其作用是将一个4字节整数1写入文件中。
od -N4 -tx1 $out_file,以一字节十六进制dump数据,看到输出结果为:
0000000 01 00 00 00
与输入顺序相同。
od -N4 -tu4 $out_file,以四字节无符号整型dump数据,则结果为
0000000 1
明显与输入顺序不同,因为输入是01000000。其值绝对可能是1。
今天请教高手后发现,原来是字节序的问题。
似乎除IBM的CPU外,大部分机器CPU都是小端字节序,包括INTEL。
小端字节序在解析时从高位开始。例如,内存中4字节如下分布:
地址:01 02 03 04
内存:01 00 00 00
那么小端字节序CPU以4字节整型解析该段内存数据时,得到的值为00000001。即先从地址04开始,往小地址读4字节。
相反,大端字节序解析得到的值为01000000。即先从小地址01开始,往大地址读4字节。

Posted in TECH | Leave a comment

随手写的简单队列

昨晚一个偶然的机会,随手写了一段队列代码。很久没有写过data struct的代码,写出来后错漏百出。经过几番修改,应该可用了。

队列需要实现以下几个功能:

1. 删除给定节点;

2. 获取队列节点个数;

3. 获取队首节点。

代码如下:

class Queue
{
public:
 
 ///@brief 从队列链表中移除一个Elem
    void Remove(Elem* elem)
    { 
  if (elem == NULL)
  {
   ///TODO 出错处理
   return;
  }
  
  if (m_count == 1)
  {
   //队列只有一个元素
   m_head = NULL;
   m_tail = NULL;
  }
  else if (elem->GetNext() == NULL) /// 删除队尾元素
  {
   elem->GetPrev()->SetNext(NULL);
   m_tail = elem->GetPrev();
  }
  else if (elem->GetPrev() == NULL) /// 删除队首元素
  {
  elem->GetNext()->SetPrev(NULL);
   m_head = elem->GetNext();
  }
  else
  {
   elem->GetPrev()->SetNext(elem->GetNext());
   elem->GetNext()->SetPrev(elem->GetPrev());
  }
  
 elem->SetNext(NULL);
 elem->SetPrev(NULL);
  –m_count;
    }

    ///@brief 将Task放到队列尾
    void PushBack(Elem* elem)
    {
  if (elem == NULL)
  {
   ///TODO 出错处理
   return;
  }
  
  if (m_count == 0) ///队列为空
  {
   m_head = elem;
   m_tail = elem;
  }
  else
  {
   m_tail->SetNext(elem);
   elem->SetPrev(m_tail);
   m_tail = elem;
  }
  
  ++m_count;
    }

    ///@brief 返回指向队首Elem的指针,但不从队列中移除它
    Elem* GetFront() const
    {
        return m_head;
    }
 
 ///@brief 返回队列元素个数
 int GetCount() const
 {
  return m_count;
 }

private:
    Elem* m_head; /** 队头 */
    Elem* m_tail; /** 队尾 */
 int m_count; /** 保存队列元素个数 **/
};

Posted in TECH | Leave a comment

特殊字符 – google和bing

今天看到了这篇有意思的文章:How do search engines handle special characters? Should you care?
主要内容是对比搜索引擎对特殊字符的处理,比较了google和bing。分别用两个带特殊字符的人名,Kurt Gödelcœur,进行搜索。理想的结果是Kurt Gödel等同于Kurt Goedel,而cœur等同于coeur。特别是进行学术搜索时,某些拉丁文名字的作者会让人不知如何输入是好。如果当作英文字母输入,又常常得不到想要的结果。
比较的结果是bing将英文字符的人名正确识别,而谷歌则没有相应处理,所以

Score: Bing 1. Google 0.

如此看来,虽然目前在搜索领域,google一家独大,但bing也的确有其独到之处。有竞争才会有发展。

Posted in TECH | Leave a comment

春天里

看了一段据说是农民工翻唱汪峰的《春天里》的视频。

http://v.youku.com/v_show/id_XMjEwOTQ4MTQ0.html

歌声的确很真实。

破烂的宿舍,赤裸的上身,凋零的香烟,成堆的酒瓶,一种“老无所依”的凄凉。

 

Posted in LIFE | Leave a comment

第四范式:data-intensive science

从这个名为“The Fourth Paradigm”的博客上得知,计算机科学(computational science)被认为是科学探索(scientific discovery)的第三种范式(Paradigm)。其它两种范式分别是传统实验(traditional experimental)和理论科学(theoretical science)。如今,密集数据科学(data-intensive science)被认为是第四种范式:

He had the idea of data-intensive science as a Fourth Paradigm of scientific exploration from Nobel Prize winner Ken Wilson. In the 1970’s Wilson categorized computational science as the third paradigm for scientific discovery after the traditional two methodologies of traditional experimental and theoretical science.

无论范式的确切含义是什么,也无论第四种范式是否被认可,它将如何发展,至少,我知道我的专业(computer science)和现在接触的工作(Large-scale data)都是被重视的。

Posted in TECH | Leave a comment

True communication,一个小故事

Dean Abbott在他的博客讲了一个小故事

[In a seminar, a] guy there who would ask dumb questions  from the get-go: questions that we all knew the answer to and most folks thought were obvious. But as the lecture continued, this guy was the only one left asking questions, and of course was the only one who truly understood the lecture. What was happening is that he was constantly aligning what he thought he heard by asking for clarification. The rest  of those in the roomthought they understood, but in reality did not.

故事大意是讲一个人在学术研讨会上,不停的对演讲者问一些简单的显而易见的问题。结果,到最后只有这个人还一直能发问,因为只有他真正跟上演讲者的思路,真正理解演讲者所讲的内容。作者最后说:

It reminds me to ask questions, even the dumb ones if it means forcing the one who is teaching or explaining to restate their point in different words, thus providing better opportunity for true communication.

如何做到True communication?提问或许是一种方式。通常,在提问时我们只关心怎么提问以及如何接收答案信息等提问者的活动,却很少会考虑提问对被提问者的作用。例如,通过提问可以让被提问者,从不同角度重新说明其观点,这样可以帮助提问者获取更多关于话题的信息。但是提一些简单的问题是需要勇气的,不要说在seminar,就算是在平时大学课堂上,我们学生或者老师都不会或不允许这么做。

Posted in LIFE | Leave a comment