tag:blogger.com,1999:blog-84615494828614418012024-03-10T09:38:37.659-07:00過去左手程式右手詩?蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.comBlogger84125tag:blogger.com,1999:blog-8461549482861441801.post-72566612427854663802024-03-10T08:50:00.000-07:002024-03-10T09:38:05.319-07:00獵殺反社會<p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">夢的一開始,我在一輛特種部隊出動的車上,全副武裝。車子正在前往目的地,說收到線報,發現了一個 sociopath(反社會人格)家庭,我們要去撲殺他們。車上應該有四個人吧我也不確定。在夢裡面,sociopath 是爸媽有小孩一定有的 100% 遺傳。毫無同情心也不會有罪惡感,看起來跟人類一樣,但是為了自身利益就會隨便殺人,智商非常高,所以會很乾淨的清理犯罪現場,連屍體都清理的很乾淨,大多沒留下什麼東西。根本抓不到。而且看起來很正常人一樣,行為也精明,非常難抓。我們 team 就是政府成立其中一個負責撲殺 sociopath 的特種部隊。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">到了目的地以後,我們翹鎖,然後衝進去,看到一個老奶奶,跟一個大概國小年紀小男孩。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">跟一般被攻堅的家庭不同,這兩個人異常淡定。一般他們發現被攻堅以後,就會逃跑,但這兩個人動都沒動,老奶奶還是繼續坐著看電視,小男孩則是冷靜的看著我們。因為沒有逃,所以我們就沒有像平常那樣開槍射殺。小夥伴們上前去把老奶奶痛歐到地上,上銬以後,兩個把老奶奶先抓回總部了。剩下我跟另外一個小夥伴,還有小男孩,在 sociopath 的巢穴埋伏,等待祖孫三代的中間那一代回來,因為顯然爸爸或是媽媽應該是去上班了。留下了奶奶跟小孩在家裡。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">等待的時候,我跟小夥伴就在觀察他們家,看起來跟一般的巢穴很類似,就是跟普通人的家庭根本沒兩樣。這也是過往我心裡一直有點疑惑,就是 sociopath 真的跟我們不一樣嗎?我知道他們不一樣,但有害嗎?我們沒有見過他們殺人,而且以前我們獵殺他們的時候,他們的反應也跟正常人一樣,會驚慌失措、會害怕,求我們別殺他們,哭喊著說他們不是 sociopath 只是正常人,叫我們別開槍(但我們當然還是會突突突突的把他們通通射死,畢竟 sociopath 雖然沒有感情不會害怕,但他們很會裝)這個房子看起來也就像是普通人的房子。唯一不正常的,就是今天的老奶奶跟小男孩,太冷靜了。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">因為距離一般人的下班時間還很久,所以我們就審訊小男孩,跟在房子裡搜查,東看看西看看看看能不能發現什麼東西,跟我一起留下來的小夥伴,也是跟我感情最好的同事,他很強,搜查很順利,他一下就找到了一本奇怪的通訊錄,感覺可能是其他 sociopath 的聯絡方法。我們打算事情結束以後帶回總部。搜查完以後我們就開始審訊小男孩,但他幾乎什麼都不說。因為反正他最後一定會死,所以我們都很不介意用毆打跟恐嚇的方法讓他開口,他嘴也沒這麼硬,就是真的我們快要開槍殺他的時候,他就會透漏一些訊息給我們。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">在等待的這幾個小時當中,我越來越有一種違和感。這個小孩對我們的行為準則太熟了,他知道自己再不開口就會死,也知道開口給我們資訊就可以換時間。特別是這點讓超級疑惑。還有那個小男孩看我跟看我小夥伴的眼神有點不一樣,他看我有敵意,他看我小夥伴就沒有敵意。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">我想著想著,想到我的小夥伴感覺對這棟屋子也太熟了,廁所跟水在哪裡都知道,又想到為什麼我們一進屋子的時候,老奶奶跟小孩這麼淡定,他們顯然知道我們是幹嘛的也知道不要逃跑就不會開槍……不會吧……我慢慢往右轉頭,看著我的小夥伴,發現小夥伴也看著我,整個夢最恐怖的就是接下來的幾秒之間,我心裡想「他在觀察我,我現在是什麼眼神?我裝不知道的話是不是就沒事了,他在看我,幹我好害怕,幹我好害怕,我好害怕我好害怕完了我現在害怕一定寫在臉上了幹他的眼神變了幹他已經發現我發現了我現在假裝沒發現還來得及嗎怎麼辦怎麼辦已經來不及了就算我現在假裝沒事表情的變化本身就是一種透漏我發現了」</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">小夥伴露出跟往常一樣親切的微笑,說「我真心希望你沒發現,只能怪你太聰明了」</span></p>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-23577944887261544422024-03-09T07:46:00.000-08:002024-03-10T09:37:46.446-07:00隔壁考古系<p> <span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">奇群一夥人不知道為啥在一個巨大的校園。雖然是高中,但整個腹地是大學規模,甚至還佔據一整片山頭的那種。校園大到,後山還有古文明遺跡。學校的考古系就在那邊挖,我也不知道為什麼高中會有考古系,反正夢境裡面大家都是高中生,但是學制像是大學。學校還有自己的軍隊。不是那種大頭兵部隊,而是特種部隊那種。軍隊的工作之一就是防止盜墓者。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">我們不是考古系的,我們是什麼人工智慧系的,說是學生,但平常做的事情根本就是新創開發東西。然後考古系在我們同棟大樓隔壁。大樓類似 L 形,所以我們可以透過窗戶看到考古系,考古系也可以看到我們,然後平常我們也會透過窗戶在那邊互嘴,就很歡樂這樣。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">然後學校從遙遠的深山原始森林裡,連馬路都沒有的那一種,整個都像是熱帶雨林,挖到了古墓,把裡面的一個遺體搬到了考古系,由考古系跟軍隊護送,搬回了考古系,清理研究。這次他們挖到東西,我們也有去看,服裝看起來有點像是中國古代形式的,就覺得幹好酷,我們還在那邊說「乾該不會屍變吧哈哈哈」。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">然後我們就回自己系上,到了晚上大家還在加班(?),然後隔壁系也有一些人在加班,包含特種部隊也有人在值班,因為怕有人來偷遺體,考古系的東西都還蠻有價值的,所以他們如果系上有東西的時候,特種部隊都會常駐。我們就在這邊看著斜外面燈也亮著感覺就有人陪,不孤單大家就工作到很晚。然後中場休息的時候,我們又一如往常的,隔著窗戶在那邊互嘴,我們這邊幾個人,他們那邊幾個人,都趴在窗戶邊對著外面,然後突然我們看到他們後面有個人影。因為有點距離,又有點被窗戶第一排的人遮住,看不是很清楚,但看起來不像是我們認識的考古系的同學。只看到他往窗邊走。移動的方式很詭異,不像是走路,也不是跳,也不是飄,而是帶著一種笨重感的平移,還伴隨著一些抽動跟振動。就像是履帶有問題的坦克。然後那個人影移動到窗戶邊一個人後面,那個人就突然被往後抓,一聲都來不及出,然後被咬死了。其他人都還沒發現。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">但我們這邊看得很清楚,很清楚,但因為畫面太意外了,我們還在想「啥?」然後又一個人被咬死了,我們就開始大喊,也不知道要喊什麼,因為想不出合適的詞語,要精簡說明整個狀況太難了「你們帶回來的屍體變成殭屍了已經咬死了兩個人阿就在你們後面你們快點逃阿」這樣根本太慢了,結果變成只能尖叫跟指著他們身後,他們終於轉頭了,然後看得出來,他們也傻了。這個時候我們已經聽到槍聲了,感覺是特種部隊的人開槍了。但看起來沒有什麼用。過沒多久,那邊的人就全死光了。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">然後殭屍就站在窗戶邊看著我們。一動也不動。乾那個眼睛好恐怖。根本不是人。</span></p><p><span style="background-color: white; color: #1d1c1d; font-family: Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 15px; font-variant-ligatures: common-ligatures;">我們真的嚇爛了。當時我們真的超害怕他從窗戶直接跳過來的。我們也不敢動,我們怕一動,刺激到它,它就跳過來。然後等了很久,它就往門口的方向移動,因為太害怕了,我們就盯著它看,看了幾秒才反應過來,幹!!!它門打開,走廊過來就是我們辦公室了,我們估計等我們跑到門口,其實它也應該到門口了。感覺就是跑不掉了。它如果真的是跳過來,我們還可以往走廊跑,但它從走廊過來,我們就只能往窗戶跳了,幹幹幹幹幹!是有機會可以跳到考古系,但只有最接近角落的那個窗戶跟對面夠近,絕對不夠時間所有人都逃命,太害怕了,就嚇醒了。</span></p>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-62373439956666260992022-03-14T20:04:00.004-07:002022-03-15T01:15:50.341-07:00Ethen 的心理史學<p><span style="background-color: white;"> <span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">昨天做了一個怪夢。</span></span></p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">夢裡面 ethen 不知為啥搬到我家樓下二樓住。然後因為已經財務自由,所以也不用工作了,每天躲在家裡不知道在幹嘛。除了 Under Eats 以外基本沒有什麼外界交流。有時候我會去樓下看看阿喵喇喇賽之類的。突然有一天 ethen 衝上來找我,披頭散髮的,跟我說「我在心理史學上獲得了突破性的進展,這可以改變人類的歷史……哈里謝頓說,一個人類個體的行為不可預測,但是一整群人類的行為,就像氣體分子動力論描述的氣體一樣,是高度可預測的。但事實上『一個人類,一個氣體分子,一群人類,一群氣體分子』這個類比不完全正確,因為單一一個人類不太可預測,但是單一一顆氣體分子的行為是高度可預測的。」</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">我:「喔幹!一顆氣體分子可預測,一大群氣體分子也可以預測,真正不可預測的,是半多不少,中規模尺度氣體分子啊!因為他是一個複雜系統,在秩序跟混沌的邊緣!」</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">「對!所以,一個人類個體,其實不能被類比到一顆氣體分子,而是一群中尺度的氣體分子,因為人類本來就是一個複雜系統,行為也不像氣體分子這麼單純。如果一個人就是一團中尺度氣體分子,這代表⋯⋯」</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">「這代表⋯⋯天哪」</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">「對,我可以大幅降低可預測群體的人數理論下限。」</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">後來 ethen 又龜回二樓去了。繼續深居簡出,接下來兩個月的時間,我完全沒有任何 ethen 的消息,彷彿他消失了一樣。然後科學界出了一條大新聞「中尺度人群的可預測性」的論文被匿名發布了,所有人都在討論,說這是繼哈里謝頓之後最偉大的突破,人類的歷史將會被改寫之類的。大家都在找這個人是誰。我知道 ethen 把他的發現寫成論文了。然後 ethen 突然傳訊息給我,說明天金曲獎頒獎,他要邀請朋友一起來家裡看金曲獎頒獎,可能會很吵,不如我也下樓去一起看吧,一起吵就不會被吵了。</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">隔天傍晚開始就一堆人進入我家這棟,我時間快到之前也下樓去了,不知道為啥我家的房子變超大,十幾坪的房子進去以後竟然是一個類似兩廳音樂會的現場,一個階梯大會場,也太多人了,大概 800 1000 人之類的吧,幾乎所有的人我都不認識 = =|| 台上還有很多人正在玩著樂器,感覺是 ethen 的音樂好朋友,我看這根本不是看金曲獎,是金曲獎本身吧,然後時間快要到之前,有個類似主持人的,我猜也是 ethen 朋友,就說「現在要請主人 ethen 上台講話」,大家就「喔喔喔喔」但是結果 ethen 沒有上台,整個家裡不管怎麼找,都找不到 ethen。但是在一個地方的地上看到一大灘血跡,還有很多凌亂的痕跡,感覺是有什麼爭執發生,後來警察來了,現場 800 多個人裡面還有人是偵探的,總之最後結論是「這個失血量,人絕對死了」,最後 DNA 驗出來這些血也是 ethen 的,但是因為沒有找到屍體,總之法律上以失蹤為結論,但事實上大家都認為 ethen 死了。</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">我就把阿喵帶回家養了,還好現在我都整天在家,可以照顧阿喵。</span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span style="background-color: white;"><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">結果過了一陣子我在家裡餵貓的時候,ethen 突然出現,我「</span><span class="c-emoji c-emoji__medium c-emoji--inline" data-qa="emoji" data-sk="tooltip_parent" delay="300" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="align-items: center; box-sizing: inherit; color: #1d1c1d; display: inline-flex; font-size: 15px; font-variant-ligatures: common-ligatures; height: auto; object-fit: contain; overflow: visible; position: relative; vertical-align: top; width: 22px;"><img alt=":ppp:" aria-label="ppp emoji" data-stringify-emoji=":ppp:" data-stringify-type="emoji" src="https://emoji.slack-edge.com/T0BUT5MJT/ppp/2a3dd5ba642ff09a.png" style="box-sizing: inherit; height: 22px; margin-top: -11px; object-fit: contain; overflow: hidden; position: absolute; top: 11px; width: 22px;" /></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;"> 哪齣」「政府要抓我,我只好詐死 XD」「為啥要抓你?」「中尺度人群可預測,就代表中尺度人群可操弄,包含軍隊,企業,選民,都在這個規模,影響太大」「那天金曲獎是怎回事?」「800 個人是達成相信我已死的理論下限,再少就沒有足夠的群體動力讓你們互相從眾相信我真的死了,如果只有兩個人,那當中只要有一個人懷疑我裝死,那就是 50% 的人懷疑我裝死,但 800 個人的話,開根號以後只要不到 30 個人懷疑,我就很安全,那份名單我是挑過的,沒這麼多聰明人 XD」「我也沒懷疑 </span><span class="c-emoji c-emoji__medium c-emoji--inline" data-qa="emoji" data-sk="tooltip_parent" delay="300" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="align-items: center; box-sizing: inherit; color: #1d1c1d; display: inline-flex; font-size: 15px; font-variant-ligatures: common-ligatures; height: auto; object-fit: contain; overflow: visible; position: relative; vertical-align: top; width: 22px;"><img alt=":ppp:" aria-label="ppp emoji" data-stringify-emoji=":ppp:" data-stringify-type="emoji" src="https://emoji.slack-edge.com/T0BUT5MJT/ppp/2a3dd5ba642ff09a.png" style="box-sizing: inherit; height: 22px; margin-top: -11px; object-fit: contain; overflow: hidden; position: absolute; top: 11px; width: 22px;" /></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;"> 」「但你看到我的時候也沒多驚訝」「那接下來?」「不知道,還沒想到,先躲在你家過日子,以後再說」</span></span><span class="c-mrkdwn__br" data-stringify-type="paragraph-break" face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="box-sizing: inherit; color: #1d1c1d; display: block; font-size: 15px; font-variant-ligatures: common-ligatures; height: 8px;"></span><span face="Slack-Lato, Slack-Fractions, appleLogo, sans-serif" style="background-color: white; color: #1d1c1d; font-size: 15px; font-variant-ligatures: common-ligatures;">後來就醒了</span>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-79513310529849620272020-01-21T08:55:00.000-08:002020-01-21T10:19:13.507-08:00臨摹夢的一開始,忘記為啥了,反正是在一個圖書館,好像是參加什麼活動,幫忙整理館藏。<br />
<br />
照著索引,把很多東西放到該放的地方,那個圖書館,除了書,還有很多書以外的東西,一些藝品之類的。<br />
<br />
然後還有辦展,辦藝文活動。那天我們幫忙整理完館藏以後,就去參加活動,其中一個活動好像是畫圖,臨摹之類的。但是我們沒有畫畫的道具。然後我記得整理館藏的時候,有看到畫畫道具。<br />
<br />
那個是可以借來用的,我就去拿來用,那個畫畫道具,是放在一本書裡面,那本書很特別,他雖然叫做書,但是每一頁間隔都很大,裡面夾了很多東西。有一些腰帶之類的設計,可以把很多小東西掛附在書頁裡面。<br />
<br />
所以那本書也沒有幾頁,每一頁,就是一個藝術家的作品,還有很多小東西,實體的,像是我要借的那一頁,就是有那個畫家的水彩跟筆,還有很多他的小雜物,書頁也貼了一些他的畫,都是那種開開心心很夢幻的東西。<br />
<br />
都有用一些很俏皮的字,寫著一些很快樂的語句,比方說在雨中跳舞阿之類的。<br />
<br />
我借了畫筆跟水彩,畫完了以後,就要把東西拿去夾回去,然後想說,那我也來臨磨一下他的作品好了,所以我就開始畫,畫的過程,我感覺自己非常投入,我臨摹的成果幾乎一模一樣,我都覺得很不可思議,自己竟然畫的這麼好。我感覺我完全走入那些畫的心境裡面去了。我感覺此時此刻,我跟那個畫家同調了,我感覺她的靈魂就在我身上,我們兩個這個時候一定有著同樣的感覺。我似乎能感受到她在想什麼,聽到什麼,看到什麼。彷彿我就是她<br />
<br />
那是一個靈魂的高度同步…<br />
<br />
然後突然我看到了好多東西,在她的畫裡面,有很多東西,是乍看看不到的,非要是她自己,才能看到。<br />
<br />
然後這個時候,我發現,她的畫,都是看起來很開心,但是其實會在某個小小的角落,有一個小小細解,藏著一個隱喻,一旦看懂那個隱喻,整個畫頓時會有完全不同的解讀。<br />
<br />
每幅畫都是一個巨大悲傷。一切都是這麼的沈重跟悲傷。然後因為我就是她,那瞬間我突然被巨大的悲傷包住。<br />
<br />
然後那書頁裡,除了畫具,還有各種雜物,其中一個,是一個那種晶片鎖,就是碰到門感應會開的那種。<br />
<br />
上面有著手寫的超可愛字體,寫著「跳~就沒事了~」<br />
<br />
因為感覺很可愛,我就大聲的念出來~跳~就沒事了!<br />
<br />
突然感覺到好開心。<br />
<br />
圖書館裡面,周圍的人聽到了,也跟著我一起喊「跳,就沒事了~」突然一切都好開心,我感覺自己被這個小東西深深的感染了情緒~<br />
<br />
然後我就在想「為什麼晶片鑰匙會在這邊阿?她怎麼不用了?是用不到了嗎?她為什麼用不到了???」<br />
<br />
然後我看懂了。<br />
<br />
然後因為高度的同步化,我突然被 100% 的絕望感吞噬。看著門口外面的走廊,是在高樓的走廊,牆很矮,一下就可以跨過去,我只要……跳,就沒事了。<br />
<br />
就在那瞬間,我嚇死了,因為,我就是她,我的心境已經完全跟她一樣,我一定會自殺,我一定會自殺,我一定會自殺,我一定會自殺,我真心的相信我一定會自殺。我全身麻痺,我感覺到我的心臟嚇到麻痺了。我嚇到不能動,躺在地上,我聽到周圍的人在叫我。可是聲音越來越遠。我慢慢感覺不到他們了,我對外界的感官封閉了,我沉到了自己的世界裡面。<br />
<br />
在我的世界裡面,我躺在一張床上,依然全身麻痺,不能動。<br />
<br />
是我的床,在永和的床,我醒了。<br />
<br />
全身麻痺,一個夢境到現實的無縫接軌,然後夢中對於生命的放棄跟絕望感,也無縫接軌的留了下來……<br />
<br />
媽的是禮拜天早上,我從來沒有「煮飯好累我不要去」可是那天,我真的不想去,我不知道我為什麼要去上煮飯課。<br />
<br />
生命到底要幹嘛?我也不知道我潛水要幹嘛?<br />
<br />
那天之後到現在,我從一個什麼都想嘗試的人,突然被抓進自殺畫家的自我裡面……蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com2tag:blogger.com,1999:blog-8461549482861441801.post-20746494150840674882019-06-28T00:42:00.000-07:002022-03-14T20:02:04.989-07:00廟裡打坐的和尚忘了是跟誰,但總之不是我自己一個人。到了一個類似寺廟的地方。應該是去玩吧,類似體驗寺廟生活,像是要打坐之類的,除了我們,還有很多其他人。寺廟晚上能讓人寄宿來著。不過有的人晚上並不在睡房睡覺,可以選擇在大殿打坐。<br />
<br />
其實應該說,有很多人選擇在大殿打坐。人數很多很多,大殿挑高可能有十米,然後牆面從低到高被設計成像是書櫃一樣的一層一層的,有十多層,每一層大概都是一個人盤腿以後可以坐在裡面的高度。然後,大殿的牆壁其實是被坐滿的,也就是說有滿滿四面牆的人在那邊打坐。白天的時候,有一些人會下來,會有空位,但到了晚上,一定會被坐滿,可是白天也不是所有人都會下來,會覺得「是不是有人一直都坐在上面阿?」裡面大部分的人都已經剃髮了。<br />
<br />
半夜睡到一半,醒了,覺得是有什麼聲音,跟尿意混合在一起,讓我醒了。於是起來去廁所。要回房間的時候,聽到大殿傳來類似有人講話的聲音。便走了過去。到了大殿門外,便透過微微搖曳的燭光,看到牆上滿滿的人,微微搖曳的燭光,映著幾百個人沒有表情的臉。<br />
<br />
我聽到哭聲,還有人說話的聲音「快把他換掉,不然他就吵醒別人了」從右邊傳來。<br />
<br />
於是我稍微走進去,轉頭往右邊說話的聲音看去,是從旁邊那處,有兩個寺廟的工作人員正圍著一個打坐的人,其中一個人只是站在旁邊看,但另外一個工作人員的姿勢很怪,他背著我,兩手抓著那打坐的人的肩膀,遮住了打坐的人的身體,工作人員的頭,在打坐的人的頭的位置,並不是靠著,而是重疊,就像是那人已經沒有頭了,而工作人員正在啃食他。<br />
<br />
時間不夠我看清楚,才不到一秒,左邊傳來聲音「你醒啦?」我往左邊一看,是住持,這邊的住持非常年輕,是個十多歲的小孩,住持站在大殿門口的位置,距離我大約十公尺,穩穩的站著。我嚇了一跳,又往右邊看去,發現那打坐的人已經坐在本來的位置上,但是卻只剩下站著的那一個工作人員了,本來抓著打作人的那個不見了……不對,那個打坐的人,怎麼這麼像那個工作人員?「他被吃了?被換掉了?」的念頭瞬間在我腦海浮現。我再往左邊看去,住持還是穩穩的站著,但距離我只剩下五公尺。「他正在靠近我……」我往右邊看,看到本來站著的那個工作人員也還是穩穩的站著,但是也距離我更進了「他要抓我……」<br />
<br />
我不再往左邊看了,立刻轉身就跑。<br />
<br />
「他跑了!」<br />
<br />
幹!這間寺廟會吃人!他們會把來這邊參訪的人吃掉,然後替換掉,然後坐在大殿的牆壁上,靠,那些裡面很多都已經不是人了!都是妖怪!幹,殺小!<br />
<br />
我聽到後面來拼拼砰砰的聲音,很多人從高處往下跳,落地的聲音。我一轉頭,看到一狗票臉上沒表情的人,穿著袈裟,落地,在搖曳的燭光中向著我跑過來。跑,我跑。我往寺廟後面睡房的方向跑,然後把朋友們叫起來,大家在混亂中亂成一片,最後只有幾個人跟到了我。我一直跑,跑到寺廟後方有很多小建物,大多是寺廟用來當倉庫堆東西的,找了一間,跟我的朋友鑽了進去。只剩下一個朋友了,嗚嗚,其他的都已經被抓走了<br />
<br />
進去以後,是一個很奇怪的小房間,這個小房間的牆壁超級多,根本就是一個超小迷宮,由牆壁構成的超小迷宮,走到都很窄很窄,只能一個人走,牆壁就摩擦到肩膀,我只好拉著朋友在這個迷宮裡面鑽,鑽著鑽著,我突然覺得「靠,我認得這個地方,這個地方的盡頭,會有一個往下的密道」。我聽到外面好多的聲音,那些妖怪正在搜捕我們。阿,我聽到門打開的聲音,他們進來了,就要抓到我們了!我拉著朋友趕快往彎彎曲曲的道路裡面走,走到最後,路變個更窄,已經無法正面通過了,只能側著身體硬擠進去一個窄縫,然後縫的最近頭,的地上,有一個小洞。<br />
<br />
那些妖怪和尚已經追來了,他們因為都沒吃飯,臉都很瘦,身體也很瘦,在狹窄的空間裡面移動的比我們還要快,一下就追到我們了。<br />
<br />
我們很艱難的鑽了進去小洞,然後我就放心了,因為我知道(我也不知道我是怎麼知道的但我就是知道)這邊進來以後,會進入一個空間,這個空間是有神在顧的,進去以後,是一個四面牆壁都亮著白光的廣大空間,果然看到一個人,他說「你們在逃命,我都知道了,不用擔心,這是我的地方,他們進不來的。」可是這個房間沒有出口,我問神們能去哪裡,神仙沒有理我。他的意思是我的格不夠,所以他沒有要回答我這個問題。<br />
<br />
我跟我朋友說「只剩下你了嗎?我們怎麼辦?」神看到我朋友以後,打量了一下,突然整個人變得很恭敬,對我朋友說「你有神格。你本來就是神,而且自己跑去當人,為了作善事。你修了很多業,累積的陰德本來這世是要當神的,但你自己立願要再當一世人來助人」<br />
<br />
神說完以後,有一塊地板浮了起來,是個隱藏在地下的電梯,門打開了,神叫我們兩個進去,神跟我說「你本來是沒格進去的,你是好人,但還差一點點,托你朋友的福,你才能進去,因為他就是來助人的」<br />
<br />
電梯向下。<br />
<br />
這是一個玻璃電梯,可以看到外面的那種,可是我們的周圍一直都是岩石,黑黑的。下了不知道多久,幾個小時吧。還在下,我覺得我應該是要到地獄去了。這段時間就跟朋友聊天,也不知道能幹麻,然後想說我是不是我要去地獄了。唉。<br />
<br />
突然四周出現了光亮!是天空!我們從一個奇怪的浮在天上的石頭的底部往下冒出來了,是白天,是天空!好亮阿!電梯向下,我們在空中一直向下,最後電梯終於落地了,是在一個公園,我認出來,是大安森林公園。天那,我們終於回到文明世界了……<br />
<br />
朋友說她要走了,她說她好像有點想起來自己是誰了,她要去作她想做的事情了。於是我在大安森林公園,看著熙來攘往的人群臉上洋溢著幸福的笑容,覺得這場景好不現實阿。蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-77054581897450038302019-02-26T02:42:00.000-08:002019-02-26T02:42:23.625-08:00一個奇怪的夢夢的開頭是,我醒了,在一個周圍都是樹的有庭院的日式房子裡面。全身是傷,有個女生在照顧我的傷勢,我不知道自己為什麼會搞成這樣,什麼記憶都沒有。每天因為全身都痛,也不能動,我就是躺在地板上看著周圍的樹木,隨著風搖動。那個女生話不多,她白天都要去旁邊的田裡面工作,所以除了照顧我以外幾乎都在忙,要砍柴,要種田,要維修房子,因為是木頭的其實很需要修理。夢裡面我是話很少的人,她話也很少,我們都很少講話。<br />
<br />
周圍似乎都沒有別的人家,就她自己一個人住在這裡,不知道為什麼。也不知道被照顧了多久,後來身體能動了。我沒地方去,因為我什麼記憶都沒有了,從哪裡來的也不知道。就幫她一起下田、作家事、砍柴、修房子,還有一個我有幫助的,就是我很擅長沒有聲息的移動,所以打獵很成功,以前她很難吃到的肉,現在也都有的吃了。我體格很好,這些事情我作起來超拿手的。<br />
<br />
就一起生活,她話不多,也很少講自己的事情,我也沒有問,我只是覺得生活就是這樣一天一天,好像也很好。就這麼過了不知道多久,也許是幾個月,感覺習慣了,這就是我的人生了。雖然不知道我本來是怎樣的人過怎樣的人生,但現在的人生很好,很幸福。我們兩個每天都過得很開心,她也很常笑,我也是。<br />
<br />
有一天晚上睡覺睡一半,我頭好痛好痛,越痛越來有很多奇怪的畫面閃過眼前,好痛好痛好痛!阿阿阿阿好痛好痛好痛!我好像想到很多東西,我好像想起來發生什麼事了……<br />
<br />
我是一個組織的殺手,類似忍者之類的東西,因為背叛組織,所以被追殺。我逃了好久,但是最後還是被派出來追殺我的殺手們找到了。在被追殺的過程,我把來追殺我的那一票殺手全部幹掉了,但是自己也受了重傷。最後在樹林裡面逃啊逃,逃到這棟房子以後氣力也放盡,一放鬆就昏過去了。(怪不得我體格這麼好,種田劈柴幹嘛的都超順手 XD)<br />
<br />
醒過來了 @@ 看著天花板,所有的事情都想起來了。完了,根據我對組織的了解,他們不可能放過我,那些人全部被我幹掉了,他們沒有回去回報任務成功,組織一定會再派出人來找我。找到我只是時間的問…<br />
<br />
我聽到了…周圍的樹林裡面有人…天花板上也有人…他們已經找到我了…他們正在慢慢靠近,有很多人,很多人……如果她現在醒過來,她一定會死,如果我留在這邊,她一定會死…我沒有辦法跟她說再見了……<br />
<br />
我沒有聲息的起來,小心的看著她的臉,確定她沒有被我吵醒。我聽得很清楚,他們正在慢慢的靠近,我穿好衣服,拿起受傷時落在身邊的刀現在被收好的刀,跑進周圍的樹林,一直往前跑,一直往前跑,離房子越遠越好。我聽到後面有好多聲音跟來了……那我就放心了……蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-12542023745677101852017-07-12T18:35:00.000-07:002017-07-12T18:35:25.798-07:00Boost.Python 小記<div>
<span style="color: #ff2f92; font-size: 24px;">建構子</span></div>
<hr />
<div>
沒有建構子的 class 要在宣告 mapping 的時候給建構子的 prototype
</div>
<hr />
<div>
<span style="color: #ff2f92; font-family: Monaco; font-size: 24px;">std::vector<></span></div>
<hr />
<div>
跟 python 對接的陣列,要用 <span style="background-color: #fffaa5; color: #008f00; font-family: Monaco;"> boost::python::list </span>
</div>
<hr />
<div>
<span style="color: #ff2f92; font-size: 24px;">Overloading function</span></div>
<hr />
<div>
使用「明確轉型」來指定特定的 overloading 版本</div>
<hr />
<div>
<span style="color: #ff2f92; font-family: Monaco; font-size: 24px;">import_array()</span></div>
<hr />
<div>
使用 numpy 要 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> import_array() </span> ,不然執行期用 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> PyArray_SimpleNewFromData() </span>建立陣列的時候會 segmentation fault。特別注意的是 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> import_array()</span> 其實是一個陣列,他會去初始化一個 static variable 叫做 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> PyArray_API</span> 。 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;">PyArray_API</span> 是一個 compile unit static variable,所以每一個 .cpp 檔自己都要 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> import_array()</span> ,但重複 import 又會錯,所以呼叫前要先檢查 <span style="background-color: #fffaa5; color: #009051; font-family: Monaco;"> PyArray_API</span> 這個變數是否已經被設定。
</div>
<div>
<br /></div>
<div class="en-code" style="-en-codeblock: true; background-color: #fbfaf8; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px;">
<div>
if (PyArray_API == NULL) {
</div>
<div>
import_array();
</div>
<div>
}
</div>
</div>
<div>
<br /></div>
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div>
詳見 <a href="https://stackoverflow.com/questions/32899621/numpy-capi-error-with-import-array-when-compiling-multiple-modules">https://stackoverflow.com/questions/32899621/numpy-capi-error-with-import-array-when-compiling-multiple-modules</a></div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com1tag:blogger.com,1999:blog-8461549482861441801.post-81560658610929381302017-06-28T18:50:00.002-07:002017-07-03T21:02:42.901-07:00tf.slim deploy trained model用 tf.slim train 好了 model 以後,要拿來做 inference 才發現腦袋不大清楚不知道怎麼弄,查了一下,看到<a href="https://github.com/tensorflow/models/blob/master/slim/export_inference_graph.py">這邊</a>,原來 tensorflow 本身就有提供 freeze 的工具,slim 也有 script 讓使用者可以方便的 export model。<br />
<br />
照著註解裡面步驟做就可以了,兩步,橫簡單,連我都會。<br />
<br />
昨天浪費了我幾個小時在那邊摸索,真的很笨。不知道昨天為什麼突然忘記「開始動手做之前先看看別人怎麼做」我的天哪...<br />
<br />
[0] https://github.com/tensorflow/models/blob/master/slim/export_inference_graph.py蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-31079292455587475832017-06-22T19:14:00.004-07:002017-06-22T19:15:27.507-07:00TF.slim 吃自訂格式的 dataTensorflow.slim 預設是吃他 TFRecord。但我的圖很多,我不想全部轉成 TFRecord,這樣會吃掉很多硬碟,我想要保留 .jpg 的檔案在硬碟裡,然後有一個文字檔,裡面描述了哪些檔案有哪些 label。<br />
<div>
<br /></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">0.jpg -1:* 1:0,7</span> </blockquote>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">1.jpg -1:* 1:1,2,4</span><span style="font-family: "courier new" , "courier" , monospace;">...</span></blockquote>
<div>
<br /></div>
<div>
表示 0.jpg 這張圖,有第 0 個 label 跟第 7 個 label。這兩個 label 是 1,其他都是 0。然後 1.jpg 這張圖,有第 1 第 2 第 4 個 label,其他都沒有。至於總共有多少 label,在描述 dataset 的 .py 檔會有寫。</div>
<div>
<br /></div>
<div>
slim 有自己的 reader class,有做了 parallel reader,對於需要大量訓練的時候可以加快 read data 的時間,但是 reader 讀進來之後,decoder 卻只有一個人。如果 decoding 需要很多時間,那這邊就會有問題。為了繞過這個問題,我決定把 reader 跟 decoder 合併在一起。</div>
<div>
<br /></div>
<div>
我根據 slim 的 parallel_reader.py 加了一個 parallel_reader_decoder.py,multi-thread 在讀取檔案以後,同時就會去 decode,之後才放進一個 common queue 讓之後的 node 取用。</div>
<div>
<br /></div>
<div>
這邊註記幾點:</div>
<div>
<ol>
<li>寫 decoder 的時候,真的要注意效能問題,本來我用很 python 的方法在處理 numpy 陣列,後來發現效能慘不忍睹,改用 numpy style 以後 performance 快了幾百倍。</li>
<li>tf.py_func() 就很好用,不一定要用 C++ 去寫 Op,當然如果真的需要就不要偷懶。</li>
<li>tf.losses 會幫忙把 loss 登錄到 GraphKey.LOSSES,之後會有人去取用,所以不要覺得好奇怪為什麼這個 loss 都沒有人用到</li>
<li>記得把 slim 的 preprocessing thread 的數量也開到對,不然你會發現 reading 夠快,decoding 夠快,GPU 的 forward computation 跟 backward propagation 也夠快,但是 throughput 就是有夠低。最後發現是死在 preprocessing thread 數量太少。這個數值跟你的 model 所需要的 preprocessing 複雜度有關。mnist 的 preprocessing 很簡單,一個說不定就夠了,inception 可能要 4(或 8?)。</li>
<li>slim 裡面有幾個 queue,queue capacity 記得要改到夠大,pop 以後的 min-size 也要調整(小),不然你會發現他一批一批的做,比方說你 queue capacity 是 16,min-size 卻是 8,但是你有 8 個 clone,這樣他一次要吃掉 8 個,吃完以後這個 queue 的 producer 才會做事,很不方便。這樣這個 queue 等於沒有 buffering 的效果。</li>
<ol>
<li>Filename Queue (after enumerate files)</li>
<li>Parallel Reading Queue (after read)</li>
<li>Prefetch Queue (after preprocessing)</li>
<li>Batch Queue (after batch packing)</li>
</ol>
<li>開太多 preprocessor 的話,tensorboard 秀 graph 會 gg =_=||</li>
<li>sigmoid_cross_entropy 不要亂餵,他的值域就是 0 ~ 1,雖然我自己的 multi-label 標注方法是 1 positive, -1 negative, 0 don't care,但計算的時候,不要去把 logit 轉換到 -1 ~ 1,而是要把 label 從 -1 ~ 1 轉換成 0 ~ 1(但是 label 真的是 0 的時候,要記得 don't care)用tf.abs 跟 tf.maximum 可以做到。不難。</li>
</ol>
腦子不管用了,剩下的等想到再寫</div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-90067933315725613292017-06-18T20:50:00.001-07:002017-06-22T03:07:13.079-07:00tensorflow 自訂 operator考慮開發速度的話,先使用 <span style="background-color: #cfe2f3; color: white; font-family: "courier new" , "courier" , monospace;"> <a href="http://tf.py_func/">tf.py_func</a> </span> [0]<br />
如果遇到限制,或是考慮執行效能的話,再去看 <span style="font-family: inherit;"><a href="https://www.tensorflow.org/extend/adding_an_op" style="background-color: white;">Adding a New Op</a></span> [1]<br />
<br />
雖說 [1] 比 [0] 麻煩,但其實也相當簡單,不用害怕,進去看著照做就可以了,半個小時的事情<br />
<br />
[0] <a href="https://www.tensorflow.org/api_docs/python/tf/py_func">https://www.tensorflow.org/api_docs/python/tf/py_func</a><br />
[1] <a href="https://www.tensorflow.org/extend/adding_an_op">https://www.tensorflow.org/extend/adding_an_op</a><br />
<br />蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-44355003073956858872017-05-31T18:52:00.000-07:002017-05-31T18:56:19.303-07:00undefined symbol: _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringB5cxx11Ev<span style="color: #e69138; font-size: large;">
解法</span><br />
<br />
編譯的時候加上 <span style="background-color: #3d85c6; color: white; font-family: "courier new" , "courier" , monospace;"> -D_GLIBCXX_USE_CXX11_ABI=0 </span> [0]<br />
<br />
<span style="color: #e69138; font-size: large;">
說明</span><br />
<br />
gcc 5.3 以後導入了新的 ABI,如果你去 link 一個用 5.3 之前的版本編譯的 library,用的還是舊的 ABI,這個時候就會發生錯誤 [1]<br />
<br />
<span style="color: #e69138; font-size: large;">
參考</span><br />
<br />
[0] <a href="https://github.com/tensorflow/tensorflow/issues/1569#issuecomment-200021340">https://github.com/tensorflow/tensorflow/issues/1569#issuecomment-200021340</a><br />
[1] <a href="https://stackoverflow.com/questions/34970607/g-new-abi-problems">https://stackoverflow.com/questions/34970607/g-new-abi-problems</a>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-69995504063026244202017-04-06T22:56:00.004-07:002017-04-07T01:00:12.184-07:00mysql utf8原來要 mysql 支援 utf8 不是這麼預設的,好煩 = =||<br />
<br />
好吧,歷史因素,可以體諒。<br />
<br />
首先看<a href="https://mathiasbynens.be/notes/mysql-utf8mb4">這邊[1]</a>看看怎麼設定(或是變更現有的 database)mysql 支援 unicode<br />
<br />
<span style="color: red;">看就好,先不要動手!</span><br />
<br />
注意你要的 collate 是啥。「collate」指的是 DB 用來比對字串的時候所使用的準則,utf8mb4 預設的 collate 是「utf8mb4_general_ci」,這個很有可能不是你要的,因為他會把「ç」跟「c」當作同一個字元,你需要的可能是「utf8mb4_bin」。<br />
<br />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #f4f4f4; background-color: #000000; background-color: rgba(0, 0, 0, 0.85)}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
然後如果你用的是 docker,不用去寫 my.cnf,run image 的時候直接下命令[2]。<br />
<br />
<pre class="prettyprint shell linenums">$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
</pre>
<br />
好,如果你不是用 docker,那現在你可以動手了。去 alter 你的 DB 跟寫你的 my.cnf。<br />
用 docker 的人只要 alter DB 就好,然後 run image 的時候用下指令的。<br />
<br />
<b><span style="color: red;">Note:</span></b> MySQL 的 utf8 charset 不是真的 utf8,他只支援到 unicode 的一個子集,最多三個 byte。到了 5.5.忘了 版之後才有 utf8mb4 charset 支援整個 unicode codepoint。
<br />
<br />
[1] <a href="https://mathiasbynens.be/notes/mysql-utf8mb4">https://mathiasbynens.be/notes/mysql-utf8mb4</a><br />
[2] <a href="https://hub.docker.com/_/mysql/">https://hub.docker.com/_/mysql/</a>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com1tag:blogger.com,1999:blog-8461549482861441801.post-86110469011927019102017-04-06T01:02:00.003-07:002017-04-06T18:31:49.153-07:00mysql -h localhost 失敗一直無法使用
<br />
<pre class="prettyprint shell linenums">mysql -h localhost -P 3306 -u root -pkerker
</pre>
連線到我 local 的 mysql server,氣死我老百姓,錯誤訊息:
<br />
<pre class="prettyprint shell linenums">ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
</pre>
結果最後發現是要用
<br />
<pre class="prettyprint shell linenums">mysql -h 127.0.0.1 -P 3306 -u root -pkerker
</pre>
原來 127.0.0.1 跟 localhost 還是不一樣的 XD<br />
<br />
reference<br />
[1] <a href="http://stackoverflow.com/questions/9714899/php-mysql-difference-between-127-0-0-1-and-localhost">http://stackoverflow.com/questions/9714899/php-mysql-difference-between-127-0-0-1-and-localhost</a><br />
[2] <a href="https://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html">https://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html</a>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-6257859245201151582016-09-13T02:39:00.000-07:002016-09-13T19:26:07.653-07:00YouCompleteMe in MSYS2 on Windows<h3>
Table of Content</h3>
<div>
To use YouCompleteMe in an MSYS shell, you will need to:</div>
<div>
<ol>
<li>Install MSYS2</li>
<li>Install CMake</li>
<li>build libclang</li>
<li>Install YCM (and vundle, of course)</li>
<li>Bulid YCM</li>
</ol>
</div>
<h3>
Install MSYS2</h3>
<div>
reference https://www.youtube.com/watch?v=pb6Yb819pF0<br />
<ol>
<li>Download <a href="https://msys2.github.io/">MSYS2</a> 64bit version is better</li>
<li>Execute the installer binary, install MSYS2 to <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> C:\msys64 </span></span></li>
<li>Run a MSYS2 shell, execute <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> update-core </span></span></li>
<li>Close the MSYS2 shell window</li>
<li>Run a MINGW64 shell</li>
<li>Execute <span style="background-color: #0b5394; color: white; font-family: "courier new" , "courier" , monospace;"> pacman -Su </span></li>
<li>Close the MINGW64 shell window</li>
<li>Run a MINGW64 shell</li>
<li>Execute <span style="background-color: #0b5394; color: white; font-family: "courier new" , "courier" , monospace;"> pacman -Su </span> AGAIN</li>
<li>Execute <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> pacman --needed -S git mingw-w64-x86_64-gcc base-devel </span></span> install compiler tool chain</li>
</ol>
Check following:<br />
<ol>
<li>vim <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> :echo has('python') </span></span> it should be 1</li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> gcc -v </span></span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> make -v </span></span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> cmake </span></span> should <b><span style="color: #cc0000;">NOT</span></b> installed, if installed, REMOVE it. Because we don't want MINGW's cmake, but Windows'. Only Windows version can generate "MSYS Makefiles" format, which is what we need.</li>
</ol>
<h3>
Install CMake</h3>
<ol>
<li>Download from <a href="https://cmake.org/download/">here</a>, download the <span style="color: #cc0000;"><b>Windows</b></span> 64 bit version</li>
<li>Install to <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> C:\CMake </span></span></li>
</ol>
<h3>
Build libclang</h3>
reference<br />
http://clang.llvm.org/get_started.html<br />
https://github.com/rust-lang/rust/issues/34489<br />
<br />
<ol>
<li>Get LLVM and Clang source. We don't clone the whole repo, just download the tar file. It's much faster.</li>
<ol>
<li><span style="background-color: #0b5394; color: white; font-family: "courier new" , "courier" , monospace;"> wget http://llvm.org/releases/3.9.0/llvm-3.9.0.src.tar.xz -O llvm.tar.xz </span></li>
<li><span style="background-color: #0b5394; color: white; font-family: "courier new" , "courier" , monospace;"> wget http://llvm.org/releases/3.9.0/cfe-3.9.0.src.tar.xz -O clang.tar.xz </span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> tar xvfJ llvm.tar.xz </span></span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> tar xvfj clang.tar.xz </span></span></li>
<li><span style="background-color: #0b5394; color: white; font-family: "courier new" , "courier" , monospace;"> mv clang llvm/tools </span></li>
</ol>
<li>Use CMake to generate make file.</li>
<ol>
<li>Before run cmake, you need to apply some modification:</li>
<ol>
<li>Use Windows version python, not MSYS's python, to generate correct source path. <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> vi llvm/CMakeLists.txt </span></span> replace <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL} </span></span> with <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> COMMAND C:/Python27/python.exe ${LLVMBUILDTOOL} </span></span></li>
<li>Add CXX flag <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> --Wa,-mbig-obj </span></span> otherwise the output .obj file will be too large.</li>
<li>Add LINK flag <span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> -L/usr/lib </span></span></li>
</ol>
<li>Generate the make file.</li>
<ol>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> mkdir build-llvm </span></span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> cd build-llvm </span></span></li>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> /c/CMake/bin/cmake.exe -G "MSYS Makefiles" ../llvm </span></span></li>
</ol>
<li>Make it</li>
<ol>
<li><span style="background-color: #0b5394;"><span style="color: white; font-family: "courier new" , "courier" , monospace;"> make </span></span></li>
</ol>
<li><span style="color: #cc0000;">FAIL</span>. Build fail at last step link the result file liblibclang.dll, the error message is ld.exe: cannot find -ldl but I did not pass -ldl to the linker, and I don't know how to remove it. according to http://discourse.chaiscript.com/t/basic-question-about-compiling-chaiscript-with-mingw-g/170 "dl is only needed in unix". so why my toolchain try to link it? after more search, maybe add a -L/usr/lib can fix that problem. That is weird the toolchain didn't add it at default.</li>
</ol>
</ol>
</div>
<div>
<h3>
To Be Continue</h3>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-78161435146263503912016-04-20T10:23:00.000-07:002016-04-20T10:25:06.972-07:00Universal Windows Platform XAML 自訂 Button Style最近在寫 Windows 程式,我想要在 XAML 裡面設定 Button 滑鼠移上去,也就是 hover 的時候的顏色。CSS 當然簡單啦,直接可以設定 hover 的樣式。但 XAML 就花了我一點功夫才弄懂。<br />
<br />
首先 XAML 也是有 Style 的。就叫做 Style(對我專講廢話)。XAML 所預設提供的每一個 Control 都已經有配上 Style。所以如果要改變 hover 的顏色,需要 override 掉他預設的 Style。以下介紹怎麼 override 掉一個 Button 預設的 Style。<br />
<br />
首先,先來看看一顆 Button 平常的樣子(左邊),跟滑鼠移上去的樣子(右邊),右邊有個深灰色的框框。<br />
<span id="goog_1865861969"></span><span id="goog_1865861970"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFUQ-4Ti_LO9n88wOE-g_blyffsq0TEvJJWZDpODJ3MERclvcs62bfR2E4ZAda0uY3mo2CDdIm8hQXgxCDPxSk9_FfI_daagcy4_Ellh3ppqnpOdS9C4c64f0KXqsskC3jZ18Qy7GMSY/s1600/xamlbuttondefault.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="54" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFUQ-4Ti_LO9n88wOE-g_blyffsq0TEvJJWZDpODJ3MERclvcs62bfR2E4ZAda0uY3mo2CDdIm8hQXgxCDPxSk9_FfI_daagcy4_Ellh3ppqnpOdS9C4c64f0KXqsskC3jZ18Qy7GMSY/s320/xamlbuttondefault.png" width="320" /></a></div>
<br />
假設我不喜歡那個框框,我希望背景變色,然後字也變色,那我們就要去修這個 Button 的 Style。<br />
<br />
開始,首先,每個 Control 都有所謂的 template,Style 是決定在這個 template 裡面。所以我們其實要編輯的是這個 Button 的 template。現在,讓我們在 Visual Studio 裡面,拉出一個 Button 放到 design 視窗裡面。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZod6CU46Toc8hLHli4iPvei6WjsV26nUmp6ZC1EiFjlfeORwJJ4PtcnPJZhyphenhyphenBwfq_gs1HT7rDwDq4koQRPfLcSP3-o-U6KmpS9Rstw4_DhSyDY0yLyahkeBpBbt3to-dMBxDqGZKNKyM/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZod6CU46Toc8hLHli4iPvei6WjsV26nUmp6ZC1EiFjlfeORwJJ4PtcnPJZhyphenhyphenBwfq_gs1HT7rDwDq4koQRPfLcSP3-o-U6KmpS9Rstw4_DhSyDY0yLyahkeBpBbt3to-dMBxDqGZKNKyM/s320/a.PNG" width="320" /></a></div>
<br />
接著在 Button 上按滑鼠右鍵,選「編輯範本」→「編輯副本」<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnDaxemgqm2hNGx-9gg7PYvf-hxAkmpgipJMkDr4314cOBFi4d1tNew_E5s2_mwFHXq7r5P66-Xzri2eaO24PlDN6u_bw8Zc5sSpb6ocTCDDf5_eHqW3KNaLQAkrO4NvFyfXHgPW7w9Bs/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnDaxemgqm2hNGx-9gg7PYvf-hxAkmpgipJMkDr4314cOBFi4d1tNew_E5s2_mwFHXq7r5P66-Xzri2eaO24PlDN6u_bw8Zc5sSpb6ocTCDDf5_eHqW3KNaLQAkrO4NvFyfXHgPW7w9Bs/s320/a.PNG" width="268" /></a></div>
<br />
範本就是 template,那編輯副本(edit copy...)是什麼意思呢?因為其實 Button 本身已經有一個預設的 template,那一個預設的 template 是我們動不了的,所以我們要從那個 template copy 一份出來編輯。你可以看到「編輯目前項目」這個選項是 disabled 的,表示我們無法直接編輯這個 Button 目前所套用的那個 template。「建立空白」則是說我們想要從頭建立一個 template,但我們不想,太麻煩了,我們想要從現有的這個改。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_t85w0SAXufq5nKtqCkMjp-Br8CFMc-A2eOMkkccUv2ii6WvIMrIQgECQhAtfwQ27mCl-ikFAGBstxqEAceBoC7iDpoNwFeQZj3l5N4pxc6Vhybv6tduN-9fCBfgQIhTljo-UdXRH4Y/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_t85w0SAXufq5nKtqCkMjp-Br8CFMc-A2eOMkkccUv2ii6WvIMrIQgECQhAtfwQ27mCl-ikFAGBstxqEAceBoC7iDpoNwFeQZj3l5N4pxc6Vhybv6tduN-9fCBfgQIhTljo-UdXRH4Y/s320/a.PNG" width="320" /></a></div>
<br />
現在你有幾個選項可以選,上面那個「全部套用」我不知道是啥意思,我很無知。但我知道取個名字是什麼意思 XD 我來取個鳥名字叫做「ChangeColorButtonStyle」。下面那個選項「定義於」比較簡單,因為 template 也是用 XAML 描述的,所以他其實就是問你要把這個範本存在哪邊。<br />
<br />
<br />
<ol>
<li>應用程式(App)的話,就是整個 App 到處都可以使用到這個 template,應該是會放在 App.xaml 裡面</li>
<li>此文件,那就是存在你目前編輯的這個 XAML 檔裡面,你還可以選擇你要放在哪裡,是要放在整個 Page 裡面,還是你只想要放在這個 Button 裡面。如果你放在這個 Page 裡面,那只要在這一頁裡面,其他的 Button 也都可以使用這個 Style。如果放在 Button 裡面,就只有這個 Button 可以使用了,假設你有好幾種 Style 想要讓這個 Button 自己切換,且別人都用不到這些 Style,就可以使用這個選項。</li>
<li>資源字典(Resource Dictionary)是 XAML 裡面用來管理 Resource 集合的容器,因為我目前沒有自訂任何 Resource Dictionary,所以他也不讓我選,算了,哼哼。</li>
</ol>
<br />
<br />
以這個範例來說,因為我只有一個 Page,我就放在 Page 吧。按下「確定」<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVSZEI61KLWCYUE-5UxsHp766D-taEnYuh_S_F4Zs2ZZoM3Xiu7S3yiEFBQlEonzCH7MAxJ7JdEroqJje1zI85gXqnJPErIWWR8TQvxDh0e-Wr_5cFZcdnMQCmMt2FH2IUtN6jC1RhtVc/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVSZEI61KLWCYUE-5UxsHp766D-taEnYuh_S_F4Zs2ZZoM3Xiu7S3yiEFBQlEonzCH7MAxJ7JdEroqJje1zI85gXqnJPErIWWR8TQvxDh0e-Wr_5cFZcdnMQCmMt2FH2IUtN6jC1RhtVc/s320/a.PNG" width="320" /></a></div>
<br />
可以看到我的 XAML 檔從本來的<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyfQP64-svBD0El_kjYyhiBI0WYVfM5shp-yMrrBn6dGNXJKUVl6G5z3gT4nB71zLdT7qalNDyXYROFWcKumrDEkeS4OxzKloVLJScvXwY0bgZ5tobfd9_XDZkGjy6aSMd-iAT6IYeHE0/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="74" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyfQP64-svBD0El_kjYyhiBI0WYVfM5shp-yMrrBn6dGNXJKUVl6G5z3gT4nB71zLdT7qalNDyXYROFWcKumrDEkeS4OxzKloVLJScvXwY0bgZ5tobfd9_XDZkGjy6aSMd-iAT6IYeHE0/s320/a.PNG" width="320" /></a></div>
<br />
變成<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiToGagbHK7JUgrN5cG-bRap_IhccYGBSD99ZsIxhV8Uky6taQrAnvPG8XFia8qqM0Y6tuq68iiyNd61fXMCas0Zh1UsRPjFRpSrMkimxxVvVIQaKxU5MASDFKUwY2_F9IWO-XIFchBGiM/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiToGagbHK7JUgrN5cG-bRap_IhccYGBSD99ZsIxhV8Uky6taQrAnvPG8XFia8qqM0Y6tuq68iiyNd61fXMCas0Zh1UsRPjFRpSrMkimxxVvVIQaKxU5MASDFKUwY2_F9IWO-XIFchBGiM/s320/a.PNG" width="320" /></a></div>
<br />
太 awesome 了。看不懂,沒關係,不重要,重點就是上面那一整駝,就是他生出來的用來描述 Style 的 XAML。然後他也幫你把 Button 指定的 Style。看到沒有,名字一樣。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG7YgYjvCk2izZiXGN4nQxoZql47SJHiJUC7MndQpDlZmE_W5DfUJoBLbLGNjlIt93ursuA-HWb-ICto4NRFonWkMCPnsEGIY2p7xB6a-OCJnJ1C_ztrinAsp8K5zBpoDMI8uC3sQOieo/s1600/xamlbuttondefault.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG7YgYjvCk2izZiXGN4nQxoZql47SJHiJUC7MndQpDlZmE_W5DfUJoBLbLGNjlIt93ursuA-HWb-ICto4NRFonWkMCPnsEGIY2p7xB6a-OCJnJ1C_ztrinAsp8K5zBpoDMI8uC3sQOieo/s320/xamlbuttondefault.png" width="320" /></a></div>
<br />
所以接下來,我們只要編輯上面那個 XAML 就可以了……昏倒……那真不是人幹的,所以我要用「Blend」,今日最重要關鍵字,沒有之一。<br />
<br />
Blend 是微軟用來 design XAML 的 GUI 工具,長的有點像 Visual Studio,但是專注在 design UI 上。現在請到「方案總管(Solution Manager)」在你那個 XAML 上,按滑鼠右鍵,選「Edit in Blend」<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxxNAm8vzX8toJW9FEIPNuaOw841rpASrFNV29qf_B6DCnUatanPurRfAZM0hc3Ex-pY19Y3RRo_VIYWLwe4jH5Hfy0V87E1kSuJ_p9HBVlctKunJyi6lk8kvRmM-HMjnsmPQMxm9uRhQ/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxxNAm8vzX8toJW9FEIPNuaOw841rpASrFNV29qf_B6DCnUatanPurRfAZM0hc3Ex-pY19Y3RRo_VIYWLwe4jH5Hfy0V87E1kSuJ_p9HBVlctKunJyi6lk8kvRmM-HMjnsmPQMxm9uRhQ/s320/a.PNG" width="320" /></a></div>
<br />
等一段時間,如果你從來沒有執行過 Blend,他第一啟動會有點久 = =|| 耶~終於好了!<br />
<br />
他會跳一個你看不懂的視窗。一個好的程式設計師的習慣,就是一定要搞懂每一個細節,不能放任東西不懂就這樣過去了,所以我們按下「不要再提示我」跟「確定」,叫他閉嘴。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSs5F-jk_C66mQl4QxhJB9jm3P-ibjNYOsrUCVw9nEC3klGA7g5QB4ixosbffyJaKn9T0h584KhilkrhAoCbVPjUZ34i99UG1QcU_niPAkxQ-d5flk3kAkA3wFMUtQKz2-Uwrxsmv8bbo/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSs5F-jk_C66mQl4QxhJB9jm3P-ibjNYOsrUCVw9nEC3klGA7g5QB4ixosbffyJaKn9T0h584KhilkrhAoCbVPjUZ34i99UG1QcU_niPAkxQ-d5flk3kAkA3wFMUtQKz2-Uwrxsmv8bbo/s320/a.PNG" width="320" /></a></div>
<br />
搭拉~傳說中的 Blend<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijuYCg34J637q68RcJ_q6ubSlA4i5Wj_aFkYnhaq4n5thDy-cPCYN4WPwXHV22hIO1TE6-UaAEIhGYQPCiffXPIXbBQHicsphQKChkuQz8LWW3YaaCfNQSg7oSAJv3XyTgZE_9spvFqKI/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijuYCg34J637q68RcJ_q6ubSlA4i5Wj_aFkYnhaq4n5thDy-cPCYN4WPwXHV22hIO1TE6-UaAEIhGYQPCiffXPIXbBQHicsphQKChkuQz8LWW3YaaCfNQSg7oSAJv3XyTgZE_9spvFqKI/s320/a.PNG" width="320" /></a></div>
<br />
在 Button 上按下右鍵,現在我們要來編輯這個 Button 的 Style。因為我們剛剛已經有幫他建立 Style 了,所以這次「編輯目前項目」是可以選的,選他,因為我們要編輯我們剛剛給名字的那個 ChangeColorButtonStyle。<br />
<br />
好,講古時間到。在 XAML Style 裡面,有一種東西叫做 VisualState。什麼是 Visual State 呢?就是「看起來什麼樣」比方說 Button 在「平常」是一個 VisualState,在「滑鼠滑上去」的時候是另外一個 VisualState,在「按下去」的時候是另外一個 VisualState,在「Disable」的時候又是另外一個 VisualState。所以 Button 總共有四種 VisualState:<br />
<br />
<ol>
<li>Normal 正常</li>
<li>Pressed 起蕊</li>
<li>Disabled 失常</li>
<li>PointerOver 指標在上</li>
</ol>
<br />
<br />
Blend 讓你可以分別輕鬆的設計這四種 VisualState 長什麼樣子。<br />
<br />
那我們要怎麼編輯這些 VisualState 呢?來,看到畫面左上方<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQMlHS2PRJkNq_71pKXw2WAy37OGtn-T1cLHRLi7AOk8W0YcG8qr-grKpdTAN5-rfPIU1Pc8aNEaiwdoczf3FbxoP880izm2QDBfFSSQ_DO4bJtfArfh0nO_CWr2r2DZ5hLcDeKbPBH08/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQMlHS2PRJkNq_71pKXw2WAy37OGtn-T1cLHRLi7AOk8W0YcG8qr-grKpdTAN5-rfPIU1Pc8aNEaiwdoczf3FbxoP880izm2QDBfFSSQ_DO4bJtfArfh0nO_CWr2r2DZ5hLcDeKbPBH08/s320/a.PNG" width="238" /></a></div>
<br />
那個 State 給他點下去,我們就可以看到,Button 有四個 VisualState。<br />
我們隨便看兩個,請點一下 Normal,可以看到 Button Normal 的樣子<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0i9NTl5NdRxzu1nt2QtKnHt_pDSLt13EN3Kkbycq5otivf-YE04OcBifaq-AoxYvJnJ1H8E2ie4SWqxnTzFKP4UmS2NZYybWrFr5PO0bb2LkLbDKMEQuBWl-4djjg4RzJgpkYlJCggs4/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0i9NTl5NdRxzu1nt2QtKnHt_pDSLt13EN3Kkbycq5otivf-YE04OcBifaq-AoxYvJnJ1H8E2ie4SWqxnTzFKP4UmS2NZYybWrFr5PO0bb2LkLbDKMEQuBWl-4djjg4RzJgpkYlJCggs4/s320/a.PNG" width="320" /></a></div>
<br />
嗯,很 normal,現在點下 PointerOver 來看看很什麼樣子<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQDOWfYY0shAK2waayHy9H-cdHH78VZXPetiEbshi94RYqDwRnYORSdrdFuwNPZxg6CYREHjvKXZdYZO1zKVPtiK-QlX5Qu4GfDgjglEbNzRtkXVtfRD0xk3tSc_bmqYHi2eNQwHnru84/s1600/%25E6%2593%25B7%25E5%258F%2596.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQDOWfYY0shAK2waayHy9H-cdHH78VZXPetiEbshi94RYqDwRnYORSdrdFuwNPZxg6CYREHjvKXZdYZO1zKVPtiK-QlX5Qu4GfDgjglEbNzRtkXVtfRD0xk3tSc_bmqYHi2eNQwHnru84/s320/%25E6%2593%25B7%25E5%258F%2596.PNG" width="320" /></a></div>
<br />
嗯,很 over。<br />
<br />
我現在想要把這個 Border 拿掉,點一下那顆 Button,畫面右邊會顯示這個 Button 的屬性,但是你會發現他 BorderThinkness 的地方,被黃色的框框框起來,不給你改!ㄟ!其實是因為這些屬性已經被之前我們 copy 的那個 Style 設定過了,所以如果我們要再設定他的話,要先 reset 他<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVzIF9Y_2vj1Aba_1f6FcF6ZLksz16RQHhO1HYFgp-RpuO9QefXz4qLU_ZUIll0_lQJoa5-y21lNK8uCh4AXH3JLfMb61Rh3U7BDgf1ilb5wg7rUIZjBnoesqUC9VcbML_ALhWo0bRABA/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVzIF9Y_2vj1Aba_1f6FcF6ZLksz16RQHhO1HYFgp-RpuO9QefXz4qLU_ZUIll0_lQJoa5-y21lNK8uCh4AXH3JLfMb61Rh3U7BDgf1ilb5wg7rUIZjBnoesqUC9VcbML_ALhWo0bRABA/s320/a.PNG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
然後就可以改變那些值了,我要把他改成 0 = =||</div>
<div class="separator" style="clear: both; text-align: left;">
你現在可以按下 F5 執行看看,滑鼠移上去,邊已經不會顯示了。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
但是現在這樣也不太能看的出來有沒有 hover,所以我還要改背景顏色。好像不用我多說這個改,太簡單了,請自己動手。那我就選個霞光虹好了</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUuUeFZQ_a8PYuF1Bb9DNmbdIexJIyGaIoKBPkGji5CI51v_B17W2fxIKPJR2siBpXy4AeLSc7sNpBHKC3xyKx8sHFH62OoVr5q41qNyw0clq0nhgangsLnSuH7EaHANHfnNf730FeYXY/s1600/a.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="74" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUuUeFZQ_a8PYuF1Bb9DNmbdIexJIyGaIoKBPkGji5CI51v_B17W2fxIKPJR2siBpXy4AeLSc7sNpBHKC3xyKx8sHFH62OoVr5q41qNyw0clq0nhgangsLnSuH7EaHANHfnNf730FeYXY/s320/a.PNG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
按下 F5 執行,成功啦!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
其實他還可以設計「VisualState 間切換的動畫」,不過我懶的寫了,自己上 youtube 找 XAML Blend Animate 就這樣。掰。</div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-33265281612846971112015-11-30T00:46:00.001-08:002015-11-30T00:47:33.044-08:00Universal Windows Platform debug output= =|| 宇宙崩潰,找一個 debug output 方法找超久!!<br />
<br />
踹盡網路上各種方法!<br />
<br />
什麼 <span style="color: #3d85c6;"><span style="background-color: #eeeeee;"><b><span style="font-family: "courier new" , "courier" , monospace;"> System::Diagnostics::Debug::WriteLine </span></b></span></span> 鬼的根本編譯不會過!<br />
<br />
最後才知道根本應該 <b><span style="background-color: #eeeeee;"><span style="color: #3d85c6;"><span style="font-family: "courier new" , "courier" , monospace;"> ::OutputDebugString(L"abc"); </span></span></span></b> 才對!<br />
<br />
Universal Windows Platform 當關鍵字找到都是錯的 = =||<br />
<br />
請用 WinRT 當關鍵字。<br />
<br />
然後,project 設定,debugging 那一頁,記得設定成 native 蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-59657726445343953002015-05-04T09:37:00.001-07:002015-05-04T09:37:59.892-07:00Mycestro 使用心得<div class="separator" style="clear: both; text-align: left;">
先看影片,看看 <a href="http://www.mycestro.com/">Mycestro</a> 是什麼東西</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Q5p8ncz3DVs/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Q5p8ncz3DVs?feature=player_embedded" width="320"></iframe></div>
<br />
就是個像 Wii 的手把一樣,利用加速度計來當作輸入的裝置。<br />
因為越來越懶了,不廢話,直接列優缺點:<br />
<br />
<h4>
優點:</h4>
<br />
<ul>
<li>手不用在鍵盤跟滑鼠中間來來去去,對像我這樣的 vim 的使用者很方便,手不用離開鍵盤。</li>
<li>沒了。</li>
</ul>
<br />
<h4>
缺點:</h4>
<br />
<ul>
<li>貴,一隻要價 149 美金,相當於 4500 台幣,還不算運費。運費 30 美金,總價 5400 台幣。</li>
<li>連續使用的話,大概七八個小時以後沒電。其實也蠻久了,畢竟人平常也不太可能連續使用七八個小時,加上他充電也很快。而且沒電的時候就剛好站起來走一走 XD 這樣好像不算缺點</li>
<li>需要一個特製的 BlueTooth dongle,不見,就沒了,就不能用了,要的話,不好意思,再買一隻,19 美金,運費 30 美金,總價 1500 台幣。<b><span style="color: red;">神奇的來了!MacBook Air 不知道為什麼不需要這個特製的 dongle 就可以直接使用!</span></b>不理解為什麼 Windows 使用者就得多花錢買一個特製 dongle,寫信給他們,來來回回好幾封,跟我轉圈圈,沒回答。</li>
<li>適應期長,大概要一個禮拜以後才會熟練,可以取代一般的滑鼠。</li>
<li>戴久了手指有點悶悶的</li>
<li>Linux 上面沒有 driver,無法控制他的靈敏度,但出廠的預設值調的非常小,用起來要人命。問官方,官方回答「也有人在 Linux 上面沒有 driver 也用的很好」我管別人用的好不好,我要 driver 阿 = =||</li>
</ul>
<br />
<h4>
Q & A:</h4>
<br />
<ul>
<li>可以取代滑鼠嗎?可以,但需要一段時間適應</li>
<li>貴嗎?貴</li>
<li>好用嗎?好用</li>
<li>重嗎?一點點,還好,不會影響打字</li>
<li>推薦買嗎?很難說,他很貴,你很有錢的話就 OK,不然不推</li>
</ul>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-48008674667603529502015-04-20T10:48:00.000-07:002015-04-20T10:48:27.439-07:00撿到四隻小貓第一天晚上<br />
<br />
大概十二點多回到家,聽到防火巷裡面傳來「哇哇嗚嗚」的聲音,我在想「老鼠又在打架了」不過現在的老鼠還真大膽了,叫這麼大聲,都不怕給貓抓到。<br />
<br />
第二天早上<br />
<br />
十點,經過防火巷外面,聽到跟昨天晚上一樣的聲音。耶,這就奇怪了,老鼠不可能叫一整個晚上。於是我就探過去看,跟著聲音找,赫然發現地上有一個小東西在動,幹,什麼東西?老鼠?貓!是貓!超小的貓!乳牛貓!連眼睛都還沒有睜開耶,腳被樹根給纏住了,卡住了,走不開,好可憐喔。嘗試想要幫他解開,發現纏得很緊,怪不得他會哭。只好拿出隨身的小剪刀,幫他把那個樹根剪斷。ㄟ?跟樹根纏在一起的這是什麼……胎盤?他的臍帶跟地上的樹根纏在一起了,怪不得他走不開,而且乾掉的臍帶跟樹根也太像了吧……拿在手上,好小喔,真的好小喔……但竟然也是一個生命 @@ 覺得好神奇……<br />
<br />
聽到旁邊還有聲音,看了一下,發現旁邊約五十公分處的花圃裡面,是另外一隻小貓,同樣也是被自己的臍帶卡住,巨大的胎盤被卡住,爬不動,也是在哭,也幫他把臍帶剪了。感覺母貓應該是想要把小貓生在這個花圃裡,但不知道為什麼有一隻生在外面。看了一下花圃,非常的深,小貓不可能自己爬出來。怎麼會一隻生在裡面一隻生在外面?<br />
<br />
我知道遇到小貓不能隨便撿,因為貓媽媽照顧小貓會比人類照顧好很多。但這小貓這樣在外面實在太危險了,我幫他兩隻放在一起,都在花圃裡面,這樣比較不會跑出來,到時候跑不見就完蛋了……<br />
<br />
放好以後就要離開了……走出防火巷的時候,看到第上有一隻死老鼠,靠!嚇死我了,差一點就踩到!怎麼會有一隻死老鼠在這邊!死了!仔細看仔細看,發現不是老鼠……是貓!又是一隻貓!跟剛剛的一樣大,應該是同一胎,怎麼會在這麼遠的地方?隔好幾公尺耶!貓媽媽在幹麻 @@ 三隻小貓生三個地方,而且都沒有顧,太奇怪了!阿!動了!沒死,叫了 @@ 還好有看到,不然真的會踩到,沒死也沒我踩死。一樣幫他撿起來,放到那個花圃裡面。希望他媽媽回來會好好照顧。<br />
<br />
想了想,回到房間,把阿喵在家裡面的貓飼料通通倒到紙碗裡面,放到花圃的旁邊,這樣貓媽媽就不用因為覓食離開小貓很遠了。通常貓媽媽都會一直顧在小貓旁邊,這次可能是因為為了找東西吃,所以跑到很遠的地方。再確定一次三隻小貓都很正常,就去上班了。<br />
<br />
第二天中午<br />
<br />
中午的時候,跑去問了在公司旁邊,常去的動物醫院的醫生,說遇到了三隻臍帶連胎盤的小貓。醫生說通常貓媽媽都會在小貓身邊不會離開,如果遇到這種,就是不正常。如果確定貓媽媽不在的話,最好還是送醫院。我問醫生,如果媽媽不在旁邊,一天這樣會活嗎?醫生說如果沒有媽媽在,一天大概就死了,小貓最怕失溫,現在我們人類覺得很熱,但對小貓來說,晚上的溫度還是致命的。我想了想,小貓昨天晚上十二點可能就沒人顧了,到現在白天還好還蠻熱了,但再一個晚上,恐怕真的無法……<br />
<br />
第二天下午<br />
<br />
下午四點半的時候,實在是擔心阿,請了假就趕快回家,我怕等到六點下班天就涼了。回到家趕快跑去看小貓,發現飼料有被吃過的痕跡,不知道是別的貓吃的,還是貓媽媽吃的,但總之周圍沒有貓媽媽的跡象,這個時候三隻小貓正擠在一起取暖睡覺,樣子好可愛 ^^ 眼睛都沒打開,卻這麼可愛的很安祥的睡。可能是聽到我來了,就醒了,又開始嗚嗚阿阿的哭,也許是餓吧……<br />
<br />
彎著腰,看著他們嗚嗚的時候,右邊傳來「哇哇」疑?聽錯了嗎?怎麼會有一聲是從旁邊傳來的?應該是聽錯了,繼續看著眼前的三隻小貓哇哇叫,真的好可愛阿…「哇哇」不對,沒有聽錯,真的是右邊有傳來哇哇聲!沿著聲音過去,又沒聲音了。沿著地上慢慢走,但是沒在地上看到任何東西阿…防火巷裡面因為很陰濕,所以地上某些地方有著厚厚的苔蘚跟泥,就在腳快要踩到的時候,突然有塊苔蘚動了一下 @@ 看到了,是一隻…乳牛貓…第四隻小貓…跟苔蘚混在一起了,胎盤也還在,臍帶跟胎盤,還有貓本身,都跟半乾的苔蘚乾在一起了。天哪,到底在這邊多久了?為什麼媽媽都有回來吃飯了,卻把自己的小孩丟在苔蘚泥巴裡面不管阿…距離早上我把飯放下去都已經好幾個小時了,明明就有回來吃飯,不可能連一隻貓都叼不回吧…可是還是不敢亂撿貓,媽媽照顧一定會比我好多了!把第四隻小貓也撿起來,放到花圃裡。跟他的兄弟姊妹一起取暖,四隻在一起好像很開心 ^^ 還是要再講一次,好可愛阿…而且感覺也很有活力,沒有問題!回公司上班去!<br />
<br />
第二天晚上<br />
<br />
九點多,下班,回家。第一件事就是衝去防火巷裡面,飼料又少了!有貓吃飼料。小貓還在花圃裡,果然憑他們自己的體型絕對爬不出這麼高的花圃。但媽媽到底去哪了,會不會我進來之前她還在,看到我來才跑掉?摸了摸小貓周圍的地面,冷的。貓媽媽沒有幫他們取暖,小貓的溫度感覺也比下午的時候更冷了一點。我判定媽媽棄養了。打了電話給獸醫,醫生說開到十點,我馬上帶著小貓衝去找獸醫了!途中先去路上買了醫生推薦的 BMR 貓奶粉。<br />
<br />
在九點五十分的時候趕到了獸醫院,醫生幫忙看了一下,把第四隻小貓的胎盤跟臍帶剪掉,教我之後要怎麼餵奶粉,教我要怎麼促使小貓排泄。醫生用溼棉花輕輕拍著小貓的下腹部,地一隻小貓完全沒反應。醫生說可能是因為完全沒有進食,所以沒東西可以排泄,然後拍拍第二隻,竟然尿了一滴,但是是血尿…醫生說不確定是因為憋太久還是因為健康已經有問題。醫生把小指放到小貓嘴前,小貓有吸吸的動作,醫生說這樣就會吃奶,就還有機會。叫我要注意保暖的問題,這個天氣對人類可能覺得很熱,但對小貓來說,還是很致命的溫度,小貓很容易就失溫。我問醫生要怎麼保暖,醫生拿了一個電毯給我「我先借你一個,你真的有需要再買…」醫生人超好,哈哈哈,醫生想要找奶瓶給我,但是他的奶瓶已經丟掉了。但已經超過十點了,大部分的寵物店都關門了。醫生跟我說公館的金吉利還開著,我去金吉利買了奶瓶,回到辦公室,想要把小貓養在辦公室,這樣上班時間才有辦法照顧。<br />
<br />
回到辦公室,發現 nan 還有 ryan 還在呢!跟 ryan 兩個人用阿喵的外出籠鋪了小貓的床,底下是電毯。然後跟 nan 兩個人開始手忙腳亂的泡奶粉,餵小貓。我嘗試餵,但好像不太成功 Q_Q 後來都是給 nan 餵的,可能 nan 是女生,比較會帶小孩吧,小貓真的有吃喔,喉嚨有做出吞嚥的動作。雖然只吃了一點點,四隻貓好像才吃了幾 cc 吧。然後把小貓放進暖暖的床,四隻就奎在一起睡了,好可愛喔,剛剛還是這麼餓的樣子一直叫的樣子,現在卻是吃飽飽了,然後睡在暖暖的床舖裡面。四隻堆在一起,腹部起伏起伏的,好像很舒服的樣子,摸了一下身體,溫度好像比較好了。就這樣睡了。<br />
<br />
十二點多了,我回家,順路把 nan 也送回去。回家洗澡,想說洗完以後再跑來。這樣半夜如果貓貓肚子餓了,叫了,我就可以馬上餵他們吃飯。騎車回去的路上,我一直在想,怪不得有些貓中途,送養貓咪的時候,會對飼主的身份要求這麼多,如果是我這樣捧在手上帶大的,我一定也會希望小貓遇到的主人要對他很好,那是我捧在手心上的寶貝捏!怎麼可以讓人欺負!雖然沒當過父母,不過那瞬間好像可以體會一點點當父母的感覺,好像可以理解,為什麼以前遇過的一個很嚴厲的教授,在當了媽媽以後,整個眼神都改變了,那個當下我覺得我也有改變喔。真的。<br />
<br />
回到家起完澡。東摸摸西摸摸,結果 muting 打電話來了,說他到了辦公室,叫我也趕快去吧,他說聽到小貓一直叫,我說應該是因為小貓餓了。我收收東西就出發了,大概快三點的時候到了辦公室。打開小貓的籠子,看他們睡的好靜喔…<br />
<br />
太靜了…怎麼沒動…沒有起伏…<br />
<br />
血、跟糞便。貓吐血了,也拉肚子。兩隻已經不會動了。還有兩隻,正在很痛苦的呼吸著。為什麼?才不過兩個多小時。怎麼會?剛剛還是吃很飽的,在那邊呼呼大睡,為什麼,我做錯了什麼事情嗎?哪邊出錯了?不懂。<br />
<br />
小貓很痛苦,大口的喘著氣,我跟 muting 一人捧著一隻,小貓大口大口的,一口一口的喘氣,呼吸的間隔,越來越長。一開始是一秒一次,幾分鐘以後,變成幾秒一次,幾分鐘以後,變成十秒一次,幾分鐘以後,變成一分鐘一次,然後五分鐘,然後十分鐘。我就捧著他們,等著他們下一次的呼吸。一直等,不知道等了多久,我就接受了,沒有下一次的呼吸了……<br />
<br />
實在無法讓 nan 知道小貓死的這麼慘,nan 知道的話一定會哭死的。趁著天亮之前,把小貓的屍體處理掉,奶粉跟奶瓶藏到包包裡。跟 nan 說小貓被當作中途的朋友領走了……<br />
<br />
第三天中午<br />
<br />
拿著電毯,還有奶粉、奶瓶,去醫生那邊,走進醫院「醫生,這個還你」「用不到了?」「嗯…」「四隻都?」「嗯…」「盡人事了,本來就很難,不要難過,有救有機會」「嗯…」把奶瓶跟奶粉都給了醫生「醫生,這我用不到了,可以給你嗎?」「可以」「如果有人抱著小貓來,那就是有緣,這可以給他們」「嗯…如果有有緣人的話…」<br />
<br />
想了想,當初醫生說「我先借你一個,你真的有需要再買…」當時我還聽不懂,為什麼會不需要?當然需要阿,原來是這樣…醫生一定早就知道了吧…蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com2tag:blogger.com,1999:blog-8461549482861441801.post-11376497752372759112014-09-07T12:37:00.001-07:002014-09-08T10:11:50.833-07:00Effective Modern C++ 筆記:Type Deduction 規則一邊讀<a href="http://shop.oreilly.com/product/0636920033707.do">《Effective Modern C++》</a>一邊作筆記 = =||<br />
<div>
太複雜了,一定會忘記</div>
<span style="font-size: x-large;"><br /></span>
<span style="font-size: x-large;">C++ 總共有三種 Type Deduction</span><br />
<div>
</div>
<h3>
<span style="color: #3d85c6; font-size: large;">I. template argument deduction</span></h3>
<div>
<span style="color: #674ea7; font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="color: #674ea7; font-family: Courier New, Courier, monospace;">template < typename </span><span style="color: #e06666; font-family: Courier New, Courier, monospace;">T </span><span style="color: #674ea7; font-family: Courier New, Courier, monospace;">></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #674ea7;">void f(</span><span style="color: #e06666;"><i>ParamType</i></span><span style="color: #674ea7;"> param);</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #674ea7;">f(</span><span style="color: #e06666;"><i>expr</i></span><span style="color: #674ea7;">); </span><span style="color: #e69138;">// 從 expr 推導 T 跟 Param</span></span></div>
<div>
<br /></div>
<div>
template argument deduction 有三種 case</div>
<h4>
1. ParamType 是 pointer 或 ref,但不是 universal ref</h4>
<div>
<ul>
<li>如果<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">expr</span> </i></span>是 ref,把 ref 拿掉</li>
<li>pattern-match,導出<span style="font-family: Courier New, Courier, monospace;"> <span style="color: #e06666;">T </span></span>跟<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">ParamType</span></i></span></li>
</ul>
</div>
<h4>
2. ParamType 是 universal ref(就是有 && 的形式)</h4>
<div>
<ul>
<li>如果<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">expr</span> </i></span>是 lvalue,那<span style="font-family: Courier New, Courier, monospace;"> <span style="color: #e06666;">T</span> </span>跟<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">ParamType</span> </i></span>都導成 lvalue ref</li>
<li>如果<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">expr</span> </i></span>是 rvalue,那就跟平常一樣(平常一樣是啥?)</li>
</ul>
</div>
<h4>
3. ParamType 不是 pointer 也不是 ref</h4>
<div>
<ul>
<li>如果<span style="font-family: Courier New, Courier, monospace;"><i> <span style="color: #e06666;">expr</span> </i></span>是 ref,把 ref 拿掉</li>
<li>ref 拿掉之後,如果 expr 是 const/volatile,也拿掉</li>
</ul>
</div>
<div>
另外,array 跟 function 會退化成 pointer</div>
<div>
<h3>
<span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"><br /></span></h3>
<h3>
<span style="font-size: large;"><span style="color: #3d85c6;">II.</span><span style="color: #3d85c6;"> </span><span style="color: #3d85c6;"><span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> auto </span> deduction</span></span></h3>
</div>
<div>
跟 template argument deduction 幾乎一樣,除了初始化的時候對待 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> {...} </span> 不一樣,<span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> auto </span> 會把 <span style="background-color: #d9d2e9;"><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: Courier New, Courier, monospace;">{...}</span><span style="font-family: 'Courier New', Courier, monospace;"> </span></span> 推導成 <span style="background-color: #d9d2e9;"><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: Courier New, Courier, monospace;">std::initializer_list</span><span style="font-family: 'Courier New', Courier, monospace;"> </span></span>,但 template argument 無法推導 <span style="background-color: #d9d2e9;"><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: Courier New, Courier, monospace;">{...}</span><span style="font-family: 'Courier New', Courier, monospace;"> </span></span></div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">auto a = {1, 2, 3}; <span style="color: #b45f06;">// a 是 std::initializer_list<int></int></span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">f({1, 2, 3}); <span style="color: #b45f06;">// 編譯失敗,無法推導 T</span></span></div>
<h3>
</h3>
<h3>
<span style="font-size: large;"><span style="color: #3d85c6;">III.</span><span style="color: #3d85c6;"> </span><span style="color: #3d85c6;"><span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype </span> deduction</span></span></h3>
<div>
什麼就是什麼</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">const int a = 7; // decltype(a) 就是 const int</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">const int& b = a; // decltype(b) 就是 const int&</span></div>
<div>
<br /></div>
<div>
<span style="background-color: #d9d2e9;"><span style="font-family: Courier New, Courier, monospace;"> decltype </span></span> 最常用來作的,就是用來傳遞「原原本本的型態」,比方說你有一個 wrapper function,需要 perfect forward,然後 return value 的型別也要一五一十的反應出來,那你的好朋友就是 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype </span>。</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">template < typename F, typename ... Args ></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">auto func_timer(F&& f, Args&& ... args)</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">-> decltype(f(std::forward<args>(args)...))</args></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> auto begin = time();</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">decltype(f(std::forward<args>(args)...))</args></span><span style="font-family: Courier New, Courier, monospace;"> result = f(std::forward<args>(args)...);</args></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> std::cout << time() - begin << std::endl;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> return result;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">func_timer(foo, 1, 2, 3);</span></div>
<div>
<br /></div>
<div>
因為 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> foo </span> 的 return value 有可能是 reference,人家有可能寫</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">func_timer(foo, 1, 2, 3) = bar;</span></div>
<div>
<br /></div>
<div>
所以連 referenceness 也要保留,所以要用 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype </span>。但那一大長串實在太麻煩,所以 C++14 提供 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype(auto) </span>,讓你可以簡單</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">template < typename F, typename ... Args ></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b><span style="color: #cc0000;">decltype(auto)</span></b> func_timer(F&& f, Args&& ... args) {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> auto begin = time();</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> <span style="background-color: white; color: #cc0000;"><b>decltype(auto)</b></span> result = f(std::forward<args>(args)...);</args></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> std::cout << time() - begin << std::endl;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> return result;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
</div>
<div>
<br /></div>
<div>
喔,使用 <span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype(auto) </span> 的時候還有一個特例要記住。<span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype(auto) </span> 有兩條規則:</div>
<div>
1. 如果遇到單單一個 name 的 lvalue expression,<span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype(auto) </span> 就是那個 name 的型別</div>
<div>
2. 如果不是單單一個 name 的 lvalue expression,<span style="background-color: #d9d2e9; font-family: Courier New, Courier, monospace;"> decltype(auto) </span> 帶有 ref</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">decltype(auto) f1() {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> int x = 0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> return x; <span style="color: #b45f06;">// decltype(auto) 是 int,所以 f() 也是 int</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">decltype(auto) f1() {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> int x = 0;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> return <b><span style="color: red;">(x)</span></b>; <span style="color: #b45f06;">// decltype(auto) 是 int&,所以 f() 也是 int&</span></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div>
<br />
<h3>
2014/09/09 更新</h3>
<br />
因為有讀書有學到新東西,又感覺已經很久沒寫一些比較深的 C++ 了,所以中秋節剛好來<a href="https://github.com/yocox/cpp14util/blob/master/variant.hh">自幹一個 variant (github repo)</a>。</div>
</div>
</div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-17765616998604007372014-08-26T17:03:00.000-07:002014-08-26T17:03:49.322-07:00我是「媽寶級白目」突然發現自己不知道從什麼時候開始,<br />
已經變成所謂一直發政治文的「政治魔人」了……<br />
<br />
還記得以前覺得政治很無聊、很髒、不該碰……<br />
覺得會去看政論節目的人腦袋都有問題……<br />
<br />
從學校畢業以後進入業界,<br />
然後發現這個業界有著很病態的超時工作文化,<br />
雖然我自己沒遭到壓榨,但我開始注意勞工權益,<br />
參加了電子電機資訊工會,然後開始慢慢了解「爭取」是什麼。<br />
<br />
然後第一次去了抗議現場,<br />
發現即使我們工會人不多,<br />
但每次活動總有很多其他的社運團體會來支援我們。<br />
<br />
然後第一次去了遊行活動,<br />
然後才知道原來早就有很多人已經在街頭上努力了這麼久,<br />
然後知道我們也應該在別的活動去支援別人。<br />
然後知道在這個支援別人的過程,<br />
我們也了解了別人所面臨的,別的社會議題。<br />
<br />
然後慢慢知道了一些歷史課本不會寫的東西,<br />
然後慢慢知道了一些新聞媒體不會報的東西,<br />
然後真正體會了當初曾華璧老師在課堂上講的東西。<br />
然後突然之間,那是一個相變的過程,很快速,<br />
我的想法在很短的時間裡面蛻變的很快。<br />
我想那也許就是「公民覺醒」。<br />
<br />
我還記得以前有一次看到李敖在電視上說:<br />
<br />
一個真正民主的國家,投票率不會太高,<br />
如果投票率很高,代表政治對人民生活的影響非常大,<br />
『我支持的候選人沒上,我要去自殺!』這是不對的!<br />
民主社會的話,誰當選,對百姓的生活都不應該差太多,<br />
如果一個社會裡面『誰當選』差很多的話,<br />
那這個社會就不民主。<br />
<br />
當時我的想法是:<br />
<br />
說的真好,那些對政治很投入的人真是白痴,<br />
台灣就是因為有你們這些人,才顯得台灣不民主。<br />
<br />
現在想想當時真是愚蠢的不可思議。<br />
不是因為他們的投入,才顯得台灣的不民主,<br />
而是因為台灣不民主,害得他們不得不投入。<br />
<br />
想到讀 Game Theory 講選舉的時候,裡面提到兩種模型,<br />
一種是候選人可以選擇要提出什麼政見的模型,<br />
一種是候選人無法選擇要提出什麼政見的模型。<br />
第二種是因為政見不一定會履行,候選人完全可以胡說亂騙,<br />
所以他的政見應該是他過去作了什麼,不是現在說了什麼。<br />
而理智的公民是有記憶的,我們會記得你過去的為人處事,<br />
所以實際上,候選人無須提出政見,<br />
我們看你過去作了什麼,就知道你未來想幹麻。<br />
<br />
兩種模型當然都跟現實有些距離,但還是很有啟發性,<br />
<div>
特別是第二種,實質是遠比第一種好的多,</div>
<div>
現實若偏向第一種,代表選民都是健忘的,</div>
<div>
現實若偏向第二種,而候選人就無法欺瞞選民。</div>
<div>
但要作到第二種的前提,是選民必須要長期的關注政治,</div>
<div>
知道那些人到底在幹麻,而不是等到快要選舉的時候,</div>
<div>
才看看選舉公報、甚至不看選舉公報就投票了。</div>
<div>
<br /></div>
<div>
如果是這種狀況,</div>
<div>
那那些選民不過就是四年投一次票政治植物人罷了,</div>
<div>
他們根本不會思考,也沒有記憶,</div>
<div>
他們有民主的權利,卻沒有民主的能力。</div>
<div>
他們胡亂的投票,結果卻是大家一起背負的。</div>
<div>
讓所有人一起承擔選出惡劣候選人的責任。</div>
<div>
<br /></div>
<div>
這是不對的。</div>
<div>
<br /></div>
<div>
所以,如果你有投票權,</div>
<div>
那麼,關注政治,就是你的社會責任。</div>
<div>
因為你的那一票會影響別人,</div>
<div>
放空亂投,是讓別人在背負你本來應該背負的責任。</div>
<div>
<br /></div>
<div>
請面對這個事實:「台灣,不是一個民主國家」,</div>
<div>
選錯人,很嚴重,請關注政治,負起你的社會責任。</div>
<div>
<br /></div>
<div>
「太辛苦了,而且很沈重」你說</div>
<div>
<br /></div>
<div>
所以大家要看我的臉書。</div>
<div>
<br /></div>
<div>
每天都有又酸、又靠北、又北七的苦中作樂政治文,</div>
<div>
把沈重跟嚴肅寄託在低能跟歡樂當中,</div>
<div>
我發現我的文章越來越像國寶級白目了,</div>
<div>
我真的有夠白目,不過我不到國寶等級,那就媽寶好了,</div>
<div>
以後請大家叫我「媽寶級白目」。</div>
蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-47387152893664250322014-05-02T14:22:00.002-07:002014-05-02T14:22:59.024-07:00幫 BBS client 加上黑名單的功能一開始嘗試從 PCMan 下手去改,但遇到幾個問題:<br />
<ol>
<li>PCMan 要 MFC,MFC 要錢,我沒有 MFC</li>
<li>PCMan 的 code 有點難懂,看不懂很懂 Q_Q</li>
<li>PCMan 只能在 windows 上面</li>
</ol>
於是放棄。<br />
<br />
接著嘗試 PCManX,但發現 windows 上面要跑 GTK+ 也有點麻煩 >"<~<br />
放棄。<br />
<br />
然後嘗試自己從頭手動打造,為了跨平台,決定用 Qt,就開始動手,寫著寫著,突然想到「不對,應該有人作過同樣的事情…」於是再繼續 survey,發現果然有個叫做 <a href="http://www.freegroup.org/2013/10/qelly/">Qelly</a> 的 telnet client,看了一下 code,用 Qt,<a href="https://github.com/uranusjr/Qelly">有 open source 放在 github 上面</a>!程式碼品質也不錯,似乎不難修改。於是就開始動手 :P<br />
<br />
弄了 24 小時以後,有一點初步的結果 XD<br />
<br />
目前可以在「文章選單」跟「串接」的時候把特定作者的文章抹黑,但「文章內容」還沒辦法過濾,這樣就沒辦法在用 =, [, ] 瀏覽文章的時候時候過濾文章。希望這個週末可以完成蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-19285625150662390492014-03-19T08:51:00.000-07:002014-03-19T10:06:23.788-07:003/18深夜 ~ 3/19早晨服貿立法院公民運動第一線經歷3/18 夜晚,已經要上床睡覺了,收到朋友的消息說立法院有事。上網看了一下,氣到睡不著,3/19 一點半,決定衝去現場。
<p>
<h3>零、地圖</h3>
</p>
<p>
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d903.6792830914518!2d121.52022899999999!3d25.04367190000001!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3442a973dbff071f%3A0x3ce37cd95c83d928!2z56uL5rOV6Zmi!5e0!3m2!1szh-TW!2stw!4v1395242918305" width="600" height="450" frameborder="0" style="border:0"></iframe>
</p>
<p>
<h3>一、初到現場,濟南路</h3>
</p>
<p>
停好車,走了一段路,聽到有人在喊話,我猜是現場,走過去,看到很多人。坐下來聽了快半個小時,不知道自己來幹嘛的,就有點想要走了,因為還要上班。這時候突然聽到募集「要找五十個人去青島東路支援」。我想說好吧,好歹有個目標,就趕快舉手跑去,結果發現帶隊的人是黃國昌耶!我因為跑很快,所以就在他正後方,一直跟著他走,聽他聲音,他嗓子已經完全啞了。
</p>
<p>
<h3>二、主戰場,青島東路</h3>
</p>
<p>
到了之後,發現很多人都在馬路上坐著,一樣是聽講話,聽聽聽聽聽聽聽,過程一直強調「警察不動,我們不動」但警察如果動了,我們就會行動,一直聽,聽了差不多一兩個小時,快四點吧,一直被蚊子咬,我又想要回家了,就一邊按耐住蚊子咬,一邊睡覺,睡著睡著……突然聽到「<font color="red">警察攻堅了!</font>」
</p>
<p>
<blockquote>
「警察不動,我們不動!現在警察動了,我們要不要去救我們的夥伴?」<br/>
「要!」<br/>
「好,大家翻過去。」
</blockquote>
</p>
<p>
幹!頓時睡意全消!包包往背上一甩,三兩步就跳上去,因為我的位置就在牆邊,翻牆進去的很早,一下就衝到最前線!被警察擋住,但警察因為被我們衝,所以也放棄攻堅了,我們就 hold 住。
但這個時候還沒衝到樓梯上。樓梯是警察的地盤。樓梯下面被警察團團圍住。就坐下來開始睡覺,這個時候已經不想走了,決定呆到天亮。
</p>
<p>
睡著睡著,又聽到「警察拖人了!」
</p>
<p>
看過去,從窗戶看到裡面警察正在拖人,一個小女生被一群警察抓住!動作很大,他媽的很粗暴,而且因為就在窗邊,看得很清楚,女生往窗戶邊掙扎,一直想要掙脫,但是被警察抓住!這時候窗戶邊的民眾衝上去也把警察抓住!兩邊拉扯很久!現場超級火爆的!非常吵鬧!那時候所有的聲音都混在一起!不時可以聽到「警察打人了!!」然後就會聽到更多的怒吼聲,非常可怕。透過窗戶可以看到裡面的警察不時有拖人的動作,好幾個人被抓。
</p>
<p>
後來警察又幹了一件很蠢的事「把窗簾拉上」才拉一半,就被人發現<br/>
</p>
<p>
「警察拉窗簾!!」<br/>
「拉個屁阿!怕人看嗎!!」<br/>
</p>
<p>
結果警察也隔著窗戶跟民眾對罵!立刻有人衝上去把窗簾抓住,不讓警察關上,警察也把窗簾抓住!結果整條窗簾被扯下來,看光光了。
</p>
<p>
結果過沒多久,警察又攻堅了,幹!馬上爬起來!衝!警察被沖退!退到門口裡面樓梯被我們攻下來了,但進不了門。
</p>
<p>
這時候開始就隨時都很緊張,根本無法休息,警察一直有動作,一直有動作,每次警察有動作,我們就往裡面擠,但裡面警察密度太高,根本擠不進去
</p>
<p>
突然有人喊「把警察拉出來」<br/>
警察一聽到這句,立馬有反應「敢拉警察!我就抓人!」<br/>
看樣子警察真的會怕拉,不怕推。
</p>
<p>
但說要抓人這句,有嚇到人,嚇到大概安靜了一秒鐘吧
</p>
<p>
「抓就抓阿!」<br/>
「抓我阿!」<br/>
「抓我!我第一個!」<br/>
「我第一個!」<br/>
「把警察拉出來!!!!!!!!!」<br/>
</p>
<p>
大家衝上去拉了,天哪…門口那個警察一看,靠北,這些人不怕!立馬兩手兩腳撐住門框,結果大家就開始拉警察!警察後面兩個人抱住他,兩個人後面又好幾個抱住他們,就像是一串葡萄,然後你摘最下面的那一顆。
</p>
<p>
「拉!拉!拉!」結果就拉出一顆警察,然後警察就被接力的拖出去,就像滑板一路滑出去一樣。一片混亂當中還有人偷打警察,結果偷打警察的人也立馬被旁邊的人打!
「打什麼警察阿!人民是警察的保母!」
</p>
<p>
最後發現不管推拉都沒用,太難把警察清除了。且那時候警察已經停止攻堅了,黃國昌就叫大家冷靜,休息。
</p>
<p>
以上這樣衝突、休息重複了好幾次。不知不覺竟然已經七八點了。
</p>
<p>
黃國昌老師現場開了記者會,描述了訴求:
<ol>
<li>馬英九道歉、江宜樺下台</li>
<li>服貿退回</li>
<li>警察撤出立法院</li>
</ol>
</p>
<p>
<h3>三、中山南路,立法院正門口</h3>
</p>
<p>
然後我就離開準備去洗澡上班了,從青島東路,經過中山南路,準備要去牽車的時候,經過立法院大門口,看到門口也有警察跟民眾對峙。警察在立法院門口裡面,民眾在外面,看起來沒什麼事,很和平
我就繼續往前走,走過去之後,突然聽到很大聲的騷動。轉頭一看!幹!警察衝出來了!!好多!!好多!!!!!!!!兩群人直接衝撞在一起!!!!!!!
</p>
<p>
媽啦!衝上去再說!就跟拿盾牌的警察在那邊對衝!擠在第一排!死命的推!!!幹!可是警察人真的超多,力氣真的超大的!!被推的一直後推!我面前那個拿盾牌的,是一個蠻年輕的警察,臉色感覺已經很差了。我不管怎麼推都推不動,突然想到剛剛「用推的沒用」我就抓住他的盾牌,有幾個人也跟著我抓盾牌!那警察瞬間暴怒!整個眼神馬上改變,動作超大的!整個就是真的殺紅眼的眼神!抓住盾牌就大力往眼前的民眾身上揮,差點打到一個媽媽!我一看,他媽的!
</p>
<blockquote>
我操你媽的你在幹嘛阿?你他媽的真的殺紅眼了阿?!<br/>
幹!你演演戲也就算了,你現在是他媽的真的要打人阿?!<br/>
你現在到底在幹嘛!?你在幹嘛!?你知不知道自己在幹嘛?!<br/>
</blockquote>
<p>
我把他盾牌剝開,衝到他面前,只著他一直罵,罵到他好像有點龜了……<br/>
盾牌放下了……然後我們就衝上去繼續抓他的盾牌 = =
</p>
<p>
另外一個警察,盾牌一被另外一個人抓,立馬就「不准抓我的盾牌」超兇的!我一看到,就跑過去「怎樣!抓我逆?」然後就一起搶他盾牌,但都沒搶到 = =
</p>
<p>
後來持續對衝了幾分鐘以後,雙腳快軟掉了,我就想說「幹,我要回家洗澡上班了」就轉身離開。
</p>
<p>
才一轉身,手就被抓住,轉身一看,是一個女生,因為氣力放盡,累到臉都扭曲了。<br/>
一手推著警察的盾牌,一手抓住我:「你是男生…力氣大…」
</p>
<p>
……………幹!!!!!!!<br/>
只好轉過身再衝!!!!!!<br/>
又衝了不知道多久,警察停止推進了,我猜我的臉也跟女生剛剛一樣扭曲
</p>
<p>
終於可以回家了,結果忘記車停在哪,找了十五分鐘才找到,腳都快走不動了。
</p>
<p>
強烈建議大家一定要站到第一排搖滾區,體驗一下
</p>
<p>
<h3>感想</h3>
</p>
<p>
沒寫到感想?感想就是很想哭。
</p>
<p>
現場絕大部分的時間都很和平,但偶而會有非常火爆的場面出現。每次發生推擠的時候,我都很想哭,很生氣,氣為什麼同樣都是老百姓,卻要站在陣線的兩邊。
<p>
可以的話,民眾也想在這個時間躲在棉被裡面睡覺,而不是衝到這個地方,用盡全力的跟本來應該是保護自己的警察對峙跟衝撞。
</p>
<p>
可以的話,警察也想躲在家裡面睡覺,陪伴老婆跟孩子,而不是在死命的去把正在行使公民義務的學生拉出來,但又害怕傷害到任何人,而且如果被打還不能還手。
</p>
<p>
而真正該為這些事情負責的人,卻躲在棉被裡面睡覺,睡得很開心。
</p>
<p>
但為什麼民眾還是要站出去,因為如果我們不站出去,那些人永遠都可以作他們想做的事情且不用付出任何代價
</p>蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com2tag:blogger.com,1999:blog-8461549482861441801.post-76113570666972213662013-08-17T01:11:00.000-07:002013-10-30T03:35:08.341-07:00最近浪費很多時間打魔力寶貝 = =||最近又跑回去玩魔力寶貝<br />
<br />
因為很懶惰,所以不想自己練等級等技能,就寫了 bot,讓 bot 自己練等級、戰鬥技能、採集材料、製作裝備跟料理、打魔石賣 npc 賺錢等等。<br />
<br />
<h3>
單一 bot</h3>
<br />
我發現有 bot 以後,遊戲變得好玩多了(不要戰我 XD)我下午把 bot 開好,人跑出去找未來的配偶欄約會,晚上回到家以後,錢多了十幾萬,就可以拿去買裝備、料理、藥水。然後就可以出任務去打魔王了,遊戲真好玩阿(好像有點諷刺?)<br />
<br />
一開始我的 bot 只能自己一個人活動,沒辦法組隊,但是魔力寶貝不組隊,能去的地方就很有限,因為比方說 50 級的人物,不組隊的話,一個人頂多走到怪物等級平均 30 的地方,再上去就沒辦法了,會死。但 50 級的人物打 30 的怪物,其實幾乎沒有什麼經驗值,而且 30 的地方,收入也很有限。講有限其實也不對,因為他全自動,我去睡覺十個小時,他就打了十個小時,每小時的收入雖然低,但重點是「持續不斷」,後來我發現這「持續不斷」是很恐怖的事情,因為不管你在睡覺還是在上班,他都在賺錢。基本上賺錢的速度是超過花錢的速度的,沒幾天,我的金錢就到達單一人物的上限了,開始放到別人的身上去。<br />
<br />
<h3>
三隻 bot 組隊</h3>
錢可以一直增加,但等級還是原地踏步。<br />
<br />
接下來我嘗試改進 bot,希望我的 bot 可以彼此溝通,可以組隊。這個開發的過程,當初在交大修的「分散式演算法」在這邊…完全沒有派上用場!因為即使多隻 bot,也都還是跑在同一台電腦上,架構很簡單,並不是分散式系統。我有一隻中央的 Mastermind 監控所有人活動的,由他統一規劃協調所有人的動作。經過一陣子的開發以後,我可以成功組隊,協同動作了。現在 50 級的人物,三隻組隊,我可以去到有 4x 級怪物的地方練等級。<br />
<br />
為什麼三隻?因為遊戲限制了多重開啟遊戲的上限,就是三個。<br />
<br />
但遊戲內容的設計,一個隊伍最多五個人,也就是說,如果你能五個人組隊,基本上,遊戲內所有的場景你都可以去了。因為他的難度不會設計成五個人都還沒辦法打。那限制你只能三開,你就只能某個程度的「自己玩自己」,因為凡是重要的任務,沒有五個人是沒辦法解的。這樣就強迫你跟別人互動了,個人認為這是很正確的設計,線上遊戲就是要跟別人一起玩嘛(最早只能一開,強迫你要跟另外四個人互動 XD)。<br />
<br />
<h3>
五隻 bot 組隊</h3>
<br />
問題是我是 bot,我沒辦法跟別人互動。所以凡是重要的任務我都不能解 XD<br />
<br />
而且只有三個人的話,能去的地方還是比較受限,只能挑怪物等級稍低的地方,等級經驗值的提昇還是很慢的,但想要突破這點的話,接下來就真的要靠破解的了。<br />
<br />
<h4>
執行檔 instance 三開上限</h4>
<br />
首先,我發現他開第四隻程式的時候,會跳出一個對話框<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFZI9NNviYg6KMVPwWMmN045JH6-4Bi1hKlCmOHfvJP4zyv5G4w4Ic_bAPvEuToR5SbSjwTvrkkvl7g0IWL9_Lt0ZPOLW55n67VzhAPsOFj5FLi1wTDHuvb02nUrIR_mtTd768_6zf0Q/s1600/%E5%B7%B2%E7%B6%93%E9%81%94%E5%88%B0%E6%9C%80%E9%AB%98%E9%99%90%E5%88%B6%E5%A4%9A%E9%96%8B%E6%95%B8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFZI9NNviYg6KMVPwWMmN045JH6-4Bi1hKlCmOHfvJP4zyv5G4w4Ic_bAPvEuToR5SbSjwTvrkkvl7g0IWL9_Lt0ZPOLW55n67VzhAPsOFj5FLi1wTDHuvb02nUrIR_mtTd768_6zf0Q/s1600/%E5%B7%B2%E7%B6%93%E9%81%94%E5%88%B0%E6%9C%80%E9%AB%98%E9%99%90%E5%88%B6%E5%A4%9A%E9%96%8B%E6%95%B8.png" /></a></div>
<br />
經過在強者雲集的 plurk 上面請教以後,決定使用有免費版本的 OllyDbg 來進行破解的動作。雖然還有更強的 debugger,但要收錢,因為我沒有錢,所以我決定暫時先尊重一下智慧財產權。使用 OllyDbg 執行遊戲主程式,當然,馬上就跳出了上面這個對話框。回到 OllyDbg 的視窗,按下快速鍵 <span style="font-family: "Courier New", Courier, monospace;"><span style="background-color: #0b5394;"><span style="color: white;"> F12 </span></span></span>,中斷遊戲的執行。然後看看 call stack。根據我的<span style="color: red;">想像</span>,遊戲的程式碼應該是有一段類似這樣的<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">if(check_exceed_multi_inst_limit()) {</span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;"> MessageBox("</span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">已經</span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">達到</span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">最高限制多開</span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">數</span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">");</span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="color: #38761d;">}</span></span><br />
<br />
這個時候,CPU 會執行到 MessageBox 這個 system api 裡面,然後在裡面等待,理論上,我只要往 call stack 往上走幾步,應該就可以看到條件判斷的地方。於是我在 OllyDbg 裡面按下 <span style="font-family: "Courier New", Courier, monospace;"><span style="background-color: #0b5394;"><span style="color: white;"><span style="background-color: #073763;"><span style="background-color: #0b5394;"> ALT-K </span></span></span></span></span> 叫出 call stack 視窗。看到如下<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzyg5RNWy_bw1sX8fwIZGP4rnAtU3MSdcL69-qSWWyxEUJvch_cv1lhtvk4BK-7CvnRM0IUNgtp19I0hf8sxsUeNREbIzyEckF2Jg2MPCZ5MebaR859mQrqGSv2UeSbNU4W1E7SeUewI/s1600/call-stack.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzyg5RNWy_bw1sX8fwIZGP4rnAtU3MSdcL69-qSWWyxEUJvch_cv1lhtvk4BK-7CvnRM0IUNgtp19I0hf8sxsUeNREbIzyEckF2Jg2MPCZ5MebaR859mQrqGSv2UeSbNU4W1E7SeUewI/s1600/call-stack.png" /></a></div>
<br />
看到 <span style="color: white;"><span style="background-color: #999999;"><span style="background-color: #666666;"><span style="font-family: "Courier New", Courier, monospace;"> [Called from] </span></span></span></span> 那欄,可以看得出來,灰色那條,還屬於遊戲的部份,再追進去就是 system api 的部份了,於是我就雙點灰色 Called from 那欄,程式跳到了呼叫 MessageBox 的地方。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbfi-g1Kqguo7Vx3dolIhfxloWo9VkJjwueaIHrMSI6KMqQU-p4QDz_Z45tOs5ZnG-u-jaMoAwfJHD1sHChlorAOi2Zn49SdkHSIoZ6DTOccSwi0IvhVxARZoRtPo8DTwe3wHoREAJlTQ/s1600/callmsgbox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbfi-g1Kqguo7Vx3dolIhfxloWo9VkJjwueaIHrMSI6KMqQU-p4QDz_Z45tOs5ZnG-u-jaMoAwfJHD1sHChlorAOi2Zn49SdkHSIoZ6DTOccSwi0IvhVxARZoRtPo8DTwe3wHoREAJlTQ/s1600/callmsgbox.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<br />
我已經加上註解了,可以看到呼叫檢查函數的地方,還有 if 的點,<span style="color: white;"><span style="background-color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;"> JE </span></span></span> 就是 jump if equal,如果成立的話,就會跳過 MessageBox() 的部份,所以我猜我要改的就是他,把他從 <span style="font-family: "Courier New", Courier, monospace;"><span style="color: white;"><span style="background-color: #274e13;"> JE </span></span></span> 改成 <span style="font-family: "Courier New", Courier, monospace;"><span style="color: white;"><span style="background-color: #274e13;"> JMP </span></span></span>,無條件跳躍。雙點那段程式碼 OllyDbg 就會跳出組譯視窗,讓你修改那段組合語言。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaK7_KDn3Y9R7ORszWYlSNuU3rPtQOC_yjVa_8NVsvxPxuVkTqZ_f9_FdOiPCctE0bSH5BENI8XPqTF5MYoW_BH4QCw50z-uQEjXnxuh0NJTuJU4q8oygesYFzJQg3N6MY-Zg2rGIyz8/s1600/je.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaK7_KDn3Y9R7ORszWYlSNuU3rPtQOC_yjVa_8NVsvxPxuVkTqZ_f9_FdOiPCctE0bSH5BENI8XPqTF5MYoW_BH4QCw50z-uQEjXnxuh0NJTuJU4q8oygesYFzJQg3N6MY-Zg2rGIyz8/s1600/je.png" /></a></div>
<br />
改成<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCnOnlzT6RhEYhYNYzf6ZJNvytwC5TvYzFvPre_v-NcViVqJnqP11AR0x_sjLxieRczelCFTmdiTTaDQG-htAfRfJi7pHuo3O0lgZlQ6Paqvl8rS09FJ_fz6MR5qeI4NtnZ8jg5qaXAQ0/s1600/jmp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCnOnlzT6RhEYhYNYzf6ZJNvytwC5TvYzFvPre_v-NcViVqJnqP11AR0x_sjLxieRczelCFTmdiTTaDQG-htAfRfJi7pHuo3O0lgZlQ6Paqvl8rS09FJ_fz6MR5qeI4NtnZ8jg5qaXAQ0/s1600/jmp.png" /></a></div>
<br />
然後把改過的東西存起來<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLs5xsSKdIghczh_BVvAL1cOQrtx9gpHLOL3GGwhHWAiY632yu1OihZYByG2-puN0fxA94ID1ulHrv3n5-xl4N-7nBnyLJb-TLGt5Aq2Pnj5-nYQKOEbVCf7WFvVqoWZaT5wifiLlUhNo/s1600/copytoexe.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLs5xsSKdIghczh_BVvAL1cOQrtx9gpHLOL3GGwhHWAiY632yu1OihZYByG2-puN0fxA94ID1ulHrv3n5-xl4N-7nBnyLJb-TLGt5Aq2Pnj5-nYQKOEbVCf7WFvVqoWZaT5wifiLlUhNo/s1600/copytoexe.png" /></a></div>
<div>
<br /></div>
<br />
然後再執行一次程式!成功了!這個對話框不再出現了!但下一個跳出來!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoGYLW1F0a7dPL9dvbc4tE9BujXY-2M-AamtMxpC7xM5OAq0c0b9zHqp5Z6ENAEaev5Kl7D_ZgDPAjTU7nwPsMYqhmke3R_l3d1OUoLtVuggrSyVvW3tmbhw2CO7vt8L6b4_AMlpaLbiU/s1600/pilot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoGYLW1F0a7dPL9dvbc4tE9BujXY-2M-AamtMxpC7xM5OAq0c0b9zHqp5Z6ENAEaev5Kl7D_ZgDPAjTU7nwPsMYqhmke3R_l3d1OUoLtVuggrSyVvW3tmbhw2CO7vt8L6b4_AMlpaLbiU/s1600/pilot.png" /></a></div>
<br />
可惡,不知道他是怎麼曉得我沒有透過領航員執行程式的,不管,照剛剛的方法繼續破解他,成功破除了這個檢查,這邊不寫細節了,因為這個方法<span style="color: #cc0000;">是錯的</span>。程式之後繼續跑,跑到一半會說找不到檔案,然後 segfault。我猜想可能是領航員有 pass 某些參數給遊戲主程式。但如果用滑鼠雙點遊戲主程式就拿不到這些參數,所以無法執行。但我要怎麼知道他下了什麼參數?<br />
<br />
我寫了一隻程式,來取代遊戲主程式,他什麼都不作,只會把收到的參數印出來。<br />
<br />
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;">#include </span></span><br />
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;">#include </span></span></div>
<div>
<br /></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;">int main(int argc, char* argv[])</span></span></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;">{</span></span></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;"> std::ofstream fout("args.txt");</span></span></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;"> fout << argc << std::endl;</span></span></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;"> for(int i = 0; i < argc; ++i) </span><span style="font-family: "Courier New", Courier, monospace;">fout << argv[i] << std::endl;</span></span></div>
<div>
<span style="color: #274e13;"><span style="font-family: "Courier New", Courier, monospace;">}</span></span></div>
<div>
<br /></div>
<div>
<br /></div>
抽換遊戲主程式以後,使用領航員執行遊戲,發現竟然無法執行!天哪,人間慘事。原來領航員會去檢查主程式的 hash code,我測了一下,發現他用的是 md5,但是 hash code 是當下從網路上下載的,而且也會檢查領航員自己的 hash,這樣麻煩了,即使我竄改了主程式,我也無法透過領航員執行他,除非……我破解領航員檢查 hash code 的機制……<br />
<br />
接下來這邊真的是很恐怖的組合語言追蹤地獄,我已經不想再重複一次了,直接點重點,破解最重要的就是抓到關鍵的中斷點,不然程式這麼大,你不可能慢慢追。我花了很多時間,發現他是把 md5 下載存到一個檔案裡面,但這個檔案一瞬間就會被砍掉,我想了想,應該要把中斷點下在「建立檔案」的時候,就可以抓到他寫檔的那瞬間,然後看看檔案內容是什麼。<br />
<br />
按下 ALT-E 可以看到所有使用到的 module,選擇遊戲的主程式<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFL1bRazcuR0Bv4nVJ3x-oI8tkiqWl9hNct20EOzf7CNrBYVK8sOHRbkrrl7m5viMtFn2UEQpB2cOCvPUi6XxD90FN3sgemwkilEKfbaIoKCMRNVmmk9eRZcDWYwNsb-A6Su3QextN91o/s1600/executable-modules.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFL1bRazcuR0Bv4nVJ3x-oI8tkiqWl9hNct20EOzf7CNrBYVK8sOHRbkrrl7m5viMtFn2UEQpB2cOCvPUi6XxD90FN3sgemwkilEKfbaIoKCMRNVmmk9eRZcDWYwNsb-A6Su3QextN91o/s1600/executable-modules.png" /></a></div>
<br />
然後列出所有「跨模組的函數呼叫」<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7pVi0YztXQuUkOExT8MZP9L-IbICinlU2pqw-gtG7kkf4smfo0k36YeeS45RqoDhTDcNgEpz7nHMLbXmbpN8DfCGRAFTgBT1WvmQQCv_TSz-kkQy_EenxeX8nGNKx_CZn7bpd46-X5ek/s1600/intermodule-call.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7pVi0YztXQuUkOExT8MZP9L-IbICinlU2pqw-gtG7kkf4smfo0k36YeeS45RqoDhTDcNgEpz7nHMLbXmbpN8DfCGRAFTgBT1WvmQQCv_TSz-kkQy_EenxeX8nGNKx_CZn7bpd46-X5ek/s1600/intermodule-call.png" /></a></div>
<div>
<br /></div>
我們要找 CreateFile 這個 api,打上中斷點。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeNVayPZwwJwv4Dh2zS-o-wOBMDK1m03BeZ_wEZXjUXbBvBUwARY0FhL9Hi3PdRw7bpcAyQNVxUcoweB1FRKmBcXdFAW5NY1UepWFLVziJgDVTr7ChYL_bsWzZpNlRnLPDlTAbofQA7jA/s1600/break-CreateFile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeNVayPZwwJwv4Dh2zS-o-wOBMDK1m03BeZ_wEZXjUXbBvBUwARY0FhL9Hi3PdRw7bpcAyQNVxUcoweB1FRKmBcXdFAW5NY1UepWFLVziJgDVTr7ChYL_bsWzZpNlRnLPDlTAbofQA7jA/s400/break-CreateFile.png" width="400" /></a></div>
<div>
<br /></div>
<br />
稍微跑幾步,讓她把檔案寫好,然後打開檔案來看,發現格式竟然是 INI,太好了,這是一個很大的提示,因為 Windows 有現成的 api 讀取 INI 格式,叫做 GetPrivateProfileXXX()。馬上在 inter-modular-call 裡面找到 <span style="font-family: "Courier New", Courier, monospace;"><span style="color: white;"><span style="background-color: #274e13;"> GetPrivateProfileString() </span></span></span> 這個人,對他打中斷點,然後接下來就是無盡的追蹤地獄,最後終於成功找到三個關鍵點,統統改成 JMP。細節不詳述。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXSpBbY5S3UQUWlnDFiouIx24m-3-BzpRD11DJxoUjJmhzi5t9lGSefOh6V-EXtBsc7VnNsgtVAvwChohdyGA8V9vt2w7x2pwg1e_nzKTbFT6K_NJBXwcMC0qpLkvqNbBbEttBSSzFEBU/s1600/hack-md5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXSpBbY5S3UQUWlnDFiouIx24m-3-BzpRD11DJxoUjJmhzi5t9lGSefOh6V-EXtBsc7VnNsgtVAvwChohdyGA8V9vt2w7x2pwg1e_nzKTbFT6K_NJBXwcMC0qpLkvqNbBbEttBSSzFEBU/s320/hack-md5.png" width="242" /></a></div>
<br /><br />
<br />
現在終於可以成功的跳過 md5 的檢查,順利執行第四個 instance,來登入遊戲!<br />
<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「……………………」<br />
<br />
<b><span style="color: red;">我太天真了,他在 server 端有作檢查!</span></b><br />
<br />
一旦發現來自你這台電腦的連線數目超過三個,就不讓你登入。<br />
<br />
該死,server 是檢查連線來自的 ip 嗎?那我要怎麼生出白花花的 ip?就算我能用別的電腦生出別的 ip,而且一旦跨 ip,就是跨電腦,我就沒辦法讓我的 bot 都跑在同一台機器上,那 bot 的協同部份就必須要加上網路部份的程式碼,複雜度瞬間高很多。<br />
<br />
跟強者我同事 runastorm 討教過後,決定寫一隻 proxy,架在另外一台電腦上,然後遊戲主程式的封包都走這個 proxy,這樣 server 端看到的來源,就是另外一台電腦,也就是 proxy 的 ip。survey 了一下,用 python 寫出一個簡單的 proxy。<br />
<br />
接下來的是要作三件事情:<br />
<ol>
<li>要知道 server 的 ip 到底是多少,這樣 proxy 才能連過去。我使用 <span style="font-family: "Courier New", Courier, monospace;"><span style="color: white;"><span style="background-color: #0c343d;"><span style="background-color: #073763;"> netstat -n -b </span></span></span></span> 以後,順利看到 server 的 ip。</li>
<li>要竄改主程式,讓他連到我跑 proxy 的主機去。</li>
<li>要一個 dispatcher 在前端,當 instance 只有三個的時候,使用本來的執行檔,超過三個時候,使用竄改過 server 位置的執行檔。</li>
</ol>
以上三件事情都不困難,我花了點時間分析到怎麼改他連線的位置。成功,執行第四個 instance!<br />
<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
「連線失敗。」<br />
<br />
<b><span style="color: red;">可惡阿!竟然不是看 ip!</span></b><br />
<br />
浪費我好多時間,可惡,到底看什麼?如果不是看「連線的ip」,難道是遊戲主程式在執行以後,還有把自己的 ip 送過去?server 看的是連線以後送去的資料裡面的嗎?是的話我就完了,因為遊戲封包有加密,我死定了,我試過很多次了,但無法看出他加密的規則,更別說要破解了。看了一下 proxy 的 log,確定連線有成功,來往兩個封包以後連線就被切斷了。看樣子的確是這幾個封包裡面有送資料,檢查不過以後才斷線。但就像剛剛講的,我破不了加密,如果能破的話,我就可以解開,竄改封包,然後再送,但破不了,就沒辦法。<br />
<br />
怎麼辦…<br />
<br />
<b><span style="color: red;">釜底抽薪</span></b><br />
<br />
既然無法竄改已經加密的封包,我竄改還沒加密的總可以吧!遊戲主程式要得到自己的 ip 一定也要呼叫一些系統 api,但不知道是哪個呢?<b>突然想起來!</b>當初在追蹤遊戲主程式的時候,曾經看到他的字串表裡面有一個 <span style="color: white;"><span style="background-color: #0c343d;"><span style="font-family: "Courier New", Courier, monospace;"><span style="background-color: #073763;"> "ipconfig /all > mac.txt"</span></span> </span></span> ,哈!九成是用 ipconfig 拿 MAC 碼,而且我發現他還是透過 system() 這個函數來呼叫 shell。這樣的話,裡論上我只要抽掉這個文字檔就可以了。<br />
<br />
一樣,使用中斷點,把 system() 打住,偷看一下 mac.txt 檔案內容,確定如我所想,裡面只是很單純的 ipconfig /all 的輸出,偷偷把 MAC 的地方改掉幾個字,存檔。<br />
<br />
開啟第四個 instance……<br />
登入……<br />
<br />
<span style="font-size: large;"><span style="background-color: lime;"><b><span style="color: white;"><span style="background-color: #93c47d;"><span style="background-color: #38761d;">「請選擇角色」</span></span></span></b></span></span><br />
<br />
<br />
<span style="font-size: x-large;"><span style="color: white;"><span style="background-color: red;">孝心感動天!!!!!!!</span></span></span><br />
<br />
成果來一張<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUv9mmbnbfPqo2Iuc-tmuTfD8znh8bIIH1A0R4jMIbAFx-FIimQn3yi4Hzst5TN6dv_iOhBaACUFL4mkNsZkF-63lMfAr9LKskefTNxypmGD5nafV-DnlxpKAkX1OMQujupt20ymk9s2o/s1600/%E4%BA%94%E9%96%8B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUv9mmbnbfPqo2Iuc-tmuTfD8znh8bIIH1A0R4jMIbAFx-FIimQn3yi4Hzst5TN6dv_iOhBaACUFL4mkNsZkF-63lMfAr9LKskefTNxypmGD5nafV-DnlxpKAkX1OMQujupt20ymk9s2o/s320/%E4%BA%94%E9%96%8B.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
五個視窗,關鍵資訊都馬賽克掉了 ^O^<br />
<br />
終於,可以來擴充我 bot 組隊的 script 了 :D<br />
<br />
架站的看到不要擋我阿,我只有自己用 Q_Q蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com8tag:blogger.com,1999:blog-8461549482861441801.post-48132993917784540872013-01-10T20:28:00.000-08:002013-01-10T21:49:09.564-08:00C++ enum member function之前重構公司的程式碼,發現一個需求:希望 enum 能有 member function<br />
<br />
現有的程式碼:<br />
<br />
class PrimitiveKind {<br />
enum kind {<br />
VOID,<br />
BOOL,<br />
INT8, INT16, INT32, INT64,<br />
FLOAT32, FLOAT64,<br />
FUNCTION, OBJECT, ...<br />
...<br />
};<br />
<br />
static bool isBool();<br />
static bool isInterger();<br />
static bool isFloat();<br />
};<br />
<br />
整理了一下使用到的情況,大概可以分成三種:<br />
<br />
1. 判斷 isBool, isInterger, isFloat...<br />
<br />
void f(PrimitiveKind::kind v) {<br />
if(PrimitiveKind::isBool(v)) {<br />
...<br />
} else if (PrimitiveKind::isInteger(v)) {<br />
...<br />
}<br />
...<br />
}<br />
<br />
2. enum 的值互相比較<br />
<br />
PrimitiveKind::kind promote(PrimitiveKind::kind a, PrimitiveKind::kind b) {<br />
if (a <= FLOAT64 && b <= FLOAT64) {<br />
if( a > b ) return a;<br />
else return b;<br />
} else {<br />
...<br />
}<br />
}<br />
<br />
3. switch case<br />
<br />
void g(PrimitiveKind::kind v) {<br />
switch(v) {<br />
case PrimitiveKind::VOID: ...<br />
case PrimitiveKind::INT8: ...<br />
case PrimitiveKind::INT16: ...<br />
}<br />
}<br />
<br />
這個 class PrimitiveKind 其實沒有任何 data member,她的角色比較像是 namespace。只是把跟 PrimitiveKind 有關的宣告集合起來。<br />
<br />
我希望能避開 PrimitiveKind::isBool(v) 這種呼叫 static member function 的寫法,直接寫 v.isBool()。<br />
<br />
第一個想法,很直覺想到可以讓 PrimitiveKind 變成一個 wrapper class,持有一個 PrimitiveKind::kind,並且把 static member function isBool() 改成 non-static member function isBool()。這樣我就可以滿足第一個狀況,可以直接呼叫 isBool(), isInteger(), isFloat()。但是卻沒辦法滿足後兩種狀況。因為 wrapper class 沒有 <, >, =, != 等等的 operator,也無法放進 switch。<br />
<br />
第二個想法,我幫 PrimitiveKind 加上 operator overloading,讓他支援一整組的 relational operator,就可以也滿足第二個情況。<br />
<br />
但這個時候我想了想,我應該先列出所有我需要滿足的需求,再來回顧我的設計。整理了一下,我希望我的 wrapper class 滿足以下條件:<br />
<br />
1. 有 non-static member function 可以使用<br />
2. wrapper 之間可以互相 assign,也可以被 raw enum value 直接 assign<br />
3. wrapper 之間可以互相比較,也可以和 raw enum value 之間互相比較<br />
4. 可以使用在 switch 裡面<br />
<br />
其實最好是可以取代所有需要用到 raw enum 的地方。<br />
<br />
其實前三條都很容易滿足(雖然很煩),但最後一條才是關鍵,為了讓他可以被用在 switch 裡面,我想我需要 overload 一個 cast operator(對,C++ 可以自己定義 cast operator,很少用到,但其實有這種功能 http://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/ )<br />
<br />
operator PrimitiveKind::kind() const { return kind_; }<br />
<br />
讓他可以被 implicit 轉成 PrimitiveKind::kind,後來回頭一想,其實我前面 overoad 的那十幾個 relactional operator 好像都可以省下來,測試了一下,發現確實可以運作。<br />
<br />
以下是最後的完成品。<br />
<br />
class PrimitiveKind {<br />
enum kind { VOID, BOOLEAN, ... };<br />
<br />
operator kind() const { return kind_ ; }<br />
<br />
bool isBool();<br />
bool isInteger();<br />
bool isFloat();<br />
<br />
kind kind_;<br />
}<br />
<br />
使用簡單,用起來就像是 enum,可以放進 switch,可以直接比較,還可以有 member function,也封裝了 INT8 等等的 symbol(在 C++11 可以用 strong typed enum 達成)。蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0tag:blogger.com,1999:blog-8461549482861441801.post-58846046824162772992012-11-09T00:04:00.001-08:002012-11-09T00:05:59.437-08:00boost, clang, libc++花了很多時間才把 boost 用 clang 跟 libc++ 編譯起來,作一點筆記,免得以後忘記。<br />
<br />
首先,目前的 boost 有幾個 library 跟 clang 有相容性問題,編譯的時候可以先關掉。<br />
<ul>
<li><span style="font-family: "Courier New", Courier, monospace;">signals</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">python</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">iostreams</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">mpi</span></li>
</ul>
所以使用<br />
<pre><code>sudo ./bootstrap.sh --with-toolset=clang cxxflags="-I/usr/local/include/c++/v1 -stdlib=libc++" linkflags="-stdlib=libc++" --without-libraries=signals,python,iostreams,mpi</code></pre>
來設定。<br />
<br />
設定完成以後,使用<br />
<pre><code>sudo ./b2 toolset=clang cxxflags="-I/usr/local/include/c++/v1 -stdlib=libc++" linkflags="-stdlib=libc++" install</code></pre>
進行編譯跟安裝,對了,如果有需要的話,記得要用 debug build。蕭刻庭http://www.blogger.com/profile/16291574416552719494noreply@blogger.com0