2015年5月4日 星期一

Mycestro 使用心得

先看影片,看看 Mycestro 是什麼東西


就是個像 Wii 的手把一樣,利用加速度計來當作輸入的裝置。
因為越來越懶了,不廢話,直接列優缺點:

優點:


  • 手不用在鍵盤跟滑鼠中間來來去去,對像我這樣的 vim 的使用者很方便,手不用離開鍵盤。
  • 沒了。

缺點:


  • 貴,一隻要價 149 美金,相當於 4500 台幣,還不算運費。運費 30 美金,總價 5400 台幣。
  • 連續使用的話,大概七八個小時以後沒電。其實也蠻久了,畢竟人平常也不太可能連續使用七八個小時,加上他充電也很快。而且沒電的時候就剛好站起來走一走 XD 這樣好像不算缺點
  • 需要一個特製的 BlueTooth dongle,不見,就沒了,就不能用了,要的話,不好意思,再買一隻,19 美金,運費 30 美金,總價 1500 台幣。神奇的來了!MacBook Air 不知道為什麼不需要這個特製的 dongle 就可以直接使用!不理解為什麼 Windows 使用者就得多花錢買一個特製 dongle,寫信給他們,來來回回好幾封,跟我轉圈圈,沒回答。
  • 適應期長,大概要一個禮拜以後才會熟練,可以取代一般的滑鼠。
  • 戴久了手指有點悶悶的
  • Linux 上面沒有 driver,無法控制他的靈敏度,但出廠的預設值調的非常小,用起來要人命。問官方,官方回答「也有人在 Linux 上面沒有 driver 也用的很好」我管別人用的好不好,我要 driver 阿 = =||

Q & A:


  • 可以取代滑鼠嗎?可以,但需要一段時間適應
  • 貴嗎?貴
  • 好用嗎?好用
  • 重嗎?一點點,還好,不會影響打字
  • 推薦買嗎?很難說,他很貴,你很有錢的話就 OK,不然不推

2015年4月20日 星期一

撿到四隻小貓

第一天晚上

大概十二點多回到家,聽到防火巷裡面傳來「哇哇嗚嗚」的聲音,我在想「老鼠又在打架了」不過現在的老鼠還真大膽了,叫這麼大聲,都不怕給貓抓到。

第二天早上

十點,經過防火巷外面,聽到跟昨天晚上一樣的聲音。耶,這就奇怪了,老鼠不可能叫一整個晚上。於是我就探過去看,跟著聲音找,赫然發現地上有一個小東西在動,幹,什麼東西?老鼠?貓!是貓!超小的貓!乳牛貓!連眼睛都還沒有睜開耶,腳被樹根給纏住了,卡住了,走不開,好可憐喔。嘗試想要幫他解開,發現纏得很緊,怪不得他會哭。只好拿出隨身的小剪刀,幫他把那個樹根剪斷。ㄟ?跟樹根纏在一起的這是什麼……胎盤?他的臍帶跟地上的樹根纏在一起了,怪不得他走不開,而且乾掉的臍帶跟樹根也太像了吧……拿在手上,好小喔,真的好小喔……但竟然也是一個生命 @@ 覺得好神奇……

聽到旁邊還有聲音,看了一下,發現旁邊約五十公分處的花圃裡面,是另外一隻小貓,同樣也是被自己的臍帶卡住,巨大的胎盤被卡住,爬不動,也是在哭,也幫他把臍帶剪了。感覺母貓應該是想要把小貓生在這個花圃裡,但不知道為什麼有一隻生在外面。看了一下花圃,非常的深,小貓不可能自己爬出來。怎麼會一隻生在裡面一隻生在外面?

我知道遇到小貓不能隨便撿,因為貓媽媽照顧小貓會比人類照顧好很多。但這小貓這樣在外面實在太危險了,我幫他兩隻放在一起,都在花圃裡面,這樣比較不會跑出來,到時候跑不見就完蛋了……

放好以後就要離開了……走出防火巷的時候,看到第上有一隻死老鼠,靠!嚇死我了,差一點就踩到!怎麼會有一隻死老鼠在這邊!死了!仔細看仔細看,發現不是老鼠……是貓!又是一隻貓!跟剛剛的一樣大,應該是同一胎,怎麼會在這麼遠的地方?隔好幾公尺耶!貓媽媽在幹麻 @@ 三隻小貓生三個地方,而且都沒有顧,太奇怪了!阿!動了!沒死,叫了 @@ 還好有看到,不然真的會踩到,沒死也沒我踩死。一樣幫他撿起來,放到那個花圃裡面。希望他媽媽回來會好好照顧。

想了想,回到房間,把阿喵在家裡面的貓飼料通通倒到紙碗裡面,放到花圃的旁邊,這樣貓媽媽就不用因為覓食離開小貓很遠了。通常貓媽媽都會一直顧在小貓旁邊,這次可能是因為為了找東西吃,所以跑到很遠的地方。再確定一次三隻小貓都很正常,就去上班了。

第二天中午

中午的時候,跑去問了在公司旁邊,常去的動物醫院的醫生,說遇到了三隻臍帶連胎盤的小貓。醫生說通常貓媽媽都會在小貓身邊不會離開,如果遇到這種,就是不正常。如果確定貓媽媽不在的話,最好還是送醫院。我問醫生,如果媽媽不在旁邊,一天這樣會活嗎?醫生說如果沒有媽媽在,一天大概就死了,小貓最怕失溫,現在我們人類覺得很熱,但對小貓來說,晚上的溫度還是致命的。我想了想,小貓昨天晚上十二點可能就沒人顧了,到現在白天還好還蠻熱了,但再一個晚上,恐怕真的無法……

第二天下午

下午四點半的時候,實在是擔心阿,請了假就趕快回家,我怕等到六點下班天就涼了。回到家趕快跑去看小貓,發現飼料有被吃過的痕跡,不知道是別的貓吃的,還是貓媽媽吃的,但總之周圍沒有貓媽媽的跡象,這個時候三隻小貓正擠在一起取暖睡覺,樣子好可愛 ^^ 眼睛都沒打開,卻這麼可愛的很安祥的睡。可能是聽到我來了,就醒了,又開始嗚嗚阿阿的哭,也許是餓吧……

彎著腰,看著他們嗚嗚的時候,右邊傳來「哇哇」疑?聽錯了嗎?怎麼會有一聲是從旁邊傳來的?應該是聽錯了,繼續看著眼前的三隻小貓哇哇叫,真的好可愛阿…「哇哇」不對,沒有聽錯,真的是右邊有傳來哇哇聲!沿著聲音過去,又沒聲音了。沿著地上慢慢走,但是沒在地上看到任何東西阿…防火巷裡面因為很陰濕,所以地上某些地方有著厚厚的苔蘚跟泥,就在腳快要踩到的時候,突然有塊苔蘚動了一下 @@ 看到了,是一隻…乳牛貓…第四隻小貓…跟苔蘚混在一起了,胎盤也還在,臍帶跟胎盤,還有貓本身,都跟半乾的苔蘚乾在一起了。天哪,到底在這邊多久了?為什麼媽媽都有回來吃飯了,卻把自己的小孩丟在苔蘚泥巴裡面不管阿…距離早上我把飯放下去都已經好幾個小時了,明明就有回來吃飯,不可能連一隻貓都叼不回吧…可是還是不敢亂撿貓,媽媽照顧一定會比我好多了!把第四隻小貓也撿起來,放到花圃裡。跟他的兄弟姊妹一起取暖,四隻在一起好像很開心 ^^ 還是要再講一次,好可愛阿…而且感覺也很有活力,沒有問題!回公司上班去!

第二天晚上

九點多,下班,回家。第一件事就是衝去防火巷裡面,飼料又少了!有貓吃飼料。小貓還在花圃裡,果然憑他們自己的體型絕對爬不出這麼高的花圃。但媽媽到底去哪了,會不會我進來之前她還在,看到我來才跑掉?摸了摸小貓周圍的地面,冷的。貓媽媽沒有幫他們取暖,小貓的溫度感覺也比下午的時候更冷了一點。我判定媽媽棄養了。打了電話給獸醫,醫生說開到十點,我馬上帶著小貓衝去找獸醫了!途中先去路上買了醫生推薦的 BMR 貓奶粉。

在九點五十分的時候趕到了獸醫院,醫生幫忙看了一下,把第四隻小貓的胎盤跟臍帶剪掉,教我之後要怎麼餵奶粉,教我要怎麼促使小貓排泄。醫生用溼棉花輕輕拍著小貓的下腹部,地一隻小貓完全沒反應。醫生說可能是因為完全沒有進食,所以沒東西可以排泄,然後拍拍第二隻,竟然尿了一滴,但是是血尿…醫生說不確定是因為憋太久還是因為健康已經有問題。醫生把小指放到小貓嘴前,小貓有吸吸的動作,醫生說這樣就會吃奶,就還有機會。叫我要注意保暖的問題,這個天氣對人類可能覺得很熱,但對小貓來說,還是很致命的溫度,小貓很容易就失溫。我問醫生要怎麼保暖,醫生拿了一個電毯給我「我先借你一個,你真的有需要再買…」醫生人超好,哈哈哈,醫生想要找奶瓶給我,但是他的奶瓶已經丟掉了。但已經超過十點了,大部分的寵物店都關門了。醫生跟我說公館的金吉利還開著,我去金吉利買了奶瓶,回到辦公室,想要把小貓養在辦公室,這樣上班時間才有辦法照顧。

回到辦公室,發現 nan 還有 ryan 還在呢!跟 ryan 兩個人用阿喵的外出籠鋪了小貓的床,底下是電毯。然後跟 nan 兩個人開始手忙腳亂的泡奶粉,餵小貓。我嘗試餵,但好像不太成功 Q_Q 後來都是給 nan 餵的,可能 nan 是女生,比較會帶小孩吧,小貓真的有吃喔,喉嚨有做出吞嚥的動作。雖然只吃了一點點,四隻貓好像才吃了幾 cc 吧。然後把小貓放進暖暖的床,四隻就奎在一起睡了,好可愛喔,剛剛還是這麼餓的樣子一直叫的樣子,現在卻是吃飽飽了,然後睡在暖暖的床舖裡面。四隻堆在一起,腹部起伏起伏的,好像很舒服的樣子,摸了一下身體,溫度好像比較好了。就這樣睡了。

十二點多了,我回家,順路把 nan 也送回去。回家洗澡,想說洗完以後再跑來。這樣半夜如果貓貓肚子餓了,叫了,我就可以馬上餵他們吃飯。騎車回去的路上,我一直在想,怪不得有些貓中途,送養貓咪的時候,會對飼主的身份要求這麼多,如果是我這樣捧在手上帶大的,我一定也會希望小貓遇到的主人要對他很好,那是我捧在手心上的寶貝捏!怎麼可以讓人欺負!雖然沒當過父母,不過那瞬間好像可以體會一點點當父母的感覺,好像可以理解,為什麼以前遇過的一個很嚴厲的教授,在當了媽媽以後,整個眼神都改變了,那個當下我覺得我也有改變喔。真的。

回到家起完澡。東摸摸西摸摸,結果 muting 打電話來了,說他到了辦公室,叫我也趕快去吧,他說聽到小貓一直叫,我說應該是因為小貓餓了。我收收東西就出發了,大概快三點的時候到了辦公室。打開小貓的籠子,看他們睡的好靜喔…

太靜了…怎麼沒動…沒有起伏…

血、跟糞便。貓吐血了,也拉肚子。兩隻已經不會動了。還有兩隻,正在很痛苦的呼吸著。為什麼?才不過兩個多小時。怎麼會?剛剛還是吃很飽的,在那邊呼呼大睡,為什麼,我做錯了什麼事情嗎?哪邊出錯了?不懂。

小貓很痛苦,大口的喘著氣,我跟 muting 一人捧著一隻,小貓大口大口的,一口一口的喘氣,呼吸的間隔,越來越長。一開始是一秒一次,幾分鐘以後,變成幾秒一次,幾分鐘以後,變成十秒一次,幾分鐘以後,變成一分鐘一次,然後五分鐘,然後十分鐘。我就捧著他們,等著他們下一次的呼吸。一直等,不知道等了多久,我就接受了,沒有下一次的呼吸了……

實在無法讓 nan 知道小貓死的這麼慘,nan 知道的話一定會哭死的。趁著天亮之前,把小貓的屍體處理掉,奶粉跟奶瓶藏到包包裡。跟 nan 說小貓被當作中途的朋友領走了……

第三天中午

拿著電毯,還有奶粉、奶瓶,去醫生那邊,走進醫院「醫生,這個還你」「用不到了?」「嗯…」「四隻都?」「嗯…」「盡人事了,本來就很難,不要難過,有救有機會」「嗯…」把奶瓶跟奶粉都給了醫生「醫生,這我用不到了,可以給你嗎?」「可以」「如果有人抱著小貓來,那就是有緣,這可以給他們」「嗯…如果有有緣人的話…」

想了想,當初醫生說「我先借你一個,你真的有需要再買…」當時我還聽不懂,為什麼會不需要?當然需要阿,原來是這樣…醫生一定早就知道了吧…

2014年9月7日 星期日

Effective Modern C++ 筆記:Type Deduction 規則

一邊讀《Effective Modern C++》一邊作筆記 = =||
太複雜了,一定會忘記

C++ 總共有三種 Type Deduction

I. template argument deduction


template < typename T >
void f(ParamType param);
f(expr); // 從 expr 推導 T 跟 Param

template argument deduction 有三種 case

1. ParamType 是 pointer 或 ref,但不是 universal ref

  • 如果 expr 是 ref,把 ref 拿掉
  • pattern-match,導出 T 跟 ParamType

2. ParamType 是 universal ref(就是有 && 的形式)

  • 如果 expr 是 lvalue,那 T 跟 ParamType 都導成 lvalue ref
  • 如果 expr 是 rvalue,那就跟平常一樣(平常一樣是啥?)

3. ParamType 不是 pointer 也不是 ref

  • 如果 expr 是 ref,把 ref 拿掉
  • ref 拿掉之後,如果 expr 是 const/volatile,也拿掉
另外,array 跟 function 會退化成 pointer


II.  auto  deduction

跟 template argument deduction 幾乎一樣,除了初始化的時候對待  {...}  不一樣, auto  會把  {...}  推導成  std::initializer_list ,但 template argument 無法推導  {...} 

auto a = {1, 2, 3};  // a 是 std::initializer_list
f({1, 2, 3});        // 編譯失敗,無法推導 T

III.  decltype  deduction

什麼就是什麼

const int a = 7; // decltype(a) 就是 const int
const int& b = a; // decltype(b) 就是 const int&

 decltype  最常用來作的,就是用來傳遞「原原本本的型態」,比方說你有一個 wrapper function,需要 perfect forward,然後 return value 的型別也要一五一十的反應出來,那你的好朋友就是  decltype 。

template < typename F, typename ... Args >
auto func_timer(F&& f, Args&& ... args)
-> decltype(f(std::forward(args)...))
{
    auto begin = time();
    decltype(f(std::forward(args)...)) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

func_timer(foo, 1, 2, 3);

因為  foo  的 return value 有可能是 reference,人家有可能寫

func_timer(foo, 1, 2, 3) = bar;

所以連 referenceness 也要保留,所以要用  decltype 。但那一大長串實在太麻煩,所以 C++14 提供  decltype(auto) ,讓你可以簡單

template < typename F, typename ... Args >
decltype(auto) func_timer(F&& f, Args&& ... args) {
    auto begin = time();
    decltype(auto) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

喔,使用  decltype(auto)  的時候還有一個特例要記住。 decltype(auto)  有兩條規則:
1. 如果遇到單單一個 name 的 lvalue expression, decltype(auto)  就是那個 name 的型別
2. 如果不是單單一個 name 的 lvalue expression, decltype(auto)  帶有 ref

decltype(auto) f1() {
    int x = 0;
    return x;     // decltype(auto) 是 int,所以 f() 也是 int
}

decltype(auto) f1() {
    int x = 0;
    return (x);   // decltype(auto) 是 int&,所以 f() 也是 int&
}

2014/09/09 更新


因為有讀書有學到新東西,又感覺已經很久沒寫一些比較深的 C++ 了,所以中秋節剛好來自幹一個 variant (github repo)。

2014年8月26日 星期二

我是「媽寶級白目」

突然發現自己不知道從什麼時候開始,
已經變成所謂一直發政治文的「政治魔人」了……

還記得以前覺得政治很無聊、很髒、不該碰……
覺得會去看政論節目的人腦袋都有問題……

從學校畢業以後進入業界,
然後發現這個業界有著很病態的超時工作文化,
雖然我自己沒遭到壓榨,但我開始注意勞工權益,
參加了電子電機資訊工會,然後開始慢慢了解「爭取」是什麼。

然後第一次去了抗議現場,
發現即使我們工會人不多,
但每次活動總有很多其他的社運團體會來支援我們。

然後第一次去了遊行活動,
然後才知道原來早就有很多人已經在街頭上努力了這麼久,
然後知道我們也應該在別的活動去支援別人。
然後知道在這個支援別人的過程,
我們也了解了別人所面臨的,別的社會議題。

然後慢慢知道了一些歷史課本不會寫的東西,
然後慢慢知道了一些新聞媒體不會報的東西,
然後真正體會了當初曾華璧老師在課堂上講的東西。
然後突然之間,那是一個相變的過程,很快速,
我的想法在很短的時間裡面蛻變的很快。
我想那也許就是「公民覺醒」。

我還記得以前有一次看到李敖在電視上說:

  一個真正民主的國家,投票率不會太高,
  如果投票率很高,代表政治對人民生活的影響非常大,
  『我支持的候選人沒上,我要去自殺!』這是不對的!
  民主社會的話,誰當選,對百姓的生活都不應該差太多,
  如果一個社會裡面『誰當選』差很多的話,
  那這個社會就不民主。

當時我的想法是:

  說的真好,那些對政治很投入的人真是白痴,
  台灣就是因為有你們這些人,才顯得台灣不民主。

現在想想當時真是愚蠢的不可思議。
不是因為他們的投入,才顯得台灣的不民主,
而是因為台灣不民主,害得他們不得不投入。

想到讀 Game Theory 講選舉的時候,裡面提到兩種模型,
一種是候選人可以選擇要提出什麼政見的模型,
一種是候選人無法選擇要提出什麼政見的模型。
第二種是因為政見不一定會履行,候選人完全可以胡說亂騙,
所以他的政見應該是他過去作了什麼,不是現在說了什麼。
而理智的公民是有記憶的,我們會記得你過去的為人處事,
所以實際上,候選人無須提出政見,
我們看你過去作了什麼,就知道你未來想幹麻。

兩種模型當然都跟現實有些距離,但還是很有啟發性,
特別是第二種,實質是遠比第一種好的多,
現實若偏向第一種,代表選民都是健忘的,
現實若偏向第二種,而候選人就無法欺瞞選民。
但要作到第二種的前提,是選民必須要長期的關注政治,
知道那些人到底在幹麻,而不是等到快要選舉的時候,
才看看選舉公報、甚至不看選舉公報就投票了。

如果是這種狀況,
那那些選民不過就是四年投一次票政治植物人罷了,
他們根本不會思考,也沒有記憶,
他們有民主的權利,卻沒有民主的能力。
他們胡亂的投票,結果卻是大家一起背負的。
讓所有人一起承擔選出惡劣候選人的責任。

這是不對的。

所以,如果你有投票權,
那麼,關注政治,就是你的社會責任。
因為你的那一票會影響別人,
放空亂投,是讓別人在背負你本來應該背負的責任。

請面對這個事實:「台灣,不是一個民主國家」,
選錯人,很嚴重,請關注政治,負起你的社會責任。

「太辛苦了,而且很沈重」你說

所以大家要看我的臉書。

每天都有又酸、又靠北、又北七的苦中作樂政治文,
把沈重跟嚴肅寄託在低能跟歡樂當中,
我發現我的文章越來越像國寶級白目了,
我真的有夠白目,不過我不到國寶等級,那就媽寶好了,
以後請大家叫我「媽寶級白目」。

2014年5月2日 星期五

幫 BBS client 加上黑名單的功能

一開始嘗試從 PCMan 下手去改,但遇到幾個問題:
  1. PCMan 要 MFC,MFC 要錢,我沒有 MFC
  2. PCMan 的 code 有點難懂,看不懂很懂 Q_Q
  3. PCMan 只能在 windows 上面
於是放棄。

接著嘗試 PCManX,但發現 windows 上面要跑 GTK+ 也有點麻煩 >"<~
放棄。

然後嘗試自己從頭手動打造,為了跨平台,決定用 Qt,就開始動手,寫著寫著,突然想到「不對,應該有人作過同樣的事情…」於是再繼續 survey,發現果然有個叫做 Qelly 的 telnet client,看了一下 code,用 Qt,有 open source 放在 github 上面!程式碼品質也不錯,似乎不難修改。於是就開始動手 :P

弄了 24 小時以後,有一點初步的結果 XD

目前可以在「文章選單」跟「串接」的時候把特定作者的文章抹黑,但「文章內容」還沒辦法過濾,這樣就沒辦法在用 =, [, ] 瀏覽文章的時候時候過濾文章。希望這個週末可以完成

2014年3月19日 星期三

3/18深夜 ~ 3/19早晨服貿立法院公民運動第一線經歷

3/18 夜晚,已經要上床睡覺了,收到朋友的消息說立法院有事。上網看了一下,氣到睡不著,3/19 一點半,決定衝去現場。

零、地圖

一、初到現場,濟南路

停好車,走了一段路,聽到有人在喊話,我猜是現場,走過去,看到很多人。坐下來聽了快半個小時,不知道自己來幹嘛的,就有點想要走了,因為還要上班。這時候突然聽到募集「要找五十個人去青島東路支援」。我想說好吧,好歹有個目標,就趕快舉手跑去,結果發現帶隊的人是黃國昌耶!我因為跑很快,所以就在他正後方,一直跟著他走,聽他聲音,他嗓子已經完全啞了。

二、主戰場,青島東路

到了之後,發現很多人都在馬路上坐著,一樣是聽講話,聽聽聽聽聽聽聽,過程一直強調「警察不動,我們不動」但警察如果動了,我們就會行動,一直聽,聽了差不多一兩個小時,快四點吧,一直被蚊子咬,我又想要回家了,就一邊按耐住蚊子咬,一邊睡覺,睡著睡著……突然聽到「警察攻堅了!」

「警察不動,我們不動!現在警察動了,我們要不要去救我們的夥伴?」
「要!」
「好,大家翻過去。」

幹!頓時睡意全消!包包往背上一甩,三兩步就跳上去,因為我的位置就在牆邊,翻牆進去的很早,一下就衝到最前線!被警察擋住,但警察因為被我們衝,所以也放棄攻堅了,我們就 hold 住。 但這個時候還沒衝到樓梯上。樓梯是警察的地盤。樓梯下面被警察團團圍住。就坐下來開始睡覺,這個時候已經不想走了,決定呆到天亮。

睡著睡著,又聽到「警察拖人了!」

看過去,從窗戶看到裡面警察正在拖人,一個小女生被一群警察抓住!動作很大,他媽的很粗暴,而且因為就在窗邊,看得很清楚,女生往窗戶邊掙扎,一直想要掙脫,但是被警察抓住!這時候窗戶邊的民眾衝上去也把警察抓住!兩邊拉扯很久!現場超級火爆的!非常吵鬧!那時候所有的聲音都混在一起!不時可以聽到「警察打人了!!」然後就會聽到更多的怒吼聲,非常可怕。透過窗戶可以看到裡面的警察不時有拖人的動作,好幾個人被抓。

後來警察又幹了一件很蠢的事「把窗簾拉上」才拉一半,就被人發現

「警察拉窗簾!!」
「拉個屁阿!怕人看嗎!!」

結果警察也隔著窗戶跟民眾對罵!立刻有人衝上去把窗簾抓住,不讓警察關上,警察也把窗簾抓住!結果整條窗簾被扯下來,看光光了。

結果過沒多久,警察又攻堅了,幹!馬上爬起來!衝!警察被沖退!退到門口裡面樓梯被我們攻下來了,但進不了門。

這時候開始就隨時都很緊張,根本無法休息,警察一直有動作,一直有動作,每次警察有動作,我們就往裡面擠,但裡面警察密度太高,根本擠不進去

突然有人喊「把警察拉出來」
警察一聽到這句,立馬有反應「敢拉警察!我就抓人!」
看樣子警察真的會怕拉,不怕推。

但說要抓人這句,有嚇到人,嚇到大概安靜了一秒鐘吧

「抓就抓阿!」
「抓我阿!」
「抓我!我第一個!」
「我第一個!」
「把警察拉出來!!!!!!!!!」

大家衝上去拉了,天哪…門口那個警察一看,靠北,這些人不怕!立馬兩手兩腳撐住門框,結果大家就開始拉警察!警察後面兩個人抱住他,兩個人後面又好幾個抱住他們,就像是一串葡萄,然後你摘最下面的那一顆。

「拉!拉!拉!」結果就拉出一顆警察,然後警察就被接力的拖出去,就像滑板一路滑出去一樣。一片混亂當中還有人偷打警察,結果偷打警察的人也立馬被旁邊的人打! 「打什麼警察阿!人民是警察的保母!」

最後發現不管推拉都沒用,太難把警察清除了。且那時候警察已經停止攻堅了,黃國昌就叫大家冷靜,休息。

以上這樣衝突、休息重複了好幾次。不知不覺竟然已經七八點了。

黃國昌老師現場開了記者會,描述了訴求:

  1. 馬英九道歉、江宜樺下台
  2. 服貿退回
  3. 警察撤出立法院

三、中山南路,立法院正門口

然後我就離開準備去洗澡上班了,從青島東路,經過中山南路,準備要去牽車的時候,經過立法院大門口,看到門口也有警察跟民眾對峙。警察在立法院門口裡面,民眾在外面,看起來沒什麼事,很和平 我就繼續往前走,走過去之後,突然聽到很大聲的騷動。轉頭一看!幹!警察衝出來了!!好多!!好多!!!!!!!!兩群人直接衝撞在一起!!!!!!!

媽啦!衝上去再說!就跟拿盾牌的警察在那邊對衝!擠在第一排!死命的推!!!幹!可是警察人真的超多,力氣真的超大的!!被推的一直後推!我面前那個拿盾牌的,是一個蠻年輕的警察,臉色感覺已經很差了。我不管怎麼推都推不動,突然想到剛剛「用推的沒用」我就抓住他的盾牌,有幾個人也跟著我抓盾牌!那警察瞬間暴怒!整個眼神馬上改變,動作超大的!整個就是真的殺紅眼的眼神!抓住盾牌就大力往眼前的民眾身上揮,差點打到一個媽媽!我一看,他媽的!

我操你媽的你在幹嘛阿?你他媽的真的殺紅眼了阿?!
幹!你演演戲也就算了,你現在是他媽的真的要打人阿?!
你現在到底在幹嘛!?你在幹嘛!?你知不知道自己在幹嘛?!

我把他盾牌剝開,衝到他面前,只著他一直罵,罵到他好像有點龜了……
盾牌放下了……然後我們就衝上去繼續抓他的盾牌 = =

另外一個警察,盾牌一被另外一個人抓,立馬就「不准抓我的盾牌」超兇的!我一看到,就跑過去「怎樣!抓我逆?」然後就一起搶他盾牌,但都沒搶到 = =

後來持續對衝了幾分鐘以後,雙腳快軟掉了,我就想說「幹,我要回家洗澡上班了」就轉身離開。

才一轉身,手就被抓住,轉身一看,是一個女生,因為氣力放盡,累到臉都扭曲了。
一手推著警察的盾牌,一手抓住我:「你是男生…力氣大…」

……………幹!!!!!!!
只好轉過身再衝!!!!!!
又衝了不知道多久,警察停止推進了,我猜我的臉也跟女生剛剛一樣扭曲

終於可以回家了,結果忘記車停在哪,找了十五分鐘才找到,腳都快走不動了。

強烈建議大家一定要站到第一排搖滾區,體驗一下

感想

沒寫到感想?感想就是很想哭。

現場絕大部分的時間都很和平,但偶而會有非常火爆的場面出現。每次發生推擠的時候,我都很想哭,很生氣,氣為什麼同樣都是老百姓,卻要站在陣線的兩邊。

可以的話,民眾也想在這個時間躲在棉被裡面睡覺,而不是衝到這個地方,用盡全力的跟本來應該是保護自己的警察對峙跟衝撞。

可以的話,警察也想躲在家裡面睡覺,陪伴老婆跟孩子,而不是在死命的去把正在行使公民義務的學生拉出來,但又害怕傷害到任何人,而且如果被打還不能還手。

而真正該為這些事情負責的人,卻躲在棉被裡面睡覺,睡得很開心。

但為什麼民眾還是要站出去,因為如果我們不站出去,那些人永遠都可以作他們想做的事情且不用付出任何代價

2013年8月17日 星期六

最近浪費很多時間打魔力寶貝 = =||

最近又跑回去玩魔力寶貝

因為很懶惰,所以不想自己練等級等技能,就寫了 bot,讓 bot 自己練等級、戰鬥技能、採集材料、製作裝備跟料理、打魔石賣 npc 賺錢等等。

單一 bot


我發現有 bot 以後,遊戲變得好玩多了(不要戰我 XD)我下午把 bot 開好,人跑出去找未來的配偶欄約會,晚上回到家以後,錢多了十幾萬,就可以拿去買裝備、料理、藥水。然後就可以出任務去打魔王了,遊戲真好玩阿(好像有點諷刺?)

一開始我的 bot 只能自己一個人活動,沒辦法組隊,但是魔力寶貝不組隊,能去的地方就很有限,因為比方說 50 級的人物,不組隊的話,一個人頂多走到怪物等級平均 30 的地方,再上去就沒辦法了,會死。但 50 級的人物打 30 的怪物,其實幾乎沒有什麼經驗值,而且 30 的地方,收入也很有限。講有限其實也不對,因為他全自動,我去睡覺十個小時,他就打了十個小時,每小時的收入雖然低,但重點是「持續不斷」,後來我發現這「持續不斷」是很恐怖的事情,因為不管你在睡覺還是在上班,他都在賺錢。基本上賺錢的速度是超過花錢的速度的,沒幾天,我的金錢就到達單一人物的上限了,開始放到別人的身上去。

三隻 bot 組隊

錢可以一直增加,但等級還是原地踏步。

接下來我嘗試改進 bot,希望我的 bot 可以彼此溝通,可以組隊。這個開發的過程,當初在交大修的「分散式演算法」在這邊…完全沒有派上用場!因為即使多隻 bot,也都還是跑在同一台電腦上,架構很簡單,並不是分散式系統。我有一隻中央的 Mastermind 監控所有人活動的,由他統一規劃協調所有人的動作。經過一陣子的開發以後,我可以成功組隊,協同動作了。現在 50 級的人物,三隻組隊,我可以去到有 4x 級怪物的地方練等級。

為什麼三隻?因為遊戲限制了多重開啟遊戲的上限,就是三個。

但遊戲內容的設計,一個隊伍最多五個人,也就是說,如果你能五個人組隊,基本上,遊戲內所有的場景你都可以去了。因為他的難度不會設計成五個人都還沒辦法打。那限制你只能三開,你就只能某個程度的「自己玩自己」,因為凡是重要的任務,沒有五個人是沒辦法解的。這樣就強迫你跟別人互動了,個人認為這是很正確的設計,線上遊戲就是要跟別人一起玩嘛(最早只能一開,強迫你要跟另外四個人互動 XD)。

五隻 bot 組隊


問題是我是 bot,我沒辦法跟別人互動。所以凡是重要的任務我都不能解 XD

而且只有三個人的話,能去的地方還是比較受限,只能挑怪物等級稍低的地方,等級經驗值的提昇還是很慢的,但想要突破這點的話,接下來就真的要靠破解的了。

執行檔 instance 三開上限


首先,我發現他開第四隻程式的時候,會跳出一個對話框


經過在強者雲集的 plurk 上面請教以後,決定使用有免費版本的 OllyDbg 來進行破解的動作。雖然還有更強的 debugger,但要收錢,因為我沒有錢,所以我決定暫時先尊重一下智慧財產權。使用 OllyDbg 執行遊戲主程式,當然,馬上就跳出了上面這個對話框。回到 OllyDbg 的視窗,按下快速鍵  F12 ,中斷遊戲的執行。然後看看 call stack。根據我的想像,遊戲的程式碼應該是有一段類似這樣的

if(check_exceed_multi_inst_limit()) {
    MessageBox("已經達到最高限制多開數");
}

這個時候,CPU 會執行到 MessageBox 這個 system api 裡面,然後在裡面等待,理論上,我只要往 call stack 往上走幾步,應該就可以看到條件判斷的地方。於是我在 OllyDbg 裡面按下  ALT-K  叫出 call stack 視窗。看到如下


看到  [Called from]  那欄,可以看得出來,灰色那條,還屬於遊戲的部份,再追進去就是 system api 的部份了,於是我就雙點灰色 Called from 那欄,程式跳到了呼叫 MessageBox 的地方。




我已經加上註解了,可以看到呼叫檢查函數的地方,還有 if 的點, JE  就是 jump if equal,如果成立的話,就會跳過 MessageBox() 的部份,所以我猜我要改的就是他,把他從  JE  改成  JMP ,無條件跳躍。雙點那段程式碼 OllyDbg 就會跳出組譯視窗,讓你修改那段組合語言。


改成


然後把改過的東西存起來



然後再執行一次程式!成功了!這個對話框不再出現了!但下一個跳出來!


可惡,不知道他是怎麼曉得我沒有透過領航員執行程式的,不管,照剛剛的方法繼續破解他,成功破除了這個檢查,這邊不寫細節了,因為這個方法是錯的。程式之後繼續跑,跑到一半會說找不到檔案,然後 segfault。我猜想可能是領航員有 pass 某些參數給遊戲主程式。但如果用滑鼠雙點遊戲主程式就拿不到這些參數,所以無法執行。但我要怎麼知道他下了什麼參數?

我寫了一隻程式,來取代遊戲主程式,他什麼都不作,只會把收到的參數印出來。

#include
#include

int main(int argc, char* argv[])
{
    std::ofstream fout("args.txt");
    fout << argc << std::endl;
    for(int i = 0; i < argc; ++i) fout << argv[i] << std::endl;
}


抽換遊戲主程式以後,使用領航員執行遊戲,發現竟然無法執行!天哪,人間慘事。原來領航員會去檢查主程式的 hash code,我測了一下,發現他用的是 md5,但是 hash code 是當下從網路上下載的,而且也會檢查領航員自己的 hash,這樣麻煩了,即使我竄改了主程式,我也無法透過領航員執行他,除非……我破解領航員檢查 hash code 的機制……

接下來這邊真的是很恐怖的組合語言追蹤地獄,我已經不想再重複一次了,直接點重點,破解最重要的就是抓到關鍵的中斷點,不然程式這麼大,你不可能慢慢追。我花了很多時間,發現他是把 md5 下載存到一個檔案裡面,但這個檔案一瞬間就會被砍掉,我想了想,應該要把中斷點下在「建立檔案」的時候,就可以抓到他寫檔的那瞬間,然後看看檔案內容是什麼。

按下  ALT-E  可以看到所有使用到的 module,選擇遊戲的主程式


然後列出所有「跨模組的函數呼叫」


我們要找 CreateFile 這個 api,打上中斷點。



稍微跑幾步,讓她把檔案寫好,然後打開檔案來看,發現格式竟然是 INI,太好了,這是一個很大的提示,因為 Windows 有現成的 api 讀取 INI 格式,叫做 GetPrivateProfileXXX()。馬上在 inter-modular-call 裡面找到  GetPrivateProfileString()  這個人,對他打中斷點,然後接下來就是無盡的追蹤地獄,最後終於成功找到三個關鍵點,統統改成 JMP。細節不詳述。




現在終於可以成功的跳過 md5 的檢查,順利執行第四個 instance,來登入遊戲!

「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「……………………」

我太天真了,他在 server 端有作檢查!

一旦發現來自你這台電腦的連線數目超過三個,就不讓你登入。

該死,server 是檢查連線來自的 ip 嗎?那我要怎麼生出白花花的 ip?就算我能用別的電腦生出別的 ip,而且一旦跨 ip,就是跨電腦,我就沒辦法讓我的 bot 都跑在同一台機器上,那 bot 的協同部份就必須要加上網路部份的程式碼,複雜度瞬間高很多。

跟強者我同事 runastorm 討教過後,決定寫一隻 proxy,架在另外一台電腦上,然後遊戲主程式的封包都走這個 proxy,這樣 server 端看到的來源,就是另外一台電腦,也就是 proxy 的 ip。survey 了一下,用 python 寫出一個簡單的 proxy。

接下來的是要作三件事情:
  1. 要知道 server 的 ip 到底是多少,這樣 proxy 才能連過去。我使用  netstat -n -b  以後,順利看到 server 的 ip。
  2. 要竄改主程式,讓他連到我跑 proxy 的主機去。
  3. 要一個 dispatcher 在前端,當 instance 只有三個的時候,使用本來的執行檔,超過三個時候,使用竄改過 server 位置的執行檔。
以上三件事情都不困難,我花了點時間分析到怎麼改他連線的位置。成功,執行第四個 instance!

「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」
「連線失敗。」

可惡阿!竟然不是看 ip!

浪費我好多時間,可惡,到底看什麼?如果不是看「連線的ip」,難道是遊戲主程式在執行以後,還有把自己的 ip 送過去?server 看的是連線以後送去的資料裡面的嗎?是的話我就完了,因為遊戲封包有加密,我死定了,我試過很多次了,但無法看出他加密的規則,更別說要破解了。看了一下 proxy 的 log,確定連線有成功,來往兩個封包以後連線就被切斷了。看樣子的確是這幾個封包裡面有送資料,檢查不過以後才斷線。但就像剛剛講的,我破不了加密,如果能破的話,我就可以解開,竄改封包,然後再送,但破不了,就沒辦法。

怎麼辦…

釜底抽薪

既然無法竄改已經加密的封包,我竄改還沒加密的總可以吧!遊戲主程式要得到自己的 ip 一定也要呼叫一些系統 api,但不知道是哪個呢?突然想起來!當初在追蹤遊戲主程式的時候,曾經看到他的字串表裡面有一個  "ipconfig /all > mac.txt"  ,哈!九成是用 ipconfig 拿 MAC 碼,而且我發現他還是透過 system() 這個函數來呼叫 shell。這樣的話,裡論上我只要抽掉這個文字檔就可以了。

一樣,使用中斷點,把 system() 打住,偷看一下 mac.txt 檔案內容,確定如我所想,裡面只是很單純的 ipconfig /all 的輸出,偷偷把 MAC 的地方改掉幾個字,存檔。

開啟第四個 instance……
登入……

「請選擇角色」


孝心感動天!!!!!!!

成果來一張



五個視窗,關鍵資訊都馬賽克掉了 ^O^

終於,可以來擴充我 bot 組隊的 script 了 :D

架站的看到不要擋我阿,我只有自己用 Q_Q