2013/03/31

AWS Auto Scaling 自動擴展(一)

AWS Auto Scaling 是用來處理 application 擴充性問題,根據當下的忙碌狀況來增減 instance。需要搭配 ELB 或是 CloudWatch 使用。

ELB (Elastic Load Balance) 的原理類似 DNS round-robin,在同一個 domain name 上綁定多組 instance IP,讓外部的 request 可以分散到各 instance 去處理。ELB 也會定期對底下的 instance 做 healthy check,若發現 instance 有問題,則 dispatch 時就會掠過這台,而 Auto Scaling 也會根據這個結果去 launch 新的 instance 並掛載 ELB 底下。ELB 下的 instance 是沒有上限值的。




Setup Auto Scaling

Auto Scaling 目前尚未提供 web 界面,只能用 command line 的方式去設定,在開始之前,請確定已經透過 web 設定好:
  • Create Image for a instance (ImageID: ami-7061fb19) 
  • Create ELB (with/without instance) (Load Balance Name: webserver)

Create auto scaling configuration
$ aws autoscaling create-launch-configuration \
--launch-configuration-name as-config \
--image-id ami-7061fb19 --instance-type t1.micro

Show the auto scaling configuration
$ aws autoscaling describe-launch-configurations

Create auto scaling group
$ aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name as-group \
--launch-configuration-name as-config \
--availability-zones us-east-1a \
--load-balancer-names webserver \
--max-size 3 --min-size 2 \
--default-cooldown 300
這個指令一執行,auto scaling 就被啟動了。

為了避免 instance 重複被 launch,有個時間參數設定很重要:
  • --default-cooldown (integer)
    The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start.
這個時間至少要大於服務啓動的時間
服務啓動時間 = EC2 開機時間 + Web Service 啓動時間 (+ ELB check health 的時間)

Show the auto scaling group
$ aws autoscaling describe-auto-scaling-groups

照上面的設定最少會有 2 台 instance 在 list 上
            "Instances": [
                {
                    "InstanceId": "i-e0a77c8c",
                    "AvailabilityZone": "us-east-1a",
                    "HealthStatus": "Healthy",
                    "LifecycleState": "Pending",
                    "LaunchConfigurationName": "as-config"
                },
                {
                    "InstanceId": "i-e2a77c8e",
                    "AvailabilityZone": "us-east-1a",
                    "HealthStatus": "Healthy",
                    "LifecycleState": "Pending",
                    "LaunchConfigurationName": "as-config"
                }
            ],

Verify
可以試著把任一台 instance stop,auto scaling 機制偵測到後又會 launch 一台新的,並且掛到 ELB 底下。




Monitor ELB healthy

Create auto scaling group 時,預設是對每個 instance 做 healthy check,若要改為 check ELB,則要加上兩個參數:
  • --health-check-type ELB
  • --health-check-grace-period 60
$ aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name as-group \
--launch-configuration-name as-config \
--availability-zones us-east-1a \
--load-balancer-names webserver \
--max-size 3 --min-size 2 \
--health-check-type ELB --health-check-grace-period 300

Verify
可以試著讓 ELB 的狀態變成 unhealthy,在此我的 ELB 狀態是去 check 各 instance 的 web service,所以我把全部的 instance web service都停止,果真會掛 instance 上來。

但我對於這邊的行為還沒完全掌握,當沒有一台 instance 能夠服務時,那些不能服務的 instance 從 ELB list 中移除並 terminate,auto scaling 會 detect 到,並且循序 launch 一台新的 instance,直到 ELB 正常為止,但如果 service 是因為太忙碌不是掛掉,應該要加更多的 instance 上去而不是移除。



Stop Auto Scaling

Update group setting
$ aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name as-group \
--min-size 0 --max-size 0

如果不更新就直接刪除,會有 error message: You cannot delete an AutoScalingGroup while there are instances or pending Spot instance request(s) still in the group.

Detete auto scaling group
$ aws autoscaling delete-auto-scaling-group --auto-scaling-group-name as-group

要注意一點,刪除 auto scaling group 後,所有的 instance 都會被 terminate!



參考資料

2013/03/30

使用 Command Line Tool 建立 AWS EC2 Instance

AWS 以已經有提供 web 界面可以操作了,為何還要使用 command line 呢?答案是為了自動化的過程。Auto scaling 就是一個很好的例子。


Install AWS Command Line Interface

It run in Python environment, and installed by pip.
$ pip install awscli


Setup credential and region

Method 1
$ vim ~/.aws.conf
aws_access_key_id=AKIAIJQ7YGMRQTBIH7HJ
aws_secret_access_key=ngbsB02udwOmDztTesTJuuZ8ZdkA2ZRq0VHvunX
region=us-east-1
$ export AWS_CONFIG_FILE=~/.aws.conf

Method 2
$ export AWS_ACCESS_KEY_ID=AKIAIJQ7YGMRQTBIH7HJ
$ export AWS_SECRET_ACCESS_KEY=ngbsB02udwOmDztTesTJuuZ8ZdkA2ZRq0VHvunX
$ export AWS_DEFAULT_REGION=us-east-1

若沒有設定好,則會出現下面的 error
Unable to locate credentials
You must specify a region or set the AWS_DEFAULT_REGION environment variable.


Create Instance

$ aws ec2 run-instances --image-id ami-002bf169 --min-count 1 --max-count 1 \
--instance-type m1.small --placement '{"availability_zone":"us-east-1a"}'
{
    "OwnerId": "132130202433",
    "ReservationId": "r-ec8f2587",
    "requestId": "05125c46-dfbd-4ef4-89a8-0efe6f59ba87",
    "Groups": [
        {
            "GroupName": "default",
            "GroupId": "sg-2337df4f"
        }
    ],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": "",
            "KernelId": "aki-825ea7eb",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2013-03-30T02:58:42.000Z",
            "ProductCodes": [],
            "StateTransitionReason": "",
            "InstanceId": "i-ff16069f",
            "ImageId": "ami-002bf169",
            "PrivateDnsName": "",
            "SecurityGroups": [
                {
                    "GroupName": "default",
                    "GroupId": "sg-2437df4f"
                }
            ],
            "ClientToken": "",
            "InstanceType": "m1.small",
            "NetworkInterfaces": [],
            "Placement": {
                "Tenancy": "default",
                "GroupName": "",
                "AvailabilityZone": "us-east-1a"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "VirtualizationType": "paravirtual",
            "RootDeviceType": "instance-store",
            "AmiLaunchIndex": 0
        }
    ]
}

image-id 就是 AMI 的 id,它可以是 My AMI 也可以是 Community AMI


列出目前所有的 instance
$ aws ec2 describe-instances


關於 ec2 的操作,更詳細的可以看
$ aws ec2 help
$ aws ec2 run-instances help


Reference

2013/03/27

memcached 常用指令

Telnet command

> set foo 0 60 3
bar
STORED


> get foo
VALUE foo 0 3
bar
END
add, replace 與 set 的用法一樣,只是 add 遇到 key 已經存在則 return error,replace 遇到 key 不存在則 return error。


> delete foo
DELETED


> flush_all
OK


> stats
STAT pid 30845
STAT uptime 427550
STAT time 1363069077
STAT version 1.4.6
STAT libevent 2.0.7-rc
STAT pointer_size 64
STAT rusage_user 0.068989
STAT rusage_system 0.086986
STAT curr_connections 5
STAT total_connections 506
STAT connection_structures 7
STAT cmd_get 10
STAT cmd_set 19
STAT cmd_flush 1
STAT get_hits 8
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 0
STAT incr_hits 0


> stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 9442
STAT 1:free_chunks 490
STAT 1:free_chunks_end 990
STAT 1:mem_requested 875108
STAT 1:get_hits 5987916
STAT 1:cmd_set 182569
STAT 1:delete_hits 16
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 2:chunk_size 120
STAT 2:chunks_per_page 8738
STAT 2:total_pages 2


> stats cachedump 1 1000
ITEM test1 [133 b; 1352958262 s]
ITEM test2 [10 b; 1352958262 s]
ITEM test3 [10 b; 1352958262 s]
ITEM test4 [15 b; 1352958262 s]
ITEM test5 [11 b; 1352958262 s]



內建的 tool

Show states
$ memstat --servers=localhost
         pid: 7848
         uptime: 11912375
         time: 1364870637
         version: 1.4.6
         libevent: 2.0.7-rc
         pointer_size: 64
         rusage_user: 1193.212604
         rusage_system: 4398.974254
         curr_connections: 184
         total_connections: 930825
         connection_structures: 249
         cmd_get: 168874575
         cmd_set: 6459571
         cmd_flush: 0
         get_hits: 158956302
         get_misses: 9918273
         delete_misses: 1
         delete_hits: 401
         ...

Dump all keys
$ memdump --servers='localhost'
KEY1
KEY2
...

Cat a set of key values
$ memcat --servers='localhost' TEST --verbose
key: TEST
flags: 0
length: 3
value: 123

How to dump memcache key/value pairs fast - dump the key values in parallel mode


Copy a set of files to a memcached.
The key names will be the names of the files, without any directory path.
$ ls
test.1   test.2   test.3
$ memcp --servers='localhost' test.*
$ memdump --servers='localhost'
test.1
test.2
test.3

2013/03/26

談 Coding Style 與 Naming Convention

工作三年,回頭再來看看一些寫程式的基本 guideline,深深覺得小時候沒學好...

一個程式的週期不只有 key in 程式碼而已,包含了requirement、design、implementation、testing、maintenance。有一些好習慣從平常就要養成,習慣不好,程式寫得再快都沒有用,日後有可能在 maintenance 時就賠上了大半時間。

為了讓自己可以安穩的睡一覺,還是趁早把基礎打好吧。在網路上已經有很多現成的 rule 可以依循,不需要自己發明,除非用了以後發現有更適合自己的地方。



Coding Style

有句話是這麼說的:任何人都可以寫得出電腦看得懂的程式,但要讓『人』看得懂,不是一件容易的事情!
Run 比較久公司,可能內部自己就有一套 coding style,也可以在 google 搜尋一些 keyword: coding style, coding standard, programing guideline

自己就看得順眼的先找一套來使用吧,我自己寫 C 語言比較多,follow 的 style 比較偏向 K&R。

比較強的 IDE 都有內建排版,像是 Eclipse 預設就有 K&R、BSD、GNU...等方式,也可以根據樣板再去做修改,透過軟體排版會快很多。



Naming Convention (Naming Rule)

好的命名法對於程式可讀性是會大大加分的,其範疇包含了程式內部變數、檔案名稱、外部參數,其實命名法也沒有一個制式規定,但有一些約定成俗的法則。
最常聽到的應該是『匈牙利命名法』,有很清楚的規範,但如果完全照著走就會發現變數變得很冗長...
另外還有『駝峰式命名法』也是常見的


根據不同的語言、平台,都有自己的一套命名法,這些『約定成俗』的名稱,我還沒辦法整理出可以遵循的 rule,真的得靠臨摹別人的程式來習得,多看一些 open source project 吧。



Documentation

Programer 好像都蠻討厭寫文件的,但很抱歉,你可能需要開 API 給別人,日後需要轉交給同事,或是自己因為時間久了也會忘記,所以寫文件真的蠻必要的。
Software design document (SDD) 算是我有認為比較常用的一種,裡面包含了 data design、architecture design、interface design、procedural design。但真正常用的還是只有 data structure 與 API,這時候就要介紹一下 doxygen,也就是把文件跟 code 結合在一起,方便維護。按照 doxygen 的格式去寫註解,最後可以產生 html 或 pdf 的文件。
c - Tools to get a pictorial function call graph of code - Stack Overflow
另外,在這篇有提到蠻多工具可以把 function call 畫成圖片,也就是流程圖,這對於 trace code 有些幫助!但 function call 應該是在 design 階段就劃分好,否則輸出的流程太雜亂幫助也不大。



小結

Vgod曾說過:好的程式設計師跟普通的程式設計師,效率可以差上幾十倍甚至幾百倍。除了上述的 coding 習慣、使用工具、開發環境...種種細節都會影響到,在拼專案之餘,也花些時間注重這些東西吧,一起往神人的境界努力!如果還有其他關於基礎學習,我再更新上來。

2013/03/24

在 Mac OS X 建置 python 開發環境

Install gcc for command line

Open XCode, click menu Preferences -> Downloads
check Command-Line Tools


Install Python-2.7.3

$ tar zxvf Python-2.7.3.tgz
$ cd Python-2.7.3
$ ./configure --prefix=/opt/Python-2.7.3
$ make && make install
$ export PATH=/opt/Python-2.7.3/bin:$PATH


Install distribute-0.6.35

$ tar zxvf distribute-0.6.27.tar.gz
$ cd distribute-0.6.27
$ python setup.py build
$ python setup.py install


Install pip-1.3.1

$ tar zxvf pip-1.1.tar.gz
$ cd pip-1.1
$ python setup.py build
$ python setup.py install


Install virtual environment

$ pip install virtualenv
$ virtualenv --no-site-packages /opt/pyenv
$ export PATH=/opt/pyenv/bin:$PATH



Install eclipse IDE

Download Eclipse Classic 4.2.2

Install PyDev plug-in for eclipse

Click menu Help -> Install New Software
Add repository with location: http://pydev.org/updates, then check the PyDev


Configure the interpreter

Click menu Preferences -> PyDev -> Interpreter - Python
Add new...
 

Add a new project and run it.
The debug mode is powerful.

2013/03/16

極致工藝 MacBook Air

昨天把我吃飯的傢伙給升級了 - MacBook Air


從 2009 MacBook Pro (Core 2 Duo) 升級到 2012 MacBook Air (i7 + SSD) 真的超有感覺
我已經忘了什麼是等待

由於 CPU 跟 Ram 都是不能更換的 就一次升到頂規啦
CPU i5 跟 i7 只差 3000 多
Ram 的話由於要跑 VM 升到 8G 也是必要的
SSD 我用 256GB 倒是沒有更大的需求 (SSD可以自行更換)


港版的 MBA 鍵帽上沒有注音符號 相當乾淨
符合我的風格 真的超愛

這個薄度令人驚嘆
重量從 MBP 的 2.06kg 降到 MBA 的1.35kg
天天要帶來帶去 以後身體負擔也減少些

疊疊樂
我的 MBP 可以退役了
MBA 正式上線

2013/03/12

物品的價值在於用了它,而不是擁有它 - 斷捨離


最近看了『斷捨離』這本書,主要在講述『人』與『物品』間的關係,我覺得這是可以自己動手做,而且很快就會有效果的。

整理一些心得跟大家分享:

觀念

  1. 『物品的價值在於用了它,而不是擁有它』,放著不用反而是一種浪費,甚至還會腐蝕你的周遭 (生存空間、心情、打掃時間...)
  2. 物品跟人的生理、心理是相關聯的,影響的層面包括了健康、安全、心情、自信心…甚至是運氣
  3. 一個人的時間是有限的,單一時間能用的物品數量就是那麼多,大部分的時候都太貪心了
  4. 三種『捨不得丟』的人,性格與其表徵:
    1. 逃避現實:在外停留的時間居多,並非忙碌才不在家,而是不想在家而忙碌。不敢面對自己,因為害怕而為自己找藉口
    2. 執著過去:將情感寄托在物品上,任何物品都當作自己的珍藏。給人活在過去的感覺
    3. 擔憂未來:儘管生活上購買東西已經很方便了,但我們還是有「囤貨」的習慣,造成過度購買,何不等到真正需要的時候再來買。庸人自擾,擔憂自己未來可能會發生什麼事情,這是最多人的一種
  5. 人要活在『當下』,不要活在過去,也不要過度擔憂未來
  6. 『捨不得』跟『可惜』是你最大的敵人,捨不得用、捨不得送、捨不得丟,不要把太多情感賦予在物品上面,情感應該是對人付出才是
  7. 如果一件衣服穿在身上都會讓你覺得不自在、沒自信、不舒服,為何還留著?自以為塞在櫃子某個深處就不浪費了,心想著有一天我應該會再穿到它。
  8. 辛苦賺錢買了的東西,當下的價值是100% 卻捨不得用,等到某天要用的時候,它的價值可能只剩 60%,這才是真正的浪費(食物過期、衣服過季、當下快樂的感覺也褪去)
  9. 有個東西一直被我們忽略:生存的空間,東西堆太多就會佔據生存空間。別以為東西越多就是越富有,超過一定的程度就有反效果
  10. 東西變多的時候,不是去買櫃子/箱子來裝,應該檢視一下是不是有不需要的東西,重『質』不要重『量』
  11. 一個家的功能不不該只是安全庇護,待在裡面應該要有跟待在旅館一樣的舒適、放鬆,更進一步有溫暖與愛
  12. 整理是把東西擺整齊、收納起來、放到看不見的地方,但斷捨離的精神不是整理,是把不需要的捨棄掉,剩下的東西不多,自然也整齊了起來,連打掃時間都縮短了

做法

  1. 物品處理的 cycle:
    1. 自用:把最適合、最好的拿來用,並免除多餘的
    2. 送人:為物品找到適合的對象也是很開心的,也能增進彼此的情感
    3. 變賣:換取一些金錢,不無小補
    4. 回收:資源回收、舊衣回收、傢俱回收,都有對應的管道
    5. 丟棄:上述都不行的話,這物品的剩餘價值也不多了
  2. 把同樣的東西擺在一起,挑出最好了幾樣,並拿來用,剩下的淘汰
  3. 判斷是否購買/丟棄的依據:喜好程度、使用頻率、條件。(先跳脫價格)
  4. 分批丟棄,第一步先找出不能用的(壞掉的、發霉的),第二步找出可以用但用不到、不需要的… 最後留下來,就會是自己真正喜愛的、需要的
  5. 物品的收納要以方便拿取為主,否則漸漸的又會凌亂起來。但物品太多時,怎麼收納都不方便
  6. 『三』是我們的好朋友,是一個腦袋可以負荷的數字,分三類、分大中小三種、分三層、三格…
  7. 『七五一總量控制』,看不見的收納最多放七成(留物品通道),看得見的收納放五成(美觀),展示櫃只放一成(精品)
  8. 買東西寧可買貴也不要多買,大賣場的『單價便宜』只是一種銷售策略,往往『總價』還是買過頭了,要清楚知道這次買東西的目的是什麼,不要因為便宜就買
  9. 一個好的東西價值是有可能大過三個普通的東西,雖然貴了些,但如果是自己真的很喜愛的我會買,而且貴的東西大多會保值

結論

  1. 物品的價值是靠『人』來彰顯,用了才會發揮它的價值,而人也因為『物品』的裝飾,整體都提升了,彼此相輔相成
  2. 漸漸會培養出精準的眼光與果斷力,下次在逛街的時候,就會很清楚自己想要的是什麼,不會因為衝動而買了不必要的東西
  3. 東西少一點、簡單一點,生活也輕鬆一點,斷捨離能為你帶來長時間的快樂


2013/03/02

富足人生與圓夢計劃

兼顧把這八大類,打造一個富足的人生。
(註:畫 mind map 的免費工具:Mind42)


之前一直在思考,能否把人生歸納在幾個項目,好讓生活有個目標可以依循,又不至於漏掉些什麼,後來在雜誌上看到這張圖,取自于松村寧雄《曼陀羅九宮格思考術:達成目標成功圓夢》,我認為該有的都概括到,於是開始 follow。

也許有人會選擇把時間都投注在追求某一項,你可以成就一番事業、實現夢想,你的聲譽與財富可能羨煞許多人,但這對我來說都不是真正的成功,因為這成功得背後可能犧牲了自己的健康、陪伴家人、另一半的時間,或是當下的快樂。而且考慮到風險的存在,這個不平衡的狀態,在過程中可能會因失控的健康或家庭,讓你無法進行原本的計劃。

唯有一個均衡的人生,才能穩紥穩打的走下去,這彼此間是相輔相成的,千萬不要放棄任何一項,至少各項要達到60分及格,多餘的時間就看你想成就什麼,就把重心投注在那上面。這是一個保守的做法,要在維持均衡之下再去追求自己想要的目標,是有一定的難度,但真正夠想要的人一定能達到。



圓夢計劃

用紀律來圓夢,是我目前正在嘗試的方法,也是我覺得可行性挺高而且實行起來不會太困難(只要把習慣養成),但缺點就是很漫長,恩...我相信成功沒有一蹴可幾,端看你願意花多少時間與力量。

時間應該要花在真正需要思考的地方,我把 regular 的事情列在月曆上,以週為單位,好像小學生的功課表,什麼時間該做什麼事情都清清楚楚。

(註:Google Calendar 是你的好幫手)

  • 工作
    就是一到五的未標示的部分。自己要很清楚當下工作的『目的』是什麼?為謀生、為成就、為下一階段做準備、為興趣、交朋友...總之專心的把工作做好,才不會拖到下班時間。如果實行夢想與上班做的事情是重疊的,那就更棒了!例如我想在網路上創業,我白天從事的工作也是網路相關的研發。
  • 運動
    這太重要了,這是維持健康必要的條件,沒有健康別談論夢想,不要連累到家人就不錯了,如果你的人生是看長期的話,找一個沒有金錢、時間、地點、年齡、性別、人數限制的運動,游泳是個不錯的選擇,不會太劇烈,也可以運動到全身。健康這東西,平時身體好好的你不會知道它的存在,只有在病痛的時候才會凸顯它的重要。
  • 睡覺
    這也是在日曆裡未標示的。每個人的睡眠時間長短、起始不同,如何找到自己的黃金時間(最少睡眠最大體力),這要靠自己去 try,睡眠跟工作一樣,在於『質』不在於『量』。
  • 寫部落格
    我覺得這是一件很困難的事情,『自己懂了』跟『用文字表達讓別人懂』,這兩個層次真的差很多,進一步再追求排版容易閱讀、內容吸引人、持續更新。
    寫部落格真的對自己有幫助啦,好處有很多就不一一提了。
  • 便利商店看雜誌
    現在的便利商店有冷氣有桌椅,又有各類雜誌,趨勢、財經、自我學習、休閒...除了工作上的專業知識,上述人生八大類都可以在此補足,也培養廣泛快速閱讀的能力。了解一下世界發生了什麼事情,不至於跟社會脫鉤,也跟其他人有話題可以聊,挑幾個對自己有幫助的篇幅再去深究即可。
    我深深覺得這是世界上最划算的事情了,點杯咖啡就可以坐一整個早上,不過通常我都翻不到幾頁啦,大部份時間還是望著窗外思考,靈感也是從這邊兒來。
  • 喝咖啡
    喝咖啡只是舉例,要吃下午茶也可 :D 重點是跟你的朋友見面,你的朋友可能來自於各行各業、各職位,不需要有特別的事情才能見面,單純聯繫感情,關心彼此,也讓他們知道你在做什麼,不同的朋友會給你不同的看法。
  • 實現夢想
    有人說:一個人的成就不在朝9晚5,在於晚7到晚11。朝九晚五不過是每個人每天在做的事情罷了,想跟別人不同?好好利用下班時間吧。
  • 逛街
    每個人逛街的目的大不相同,治裝、看妹、看新奇的東西...總之放鬆就好,我最常做的就是逛新光三越跟誠品。這個目的在於走入人群,人畢竟是群體動物嘛!
  • 禮拜日 do anything you want
    這一天比較彈性,可以延續本週未做完的事情、一場電影、一趟旅程、回家鄉、辦聚會、休息聽音樂...重點在於做你『想』做的,滿足自己的慾望,讓自己快樂。由於一到六比較屬於既定的事情,禮拜日當然要跳脫一下啦,我會選擇去嘗試『之前沒做過的事情』。


計劃表僅供參考,時間要能自己安排,計劃一旦訂了就要去執行,改變 - 從小地方開始。

2013/03/01

北宜、翡翠水庫

我喜歡在上班時間出遊,因為不會人擠人,喜歡一個人幽靜、自在的感覺。

又是搬出 Evernote 啦,這真是好物!現在已經是晚上10點,隔天就要出發了,沒有太多時間做功課,找一下台北市周遭的好了,北宜公路還沒騎過。



參考一下網友都到哪邊去玩


整理如下,北宜公路(台九線)
  • 27K - 千島湖、八卦茶園
  • 26K - 海倫咖啡
  • 24.5K - 鷺鷥湖、潭腰
  • 24.5K - 雲海國小
  • 22K - 二格山賞雲瀑


悠悠哉哉大概半天的時間,另外北宜也是騎士的天堂,27K - 32K 可以看看重機壓車啦!
我是從汐止出發,路過石碇也順便走走吃個東西,