搜尋

搜尋結果

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查看 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeController.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 @RequestMappingquot;apiquot; public class HomeController @GetMappingquot;someRecorduuidquot; public Map readSomeRecord@PathVariable String uuid return Map.ofquot;retquot;, quot;your uuidquot; uuid; 準備我們的test case,但這次我們預期它應該要出現登入失敗的結果。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeControllerTest.java @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest @Autowired private MockMvc mockMvc; @Test void testNoLogin throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is4xxClientError .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.doesNotExist .andDoMockMvcResultHandlers.print; 在我們執行上述的測試,test case 成功過了。我們的基本設定跟上一節其實沒有多大改動,為何現在http api會回傳狀態 401? 那是因為我們在依賴中加了,Spring Security,它配合了Spring Web,就會自動為所有api加入權限檢測。我們的測試中,沒有任何用戶登入,當然會出現 http 401。為了讓我們可以好好管理誰可以使用api,我們就來設定一定Security。 我們加一個WebSecurityConfig.java,暫時指定所有的訪問路徑都必需有USER權限,並且用 http basic的方式登入。 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataconfigWebSecurityConfig.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 securityFilterChainHttpSecurity http throws Exception http.authorizeHttpRequestsauthorizeHttpRequests gt; authorizeHttpRequests.requestMatchersquot;quot;.hasRolequot;USERquot;; 所有的訪問路徑都必需有USER權限 ; http.httpBasicCustomizer.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.withUsernamequot;adminquot; .passwordpasswordEncoder.encodequot;passquot; .rolesquot;USERquot;.build; 我們在記憶中體,加入一個測試用的User,它的名字為admin,密碼為pass,權限為User return new InMemoryUserDetailsManageruser; 然後加入新的測試,直接模擬Role。結果是通過的。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeControllerTest.java @Test void testLoginWithRoles throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON.with SecurityMockMvcRequestPostProcessors.userquot;someonequot; .rolesquot;USERquot;, quot;ADMINquot;; 沒有使用密碼,只使用Role this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is2xxSuccessful .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; 再來一個測試,改用密碼登入,分別輸入錯的和正確的密碼。 @Test void testLoginWithWrongPasswordAndNoRole throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .headerquot;Authorizationquot;, quot;Basic randompassquot; 輸入錯的密碼,應該回傳http 401 Unauthorized .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is4xxClientError .andDoMockMvcResultHandlers.print; @Test void testLoginWithPassword throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .headerquot;Authorizationquot;, quot;Basic YWRtaW46cGFzcw==quot; http basic 就是把 adminpass 轉成base64 .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is2xxSuccessful .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; 最後,當然是正確的密碼才能通過。若果大家還是半信半疑,我們可以跑起真的正服務(IDE RUN或mvn springbootrun),然後用curl去試。 curl httplocalhost8080apisomeRecord1234 failed with 401 curl u quot;adminpassquot; httplocalhost8080apisomeRecord1234 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.withUsernamequot;adminquot; .passwordpasswordEncoder.encodequot;passquot; .rolesquot;USERquot;.build; return new InMemoryUserDetailsManageruser; springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataconfigUserServiceImpl.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 loadUserByUsernameString username throws UsernameNotFoundException 因為我們資料庫沒有資料,為了方便測試密碼的加密,我們在java code上直接插入一筆資料。 UserEntity defaultUser = new UserEntity; defaultUser.setUsernamequot;adminquot;; defaultUser.setPasswordpasswordEncoder.encodequot;passquot;; defaultUser.setRolequot;USERquot;; defaultUser.setUuidUUID.randomUUID.toString; userRepo.savedefaultUser; 上述為測試用插入資料,不應該出現在正式使用環境中。 UserEntity user = userRepo.findOneByUsernameusername .orElseThrow gt; new UsernameNotFoundExceptionusername quot; not foundquot;; 找找資料庫有沒有正在登入的該名使用者username List authorities = List.ofnew SimpleGrantedAuthorityquot;ROLE_quot; user.getRole; LOG.debugquot;got user uuid, username, role from databasequot;, user.getUuid, username, user.getRole; 如果前面的 findOneByUsername 有結果回傳,我們就給它一個ROLE_XXX的權限。 return new Userusername, user.getPassword, authorities; 這裏從沒有檢查過密碼是否有匹配,全部交給Spring Security去做 springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataentityUserEntity.java springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidatarepoUserRepo.java 上述段落中,筆者省略了UserEntity和UserRepo,它們只是一般的springdatajpa概念,有需要可以經文末的連結查看完全原始碼。最需要注意的,是UserEntity的password欄位,在資料庫中是以加密的方式儲存。我們在配匹登入者與資料庫記錄時,也沒有自行檢驗密碼的需要。我們只是在加密過的密碼回傳給Spring Security,Spring框架會自行把登入者輸入的密碼與加密了的密碼作比較。

不丹夜生活 夜會愛情三角錯
走遍世界
行走世界記錄・2020-01-31

誰說不丹沒夜生活?誰說不丹娛樂祗有射箭? 不丹旅遊沒有自由行,但可以自由的做這些事,你只需與你的導遊溝通好就OK! 因為第二次到訪不丹,算有些少經驗吧,所以在廷布做了很多遊客做的事,同時亦做了很少遊客做的事。 我們的導遊Nima戲說:不丹旅遊,就是不斷的 「宗 」「Dzong 」!每日行程差不多都有一個「宗」的景點,「宗」同辣椒就是不丹最好的概括,國民的生活、宗教、風土人情與「宗」及辣椒有著千絲萬縷的關係。 第一次不丹旅,9日行程每日只在酒店與景點中穿行,沒有更多一點認識不丹了,所以今年找機會做一些遊客不常規做的事。 在首都廷布的時間不多,僅兩晚!非常珍貴!因為這兩晚兩天兼一個早餐的時間,廷布入選本人最喜愛不丹旅遊地三甲! 廷布比其他地方相比較繁榮又物質,意想不到的結果,這次行旅我很喜歡廷布啊。 珍貴的兩晚夜,第一晚安排看不丹土產電影然後晚飯,再卡拉OK,既精彩又緊湊。在酒店附近TROWA THEATRE看一齣名為「KARMA MINDU」的不丹製造本土電影,門票不丹努$250一張,澳門幣約$30元,這票價對遊客來說不算甚麼,於人均收入每月100多美金的不丹普羅大眾來說,說貴也不貴,說平也不平了。電影純不丹宗喀文,由字幕到對白,需真正的用心欣賞,這齣愛情歌舞片。 急著入場,對正門是小賣部,影院分上下兩層,左邊是售票處,右邊上二樓看戲。是晚2樓幾乎全場滿座,但也不足30人,場地小小的。地下一個人也沒有。 節奏不明快,劇情拖曳,但也看得很開心,似曾相識的拍攝地,ldquo;這是大佛啊,那是郵政總局呢ldquo;,雖聽不懂對白,但也看明白這是愛情三角錯!女主的KIRA非常亮眼,男主的歌喉優美,不錯呵。 戲至半場,餓腸轆轆,急回酒店晚飯再下半場,唱K。 不丹系列 幸福不丹 ︳這樣掀起不丹神秘面紗省錢自由行分享文 幸福不丹 9日行程告訴你 不丹這樣子 幸福不丹 ︳不丹國菜及十大必吃清單 幸福不丹 不丹特產 必買紀念品 不丹故事|香港MONICA紅遍不丹東部地區 不丹故事 ndash; Dorjee的朋友 不丹九日遊蹤一直飛雲霄 雲在右峰在左 不丹九日遊蹤二 紅窗白墻下的愛情 不丹九日遊蹤三沒有紅綠燈的首都 不丹九日遊蹤(四)走進世上最年輕全球最英俊國王的辦公室 不丹九日遊蹤五全不丹最美的「宗」 不丹九日遊蹤六 穿上旗拉山過山嶺過嶺只為見他 不丹九日遊蹤七 小瑞士健行 不丹九日遊蹤八 不丹象徵 不丹九日遊蹤九 再見不丹 不丹再見 幸福不丹 穿上國服做一日不丹人 幸福不丹 那些不丹風情居 女子眼中的不丹 ndash; HI Bhutan

降噪功能強 高CP值兼具設計感 Nothing ear (1) 型格透明藍牙耳機
專題報導
Lifemagtechie・2021-11-05

由前One Plus 創辦人裴宇(Carl Pei)在英國倫敦創建的品牌 Nothing,早前終於正式發佈第一款無線耳機 Nothing ear 1。這對耳機的透明外型極具未來科技感,他們找來瑞典的Teenage engineeringtrade; 調音,搭配可自行調節的降噪功能,以其親民價格定位而言,CP值相當高! 有興趣嘅朋友可以到 CTM 門市購買現貨!售價:澳門幣 830 簡約透明設計盡顯耳機細節 Nothing ear 1 外型簡約具未來科幻感,透明外殼讓用家們看到所有耳機細節, 配上白色耳塞極具型格。 每只耳機僅重4.7克,設有減壓通風口,人體工學舒適貼耳,並附有三種尺寸的液體矽膠耳塞。 Teenage engineeringtrade; 極致調音帶來純淨音質 為令Nothing ear 1 的音質比AirPod更強,他們特別邀請專業音響界有名氣的 Teenage Engineering 為耳機調音,搭載11.6 mm 動態驅動元件,平衡低音、中音和高音的表現, 適合聆聽不同類型音樂。 ANC 主動降噪功能,自由選擇降噪強度 Nothing ear 1 可通過手機 App 調整降噪效能: 【輕度模式】進行中度降噪,日常用耳機收聽音樂,想對音質有最小影響 【最大模式】則適用於較嘈雜的環境,如飛機或辦公室。 【透明模式】用家可聆聽周圍環境聲音,「清透語音技術」確保通話時聲音清楚明亮,不受風聲等其它背景雜音的干擾。 長效電池續航力支援5小時音樂播放 Nothing ear 1 搭載長效電池,播放時長高達5.7小時,配合透明充電盒可提供額外29小時播放時間。小巧的充電盒更可超快速充電,充電10分鐘即可使用8小時,外出一整日都不用擔心沒電。另外,亦支援所有Qi認證無線充電器。 關於Nothing 總部位於英國倫敦的Nothing致力於消除人與科技之間的障礙,創造一個無縫的數字未來。 Nothing的願景是激勵人們以積極的態度相信科技的未來。從2021年開始,Nothing將為消費電子行業重新注入設計藝術、激情和信任。 Nothing獲得了GV(前谷歌風險投資公司)和其他私人投資者的投資,包括 Future Shape的負責人及iPod之父托尼middot;法德爾、YouTube名人和Beme聯合創始人凱西尼斯塔特、Twitch聯合創始人凱文middot;林、Reddit 聯合創始人兼CEO史蒂夫middot;霍夫曼。

澳門的「文物街市」背後藏著你不可不知的老字號「牛什粥」!
澳城餐飲
食在澳門iFood・2021-02-02

紅街市係目前唯一被列入 澳門文物名錄裡的街市建築 紅磚紅墻、人來人往 滿滿的煙火氣息與人文氣息 構成澳門本地人簡單幸福的生活 讓我們行入紅街市 感受牛什的裊裊炊煙 同甜品的絲絲入扣喇hellip;hellip; ▽ 紅街市門口人來人往,不少人為了這一檔牛什檔駐足停留。飄入空氣中的炊煙,瀰漫空氣裡的牛什香,訴說著濃濃的市井氣。 鐵製招牌上的兩味招牌菜mdash;mdash;牛什粥同牛什,為食妹各點一份。手中感受到的暖暖溫熱,正正係紅街市久留不散的ldquo;人情味rdquo; 給牛什粥添上蔥花、油炸鬼,給牛什淋入獨家三色醬料,簡易的外賣包裝,品味深刻的本土懷舊味! 中份牛什 四人share一份中份牛什已經好夠食只要30蚊就可以俾你的胃口感受到滿足感,何樂而不為呢? 牛什加入咗最有特色的黃芥末醬,酸中帶辣,略帶微微辛味,讓你食到的牛什口感與眾不同搭配上其他兩種甜辣醬,更升華口感層次! 牛腩、牛肚、牛肺、牛膀hellip;hellip;每一啖都食到獨家醬汁的點睛滋味,每一啖都俾牛什的濃濃肉香縈繞迴蕩hellip;hellip; 牛什粥 一碗惹味的牛什粥,粥米綿密糯香,加入牛什後充滿牛肉濃香。添上蔥碎與切塊油條,感受最原始的親民滋味! 揭開膠碗,裡面包羅萬象、配料一應俱全!綿口甜香的生滾粥,滿滿當當的牛什睇落就充滿幸福感,蔥碎與油條提味,延續澳門粥水的傳統風味。 牛什檔對面的糖水檔,都一樣好多街坊幫襯! 六款甜品供應,為食妹外帶腐竹白果薏米、雞絲翅同蔴蓉湯圓,鹹甜相間,搭配好味! 腐竹白果薏米 經典本地糖水,一碗腐竹白果薏米足矣!用匙羹由底部撈動,先會發現新大陸! 補氣益力的薏米、清涼白果同腐竹,滿滿糖水料,挑引甜蜜的口感順滑糖水底,飲落成身都暖粒粒! 雞絲翅 雞絲翅都算特色小食喇!雞絲、粉絲絲絲入扣,湯底勾芡,汁液濃厚 加入喼汁、胡椒粉,激起辛辣、酸味的口感衝擊!提味提鮮,讓哩碗雞絲翅於濃郁之中,更添別一般風味 蔴蓉湯圓 手工揉搓的湯圓,芝蔴熬成蔴蓉入餡,粒粒均勻有致,飽滿豐腴。 入滾水淥開蔴蓉湯圓,盡情釋放出軟糯蔴香!輕輕咬開,蔴蓉流心甜到入心,混著柔軟癡纏的糯圓,食而忘我 圖文|得得 美工|陳真香 攝影|他說他叫修杰楷

澳門教育家陳康妮:澳門兒童創新創業,一個不可小噓的夢想
文化創意
陳康妮・2020-07-13

【作者簡介】 陳康妮 Miss Connie ,大學講師,澳州墨爾本大學主修高等教育管理學,澳門高等教育管理學專家。主力高等教育管理學的教育硏究。澳門教育專欄作家,澳門兒童文學作家小妮老師。 二十四年來,她緻力于港澳推動教育管理事業,過去在港澳專注實踐大學中小學及幼兒教育管理至今,主力研究高等教育管理學。教育管理經驗全面涵蓋。現時陳康妮潛心硏究世界各地高等教育管理。過去五年曾前往北京瞭解教育創新及到芬蘭和澳洲學習先進高等教育管理理念。 陳康妮提出「澳門教育創新」概念。希望将創新的教育帶給澳門的每一位學生。充分學習國外學校的優點,同時保持澳門本土特色,創造最好的未來大學,也給迷茫的大學生未來的學習以及人生建議。讓澳門的學生走向世界! 澳門七歲女孩的夢想(創新創業)在網上自學建立兒童護膚的個人品牌 現在的小學生有創新精神。七歲女孩子在澳門幼稚園時,已模仿媽媽化妝,喜歡媽媽用的化妝品。一次偶然機會,她走進媽媽房間自己爲自己化妝。她開始尋找适合兒童的美容配方。 媽媽發現她有創業精神,鼓勵地以獨特的自發兒童美容作品分享給同學用。她第一個作品是兒童美容香㫐。 知道她仍然在家裡研究,回到學校和同學分享。我問她爲什麽有這個想法。她説希望可以賺到更多的錢改善爸媽生活。希望用地球的資源來製造以後的兒童作品,因爲想保護地球,她把每一個創新思維和媽媽分享,十分快樂。 她的創新創業精神感動了我。 作爲澳門教育家,對澳門家長和老師有以下建議﹕ 1 培養未來兒童成爲兒童創新創業家; 2 家長和老師成爲孩子的陪伴者,啓發者; 3 在兒童創新創業遇到逆境時,教導他們如何跨過,以正面心态面對; 4 不批評孩子的對錯; 5 培養他們愛的能力。 未來成功的CEO,第一步是由踏進創新開始。

「細味法國情」紀曉華相片展覽賀「麗思咖啡廳」開幕慶典
文化創意
LifeMag Editor・2015-08-24

紀曉華 與 大廚Raphael 在麗思咖啡廳 「細味法國情」紀曉華相片展覽 麗思咖啡廳 下午茶套餐 位於澳門麗思卡爾頓酒店內的傳統法式小館「麗思咖啡廳」將於「澳門銀河trade;」綜合渡假城正式開幕。為隆重其事,澳門麗思卡爾頓酒店特意夥拍香港著名旅遊美食專欄作家紀曉華先生,由2015年9月18日至10月18日期間舉行「細味法國情」相片展覽,展出他歷年來在法國拍下的點滴時刻。「麗思咖啡廳」亦將配合相展主題,精心設計限定菜式,讓賓客時刻享受優雅生活的精髓。 「細味法國情」相片展覽設於「麗思咖啡廳」並延伸至澳門最新購物熱點「時尚滙」,共展出超過80張由紀曉華先生拍下的黑白照片,將其鏡頭下的法國景點、風土人情、生活情懷一併帶到澳門。作品表現出紀曉華先生對法國情有獨鍾,他表示:「早於1988年,在任職旅遊專欄作家之前,我曾以一輯攝於法國的相片向報館旅遊攝影欄目投稿,並成功獲選刊登。而第一次到歐洲旅行的地方亦是法國,所以我想透過影像將我的法國情意結與大家分享,逐一展示法國獨特的美。」紀曉華先生的相片細膩地展現法國濃厚的生活情懷,他特意選擇在清晨拍攝,在最寧靜的時分用鏡頭與當地人溝通,捕捉每一個專屬且無比動人的「個人時刻」。 來自法國里昂的「麗思咖啡廳」總廚紀韋麟先生 Chef Raphaeuml;l Kinimo 將會在「細味法國情」相片展覽期間設計一系列限定菜式,採用簡單的烹調方式打造最極致的美味,為追求生活品味的賓客提供獨特難忘的體驗。賓客亦可得到紀曉華先生「細味法國情」明信片套裝乙份,延續不一樣的法國情懷。 澳門麗思卡爾頓酒店作為「澳門銀河」渡假城內其中一家世界級酒店,不單為賓客帶來亞洲最奢華的酒店體驗,更與全新「時尚匯」緊密結合,把世界流行的高格調下午茶文化引進澳門,讓賓客盡享購物樂趣之餘,亦同時感受品味優雅生活。 為了吸引更多人感受澳門的生活文化,澳門麗思卡爾頓酒店將會舉辦「靈感無限 ndash; 澳門情懷攝影比賽」,入圍決賽的參賽者除了有機會獲得豐富獎品之外,作品更可於澳門麗思卡爾頓酒店的「麗思咖啡廳」內展出。比賽詳情將容後公佈。

大平洋深釣大魚
走遍世界
海闊天空 // Sio・2016-05-04

這天我們一早五點多就出門,前進往碼頭,登船啓航直至太平洋的深海釣大魚! 因為船很小,剛出去時感覺很搖晃,有一點點暈,但不知道是我吃的暈浪丸利害,還是我已經習慣,到深海時就沒問題了,特別是看見深藍的海水時我已經興奮到什麼都忘了,因為深海的藍色和西藏天空的藍色從來都是最叫的著迷的顏色! 原本還以為我們要親自拿着魚竿在烈日下苦等大魚上釣,怎料原來我們是什麼也不用做就釣到大魚!其實是船夫會好好的幫我們打點一切,一直左奔右奔東拉西拉,忙著準備魚竿準備魚鈎,到發現有魚來了就直接叫我們去拉魚上來!但我太弱了,拉了三條小吞拿魚之後感覺很累要投降了! 後來我們還釣上了一條很大的鱍魚呢!回岸之後船夫還馬上把魚切成刺身給我們吃,我還是第一次即釣即吃,從來沒有試過這樣的鮮味!!! Fish Hook Inc 包租遊艇出海的費用為 800 美元,一隻船可坐6個人,包括了4個小時的航程,還有所有釣魚用品WEB httpfishhookguam.comindex.htmlTEL 16714725060EMAIL info@fishhookguam.com ============================海闊天空 一個女生遊歷半個地球的流浪故事FB 粉絲頁 www.facebook.comwalkedbysioIG 相集 instagram.comcestsioYOUTUBE 頻道 httpsgoo.glfMZnEP============================

『BOBO R.I.P.』尊重自然,尊重生命。
環保自然
澳門舟周刊MACAU・2018-11-23

澳門熊寶寶離開我們,當局慾把屍體制作成標本,成為FB一時熱話。這位老朋友前半生故事有說被善心人救了又或其他版本,星爸也是道聽途說,不知真偽。但有一點是不變的,寶寶陪著澳人渡過幾十年歲月,給無數小孩帶來愉快時光,包括星爸與家人探望寶寶時的溫馨回憶。 樹葉枯萎重回大地再育新苗是自然定律,為什麼不給這位老朋友入土為安呢?當局標榜教育澳人保護自然,教育保護自然方法千千萬萬,您喜歡可把寶寶變為動畫角色、豎立銅像、二十四小時全天侯播放寶寶生活片段等等,卻使用上最不尊重自然、最不尊重生命的方式。這晚下了一場冷冷的雨,是寶寶的眼淚?還是澳人的悲哀? 心裡越難過,只能透過閱讀『阿Q正傳』和『阿甘正傳』中得到一絲安慰。習慣它吧,當局也是學習回來的。敬愛的無爺爺還不是被人給標了,對!為了滿足目的,人也可以。 人類醜陋的歷史不斷重複上映,塔斯曼尼亞在旅遊節目常標籤為世外桃源,您可曾想過二百年前這裡上映著一幕幕血腥的殖民斗爭。被稱為澳大利亞最後一位原著民楚格尼尼,生於1812年布魯尼島,生前受盡白人凌辱、強奸、家人遭殺死或賣作奴隸,死前口中喃喃自語還是不要解剖、展視自已的遺體。可惜她的遺願未能實現,死後不久,遺體被挖出並於多家博物館巡迴展出,部份被解剖送往研究,整個族群以此為終結。不知寶寶生前有否相同想法,渴望回歸自然,返回家人懷抱 如內文有誤,歡迎留言指正;如喜歡本文,歡迎點讚、轉發或分享,謝謝。 臉書專頁:httpswww.facebook.combaba.seng.315

[優惠預告] - 澳門航空雙11促銷價格詳細!
激安優惠
OHChance 旅遊誌・2018-11-06

澳門航空將於11月9日0時推出本年度雙11優惠,日本線終於再次平過二千啦,福岡線更加 1700都唔使,另外日本線商務艙價都值得看看。 適用出行日期為2019年1月3日至9月30日。但除左新年、復活節不要期待有平飛外,7月中 至8月中應該都唔會有。其他日子就要開賣先知。 ===以下是各航點以目前稅費計算的來回連稅價=== 《台灣》*台北高雄:MOP1,054 《日韓》*東京:MOP1,978 4,578商務*大阪:MOP2,009 4,609商務*福岡:MOP1,661 3,161商務*首爾:MOP1,724 《東南亞》*曼谷:MOP1,071*河內:MOP1,091*峴港:MOP1,050 《中國大陸》*北京:MOP1,978*太原成都:MOP1,778*天津:MOP1,678*南京杭州常州寧波:MOP1,578*上海:MOP1,498*青島廈門:MOP1,478*重慶:MOP1,378*貴陽:MOP1,278*南寧合肥鄭州:MOP1,178 #以上價格以目前系統內稅費計算 #澳門航空票價包20KG托運行李  【促銷公司】澳門航空【航班日期】2019年1月3日至9月30日【預訂時限】11月9日1000至11日2359【預訂方式】澳門航空官網【預訂網址】httpswww.airmacau.com ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 httpsohchance.info 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 httpsohnote.info 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:httpsyoutube.comcOHChanceTravel 睇埋 Facebook 專頁 httpsfb.comohchance 第一時間獲得最新旅遊資訊!