2019年9月21日 星期六

[閱讀] 《父母效能訓練》 的 「行為四角形」

今日分享一本書《父母效能訓練》,介紹一套同名 Parent Effectiveness Training ( P.E.T. ) 的家長訓練課程。所教授的核心技巧是積極聆聽、「我」信息、轉換法、和無輸家的衝突協議。而「行為四角形」 是這套方法內,認識在什麼情況用什麼技巧的關鍵。今日就著書本中的內容,介紹一下 P.E.T. 中的 「行為四角形」 的概念。

在開始之前,會先循書本的切入角度了解這套家長訓練的背景和理念。


在1962年由心理學家的 Thomas Gordon 提出。對當時的青少年成長、家庭問題中,他看到往往父母只有被責備,而無接受訓練的機會。每年有無數的新手爸媽展開人生中最困難的任務—迎接完全無助的嬰兒。他們負起照顧孩子身體及心理健康的責任,並將孩子養育成具有生產力、合作、能有所貢獻的公民,還有什麼被此工作更為困難吃力呢?然而有多少父母接受相關的訓練?

許多父母仍然沿用它們上一代的方式教養子女。其實在心理學、兒童發展以及其他的行為科學,皆提供有關孩子、父母、人際互動、如何協助他人成長、為他人創造健康的心理情境等方面,一些豐富的新知。

他最初擬定的目標是教導父母一些專業諮詢師、治療師所使用的技巧,以協助孩子克服情緒的困擾和不適應的行為。即使不曾修過大學心理學課程的父母也能學習這些技巧,並且懂得如何有效地適時地幫助他們的孩子。

父母是人,不是神

本來是兩個單獨的個體,突然間轉變為先生和太太,以及父母親的角色。嚴格而言這種轉變並非好現象,因為它會導致父母忘了自己仍然是人,只要人就會犯錯,人有其限制,人有真實的感情。當他們失去了自我,更忘了他們的情緒可能因時因地而不同,他們無法自由地表達自己,以為父母的身份必須優於他個人。

這訓練告訴父母無需丟棄人性,而成為稱職的父母。你能夠接受自己面對孩子時,所擁有的正面及負面的感覺。 真實的父母,有時對孩子的某些行為可以接納,有時卻有無法接納。

2019年9月14日 星期六

[閱讀] 《冰山在融化》 變革的步驟與溝通

《冰山在融化》/《Our Iceberg is Melting》,從前看過網上版本的介紹,是一本講述如何在企業內推動變革的寓言故事,今次經過圖書館看到。心想不一定要是公司的大型變革,面對在很多程序中的小改動,是否都可以有學習之處?而書中的八大步驟分別是:

「搭建平台」
步驟一:建立危機意識
幫助大家意識到變革的必要,以及馬上採取行動的重要。
步驟二:成立領導團隊
確保成立一個強而有力的領導團隊,一個具有領導才能、公信力、溝通技巧、權威、分析技能和危機意識的團隊。

「做出決定」
步驟三:提出願景
讓大家清楚認知變革後的未來與過去會有什麼不同,預見願景落實的步驟。


「實行變革」
步驟四:溝通願景
盡可能讓全體成員理解並接受變革願景和策略
步驟五:授權員工參與
盡可能為那些願意投身變革的人掃除障礙。
步驟六:創造近程戰果
盡快取得一些看得到成果的勝利
步驟七:鞏固戰果並再接再厲
取得初步成功後要更加努力,不斷進行變革,直到將願景變為現實。

「鞏固成果」
步驟八:將新做法深植企業文化中
堅持新的行為方式,確保他們成功並日益強大,直到取代舊傳統,成為企業文化。

故事中面臨融化危機的冰山,可以是整個公司、部門,但應該也可以是一個職場小薯仔,日常所面對的工作?只是當然地規模有別。例如,小薯經常出現的情況是,有事情發生,留意到一些徵兆,預計日常流程需要改變。希望提點自己可以這樣做:

1. 馬上讓大家看到情況。挑選一個小型的領導團隊,大扺1至2人的SME/Change跟進。
2. 讓團隊研究處理的方案,提出主意和步驟。(耐心和追蹤進度)
3. 向全體成員解釋方向和做法。了解執行者會面對什麼困難,並嘗試協助掃除。盡快有一些可見的成果。累積成果直到完成改變。
4. 將新流程傳送給所有人,監察新流程的執行。

此外,現實會面對的困難,可能是如何順利推動每個步驟當中涉及的參與者。企鵝弗雷德每天觀察冰山,本身是可算是冰山狀況的SME,但這方面的知識冷門得其他企鵝沒什麼認識,大家因習慣而既有的信念是:冰山是大家安穩無憂的家。所謂推動變革,一個重要部份就是推動這些「企鵝」/「人」們去進行變革。

就像在研究型的弗雷德推動行動派的主管愛麗思時,最有效的是帶她親自看看。為準備在時間匆匆的領導層會議中說服高層,他要預先了解與會者的特質,才決定以看得到的模型輔助和動之以情的說話來闡述主張。然後讓大眾理解現況時,也是類似的方法,可以眼見的模型作類比。

而企鵝國王路易士成立團隊後,先是要聯繫大家關係,讓成員對團隊有信心,再由成員不斷發掘和討論各種方案。決定方案後,就是溝通上有親和感染力的巴迪和路易士向群體交待方向,帶動大家。過程中群體內成員可能有想法可以幫助變革的過程,團隊就去支持這些願意貢獻的小企鵝實踐他們的計畫。

相比步驟,這份推動力的作用更能在不同層面的工作有所作用。 無論是Change,以至恆常Routie的、各種零碎Ad hoc 的。回到小薯的辦公室工作上,看完這本書後的想法,一個立即可以嘗試的行動,就是留意一下這 8 個步驟是否改善這些日常的改變。

2019年2月16日 星期六

青蝶脊-尋路 + 屯門青山的聖山墩臺考察

路線:青蝶脊-青山山頂(517副頂、發射站、韓陵片石亭)-青山青雲站
點去:屯門市中心,乘巴士 K52 往望后石站 ,過馬路後沿龍門路向巴士的反方向走,經過將來的隧道入口之後沿臨時行人路行,有樓梯處即為青蝶脊的登山入口。
需時:從 龍門路 入口到 青山發射站,大約 1 小時 45分,從「韓陵片石」亭到山腳約 45 分

 青山,今次探索了一條經青山南面「青蝶脊」的登山路線。上一輩的行山界有一條稱為 「杯靈雙渡」 的「考牌路線」,經過杯渡山(屯門青山)和靈渡山(元朗圓頭山),當中上青山一段經東面青山禪院的話,已經是修葺好了層層的階級急上山頂,數年前上青山接走良田坳下白泥時已經走過,算是上青山的大路之選。去年留意到另一個選擇則是連接青山和蝴蝶灣的「青蝶脊」。




2019年2月6日 星期三

[閱讀] 「教養」是一種可怕的發明

< The Gardener and the Carpenter >
"What the new science of child development tells us
about the relationship between parents and children"

我們養育小孩,是否要按著某套「教養」的方式,將孩子管教養育成醫生、律師、或某個大家希望將來要達成的職業?是否可以我們到要訓練孩子在音樂、語文、STEM等各個方向變成專才?


在了解本書的觀點之前先要區分另一個有關「教養風格」的概念:Parenting Style 是 按 家長控制 (Parental control) 和情感關愛 (Parental warmth) 兩個維度 劃分的四象限分類。普通推崇恩威並施的權威型教養風格,不過風格的形成和尺度會受社會文化時宜等因素影響著。這個常見的「教養」詞彙在本書旳內容中沒有提,這是留意中文書名時要區分的一個誤會。
專制型(authoritarian)、權威型(authoritative)
疏離型(uninvolved)、放任型(permissive)
而本書所不同意的「教養」,是指以為有種絕對標準的方式,作為做人父母/教養孩子的公式;是指家長以為可試圖形塑孩子未來的模樣。父母所造的事,不是一項工作,或職務。如果有一個共同目標:要將孩子變成一個更好或更快樂或更成功的大人,這是出於對孩子的愛,而非為了達致某個標準答案。無論夫妻間、親子間、以至人類共同撫養的行為,這書認為這份愛和親密不再是虛無或哲學的觀念,而是演化出來的天然因素。

書中借助有關孩子發展的科學 ,透過各種實驗顯示孩子學習時一些與成人不同的特質。例如提出:人類成年期和幼年期的共處,讓小孩有足夠的幼年期去發揮學習和探索的特質,讓將來的他(以至人類族群)能夠適應變化、進步。而真正教養的關鍵仍是親子關係,孩子與照顧者之間的相處,如何提供環境讓孩子發展他自身的可能性。原文書名會更反映到這個觀點:木匠 (carpenter) 和 園丁(gardener) 的分別 。「愛並沒有標準或是藍圖,其意圖並不是要改變我們所愛的人,而是給予他們成長茁壯所需要的東西」。

2019年1月27日 星期日

體驗手作步道-「自己山徑自己修」(Day 2)

為斜度大的路段加上石梯級

進入第二日的工作坊,上星期日活動完結後徐老師的「千里步道」團隊就要回台灣了,今個星期就由香港漁護署的現職/退休同事 帶領,最老資格的幾位退休或快將退休的老總、師傅,各位年輕管事的也懂是交給他們帶領大家。示範一時各有主見,是老師傅的經驗;一時對對方想要什麼,兩人又合作無間:「以前一齊砌左成條路上馬鞍山喎」

這次不用木頭,而是完全用石處理。在坪墩村,大網仔路附近的山徑起步不遠之處。附近的大石比上次多,第一步都是採石,說有拳頭大的才看上眼,當然是因為工法不同之故,過程和成品的確是沒有碎石的需要。到之後砌石時也遂漸會發覺分得出不同質地的石頭:有容易打碎的粉石,多帶點粉紅粉黃色,折面會看到顆粒質地,應該是沉質岩類;有種打開的折面會是黑色片狀,聲音清脆,有點陶壺感覺的,可是岩石類型就不懂分別了;而最合適使用的就是常見的花崗岩質地。



2019年1月17日 星期四

體驗手作步道-「自己山徑自己修」(Day 1)

台灣的陸地面積是香港的 29 倍,人口只是香港的 3 倍。山徑的使用率去看,山跑比賽一年就有二百多項,竟然小小的香港卻是亞洲第二。山徑使用頻繁,路面的損秏也多。綠惜地球、千里步道、漁護署,這兩星期就舉辦了一個「自己山徑自己修」的活動。
修復前後的對比,將沖蝕溝回填成土木階梯
事前的講座亦由 台灣「千里步道」的嘉賓分享有關手作步道的經驗。從海外幾個較大型的志工組織講起,包括講者參與美國-阿帕拉契山徑保育志工(The Appalachian Trail Conservancy,ATC)的經驗,從當時選擇㧵石仔的故事和經驗,到當地導師如何講解;在補路修橋的過程中,處理不同情況的工法和一些設計背後的考慮;講到回台灣後的步道發展,包括台灣近年推出「步道學」、找回傳統手作步道經驗的「步道師」、和政府合力修整傷健共融的步道等;再到世界各地的有趣步道分享。例如廁所設計、移動的橋、天然的樹橋等。也少不了香港步道-麥理浩有關郊野公園發展的一番話、和劉克襄的「四分之三的香港」的連繫、考察中看到傳統古道中的問路石和修路碑(東和墟)串起的歷史關係。

2018年12月9日 星期日

生活雜記 - 學車、進修、小生意

近月決定學車,第一步的報考筆試,政府網上報名的功能完全是廢的,只有襯著放假日子,親身到長沙灣填表報考。報考的櫃位並不多人輪侯,整個過程算很快完成。只要帶好: 1) 近3個月發出的住址證明,2) $510 報考費。 11月6號報考,筆試排到 11月29號,筆試合格的話即日發出路試排期:下年9月初。之後就是慢慢再找學車師傅。以從前在街機賽車的表現,認真擔心,祝好運⋯⋯  對將來是一方面看到最近的交通事故的意外難料,另一方面看到近期對 GOGOVAN 出市集、開始出批發市場大手入貨等需求,如果更投入幫手的話車應該會變得很實用。

留意到一個 「Udemy限免課程」的 FB group,經常有免費課程的優惠碼提供,應該是用程式撈出來的。已經遇到幾個好像不錯的課程,試過輸入優惠碼是有效的。人奇怪的是,對比之前在Coursera付費的自學課程, 今次幾個課甚至連開始也未曾開始,這是對於沒有認真付出就沒有珍惜和盡力的意思嗎?還是面對未熟悉的平台就遲遲地不去行動? 進修的心願偶爾仍會浮起,看大學的課程選擇科目時,卻總是很猶豫很多可以自學的內容是否值十幾萬去讀個碩士 或 短期課程?如果是買一個學位的心態,換取轉行的資格從Freshgrade做起。是否值得?

年尾PMI membership 要續期,又是一筆開支 :( 。好不好盡快了結那 60 PDU 就等2年後,才 PMI + PMP 一次過續?還有又到為網址續期的時侯,為女友生意開展的網頁掉空了一段時間。跟 FB 提我的兩年前的Arduino玩具車一樣,彷彿很多興趣總可以去到某個水平,然後就是無形的高牆罇頸。以業餘的時間投放,而要做到更好成果並不容易?

工作進入年尾12月, 人手緊拙。Mission impossible的困境又叫人怎會應付到呢。遲收工的情況令家人都經常咋形,當收工後回到家已經是別人晚飯完兼收拾好的時候,霋時也會感到自己其實是不是收工很晚呢? 工餘時間又要幫手伴侶的生意,沒有什麼自主的時間。但 FB上提醒的回顧,距離早期到觀塘新商廈擺過的市集,原來已經是2年了。這小生意現在也總算有些成長,從摸索中到可以是有點成形了,為她的成果歡喜。要增加生意額,大概就要改變運作的方法去擴大生產規模,這方面怎樣做還要再摸索⋯⋯  然而,一天只有24小時,我又可以做得多少呢?

2018年12月5日 星期三

社創的 Side Project

近幾個月在進行的一個項目,近日終於走到一個milestone里程碑,項目通過了評審,明年可以撥款推展。雖然撥款之外伴隨的是資源、還有限制,不過相信成事最重要的還是靠成員的想法和執行力,反而是對自己能力上可以做到什麼,就充滿懷疑和不安。為己為人為行業為社會,希望能做到一點成果、讓另一伴所走的輔導業情況有一點變化、讓人減輕一份困苦煩惱。所以,希望這個生活中的 Side Project 可以走下去。

近年愈感到一個 Designer 的重要,要成就出一件見得人的作品,外觀包裝最影響著給人的印象。剛好今次在大家考慮製作Logo時,Youtube 上自學了一下 Inkscape 這個開源軟件,一個類似 Illustrator 的向量繪圖工具,把他們的想法做出來,又打開了一扇技術的門。之後剛好又看到幾本書想分享一些章節,粗粗地自製一份圖片版的內容分享。

不過暫時技術只做到一些簡單繪圖和小修小改。對於設計上的美感和表達、可以隨心而畫的技術等,如果有一個更專長於畫畫的人應該會做得更好吧?



2018年10月28日 星期日

「WebOrganic」mBot 友師義工、深圳「厘米空間」 考察

最近參加一個在屯門區的 STEAM 義工師友計劃,最近開始到小學和他們一起上堂玩 mBot 機械人編程,第一天坐在兩位小朋友旁邊觀察,看著兩個人仔的互動比 mBot 吸引,一動一靜的倆人、從行為可以看到他們有不同的需要,和成長中要學習的課題。下一節開始會再和其作人組成小組去設計表演、參賽,這兩種性格如何和別人合作,可能是挑戰同時也是學習機會。很容易表現出想法和需要的小朋友,從什麼時麼人在長大後變得複雜難懂的呢?

兩年前的Arduino學習文,記得大概是那時候 mBot 初被留意作為教學用途,到現在市面所見的STEAM興趣班基本都以mBot作為兒童編程教學了。
Android + Arduino 小車的手機藍牙遙控計劃
Arduino 淘寶小車 - 焊接/使用CH341的Driver/功能測試



上星期跟一個前海交流團北上,由招商局基金會安排到訪位於深圳南山區「蛇口網谷」雙創基地(沿山路和南海大道之間,工業四路至工業八路)的地區(南山半島東部,應該是后海灣地區),參觀一間 「招商啟航」營運 的孵化加速器—「厘米空間」 (CM Space 的 CM 就是招商局的 China Merchant ),和相鄰的共享工作空間-「招商創庫」。整個園區會令我想起在班加羅爾工作時的園區,巴士沿大街行走到園區前下車,經過一個保安崗位和大閘進入,三楝的大厦園繞入口後的空地。我們進入其一座約十層的工業區大厦,就是今次拜訪的「厘米空間」。

2018年10月19日 星期五

[閱讀] 不被情緒勒索的 51 個方法


早前誠品找參考書的時候,發現到這本《不被情緒勒索的 51 個方法》-和田秀樹,當查過圖書館已有後,就打算慢慢等排預約。到某天另有地方剛好發現了,可以借去閱讀。原來,它的內容跟書題所寫的「情緒勒索」這預期有點出入。相比近年所講的以情緒作為操控手段的(Emotional Blackmail)— 「有些時候我們為了維繫與重要的人的關係,為了不想要自己被貶低、為了降低焦慮,會重複被迫去做一些自己不想做的事情……」這本書所講的更多是:如何不被情緒操控了自己,和如何調整情緒。所以 Emotional Backmail 式的情緒勒索著墨不算多,只有第一篇「你總是在意別人的眼光嗎?」勉強地關於那個「不被情緒勒索」的主題……

【圖輯】15張圖讓你一次了解情緒勒索(emotional blackmail)


如書中的前言,情緒整理的重點不是在於如何消除自己的情緒,而是如何不被情緒影響。我們畢竟是人就會有情緒不好的時,但如果可以的話,與其心情不好,還是希望好心情多一點,所以作者希望這是讀者可以心情由負轉正的情緒之書。

有豐富的情緒和把情緒表達出來的人更討人喜歡,但是想做到不被情緒劫持了你的行為反應,要減少引致行為問題,起點就由覺察自己的情緒開始。第一是了解自己,例如「對於自己比別人更急躁」這件事要有自覺。第二是不把自己的想法視為絕對,接受其他的可能性。第三是重視結果,然後在做出行為之前可以在認知上作出選擇。本書的這種模式,有點像從認知行為學派的角度出發。

The last of the human freedom is to choose one's attitudes. - Viktor Franki

2018年10月8日 星期一

2018年夏 - 富士山:距離山頂尚餘那最後的一段路

從打算行富士山開始,今年已經在 Facebook 見到好幾位朋友登富士山的相,網上看到的形容大多是「登山其實唔難」。今次到埗日本時,颱風天鴿剛剛經過了關西,到了預定登山的日子剛剛好重開了;遇到過一些行李上的問題也終於解決了,所以更是對上山充滿期待。但其實今次是沒有走到山頂了,對這個失敗記錄本來也有點猶豫,只係理性再考慮,都相信在第二天早上天氣的因素下,撒退是正確的決定。可惜風雨之下未有紀錄當時天氣,網上找到幾段當日記綠,好讓看到也有心理準備:除了個人體力、裝備和行程準備等,山上的天氣變化也是可以令難度和風景大幅改變。「謀事在人、成事在天」。

9月7日5:24の富士山頂上です。台風の時のように荒れてます。突風が風速15mを超えています。気温は6.1℃です。  - https://twitter.com/mushphoto/status/1037802596017172480

9月7日9:30頃の富士山御殿場口頂上の様子です。雨風ともに強く、台風並みです。大変危険です。気温は7.1℃です。 - https://twitter.com/mushphoto/status/1037870025284022272

Yamakei Online > みんなの登山記録 > 富士山(54歳から始める山さん)
https://www.yamakei-online.com/cl_record/detail.php?id=140693


早上約八九時到河口湖站買巴士票後,到7號候車處等車,也是整個車站最多人排的隊伍,在車站的最外圍。而站旁有一個專櫃賣票,要方便的話可以不用進大站買呢。巴士大約 9.30 開車,開往五合目Subaru Line 吉田口站 準備出發。先行逛一下這裡的商店,買了一支中等尺寸到膊頭的金剛杖,行神社,和在手信店二樓的餐廳食飯,之後就和女友分道揚鑣,大約十一點開始上山;而她就可以用山下的「河口湖・西湖」周遊巴士卷 遊覽。

初段平路為主,可見火山地質的土壤

北富士演習場、山中湖

2018年9月3日 星期一

「中學生看內地與香港關係」的變化-雙方交流而非單方融合,才能彼此學習

這份有關「中學生看內地與香港關係」的問卷調查,回顧原文的話其實伴隨著大量的題目,所以可以抽出不同的感興趣的數字作為題材,除了常見有關身份認同、兩地關係評分的數字外,還有幾項數字的變化和往後發展在我看來是有重要意義的。

中港融合(或者:香港被融合)是一些對香港前境有所關心的人,所感受到的一份未有明言,但似乎某個方向在逐步進行中的感覺。 不必等到50年後(現今只剩30年了)才一下子去傾要不要那套「一國兩制」、「港人治港」、「高度自治」⋯⋯,變化早在這大方向中潛移默化著。害怕改變可能讓人選擇全面封閉或抵制,要擇善固執當中的選擇才是困難。強勢的,與其只去強推改變,更有價值的應該是好像不同的兩個人,如何在交流中一起改進,『和而不同』。

許多負面指標的下降,對前往內地的接受程度上升等,正好反映著內地的一套在對香港的日常影響已逐漸增加。早從以往的較為離地的經濟金融,到散戶參與的股市方面,香港股市從受美股影響變成與中國的相關性更大。從前睇恆指你會想起匯豐,今日你會想起騰訊;近幾年淘寶、順豐是不少「達人」的購物、送貨平台。支付寶Alipay、微信Wechat 的手機支付今年同時以折扣攻入香港消費者的使用習慣。韓國綜藝節目變成內地版後一樣受香港年輕人留意,多套內地電視劇集在香港熱播。這些日常生活上的事慢慢造成一部份的文化差異收窄,要到內地生活(旅遊、創業、升學、工作、定居)可以幻想轉變比昔日減少了,接受程度就會增加。

對於熱愛旅遊的香港人,在前往內地旅遊的接受程度最高,"周未Chill下" 已經常見於最近介紹深圳玩樂的媒體文章,很可能是今後拉近香港人認識內地文化的一道門。相對於旅遊對很多人印象必然是離開香港,其次的創業大抵出於本地的機遇不足。而升學除了特定程度/科目外,內地大學往往仍是本地大學之後的次選,吸納著部份學生。
願意往內地生活的比例在2018年都有上升


問題中分開了「交流」和「融合」,不知在答題者的想像中是否有清晰的分別,結果反映出是交流多於融合。我想這正是要推動中港關係是「即」是「離」的人應該思考之處。中港兩地各有擅長和落後之處,學習別人長處,改善自己人民生活才是一個地方的政府應該推動之事。如果把一切都齊一了,反而令當地欠缺特色和變化,沒有了新的可能性,然後 The City Is Dying, you know?曾經重讀過當年1979-1984年間探討香港回歸到訂立中英聯合聲明時的歷史檔案,當年中國對香港情況的方針是保持它的繁榮穩定,其實也是因為對當年國內推動改革開放有幫助,所以就算收回香港也不欲香港融合走當時內地的模式。今日香港人除了默然接受或抗爭,可以顯示自己的什麼長處? 是否能夠理解雙方想法,甚麼因素可以影響對方要推動A方針而非B方針?



2018年7月21日 星期六

[VBA] 打開 IE 瀏覽器去操作和列印

辦公室之用,之前寫過如何用 VBA 控制 IE 去將網頁列印成 PDF。但後來遇到在 PDF 軟件上的問題,本應可以將存檔也自動化的步驟失效了,而自己對這工具的需求也減少了,就未有再檢視如何改進它。最近重新拾起辦公室內的一些VBA小工具,看見能發揮效果的感覺真不錯,所以,一於重新嘗試如何改進這個自動化的小工具,先整理之前的方法。

在基本的VBA功能以外,還有兩個 Library 需要先引入:打開 Reference - VBAProject,勾選引入 Microsoft Internet Controls 及 Microsoft HTML Object Library。 下面代碼中的 "ShellWindows" 會得到 Windows 下的 Shell 窗口對象,可以用来操控 Windows的文件夹和 IE 瀏覽器。 "InternetExplorer" 顧名思義可以控制Internet Explorer。 取得某個 IE 的控制後,會需要一點 HTML 語法 和 DOM 結構的認識,之後用 GetElementByID("") GetElementsByTagName("").Item(n)、 GetElementsByClassName("").Item(n) 之類的方法去取得HTML 當中的元素; 甚或如透過 .Style.display 、 .innerText 等屬性去改變網頁的顯示。

(直接印紙的話仍可以做到,只是要轉成 PDF 的話就要看 PDF 軟件的造化..... 可能下周試用 Sendkeys處理 Print Dialog?其實VBA又是否能做到其他語言中的Web Scraping方式呢,大概是未有Library的第 3 方支持?。 另外,因為保守地想給予足夠時間讀取網頁,所以也加入很多等待的時間。)

Sub IEautoprint
    
    Dim shellWins As ShellWindows
    Dim myIE As InternetExplorer
    
    Set shellWins = New ShellWindows
    Set mySheet = ThisWorkbook.Sheets("SecuritySheet")
    Set myIE = CreateObject("InternetExplorer.Application")
    StartRow = 2
    MaxRow = 65536
    
    '打開網址
    myIE.Navigate "http://website.com/fullpath"
    Application.Wait (Now + Time("0:00:01")) 

    ' Optional - 以 Title 標題去選擇視窗
    If shellWins.Count > 0 Then
        For i = shellWins.Count - 1 to 0 Step -1
            If (shellWins.Item(i).LocationName = "Window Title") Then
                Set myIE = shellWins.Item(i)
                myIE.Visible = True
                Exit For
            End If
        Next
    End If
    
    ' Loop Excel mySheet 中的 Input, 重覆:遞交HTML表單、改變頁面顯示、列印 等動作 
    For x = StartRow To MaxRow
        ' 填入HTML的表單及遞交
        Do While .ReadyState <> 4
        Loop ' 等待網頁載入完畢
        myIE.Document.Form(0).Elements("CTYPE").Value = mySheet.Cells(x,1).Value 'Html 表單中的元素
        myIE.Document.Form(0).Elements("CCODE").Value = mySheet.Cells(x,2).Value 'Html 表單中的元素 
        myIE.Document.Form(0).Submit 'Html 表單Submit
 
        ' 改變 HTML中的Style屬性去影響 Expand/Collapse 
        Do While .ReadyState <> 4
        Loop
        On Error Resume Next
        If Not (.Document.getElementbyID("hide105") Is Nothing) Then
            myIE.Document.getElementbyID("hide101").Style.display = "None"
            myIE.Document.getElementbyID("hide105").Style.display = "Block"
        End If
        
        ' 列印
        myIE.ExecWB 6, 2   'ExecWB指令, OLECMDID_PRINT=6, OLECMDEXECOPT_DONTPROMPTUSER=2
        Application.Wait (Now + TimeValue("0:00:02")) ' 等待特定的時間讓檔案建立
        
        Do While .Busy Or .ReadyState <> 4
        Loop
        
        ' 新一格沒有內容時完結 => Done~!!
        If mySheet.Cells(x+1, 1).Value = "" Then
            GoTo LastLine            
        End If
    Next
' 完結時的處理LineDone:
    MsgBox "Done"
    Set shellWins = Nothing
    Set myIE = Nothing
End Sub


ShellWindowshttps://msdn.microsoft.com/en-us/library/windows/desktop/bb773974(v=vs.85).aspx
InternetExplorerhttps://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752084(v=vs.85)
ExecWB 的 IOleCommandTarget interfacehttps://docs.microsoft.com/en-us/windows/desktop/api/docobj/ne-docobj-olecmdid
OLECMDIDhttps://docs.microsoft.com/en-us/windows/desktop/api/docobj/ne-docobj-olecmdid

2018年7月6日 星期五

Coursera - Applied Data Science with Python 學習筆記 05 - Social Network Analysis

到了這系列課程的最後一門課-社會網絡分析 (Social Network Analysis) ,原本以為是研究 FB、Twitter 等平台的文字資料;原來是運用圖論中的節點和線邊構成的『圖』去代表社會網絡中的人和關係。純圖論的一些經典實施問題包括:7橋問題(path)、最短路徑問題(distance)、4色問題(labeling)。圖論伸廷到今天的社會網絡分析,研究的方向可能是社群的結構、資訊如何流通等等,社交平台做成的網絡是這個方向的一大推動力,正如 Facebook 提供讓開發者使用的 Graph API 就是以 物件-關係 來處理資訊。Python中有 NetworkX 套件特別用來處理這些Social Network Analysis 問題的工具。

Week1 是圖論上的基礎,和一些特別的圖例如 bipartite graph, 它的L-Bipartite graph (weighted) projection。解釋過什麼是Graph、Node、Edge、Degree等基本詞彙後,網絡和圖的稱呼會交替出現。

要引用一張圖,可以有以下方法:
https://networkx.github.io/documentation/networkx-1.10/reference/readwrite.html
import networkx as nx
import numpy as np
import pandas as pd
%matplotlib notebook

G1 = nx.Graph()
G1.add_edges_from([('A', 'B'),
                   ('A', 'C'),
                   ('A', 'D'),
                   ('A', 'E'),
                   ('B', 'D'),
                   ('B', 'E'),
                   ('D', 'E'),
                   ('C', 'F'),
                   ('C', 'K'),
                   ('F', 'H'),
                   ('F', 'K'),
                   ('F', 'J'),
                   ('J', 'K')])

G2 = nx.read_edgelist('G_self_edgelist.txt', delimiter=',', data=[('Weight', int)])

G_df = pd.read_csv('G_self_edgelist.txt', delimiter=',', 
                   header=None, names=['n1', 'n2', 'weight'])
G3 = nx.from_pandas_dataframe(G_df, 'n1', 'n2', edge_attr='weight')

nx.info(G)
G.nodes(data=True)
G.edges(data=True)
nx.draw_networkx(G)

Week 2

「群聚分析」研究的是,網絡中的點互相連結形成群聚的程度。典型由多人形成的群聚,會是圖中一部分由所有點互相連結的完全子圖。而最簡單的一個群聚是由互相認識的三個人形成的「Triadic Closure」,對更複雜的圖的幾種群聚系數,量度的設計是由這形式推展出來的。

首先是圖中某個頂點的「局部群聚系數」-Local Clustering Coefficient,它的大概主意是去計算:與某頂點相連的近鄰們,能夠互相連結成配對的比例。即以下兩者之比:
$v$的近鄰間實際形成的邊數:$|(X,Y)| s.t. X,Y \in N(v)$
$v$的近鄰間最大可能形成的邊數:$\frac{d_v(d_v - 1)}{2}$

當考慮整個圖的整體群聚程度-「全局群聚系數」時,有兩種方法,一個是所有點的局部群聚系數平均起來-「Average Local Clustering Coefficient」。另一個稱為 「Transitivity」 的量度方法是數算圖中由三點形成的「閉三角組」和「開三角組」的比例:
Transitivity = 3 * number triangle / number of opera triad
而兩套方法的分別是對 Transitivity 對 高Degree 的點有較大比重。
nx.average_clustering(G)
nx.transitivity(G)

2018年6月18日 星期一

Coursera - Applied Data Science with Python 學習筆記 04 - Text Mining

《山林道》-「當初說這裡有天 會由樹變成路 一醒覺經已殺出這條路....
我只盼這裡有天 變回樹 撤回路 疏忽了趕快去補趁還未老... 」

Applied Data Science with Python的第四課-Applied Text Mining in Python,是更多有關文字、語言的處理,可以想像最後一課的social network應該有機會處理網絡社交平台上獲取的資料?

最基本的是文字的 Regular Expression 處理,在第一課時已略有使用過,幾個常用方法包括:

### Regular expression
import re
text = '@UN @UN_Women "Ethics are built right into the ideals and objectives of the United Nations" \
UNSG @NY @NY_Society for Ethical Culture bit.ly/2guVelr'   # 字串
text_list = text.split(' ')   # 分拆字串
[w for w in text_list if re.search('@[A-Za-z0-9_]+', w)]   # 查找吻合的pattern

# Dataframe 的字串處理
time_sentences = ["Monday: The doctor's appointment is at 2:45pm.", 
                  "Tuesday: The dentist's appointment is at 11:30 am.",
                  "Wednesday: At 7:00pm, there is a basketball game!",
                  "Thursday: Be back home by 11:15 pm at the latest.",
                  "Friday: Take the train at 08:10 am, arrive at 09:00am."]
df = pd.DataFrame(time_sentences, columns=['text'])

df['text'].str.split().str.len()   # find the number of tokens for each string in df['text']
df['text'].str.findall(r'(\d?\d):(\d\d)')   # group and find the hours and minutes
df['text'].str.replace(r'\w+day\b', '???')   # replace weekdays with '???'
df['text'].str.extractall(r'((\d?\d):(\d\d) ?([ap]m))')   # extract the entire time, the hours, the minutes, and the perio

然後就開始自然語言處理器 NLTK。課程是英語為主,但香港地更實際的一定是中文的處理,從前在 R 就聽過 Jieba 套件,Python世界似乎也是 Jieba 最廣為人所認識,當然這個 Jieba套件之後也要找機會試試。

所以,還是先溫習課程上所學習對英文的流程。首先是把文章進行分詞 (Tokenization),然後針對英文文法上的不同時態/詞型,分辨詞性 (Noun/Verb/Adj/...) 及縮減成詞根的提取 (Stemming) 或還原Lemmatization)。 這樣以後才可以做一些詞頻統計、Vectorization 後做預測模型、兩篇文章內容的相似度的比較。

2018年6月6日 星期三

Coursera - Applied Data Science with Python 學習筆記 03 - machine learning

第三課, Coursera上的最後一課已經開課,加快記完這篇就要再追一追進度了。機器學習隨著人工智能近年變成流行Buzzword,其實在引入神經網路(Neural Networks)前,一些模型例如Regression, logistics regression, KNN Classifier 等 迴歸 或 分類 模型; K means 的叢集;PCA 的縮減維度方法;Decision Tree的決策指引;很多概念都是統計和數學所已有的,只是一個機械學習的課程會對實作更有重視。

今次只是在有課程框架下去學python。當以<第一課>的技巧處理好數據成合用的格式, <第二課>繪圖後對數據有視覺化的印象, 可以進入第三課建立模型去做數據的形容/預測。其他例子可以參考之前幾篇,例如早期用 R 的:
[R] ML4B 課堂重溫 - 淺談 KNN (K-th Nearest Neighbors) 算法
[R] Show Me The Code - Machine Learning的簡易入門

在課堂的練習中,所有今次用到有關的scikit-learn library。從library的架構中可以留意到model selection, preprocessing, models, metrics幾大類別,對應著建立模型過程中的不同需要:
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import validation_curve

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures

from sklearn.neighbors import KNeighborsClassifier 
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from sklearn.svm import LinearSVC, SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.dummy import DummyClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.neural_network import MLPClassifier

from sklearn.metrics.scorer import SCORERS
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import classification_report
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import mean_squared_error, r2_score

from sklearn.datasets import make_classification, make_blobs, make_friedman1, load_breast_cancer

2018年5月29日 星期二

Coursera - Applied Data Science with Python 學習筆記 02 - matplotlib

香港2018年對比以往10年的極端氣溫 - 現在 5月尾 (至27/5) 已經連續出現破記錄的高溫

第二課:<Applied Plotting, Charting & Data Representation in Python> 學的是繪圖,倚重 Jupyter Notebook 中的 %matplotlib 功能來直接顯示繪圖的輸出。以上的圖就是其中一功課改用香港數據表示出來,詳細coding看本文的最後部份。 Jupyter Notebook 以前稱為 IPython notebook,從前安裝 Anaconda 應該是預設了Jupyter,只是一直未有使用。今次先檢查兩個2.7和3.6的python環境中的package,未有Jupyter的話就重新安裝/更新。

# 當前環境的套件
conda list
# 更新 pip
pip install --upgrade pip

# 安裝 jupyter
pip install jupyter

之後當執行jupyter,電腦會打開一個瀏覽器視窗,預設會連到localhost的 port:8888。新增或打開課程的 .ipynb 檔,當中的內容以一個個的「Cell」顯示。按 [Shift+Enter] 執行這個 Cell ,某個 Cell 的 in[?] 的結果會顯示在相應的 out[?] 之中,這樣可以選擇文件中的某部分來執行、逐步去測試。 其他功能可以在文件上方的選項,經常用到 Kernal 中的 Restart, Restart+Run all。在用完某 .ipynb 後可以把它 Shutdown;要離開 Jupyter 就可以在 Terminal 中按 [Ctrl+C] x2

# Use Jupyter
python -m jupyter notebook

用瀏覽器的 localhost:8888/tree/ 作為開頭的路徑,前往電腦中的檔案夾

打開 Jupyter Notebook 的 .ipynb 檔


2018年5月17日 星期四

Coursera - Applied Data Science with Python 學習筆記 01 - Introduction

5月初的放假期間開始了一個Coursera 的 Python Specialization 課程-<Applied Data Science with Python>, 暫時完成了3/5的課,在5月尾開始下一課前,先重溫一下第一課:<Introduction to Data Science in Python> 一些值得記著的codings.

1. 例子

# 關於資料結構
x = (1, 'a', 2, 'b')  # Tuple
x = [1, 'a', 2, 'b']  # List
      # set(x['name'] for x in df).   elist = [n for n in range(0,100) if n%2==0]
x = {1: 'a', 2: 'b'} # Dict
      # x[name], x.values(), x.items()
x = np.array([[7, 8, 9], [10, 11, 12]])     # Array:   import numpy as np.
x = Series(['item1', 'item2', 'item3'], [0, 1, 2])   # Series:  import pandas as pd
x = Dataframe(array, index, columns)   # Dataframe:  import pandas as pd
type()

# 字串 及 正則表示式
x = 'This is a string'
x[0:2]   # 從第 0th 元素開始,停止在第 2nd 元素之前
'This is a string'.split(' ')[0]  # 以空格 '  ' 分拆字串,提取第 0th 元素
re.findall(r'\w+', 'This is a string')  # 以正則表示式尋找特定字符。需要先 import re

# Numpy 中的 Array,用於使用 Vector、Matrix 的時候
a = np.arrange(start, end, step)  # 從 start 至 end,數值間隔為 step 的 Array
a = np.linspace(start, end, count)  # 從 start 至 end,count 個數值的 Array
amax = a.argmax()  # Array 中的最大值
a = np.vstack([array1, array2])  # 垂直合併兩個 Array
arrar2 = array1.copy   # 複製出獨立的 Array


# Pandas 中的 Series/Dataframe, 從 Numpy 的 Array衍生出來,處理數據的資料表時可以用到
a.argmax()
s.loc['name']   # index 為'name'的資料
df.reset_index()  # 重設 index 為 0:len(df)
df.set_index('time').sort_index()  # 以Column 'time' 為 index,並排序
df.dropna()  # 除去包含 NA 的行-Row
df.apply(min_max, axis=1)  # 進行 Row 運算
df.pivot_table(values, index, columns, aggfunc=[np.mean,np.min], margins=True)  # 製作Pivot Table綜合資料表
df= df.set_index('Col1') .groupby(level=0)['Col2'].agg({'avg': np.average}) 
pd.cut(df['avg'],10)

2018年4月18日 星期三

第一次鑽瓷磚牆就成功的圖文紀錄

自從裝修完成後一直未有隨便鑽牆。上星期的復活節,女友在淘寶買了幾件傢俱擺設,除了一般組裝以外,還有需要鑽牆去安裝上牆的掛架和層架。世伯以前做過裝修,有工具可以借用之餘,也指導指導我這後輩該怎樣落手。這四件新傢俱可以幫助整理家居之餘,還可以玩玩手工,很滿意。

然後某天又趁放半天假的時間,回家第一時間嘗試弄好廚房的掛桿。初次試鑽瓦仔面的磚牆,好好記錄下步驟。總結經驗,就是感到:工具的重要,不然很難鑽進去;方法的重要,不然令磚面出現裂紋;位置的重要,例如是刻意選磚邊下手的,而更緊要是評估過牆後會不會有電線水管等,不然破壞了要修補的話就大工程了。

想起年輕時做過一個月跟車助手,跟車之餘也幫手店舖/特賣場的裝修工程,那時的師傅也說教過-人要靈活利用工具,是否做裝修工程的人,特別容易有這份對工具重要性的體悟?
度位確定下鑽的位置
用縐紋膠紙避免瓷磚鑽到裂痕,膠紙上做記號也方便撕走。
準備用這種鑽頭鑽開瓷磚面,不要開震動模式。

先鑽穿瓷面

之後用石屎鑽和震動模式,為瓷面後的磚鑽孔

量度螺絲和牆洞的深度,斜切膠塞可以方便打入牆孔

多餘部份用𠝹刀和鎚子配合就可切走,
勉強鎚打可能傷到周邊的牆身

檢視成果,第一次算收貨吧

之後就是掛桿本身的安裝了
量度預留多少位放掛片,用電批鑽入螺絲

試試安穩掛片,小小的缺陷都遮蓋了

放入橫桿和排勾後,收緊兩邊的小螺絲

大功告成 ~

2018年4月16日 星期一

九肚山/摩星嶺-過路香港歷史

記一下 2018年到過的幾個新地方, 一個是火炭的九肚山,另一個是港島的摩星嶺。

火炭廢村/九肚山

火炭西面往草山的方向,山中有不少荒廢了的昔日村落。這天的目標本來是石榴洞村,一個可能是香港海拔最高的廢村。過去的「火炭」是一個「河灘」,在沙田新市鎮發展的過程中,山下沿河的兩岸規劃為工業區;近城門河的新填海地就用作馬場、體院、私樓住宅;山腳和工業區外圍保留了不少村屋;但沿西北面山的方向,山上的村落逐漸荒廢,而村名就用作工業區道路的起名參考。工業區內多條街道均以當地鄉村命名,包括火炭路、坳背灣街、山尾街、禾寮坑路、禾上墩街、牛湖托街、黃竹洋街、河瀝背街及桂地街等。當日結果在山上經過山尾、牛湖托村、回到大埔滘林路走一段路往長瀝尾方向,到車路盡頭的直升機坪,最後上九肚山回火炭。

起步前先到火炭站,在御龍山的快餐店食過早餐,就回到車站的另一邊,沿坳背灣街穿過整個火炭工業區。當轉入桂地街和黃竹洋街,這裡看到興建中的火炭公屋項目-共 6 座約 4780伙,一度為林鄭在 2017年末的首份施政報告中,推銷將會轉為「綠置居」的項目。走過現場的感覺,的確如去年報導的介紹般,暫時在交通和生活的配套都不方便。至今年初的房委會會議,因為是短期內落成的大型項目,可能有鄰近山坡維修等,而並不符合先導項目的選取原則。大抵維持作為出租公屋,2019年底落成後,大抵是2020年安排推出入往,這規模更有效處理基層市民對公屋項目的需求。而,當近年政府討論綠置居的定位時,顯然並不是作為公居與居屋之間的一層(定價更在居屋之上),而是為了加快公屋流轉。其實,居屋之外是否需要這樣另立名目的計劃? 推出這種計劃是否公平?是否有其他方法達到效果?

概念設計圖 (2013年區議會文件)

沙田區區議會 發展及房屋委員會 2013年文件
「綠表置居計劃」先導項目的檢討 - 文件編號:SHC 5/2018