调整

这几天我终于把作息时间调整过来了,这是个很好的坚持,我想应该能持续很长的一段时间。如果你发现我1点之后还在,请监督我。我发现一件事,早上的工作效率果然是比较高的,我可以用来写代码,但是晚上练琴的效率却相当低,不过不得不说,Summer真是一首非常耐听的曲子,越练越带感,就是后面速度对我来说有点太快了。

READ MORE

TCP性能分析技术(1):Windows下TCP/IP协议栈的实现

先列举几个问题作为以后所有同系列文章的疑点:

  • 荷兰问题:使用运营商(局方)的测试工具(包括客户端和服务端程序)测试,上传和下载的吞吐量都不高,但是使用我们自己的测试工具则正常,不过运营商坚持他们的测试工具是没问题的,如何证明是运营商的工具问题?
  • 拉脱维亚问题:使用DOS下的FTP进行上传,吞吐量正常,但在浏览器中进行FTP上传的吞吐量很低。
  • 南非问题:终端收到前向的包,但CRC校验出错,分析发现TCP净荷出错而且位置固定。
    通过抓包分析问题与定位问题。

  • 哪些因素会触发TCP发送端发包?发包数量怎么计算?

  • 哪些因素会触发TCP接收端回复ACK且数据送往应用层?
READ MORE

C++11的常量引用与右值引用

有个代码例题:

1
2
value_type tmp(key, val);
return this_type::insert(std::move(tmp));


1
return this_type::insert(std::move(value_type(key, val)));

以上代码有区别吗?答案是肯定的。

READ MORE

Poco带来的设计思考

Poco::Net提供了很多便利的开发组件。尽管Poco目前还不是一个很完美的C++类库,但是它从设计上和使用的简易程度上都有着较为超前的理念。

大概是去年年底,我开始使用Poco::Net封装的网络通信库取代了boost::asio,直至现在Poco的文档也并不多,不过使用方法很有套路性。Poco封装的组件可以说已经把开发者绑死在了这种固定的使用模式上,因此可以很轻易地搭建一个TCPServer并且跑起来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct ServiceApplicationParams
{
std::string listen_address;
int max_queued;
int max_threads;
};
class ServiceApplication
: public Poco::Util::ServerApplication
{
public:
ServiceApplication(const std::string& serviceName, MessageDispatcher* messageDispatcher);
virtual ~ServiceApplication();
public:
int run(int argc, char** argv, Venus::ServiceApplicationParams* params);
int main(const std::vector<std::string>& args);
virtual void defineOptions(Poco::Util::OptionSet& options);
virtual void handleOption(const std::string& name, const std::string& value);
private:
void initialize(Poco::Util::Application& self);
void uninitialize();
private:
Venus::ServiceApplicationParams* _applicationParams;
Poco::Net::SocketReactor _reactor;
MessageQueue _messageQueue;
std::string _serviceName;
};

写过服务器应用的都知道,相比起使用平台自带的Native Socket Api而言,上面的代码充满了现代C++感,可读性很好。首先我们把服务进程抽象为一个Application,这也是由继承Poco::Util::ServerApplication开始的。它提供了run()方法作为启动入口。根据这种设计,我们也可以把服务编译为动态库,以组件的形式提供给service box,从外部启动。

要启用一个TCPServer也相当简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Poco::Net::SocketAddress listenAddress(_applicationParams->listen_address);
Poco::Net::ServerSocket socket(listenAddress);
Poco::Net::TCPServerParams* serverParams = new Poco::Net::TCPServerParams();
serverParams->setMaxQueued(_applicationParams->max_queued);
serverParams->setMaxThreads(_applicationParams->max_threads);
MessageQueueWorker queueWorker(_messageQueue);
Poco::ThreadPool::defaultPool().start(queueWorker);
ConnectionFactory connectionFactory;
connectionFactory.setMessageQueue(_messageQueue);
Poco::Net::TCPServer server(&connectionFactory, socket, serverParams);
server.start();
info_log("Server started.");
Poco::Util::ServerApplication::waitForTerminationRequest();
_messageQueue.wakeUpAll();
server.stop();
READ MORE

雅马哈P95B电钢的评价

用了几个月,说说体验问题。

  • 雅马哈P95B原装不带三踏板,只有一个强音踏板。
  • 音质比较好,雅马哈的产品音响效果其实都不错。
  • 手感适中,不重也不轻。
  • 琴主机体积比较小,加原装木架组装也很简单。缺点是琴上面不能放东西。
  • 谱架没办法很稳的固定,不过放纸质谱是毫无问题的。
  • 自带节拍器。
  • 可选的电子音色太少。
  • 录音功能太慢,结束录音的时候通常要等10~20秒。
READ MORE