目前關於選舉﹑抗爭的睇法

目前關於選舉﹑抗爭,我想講少少自己睇法。

1) 當前宵禁又好多街頭抗爭﹑黑警街頭暴行,一切已是眼前日常之事。若將抗爭訴諸於選舉是太過遙遠而難解當下燃眉之急。

2) 立法會﹑區議會,議會抗爭依然是ineffective的。
其一,政府會DQ。
其二,議會能隨意趕議員走。
其三大絕,就算議會將來換屆後過半,政府亦可以不尊從議會制度的任何rules,就像黑警現時在做的事一樣。

關於第三這點,問題不在於政府做法是否合理,而是在於當政府做得出,市民會否反抗?能否有效反制?
就像DQ,其實本身並無合法合理基礎,政府做得出,市民無力反抗反制,則成為政府黑手段常態。

3) 基於(2),我可斷言立法會﹑區議會制度仍只是橡皮圖章,ineffective。
相比起來,街頭抗爭的聲勢﹑能量﹑施壓力量(俾到message外國=>向港共施壓),對整體抗爭形勢更來得直接及有力。(因為議會制度爛左廢左)

4) 基於(1),(2),(3), 目前來說香港抗爭應取近捨遠﹑取本捨末,以街頭抗爭為重心。不是說不要去參與立法會﹑區議會選舉,但我認為有focus重心及priority。

5) 雖取近,但長遠應該怎樣做?
像鄭立有篇文所講
( https://thestandnews.com/politics/%E6%89%80%E8%AC%82%E5%85%89%E5%BE%A9%E9%A6%99%E6%B8%AF-%E9%A6%96%E5%85%88%E4%BD%A0%E8%A6%81%E7%9C%8B%E9%A6%99%E6%B8%AF%E6%98%AF%E6%80%8E%E6%B7%AA%E9%99%B7%E7%9A%84/?fbclid=IwAR144N1It2Sh5oagkNwAulN-r7PuKD3_aLyV5tiL8BqGZPo_i8V_Mqv4GQY )
目前掌握香港命脈的主要公司,例如黨鐵﹑五豐行﹑因航,都是受中共﹑港共滲透控制。「若不能奪得,則取而代之,讓他沒落消失也可以。而成功就是香港的東西的滲透度被最低化,全部重新為香港的利益服務。」
另外,繼續建立長遠養活抗爭群眾的價值圈。長遠不需助養義士生計,而是靠價值圈義士有門路繼續自力更生。(法律支援繼續要,但法律以外既支援都要build up常態化)

反逃犯條例69遊行

老實說,今天雖然有聲稱100萬人上街,但我也沒有什麼開心與感動的感覺。雨傘那一次我有感動的感覺,但這次我沒有。
我雖有去遊行,但有件事我由始至終也覺得很不舒服的就是,很多香港人把嘗試武力升級的人視作「鬼」﹑「攪破壞」。
當今天,香港人們把嘗試武力升級的人視作「鬼」﹑「攪破壞」,到他日假若大環境條件允許﹑有需要﹑適合武力升級的時候,我們有何顏面去叫人們出去升級抗爭?那些會去拼命的人,在今時今日都早被當今的香港人心態趕盡殺絕。
所謂「和理非非」或「武力升級」,我從來都認為處之心態應是不將其當成絕對規條,而應視作策略手段。我認為在當下「武力升級」的策略是很低效甚至反效,但我會很小心地說明這是從功用角度分析,而非絕對原則。可惜香港的政客,只會順應民眾的價值觀,絕對劃界;而非以正確心態教化﹑導向民心。
重申,我不是說要認同武力升級,但至少該有同情的理解。眼見人們把一些真心抗爭的人打成「鬼」,我感到悲哀。
我對香港泛民主派是失望之至。(不是今天才失望,是一直失望了很多年)

早幾個月上左Coach Fui個射波訓練班

[籃球]
早幾個月我上左Coach Fui個射波訓練班。

Coach Fui佢個射波form好似佢既片講解咁,每一個細節位其實都係有一d原因去backup個form。
所以佢個form係好viable,而佢本人係好穩定既射手(佢以前係甲一得分王/3分王)。
但我覺得佢個form係有少少偏鋒,大部份人都難以掌握,所以其實唔係人人適合(包括我就唔係好適合)。
實際上,對任何人來說,最好的form,一定係自己不斷摸索不過的form,實驗驗證theory backup,最後compile成最適合自己身體感覺的form。

上佢個射波班,我最大既得著反而唔係佢教既Form,而係一d概念inspire到我。

1) Coach Fui 成日話「射3分其實唔駛用力。」
你睇佢d片,又的確佢射波好似唔駛用力咁但個波又高又遠又準。
我聽佢講依句,睇佢射,再反思,其實好shocking。
係,其實點解我冇諗過3分其實唔駛用力?
當我有左「射3分其實唔駛用力」既想像,我望住個框,我發覺其實「距離感」變近左。
然後有時我係可以唔駛「出盡力」咁樣都可以射到個波出去。
但,依種想像/距離感,我係要自己一個人落球場靜靜地/慢慢地射波射一段時間,然後先可以間中catch到。

2) 具體去講物理現像就係,我以往只著重用力。
一來用錯地方發力(以前我用手指射波),上完Coach Fui堂之後佢指點過之後我先明,手掌射波係好過手指射波(fade away除外)。
二來我對用力的方法有誤,以為「快」就是「大力」,但這是錯的。
所謂「快」,我以前身體理解是出手快。
但問題是太快離手,我手臂的力都未用盡,手腕就已用盡所有力將波離手,而大部份的力都用在chok旋而非波的投射軌跡。
更甚的是,手腕chok旋的力其實某程度上反而是抵消了身體其他地方的力。

而上完他的堂後,我反思時開始理解到用力「快」「慢」的節奏問題。
用少一點手腕力,用「慢」一點的手腕節奏,match返手臂節奏,借多一點手臂力。
遲一點時間離手,但像槍的長槍管,有多一點距離時間加速,投射力度會大得多。
(當然,射遠距離既話,借腳力其實都好重要)

但其實最後Coach Fui有講一樣野,用最少的動作去射波,其實反而可能更有力。
其實道理同「寸勁」應該差唔多。
只要節奏match,然後整體變「快」,動作可以縮短,就真的可以做到「快」就是「大力」。(理論就係咁解,實際就要練)

3) Coach Fui 其實係教人用晒左手+右手一齊推波。(但當然有技巧)
依個想法係打破晒我以前打波既概念。
但如果有睇佢D片,其實佢有解釋得好詳細,係好Valid點樣做同點解。
簡單講就係: 左手主控方向,右手主控推力。(一般人係單手純用右手發力+控方向)

我自己體感係,用埋左手,係會準D同大力D,但係技巧同以前果種做法係好唔同既手感。

———————————————————————————

after all, 我係冇直接照單全收Coach Fui既form。
但我參考左佢既一d概念去糾正左幾個自己既問題去build左自己一個form:

1) coach fui針對「落腕」既問題,佢既Solution係,渣波唔好正手扭曲手腕渣,而係雙手渣側少少。(好難形容,有睇佢射波片就會明)
但佢唔係企到個人好側,而我係慣用比較側身(~30度)射波,我覺得咁樣射波體感比較穩定。
因為側身時,身體重心軌跡﹑身體發力軌跡﹑投射軌跡,係成一直線,基本上所有軌跡都近乎只有向上及向前的方向,而不會有左右的方向。
射波form的所謂穩定,說穿了其實就是軌跡方向的問題。越少偏左偏右的方向,就越穩定。

2) 用手掌instead of手指射波。
用食指﹑中指﹑無名指,三指齊發,但主要都要手掌>>手指,手指是收尾順勢。(但我始終係慣性,仍然係用好大指力落旋)
但控方向的其實有一半係用左手。

———————————————————————————

早排我試過拋開原本既概念,用Coach Fui方法練過一排(會break晒d手感),但發覺唔順手攪唔掂 。
之後手法﹑手感都一直很confuse。
因為我知道以前個form係有問題,我係唔會走回頭路,但未build到新form。
用了好一段時間,間中星期六去球場射波去慢慢摸索點樣build個form。
直到最近幾星期,我用了很多時間自己去球場射波(尤其是護照過期去唔到日本,頭幾日未落大雨時我去左球場射波),好似開始搵到岩我自己射得舒服穩定既form。
但只係有理論有form,仍然是需要專注力才能execute到,而未能做到肌肉記憶,需要練習。

論賭博遊戲

賭博遊戲我大致會分兩種,第一種是「同莊對賭」,第二種是「不是同莊對賭」。

「同莊對賭」的遊戲往往是「局」,長賭必輸,若目的是求財的話則不理性。
「不是同莊對賭」的遊戲的例子是,與其他參與者們之間的零和遊戲。這類遊戲有機會是理性可取的遊戲。

而在「不是同莊對賭」的遊戲中,越多人參與遊戲,則對玩家越為有利。(獨立以此性質判斷,排除其他因素)

只有少數人參與的遊戲,會有機會玩家面對的是少數的精英,所以有機會令輸的機會變大。
多人參與的遊戲,玩家有機會從一般劣勢玩家中得益。
當然,玩家在此同時也有機會輸給精英玩家。
所以關鍵就在於,遊戲是否有給玩家選擇「場地」的空間。
盡量避開「莊」﹑「精英」,而選擇合適的場地,與一般/劣勢玩家玩,就較易得益。

當然,如果我說的只是「遊戲性質令遊戲對玩家存有優勢」,那麼豈不是對所有玩家都存有優勢?那豈不是廢話?
關鍵在於….現實世界中,往往恆常存在一班非理性賭徒,是沒有盡用遊戲衍生的策略優勢。
越是多人能參與﹑門檻越低的遊戲,非理性賭徒的比重越多。
若能選擇「場地」,面對非理性賭徒,就能較有優勢。

所以「遊戲性質令遊戲對玩家存有優勢」,前提是當事人是理性的玩家。
玩家並不一定需要是最top的那堆玩家。
反之,let’s say可能玩家的策略只需是最top的幾十%甚至是50%,然後與最劣勢的一群玩家對賭,就能得益。
(off topic, 這衍生出的一個道理就是,知道自己的定位﹑決定適合自己的「戰場」,比起自身的絕對實力,更為重要)

—————————————————————————

以上是純粹的理性分析。
所謂「賭博遊戲」,我不是只是指最狹義的那種賭博遊戲。
Generally,也是applied to 打機的遊戲,甚至是股票/投資衍生工具,甚至是社會上資源分配。

就拿社會上資源分配問題來說一些例子,
部份中產是利用相對優勢與基層博奕(or壓榨)中得到得益。
又或是,在沒有人能做大個餅的當下香港,有能力的人們(例如已上岸人士),利有僅餘的既有優勢,從劣勢玩家中壓榨利益。

—————————————————————————

生財/遊戲,我認為該是取之有道。
若是在比較公平的環境下明買明賣,我覺得尚可取。
但若是巧取豪奪,我就覺得是不義之財,不應為了利益而埋沒良心。

fortel-solar-term.js – 24節氣時間換算

依排抽返少少時間攪風水命理野,寫下code。

https://github.com/airicyu/fortel-solar-term

依個nodejs library其實只係做緊d好簡單既時間換算:
1) 由某個時間計返係邊年既邊個節氣月份
2) 估算某年既節氣月份既時間range

由於係純粹用Formula計,所以同現實測量既時間係會有所出入(around 5 min誤差)。

我寫依個library既原因,係因為我學八字想寫program/library去計。而八字係需要用節氣去定月份。

dev roadmap:
1) 寫個八字library (純粹起盤,不含analysis/interpretation)
2) 寫個擇吉日(結婚)library,擺上網free俾人用
3) 八字加少少analysis/interpretation,擺上網,類似我個fortel紫微斗數網咁樣。
4) 依排學緊奇門遁甲,又寫下d起盤library,加少少analysis/interpretation,擺上網….etc

遊戲的可持續發展

我個人並不反對d遊戲用expansion﹑DLC形式去營運。

雖然我個人身份係打機既玩家,但我覺得最大既win win solution係一種可持續模式。
一隻遊戲,玩家有方法feed到遊戲開發者,而遊戲開發者亦可以keep住update game content去令玩家打得開心。
而expansion/DLC形式,可以係一種可持續既營運方式。

其實又要拎warframe做例子,隻game出左好耐,佢定期出下戰甲/武器,d玩家就課金買下d戰甲/武器黎玩。佢地亦會keep住update隻game令到隻game有更多野玩。
其實隻game係可持續發展得幾好。

佢地有個平衡位做得好好既係,就算你係唔課/輕課玩家,其實你都一樣係玩到隻game完全冇問題。
一開始excalibar都係唔差,一開始果d槍你打mod升勁佢一樣係有得打。隻game主打PVE,亦不見得pay to win。

只不過,你課左,有得即時買D戰甲/武器黎玩(唔駛農材料),咪玩下新玩具囉。唔同槍唔同手感唔同樂趣,課金唔係屈機,而係課金係買新玩具玩既樂趣。

講返主題。
我自己真心係希望d開發者可以用心做到好遊戲。有好遊戲,我唔介意課金。
甚至調轉,我成日擔心d開發者用心做遊戲,但做不好$ feed back loop,最後很多很有potential的遊戲,最後都因為冇$而無以為繼開發下去。

現實是,正正是因為很難做到可持續健康發展(有幾多隻warframe?),很多遊戲開發最後都走上速食罐頭cap水之路。
玩家與開發商,其實從來都是互動生態關係。所以對這問題,我作為玩家亦覺得不能單單怪責遊戲開發商。

AI後社會

李開復去TED講AI後社會。除了慣常的routine<->creative既axis去分析社會既工作,佢用多左條compassion axis去睇人同AI合作既工作。

 

 


 

個人感想:

o係未來可能講緊幾十年時間,AI技術都仲係未「底特律變人」到,咁都應該仲可以講下人同AI既合作關係既。

不過雖然AI係令人類方便左而且多左時間,可以更注重生活﹑倫常﹑love。
但可能少數比較high end人口先可以enjoy到得益。
隨住未來一波又一波智能工業革命,首當其衝的是失業問題。
社會會越黎越多閒置勞動力,而失去工作後佢地冇錢亦冇生活,low end no job no $ no life。

科技free左d man power,而man power背後既價值(人工)係唔會交返去工作既人身上,而只會是根據supply demand重新分配。
當中利益我相信大部份會係由”employer/公司/財團”與”科技資產掌控者”(e.g: amazon, alibaba)瓜分。

AI革命係咪能為人類帶來新生活?
是的,但可能係部份人生活得更易,而部份人生活得更艱難;
以及部份生活的基本元素更方便,而部份生活的重要元素卻更難以追求。

Java紫微斗數排盤open source library

其實我一早就想把Fortel的core部份open source的了,不過現在才比較有空整理一下project,寫一點test case及doc。

Github: https://github.com/airicyu/Fortel

 

Fortel

Java紫微斗數排盤Library

Author: Eric Yu


Samples

排盤

排盤:一九五二年十二月十五日早子時天盤,男性

Config destinyConfig = new Config(ConfigType.SKY, Sex.M, 1952, 12, 15, false, GroundTime.getByName("早子").get());

Destiny destiny = new Destiny(destinyConfig);

System.out.println(destiny.toJsonString());

JSON Output(Formatted):

{
	"config": {
		"configType": "天盤",
		"sex": "男",
		"yearSky": 8,
		"yearGround": 4,
		"bornYear": 1952,
		"bornMonth": 12,
		"bornDay": 15,
		"bornTimeGround": 0,
		"isDoubleMonth": false
	},
	"shadowLight": "陽",
	"fiveElement": "木三局",
	"cells": [{
			"sky": 8,
			"ground": 0,
			"temples": ["兄弟"],
			"majorStars": ["貪狼"],
			"minorStars": ["擎羊"],
			"miniStars": ["天姚"],
			"preGeneralStar": "將星",
			"preAgeStar": "白虎",
			"preDoctorStar": "力士",
			"ageStart": 113,
			"ageEnd": 122,
			"persist12": "沐浴",
			"metadata": {}
		}, {
			"sky": 9,
			"ground": 1,
			"temples": ["身宮", "命宮"],
			"majorStars": ["天同", "巨門"],
			"minorStars": [],
			"miniStars": ["寡宿", "破碎"],
			"preGeneralStar": "攀鞍",
			"preAgeStar": "天德",
			"preDoctorStar": "青龍",
			"ageStart": 3,
			"ageEnd": 12,
			"persist12": "冠帶",
			"metadata": {}
		}, {
			"sky": 8,
			"ground": 2,
			"temples": ["父母"],
			"majorStars": ["武曲", "天相"],
			"minorStars": ["火星", "天馬"],
			"miniStars": ["天哭", "旬空", "截空", "封誥", "天月"],
			"preGeneralStar": "歲驛",
			"preAgeStar": "弔客",
			"preDoctorStar": "小耗",
			"ageStart": 13,
			"ageEnd": 22,
			"persist12": "臨官",
			"metadata": {}
		}, {
			"sky": 9,
			"ground": 3,
			"temples": ["福德"],
			"majorStars": ["太陽", "天梁"],
			"minorStars": ["天魁", "左輔"],
			"miniStars": ["旬空", "截空"],
			"preGeneralStar": "息神",
			"preAgeStar": "病符",
			"preDoctorStar": "將軍",
			"ageStart": 23,
			"ageEnd": 32,
			"persist12": "帝旺",
			"metadata": {}
		}, {
			"sky": 0,
			"ground": 4,
			"temples": ["田宅"],
			"majorStars": ["七殺"],
			"minorStars": ["文曲"],
			"miniStars": ["陰煞"],
			"preGeneralStar": "華蓋",
			"preAgeStar": "太歲",
			"preDoctorStar": "奏書",
			"ageStart": 33,
			"ageEnd": 42,
			"persist12": "衰",
			"metadata": {}
		}, {
			"sky": 1,
			"ground": 5,
			"temples": ["事業"],
			"majorStars": ["天機"],
			"minorStars": ["天鉞"],
			"miniStars": ["天喜", "孤辰", "劫煞", "天才", "天壽", "天空", "三台", "天貴"],
			"preGeneralStar": "劫煞",
			"preAgeStar": "晦氣",
			"preDoctorStar": "蜚廉",
			"ageStart": 43,
			"ageEnd": 52,
			"persist12": "病",
			"metadata": {}
		}, {
			"sky": 2,
			"ground": 6,
			"temples": ["交友"],
			"majorStars": ["紫微"],
			"minorStars": [],
			"miniStars": ["天福", "鳳閣", "解神", "台輔", "解神", "蜚廉", "天傷"],
			"preGeneralStar": "災煞",
			"preAgeStar": "喪門",
			"preDoctorStar": "喜神",
			"ageStart": 53,
			"ageEnd": 62,
			"persist12": "死",
			"metadata": {}
		}, {
			"sky": 3,
			"ground": 7,
			"temples": ["遷移"],
			"majorStars": [],
			"minorStars": [],
			"miniStars": [],
			"preGeneralStar": "天煞",
			"preAgeStar": "貫索",
			"preDoctorStar": "病符",
			"ageStart": 63,
			"ageEnd": 72,
			"persist12": "墓",
			"metadata": {}
		}, {
			"sky": 4,
			"ground": 8,
			"temples": ["疾厄"],
			"majorStars": ["破軍"],
			"minorStars": [],
			"miniStars": ["龍池", "天刑", "天使"],
			"preGeneralStar": "指背",
			"preAgeStar": "官符",
			"preDoctorStar": "大耗",
			"ageStart": 73,
			"ageEnd": 82,
			"persist12": "絕",
			"metadata": {}
		}, {
			"sky": 5,
			"ground": 9,
			"temples": ["財帛"],
			"majorStars": [],
			"minorStars": [],
			"miniStars": ["天廚", "咸池", "月德", "八座"],
			"preGeneralStar": "咸池",
			"preAgeStar": "小耗",
			"preDoctorStar": "伏兵",
			"ageStart": 83,
			"ageEnd": 92,
			"persist12": "胎",
			"metadata": {}
		}, {
			"sky": 6,
			"ground": 10,
			"temples": ["子女"],
			"majorStars": ["廉貞", "天府"],
			"minorStars": ["鈴星", "陀羅", "文昌"],
			"miniStars": ["天官", "天虛"],
			"preGeneralStar": "月煞",
			"preAgeStar": "歲破",
			"preDoctorStar": "官府",
			"ageStart": 93,
			"ageEnd": 102,
			"persist12": "養",
			"metadata": {}
		}, {
			"sky": 7,
			"ground": 11,
			"temples": ["夫妻"],
			"majorStars": ["太陰"],
			"minorStars": ["地空", "地劫", "祿存", "右弼"],
			"miniStars": ["紅鸞", "大耗", "天巫", "恩光"],
			"preGeneralStar": "亡神",
			"preAgeStar": "龍德",
			"preDoctorStar": "博士",
			"ageStart": 103,
			"ageEnd": 112,
			"persist12": "長生",
			"metadata": {}
		}
	],
	"starReactionMap": {
		"科": "天府",
		"權": "紫微",
		"忌": "武曲",
		"祿": "天梁"
	},
	"majorStarEnergy": {
		"貪狼": 1,
		"天同": -1,
		"天機": 0,
		"太陽": 2,
		"廉貞": 1,
		"武曲": 0,
		"破軍": -1,
		"天府": 2,
		"天梁": 2,
		"紫微": 2,
		"太陰": 2,
		"巨門": 1,
		"天相": 2,
		"七殺": 1
	},
	"destinyMaster": "廉貞",
	"bodyMaster": "文昌",
	"sonDou": 1
}

檢查宮垣

排盤:一九九零年三月十一日午時地盤,男性

檢查命盤命宮是否: 會見廉貞, 並且同時”天魁或天鉞同宮”或”不見化忌”

Config destinyConfig = new Config(ConfigType.GROUND, Sex.M, 1990, 3, 11, false, GroundTime.getByName("午").get());
Destiny destiny = new Destiny(destinyConfig);

/*
* 檢查命盤命宮是否: 會見廉貞, 並且同時"天魁或天鉞同宮"或"不見化忌"
*/
boolean result = new DestinyCellCriteria(destiny, Temple.TEMPLE_DESTINY) //命宮
    .and()
        .meetStars(MajorStar.MAJOR_STAR_HONEST) //廉貞
        .or()
            .sameCellSomeStars(MinorStar.MINOR_STAR_HONOR, MinorStar.MINOR_STAR_HONOR2) //天魁或天鉞同宮
            .notMeetStars(StarReaction.STAR_TO_PROBLEM) //不見化忌
        .endOr()
    .endAnd()
    .getResult();

System.out.println(result);

Output:

false

檢查命盤命宮是否: 會見廉貞, 並且同時”天魁或天鉞同宮”或”不見化忌”

/*
* 檢查命盤命宮是否: 會見貪狼, 並且同時"文曲及龍池同宮"或"宮位在戌"
*/
boolean result = new DestinyCellCriteria(destiny, Temple.TEMPLE_DESTINY) //命宮
    .and()
        .meetStars(MajorStar.MAJOR_STAR_GREED) //貪狼
        .or()
            .sameCellStars(MinorStar.MINOR_STAR_SKILL, MiniStar.MINI_STAR_DRAGON_SKILL) //文曲及龍池同宮
            .isCellGrounds(Ground.getByDisplayName("戌").get()) //宮位在戌
        .endOr()
    .endAnd()
    .getResult();

System.out.println(result);

Output:

true

JavaDoc:

You can view the Javadoc page at “\fortelcore\javadoc\index.html”

[Nodejs] FB Page post comment/reply event engine

岩岩寫左隻FB Page post comment/reply event engine既Nodejs module。

個module目的係幫FB page owner去mon住個FB page係咪有新comment,然後generate event & 俾個位d人自己去寫callback logic。

實際做法就係佢背底會行個schedule job去call FB graph API黎check post既new comments。

NodeJS module for keep track Facebook Page Posts New Comments

NodeJS module “fb-page-comment-event”

This module can keep track your Facebook page posts’ first level comment events. Hence, if someone commented on your post, you will be notified by an event.

This module support running an event-engine which would manage a background schedule job to check new comment and generating events. This module also support raw APIs which you can check new comments and digest as events by yourself via APIs.

 

Related Pages

Github page: https://github.com/airicyu/fb-page-comment-event
NPM: https://www.npmjs.com/package/fb-page-comment-event

 

Description

This module can keep track your Facebook page posts’ first level comment events. Hence, if someone commented on your post, you will be notified by an event.

This module support running an event-engine which would manage a background schedule job to check new comment and generating events. This module also support raw APIs which you can check new comments and digest as events by yourself via APIs.


Running the event engine

You may use the lib.pageCommentEventApp(options) API to get a event engine app and then start it with run function. This event engine app would manage a schedule job to auto pull data.

Sample:

'use strict';

let fbPageCommentEventLib = require('fb-page-comment-event');

const pageCommentEventApp = fbPageCommentEventLib.pageCommentEventApp({
    accessToken: 'EAASHAlSbbMUBALwwZCxZB1T7eDvFZBR......GQfNPb5Bxo5b2wdzMb45gJxcdZAFOQZDZD',
    pullInterval: 15 * 1000
});

pageCommentEventApp.registerMonitorPost({ pageId: 'xxxxx', postId: 'yyyyy' });

pageCommentEventApp.run((events) => {
    console.log(JSON.stringify(events, null, 2));
    return;
});
  • Remarks: pageId is the facebook page ID. postId is the facebook page post ID of post which you want to monitor its comment. accessToken is the Facebook page access token(remember to use the long live token) which Facebook page owner can generate in developer dashboard.

Sample console log output:

>node sample.js
{"message":"2017-12-21T19:18:48.701Z: Fetching post xxxxx_yyyyy with comments newer than (since=1514403141, time=2017-12-27T19:32:21.000Z).","level":"info"}
{"message":"2017-12-21T19:18:48.960Z: Fetched post xxxxx_yyyyy and filtered and returning 1 feed items which containing new comments. \"newLastScannedCommentTime\" reset to 2017-12-21T19:14:18.000Z.","level":"info"} 
[{
		"eventType": "comment",
		"data": {
			"pageId": "xxxxx",
			"postId": "yyyyy",
			"commentId": "zzzzz",
			"from": {
				"name": "John Chan",
				"id": "bbb"
			},
			"commentCreateTime": 1513883658000,
			"message": "test comment",
			"link": "https://www.facebook.com/permalink.php?story_fbid=yyyyy&id=xxxxx&comment_id=zzzzz"
		}
	}
]

(DIY) Use the APIs to check new comments and generating events

Sample:

let fbPageCommentEventLib = require('fb-page-comment-event');

let pageId = 'aaa';
let postId = 'bbb';
let accessToken = 'XXX...ZZZ';

let postDigestor = lib.api.getPostDigestor();

let since = Math.trunc(Date.now() / 1000) - 10 * 60; //since 10 minutes before

(async function () {

    let queryPostCommentAgent = lib.api.getQueryPostCommentAgent({ accessToken }); //initialize query agent with access token
    let postCommentFetcher = lib.api.getPostCommentFetcher(queryPostCommentAgent); //initial comment fetcher

    let postWithNewComments = await postCommentFetcher.fetch(`${pageId}_${postId}`, since); //fetch target post with new comments
    let postWithNewCommentEvents = await postDigestor.digest(postWithNewComments); //digest the post object into new comment events

    console.log(`postWithNewCommentEvents: ${JSON.stringify(postWithNewCommentEvents, null, 2)}`);
})();


event engine APIs

let app = lib.pageCommentEventApp({accessToken, pullInterval})

Description:

Initializing the event engine app.

parameters:

  • accessToken: The required accessToken(need permission manage_pages) for the API calls.
  • pullInterval: The sleep time(ms) interval between each scheduled page post new comment checking.

return:

The event engine app.

app.registerMonitorPost({pageId, postId})

Description:

Registering a page post which the event engine would tracking for new comments

parameters:

  • pageId: The page ID.
  • postId: The post ID.

app.run(eventsCallback)

Description:

Start running the event engine and register the new-comment-events callback. Once users write new comments, new-comment-events would be fired and handled by the callback.

parameters:

  • eventsCallback: The batch new-comment-events handling function.

app.stop()

Description:

Stop the event engine


DIY APIs

let queryPostCommentAgent = lib.api.getQueryPostCommentAgent(options)

Description:

Initialize a agent for query post comments.

parameters:

  • options: object with attribute accessToken which holding the required accessToken(need permission manage_pages) for the API calls.

return:

The agent object.

let postCommentFetcher = lib.api.getPostCommentFetcher(queryPostCommentAgent)

Description:

Initialize a fetcher for fetching new post comment.

parameters:

  • queryPostCommentAgent: The agent object which come from lib.api.getQueryPostCommentAgent(options)

return:

The fetcher object.

let postCommentObj = await postCommentFetcher.fetch(postObjId, since)

Description:

Use the fetcher object to fetch post object with comments. We can use this API to get all new comments under the target post which those comments are created since the since time.

parameters:

  • postObjId: The post object ID which is in format of ${pageId}_${postId} in Facebook Graph API.
  • since: The timestamp in second

return:

The post object with comments (All comments child objects are new comments).

let postDigestor = lib.api.getPostDigestor();

Description:

Getting a digestor object which can turn the post-comment object from postCommentFetcher.fetch() result into new-comment-events.

return:

The digestor object.

let newCommentEvents = await postDigestor.digest(postWithNewComments)

Description:

Use the digestor object to digest post-comment object into new-comment-events

parameters:

  • postWithNewComments: The post object with attaching new comments.

return:

New comment event objects