📜 [專欄新文章] Optimistic Rollup 就這樣用(2)
✍️ Juin Chiu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
ERC721 的儲值、轉移與提領
TL;DR
本文會跳過 Optimistic Rollup 的介紹而直接實際演示,關於 Optimistic Rollup 的概念與設計原理筆者將在日後另撰文說明,有興趣的讀者可以先參考下列三篇文章(由淺入深):1. OVM Deep Dive 2. (Almost) Everything you need to know about Optimistic Rollup 3. How does Optimism’s Rollup really work?
本文將演示一個 Optimism Rollup 的 ERC721 範例,程式碼在這裡。
本演示大量參考了以下範例:Optimistic Rollup Example: ERC20。
本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
環境設置
Git
Node.js
Yarn
Docker
Docker-compose
筆者沒有碰到環境相容問題,但是建議都升到最新版本, Node.js 使用 v16.1.0 或以上版本
Optimism 服務啟動
有關 Optimisim 的所有服務,都包裝在 Optimism 這個超大專案當中了,直接使用原始碼進行組建:
$ git clone git@github.com:ethereum-optimism/optimism.git$ cd optimism$ yarn$ yarn build
組建完成後,就可以在本機啟動服務了:
$ cd ops$ docker-compose build$ docker-compose up
這個指令會啟動數個服務,包括:
L1 Ethereum Node (EVM)
L2 Ethereum Node (OVM)
Batch Submitter
Data Transport Layer
Deployer
Relayer
Verifier
Deployer 服務中的一個參數要特別注意: FRAUD_PROOF_WINDOW_SECONDS,這個就是 OPtimistic Rollup 的挑戰期,代表使用者出金(Withdraw)需等候的時長。在本篇演示中預設為 0 秒。
如果有需要重啟,記得把整個 Docker Volume 也清乾淨,例如: docker-compose down -v
Optimism 整合測試
在繼續接下來的演示之前,我們需要先確認 Optimism 是否有順利啟動,特別是 Relayer 是否運作正常,因此我們需要先進行整合測試:
$ cd optimism/integration-tests$ yarn build:integration$ yarn test:integration
確保 L1 <--> L2 Communication 相關測試通過後再繼續執行接下來的演示內容。
啟動服務及部署合約需要花費一些時間,運行一段時間(約 120 秒)之後再執行測試,如果測試結果全部皆為 Fail,可能是 Optimism 尚未啟動完成,再等待一段時間即可。
ERC721 合約部署
Optimism 啟動成功並且完成整合測試後,接下來進行 ERC721 合約的部署。筆者已將合約及部署腳本放在 optimistic-rollup-example-erc721 這個專案中:
$ git clone git@github.com:ethereum-optimism/optimistic-rollup-example-erc721.git$ cd optimistic-rollup-example-erc721$ yarn install$ yarn compile
接下來我們需要部署以下合約:
ERC721,部署於 L1
L2DepositedEERC721,部署於 L2
OVM_L1ERC721Gateway,部署於 L1
OVM_L1ERC721Gateway 只部署在 L1 上,顧名思義它就是 L1 <=> L2 的「門戶」,提供 Deposit / Withdraw 兩個基本功能,使用者必須透過這個合約來進出 L2。
雖然 OVM_L1ERC20Gateway 是 Optimistic Rollup 官方提供的合約。但是開發者也可以依需求自行設計自己的「門戶」。
OVM_L1ERC20Gateway 目前沒有 Optimism 的官方實作,本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
接下來,我們直接用腳本進行部署:
$ node ./deploy.jsDeploying L1 ERC721...L1 ERC2721 Contract Address: 0xFD471836031dc5108809D173A067e8486B9047A3Deploying L2 ERC721...L2 ERC721 Contract Address: 0x09635F643e140090A9A8Dcd712eD6285858ceBefDeploying L1 ERC721 Gateway...L1 ERC721 Gateway Contract Address: 0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547ccInitializing L2 ERC721...
ERC721 鑄造、儲值、轉移與提領
鑄造(L1)
初始狀態如下,所有帳戶皆尚未持有任何代幣:
接下來,我們將鑄造 2 個代幣以進行接下來的演示。首先,進入 ETH(L1) 的 Console:
$ npx hardhat console --network ethWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat ETH Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 ERC721 及 OVM_L1ERC721Gateway 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat ETH Console
> let ERC721_abi = await artifacts.readArtifact("ExampleToken").then(c => c.abi)
> let ERC721 = new ethers.Contract("0xFD471836031dc5108809D173A067e8486B9047A3", ERC721_abi)
> let Gateway_abi = await artifacts.readArtifact("OVM_L1ERC721Gateway").then(c => c.abi)
> let Gateway = new ethers.Contract("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", Gateway_abi)
鑄造兩個 ERC721 代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).mintToken(deployer.address, "foo")
{ hash: "...", ...}
> await ERC721.connect(deployer).mintToken(deployer.address, "bar")
{ hash: "...", ...}
只有合約的 Owner(deployer) 可以進行鑄造的操作。
確認 Deployer 餘額:
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x02', _isBigNumber: true } // 2
確認代幣的 TokenID 與 Owner:
> await ERC721.connect(deployer).ownerOf(1)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
> await ERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
儲值(L1 => L2)
完成以上步驟後,目前的狀態如下:
接下來,授權 OVM_L1ERC721Gateway使用 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).approve("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", 2)
{ hash: "...", ...}
在 OVM_L1ERC721Gateway 合約呼叫 Deposit,儲值 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await Gateway.connect(deployer).deposit(2)
{ hash: "...", ...}
我們可以到 Optimism (L2) 的 Console 確認入金是否成功:
$ npx hardhat console --network optimismWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat Optimism Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 L2DepositedERC721 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat Optimism Console
> let L2ERC721_abi = await artifacts.readArtifact("OVM_L2DepositedERC721").then(c => c.abi)
> let L2DepositedERC721 = new ethers.Contract("0x09635F643e140090A9A8Dcd712eD6285858ceBef", L2ERC721_abi)
確認入金是否成功:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
ERC721 轉移(L2 <=> L2)
完成以上步驟後,目前的狀態如下:
接下來,我們在 L2 從 Deployer 轉移代幣給 User:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true } // 0
> await L2DepositedERC721.connect(deployer).transferFrom(depoyer.address, user.address, 2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
ERC721 提領(L2 => L1)
完成以上步驟後,目前的狀態如下:
接下來,我們用 User 帳戶提領資金,在 L2DepositedERC721 合約呼叫 Withdraw:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).withdraw(2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true }
最後,檢查在 L1 是否提領成功:
// In Hardhat ETH Console
> await ERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
由於挑戰期為 0 秒,因此提領幾乎無需等待時間,頂多只需數秒鐘
做完上述所有操作,最終狀態應該如下:
總結
本文演示了:
Optimistic Rollup 相關服務的本機部署
ERC721 L1 => L2 的儲值(Deposit)
ERC721 L2 帳戶之間轉移(Transfer)
ERC721 L2 => L1 的提領(Withdraw)
筆者未來將繼續擴充此系列的教學內容,例如支援其他標準的合約如 ERC1155,以及如何運行 Optimistic Rollup 生態系中最重要的驗證者(Verifier),敬請期待。
參考資料
OVM Deep Dive
(Almost) Everything you need to know about Optimistic Rollup
How does Optimism’s Rollup really work?
Optimistic Rollup Official Documentation
Ethers Documentation (v5)
Optimistic Rollup Example: ERC20(Github)
Optimism (Github)
optimism-tutorial (Github)
l1-l2-deposit-withdrawal (Github)
Proof-of-concept ERC721 Bridge Implementation (Github)
Optimistic Rollup 就這樣用(2) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
foo程式 在 李開復 Kai-Fu Lee Facebook 的精選貼文
創新工場DeeCamp 2020正式啟動。歡迎向我們推薦優秀的學員。
世界在變,DeeCamp 初心不變。新內容,新形式。新人才,新使命。一個半月時間,免費聆聽學術大師、工業界領軍人物親身教誨,學習科技與創投規律,實踐用AI解決前沿問題。只對全球在校大學生開放!過去兩年也都有台灣同學來參加哦。
下文來自創新工場微信公眾號
………………………………………………………………
DeeCamp 2020啟動,邀請全球AI菁英共克世界變局下真實難題!
2020 年是不尋常的一年。世界在變,初心不變。即日起,創新工場聯合華為共同推出“DeeCamp 2020 全球 AI 領軍人才培養計畫”。
圍繞“世界變局下的 AI 人才新使命”這一核心主題,入選的 200 位高校大學生將在一個多月的時間裡,接受世界頂尖導師陣容的授課指導,嘗試用創新思維和前沿 AI 技術,迎接新挑戰,解決新問題,擔負起 AI 人才的新使命。
DeeCamp 訓練營面向所有電腦、數學、自動化等AI領域相關專業本、碩、博在校生開放報名,全程免費。
DeeCamp 2020 全球 AI 領軍人才培養計畫分為大師課和開放性競賽兩部分,課程和專案實踐全部轉為線上進行。成功加入訓練營的200名學員,將獲得多位 AI 科研及產業領域頂級大師親自線上授課。他们有:
▍李開復 創新工場董事長兼CEO
▍張亞勤 世界級科學家和企業家,清華⼤學“智慧科學”講席教授
▍吳恩達 全球知名的人工智慧專家,Coursera的創始人及董事長,斯坦福大學電腦系兼職教授
▍張宏江 世界多媒體和人工智慧研究領域一流科學家,源碼資本投資合夥人
▍周志華 人工智慧領域世界級專家,國際AI學會“大滿貫” Fellow華人第一人,歐洲科學院外籍院士,南京大學人工智慧學院院長
▍張潼 人工智慧領域世界級專家,機器學習、大數據分析領域的頂級學者,香港科技大學電腦系和數學系教授
▍俞敏洪 新東方教育科技集團創始人、董事長,洪泰基金創始合夥人
▍徐輝 創新奇智聯合創始人、首席執行官,創新工場合夥人
▍唐文斌 曠視聯合創始人兼首席技術官
▍曹旭東 Momenta創始人兼首席執行官
▍汪華 創新工場聯合首席執行官,管理合夥人
▍王詠剛 創新工場首席技術官,創新工場人工智慧工程院執行院長
學員們還能與來自全球的 AI 精英共同組隊參加線上競賽,衝刺大獎。此次,DeeCamp 人工智慧訓練營將以往的線下實踐課題改為線上競賽形式。
不同於常見的 AI 領域競賽,DeeCamp2020 開放性競賽不以完成某一具體指標為目的,而是讓同學們組隊完成一個完整的創新項目,鼓勵其用創意向現在和未來人類面臨的科技問題發起挑戰,找到用 AI 技術改變真實世界的機會。對於提交的最終結果,評委將從“創新性、先進性、潛在價值、呈現結果”四個維度進行評估,最終評出總冠軍及各賽道冠軍,最高獎項獎金達人民幣100,000元。同時,優秀學員還有機會參加與神秘科學家評委的午餐/晚餐交流會!
DeeCamp2020 開放性競賽共設立五大賽道:
• 用 AI 應對醫療和公共衛生領域的新挑戰
• AI 賦能的商業決策與商業流程優化
• 自動駕駛的技術突破與前沿創新
• AI 驅動的教育新工具和新方法
• 人工智慧的創新思考與前沿設計
▍賽道一:用 AI 應對醫療和公共衛生領域的新挑戰
COVID-19 新冠病毒讓全世界共同經歷了恐慌、病痛和隔離,也凸顯出全球公共衛生危機對全球經濟與個人生活的重大影響。科技是扭轉戰局、提高社會組織與協同效率、提升全人類衛生水準的重要武器。無論是疫苗研製,新藥研發,臨床數據分析,流行病學分析,還是對與疫情相關的社會學、傳播學等問題進行深入調研,以大數據、機器學習為代表的人工智慧技術都可以發揮重要作用。
請加入我們,一起探索用大數據、機器學習等前沿科技改變全球公共衛生狀況,應對全球危機的新思路、新方法、新技術和新產品。
▍賽道二:AI 賦能的商業決策與商業流程優化
全球經濟和投融資環境進入了 2008 年金融危機以來的又一個艱難時期:經濟全球化的美好願景正遭遇貿易紛爭、意識形態分歧乃至全球疫情的多重打擊,資本市場和供應鏈生態面臨極大的不確定性。
新一代的大數據和人工智慧技術該如何幫助人類更好地應對危機?如何根據市場、行業、社交網路等數據更準確預測經濟趨勢並指導商業決策?如何利用 AI 技術提升商業運行效率,優化供應鏈管理等核心業務流程?
請與我們一起探討用 AI 技術輔助商業決策或提高商業效率的創造性方法,更好應對全球經濟變局。
▍賽道三:自動駕駛的技術突破與前沿創新
自動駕駛是人工智慧眾多領域中,最具技術挑戰性和應用前景的方向之一。最近幾年,自動駕駛的科研、產品和工程團隊越來越注重在真實場景、真實約束條件下打磨演算法和產品,力爭儘早實現自動駕駛技術的大規模商用。隨著自動駕駛所依賴的感測器、車載晶片、車聯網等技術的不斷發展,前沿人工智慧演算法有可能在更高效、性價比更好的自動駕駛平臺上突破更多的技術與產品瓶頸。
在本賽道中,團隊有機會利用真實場景採集的高品質數據,結合真實計算環境,學習和實踐自動駕駛技術在產品、工程領域的最佳路徑,並挑戰演算法和算力的極限。
▍賽道四:AI 驅動的教育新工具和新方法
教育是人類智慧得以延續和發展的載體。以 AI 為代表的前沿科技,已經在今天的各類教育平臺、各種教學形式中發揮了積極作用,即將成為未來教育的主導因素之一。
如何利用科技手段實現真正的因材施教?如何幫助老師規劃教學路線、提高教學效率?如何通過智慧互動、自動測評、持續改進等形式激發每個人的學習潛能?
AI 時代,教育工具和教育方法將在技術推動下持續變革。你們的技術、創意與工程實現,也是這一歷史變革的重要環節。
▍賽道五:人工智慧的創新思考與前沿設計
自上世紀四五十年代發端以來,AI 技術經歷多次反覆運算,今天以深度學習為代表的新一代 AI 已經創造出超越人類的圍棋程式,可以自動駕駛汽車的智慧演算法,可以獨立執行任務或與人協作的機器人……但AI在認知能力、推理能力、對複雜環境的感知能力、在複雜場景中的規劃和決策能力等方面,還與人類水準相差甚遠。
人類與生俱來的創造力對AI是九重天外的挑戰,有哪些新思路、新方法、新技術可能幫助我們開闢更廣闊的 AI 新天地?請利用你們的科研積累,發揮你們大膽突破的創新能力,用最直觀的創意演示系統向人們揭示 AI 未來可能的技術路線與應用場景。
▌報名流程及時間安排
時間安排:
報名及選拔時間:即日起至5月29日
學員名單公佈:6月3日
大師課上課時間:6月6日至7月5日每週六周日上午
開放競賽成果提交:7月26日
競賽結果公佈:8月5日
報名流程:
考慮到今年上半年全球大學師生的實際情況,本屆DeeCamp採用導師或實驗室推薦與自薦報名相結合的方法,並根據推薦和自薦材料綜合選拔錄取。
1)官網註冊:在 DeeCamp 官網(deecamp.com)完成註冊並填寫個人資訊;
2)準備申請材料:pdf 檔需在個人中心上傳,視頻請上傳至組委會可以訪問的平臺並在下一步報名時填寫訪問位址;
3)點擊報名:進入活動頁面點擊報名,提交必要資訊並完成報名;
4)等待通知:你可能會收到一次遠端面試的邀請,請留意郵箱資訊並準時參加。
*申請材料包括:
一份 PDF/DOC/DOCX 格式的檔,內容包括你的簡歷、項目經歷、曾獲獎項、曾發表論文及對應會議/期刊、推薦信或自薦信,以及其他能讓我們知道你很優秀的材料,請整理在一個檔裡集中上傳;
一段自我介紹視頻,時長 3 分鐘以內,將用於向選拔參考(可選項,建議提供,以便我們更好地瞭解你)。
▌關於DeeCamp人工智慧訓練營
DeeCamp 的名字來自歷史上由 O' Reilly 組織的 Foo Camp(一個完全由與會者設計流程、議題、內容的 unconference)。DeeCamp 用類似的命名方式,希望建立一個為學生服務、充分發揮學生自主精神的 Deep Learning Summer Camp,既有統一的課程和專案安排,也借鑒 unconference,放手讓學生自我組織、自我管理、自我表現。在 2019 年度暑期訓練營期間,學員們在順利完成課程和實踐的同時,自行組織了 24 場分享會,涵蓋深度學習、機器學習、對抗神經網路等十餘個主題。
DeeCamp 訓練營由創新工場於 2017 年發起,旨在提升高校 AI 人才在行業應用中的實踐案例經驗,同時推進產學研深度結合的公益性質 AI 訓練。
在過去的三年中,DeeCamp 總計收到來自全球 1000 餘所高校超過 20000 份報名申請,已有 1000 余名學員順利結業。
到 2019 年,DeeCamp 人工智慧訓練營已初步建立了以創造性的團隊工程實踐專案為主幹,以打通學術、產業邊界的系統性知識培訓為支撐,聚焦未來科技變革與商業發展,成規模、可複製的人工智慧應用型人才培養體系。
DeeCamp 獨創的“知識授課+實踐專案”模式,讓學員們既可以近距離與科研及產業領域大師溝通交流,也可以與志同道合的小夥伴結隊,親身體驗 AI 技術如何轉化為產業應用、積累實踐案例經驗。
聯合主辦方:創新工場、華為
雲平臺:華為雲
課題合作企業:曠視科技、Momenta、路孚特
合作媒體:量子位
報名連結:https://deecamp.com/#/activityRegistration?id=1
foo程式 在 拖手仔 去街Guide Facebook 的最佳貼文
最近幾日落雨濕濕,唔止人鬱悶,狗仔無得出街放電都好愁😂~~小編家中兩頭小狗也一臉悶悶不樂不爽樣。。。。。。
😍毛孩和人都寄望天快轉晴。。。。。。因為,月底「狗界盛事」Paws by the Sea在赤柱廣場舉行呢!由3月23日星期六開始,一連兩個周末會有連串活動,部分須優先報名,詳情快d click入去睇睇啦!
👉🏻編K和編M在3月30及31日都會出現擺攤,到時幾得嚟搵我哋呀!😘
#一齊同狗狗挑戰健力士世界紀錄
#HandMade親子寵物裝現場擺檔
#一大班狗朋友好壯觀呀
【三月活動 必玩推介】可以報名喇!!
全港最大型狗狗活動Paws by the Sea返嚟喇!踏入第8年,赤柱廣場將以「犬」愛方程式舉辦為期一個月狗狗主題活動,而3月23至31日兩個周末更會舉辦大型精彩活動,包括全港首個海邊狗狗相睇約會,與保護遺棄動物協會攜手舉辦之「與狗同行」體驗,以及首辦狗狗婚展及婚紗設計比賽,狗主同愛狗人士同樣適合參與!此外,今年更會再度挑戰全球健力士世界紀錄™榮譽,透過收集給狗狗的情書砌出「最長玻璃瓶串連字」。立即Call埋班friend報名參加,同愛犬一齊完成創舉,兼開開心心玩返日啦!
赤柱廣場「犬」愛方程式
日期:2019年3月23 - 4月30日
時間:中午12時至下午5時
活動詳情:http://linkhk.com/tc/promotion/283
查詢及報名:https://zh.surveymonkey.com/r/pawsbythesea2019 或透過領展「泊食易」手機程式 (http://parkndine.linkhk.com/parkndine/parkndine_tc.aspx)
截止報名日期:2019年3月11日
99bus報名:https://goo.gl/forms/X4yHCHMYybkqLQRy2
Follow赤柱廣場Instagram帳號以獲取最新活動資訊:stanleyplazahk
___________________________________________________
【Doggie event not to be missed】
Hong Kong’s largest scale doggie activity Paws by the Sea is back! Coming to the eighth times, Paws becomes a 1-month programme running from 23 March to 30 April 2019, while the HK’s first seaside Doggie Speed Dating, Doggie Photography Tour, Doggie Wedding Gown Design Competition & Fashion Show and Guinness World Records™ Title Attempt for “Longest Line of Glass Bottle” will take place on the weekend of 23 – 31 March 2019. Non-dog owners are welcomed too! Invite you friends and join us to break the record and have fun!
Stanley Plaza Paws by the sea 2019
Date: 23 Mar - 30 Apr 2019
Time: 12nn – 5pm
Event Details: http://linkhk.com/tc/promotion/283
Enquiry and Registration: https://zh.surveymonkey.com/r/pawsbythesea2019 or enroll through “Park and Dine” app (http://parkndine.linkhk.com/parkndine/parkndine_tc.aspx)
Registration Deadline: 11 Mar 2019
99bus Registration: https://goo.gl/forms/X4yHCHMYybkqLQRy2
Follow Stanley Plaza’s Instagram Account for latest event information: stanleyplazahk
___________________________________________________
去程 Inbound Trip:
24/3/2019 路線Route A, B, C, D, E, F, G, H
30/3/2019 路線Route: A, D, F
31/3/2019 路線Route: B, C, G
Route A.
11:00 am 元朗 Yuen Long > 赤柱廣場 Stanley Plaza
Route B.
11:00 am 大埔 Tai Po > 11:30 am 太子 Prince Edward > 11:35 am 旺角 Mong Kok > 赤柱廣場 Stanley Plaza
Route C
11:00 am 屯門 Tuen Mun > 11:15 am 荃灣 Tsuen Wan> 赤柱廣場 Stanley Plaza
Route D
11:00 am 上水 Sheung Shui > 11:05 am 粉嶺 Fan Ling > 11:35 am 馬鞍山 Ma On Shan > 11:45 am 沙田 Sha Tin > 赤柱廣場 Stanley Plaza
Route E
12:00 nn 北角 North Point > 12:15 nn 灣仔 Wan Chai > 12:25 nn 中環 Central > 赤柱廣場 Stanley Plaza
Route F.
11:00 am 西貢 Sai Kung> 11:20 am 將軍澳 Tseung Kwan O > 11:35am 觀塘 Kwun Tong > 11:45 am 九龍灣 Kowloon Bay > 赤柱廣場 Stanley Plaza
Route G.
11:00 am 東涌 Tung Chung > 11:15 am 青衣 Tsing Yi > 11:25 am 美孚 Mei Foo > 赤柱廣場 Stanley Plaza
Route H.
11:00 am 新蒲崗 San Po Kong > 11:10 am 土瓜灣 (A) To Kwa Wan (A )> 11:20 am 紅磡(A) Hung Hom (A) > Stanley Plaza
回程 Return Trip:
6:00 pm 由赤柱廣場開出Depart from Stanley Plaza
*候車處 Pickup point - 車站地點及圖片網址:http://www.99bus.org/station
*路線及班次時間或因交通及天氣情況而作出更改。座位有限,先到先得,額滿即止。
Route schedules are subject to change due to traffic and weather conditions. Limited seats available, first-come, first-served.
*敬請於開車前15分鐘到達候車處報到,否則已預留之座位將被取消。
Please arrive the pickup point 15 minutes before scheduled departure. Otherwise, the reserved seat shall be released.
___________________________________________________
#99bus #Stanleyplaza #Pawsbythesea #link #狗狗巴士 #Dogwedding #paws2019 #SAA
foo程式 在 Rust 程式語言正體中文版 的推薦與評價
fn foo() { }. 那如果有參數呢? 以下是一個印出數字的函式: fn print_number(x: i32) { println!("x is: {}", x); }. 這是一個使用 print_number 函式的完整程式: ... <看更多>
foo程式 在 airbnb/javascript: JavaScript Style Guide - GitHub 的推薦與評價
1.2 Complex: When you access a complex type you work on a reference to its value. object; array; function. const foo = [1 ... ... <看更多>
foo程式 在 小B雜想- [#好奇亂看] 範例程式常常用的變數名稱foo bar 的由來... 的推薦與評價
The terms foobar (/ˈfuːbɑr/), fubar, or foo, bar, baz and qux (alternatively, quux) are sometimes used as placeholder names (also referred ... ... <看更多>