標籤

2019年8月26日 星期一

人類存在的意義:一個生物學家的思索

Date: 20190826
Version: 1

用生物學來說明人類

全篇到最後也沒有給出人類存在的意義,但作者透過說明人類過、現在做了什麼和未來應該要做了什麼,來說明人類存在的意義是什麼。

另外,在本書中,作者也針對某個遺傳理論提出質疑,並闡述一個新的遺傳理論,這本書出版的時候是2016年,過了3年,不知道目前遺傳理論的爭議結果又是如何呢?

所以,總體來說,這本書的性質及內容跟我之前買的好幾本書都有某種程度上的類似,所以如果有其他類似的書籍,其實是不用再購買這本,不過這本書中,有趣的還是作者所提出的遺傳理論,以及說明這個遺傳理論的總總,這算是一個亮點。

在本書的最後,作者也將他的論文放在附錄中,去除一些公式和分析的部分,來闡述為何質疑某個遺傳理論,這部分我覺得比本文有趣多了,XD

2019年8月10日 星期六

《在黑暗中說的鬼故事》

Date: 20190810
Version: 1

迎合七月中元節的恐怖片

稍微說一下故事發展

  1. 男-被稻草人變成稻草人-死
  2. 男-被缺少左腳大拇指的屍體拖進-死
  3. 女-從蜘蛛咬到的傷口跑出一堆蜘蛛-沒死
  4. 男-被奇怪生物抱進身體裡-死
  5. 男-被可四分五裂的不死殭屍追殺-沒死
  6. 女-被鬼故事書的作者拉進自己的故事當中-沒死
這就是這部電影中發生的鬼故事,基本上觀眾因為沒看過,所以想看看到底會有哪些鬼故事,會由哪些角色來執行,每一篇的鬼到底是甚麼?我想這些事觀眾想看的,畢竟未知才是有趣的。

說到未知,來講講已知的,包含男女主要不會死,角色都會一個一個的分開,故事會和每一個角色有關,故事會一個接著一個發生,大概就是一般恐怖片的套路。

最讓我出戲的就是,不死的殭屍,他會說"我是不死的殭屍",第一次看到覺得,靠妖,你還會講話,一般不是只會隨便亂叫嗎?整個設定感覺很好笑,殭屍表情很多,想必內心戲十足吧!

綜合來說,不算差的一部恐怖片,基本上等值,可以看看。
下次有機會,想看看同檔期的另一部限制級恐怖片"靈異乍現"。

接下來在講講對於本篇中的相關設定
  1. 言靈
  2. 透過故事書為媒介
  3. 側寫讀者的心靈恐懼之物
  4. 從上述六點可以得知,女主角(對,我說的就是鬼故事的作者),需要透過實際物體來執行,也就是說尚屬符合物理定律,無法像死亡筆記本、或是絕命終結站這樣的因果律來執行。
  5. 可能還包含用鮮血當作墨水來書寫的設定,意味著要消耗部分生命力,或許就是這些生命力來形成實物。
  6. 女主角應該是白化症
  7. 應該異空間、幻術、時間之類的能力,才能達成第6點的場景
  8. 會不會女主角透過電影女主角再次復活於人間呢?
  9. 應該不會有下集吧,有的話,還不把它看爆!

2019年7月29日 星期一

不死狗傳說

Date: 20190729
Version: 1

這是一個我和我妹之間的傳說。

話說在住家附近有一家檳榔攤,檳榔攤的外面養著一隻狗,應該是一隻鬆獅犬。

小時候常常看到牠,但牠總是一身皮膚病,長得很醜,也不知道有沒有人在照顧。

後來,隨著我去上學、讀研究所、當兵、找工作...等之後,我再回來時發現,怎麼這隻狗還在?

一般鬆獅犬的壽命約為9~15年,我都差不多30了,結果這隻狗還在,不過,牠現在變得很漂亮了,全身毛蓬鬆蓬鬆的,但常常被剃毛。

所以我也在想這到底是不是同一隻狗呢?我也不會去查證,所以我和我妹就認定牠是一隻不死狗,非常有趣,每次經過都會看看牠,到底還在不在?這也變成我們之間的傳說。

不知道各位身邊附近是否也有這樣不知道過了多久,但還是一直存在的事物呢?

2019年7月25日 星期四

第六次大滅絕:不自然的歷史
                       伊麗莎白‧寇伯特

Date: 20190725
Version: 1

介紹大滅絕

用大滅絕來介紹演化,用演化來介紹大滅絕

這部書一開始,就用了青蛙的滅絕來做開頭,用演化來帶出各個時期的大滅絕,再用大滅絕來帶出現在進行式的種族滅絕事件,看到她一一點出的例子,才驚覺原來種族絕種是真的在進行,只不過離我們太遙遠,畢竟書中有提到,人類只要有幾種大量繁殖的物種就可以順利地生活下去,所以在我們的日常中,根本不會真正地接觸到這些瀕臨絕種的物種,我們也只是在電視媒體上看到XXX、XXX瀕臨絕種之類的。

再來說,到底是大滅絕帶來演化,還是演化帶來大滅絕呢?如果沒有大滅絕,會有現在的人類嗎?會有現在的演化嗎?那如果沒有演化,那還會有大滅絕嗎?或者是會帶來怎樣的大滅絕呢?

這本書2014年年底出版,到今年看到這本書,也過了5年,這5年過去,又給地球帶來多少改變呢?又帶走多少物種呢?或許大滅絕真的正在發生,我們真的要引以為鑑。

2019年6月20日 星期四

小說背景設定-15

Date: 20190620
Version: 2

海賊王中各種惡魔果實

靶靶果實(瞄準果實)
超人系果實,不同於原著中的果實,在目標形成一個標靶,初級時往標靶移動的物體會有些微自動校正的能力,隨著能力不斷增強,甚至會出現空間能力,會順移到標靶處,或者是因果能力,可以倒果為因,因為擊中才會有丟出的動作...之類的。

犬犬果實
動物系幻獸種,犬犬果實,狼狽型態,,可以同時獲得兩倍的動物果實能力,見唐.段成式《酉陽雜俎.卷十六.毛篇》:一說狽是一種似狼的動物,牠的前二足短,後二足長;而狼則前二足長,後二足短,狼與狽常相互搭駕走路或偷襲牲畜,理論上其幻獸種能力為"兩倍",將作用於自身的增益效果提升兩倍,減益效果降低二分之一,且因融合了狼與狽,其肉體能力將會是普通動物系果實的兩倍。

(其他可能設定)
可能具有狼狽為奸或狼狽不堪兩種能力,狼狽為奸:可以分身成兩人,一人雙手強壯,一人雙腳強壯,類似影分身之術的概念,所以可以透過兩個人訓練,融合後獲得另一方的知識;狼狽不堪:可以操縱疲勞,類似肉球果實的能力可以把疲勞彈開,而這裡只能單純的操縱自己/別人的疲勞。

超人果實
超人系果實,就像電影或漫畫中超人的能力,除了把氪石換成海樓石之外,理論上超人該有的能力都有。

花花果實
超人系果實,從資料可以得知,主角通常使用柔技或擒拿技居多,較少為剛拳類的,因此基於原著能力的介紹進行相關擴充,主要針對其能力「能力是從不同的地方,宛如開花般長出手、腳或身體各部位。」有二點可以討論:1) 長出的速度,2) 長出身體各部位。
先從第一點開始,長出的速度,F=MA,質量固定下,速度越快,作用力越大,因此參考死神市丸銀的斬魄刀「神鎗」,快速的伸出刀刃,造成像子彈的效果,因此加強伸出的速度再加上指槍或鐵塊的能力,造成類似神鎗的效果,再加上可以從身體各部位產生神鎗,效果應該會更難躲避。
接著是第二點,身體各部位的定義到底是甚麼?從原著可以看到手、腳、眼睛,推測身體各部位的定義最小單位為器官,因此是否可以在體內多長出一個器官呢?另外,這種能力可以參考獵人的尤匹的能力,以及黑貓最終BOSS的第三隻手設定。
因此,配合以上這兩種能力開發,理論上應該可以遠勝原著中的能力,原著中較注重在群體傷害的開發,而以上這兩種能力在單體對戰上會有大幅度的成長。

在生物課介紹過,多細胞生物的組成層次為:細胞-->組織-->器官-->系統-->個體。
在這要的邏輯之下,可以長出身體各部位,其是否包含從細胞到個體都可以,全賴於果實開發程度而定,這就意味著火影忍者中的,三身術(變身術、分身術、替身術)是可行的呢?變身可歸類為改變組織/器官組成結構,分身術則是個體的程度,替身術則可參考大蛇丸流·替身術,如此一來不管是群戰、單體戰、應用性上都有不錯的成果。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
摘自維基百科:

羅賓是超人系「花花果實」能力者,能力是從不同的地方,宛如開花般長出手、腳或身體各部位。此用途在偷襲方面相當具有效果,但是面對自然系的能力者以及軟體動物無效。花開的肢體分身遭到攻擊時,本體也會受到傷害。攻擊招式數字名稱是西班牙語,「クラッチ」(懸吊)是英語,「フルール」(花開)則是法語「花fleur」的意思。當羅賓使用能力的時候,經常習慣將雙手交叉橫置在胸前,周圍會有名為「飄飄花」(フワッフラワー)的花瓣在飛舞,凸顯羅賓招式的華麗度」
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

人人果實
動物系幻獸種(不確定是否為幻獸種???) 人人果實 巨人型態
身體可以變身成為巨人,普通狀態也會因果實能力而比一般人巨大,隨著能力增強,巨大的程度也會隨之增加,甚至可以比奧茲還要巨大,再來是可以進行部分巨人化,類似火影中的倍化之術,以及可以類似超級賽亞人4的型態,變為巨人後,進行壓縮來達到更強的戰鬥力。巨人,戰鬥民族,對於體術、六式、生命歸還、武裝色霸氣有極高的領悟,見聞色則相對的低。

影子果實
超人系果實,原著中真的是差勁的一蹋糊塗,理論上它有更好更強的開發。

  1. 可以發展類似火影奈良家的影遁。
  2. 類似刺客,隱藏在別人的影子中。
  3. 法則:陰影、黑暗、虛實、物質、能量、心靈、靈魂、空間。
  4. 影子具有實體的能力,且具有自身思維。
  5. 可以操縱、切割別人的影子。
  6. 可將影子附身在自己身上,在需要的時候展現,類似二次攻擊、千手佛、須佐能乎...等。
  7. 陰影侵蝕‧道心種魔,利用隱藏在影子中,透過類似邪神的呢喃、道心種魔的概念、寄生、感染的概念,進而控制別人、或是產生死士或狂信徒的概念,而且還可以提高被影響者的能力,進而吸引加入組織或國度。
  8. 透過陰影侵蝕,控制影子,並利用影子將實體拉入影中,進而取代實體,而原本的實體被拉入影子後,即可透過陰影侵蝕的方式感染原實體,最後達到兩倍的控制,爾後該實體既包含實體也包含影子,其能力素質倍增。
  9. 利用影子的特性,來產生飛雷神、分身、替身、變身術之類的能力。



我的英雄學院中各種個性

個性:黑水
皮膚可以化作黑色的水的模樣,外貌類似覆蓋武裝色霸氣的樣子,具有柔與剛兩種特性,柔,剛。

面積平均為1.85平方公尺(m^2),重量平均為8.5公斤(kg, 8.5E+3 g),平均厚度為2.25毫米(mm, 2.25E-3 m ),平均體積為4.1625E-3立方公尺(m^3, 4.1625E+3 cm^3),平均密度為8.5E+3 g / 4.1625E+3 cm^3 => 2.042 g/cm^3,水的密度為1,密度比水重。細胞厚度平均為1E-5 m,故以此厚度可展開成4.1625E+2平方公尺(m^2),約為126坪。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
皮膚是人體最大的器官,其重量占體重的14%~16%,一個體重為60kg的成年人皮膚約8.5kg,一個3kg重的新生兒皮膚岳重0.5kg,一個成年人的皮膚面積約為1.5~2.2㎡,新生兒約為0.21㎡,面積的大小與身高、體重成正比。
皮膚的厚度因人、因性別、因年齡、因職業等而異,一般為0.5~4.0mm

原文網址:https://kknews.cc/zh-tw/health/mn9jgp.html

人体的体表面积可以用Stevenson公式进行计算,即:
体表面积(m2)=0.0061*身高(cm)+0.0128*体重(kg)-0.1529
                                        --取自《生理学》

表皮厚度約為0.07~0.2mm
真皮厚度約0.3 ~ 3mm

原文網址:http://mikevgh.pixnet.net/blog/post/25185686-%E7%9A%AE%E8%86%9A%E7%94%9F%E7%90%86%E6%A7%8B%E9%80%A0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

個性:肌肉增強/控制
也就是漫畫中的嗜血肌肉男的個性,肌肉又可以分成骨骼肌、心肌、平滑肌,依照各種小說漫畫的設定可分為:
海賊,六式,部分設定是認為血液的流動,可以透過肌肉來產生動力。
史上最強弟子,紅肌、白肌、粉紅肌。
殺神永生,余乾的羅剎和天狐。
火影,須佐能乎,肌肉增生可以產生類似的效果。
進擊的巨人,肌肉增生,同上,側重點不同。
電鋸使用手冊,血體,使用鮮血製造暫時器官,那是否也可以用雞肉製作暫時器官。

甚至在生物學上更進一步,控制肌肉的收縮,產生更大的力量,透過以上這些開發,絕對不應該被主角當成墊腳石。

文字戰爭

Date: 20190620
Version: 5

主要是我在Google play上看到一個遊戲,叫做「BattleText」,其實就是英文版的文字接龍,連結放在下面,大家有興趣的可以下載來玩玩看,還不錯玩。

玩著玩著,就想到是不是也可以做一個中文版的呢?而且上Google play查了一下,好像也沒有類似的遊戲產出,所以就想是不是可以自己做一個呢?

使用的工具還是App Inventor 2,大部分設定還是參考「BattleText」這個遊戲,之後在依照中英文的差異進行調整,製作步驟如下:

  1. 首先要有中文的字詞資料,後來就找到教育部國語辭典公眾授權網,有公開的資料可以使用,所以我就載了檔案下來。
  2. 接下來要處理這些文字資料,這些檔案都是EXCEL,我使用PERL,將EXCEL轉成JSON格式的字串,格式內容為:{第一個字:{字詞長度:[符合長度的字詞組]}},另外,為了增加字詞量,我又把唐詩三百首加進去,來進行擴充,接下來我就直接把整個字串貼進AI2中。
  3. 接著開始設計APP的介面,第一頁是參數設定頁,控制字詞量及電腦難易度,沒錯,這第一版我還是設計成單機版,後續若成功才會繼續規劃連線版,提供雙人對戰;而這些參數會使用TinyDB儲存。
  4. 第二頁則是對戰畫面,主要是復刻「BattleText」的畫面出來,包含色系,比較不一樣的是「BattleText」有自刻鍵盤出來,當然注音也是可以刻出來的,但這只是初期版本,其實不太需要,而且注音還會有注音比對的問題,所以這一版就沒有刻出注音鍵盤出來,再來是原作中有時間限制,目前這版本也沒有。
  5. 再來是中英文差異的部分,首先遊戲裡面的分數,是按照字詞長度來計算的,所以就要比較中英文字詞的長度差異,首先,英文部分,是拿網路上隨便幾則TOEIC必考幾千字的那種字串來計算,而中文則是拿教育部的資料來計算,目前計算結果是中文長度:英文長度=2.8:6.9;而分數又跟獲勝分數有關係,遊戲中獲勝是50分,依照比例計算,中文獲勝分數應該是20.3,四捨五入為20分。
  6. 結果還不錯,程式邏輯都不算難寫,使用MIT AI2 Companion,測試結果都可以正常運行,當然還有很多BUG出現,但那都是邏輯可以處理的問題,但最有問題的是,無法產出APK檔,但我的檔案也沒有很大,AIA檔沒有超過1MB,所以就開始試錯了。
    1. 刪除兩頁,正常。
    2. 刪除第一頁,有問題。
    3. 刪除第二頁,正常,合理懷疑應該是辭典出了問題。
    4. 刪除辭典部分,正常,那就是辭典有問題,但程式測試正常,可以正常運作。
    5. 所以我猜測是因為在一個TEXT的元件中,無法放太多或太長的字串在其中,因為基本上我把一個字典的字詞都放進去了。
  7. 所以綜上述所說的,大概有幾種解法,第一,改成網路連線抓取資料,使用Firebase,第二,就是分解我的JSON格式字串,降低單一元件的負載量,第三,改存成txt檔後上傳當附件,直接讀取附件;目前我嘗試過第三點,但是失敗了,不知道為什麼,總會有錯誤訊息產生,但明明內容就跟原本一樣,所以目前傾向第二點進行解決,後續持續更新進度。
  8. 有關此APP的相關截圖,請參考下方圖片1-5。
  9. 依照第7點進行改進,結果第二步驟還是太長了,無法轉成APK檔,所以只能朝第一點進行改進,目前測試如果將整個JSON格式字串上傳的話,下載下來的資料會有問題,所以還是會將資料分解後上傳,本來打算上傳後,下載存成內部資料,但不知道為啥,都無法順利下載,所以之後作法就是,將整體的資料流透過Firebase進行,而不進行存取在本機當中,後續持續更新進度。
  10. 為利於本案之進行,重新定義字詞存在的意義:
    1. 為了遊戲可以進行,而不是講一個無法接下去的字,而是在可以接下去的前提下,盡可能的提高字詞長度來達到高分,故進行以下調整,將字首和字尾沒有交集的去除掉,也就是說若字首無法是別的字尾,字尾無法是別的字首的話就去除。
    2. 循環字的去除,也就是指長度為2,且字首=字尾的去除,避免一直重複皆同一單詞。
  11. 後來在建置/使用Firebase上遇到一些問題,解決如下:
    1. perl重組後另存成utf-8格式之檔案。
    2. 修改副檔名為json。
    3. 用notepad++開啟後,可以看到編碼為utf-8<BOM>,請轉譯成utf-8即可。
    4. 上傳Firebase就完成了。
    5. APP Inventor 2上,單一頁面只允許存在一個Firebase的元件,超過1個以上的話,就會發生錯誤。
    6. 故在使用Firebase的元件時,需加入各狀態之標籤,確認要進行是哪一個Firebase的讀取。
  12. 終於完成了初版,可以真正打包成APK檔,並可安裝在手機裡了,可以正常遊玩,後來在玩的過程中,發現即使是長度(2~3)的難度,都是有難度的,因為電腦永遠先起手,永遠比玩家多2~3個字,如果是其他難度的話,就可能一開始玩家就輸不只2個字以上,這其實是蠻困難的,這也是因為中文與英文的差異,這部分之後再用統計的方式說明,所以在電腦起始時,不論難度為何,都是設定成長度2的字詞。
  13. 再來是遊玩時,當開始戰鬥時,第一個字詞的出現都需要等上一段時間,這很可能是與Firebase進行連線所消耗的時間吧?所以之後打算再加一個進度條的元件,讓玩家知道遊戲是正常運作中的。
  14. 再來是為了降低難度,將原有的3個難度,調整為6個難度,這也是依照中文字詞的特性進行重新分組,例如:長度4是因為成語,長度5是因為五言絕句/律詩,長度7則是因為七言絕句/律詩。
  15. 基本上已經完成了,接下來就是提供給其他人進行測試,點擊下載APK(連結),遊玩時,若有任何BUG或優化事項,都歡迎在文章下方留言,感謝協助。
  16. 目前一些改動如下:
    1. 已經加入進度條,避免以為APP當掉了。
    2. 電腦起始字,刪除一些沒有2個字的首字。
    3. 字典統一成一個,就如同英文就是一本字典,這也是中英文比較不一樣的地方,中文可以有很多類似:詩經、花間集、宋詞、元曲...等。
  17. 再來說說中英文統計上的差異:
    1. 英文平均長度為6.69,標準誤差是3.48,所以正負1.5SD的話,長度大概是3~10。
    2. 中文平均長度為2.5,標準誤差是1.38,所以正負1.5SD的話,長度大概是1~4。
    3. 所以從上面可以看出來,英文對於先手優勢沒有那麼大,因為標準誤差很大,很容易就在後面的單字上追上去,反過來,中文誤差較低,就顯得先手優勢很難追上。
    4. 英文因為長度,所以分數是50,依照比例原則,中文大約是18.65分,進位到十位數,變成20分會比較好看。
  18. 目前大概就是這樣了,如果沒有其他因素的話,更新大概就先這樣了,等以後有動力再來改。

圖片:
1. 第一頁,設定相關參數,包含辭庫量、電腦難易度,其實我也有想到還可以加入許多設定,包含時間限制、字串長度限制、獲勝分數限制...等。


2. 一樣要放的版權聲明,包含教育部的資料,及ICON的資料,我這次的ICON設計是無限之蛇,也就是銜尾蛇的概念,也就是接龍啦~~XD


3. 遊戲開始畫面,會先從電腦開始隨機出題。


4. 字詞輸入畫面。



















5. 獲勝畫面。 




















6. 中英文比較















參考文獻:
  1. BattleText
  2. 教育部國語辭典公眾授權網
  3. 漢語大詞典
  4. ICON

2019年5月14日 星期二

樂天知命─傅佩榮談《易經》
                                     傅佩榮

Date: 20190514
Version: 1

介紹易經的書籍。

當我決定要開始研究《易經》時,我就跑去買書,一共買了兩本,這是第一本,為什麼要買這一本呢?就要說到大學時期,也有一段時間在研究《易經》,那時候買了第一本關於《易經》的書,就是傅佩榮的《不可思議的易經占卜》,這就是我的入門書籍,可以說是傅佩榮是帶我進入《易經》的老師呢!

所以當我想要再開始研究時,第一時間想到的就是傅佩榮老師是否還有其他關於《易經》的著作,後來找了一下,就決定是這一本了,這本從各卦爻辭,再加上老師自己的見解,都寫在這一本書中,相當有參考價值,我認為《不可思議的易經占卜》當作入門參考書籍,而這本書可以當再更進階的版本,適合已經初步了解《易經》的同仁學習。

說到《不可思議的易經占卜》這本書,在我要離開學校生涯時,我就把它捐給學校了,主要是因為兩點,第一,希望可以幫助到其他人,第二,那時候我已經沒有疑惑了,所以捐出去,就象徵我放下了那一段過去,人生準備往前邁進了。

最後推薦給大家,《易經》值得擁有,如果不感興趣,還有很多你可以接觸的,總有一個是適合你的。

BTW,第二本等我看完再來分享吧!

2019年5月3日 星期五

生與死

Date: 20190503
Version: 1

最近家裡有親人逝世,那時候是在凌晨0點到1點左右,被電話緊急call去醫院,去看最後一面,對她來說,早點離世是比較好的選擇吧,畢竟活著對她來說,實在是太痛苦了。

總體來說,還是算享壽的,希望她在另外一邊可以過得很好。

但以上都不是這篇的重點,這一篇我想要描述的是,那天晚上去看最後一面時,所有的子女和孫子都來了,大家都哭了,比較激動的就哭成一團,但是,就我和我妹沒哭,我不知道為什麼,大家要哭成這樣,但也疑惑為什麼我們兩個不會哭呢?

我不知道答案,你要說我不難過嗎?也並不是,我會難過、會嘆息、會珍惜、會感嘆、會心塞、會遺憾、會可惜、會懊惱、會後悔、會不舍…等,但我就是不會哭泣。

我想我妹也是這樣吧。

最後以此篇紀念逝世的親人,願一路好走,祝福活著的親人,願身體健康。

2019年5月2日 星期四

易經占筮APP

Date: 20190502
Version: 1

最近又重新開始研究《易經》了,在大學和研究所時期,也有研究過易經,那時因為生活迷惘不知方向,所以開始研究包含易經、塔羅、京房、佛經...等,但後來隨者一個坎的邁過,我也放下了這些研究,生活重新步上軌道。

到了現在已經工作兩年多了,生活也十分穩定,想到是否可以發展第二專長,後來想想在研究的過程中,還是《易經》最讓人無法忘懷,大概是因為我花最多的時間在上頭吧!也因此決定要讓易經成為我的第二專長,透過它來幫助其他需要幫助的人,於是我又開始看起相關易經的書籍,並利用自己的專長,來寫一支易經占卜的APP,正所謂算卦容易,解卦難,使用APP可以輕鬆地算出一卦,但這一卦的背後故事就要看解卦人的功力了。

另外之所以會寫這支APP,是希望可以透過這支APP來增加我的樣本數,所謂的解卦,就是參考了卦爻辭以及解卦人的經歷來產生的,卦爻辭都在那裡,所以真正的重點就在解卦人的經歷上,而這就是需要增加樣本數的原因,樣本數愈多,我就愈了解卦應該如何解,才是最適合我的,解卦方式百百種,最重要的還是要找出自己一套的標準,這就需要樣本數及後續的追蹤,來不斷地修正自己的經歷。

以下就會說明我設計此APP的相關規劃:
  1. 會有一些用來占筮的功能,換句話說,會有不一樣算法的占筮,所以我設想要使用tablayout的方式來呈現,後來在app inventor 2的套件中,實在是找不到,最後我就自己刻出畫面來呈現tablayout的感覺。[圖1-5]
  2. 目前規劃會有5種tab,包含數字卦、時空卦、籌策、查詢、說明,共五種。[圖1-5]
  3. 在APP中使用資料庫來紀錄是否為第一次使用該tab,若是則會跳出說明視窗。[圖5]
  4. 數字卦,使用三位數數字來決定下卦、上卦和變爻,取餘數。[圖1]
  5. 時空卦,利用時間和經緯度來推算,取餘數。[圖2]
  6. 籌策,這就是繫辭中提到的算法,只是用程式寫出來,還蠻好玩的,中間的邏輯思考。[圖3]
  7. 查詢,簡單使用下拉式選單,讓使用者自行選擇要看哪一卦的資料。[圖4]
  8. 說明,第三點的說明,怕使用者忘記,還是可以在說明中查詢到,並加上聲明及電子郵件。[圖5]
  9. 目前APP大致上已經完工了,預計會上架到Google Play上,但會先再測試一段時間,來看看有甚麼需要優化的地方。
圖:
1. 數字卦




















2. 時空卦




















3. 籌策




















4. 查詢




















5. 說明,原本是其他























參考來源:
  1. 易雜談

2019年4月19日 星期五

易雜談

Date: 20190419
Version: 1

三易:簡易、變易、不易

人事時地物

六十四卦

占卜是為了問something物/someone人/somewhere地/sometime時/somehow事,簡稱為事物,故提出"事物"

找出獨特值為:人、時、地???

宇宙,也就是時空,時間和空間,換句話說,就是時間和空間是挷定在一起了,一個人的一個時間點,就代表著這個人在某個時間點只會在某個地方,故"時"等於"地"。

故獨特值為:人和時,要使用什麼做為計算標準?換句話說,也就是要找出人和時的代表的獨特值。

人的獨特值為:使用人名,也就是筆劃。
時的獨特值為:時間不斷變化,年月日時分秒。

人會產生一組固定的唯一值,但再加上時,就會產生一組非重複的獨特值。
時,因時制宜,依照需求可使用年/月/日/時/分/秒,例如:測今年運勢,就使用年即可。

就上述論述,應會使用算法1。

兩種算法:
1. 人+時給出1/64卦之一。
2. 人和時分別給出1/8卦之一,但會有上下爻之問題。

簡易:時人
變易:時
不易:人

算法:
人:使用筆劃,全部的筆劃?還是每個字的筆劃?林均穆 = 8 7 16
時:使用年月日時分秒,有需要轉成毫秒嗎?2018-12-31 23:11:11 <=> 1546225871,通常會是尾數在變,可倒轉。
兩者如何一起使用?相加?相乘?

數除8,得上/下卦
數除6,得變爻
數除64,得64卦

所謂天地人,天地,為時空,為時;人,為人,先有時,才有人,可得時人之序。

卦是由上往上長,故下卦為時,上卦為人,變爻為時與人交互作用之結果。
64卦由時人交互作用得來,變爻亦由時人交互作用產生。

時*人/64,得64卦
時*人/6,得變爻
時和人皆使用相連組成,
20181231231111*8716=175899611410363476
/64=20
/6=0
時的部分,最好使用reverse,可降低一致性。
例:
無reverse:20181231231111 和 20181231231112,相差1
有reverse:11113213218102 和 21113213218102,相差20000000000000
再經過除法後,結果不盡相同。

利用時空座標與人物,進行定位與推估,這就是占卜,故也就是使用當下的時空座標與人物進行定位鎖定與推估未來。

因此,確定使用REVERSE(YYYYMMDDHH24MISS) * CONCAT(stroke COUNT from each word of the NAME)
/64,得64卦。
/6,得變爻。

經過總總考慮後,僅保留時,因使用輸入人名方式,使用上不太便利,最後更改只使用時。
再來是一開始設想時空,時為時間,空為空間,時間就是time,空間用location,即可得經緯度。
時空,時空,先時在空,且時空相連,且空為經緯度,先經度後緯度,且經緯相連,
但經緯有小數點,故小數點取代後之數字串,
故總體而言,參數應該如下:
C#: YYYYMMDDHH24MISS + REPLACE(longitude,".","") + REPLACE(latitude,".","")
回傳如下:
/64,得64卦。
/6,得變爻。

2019年4月2日 星期二

小說背景設定-17

Date: 20190331
Version: 1

參考來源:「一個夢」。

主要是拿之前作夢的場景來進行設計規劃,盡量讓夢的內容貼近現實與邏輯之中。

  1. 兩段夢,都是第一人稱視野,也就是我,感覺上,這兩段夢的我,應該是同一個人,只是時間不連續,第一個夢應該是小時候,大概高中以前,第二個夢比較接近研究所或出社會時。
  2. 目前兩個夢沒有明顯之關聯,除了是同一個人之外,唯一有連接的大概是,我的超能力吧!先不論這是不是超能力,但印象中,在第一個夢中,我是個普通人,但第二個夢就不是了,合理推論,應該是第一個夢中,我去參加後,有了轉變。
  3. 所以推論是,第一個夢中的事情,我最後還是去了,也導致我獲得了什麼,但所謂有得必有失,也意味著我失去了什麼?我猜測應該是對於第一個夢中的記憶吧。
  4. 從第一個夢中得知,這個世界是擁有超凡的存在,但並非所有人都是超凡,另外,那個儀式應該是很古老的那一種。
  5. 再來說我的超凡,應該是可以控制和吸收水分吧!換句話說,我可以控制水,但無法產生水,因此,我要找一個可以產生水的工具,而那個女的,印象中會撐一把傘,因為到哪裡都會下雨,而且全身溼漉漉的,她就是我工具或者說武器吧!
  6. 那個男的話,大概是不死之身吧,類似亞人那種,但多了可以分解自身的能力。
  7. 所以時間線上,應該是夢1-->夢2,而在故事線發展上應該是夢1-->儀式-->走過門-->(事件)-->夢2,就目前主體應該是這樣,那麼事件到底發生了什麼事呢?
    1. 平舖直述的把事件說完。
    2. 因為某種事件造成主角遺忘此事件,人事物都還一樣,這一種會在未來使用閃憲法或倒敘法來補坑。
    3. 因為某種事件造成主角身分改變,人事物都改變了,應該是坑挖最大的,而這個事件影響範圍更大。
    4. 就上述三種,應該事件2或事件3是比較常用的。





2019年3月23日 星期六

一個夢

Date: 20190317
Version: 1

這裡要說的是一個我前幾天做到的夢,還蠻驚奇的,想說就把它紀錄下來。
  1. 一開始的夢,不知道在哪裡的東西上看到某些規則。
  2. 我覺得我符合,我就做了回應。
  3. 他們就要求我去,一個講日語的島嶼。
  4. 他們是雙胞胎,女生,有一個死了。
  5. 民國65年。
  6. 去的目的,不知道是要把她送回去,還是把她帶回來。
  7. 會有一道門,不知道是7道還是11道。
  8. 平常是有間隔,特定時間會拆掉後,會形成上述的們。
  9. 要帶著死去的她走過這一段。
  10. 之後夢醒了,跟我媽說不太想去。
  11. 後面就忘了,應該還有發生甚麼東西,但最後我就夢醒了。
整體來說,那個夢境給我的感覺,應該算是靈異類的吧,很像最近看的小說《電鋸使用手冊》的風格或是前著《殺神永生》也很類似,推薦大家去看看這部小說,還有作者前一部小說,真的超厲害的,作者應該是一書封神吧!

有機會的話,想把這個故事補完,對了,這個風格和《零~濡鴉之巫女》也是蠻類似的。

Date: 20190323
Version: 2

最近又作了一個類似的夢,直覺告訴我,這個夢應該是和上一次的夢是同一個世界觀,而且是接續在後面的,所以就來記錄一下吧。

  1. 一個男的和一個女的,在我家,我是第三個人。
  2. 女的好像一直哭,下雨天,撐傘。
  3. 男的施展了甚麼,變成一個墳墓。
  4. 下雨天,有一個快遞,開了鐵門,送了一個包裹進來。
  5. 我施展了能力,把包裹裡面的水和骨灰?分開。
  6. 骨灰就變成那個男的。
  7. 男的跑去回到過去?或回到陰間?去看女的會這樣的原因。
  8. 感覺上男的喜歡那個女的。
  9. 我和那個男的是朋友吧。
感覺風格和《電鋸使用手冊》還蠻類似的,尤其是快遞出來的時候,感覺就像是地獄使者(快遞員)的感覺一樣。


2019年3月17日 星期日

Vbot M625掃地機器人

Date: 20190218
Version: 1

在去年的時候就想買一台掃地機器人給父母用,終於在今年領到年終後,就決定要上網買了,但想說第一次買掃地機器人,不用買特別貴的,先試試看好不好用再說。

在屏東過年的時候,在電視台上看到國產介紹掃地機器人,也就是Vbot,看了一下影片覺得還不錯,就上網查了一下,評價都還可以,因此就決定買了。

我是在MOMO上買的,再加上拖地組,大約7500元左右,還算便宜,相關介紹就不說了,細節都可以在網路上查的到,以下講一些我媽對於掃地機器人的心得吧!


  1. 聲音有點大聲,不過還可以接受。
  2. 掃得很乾淨,比自己拖地還乾淨。
  3. 我媽不太用定時功能,她寧願自己在家要用的時候,再開啟掃地機器人,我的鄰居也是這樣使用的。
  4. 掃的速度算快,30分鐘可以掃兩三個房間,應該是沒問題的,整體電量大約1-2小時。
  5. 使用將近兩周,整體評價CP值很高,可以推薦給大家作為第一台掃地機器人來使用看看。
  6. 可能會需要的消耗品,過濾網和毛刷,這兩個是我媽覺得會需要再買的,價格也不貴,大約一組約80-100元左右,可以之後需要時再買。
  7. 拖地組終於打開來使用了,其實就是儲水箱和一塊拖地布,拖地能力尚可,大概一到兩個房間的量,水就回沒了,但其使用上並沒有那麼方便,所以建議是不需要額外加購此商品,使用原本的功能就很夠用了。
  8. 國產,而且才7000而已,可以買來試試看,之後下一台,可能會是小米二代,等之後年終的時候再說吧!

2019年2月24日 星期日

乳膠床墊

Date:
Version: 1

今年過年回屏東的時候,睡到一張床,非常舒服,可以很貼脊椎,因為原本的床算是偏硬的,所以那幾天在那張床的時候,竟然睡到打呼。

後來回到家後,再睡自己的床時,就非常的不習慣,所以趕快問一下表姐,那是什麼床,要去哪裡買?結果才知道這是乳膠床墊,而且是在屏東買的,店家是和晨寢具,我就請表姐幫忙看一下還有沒有貨,可以幫我買一個,後來,表姐去現場看了之後,發現廠商要清庫存,準備進新貨,所以打折出清準備換現。

最後就請廠商貨運到家裡,大約9000元左右,一開始會有一股味道,有人喜歡,也有人不喜歡,大約過了兩周味道就會很淡了,睡到現在,真的是非常好睡。

我買的是雙人大小的,厚度是5公分的,下面還有彈簧床,整體來說是真的不錯睡,推薦給大家,如果覺得自己的床睡起來有點硬,不是很貼脊椎的話,大家可以試試看,但如果真的不舒服的話,還是趕快去看醫生比較實在啦!





2019年1月27日 星期日

桃捷資訊組二三事

Date: 20190127
Version: 1


  1. 來到資訊組也滿1年了,中間真的是發生了許多事,但一轉眼間,就在資訊組待了一年,在桃捷也滿了兩年,時間真的是飛快啊,就來記錄看看這一年來到底發生了甚麼事吧。
  2. 前年12月剛到時,資訊組沒多少人,10人左右,每個人都超忙得,根本沒空理我這個新人,所以那時候的蜜月期超長的,爽到去年過年後,才正式分配工作出來。
  3. 我剛到就接手了一個離職人員的工作,再加上我自己的工作,真的是有夠多,而且大多數都是採購案,那時候真的是忙到翻掉,總結來說,要學會採購案,你要會先寫簽文,再來是採購流程,那時候對於採購案的了解大概就是這樣了。
  4. 後來,到了四、五月就是準備明年的預算,那時候才知道,原來公部門的預算都是這麼早就要進行了,真的是沒想到啊!
  5. 採購案完成後,就接下了APP採購案,這是一個500萬的採購案,評選標,不過前期部分的採購案進行,是請職級較高的人幫忙起頭,之後才交給我負責後續履約項目,但沒想到這又是另一個開始。
  6. APP採購案,第一次進行需求訪談,第一次這麼長時間接觸廠商,也因為這個案子,才慢慢了解到何謂採購案,到了後期,長官的加入,讓我更了解到機關應該如何面對廠商,以及甲方的優勢所在,也了解到廠商會如何應對。
  7. 在這個時期,說真的,跟當初我想像的不太一樣,我以為我會來寫寫程式之類的,結果沒想到會先經手這麼多的採購案,在經過這個時期後,才開始慢慢接觸到如何寫程式,對我來說,寫程式是一個陌生有挑戰性的工作,因為是非本科的,一開始寫程式還真的不知道怎麼開始,這時候Google和學長就真的非常有用。
  8. 也差不多這個時候,司機員要開始每月溫故訓了,對我來說,真的是非常爽啊,等於小放假,不用管辦公室內的事情,後來我就會開始將溫故訓排到連假前,然後選擇早B,4點半上班,等於可以多放半天,真的有夠爽的。
  9. 到了下半年,因為上半年排的教育訓練都在這時候,連續兩個月都有一周不用上班,超爽的啦!而12月時,我在自己排一個長假,等於這幾個月都只要15天左右,真的是有夠爽,預期明年也會這樣進行。
  10. 慢慢的就做到年底了,又是另一個開始,組內分硬體和軟體組,組織架構更佳明確,採購案也移到硬體組身上,就真的比較輕鬆了,有比較多的心力可以放在程式上頭。
  11. 而APP也到了另一個階段,而這次有長官的加入,真的輕鬆很多,也從長官身上學到許多有關採購案應該如何進行?應該對廠商採取何種態度?契約到底有甚麼用?
  12. 而這時候也了解到公司內有的單位,就真的是不知道在幹些甚麼?是誰我就不提了,提了真的是一堆鳥事啊!
  13. 很快就到過年了,這次提早很多天回去過年,盡量把事情都放在年後,我的年後應該會爆掉吧!XD
  14. 放假前,最後一個禮拜六去加班,第一次加好加滿,將近12個小時,是出外勤沿線檢查及收取物品,陪同的除了組內同仁,還有廠商,這時候才發現其實公部門的福利真的算是不錯了,因為廠商的薪水還是時薪,也沒有1.33、1.66、2.66之類的,這時候就會覺得我們怎麼這麼爽啊!
  15. 另外特別一提,放假的前一天一樣是司機員溫故訓,一樣是早B,4點半上班,而溫故訓的前一天,是在公司的最後一天,盡量把所有的事務處理完畢,所以可能會加班,在這樣的前提下,我申請了備勤室,可以直接住在公司裡ㄟ,這真的是第一次,到時候要來記錄一下,看看備勤室到底長什麼樣子。

2019年1月20日 星期日

無所不在的演化-如何以廣義的演化論建立真正科學的世界觀
                                                                                    馬特‧瑞德利

Date: 20190120
Version: 1

介紹各種演化

利用各種事物來闡明廣義演化論,亦或是利用廣義演化論來闡明各種事物

這本書,透過各種事物的歷史發展,來說明演化的觀點,又或者是用演化的觀點來介紹各種事物的發展,作者認為事物的發展,都有脈絡可循,也就是可以用演化的觀點來看待事物,不管是生物、物理、化學、宗教、政治、經濟...等,任何事物都不是一夕之間變化出來的,都是透過不斷地試誤、不斷地修改,才有了今天的容貌,而未來也將是現在不斷演化而生。

這部書中,最讓我驚訝的是,所謂的「天鉤」或是「大轉向」,也就是在發展以人為本時,突然間,轉向以神為本,認為一切皆為某智能創造者的產物,也因此,將科學的腳步停了下來,不再往前推進,而這一觀點,在這本書介紹的歷史中不斷重複發生,而我驚訝的點是,在很久以前,我看過的一部小說中,就寫到這種事,不過書中的解釋是,在外太空有一群外星人為了降低地球的科學發展,不斷地發送干擾給一些傑出科學家,讓他們「大轉向」,因而阻礙了地球的發展,我不知道那本小說的作者是否有做過相關研究,或是看過相關書籍而產生這種想法,但沒想到的是,我竟然在事隔多年後,再次看到這種狀況,真是讓人意外啊!

2018年12月11日 星期二

路線規劃APP

Date: 20181107
Version: 1

主要發想是來自於業務中,廠商使用Google Map來進行製作路線規劃,但其中有許多不太完善的地方,例如路線很奇怪,票價有問題...等,於是我就想說為什麼會這樣呢?難道很難嗎?於是上網查了Google Map API,詳細閱讀了文件後,覺得並沒有那麼困難,只是有很多參數需要加入,另外,在PTX中,也發現了正確的票價,使用以上工具可以解決我遇到的問題。

於是我就想做一個路線規劃的APP,但目前Android Studio還在學習當中,因此還是使用App Inventor 2來製作此APP。

  1. Google Map API,有12個月試用期,共300美元的額度可使用。
    • 會得到一組API KEY,呼叫API時使用。
    • 有JSON和XML兩種格式。
    • 有諸多參數可以設定,請查說明文件。
  2. PTX,有分會員等級,但不成為會員還是可以用,只是額度更少。
    • 會員有三種等級+未註冊,共4種等級,每一等級之權利義務不同。
    • 可提供預覽介面,可直接製作需要的API。
    • API中可輸入的功能很多,請查說明文件。
    • 後來進行製作時發現,不成為會員的話,只能透過Swagger使用,無法在APP上使用,有權限管理,所以後來還是申請了會員。

製作過程:

  1. 需要先產生各路線對照表,包含place_id、代號、關鍵字、車站...等,並產生相對應的json object or array。
  2. 使用Google Map API及PTX API確認相關參數的使用狀況,決定後續要使用那些參數。
  3. 使用下拉式選單建立出路線和車站,提供路網圖給旅客查詢路線。
  4. Google Map API程式:
    1. 將車站轉出對應的place_id,並進行搜尋。
    2. 抓出連結資料。
    3. 將頭尾的步行刪除,因從車站出發。
    4. 抓出節點資料,利用關鍵字及路線校正,獲得正式名稱。
    5. 路線顯示。
  5. PTX程式:
    1. 找出同一家捷運公司的起迄站,並對應出各車站代碼。
    2. 利用代碼搜尋。
    3. 跟Google不太一樣,須建立header才行,請查說明文件。
    4. 找出單程票票價。
    5. 將桃捷與北捷的票價加總,並顯示。
  6. 一開始使用圖片,但發現無法放大縮小,因此改為使用網頁瀏覽器,可以放大縮小,寫了個Html來展示台北捷運路網圖。
  7. 介面優化/程式優化,進行中。
    1. 介面優化:
      1. 步行圖示:🏃。
      2. 連接圖示:⬇。
      3. 端點站圖示:🌑。
      4. 轉乘節點圖示:🔘。
      5. 起訖站互換圖示:⇅。
      6. 路網圖圖示:🚇。
      7. 增加所有權聲明。
      8. 時間與票價介面優化。
      9. 時間與票價介面間距增加。
      10. 新增等待畫面。
      11. 新增第二頁面,顯示相關聲明、部落格及電子郵件。
      12. 修正A12、A13、A14a區間之文字訊息。
    2. 程式優化:
      1. 新增起訖站互換功能。
      2. 新增切換路網圖功能,及第一次無法切換設定。
      3. 新增端點站/轉乘站判斷功能。
      4. 新增焦點功能,每次查詢時,查詢結果可以置頂。
      5. 步行的顏色修正。
      6. 永春站的place_id修正。
      7. A18 高鐵桃園站的關鍵字修正。
      8. A13 機場第二航廈站的搜尋改善,使用fewer_transfers。
      9. 發現A12-A13之區間會有error,經查結果為google無論如何搜尋,都會跑出機場電車,該區間改成跳出文字訊息。
      10. BL 22 南港的關鍵字修正。
      11. 新增語音辨識功能,點選"起"或"迄"後,會出現google語音辨識起迄站,提高方便性。
  8. 製作APP的Icon [6]。
  9. 給公司的同事看過後,有人問到怎麼沒有台鐵和高鐵呢?若要達成台鐵及高鐵需要進行以下規劃及確認:
    1. 站點確認,台鐵太多站了,考量到此APP主要為桃捷及北捷,故預計規劃為北北桃生活區之區域,包含:
      1. 台鐵:五堵、汐止、汐科、南港、松山、台北、萬華、板橋、浮洲、樹林、南樹林、山佳、鶯歌、桃園、內壢、中壢、埔心、楊梅、富岡、新富,共19站。
      2. 高鐵:南港、台北、板橋、桃園,共4站。
      3. 已確認上述24站的place_id。
      4. 三鐵共構: 南港、台北、板橋,先使用同一組place_id。
    2. Google,確定參數"transit_mode=subway|train"適用於台鐵及高鐵。
    3. PTX,確認有台鐵及高鐵的票價資訊,已查車站代碼。
    4. 台鐵使用黑灰相間之格式,而高鐵則使用其網站主體配色(橘色)。
  10. 經過一個禮拜的努力,終於完成台鐵及高鐵的轉乘資料,由於不再是只有捷運,因此APP改名為「大眾轉乘」。
  11. 這幾天開始準備APP上架的相關事宜,開發APP到現在終於有第一個要上架的APP啊,超快,申請差不多一小時就過了,大家可以在Google Play上找到我的APP。
  12. 成本估算如下,只要每日不超過1000人使用,應該就不需多付,當然我沒有開通付費功能,所以如果額度用完就沒了。
    1. PTX:
      1. 免費。
      2. 呼叫次數:每日20,000次(一般會員),若每人一天兩次(上下班兩次),每次最多四種(北捷、機捷、台鐵、高鐵),20000/2/4,每日大約可供2500人使用。
      3. 參考資料:會員分級。
    2. Google Map API:
      1. 每月有200美元的抵免額。
      2. 呼叫次數:每月40,000次(抵免額),若每人一天兩次(上下班兩次),每月22工作天,40000/22/2,每日大約可供909人使用。
      3. 參考資料:價目表。
  13. 發佈後,有個朋友問是不是可以提供時刻表,回去查了一下PTX,桃捷、台鐵和高鐵可以提供時刻表,但北捷則因為班次較密集,使用時刻表意義不大,改成提供班次間距會比較好,只是這又是一個大工程了,而且是否要抓取整日的時刻表呢?還是提供查詢當下時間點之後的時刻表呢?有待商榷。
  14. 使用後第一個受惠的就是我,要去南京復興上課,平常都是做紅線轉綠線,使用了APP後發現,Google提供了一條,坐到松山火車站後,步行到松山捷運站,這樣的規劃非常不錯,去回程人少,而且都有位置坐,真的不錯,沒使用這個APP還不知道還可以這樣坐。
  15. 花了一兩個禮拜在這個APP上頭,是時候休息一下,看看書,等充完電後再來把時刻表補齊吧。
  16. 時刻表規劃:
    1. 北捷:提供班距說明。
    2. 桃捷:提供班距說明。
    3. 台鐵:提供起迄站時刻表。
    4. 高鐵:提供起迄站時刻表。

注意事項:

  1. header的使用須注意加密方式,時間格式為GMT,須扣除8小時,"x-date: "後面有空格,網址有時候用https會失敗,有時候會成功,目前使用http。
  2. 產生的json,可先用JSON Editor Online進行轉譯,比較容易了解。
  3. 如果不使用PTX,可使用Swagger將所有資料抓下來後,寫進資料庫也是可以,之前作法是將上傳到Firebase。
  4. 桃捷台北車站與北捷台北車站需步行,需多加留意程式撰寫。
  5. 上方的圖示是從Blogger中的"插入特殊字元"功能用出來的,可以搜尋關鍵字,找出你想要的特殊字元,就是上方的那些圖示,在網頁上呈現的結果,會與APP上呈現的結果不太一樣。
  6. 北捷的路網圖要跟北捷申請授權,也就是填一份授權申請書,回寄給北捷即可。
  7. 憑證keystore,自己包的APK使用的憑證,和從Google Play下載的APK憑證會不一樣,所以在Google Cloud Platform限制使用時,要特別注意其使用的SHA1會不一樣。
  8. 在Directions API中有一個參數為alternatives,若設定為true,則會像google map一樣顯示出多條替代路徑,而我沒有採用的原因有1)太多條,不知道哪一條才是我要的,還是用預設最符合我需求的那條即可,2)太多條,計算的量不一樣,API的價格也不一樣。
  9. 發現使用的憑證錯誤,會導致API設定後無法使用,將進行釐清到底要使用哪個憑證?
    1. 無:沒有限制,可使用,看來只能使用這個了,多加了API限制。
    2. 應用程式簽署憑證(google核發):經修改五分鐘後測試,無法使用。
    3. 上傳憑證(原app):經修改五分鐘後測試,無法使用。


改進事項:

  1. 抵達A13時,有時候會出現Error,因會出現到A12轉乘機場內的接駁車造成程式錯誤,轉乘錯誤: A13(fewer_transfers)、確認json資料(For input string: "ot")。
  2. A1-A5區間至A7的票價錯誤,因PTX未更正正確資料,已請同仁處理。
  3. 板南線任意站到南港展覽館站會出現錯誤。
  4. 起訖站互換功能錯誤。
  5. 目前使用上,若起訖站含有轉乘站(台北、桃園、板橋、南港、A1、A18),或地理位置鄰近(北門),會出現顯示不易理解之情況。
  6. ...
參考文獻:

  1. Developer Guide | Directions API | Google Developer
  2. Place ID Finder | Maps JavaScript API | Google Developer
  3. 入門指南‧PTX API Documentation
  4. MOTC Helper
  5. JSON Editor Online
  6. 台北捷運路網圖
  7. 3418 free SVG and PNG icons for your games and apps | Game-icons.net



2018年11月18日 星期日

ASUS AIO ZN242GDK 使用心得

Date: 20181118
Version: 1

我妹買了一台ASUS的AIO,家裡之前都是買桌機,沒買過這種的,所以上網找了一些資料,後來,我妹覺得很適合她,沒有主機,不占位子,就是一個螢幕,很方便。

所以上網看一下使用心得後,就決定買了,買回來後,幫她安裝一些必要軟體後,就讓她繼續摸索一下,並請她使用後一周,給我個使用心得。

ASUS AIO ZN242GDK規格:

  • 螢幕:23.8” FHD 1920X 1080 LED-backlit 
  • 觸碰功能:無 
  • 顏色:銀 
  • 處理器:Intel Core i7-8750H(2.2GHz, up to 4.1GHz) 
  • 記憶體:16G (8Gx2) DDR4 
  • 硬碟:1TB (5400RPM) 
  • 固態硬碟: 256G M.2 SSD 
  • 顯示介面:NVIDIA® GeForce® GTX1050獨顯 
  • 其他:802.11ac+Bluetooth 5.0 
  • 光碟機:無,請自行選購 
  • 作業系統:Windows 10 家用版(64bit) 
  • 其它:2合一讀卡機 
  • 配件:鍵鼠組 
  • 保固:3年保固, 到府收送 

超棒的規格,但我妹又不打電動,真的是非常可惜啊~~

反正她爽就好。

使用心得(PDF)

2018年11月4日 星期日

追蹤開膛手傑克─DNA科學鑑識解密百年懸案(2)
                                                           羅素‧愛德華茲

Date: 20181104
Version: 1

這篇主要是因為之前玩過一款"白教堂"的桌遊,內容就是在講開膛手傑克,發現大家似乎都不知道開膛手傑克是誰,就想起之前讀過的這本書籍,於是就拿了出來,並做成一個簡要的說明。

為什麼會推這本呢?主要還是因為其內容使用了各種科學鑑定的方法來證明開膛手傑克是誰?

提供相關說明如下,有興趣的可以看一下:


2018年11月1日 星期四

Android Studio學習筆記

Date: 20181013
Version: 1

主要是用來記錄學習Android Studio的過程紀錄。

1. build.gradle

##
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28 <= 這邊要注意,故SDK須要API 28
    buildToolsVersion "28.0.3" <= 這邊要注意
    defaultConfig {
        applicationId "com.blogspot.iamamu.first"
        minSdkVersion 22 <= 這邊要注意,故SDK須要API 22
        targetSdkVersion 28 <= 這邊要注意
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0' <= 這邊要注意
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

##

2. ADM

使用API 22 x86 Google API 即可

3. 翻譯文字

使用locale zh TW即可,@strings/"字串"

4. 熱鍵

Ctrl + Alt + L:重新排版
Ctrl + F1:more 說明
Alt + Enter:檢查錯誤,並提供修正參考

5. 目前在寫按鈕按下後,呈顯會加一,寫完當下,Android Studio會先自檢,若有錯誤,則會跳出紅色折線,目前寫完是沒有出現這樣的狀況,但不知為何,每次運用模擬器時,都會當掉,下次我會用公司的電腦試試看,看到底哪裡出現了問題。

/*MainActivity.java
package com.wood.second;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //宣告
    private Button button = findViewById(R.id.button);
    private TextView textView = findViewById(R.id.textView);
    private int count = 0;


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        count++;
        textView.setText(count);
    }
}
*/

6. 在公司試了半天,終於找到原因了,也順利run起來了,要注意的點是

  1. 要先宣告,但不先不賦予值。
  2. 再來onclick內要有確認ID的動作。

/*
package com.wood.second;

import android.annotation.SuppressLint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btnplus, btnminus, btnreset, btnmulti, btndiv;
    private TextView txv;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnplus = findViewById(R.id.button);
        btnminus = findViewById(R.id.button2);
        btnreset = findViewById(R.id.button3);
        btnmulti = findViewById(R.id.button4);
        btndiv = findViewById(R.id.button5);
        //Button btnplus = findViewById(R.id.button);
        //Button btnminus = findViewById(R.id.button2);
        txv = findViewById(R.id.textView);
        //count = 0;
        btnplus.setOnClickListener(this);
        btnminus.setOnClickListener(this);
        btnreset.setOnClickListener(this);
        btnmulti.setOnClickListener(this);
        btndiv.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                count++;
                break;
            case R.id.button2:
                count--;
                break;
            case R.id.button3:
                count = 0;
                break;
            case R.id.button4:
                count *= count;
                break;
            case R.id.button5:
                count /= count;
                break;
            default:
                break;
        }
        txv.setText(Integer.toString(count));
    }
}
*/

7. 如何解決setText會出現建議事項,提供參考網站,【Android寻坑之路】解决TextView.setText提示Do not concatenate text displayed with setText. Use resource string with placeholders.问题,文章中大約出現了4種轉字串的作法如下:

  1. @SuppressLint("SetTextI18n"); txv.setText(Integer.toString(count));
  2. txv.setText(String.valueOf(count)); <=詢問寫java的人,比較常用
  3. StringBuilder a = new StringBuilder(); txv.setText(a.append(count)); <=詢問寫java的人,比較常用
  4. android:text="@string/number" ==> <string name="number">%1$d</string> ==> txv.setText(String.format(getResources().getString(R.string.number),count));

8. 解決了按鈕的問題後,接下來要試試看下拉式選單,參考"GiveMePasS'S Android惡補筆記-如何使用Spinner(下拉式選單)"這一篇文章。再來是整體設計,會有一個按鈕,按下後會隨機取樣(1-10),這個數字就是下拉式選單中會有多少選項。

也順便學了java的相關函式:

  • Math.random()
  • ArrayList<> = new ArrayList<>();
  • ArrayAdapter<> = new ArrayAdapter<>();
  • ArrayList.add()
  • ArrayList.clear()
  • ArrayList.get()

整體來說,還不錯,再接再勵往專業邁進。

9. 下拉式選單完成後,我接著挑戰日期和時間,也一樣上網爬了文,DatePicker和TimePicker,這兩篇對我幫助很大,後來也自行修改到可以記錄上一筆選擇的項目,不會每次點進去都是同一時間,也學了許多java函式:
  • Calendar = Calendar.getInstance()
  • Calendar.set()
  • Calendar.get()
  • Calendar.YEAR
  • Calendar.MONTH
  • Calendar.DAY_OF_MONTH
  • Calendar.DAY_OF_WEEK
  • Calendar.HOUR_OF_DAY
  • Calendar.MINUTE
  • String.format("%d...", ...)
  • Key-Value Pairs:
    • Map<> = new HashMap<>()
    • HashMap.put()
    • HashMap.get()

/*

import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog;
import android.content.Context;
import android.renderscript.Int3;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements OnClickListener, AdapterView.OnItemSelectedListener {
    private Button btnplus, btnminus, btnreset, btnmulti, btndiv, btnrand, btninput, btndate, btntime;
    private TextView txv, txv2, txv3;
    private Spinner spin;
    private int count = 0;
    ArrayList<String> randomList = new ArrayList<>();
    private EditText editxt;
    private Map<Integer, String> dayOfWeek = new HashMap<>();
    final Calendar time = Calendar.getInstance();
    private int myYear = time.get(Calendar.YEAR), myMonth = time.get(Calendar.MONTH), myDay = time.get(Calendar.DAY_OF_MONTH), myHour = time.get(Calendar.HOUR_OF_DAY), myMin = time.get(Calendar.MINUTE);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnplus = findViewById(R.id.button);
        btnminus = findViewById(R.id.button2);
        btnreset = findViewById(R.id.button3);
        btnmulti = findViewById(R.id.button4);
        btndiv = findViewById(R.id.button5);
        btnrand = findViewById(R.id.button6);
        btninput = findViewById(R.id.button7);
        btndate = findViewById(R.id.button8);
        btntime = findViewById(R.id.button9);
        txv = findViewById(R.id.textView);
        txv2 = findViewById(R.id.textView2);
        txv3 = findViewById(R.id.textView3);
        txv.setText(String.valueOf(count));
        spin = findViewById(R.id.spinner);
        editxt = findViewById(R.id.editText);
        btnplus.setOnClickListener(this);
        btnminus.setOnClickListener(this);
        btnreset.setOnClickListener(this);
        btnmulti.setOnClickListener(this);
        btndiv.setOnClickListener(this);
        btnrand.setOnClickListener(this);
        spin.setOnItemSelectedListener(this);
        btninput.setOnClickListener(this);
        btndate.setOnClickListener(this);
        btntime.setOnClickListener(this);
        dayOfWeek.put(1, "日");
        dayOfWeek.put(2, "一");
        dayOfWeek.put(3, "二");
        dayOfWeek.put(4, "三");
        dayOfWeek.put(5, "四");
        dayOfWeek.put(6, "五");
        dayOfWeek.put(7, "六");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                count++;
                break;
            case R.id.button2:
                count--;
                break;
            case R.id.button3:
                count = 0;
                break;
            case R.id.button4:
                count *= count;
                break;
            case R.id.button5:
                count /= count;
                break;
            case R.id.button7:
                count = (editxt.getText().length() == 0) ? 0 : Integer.valueOf(editxt.getText().toString());
                //count = Integer.valueOf(editxt.getText().toString());
                //txv.setText(editxt.getText().toString());
                break;
            case R.id.button6:
                int rand = (int) (Math.random() * 10 + 1);
                randomList.clear();
                for (int i = 1; i <= rand; i++) {
                    randomList.add(String.valueOf(i));
                }
                ArrayAdapter<String> randomAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, randomList);
                spin.setAdapter(randomAdapter);
                break;
            case R.id.button8:
                //final Calendar time = Calendar.getInstance();
                //myYear = time.get(Calendar.YEAR);
                //myMonth = time.get(Calendar.MONTH);
                //myDay = time.get(Calendar.DAY_OF_MONTH);
                //myDate = time.get(Calendar.DAY_OF_WEEK);
                //txv2.setText(String.valueOf(myYear) + String.valueOf(myMonth + 1) + String.valueOf(myDay) + String.valueOf(myDate));
                new DatePickerDialog(this, new OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                        time.set(year, month, dayOfMonth);
                        myYear = year;
                        myMonth = month;
                        myDay = dayOfMonth;
                        txv2.setText(String.format("%d-%d-%d (%s)", year, month + 1, dayOfMonth, dayOfWeek.get(time.get(Calendar.DAY_OF_WEEK))));
                        //txv2.setText(String.valueOf(year) + String.valueOf(month + 1) + String.valueOf(dayOfMonth) + " (" + dayOfWeek.get(time.get(Calendar.DAY_OF_WEEK)) + ")");
                    }
                }, myYear, myMonth, myDay).show();
                break;
            case R.id.button9:
                    //myHour = time.get(Calendar.HOUR_OF_DAY);
                    //myMin = time.get(Calendar.MINUTE);
                    new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                            time.set(myYear,myMonth,myDay,hourOfDay,minute);
                            myHour = hourOfDay;
                            myMin = minute;
                            txv3.setText(String.format("%d:%d", hourOfDay, minute));
                        }
                    }, myHour, myMin, true).show();
                break;
            default:
                break;
        }
        //txv.setText(Integer.toString(count));
        txv.setText(String.valueOf(count));
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        count = Integer.valueOf(randomList.get(position));
        txv.setText(String.valueOf(count));
        //Toast.makeText(this, "The number is: " + randomList.get(position), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

*/