Saturday, June 13, 2009

球球的病情分析: Evan's syndrome (IMHA + ITP) (possibly) triggered by lymphoma

背景:從上禮拜給了pred (2mi/kg)之後,HCT很快的爬回32,但是就再也沒上去了,之後給了CellCept其實也沒什麼幫助,而且中間白血球還莫名其妙飆到4萬9,不知道是CellCept的關係還是pred用久了的副作用;現在HCT又掉回24.5,而且球球出門會喘,再加上肝指數(ALT)已經飆到291了...不過剛剛冷靜下來,仔細的分析了一下現在的情況,其實該不該繼續用CellCept呢,畢竟光光壓制IMHA並沒有什麼效果,雖然據說他對號稱lymphoma有療效,但是在NCBI上完全找不到相關的文獻,更何況CellCept因為會壓抑bone marrow所以有機會造成貧血(4%~7%)...

分析:
1. 不只是RBC下降,PLT也遠低於正常值,既使現在脾臟已經移除了,PLT還是很低,尤其是這幾天我們以為是IMHA發作起來,PLT又從5百多又掉到1百多,也就是說其實他是ITP合併IMHA,也就是Evan's syndrome(這個term不是只有用在人身上,貓跟狗也有使用[1]);簡單說,抗體不只是在攻擊紅血球,也在攻擊血小板。

2. 在[2]對於貓的IMHA的survey也提到6/18隻IMHA的貓咪有thrombocytopenia,可能是因為DIC或是spleen enlargement,不過球球已經做了splenectomy,所以應該是有platelet-bound antibody,造成DIC(或IMHA造成了DIC?)。然後在[2]中有提到Coomb's test,球球好像沒做這個測試...這個是什麼啊?? 然後他提到pIMHA,也就是Primary IMHA,有比較好的預後,而其它大都由FeLV或是lymphoma所引起。照PCR的結果,球球應該是沒有FeLV,所以還是回到一開始懷疑的原因lymphoma了。

3. 其實不論是用CellCept或是用Mycophenolate Mofetil (MMF)去查其對IMHA的療效,幾乎都完全找不到文獻,唯一有找到的是在[3]這裡,提到Evan's syndrome有可能用ciclosporin, "mycophenolate mofetil", vincristine, danazol或是這幾種的結合,但是這些我相信這裡應該都是指用在人身上的;當然vincristine,也就就是oncovin,是李老師提到的,也是有免疫壓制的療效[4],也有用於leukemia。

4. IMHA發生在狗身上的研究就比較多了,而且在[5]提到使用azathioprine + low-does aspirin有非常好的壓制效果,而在[6]中提到,單單使用pred + cyclophosphamide並無法延長病畜的壽命,但是如果再加上azathioprine,則可以把median survival time從9天提升到370天! 所以我覺得azathioprine對於IMHA的是很有幫助的。在[7]中也提到了azathioprine是有幫助的,只是需要一個禮拜才能看到效果(!?)。

5. Heparin可以避免blood clotting,最主要是避免DIC所造成的pulmonary thromboembolism/embolism,因為她現在出門會喘,明明HCT其實跟之前比還算高的,然後今天又忘了做這個檢查,加上她的血小板這麼低...我覺得要防範一下打打看。

結論:我覺得是lymphoma的可能性還是在,所以李老師那個時候說的其實沒錯,如果給oncovin它本身就有壓制免疫的效果,所以理論上對IMHA也會有療效,也能壓制lymphoma,理論上真的會照他說的,藥下去HCT就會上來了。我覺得現在比較可能的策略,第一個是把CellCept停掉,換pred + azathioprine + cyclophosphamide + aspirin,這種方法的好處是cyclophosphamide也是對付lymphoma的chemotherpy,副作用也比較小,而且這也是[6]研究結果中認為對狗最有效的protocol;第二種還是把CellCept停掉,換pred + oncovin,這種做法的好處是,這是李老師推薦的,還有這藥比較強,對於lymphoma的壓制應該會比cyclophosphamide來的好(猜的),只是它對於免疫系統的壓制就不知道了。

另外吃這麼多藥對肝的毒性應該是很恐怖的,也難怪現在ALT來到291;現在已經有給她吃SAMe(S-Adenosylmethionine),應該多少有點幫助,明天看情況可能會再試著加上肝保(Milk Thistle),然後看能不能搭配上Hill's l/d減輕肝的負擔。至於之前買的Q10 coenzyme現在不太敢吃,查了一下它對免疫系統其實有強化的效果,現在可能不太適合。目前還在考慮的有Selenium的補給品,據說對癌細胞蠻有殺傷力的。

UPDATE:
azathioprine好像有點太強了,而且對有骨髓壓抑的副作用...還在想其它的替代方案(有嗎XD)。後來查到其實CellCept(Mycophenolate Mofetil)其實就是因為azathioprine其對於骨髓的壓抑太強大的替代方案[8]。另外,據說有比cyclophosphamide更沒有bone marrow suppression的chemo...還是要回頭打比較高劑量的pred勒? 但是太高劑量的pred打太久,會造成內分泌失調,唉...對付lymphoma + IMHA真的是很兩難...

UPDATE:
找到另外一個藥叫Rituximab http://en.wikipedia.org/wiki/Rituximab,是針對lymphoma的藥物,沒有bone marrow suppression的問題。但是沒看過在貓咪上使用,狗倒是有,而且沒效...Orz



[1] Immune-Mediated Thrombocytopenia-Current Approach. http://www.vin.com/proceedings/Proceedings.plx?CID=WSAVA2003&PID=6504&O=Generic

[2] Primary immune-mediated hemolytic anemia in 19 cats: diagnosis,
therapy, and outcome (1998-2004). http://www.ncbi.nlm.nih.gov/pubmed/16496936?ordinalpos=3&itool=EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DefaultReportPanel.Pubmed_RVDocSum

[3] Wikipedia, Evan's Syndrome. http://en.wikipedia.org/wiki/Evans%27_syndrome

[4] Wikipedia, Vincristine. http://en.wikipedia.org/wiki/Vincristine

[5] Evaluation of prognostic factors, survival rates, and treatment protocols for immune-mediated hemolytic anemia in dogs: 151 cases (1993-2002). http://www.ncbi.nlm.nih.gov/pubmed/15934255?ordinalpos=3&itool=EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DefaultReportPanel.Pubmed_RVDocSum

[6] Treatment of immune-mediated hemolytic anemia in dogs with cyclophosphamide. http://www.ncbi.nlm.nih.gov/pubmed/10935898?ordinalpos=4&itool=EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DefaultReportPanel.Pubmed_RVDocSum

[7] Immune Mediated Hemolytic Anemia in Cats (IMHA), Autoimmune Hemolytic Anemia. http://www.petplace.com/cats/immune-mediated-hemolytic-anemia-in-cats-imha/page4.aspx

[8] Wikipedia, Bone marrow suppression. http://en.wikipedia.org/wiki/Myelosuppression

[9] Wikipedia, Mycophenolic acid. http://en.wikipedia.org/wiki/Mycophenolic_acid

Thursday, June 11, 2009

雜記: Variadic Template, Boost FunctionTypes, Boost MPL, AMQP

最近滿腦子除了球球的事之外,就是一堆C++ template,還有各式各樣的messaging system,整個快爆炸了。來筆記一下這幾天在看的東西好了;首先是為了要做比較直覺的RPC framework,不想要讓使用者自己encode parameter list,所以看了各式各樣的template的技巧,像是Variadic Template,之前完全沒用過,用了才發現其實這很強大...


template< typename T >
void print_comma_separated_list(T value)
{
std::cout << value << std::endl;
}

template< typename First, typename ... Rest >
void print_comma_separated_list(First first,Rest ... rest)
{
std::cout << first << ",";
print_comma_separated_list(rest...);
}

// 然後就可以這樣寫...
print_comma_separated_list(42,"hello",2.3,'a');


參考自: http://www.devx.com/cplus/Article/41533/1954
不過在g++裡要再多加個-std=c++0x或是-std=gnu++0x才能編譯就是了。

然後看到某個神人在GameDev發的文章,在講把C/C++的function bind進Lua的方式,用到了我之前沒看過的Boost.FunctionTypes
http://www.gamedev.net/reference/articles/article2629.asp
作者有附上原始碼,雖然在Ubuntu上因為libluabind-dev要用boost,而內建boost版本又太舊不能編譯之外,應該還蠻容易看懂的。我覺得比較神奇的是Executor的部份,原來可以用這樣的方式依據不同數量的parameter來選擇template specialization啊...每次看別人寫的template都有種:「原來可以這樣啊!!」的感覺 Orz

截取一小段程式碼:

// 這是Executor的部份...
template< class Arity, class ParamTypes, typename ResultType >
struct Executor;

// 0 parameters
template< class ParamTypes, typename ResultType >
struct Executor< Int2Type< 0 >, ParamTypes, ResultType > {
template< class Fn > ResultType operator()(Fn& fn, const AnyParams& /*params*/) {
return fn();
}
};

// 1 parameter
template< class ParamTypes, typename ResultType >
struct Executor< Int2Type< 1 >, ParamTypes, ResultType > {
template< class Fn > ResultType operator()(Fn& fn, const AnyParams& params) {
return fn(
boost::any_cast< boost::mpl::at< ParamTypes, boost::mpl::int_< 0 > >::type >(params[0]));
}
};

// 這是Command的部份
template< class Fn >

struct CommandT : public Command {

CommandT(const std::string& name, const Fn& fn)

: Command(name)

, fn_(fn)

{}


// ...略...

// Executer for void return type

int Execute(lua_State* lua_state, Int2Type) const {

AnyParams params;

try {

boost::mpl::for_each< ParamTypes >(Extractor(lua_state, params));

} catch( std::exception& /*ex*/) {

//LOG_ERROR_LN("Error in extract");

throw;

}

Executor f;

f(fn_, params);

return 0;

}

// ...略...


Boost.FunctionTypes搭配Boost.MPL ==> 整個非常強大,這樣就可以很容易的bind RPC callback而不用自己去decode network buffer;不過麻煩的在於呼叫的時候,現在的想法大概是類似Boost.Function + Boost.Bind,用類似的宣告方式,但是內部真的在呼叫的時候是會自動去encode network buffer,不過這樣寫起來實在太麻煩了,不知道有沒有比較簡單的方法....還在想要怎麼辦才好...


然後本來要自己寫的broker最後放棄了,實在太花時間了,看那些TRAM、TOTEM、各式各樣的reliable broadcast,還有各式各樣的reliable membership dissemination,頭都昏了;其實用現成的MQ就夠了,反正這個不太要求效能,重點是要reliable跟fault-tolerant啊! 所以再次重新研究了一下現在能用的messaging system,大概有幾套:
1. Spread Toolkit (但是已經不maintain非常久了..不太敢用...囧)
2. OpenAIS (作者的進度一直delay)
3. JMS
3.1 ActiveMQ (歷史悠久啊...也有ActiveMQ-CPP支援C++ client,CMS的介面定的還不錯)
3.2 FioranoMQ (最近有出了個報告說它是市面上最快的MQ...只是要錢 XD)
4. AMQP
4.1 OpenAMQ (應該是AMQP的第一個實作吧,感覺好像蠻有那麼一回事的,應該要來試用看看)
4.2 ZeroMQ (又一個號稱地表上最快的AMQP實作,雖然他有圖有真相,還號稱支援Infiniband...不過怎麼沒什麼提到fault-tolerance的部份勒...)
3.3 Qpid (這個是Apache的C++ AMQP實作,我研究過他的原始碼,其實寫的還可以,只是居然depend on OpenAIS,然後似乎有打算支援Infiniband,但是雖然程式碼有寫,可是根本沒有使用...囧)

其實AMQP裡還有很多有名的實作,像是之前twitter使用的RabbitMQ,只可惜他沒有C++ client,要不然真的可以考慮一下。目前最看好的大概就是ActiveMQ,接著是FioranoMQ,然後是OpenAMQ,Spread Toolkit,最後才是ZeroMQ (沒辦法,ZeroMQ似乎reliability的部份不清不楚)。其實照理論上,我覺得如果OpenAIS有好好的、認真的把它寫完,而且還有人繼續maintain的話,應該會是最強大的,畢竟它和Spread Toolkit一樣是唯二實作totem ring protocol的;當然用totem跟TRAM或是其它的方式都有好有壞啦,只是我個人比較偏好totem的reliability跟recoverability。

反正不管用什麼MQ,上面應該都會用類似JMS/CMS的介面包起來吧,畢竟AMQP是JMS的generalization,應該不成問題才是;但是麻煩的是reliability跟system administration,這個還是留到之後再考慮吧!