念奴娇

念奴娇

(2010) 马飞涛

落英飞尽,

仰天处, 慷慨悲歌尤现。

妩媚青山,常惋忆,

壮士马革血染。

豪气穿空,

挺身赴难,

敢对千夫剑。

阳关酒美,

一杯沙场征战。

长忆似水流年,

梅花零落了,

红飘香散。

秋雨秋风,回首看,

不见百娇千艳。

寒夜窗烛,

孤独应笑,

我泪襟沾满。

瑶琴弦断,

一读青史还叹。

出处:

仰天:
岳飞《满江红》: “仰天长啸,壮怀激烈”

马革:
东汉名将马援:“男儿要当死于边野,以马革裹尸还葬耳”
龚自珍《已亥杂诗》:“青山处处埋忠骨,何须马革裹尸还”

千夫:
鲁迅《自嘲》:“横眉冷对千夫指,俯首甘为孺子牛”

阳关:在今甘肃省敦煌西南
王维 《渭城曲》:“劝君更尽一杯酒,西出阳关无故人”

征战:
王翰《凉州词》:“醉卧沙场君莫笑,古来征战几人回。”

梅花:
陆游《卜算子 咏梅》:“零落成泥碾作尘,只有香如故”

秋雨秋风
秋瑾: “一叶落而知秋深,秋风秋雨愁煞人”

窗烛:
李商隐《夜雨寄北》:“君问归期未有期,巴山夜雨涨秋池。何当共剪西窗烛,却话巴山夜雨时。”

泪沾襟:
杜甫《蜀相》: “出师未捷身先死, 长使英雄泪满襟。”

瑶琴:
岳飞《小重山》:“欲将心事付瑶琴,知音少,弦断有谁听”

评论

管理倒置原则

昨天表伟同学主持了《软件随想录》的读书分享会,大家热烈讨论了各自对项目管理和招人的经验,
其中提到了X+Y理论, 术和道的区别。

今天早晨,我一个人静静地走在上班的小路上,经过沉思,发现昨天大家讨论的立足点都是错误的,
包括我自己。

我们根本就不应该有"管理"这个概念。应该把传统意义上的"管理"这个词汇从创新院人的思维里抠掉。

我总结一些新的心得,与大家分享。

项目管理之马氏原则:
"管理倒置原则", 即:
项目成员自我管理,项目经理服务于大家;

角色定位:
项目经理:
不是管理者,
而是:组织者+协调者+服务者+开发者;

项目成员:
不是被管理者,
而是:自我管理者+参加者+决策者+开发者

心态调整:
项目经理:
一定要忘掉“管理”这个词
一定要牢记“服务”这个词
一定要拉低自己的身段,姿态放平或者更低
无为而治
上善若水
海纳百川

项目成员:
一定要摆脱“被管理者”的心态
一定要时刻提醒自己也是决策者一员,在集体决策时积极发言;

借用网络模型:
项目经理类似于服务器
项目成员类似于客户端,
客户端可以自我管理,自己处理过载,自己重新启动

工作流程:
1 开发进度:集体讨论并决策,制定里程碑和各个子节点
2 任务分配:项目成员自己认领

遇到问题:
1 项目经理发现问题后,首先要扪心自省,先从自己身上找问题;
2 开会集体讨论决策问题的解决方法

团队建设之终极目标:
王道乐土
每个项目成员能感觉到:工作==娱乐
(这句话不是我在唱高调,我确实在编程中能感受到类似于传说中吸毒之后的飘飘然的快乐,现在可能是毒瘾大了,快乐就少了,所以,我会找更难做的方向来开发)

娱乐反倒是工作
(我不吸烟不喝酒不玩游戏不打牌,现在开始玩玩“三国杀”和wii, 当成自己的"工作"来体验一下)

工作==娱乐的公司,无敌于天下!
想想google吧。

项目管理的最高境界应该是不管,管他干嘛?

是否我写的是“漫纸荒唐言”? 欢迎大家拍砖,欢迎推墙。

马飞涛

评论

asio fiber 异步实质,同步的写法

//mafeitao[at]gmail.com
// async_tcp_echo_server.cpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include "stdafx.h"
#include <iostream>

#include <string>

#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include
< boost/date_time/posix_time/posix_time.hpp>
#include
< windows.h>

using boost::asio::ip::tcp;

#include <windows.h>
void * GetMainFiber(void)
{
static bool ini=false;
static void * mainFiber=NULL;

if(ini==false)
{
ini=true;
mainFiber= ConvertThreadToFiber(NULL);
}

assert(mainFiber !=NULL);
return mainFiber;
};

class CFiberSocket
{
private:
tcp::socket * pSocket_;
enum { max_length = 1024 };
char data_[max_length];

bool ok_;
int bytes_transferred_;
void * meFiber_;

public:

CFiberSocket(tcp::socket * socket)
:pSocket_(socket),
ok_(false)
{
bytes_transferred_=0;
meFiber_=::GetCurrentFiber();

};

~CFiberSocket(void)
{
pSocket_->close();
delete pSocket_;
::SwitchToFiber(GetMainFiber());

};

void close(void)
{
pSocket_->close();
};

std::string read_some(int max_length, int timeout)
{

pSocket_->async_read_some(boost::asio::buffer(data_, max_length),
boost::bind(&CFiberSocket::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

SwitchToFiber(GetMainFiber());

if(ok_)
{
std::string str(data_, bytes_transferred_);
return str;
}
else
return "";

};

void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
bytes_transferred_ =bytes_transferred;

if (!error)
{
//没有错误
ok_=true;

}
else
{
//有错误
ok_=false;
}
SwitchToFiber(meFiber_);
};

bool write(const char * buf, int size)
{

boost::asio::async_write(*pSocket_,
boost::asio::buffer(buf, size),
boost::bind(&CFiberSocket::handle_write, this,
boost::asio::placeholders::error));

SwitchToFiber(GetMainFiber());

return ok_;

}

void handle_write(const boost::system::error_code& error)
{
if (!error)
{
ok_=true;
}
else
{
ok_=false;
}

SwitchToFiber(meFiber_);
};
};

//纤程内部,同步等待
void WINAPI sessionProc(void * pSocket)
{
CFiberSocket socket( (tcp::socket *) pSocket);

std::string str;
while(true)
{
str=socket.read_some(100,1);
printf("%s\n", str.c_str());
if(str.size()==0)
{
return;
};

char buf[100];
int * fiber=(int *) GetCurrentFiber();
sprintf(buf,"[%x]\r\n",  fiber );
str.append(buf);
socket.write(str.c_str(), str.size());

};

};

class server
{
public:
server(boost::asio::io_service& io_service, short port)
: io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
{
tcp::socket * pSocket = new tcp::socket(io_service_);

acceptor_.async_accept(*pSocket,
boost::bind(&server::handle_accept, this, pSocket,
boost::asio::placeholders::error));
}

void handle_accept(tcp::socket * pSocket,
const boost::system::error_code& error)
{
if (!error)
{

void * me   = CreateFiber(4096, sessionProc, pSocket);
::SwitchToFiber(me);

tcp::socket * pNewSocket = new tcp::socket(io_service_);

acceptor_.async_accept(*pNewSocket,
boost::bind(&server::handle_accept, this, pNewSocket,
boost::asio::placeholders::error));
}
else
{
assert(true==false);
}
}

private:
boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
};

int main(int argc, char* argv[])
{
try
{

char* pPort="1235";

if (argc != 2)
{
std::cerr << "Usage: echo_server

\n";}
else
{
pPort=argv[1];
}

boost::asio::io_service io_service;

GetMainFiber();

using namespace std; // For atoi.
server s(io_service, atoi(pPort));

io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}

return 0;
}

asio fiber 例子, 把asio异步非阻塞的调用,借助fiber 纤程[协程], 构造语法糖,包装为同步阻塞的写法。

注意这个函数
//纤程内部,同步等待
void WINAPI sessionProc(void * pSocket)

函数里面是阻塞调用的写法,但是通过纤程跳到主纤程里面,在主纤程的回调函数里,又跳回到该会话的纤程。

客户端一个连接,对应于服务器端的一个socket, 每个socket新开一个纤程, 每个线程是一个会话,纤程sessionProc里收发是同步的写法。
有时间再把异步accept包装为同步写法,为linux也做一个asio + 纤程的版本

评论

Asio+fiber


以下是一个asiofiber结合的最简单的小例子。

Asio+fiber+单线程的内存池, 效率无敌,纤程内部,同步等待,写法优美。

// test_timer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <boost/asio.hpp>
#include
< boost/date_time/posix_time/posix_time.hpp>
#include
< windows.h>

void *fiber_context[2];

void print(const boost::system::error_code& /*e*/)
{
std::cout << "Hello, world!\n";
}

boost::asio::io_service io;
void WINAPI fiberProc(void *fiber_nbr);
void callback(const boost::system::error_code& /*e*/);

void wait(int second)
{

boost::asio::deadline_timer t(io, boost::posix_time::seconds(second));
t.async_wait(callback);
SwitchToFiber(fiber_context[0]);

};

void callback(const boost::system::error_code& /*e*/)
{
std::cout << "callback!\n";
SwitchToFiber(fiber_context[1]);
};

//纤程内部,同步等待
void WINAPI fiberProc(void *fiber_nbr)

{
wait(1);
printf("step1\n\n");

wait(1);
printf("step2\n\n");

wait(1);
printf("step3\n\n");

wait(1);
printf("step4\n\n");

SwitchToFiber(fiber_context[0]);

}

int main()
{
fiber_context[0] = ConvertThreadToFiber(NULL);
fiber_context[1] = CreateFiber(4096, fiberProc,0);

boost::asio::deadline_timer tLong(io, boost::posix_time::seconds(8));
tLong.async_wait(print);

SwitchToFiber(fiber_context[1]);

io.run();

return 0;
}

评论

用bind来解耦

#include "stdafx.h"

#define BOOST_AUTO_TEST_MAIN
#include
#include

#include
#include
#include

#include
using namespace std;

//声明一个函数指针的类型
typedef void (* ON_SEGMENT) (char * );

//用function<> 和指针回调指针来解除耦合
//注意解耦效果: CReader 和 CSaver 没有任何关系
class CReader
{

public:
CReader()
{
m_pFunc=NULL;
m_functor=NULL;

};

void UseFreeFunc(ON_SEGMENT pFunc)
{
m_pFunc=pFunc;
};

void UseFunctor(boost::function functor)
{
m_functor= functor;
};

void Read(char * pchar)
{

if(m_pFunc)
{
m_pFunc(pchar);
};

if(m_functor)
{
m_functor(pchar);
};

}
private:
ON_SEGMENT m_pFunc;//函数指针
boost::function m_functor; //函数对象
};

class CSaver
{
public:
//接受输入的字符,保存在内部变量m_str
void Input(char * pchar)
{
m_str.append(pchar);

};
string m_str;
};

BOOST_AUTO_TEST_CASE(test_bind)
{
//两个类并不知道对方的任何细节
CSaver saver;
CReader reader;

//预先 把函数 CSaver::Input 和要操作的数据 &saver 注册到 reader
//只要函数形式符合(返回值是void,传入参数是char *),都可以注册
//解除CSaver 和 CReader的耦合

//bind产生的函数对象,重载操作符()
//函数对象的本质是 函数指针加this指针,即 操作和数据
//函数对象 比 函数指针优越的地方是可以带有内部状态

reader.UseFunctor( boost::bind(&CSaver::Input, &saver, _1) );

//延时调用,解除CSaver 和 CReader的耦合
//把字符从reader 放入 saver里面
reader.Read("Hello");

reader.Read("Mafeitao");

BOOST_CHECK(saver.m_str=="HelloMafeitao");

}

//asio 里面的 async_accept 的简化版本

//可以接受 函数指针; 比如 async_accept(FreeFunc,Para)

//可以接受 函数对象; 比如
// CSaverFunctor func;
//async_accept(func,Para)

//可以接受 bind
template
void async_accept(AcceptHandler handler, Para p)
{
handler(p);
};

// 自由函数,没有内部状态
void FreeFunc(char * pChar)
{
printf("In FreeFunc %s\n", pChar);
}

BOOST_AUTO_TEST_CASE(bind_asio)
{

//类 CSaver 和 模板函数 async_accept,没有任何关系
CSaver saver;

char *pchar="Hello";

//bind生成一个临时的functor类 CSaverTemp
//类似于
/*
class CSaverTemp
{
public:
void operator ()(char * pchar)
{
m_str.append(pchar);

};
string m_str
}

CSaverTemp saver;

async_accept(saver,pchar);
}
*/

//全局函数 async_accept,接受一个bind产生的函数对象( 函数指针和this指针)
async_accept( boost::bind(&CSaver::Input, &saver,_1) , pchar);

BOOST_CHECK(saver.m_str=="Hello");

pchar="Mafeitao";

async_accept( boost::bind(&CSaver::Input, &saver,_1) , pchar);

BOOST_CHECK(saver.m_str=="HelloMafeitao");

//接受 全局函数指针,和下面的效果一样
async_accept( boost::bind(FreeFunc,_1), pchar);

//接受 全局函数指针,和上面的效果一样
async_accept( FreeFunc, pchar);

}

//带有模板函数的类
class TReader
{
public:

//模板函数
template
void Read(OnReadHandler & handler, Para p)
{
//可以接受 函数指针,参数
//可以接受 函数对象,参数
//可以接受 bind
handler(p);
};

};

BOOST_AUTO_TEST_CASE(bind_template)
{
TReader reader;
CSaver saver;

char *pchar="Hello";

reader.Read(boost::bind(&CSaver::Input, &saver,_1) , pchar);

BOOST_CHECK(saver.m_str=="Hello");

pchar="Mafeitao";

reader.Read( boost::bind(&CSaver::Input, &saver,_1) , pchar);

BOOST_CHECK(saver.m_str=="HelloMafeitao");
}

//函数对象,重载操作符()
//函数对象的本质是 函数指针加this指针,即 操作和数据
//函数对象 比 函数指针优越的地方是可以带有内部状态
class CSaverFunctor
{
public:
void operator ()(char * pchar)
{
m_str.append(pchar);

};
string m_str;
};

BOOST_AUTO_TEST_CASE(test_functor)
{
//带有模板函数的类
TReader reader;

//函数对象
CSaverFunctor saver;

//把字符从reader 放入 saver里面
char *pchar="Hello";
reader.Read( saver , pchar);

pchar="Mafeitao";
reader.Read( saver , pchar);

BOOST_CHECK(saver.m_str=="HelloMafeitao");

}

Comments (2)

« Previous entries ·


0.038 sec