【全】(遲來的)2017年 8月小結

身體健康方面,本年餘下目標是手腕復原。 8月份手腕接受了一系列治療,包括改用新的物理治療兼針灸推拿師、職業治療、進食軟骨素及葡萄醣胺等,手腕康復進度目前是理想的。在月末筆者已經可以除下手托做強化手腕肌肉的練習。筆者期待年末能重新舉起高球桿。


心靈富足方面,利用 Stigma 收集心情 Baseline 數據的計劃失敗,原因是 Process 沒有自動化。能否每天只花兩秒讓人不覺意地把自己的心情有系統的記錄下來?看來這是一個 Business Idea!! 9月份筆者打算每天早起冥想,因為工作壓力開始加大,得找回些一個人清修獨處的時間。

財務自由方面,進帳主要是來自跟進上個月的項目:

  • 投資物業的轉按完成,銀行回贈已袋袋平安;這次轉按也有好幾段小插曲,幸得 R兄襄助才能化險為夷。感謝 R兄!
  • 優化免稅額安排方面,稅務局已確認收到筆者的申請。政府處事早就預了一年半載,所以沒有心急的需要。項目如能順利完成,筆者將能提款 $10,000。
  • 儲蓄繼續按序完成。新的物理治療師收費甚高,但沒有身體健康,有錢又有何用。所以筆者已決定本年內新增一 Project 為強化醫療保險方案。
  • 股票倉 8月份來了個 V 型反彈,7月末恆指衝破多年的阻力線,每日過千億成交,筆者宣告牛三開始。然而第一波升浪還是集中在大價股,所以筆者的價值投資組合繼續跑輸港股,但勉強跑贏了美股。(8月份:股票倉 +0.4%、2800.HK +3.0%、IVV.US +0.3%)。然而當市場都在捧內銀,殊不知筆者倉內長期持有的永安竟然跑贏了建行,果然如市場先生老師所說,「有資產便有希望」。
  • 恆指上過 28,000、縱有金仔射導彈試核彈,但筆者認為市場還沒有到壓力爆破的時候。截至 8月末,筆者自創的恆指沸騰指數報 68.08 點,與需要注意開始減持的 80點 還有一段距離。


【祿】港人首置上車盤

就這政策,現在還是謠言滿天飛,大概政府還在試水溫,在放風收料吧。筆者愚見是:


如果政府要解決的是一般收入家庭因為供樓佔入息比例高的問題,推出比市價低的房屋,加上適當轉售限制使之與居屋有明顯分別,可以理解。但前提是需要極度清晰的市場定位,而筆者認為單從收入去分割香港置業需求是全錯的。


如果政府要解決的是高收入人士最初幾年拿不出首期,那政府再強化現在的首置按揭保險不就可以?還要這班高收入人士每個月扣起收入相當份額以極速降低借貸比率,變相由政府強迫高收入人士儲錢,否則樓宇又淪為高成數槓桿提款機。


胡亂架床疊屋,只會製造更多不明朗,市民無所適從,更不願意 / 不敢上車;胡亂幫助只是短期無能力上車的人,反而讓貧者愈貧、富者越富了。


參考經濟日報報導:《推首置助年輕中產上車 施永青:應分緩急輕重》

http://invest.hket.com/article/1898667?ref=edm

【祿】邁向財務「自由」之路:建立專屬且免費的自動化軍隊1(下篇)

副題:Google Sheets自動六合彩彩池到價電郵提示 Step-by-Step 更可引發無限應用可能

續上篇

2. 建立一段能將彩池及日期以電郵發出的程式碼

上回講到我們已經建立了一張 Google Sheet 能自動從馬會網頁取得下期六合彩的彩池金額以及下期搞珠日期的資訊。

要讓 Google Sheets 發出電郵,需要在 Google Sheets 寫幾行簡單的程式碼,告訴 Sheets 電郵的受文者、主旨和內容。

首先打開「Tools」之下的「Script Editor…」:



在新頁面的左上方先隨便給予這個 Script File 一個新名字,就叫 MarkSix Email 吧。也可以同時將程式碼編輯空間內預設的子程式名稱,改成自己喜歡的名字。例如筆者叫它做 sendMarkSix



程序第一步,是指示 Script 需要存取的是哪個 Google Sheet 試算表的哪一張 Sheet。這時我們回到 Google Sheets並留意網址列,當中能找到Locate 這張 Sheet SheetID(讀者的 SheetID 肯定跟這張是不同的,每一張試算表的 ID 都是唯一的):



回到 Script Editor,在 sendMarkSix 子程式內輸入以下兩行,定義 Script 存取的試算表 sheet

    var spreadsheet = SpreadsheetApp.openById("1b9trFT7cQgft0h4kkhLIQ1_b56kzUWj2_k1cez6_70g");
    var sheet = spreadsheet.getSheetByName("Sheet1");

其中第一行紅色的部分是剛才取得的SheetID,而第二行則是試算表的名稱,可在試算表底部找到。

之後就是根據試算表的內容撰寫自動化電郵了。定義以下的變數(受文者、主旨、內容):

    var Receiver = "xxx@xx.com";
    var Subject = "下期六合彩彩池 " + sheet.getRange("A1").getValue() + " @ " + sheet.getRange("A2").getValue();
    var Body = "";

主旨中的 A1 A2 分別就是彩池金額和下期搞珠日期。由於這電郵很簡單,資訊一句就能交代完成,所以筆者並不介意將所有資訊放在主旨列,內容留白。

好了,現在萬事區備,只欠一聲發送電郵的號令:

    MailApp.sendEmail(Receiver, Subject, Body);

整個發送電郵的程序就寫完了。現在可以按動 Run(並容許程序取得相關的資源執行,例如以你的名義發送電郵),一切順利的話,你應該能在Receiver 所指定的電郵郵箱收到一封電郵:



不過筆者還有一個要求。筆者對獎金太低的六合彩搞珠沒有興趣,所以不希望每一期都收到電郵提示,只有彩池達到 4千萬以上的才通知我(要不然要私人秘書來做甚麼?)

這時候我們可以定義一個獎金的變數,然後指示當獎金超過某個數額的時候才發電郵(股票到價提示就是用這個技巧了):

    var Jackpot = sheet.getRange("B1").getValue();
 
    if (Jackpot > 40000000){ 
        MailApp.sendEmail(Receiver, Subject, Body);
    }
               
最後,作為一位有責任的編程員,記得寫下 Comments 方便日後參考。





3. 建立指示讓程式碼在搞珠日後的午夜運行

最後這一步是最簡單的。六合彩搞珠在每星期二、四、六的晚上舉行,所以在搞珠日後的午夜執行程式,應該可以確保馬會已更新下期六合彩資訊,同時給予我們足夠的時間購買下一期六合彩。

Script Editor 介面按下時鐘 icon [Current Project's Triggers]。新增三個 Trigger,分別指示程序自動在星期三、五及日的子夜執行:



按「儲存」就可以。


至此,整個系統已經大功告成!當然這只是一個很簡單的系統,若然當下幫得上忙的話筆者固然高興,但筆者更希望見到的是這小小的兩篇介紹,能啟發讀者開發更深入的系統,將日常的投資和生活重複的工序自動化,以騰出寶貴的時間予做運動和其他讓身體健康的事情,以享受與家人朋友共聚的心靈富足時間,以及財務自由應所帶來真正的自由。


如果讀者希望直接取得原檔,可以在本頁留言處留下電郵地址,也歡迎彼此切磋交流。

【祿】邁向財務「自由」之路:建立專屬且免費的自動化軍隊1(上篇)

副題:Google Sheets自動六合彩彩池到價電郵提示 Step-by-Step 更可引發無限應用可能

多數企業家成功的一大基本條件,在於將較基本的工作交與別人而自己保持清晰的腦袋。這樣,企業家便能節省時間,集中精力發揮自己的所長。將基本的工作交與別人,更能發揮乘數效應,同一時間擁有多個自己同時工作,發揮最大的效能。

我們作為個體戶或是小投資者,未必能聘請員工作為「秘書」或是「軍隊」為自己效命。然而現今科技進步,我們何不跟大企業學習,借助互聯網和雲端運算,在網路世界將日常執行的繁瑣事情程序化,建立虛擬秘書軍隊?

筆者這次會從最簡單的例子開始,解構如何利用 Google Sheets 製作六合彩彩池到價電郵提示。

讀者應很容易就能舉一反三,製作股票到價提示、每日投資組合狀況匯報、每周賬單繳付提示等系統。從此不用再記得去 refresh 網站、生怕錯過了機會;而且有甚麼要知道、何時要知道,都由自己話事,活像是擁有專屬自己的秘書甚至是自動化軍隊,更甚者這是免費的


要建立六合彩彩池到價電郵提示,大致有三大步驟:
1. 建立一張能閱讀六合彩彩池及下期搞珠日期的 Google Sheet
2. 建立一段能將彩池及日期以電郵發出的程式碼
3. 建立指示讓程式碼在搞珠日後的午夜運行

上篇會先介紹第一步驟,下篇會介紹餘下兩個步驟。如果讀者希望直接取得原檔,可以在本頁留言處留下電郵地址;原檔會在下篇發表後不日發出。


1. 建立一張能閱讀六合彩彩池及下期搞珠日期的 Google Sheet

要建立 Google Sheet,首先要擁有 Google 帳戶。登入 drive.google.com 後選新增空白的 Sheet 文件。給他隨便起個名字,就叫 MarkSix 吧。

六合彩彩池及下期搞珠日期的資訊可在馬會網站http://bet.hkjc.com/marksix/index.aspx?lang=ch 找到:



要利用 Google Sheet 閱讀資訊,方法是利用 ImportXML 函數。函數有兩個參數:

=IMPORTXML(url, xpath_query)

url 顧名思義就是資料來源的網址,即是 "http://bet.hkjc.com/marksix/index.aspx?lang=ch"(緊記加上 quotation marks)。
xpath_query 是需要閱讀的資訊在頁面的位置,例如我們要閱讀六合彩彩池的資訊,就得告訴 Google Sheet 這個彩池到底放在網頁的哪裡。

找出這位置的編碼通常是整個Project 最具挑戰性的部分。一般第一個嘗試的方法是 Inspect Element。方法是在瀏覽器上 Highlight 彩池的金額,按滑鼠右鍵,選取「Inspect」或「Inspect Element」(筆者用的是 Google Chrome,其他瀏覽器的操作應是大同小異的):



瀏覽器會彈出網頁的原始碼,並 Highlight彩池金額的相關部分。此時在 Highlighted原始碼按滑鼠右鍵,選取「Copy XPath



此時如果我們貼上 Copy 了的東西的話,大概會得到以下的結果:

//*[@id="oddsTable"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[6]/td[2]

這就是六合彩彩池的資訊在上述馬會網頁的位置。

現在讓我們測試一下能否使用這位置擱取彩池資訊。在 Google Sheet Cell A1 輸入:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "//*[@id="oddsTable"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[6]/td[2]")

很抱歉嘗試是失敗的。仔細看看 Formula Bar,會發現 xpath_query 參數中有一個部分顏色轉黑了。原來 Google Sheet 誤以為 XPath 裡的 " Google Sheet Function 定義字串結尾用的 "



解決方法是多打一個 " 以示脫逸:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "//*[@id=""oddsTable""]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[6]/td[2]")

這次函數順利執行,但執行結果是 #N/A,即是函數未能取到任何資訊。通常的原因是 XPath Restrictive,這時候可以嘗試取走一些可有可無的項。例如在這個例子中,每一個 table 中只可能有一個 tbody,那就是說 tbody 這些項是可有可無的。擁有一些基本 HTML 的認識會對這除錯步驟很有幫助。

Xpath_query 中取走所有 tbody 的項:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "//*[@id=""oddsTable""]/table/tr[2]/td/table/tr/td/table/tr[6]/td[2]")

這回我們終於成功取到彩池金額:



其實如果讀者對 HTML 有少許認識,不難在網頁原始碼發現彩池金額的 td cell 已經附送了 id

<td class="snowball1" style="line-height:15px;">$15,000,000</td>

利用這個資訊以及少許 XML 的知識,可以嘗試更乾淨俐落的取到彩池金額:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "//td[@class=""snowball1""]")

Google Sheet 會回傳兩個金額,一個是多寶 / 金多寶,另一個是我們要的彩池。



仔細看一下網頁原始碼尋找原因,讀者會發現多寶 / 金多寶的金額也是用同一個格式裝住的,而 ImportXML 函數會回傳在網頁中所有符合條件的項目。這時候我們只要告訴函數我們想取的是第二個 Element 即可:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "(//td[@class=""snowball1""])[2]")



同一方法,我們可以在 Cell A2 用以下任一方法取得下期的搞珠期數:

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "//*[@id=""oddsTable""]/table/tr[2]/td/table/tr/td[1]/table/tr[2]/td[2]")

=IMPORTXML("http://bet.hkjc.com/marksix/index.aspx?lang=ch", "(//td[@class=""content""])[5]")


資料擱取大致完成。然而為了方便下一個步驟的資料處理,讓我們先將彩池金額從文字(字串 string)換成數字。在 Cell B1 輸入:

=VALUE(A1)


以後每次打開這張 Google Sheet,試算表就會自動從馬會網頁取得下期六合彩的彩池金額以及下期搞珠日期的資訊。

至於如何指令 Google Sheet 將此資訊定期電郵至讀者的信箱,敬請期待下篇

熱門文章