搜尋

搜尋結果

又有新颱風? 菲律賓以東熱帶低氣壓形成
生活在我城
小城小事多・2017-09-04

熱帶氣旋瑪娃對香港未有太大威脅,隨着瑪娃會在今日(4日)於廣東內陸逐漸消散,香港未來9天的天氣亦漸轉晴朗。不過,天文台表示,位於菲律賓以東海域的低壓區會在未來一兩日為該區帶來不穩定天氣。颱風警報似乎未能完全解除! 內地中央氣象台亦表示,菲律賓以東海面的熱帶低氣壓,已於今早8時在西北太平洋海面上形成,其中心位於菲律賓馬尼拉東偏北方大約810公里,中心附近最大風力達7級,預計該熱帶低壓將以每小時10公里向西偏北方向移動,強度逐漸加強,並有可能於未來24小時內發展為今年第17號颱風,然後逐漸向台灣東南海面靠近。若該熱帶低氣壓增強為颱風,將命名為「古超(Guchol)」。「古超」的命名是由米克羅尼西亞提供,在雅浦語中解作香料「薑黃」。 而台灣中央氣象局則指,目前在菲律賓東方的熱帶低氣壓,未來朝巴士海峽接近,有機會增強為輕度颱風,未來兩三天可能會影響台灣天氣。另外,天文台預料受副熱帶高壓脊影響,本周中後期中國東南部天色大致良好。最新九天天氣預報,香港明日(5日)起,一連9天至下周三(13日)會有陽光,部分日子會有驟雨,氣溫26至32度。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:http://hk.on.cc/hk/

「山里」北海道美食巡禮
澳城餐飲
LifeMag Editor・2016-07-18

北海道富有大量新鮮魚類海產及加工制食品。海產美食包括螃蟹、扇貝、海膽、三文魚及魚籽、青魚、近畿魚、魷魚、章魚、甜蝦、鮑魚、北極貝及生蠔。這些水產物蘊含細膩的口感,被認為海鮮界中最優質新鮮的上盛產物,特別是碩大肥美的北海道螃蟹,不論用鹽水煮食還是冷凍刺身,其醇厚的肉質都能揮發出極鮮甜的口感。除了在北海道,相信難以找到這種令人難以忘懷的滋味。 由7月19 日至8月31日,「山里」日本料理為您提供一系列的北海道菜式,所有材料都經由我們的行政總廚林彰師傅精心挑選及炮製,「山裡」為您一一呈現精美絕綸及獨特豐味的北海道風味,我們亦誠意邀請您光臨澳門大倉酒店享受是次的極品佳餚。 午膳套餐 每位澳門幣 580 元 午膳套餐包括: 前菜有松前半島魷魚及鯡魚子配醬油,北海道鮮魚兩種刺身,雪場蟹白味噌湯。特別菜式包括: 玉米牛油汁烤根室帶子或 炸物-炸富良野白露筍配薯仔餅,三文魚及三文魚籽飯配海膽,鮮魚清湯和甜品夕張蜜瓜及小倉紅豆雪糕。 晚膳套餐 每位澳門幣1,380元 晚膳套餐包括: 松前半島魷魚及鯡魚子配醬油,北海道鮮魚兩種刺身,雪場蟹白味噌湯。鹽烤喜知次,炸富良野白露筍配薯仔餅,醋物-釧路仙鳳趾漁港生蠔,三文魚及三文魚籽飯配海膽,鮮魚清湯和甜品夕張蜜瓜及小倉紅豆雪糕。 所有價格均加收10%的服務費。 「山里」日本料理 澳門大倉酒店二十八樓訂位或咨詢請電: (853) 8883 5127郵箱:yamazato@hotelokuramacau.com營業時間:12:15:00 (午市)及17:30-22:00 (最後點餐時間為:21:30) 逢星期一休息

#017 What seemed forever was just a moment
愛情婚嫁
李小時・2015-03-13

任何關係對於阿日來說都是被動的 她對於生活中來來往往出現的人 感到既無奈又害怕 她一直討厭改變 討厭別離 然而她的世界卻一直在改變 身邊的人則一直在離離合合 「若果你是為了離開的話 那你當初為甚麼要進入我的生命中呢?」 這晚, 她終於受不了 對著我歇斯底里地大吼著 「有很多事情, 都不是由我們去控制的 在過程中大家快樂過 不就好了 緣起緣滅 倒不如放開些 這樣會快樂一點。」 我說。 「你真冷血! 」 「難道你不知道過程中有多快樂 離開便會有多痛苦嗎? 你叫我再怎樣放心再與人交往 反正誰都不能永遠伴在我身邊 那倒不如不要了 我誰都不要了 沒有開始 便不會有結束...」 我不知道這樣會不會令她更快樂 我只知道這是個本末倒置的解決辦法 既然沒有人會告訴你一個「正確」的方法 倒不如讓她試試看她的 可能「條條大路通羅馬」 她的, 可能會是最好的 誰知道呢? 我總看見她很勇敢地把自己交出去 又很勇敢地把碎掉的自己找回來 來來去去 她怎麼可能勇敢的讓我心疼?「嘿, 我很痛喔, 讓我這樣痛的人 怎麼可能是他?」 可能, 只有天知道了 (Feel the night 詞: Mikkel S. Eriksen, Tor Erik Hermansen and Kiesza 曲: Mikkel S. Eriksen, Tor Erik Hermansen and Kiesza 唱: Jennifer lopez)

「流鶯」突臨澳門!「新沙圈」再現澳門男人之「性地」!
其他
澳門生活圈・2018-11-26

自從05年的「沙圈」 被本澳警方連根拔起之後 在這紙醉金迷的城市裡 從此少了一道旖旎的風景線 城市下的“嫵媚”從此銷聲匿跡 誰能料到13年後 被埋沒已久的「沙圈」 又在澳門重新崛起! 最近於本澳金光大道地段 久違的「沙圈」風景重新再現 一個個短裙高跟鞋、 一頭頭順直的長髮、 一個個前凸後翹的身影 出現在本澳路氹一帶 凡有男士路過 她們都在不停地向他招手... 什麼是「沙圈」? 「沙圈」出現在上世紀70年代末。據悉,當時有風靡歐美的「巴黎艷舞團」來澳演出,但當中有「俄妹」趁機「企街」搵快錢,「沙圈」是其中一個據點。 直到90年代,「沙圈」幾是內地女子天下,由於酒店有規矩,妓女不能停下,要不停走動,故有「沙圈踱步」之名。 「沙圈」的前身是南灣遊樂場,有如香港以前的荔園,裏面有木馬和摩天輪,因為沙地處處,又有女子在此搵食,從此「沙圈」一詞,就開始被傳播下去。 「沙圈」,原指馬匹走到公眾席上,任馬迷近距離觀察馬匹狀態的地方;但在澳門,「沙圈」指的是一群徘徊賭場的「流鶯,也稱為夜鶯」。 「流鶯」,本指的是一種漂泊的小鳥;現如今還包含著另一種喻意,就是無固定場所在街頭拉客的妓女。 從1974年開始,「沙圈」在葡京形成40餘年,幾乎都是好色之徒定期必到一次的「性地」。 葡京「沙圈」曾是多少令男人眼睛發亮的地方,因為這一道獨特的「風景」,似乎成為了一片「聖地」,該區的娛樂事業蓬勃發展。 直到了2015年1月初,這一道耀眼的「風景」就被埋沒於人群中。 金光大道再現「沙圈」 自屹立40年的「沙圈」被埋沒後,一橋之隔的路氹城金光大道,再次崛起新一輪的「沙圈」! 上周五(23號)淩晨,司警在路氹金光大道一帶進行打擊賣淫活動,行動中帶走3名泰國籍男子和1名菲律賓男子,4男承認來澳賣淫。 該4名男子用胭脂掩蓋了身上的雄性特徵,變身窈窕嫵媚的女子,大搖大擺出現在街上不斷地招攬途人。 最後,司警共截獲4名男扮女裝的流鶯,帶走12 名內地女子。 不得不提的是,在2016年6月時,澳門司警同樣搗破類似的案件,截獲7名菲律賓籍男扮女裝「妓女」; 而在早前的2015年,男扮女裝「妓女」更是發生過一幕令人驚嘆的事情→幾名南亞裔「妓女」在新口岸與一名內地漢發生爭執,因內地漢發現貨不對辦,一怒之下造成了血案! 這讓人說些什麼好呢,男扮女裝去招攬生意,被識破後往往兩邊尷尬,丟人丟到家。但相信那些嫖客大多數都是低調私了此事,畢竟,大家還是要見人(臉)的。 對於這些外籍男士,都是在本澳難以立足的外僱,專騙嫖客的上當的無恥之輩,這股歪風邪氣始終都會惹起不少治安問題。 曾經的「炮房」 2016年1月份,司警曾採取掃蕩行動,在葡京酒店「沙圈」一案,帶走了90多名妓女。 司警還找出大本「花冊」,花冊裏紀錄了2,400多名內地女子來澳賣淫,每名妓女要在「沙圈」拉客,必須支付15萬元「入場費」。 集團在之前的1年多,單是靠妓女所盈利來的,就已經上達4億澳門元。 司警早於2013年4月接獲情報,指有酒店高層利用職權,指揮旗下員工從事招攬、安排妓女在酒店賣淫,並以YSL(young single lady)系統統一管理,酒店五、六樓共120間房間,專門用作「炮房」。 120間炮房,小編算了算,一天下來的盈利.... 「新沙圈」VS「舊沙圈」 「新沙圈」和「舊沙圈」有著不同的區別,「舊沙圈」主打的是傳統一般妓女,簡明來說,都是內地或者本澳的女子,最重要還是女的。 而「新沙圈」是國際大雜會,除主打內地女子和東南亞之外外,還有遠至俄羅斯、澳洲、東歐等地都有,她們最常說的是「性交易是合法的,只要沒有員警」。 假流鶯為何鋌而走險? 看到這裡的小夥伴可能要問:這些假流鶯明知上房後一定會「穿煲」,但為何還是要這樣子做呢? 根本沒有人知道其中的原因,但有一點能肯定的是,離不開錢。 這般大搖大擺在街上攬客,難道是想進警察局蹭飯?無論怎樣,這種歪風邪氣在本澳出現,擾亂了社會問題,且自身的價值觀已經跌到在深谷裏。 「新沙圈」之道 本澳時事評論員譚志強認為,形成一個「沙圈」,天時地利人和缺一不可,而「新沙圈」的確有條件形成,那些流鶯自有其生存之道。 一個女人出來從事賣淫活,如果背後沒有人操控,理論上是不違法的;但依靠妓女為生的人,則明顯違法。 「沙圈」內房間日租1100元,每次“肉金”劃一價1500元,而「沙圈女子」平均每天會接3個客人。 減掉所有“硬性開銷”,「沙圈女子」每月平均賺取4萬至5萬元不等。 有人曾聲稱,自己1年間已經淨賺到高達60萬港元,平均月薪達到5萬元。 由於收入可觀,「沙圈女子」即使多次被限制入境仍然要偽造假證,或者偷渡來澳門繼續從事賣淫工作。 譚志強表示,“一個女人靠賣淫為生,理論上並沒有違法”。 譚志強續稱,澳門長期以來不衰落,主要有一班很忠實的香港客人來澳耍樂,其實對旅遊業也有一定影響; 事緣賭與黃“不分家”,很多賭客來到澳門玩樂。其中香港有幾10萬男子沒有娶老婆,怎麼能禁得住,你說是吧? 「沙圈」再度在本澳掀起一番風雲 但這一次參合了一些男扮女裝似乎... 現在不是都流行一句話嗎? “躺著也能賺錢” 是呀,看看她們的年薪高達幾十萬 和我們每天辛苦搬磚的收益天壤之別 賺的錢多少不說 但是意義已經不一樣了 小編想強調的一點是 現在是化妝和手機美顏的時代 有些差距不是一般的大 男扮女裝能不被當場認出 這化妝的技術到底是有多厲害 教小編一招,讓小編也成為一名美男子 素材來源:力報、百度百科 圖片來源:力報、攝圖網、網絡、360表情庫 版權屬於原作者 編輯撰寫:小嚕

我自慰多次,得到果報
玄學星相
熊神進・2016-10-29

覆:真 信件內容:(由於隱私問題,以下部份內容已被刪除) 南無阿隬陀佛,南無觀世音菩薩。如有福氣選取麻煩老師刪除敏感、手術資料,感恩。您好,老師,很意外寫這封信。 06年聽過您的名字,2012年無意收聽您的微博,一個月之後,才去看看其內容。也是這次不再與佛法擦肩而過。我出生於xxxxxx,名字是xxx,女性,身份證號碼是xxxxxxx ,本來名字母表幫我取是xxxx,後來父親和工作人員搞錯,我對他們簡直無語,現在在深圳打工。 生於1989年xxxxxx。非常一般家庭,有弟弟、妹妹。小時候我母親是在糖果工廠打工,規矩不嚴,所以一到放假,便到廠裡幫忙 ,那時,很羡慕別人,可以在家吹電風扇,看電視 ,玩耍。記得我讀4、5年級,我爸爸過去深圳打工,掙錢也不多,之前是在服裝廠打工,我媽媽挺辛苦,忙外面又忙家裡大小事務。也許這樣,沒有養成一定要吃肉的習慣。 有一年,我的親人從外面弄來一條狗腿,家人沒吃,贈與鄰居,南無阿彌陀佛,南無觀世音菩薩。小時候,有段時間,家裡有養貓狗,至於它們來歷,我不太清楚,有時生病,有一次狗狗病了,我想哭,父母也會找獸醫醫治,有時母親心情不好,會打它們,南無阿彌陀佛,南無觀世音菩薩,最後把它們賣掉。 家運本身不好,變得更差,父母身體不好,兩人經常吵架,因為生活費,其間有婆媳、姑嫂爭吵,父母身體接連不好,盜賊入屋,後來找玄學師傅解析,有冥界女靈纏上我父母,我聽母親說,原本有一位妹妹,也許業力吧!很小就不人間,因此我外婆失常,後來找到一名江湖術士作法,我外婆得以恢復。我奶奶年輕時,懷孕中意外流產。因為拜神儀式,所以要弄清楚哪一邊,不過,大人跟我說的含糊其辭,也不願多講。 那位玄學師傅還講鏡子不要正對床,不要擺放來歷不明掛象。也有好心鄰居跟我們說家裡放一隻公仔,時間久會有靈氣,保佑一家平安。菩薩不要安放在電視旁。至於這菩薩像來歷是這樣,我的姑丈喜歡買神象,不知何原因遺放在我家裡,我奶奶不知聽誰說,好像沒挑日子,就安放。之後安放在另一處,只有過年節才在那吃飯,平時放單車。 其中母親生病動手術,因為陰道長瘤,要割除,在康復期間,我外婆過來照顧母親,有時我母親買些活魚,很便宜,我外婆便問道,我母親說農民在河裡撈,別人放生。 之後某個晚上,我母親陰道不停出血,幸好鄰居陪伴並勸說送進醫院,也陪伴我三姐弟家裡渡過一晚上,至今我記得洗過血淋淋的內褲,寫道這裡,有點顫抖不已。在這裡,也感恩曾經幫助我家的鄰居,親戚朋友。 那時有佛教信士教我母親多禮拜佛像,也許攀緣心不夠,來去匆匆。現在說說我,我的讀書成績非常糟糕,記得7、8歲時,慘遭鄰居猥褻,那時我母親還在廚房弄菜,自己也不敢吱聲,第二次,在路上遇到騎摩托車問路,他叫我靠近,我覺得不對勁,便撒腿就跑,幸好快到家,那摩托車人看到我,也看到我母親在家,便開走。第三次,有時,跟母親回外婆家住段時間,在農村,有位女孩是有點親戚關係,我幾歲,她有十幾歲,有一次,說帶我出去玩,於是我被猥褻,第四次,也是跟那女孩的弟弟,他倆很少在家,一個出外打工,一個在外讀書,剛好那我去他家,她的弟弟跟我做些不雅動作,也許他還顧及他的父母在廚房弄菜。 據我所知,其中一人身體不好,而我自慰多次,得到果報,讀書不好、工作不濟。曾經,我也怨恨父親,幹嘛跑到那麼遠打工,錢掙不多,又無法照顧家人。其實寫這三千字並沒有想像中容易,寫那些不光彩回憶、不開心的事,自己早已選擇忘記或深藏內心,現在寫起來,一點點回憶,寫起來斷斷續續。有時想哭,但哭不出來,也許習慣眼淚往心裡流。 看到這信件的姐妹們,應該對孩子這方面教育,免受性侵害,勇敢說出來,不要害怕,也許是最親近的人對其傷害。有時我也自認業障,來到娑婆世界,就是完成某些業力,例如,胎死腹中或英年早逝等,其實沒有什麼傷心,只因那股業,不然,哪需輪回。 從小到大都渴望自己能夠獨立生活,獨立面對這個社會,事與願違,工作能力糟糕,從初中畢業出來,一直依附在親戚朋友打工,工資低,時間長,很鬱悶,渾渾噩噩過日子,現在這份工,是銷售衣服,個體小店,同行之間,自己老實做事,同行小人也會作怪,難免沒有口舌事非,紅樓夢有這樣兩句話,世事洞明皆學問,人情練達即文章。哪這麼容易做到,能做到就可以成佛。如果按四書五經去做人,那麼再去學佛,上路比較快。 目前希望自己能夠改變,過幾年就要奔三十,如果自己還是這樣過日子,因扛不住世俗看法,為結婚而結婚,我的夫妻宮有痣,最後自己受小愛之苦,不想兜一圈,尋找宗教信仰,精神慰藉。但自己實在不想結婚,除了自己心靈弱小應付不了世事無常,還有自己不怕孤獨與寂寞,享受單身,小時候就聽大人聊哪裡有尼姑庵,內心歡躍著,能出家、看看經文是件多麼美好事情。現在覺得,如果沒有虔誠發願為眾生,白吃別人供養米飯,別人也是辛苦得來,果報很大。 小時候跟奶奶來到深圳,跟隨姑姑一家一起生活,放暑假時候。有時到公園走走,總感覺很熟悉,會想從前的我是怎樣?在這裡做過什麼?感覺太強烈,令人不安。因為現在我呆在深圳打工,再回到那地方,已面目全非,全建成樓房,心裡覺得不舍、甚至有點傷心。現在我和弟弟在親戚打工銷售衣服,妹妹在招商銀行上班,父母在家鄉,父親是在服裝廠,母親是在茶葉廠。 我也想請法器給家人,他們還缺少福氣與緣分。如果請了,會覺得我受騙。我要再寫一遍我實在不想銷售服裝,時間太長,沒有時間做自己的事,這個社會存在希望與無奈,我更多屬於無奈。 目前已做過近視眼鐳射手術與腋臭手術。下半年想做項雙眼皮手術。我長的比較大眾臉,我被別人認為親屬、朋友、同事。我覺得每個人心性、思想不同,怎會長的一樣。以下我寫這些,我是想到什麼,就寫什麼。因為信件刊登,如果有福氣刊登,大家隨意看,我也知道老師跪地菩薩讀信件,感恩。 我幾歲時候,沒大人教,經常在地上一字馬,十幾歲聽母親說,當時我說某位老人家厲害,會一字馬,我母親才說起這事,當時鄰居看到講去某個地方學習。那時我心想經濟原因。 現在我想說我的夢,從小到大,作夢次數多。講幾個印象深刻,第一個,晚上作夢,夢裡聽到聲音講有小偷,我覺得這是夢,繼續睡,第二天發現客廳電視、音響之類全沒,前面有提過盜賊入屋。夢裡場景難形容。第二個,讀書時,小學升初中,怕自己考不上,第二天要發佈成績,頭晚上,在床上躺著,專心默念佛號,進入夢境,場景像電視神話劇,在夢裡自知這是作夢,要快點醒,我大走幾步,竟然飛起來,那聲音無法形容,看到一尊如來佛盤坐那裡,跟我講人生道理,我內心想,不聽不聽,要快點醒來。第三個是最近,前段時間,半夜被夢驚醒,夢到我被海水淹沒,狂吐海水,醒那刻,自己狂吐口水,第二天新聞報導某城市發生沉船。第四個,在夢中被一團黑霧似人形,掐著脖子,掙扎無效,念佛號,即醒。現在說說信仰,我曾想皈依三寶,認真想過,還是等多十幾年後,即使現在去皈依,只是形式,內心並沒有遂步放下。目前還為生活奔波。 我覺得只要按照戒法、多誦讀佛典原經、禪修實證。就不會受騙財騙色,也不會對神奇怪異產生好奇或驚訝。佛法不偏重於神通,那不是究竟。禪修實證過程中能自醫自身病患,智慧開發,得神通[如果執著,落入彎路],甚至肉身、氣色變化,長壽,不過這要看各人福德、能否守戒、禪修目的是什麼。 我也沒這福德,對於有人走捷徑,學佛法路很長,如果有個終點,落在形而下,如果沒有,那麼很多大僧大德走過,所以首先學佛是為什麼。我僅是說說,我連信仰都談不上。南無阿彌陀佛,南無觀世音菩薩。最近想學好英語,想出國打工生活,不知此願能成?我會擁有自己事業與樓房?我想一生單身能成?對於寫了一篇水流帳的回憶,有些回憶早已選擇遺忘,文筆糟糕,自己也沒多大期望能得到老師解析宿命因果,一時興起,一切隨緣,一切自有安排。現在想起母親每年會給我請平安符,和你的法器放在一起,應該沒問題吧!?願意刊登照片與內容 熊神進老師回答: 首先筆者以專業資格告訴妳, 妳必須先改名, 因為妳的名字是對父母不利, 也對未來丈夫父母不利, 為了剔除這些負元素, 改名是最佳選擇。 其次我想從三世書的說理中向妳說, 妳母親當年把家犬賣了, 愛犬是有先知的, 牠死前一天很想逃走, 反回妳的家, 跪謝你家的養育, 牠不怕死, 只是心願未完成而死去, 有點不安。 牠在柱死城很不自在, 可能說了一些不禮貌的咒駡, 你們的家庭會受小許影響, 筆者建議妳家人要行善, 全家人天天念一次地藏經, 回向給眾生, 望眾生離苦。 在此, 筆者感謝當年曾經幫妳家人離苦的佛/道/玄學家, 他們辛苦了, 感恩! 猥褻, 是因為妳的大運遇上沖夫宮的劫星, 妳在10歲前已失了女兒身, 童年陰影絕對影響你的愛情觀, 由於這些劫伴隨在妳的身邊, 妳很努力推開, 而劫又一次一次走來, 妳嘗試佩帶開光金剛橛, 效力很強, 之前很多藝人用了, 也說威武。 我以十分遺憾的心情聽到妳的遭遇, 在佛教中, 幾千年前的印度真的存在「猥褻儀式」(參看『印度教與佛教 史綱』), 現在社會, 法制嚴謹, 再不可能出現合法的邪淫, 妳受到的侮辱, 我是很理解。 我不排除, 樹木大了, 總有三幾棵枯樹, 玄學家之中, 亦有少許急進人士, 但整體來說, 人在做, 天在看, 如果用神佛之說來行騙, 死後也是下地獄, 生前多二個錢吃肉, 倒不如真心為眾生服務, 我是這樣想。 學佛法路很長, 皈依是第一步, 如果妳有緣去學, 妳先入寺瞭解一下, 每天總是說有心, 而沒有行動, 永遠都是沒用, 請立即行動, 在當地的寺問問有闔皈依的問題, 我們不要因為一二座寺的行政失當就以為全世界的寺都是黑店, 這是錯誤邏輯, 不值得習。 命運是掌握在強者手上,並不是決定在玄學家口中,熊老師只是善心提點有緣人,ta應該積極面對人生,而不是消極逃避問題。熊老師已為有緣人關上命盤,並祝福她。 如有任何問題,歡迎聯絡: 林小姐: 13726267799(晚8時後) 熊神進:澳門 853-66618785 Facebook: 熊神進(澳門風水師) 公共微信: macaumasterxiong 淘寶風水法器店:http://macauhung.taobao.com

Spring Boot 05 - 為 http json api 加入登入要求
科技新知
MacauYeah・2024-07-02

本節,我們將為之前的http服務,加入認證機制,只有在資料庫現存的用戶可以登入及訪問我們的json api。 下戴模版 慣例,我們用Spring Initializr (Maven) 下載模版,Dependency主要選擇 Spring Web Spring Boot DevTools Spring Security Controller 跟上節一樣,我們起一個Controller,為簡化測試,我們只做http GET api。 由於本blog對於Source Code的顯示不太友好,有需要看source code的,請到Github查看 //src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeController.java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class HomeController { @GetMapping("/someRecord/{uuid}") public Map readSomeRecord(@PathVariable String uuid) { return Map.of("ret", "your uuid:" + uuid); } } 準備我們的test case,但這次我們預期它應該要出現登入失敗的結果。 //src/test/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeControllerTest.java @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest { @Autowired private MockMvc mockMvc; @Test void testNoLogin() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is4xxClientError()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").doesNotExist()) .andDo(MockMvcResultHandlers.print()); } } 在我們執行上述的測試,test case 成功過了。我們的基本設定跟上一節其實沒有多大改動,為何現在http api會回傳狀態 401? 那是因為我們在依賴中加了,Spring Security,它配合了Spring Web,就會自動為所有api加入權限檢測。我們的測試中,沒有任何用戶登入,當然會出現 http 401。為了讓我們可以好好管理誰可以使用api,我們就來設定一定Security。 我們加一個WebSecurityConfig.java,暫時指定所有的訪問路徑都必需有USER權限,並且用 http basic的方式登入。 //src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/config/WebSecurityConfig.java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorizeHttpRequests -> { authorizeHttpRequests.requestMatchers("/**").hasRole("USER"); // 所有的訪問路徑都必需有USER權限 }); http.httpBasic(Customizer.withDefaults()); // 使用http basic作為登入認證的方式 return http.build(); } } 上述例子,只是擋了沒有權限的人,我們還需要讓有登入身份的用戶可以成得取限User權限。 我們繼續修改,WebSecurityConfig,加入只在記憶體有效的InMemoryUser import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; public class WebSecurityConfig { //.. @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); // 我們的密碼不應該明文儲,比較保險,我們使用BCrypt演算法,為密碼做單向加密。 } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withUsername("admin") .password(passwordEncoder().encode("pass")) .roles("USER").build(); // 我們在記憶中體,加入一個測試用的User,它的名字為admin,密碼為pass,權限為User return new InMemoryUserDetailsManager(user); } 然後加入新的測試,直接模擬Role。結果是通過的。 //src/test/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeControllerTest.java @Test void testLoginWithRoles() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .contentType(MediaType.APPLICATION_JSON).with( SecurityMockMvcRequestPostProcessors.user("someone") .roles("USER", "ADMIN")); // 沒有使用密碼,只使用Role this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is2xxSuccessful()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("your uuid:1234")) .andDo(MockMvcResultHandlers.print()); } 再來一個測試,改用密碼登入,分別輸入錯的和正確的密碼。 @Test void testLoginWithWrongPasswordAndNoRole() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .header("Authorization", "Basic randompass") // 輸入錯的密碼,應該回傳http 401 Unauthorized .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is4xxClientError()) .andDo(MockMvcResultHandlers.print()); } @Test void testLoginWithPassword() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .header("Authorization", "Basic YWRtaW46cGFzcw==") // http basic 就是把 admin:pass 轉成base64 .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is2xxSuccessful()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("your uuid:1234")) .andDo(MockMvcResultHandlers.print()); } 最後,當然是正確的密碼才能通過。若果大家還是半信半疑,我們可以跑起真的正服務(IDE RUN或mvn spring-boot:run),然後用curl去試。 curl http://localhost:8080/api/someRecord/1234 // failed with 401 curl -u "admin:pass" http://localhost:8080/api/someRecord/1234 // successed 使用SQL Database讀取用戶登入資訊 一般而言,我們不可能把所有用戶登資訊打在InMemoryUser中,通常背後有一個資料庫儲存所有的用戶資訊,我們在登入時,讀取它來做對比檢證。 為此,我們在maven中,加入 Spring Data JPA h2 database (或任何你的資料庫,如mysql 、 sql server) 最後一步,我們把InMemoryUser去掉,改為從資料庫讀取。因為原始碼太多,就不全部貼上。最主要的是WebSecurityConfig.java要關掉之前的UserDetailsService,改為提供一個UserServiceImpl類,它會實現UserDetailsService的功能。 @Configuration @EnableWebSecurity public class WebSecurityConfig { // 把原來的Bean先變成註解,其他不變 // @Bean // public UserDetailsService userDetailsService() { // UserDetails user = User.withUsername("admin") // .password(passwordEncoder().encode("pass")) // .roles("USER").build(); // return new InMemoryUserDetailsManager(user); // } } // spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/config/UserServiceImpl.java // other import import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; @Service public class UserServiceImpl implements UserDetailsService { @Autowired PasswordEncoder passwordEncoder; @Autowired UserRepo userRepo; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 因為我們資料庫沒有資料,為了方便測試密碼的加密,我們在java code上直接插入一筆資料。 UserEntity defaultUser = new UserEntity(); defaultUser.setUsername("admin"); defaultUser.setPassword(passwordEncoder.encode("pass")); defaultUser.setRole("USER"); defaultUser.setUuid(UUID.randomUUID().toString()); userRepo.save(defaultUser); // 上述為測試用插入資料,不應該出現在正式使用環境中。 UserEntity user = userRepo.findOneByUsername(username) .orElseThrow(() -> new UsernameNotFoundException(username + " not found")); // 找找資料庫有沒有正在登入的該名使用者username List authorities = List.of(new SimpleGrantedAuthority("ROLE_" + user.getRole())); LOG.debug("got user uuid:{}, username:{}, role:{} from database", user.getUuid(), username, user.getRole()); // 如果前面的 findOneByUsername 有結果回傳,我們就給它一個ROLE_XXX的權限。 return new User(username, user.getPassword(), authorities); // 這裏從沒有檢查過密碼是否有匹配,全部交給Spring Security去做 } } //spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/entity/UserEntity.java // spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/repo/UserRepo.java 上述段落中,筆者省略了UserEntity和UserRepo,它們只是一般的spring-data-jpa概念,有需要可以經文末的連結查看完全原始碼。最需要注意的,是UserEntity的password欄位,在資料庫中是以加密的方式儲存。我們在配匹登入者與資料庫記錄時,也沒有自行檢驗密碼的需要。我們只是在加密過的密碼回傳給Spring Security,Spring框架會自行把登入者輸入的密碼與加密了的密碼作比較。

澳門劇本殺社群 ── 訪摩斯探案館
人物專訪
繪本與棋@黃庭熾・2021-08-30

  謀殺之謎(Murder Mystery Game​​),俗稱劇本殺,隨大陸綜藝節目興起,後席捲全國,成為接棒狼人殺的新興國民級娛樂活動,產值上看二百億。   劇本殺在狼人殺的邏輯推理玩法上加入了情感向的角色扮演任務,讓後電視時代的每名國民都有秉公斷案的機會,傾注心力、感情,展現常識、智慧,當一回風波裡的嫌疑人或破案神探。   近年,澳門以劇本殺為賣點的線下實體店也如雨後春筍般冒起,位於提督馬路與雅廉訪交界、華隆工業大廈四樓的摩斯探案館是其中一間。 ─§─ 大學同學,合伙「作案」   Larry 是摩斯探案館創辦人,亦為當中一位主持,談到當初如何接觸到劇本殺,他說契機來自於工作。   「當時的工作會接觸到大陸人。」2017年,Larry 首次接觸到劇本殺,他回憶:「2016年,劇本殺在大陸開始走紅,被熟悉的客戶推薦去玩;當時講話要返大陸玩喎,一玩就要玩四、五個鐘,其實我好抗拒。半年後,才成行,去了之後我覺得:嘩,幾好玩喎!」   劇本殺刷新了Larry 對社交娛樂的想像,他開始反思自己社交圈的制約:「因為呢,我自己本身鍾意打波、鍾意運動,圈子以男仔居多,但也不是每個人都鍾意運動、打波,你就談不上話。而劇本殺,我覺得一來,好有趣;二來,可以同新、舊朋友有一個社交場合,即係可以,同人交流、透過玩的方式;或者,以前的朋友,本身沒有交集的興趣,便可以推薦下去玩 ── 多一個活動幾好啊,而且,去一去的話,對對方的了解都會變得更深。」新興的活動,讓Larry 對與人交往有了嶄新的想法。   Jack,Larry 的大學同學,如今的合伙人,摩斯探案館另一位主持。他回憶:「是他叫我過去玩。我本身就玩開桌遊,那時候他向我介紹這玩意:欸,都有興趣喎!玩過幾次後覺得:啊,幾好玩喎!我自己在大陸也都有朋友,他們亦鍾意玩劇本殺,所以除了跟Larry,我也會自己走去佛山揾朋友一起玩。」自言投入的時間沒有Larry 多,但Jack 亦話「好鬼死中意」劇本殺:「我自己本身好中意睇推理小說......所以我一玩劇本殺,發現:可以照自己判斷推理啊,要推翻、還原其他角色的發言啊、案情啊 ── 就好中意它的機制;可以說是一玩就中意了。」劇本殺,讓Jack 方方面面的興趣結合在一次遊戲裡,讓他與Larry 有了新的話題、新的交集,讓他們與許多原陌生人結交了善缘。 ─§─ 多項活動,何樂不為   劇本殺風靡萬千國民,其樂趣與爽點見仁見智。但如喜歡喝咖啡和經營咖啡店是截然不同的兩回事,從喜歡到經營,兩位老友為何會選擇在這個時間點開設劇本殺線下實體店呢?Larry 直言:「第一個係疫情關係啦,因為疫情,不方便去大陸玩 ── 其實一路都有相關計劃,但係,自己本身做生意是『初哥』,一直都停在『諗』字上,如今,疫情係一個契機。第二呢就係,其實我一直都覺得有得做,但係之前就自己忙啦,又覺得,自己不會搞啦。我覺得劇本殺在澳門係有市場的,因為,雖然仍在推廣期、仍然有好多人不知道它,但已經有大陸成功的經驗呢,已經證明年青人係鍾意玩劇本殺。總括來說,一來就係疫情契機啦、二來就覺得,這一個熱潮呢係真係存在的,在大陸獲得了成功。」   「至於你話劇本殺的核心價值是甚麼?」Larry 續道:「我覺得,首先,即係得罪講句:澳門人呢好悶,可參加的活動少,平時的社交活動、或者係想揾休閒娛樂呢,一係就係約朋友出來食,一係就係唱K ── 現在都不流行唱K 了,叫唱K 基本上沒人會到,就全部都係食飯咯。那食、食、食......食得幾多餐?如今,有這個可能、締造多一個機會:啊,約朋友來玩下第二樣啊,不用每次都只有食。加上年紀大了,食得幾多?又食得肥,又不健康。那麼多一樣活動去提供給澳門市民去選擇,我覺得係可以的;第二呢,我覺得這個遊戲係真係好玩,係它的核心價值;第三呢,這個遊戲係真係交到朋友,即係你和舊朋友聚會都好,又或者你係『拼車』 ── 即劇本殺的團可能缺人喎,你和陌生人拼在一起玩 ── 一個有質素的玩家,你為人係講禮貌,在遊戲過程中好易識到新朋友。我覺得,這些都是劇本殺創造出的價值咯。」   「我都好同意Larry 頭先講話澳門人娛樂活動上缺少選擇。所以澳門人 ── 若你有四、五、六個人想一起玩呢,選擇好少。」Jack 附和Larry 的觀察,並且補充:「而劇本殺相對於桌遊,不需要某一個人先睇一串複雜的規則,或者需要好邏輯性地玩,劇本殺中有崇尚輕鬆的『歡樂本』的玩法啊,加上角色扮演的玩法,我覺得比較適合澳門的後生仔、白領啊,都好適合。之前,澳門好難聚集到一個社群,因為大家都自己返大陸玩,但如今,有澳門本地的門店,有了group 之後呢,個group 會自己慢慢成長。」   澳門呢彈丸之地,有世界級酒店,亦不乏國際旅遊項目,四方旅客慕名而來;但日常不同於五光十色的旅程,生活的源頭活水,只能通過紥根於民間的、居民自發的文化活動,才能讓安居樂業的都市人甘之如飴、重拾活力。 ─§─ 與人同樂,樂此不疲   雖說劇本殺次文化未在澳門普及,但劇本殺作為娛樂活動的新近風口,認識到春江水暖的可不會只有一隻鴨子,當萬木爭春、各門店並起爭奪有限的玩家資源的時候,摩斯探案館會如何確保自己的客源呢?Larry 說:「其實呢,劇本殺店呢,都大同小異;你從大方向講,其實係無甚分別。熱門的劇本呢,每間店都會入,最大的差異呢,就係主持人不一樣、地點不一樣、裝修不一樣,你可能覺得這個地點適合你、方便,所以就近落腳,或者覺得這個店價錢便宜,或者那個店服務好,可能有人覺得貴好、舒服,各取所需。我們現在的定位係:在澳門裡面,相對係便宜。還有,我們的地點係靚的,位置交通方便,加上這個房間係適合、做劇本殺係適合的。」   他強調:「劇本殺店的差異,真係要講個主持人 ── 帶本的風格。就算係大陸都好,通常不會特別標籤門店的特色,而係會話:啊哪個主持、我想揾哪個主持玩喎;啊哪個帶得好。或者說,我們和其他門店的主要區分都係 ── 人囉。」人物、個性、關係、事件、動機......劇本殺是模擬社會互動的娛樂,人是社會性動物,瞄準人、經營人,是淺顯易懂也知易行難的工作。   而作為一個個人,從玩家搖身變成一個經營劇本殺門店的東主,在這個實踐的過程中,可有值得分享的難忘或者有趣的事呢?我問。   Larry 表現得感觸甚深 ── 大有孩子沒娘、說來話長的味道。他說:「好多難忘的事,講其中開心的吧。第一呢,我覺得呢,我個人進步了。以前,自己不是特別擅長與人溝通,所以頭一、兩次呢,帶本的時候好似傻仔,回想起來都覺得羞恥;但係當你帶了廿幾、三十次,幾十次過去啦,你慢慢會有進步,逐漸掌握到帶領別人的能力。你會意識到,自己改變了。以前,不會跟那麼多人、陌生人去交流,無論係要將自己的諗法,或者要介紹遊戲的玩法,或者要領導參加者玩遊戲,開店之前係零經驗的;但現在,經營下來,我覺得,有一樣好滿足、比較深刻的就係:參加者覺得好玩喎,想再次揾我玩喎。即係玩完之後,即刻話:欸,下次再約喇,幾時、幾時又約......好滿足。這是我無法從過往的工作中得到的體驗:帶給別人歡樂的滿足感啦,自己可以完成一件事的成功感啦,還可以結識到好多不同背景的朋友。」在把自己的興趣事業化的過程裡,主持人得到最深的個人成長,這些回憶裡,有初心落地的、有喜出望外的、有不足為外人道的......歷練了心靈。   「的確,他成長好多。」在摩斯探案館,Jack 像一個敏銳的讀者,觀察他的合伙人、觀察來往的玩家,看雲開雲合,像讀到精彩描述的讀者一樣露出意味深長的笑。Jack 分享了他的觀察:「我自己來說,會分享下帶人玩的經驗。之前,我有帶過一個本,它裡面呢有的玩家扮人,有的玩家係扮動物,中間你就會見到好多得意 ── 一部分人呢永遠都猜不透自己,另一些人就好醒目,一開一講就拆穿了:嘩你的角色一睇就知不是人類來的,有這個證據、那個證據指出你的角色係動物......你見到各種各樣的人玩劇本,有些人會需要你慢慢引導,幫他們表達出他心中的想法,中間的協作係一個好有趣的過程。你見到每個人、可能他們彼此間係friend,但係兩個人的性格真係不一樣,或者思維方式不一樣,這些觀察與發現好得意、好有趣。」 ─§─ 帶本風格,澳門玩法   人口基數讓澳門像個興趣愛好的篩子,能流入澳門的玩意兒不見得都留得住,對於摩斯探案館的經營者來說,他們心宜的劇本殺,當如青山常在抑或曇花一現?Larry 坦言:「其實一開頭呢,就會比較覺得大陸的成功經驗可以照搬回澳門,會覺得:欸,大陸已經有條方程式係成功,那我照搬去澳門啦。但是在我經營、運作摩斯探案館之後呢,我發現:大陸的好惡不一定適用於澳門人。舉個例子啦:大陸,好多劇本,係講民國啊、共產黨、紅軍啊,或者係古裝情感啊、國仇家恨......其實澳門人無感、不懂,沒有相應的環境氛圍。揀本的時候,就要做好篩選。你一定要從澳門人的角度,去經營它。第二呢,就係澳門人的玩法,其實和大陸都差異大。所以呢,劇本殺的生意呢,係一定有得做,但係你要如何做?會有成功的機會,但係亦都有失敗的機會。如何貼合澳門人的口味 ── 我們仍在摸索、未算係完全摸索到。開店呢我預計要守一段時間,我知道不會一開頭就會爆發,所以我係盡量減輕成本去做;因為要澳門人去接受,第一句說話:喂,玩一個遊戲五個鐘?其實大部分人已經好抗拒,但真正試過玩呢,會覺得時間過得好快,劇本殺係一個time killer。」   「我會睇好它的前景,我覺得會有一個moment,它會突然間成熟、爆發,所以之前,你需要守,你要令到人們認識你。頭先講過,你玩一個店,不完全是個地方,你係要去找Larry 玩,所以你要守一段時間令到個市場覺得這個人係OK 的。那到它爆發的時候 ── 那時候澳門可能有二、三十間店 ── 成果就會出來。」對於自己的新事業,Larry 不無樂觀地說。   在Larry 的分析中,他談到澳門人的玩法勾起了我莫大的興趣。除了講廣東話,澳門人玩劇本殺,又有哪些地方與內地不同呢?對這個現象,Jack 也深有體會。   「玩的風格咯,我覺得係。大陸玩家的主動性和他們對於歷史題材呢會較敏銳。如何謂之主動性強呢?嗯,他們會好積極地去進攻其他玩家,譬如話,不管我是否真犯人,我都會好積極地去和其他玩家做得談判啊、去攞真料或者假料去套其他人的訊息,在遊戲過程中,他們會不斷地嘗試去做這些動作。相對來講呢,澳門人就顯得被動,被動又會有哪些問題出現呢?例如有些劇本,強調玩家之間要合作,即係私底下可能要合作或者要頻繁溝通呢,才有辦法搞掂,如果是這種情況呢,澳門玩家可能會適應不良。另外,澳門人有另外一樣情況 ── 不慣拼車。大陸好多拼車的局,澳門人呢,會傾向避免,寧願說:我湊夠六個人先啦、湊夠五個我先來玩啦。澳門人將劇本殺視為一個聚會的item,但在大陸,他們真係為了『劇本殺』而去玩。」Jack 補充。   隨後,Larry 歸納說:「因為,劇本殺的核心係要解謎,澳門玩家會要求個主持人多表達,我們有個術語、劇本殺的術語叫『扶車』:如果你甩、如果你越軌呢,就會離真相越來越遠,就要有人來扶正焦點。澳門人呢,就會比較傾向於要多扶車;同埋,偏向於細體量 ── 個劇本的體量不好太大。但在大陸,玩家會想:嘩,我付錢、付一百多元,在這裡六個鐘頭,我想你個劇本好多內容,我可以睇到好多故事,故事中有故事,越複雜越好、體量大越好 ── 那我的體驗才會豐富。」 ─§─ 摩斯探案,知人識本   「其次在揀本上面,你一定要了解個客群,即係裡面組成的成分,新手多?有玩開桌遊?習慣看書 ── 最直觀係看書,好多澳門人拎起個本,第一個反應係:嘩!好多字啊,有字數少的嗎?大陸人呢少會這樣,頂多話我要多點時間看。澳門人呢,有一定數量:嘩、好多字,換少字的本啦。遇到這種情況呢,主持人往往要約玩家單獨談:嗱,你要這樣、那樣、怎樣 ── 他可能看不懂、搞不清現狀 ── 即手把手教他玩。所以澳門人呢,在澳門當主持人係難的,玩家對主持人的要求較高。」一席話,Larry 說透了在澳門帶劇本殺活動的快樂與哀愁。   在摩斯探案館,你可以丟下日常的身份,穿上想像的舞靴,在一本又一本的故事中穿梭漫舞。有時,你會像華生,襯托主人公明斷是非,扮演稱職的見證人;有時,會像福爾摩斯般探案,尋找舊雨新知口中吐露的蛛絲馬跡,推斷摩斯密碼般被隱藏的秘密、事件的真相。   劇本殺門店讓背景迥異的人有相聚的交點,有些人淺嘗輒止,有些人成為了一陣子的朋友,有些擦肩、回頭、微笑或僅僅多了驚鴻一瞥......就像劇本裡的人物,命中註定交匯、受罪,燦爛過後,走入各自人生的下半場,歸於平凡。 摩斯探案館 地址:澳門罅些喇提督大馬路131號華隆工業大廈4樓