Thursday, April 17, 2014

Scala筆記: Regular Expression是你的好朋友

如果想要檢查一個字串a是否包含另一字串b, 我們會用a.contains(b)
如果想要檢查一個字串a是否由另一字串b開始, 我們會用a.startsWith(b)
如果想要以字串b為基準對a取子字串, 我們會用a.substring(a.lastIndexOf(b)+b.size)
...
以上種種字串比對, 其實也可以透過Regular Expression來達成(JDK 1.4開始支援)
Regex這個class就是讓你輕輕鬆鬆!?使用Regular Expression

要產生Regex的pattern有幾種方式:
第一種就如同以下的範例, 透過字串的r函式就可以產生Regex的物件, (其實String沒有r函式, 而是透過implicit轉換成WrappedString才找到的, 不知道implicit是什麼的話可以參考這篇)
用三層引號則是要省掉跳脫內層反斜線的麻煩
接下來在比對字串的時候可以直接把比對pattern之後每個對應的群組抽出來,
就像以下範例將日期分成年月日三個群組,
用起來很容易但壞處就是比對失敗就會馬上有錯誤訊息跳出來.
scala> val dateP1 = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
dateP1: scala.util.matching.Regex = (\d\d\d\d)-(\d\d)-(\d\d)

scala> val dateP1(year, month, day) = "2011-07-15"
year: String = 2011
month: String = 07
day: String = 15

scala> val dateP1(year, month, day) = "2011-7-15"
scala.MatchError: 2011-7-15 (of class java.lang.String)
 at .(:11)
 at .()
 at .(:11)
 at .()
 at $print()
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
 at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
 at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
 at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
 at java.lang.Thread.run(Thread.java:680)

或是你可以考慮用findFirstIn, findFirstMatchIn等等Regex提供的函式來比對,
就算比對失敗也是拿到None, 讓你可以比較無痛的做接下來的處理.
scala> val copyright: String = dateP1 findFirstIn "Date of this document: 2011-07-15" match {
     |   case Some(dateP1(year, month, day)) => "Copyright "+year
     |   case None                           => "No copyright"
     | }
copyright: String = Copyright 2011

scala> val copyright: String = dateP1 findFirstIn "Date of this document: 2011-7-15" match {
     |   case Some(dateP1(year, month, day)) => "Copyright "+year
     |   case None                           => "No copyright"
     | }
copyright: String = No copyright
另一種產生Regex的方法就是老老實實的用建構式囉!

ref:
- scala api document: Regex
- regular expression metacharacter syntax
- Java Regular Expression筆記

Wednesday, March 05, 2014

Scala筆記: sbt安裝與版本管理

[1] 什麼是sbt?
sbt(simple build tool)是Scala常用的建置工具(也支援Java)

[2] 怎麼安裝?
Mac可以用Macports或Homebrew裝, 不過我喜歡手動裝啦XDD
主要是因為project多起來之後, 有的得用到最新的sbt, 有的卻只能用特定版本,
所以我會同時裝好幾個版本
手動裝其實也很簡單, 只要到這裡選擇特定版本抓下來解壓縮就好啦!(目錄可以加上版號比較清楚)
可以把你最常用sbt版本的路徑加到PATH

[3] 如何指定版本?
只要用-sbt-jar就能夠指定要用哪一版的sbt launcher
範例如下:
sbt -sbt-jar ~/Documents/dev_tools/sbt-0.13/bin/sbt-launch.jar {command}

ref:
- sbt: Getting Started, SetUp

Sunday, March 02, 2014

FoFoCup: 輕便好用又環保的折折杯 16oz

為了解救北極熊,
曾經我下定決心買咖啡外帶都要自備杯子,
但是環保杯都好重攜帶不方便(女生的包包有時候很小啊~),
幾次偷懶下來就又回復到每次都用紙杯裝的模式了

直到有天看到蘋果副刊林柏宏的訪問中看到他的環保杯竟然是摺疊的!
我立馬咕狗了發現原來它是折折杯


我是在ASAP買的, 遞送真的好~~快啊!!
打開清洗之後, 下午就興沖沖的帶出去買咖啡啦!
在組裝的過程中本來有點擔心杯口跟杯蓋可能會不太密合,
但其實組起來的蠻牢的, 應該是因為杯蓋的溝槽夠窄也夠深吧!

咖啡喝一喝覺得它真是挺好用的,(喝到一半拍的所以杯口有咖啡漬!哈)
就決定幫他宣傳一下囉!
蓋子上方有一個小凹槽可以放飲用口的塞子,
飲用口對面的十字可以插吸管,
蠻多細節都有照顧到

身體長這樣蠻好拿的, 只要注意拿杯套不要用力捏杯口應該都不會灑


買之前看到ptt有人討論這種材質的杯子是不是容易殘留飲料漬!
這次喝完只是簡單用海綿刷刷杯子裡面跟杯蓋, 然後用水沖沖感覺就蠻乾淨的
可能要用久了才能確定吧!

目前想到的小問題是, 飲料喝完杯子如果不能馬上洗又想要折起來放包包,
可能需要隨身攜帶一個小塑膠袋把它包起來吧!


Sunday, February 23, 2014

山神交代, 有人放屁回家等待!

圖片引用自宋少卿官方粉絲團
山神交代, 非常厲害, 出門在外, 手腳要快, 捕魚打獵, 不可懈怠,
遇到山豬趕快閃開, 有人放屁回家等待.
這就是有名的嘎督吧咕嚕嘎啦經阿~
睡前有閱讀的習慣,
但有時候晚下班或是覺得眼睛太累, 看書反而是個負擔
這時我會聽相聲!

躲在棉被裡, 聽到有趣的段落會忍不住笑的滾來滾去(屢試不爽), 然後慢慢的睡著!

相聲瓦舍的作品裡頭我最喜歡的段子是台灣原人
上面的嘎督吧咕嚕嘎啦經是描述原住民打獵的禁忌
但我始終覺得這是瞎編的!

直到... 我看了串起莽口葛艾才發現這是真的(雖然段子中是阿美族在花蓮打獵)~
這本書是在講魯凱下三社族群(萬山多納茂林)的傳統習俗以及各種生活智慧.
在茂林的話, 獵人們較常依鳥占判斷, 若出發時遇到ido(繡眼畫眉)往右飛或是在獵人的右方鳴叫,
代表著獵獲吉兆; 相反的話, 是告誡獵人不宜出發,
...
此外出發當下, 若有同伴打了噴嚏, 或是放屁, 這也是不詳預兆, 表示應當折返.
真是聽相聲長知識啊!

Saturday, February 08, 2014

Scala筆記: implicit的奧秘

[1] implicit是什麼? 如何運作?
implicit具有型別轉換的功能, 但他的特殊之處在於, 他是由compiler觸發,
在compile階段若是發現型別相關的錯誤, complier會試圖利用宣告為implict的東西轉型藉此完成compile.

此種自動轉型有以下幾個規則:
1. Marking Rule: 只能使用被宣告為implicit的東西
- 可以是任何variable, function, 或object
2. Scope Rule: 只能利用在同一個scope中, 或是被宣告在companion object可見的scope中, 而且必須能用一層identifier呼叫(用以下例子說明比較清楚)
scala> object test2{
     | implicit def doubleToInt(x: Double) = x.toInt
     | }
defined module test2

scala> object test{
     | import test2._
     | }
defined module test

scala> import test._
import test._

scala> val i: Int = 3.5
<console>:12: error: type mismatch;
 found   : Double(3.5)
 required: Int
       val i: Int = 3.5
                    ^

scala> import test2._
import test2._

scala> val i: Int = 3.5
i: Int = 3
3. Non-Ambiguity Rule: 若是在scope中有超過一種implicit轉換的方式, complie會失敗.
4. One-at-a-time Rule: 一次只能套用一個implicit轉換, chaining(ex: A->B->C)是不行的!
5. Explicits-First Rule: 明確的型別指定具有絕對的優先權, 只有錯誤發生時, compiler才會透過implicit的方式修補.

[2] 甚麼情況會觸發implicit檢查?
1. conversions to an expected type: 型別不對時
scala> val i: Int = 3.5
<console>:7: error: type mismatch;
 found   : Double(3.5)
 required: Int
       val i: Int = 3.5
                    ^

scala> implicit def doubleToInt(x: Double) = x.toInt
doubleToInt: (x: Double)Int

scala> val i: Int = 3.5
i: Int = 3
2. conversions of the receiver of a selection: 找不到對應的函式
- 當沒有某個method時, 會利用implicit去轉型, 檢查是否有對應的method

3. implicit parameters: 找不到對應的參數
- 被宣告為implicit的參數, 在呼叫時沒有被傳入時, 會去尋找被宣告為implicit的東西(有點類似default值的感覺)

[3] 什麼時候適合使用implicit
當你的程式想要與一些現成的library整合時, 就例如你可能有一個購物網站, 系統定義了使用者各種屬性, 也有許多針對使用者資料的操作已經完成. 但現在你的網站希望能提供Facebook或Google帳號登入, 但他們的使用者屬性各不相同, 這時你可以加入implicit的方式自動把透過Facebook或Google api拉回來的型別轉成你的使用者型別, 也同時可以直接享用你已經寫好的各種method.

ref:
- Chapter 21 of Programming in Scala, First Edition Implicit Conversions and Parameters
- A Tour of Scala: Implicit Parameters
- Implicit Classes
- Scala Implicit Conversion

Tuesday, February 04, 2014

西班牙葡萄牙我們來惹 (5) Sevilla主教堂, 希拉達塔, 西班牙廣場

上篇說到驚嚇的事情即將發生~

西底! 話若抹講透支, 目屎是揮莫離啊~~~
當我睜開惺忪的雙眼, 小大仍默默的開著車, 我們已經到了Sevilla. 但歹誌並不是像憨人所想的那麼簡單(到底要用多少鐵獅玉玲瓏梗 囧)
我們的GPS圖資不完整(其實在Ronda就有徵兆了, 但當時沒放在心上), 雖然高速公路沿著指標到了Sevilla, 但我們並不清楚實際上的位置在哪(雷擊)
加上四周沒什麼路燈, 要看路牌對地圖找路幾乎是不可能.
但我們還是默默的前進, 到了一個很大足球場附近, 剛好有比賽所以周邊有些人群就連忙把車靠邊停下來問路.
(我感覺是在這裡, 離鬥牛場跟西班牙廣場超近搭~)


問了大致的方向, 勉強往預定想住的旅館開
感覺到四周越來越熱鬧, 餐廳擠滿了人路邊也充滿了喧譁聲. 本來還挺開心的.
不過路也越來越小, 時不時出現單行道讓我們有種鬼打牆的感覺,
這時我們心知大概沒辦法找到那間旅館了.
也沒關係, 反正沒有真的訂, 放棄反而有種稍微鬆口氣的感覺,
只需要另外找住的地方就好了嘛. 附近這麼多!
但歹誌又再度不是像憨人所想的那麼簡單(還要用幾次XDD)
我們到Sevilla這天是禮拜五, 是歡樂的週末夜來著!
問了大概快十間旅社, 不是房間都客滿了就是停車要付一個不可思議的價錢,
此刻真是覺得身心俱疲.
好不容易找到一個舊舊的hostal附近也有公共停車場, 當場都要落淚了
於是我們簡單的梳洗後就迅速的跳上床休息啦!

睡得飽飽才起床, 在附近悠閒的吃了早餐, 在開始遊覽這個城市之前還有些事情得要先處理.
謹慎的查地圖規劃路線, 先把行李寄放在今晚訂好的民宿之後得要先還車,

接著要買隔天前往葡萄牙的車票
在車站看到了這巨大的塗鴉, 沈睡了的娃娃

還有老皮, 在西班牙也很紅柳~

搞定一切之後就進入觀光模式啦!
路上看到生意好的冰淇淋店是一定要吃低
一手一支多開心啊哈哈哈


來到Sevilla主教堂(Catedral De Sevilla)排隊等著進去參觀
這可是世界最大的歌德式教堂, 同時也是世界第三大教堂哦! 相當厲害!

教堂裡面有哥倫布的墳墓

教堂的原址是清真寺, 因此在改建時沿用了一些回教建築的元素,
最特殊的就是希拉達塔(La Giralda)原本是喚拜塔後來被改為鐘樓.
我們沿著旋轉的斜坡往上走, 因為要讓人可以騎馬到塔頂, 所以採用斜坡而不是階梯, 真是挺酷的.
塔頂的風景超棒的啊!

在這邊狂拍照, 但是大鐘真的很難拍的好(汗)

離開希拉達塔之後到了教堂外面的橘子庭園(Patio de los Naranjos)
可惜沒辦法看到結實累累的橘子, 只在地上看到零星兩三顆


接著我們往西班牙廣場(Plaza de España), 路上碰到許多馬車.
馬車也是遊覽Sevilla的方式之一, 幾個大景點周邊都有馬車站, 就跟計程車排班一樣, 挺有趣的.
不過有一點無法掌控的就是馬兒想要排泄的時候你擋不住啊XD


西班牙廣場呈現半圓形, 中間有座噴水池, 建築周圍有小河可以划船, 感覺超愜意搭.

廣場與建築間有橋連接, 每座橋都有超美的彩繪


挑高的迴廊也超美的呀~


轉眼間也到了黃昏, 我們隨意找了間餐廳吃點小東西
感覺是主打精緻甜點所以對他們的鹹食沒有抱太大的期待
但店員推薦的炸魚搭配薄荷醬汁超好吃搭還喝了此行的第一杯Sangria(開心)
接著就是期待已久的佛朗明哥舞表演囉!

小大版: 西班牙佛朗明哥之最 Seville

西班牙葡萄牙我們來惹 (2) 太陽海岸 Costa del Sol: Nerja, Frigiliana, San Pedro
西班牙葡萄牙我們來惹 (3) 藍色小精靈村Juzcar以及鬥牛的故鄉Ronda
西班牙葡萄牙我們來惹 (4) 快閃直布羅陀Gibraltar以及雪莉酒的故鄉Jerez
西班牙葡萄牙我們來惹 (7) Sevilla城堡

Monday, January 27, 2014

Scala筆記: lazy的奧祕

有感於自己Scala的根基不是很紮實, 於是開始看一些Scala G+群組推薦的文章,
希望能把code寫的更好一些.
今天看的是Design Patterns in Scala其中提到了lazy的運用, 重新溫習了一下就順便做筆記囉!

一般的val是在定義的時候, 就會馬上執行而得到值.
加了lazy, 顧名思義就是會變懶惰XD
要等到它首次被存取的時候才會被執行而得到值.

用console可以簡單看出差異
scala> lazy val y = {println("i'm y"); "y"}
y: java.lang.String = <lazy>
scala> y
i'm y
res22: java.lang.String = y
scala> y
res23: java.lang.String = y
scala> val x = { println("i'm x"); "x"}
i'm x
x: java.lang.String = x
scala> x
res24: java.lang.String = x

欸, 那lazy val跟def是不是感覺有點像勒!!??
lazy val是首次被存取的時候才會被執行, 但也只會被執行一次.
下面Date的例子就可以明顯看出差異啦!
scala> lazy val foo = new java.util.Date
foo: java.util.Date = 
scala> foo
res13: java.util.Date = Mon Jan 27 17:48:35 CST 2014
scala> foo
res14: java.util.Date = Mon Jan 27 17:48:35 CST 2014
scala> def foo = new java.util.Date
foo: java.util.Date
scala> foo
res16: java.util.Date = Mon Jan 27 17:48:54 CST 2014
scala> foo
res17: java.util.Date = Mon Jan 27 17:48:57 CST 2014
ref:
- What does a lazy val do?
advanced:
- What's the (hidden) cost of Scala's lazy val?
- if the initialization of a lazy val throws an exception, it will attempt to reinitialize the val at next access.

Wednesday, November 06, 2013

Amazon DynamoDB - 關於資料的新增修改與刪除

前篇提到Amazon DynamoDB提供BatchWriteItem讓你一次新增或刪除(修改不行)多筆資料,
不過BatchWriteItem並不像單一PutItem/DeleteItem能透過設定檢查條件來決定操作是否合法,
於是就得要先用BatchGetItem將資料抓出來自行過濾後再把該新增或刪除的東西丟過去.


如果是要修改的話就只能用UpdateItem來做囉!
以下就是UpdateItem(有些參數是PutItem跟DeleteItem也能用的)的小心得

[Request - Action] 用來指定該如何更新這筆資料
有PUT, DELETE, and ADD三種方式而最終結果會跟這筆資料(指定的primary key)是否存在相關
1. Primary key存在
- PUT: 舊資料會被新的完全取代.
- DELETE: 會把這筆資料的某個屬性(attribute)刪掉, 但如果是對某個型態為集合(Set)的屬性給定某(或多)個值, 則會把這個值從集合中移除. ex: [A,B,C] - [B] -> [A,C]
- ADD: 屬性不存在會新增, 若是存在則會失敗. 有兩個例外, 一是屬性類型為數字的情況下會將給定的加上去, 若類型為集合則會將值加入集合中.
2. Primary key不存在
- PUT: 就是新增資料.
- DELETE: 沒事.
- ADD: 在屬性類型為數字或集合的情況會資料

[Request - Expected] 用來指定你希望在什麼條件下這個操作會成功
1. 存在(Exists)條件為否, 操作就只有在給定的屬性不存在的情況下才會成功.
2. 存在(Exists)條件為真, 操作就只有在給定的屬性等於某個值(不能不檢查值真的很煩)的情況下才會成功.

[Response - ReturnValues] 能順便讀取全部或部份資料
有NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW五種選擇.
1. NONE - 不回傳.
2. ALL_OLD - 回傳UpdateItem執行前完整的資料.
3. UPDATED_OLD - 回傳這個屬性更新前的值.
4. ALL_NEW - 回傳UpdateItem執行前完整的資料.
5. UPDATED_NEW - 回傳這個屬性更新後的值.

有一點是文件上沒特別提到的, 若是有指定回傳值那此次UpdateItem的所消耗的CapacityUnits會加倍(就是一個request同時讀寫的計價法, Amazon完全不讓自己虧到XD)哦!

我想這大概是最後一篇了吧XD
越用越覺得DynamoDB限制多多(所以這其實是抱怨文來著)
不過也沒想到寫了四篇(第一篇還是四月勒),
其實邊寫邊覺得很彆扭, 英文的文件吸收完在用中文寫出來怎麼都覺得不順啊!
而且很多字不知道該不該硬翻成中文, 就變成這樣中英夾雜的狀態.(汗)


前三集:
Amazon DynamoDB - 踏出第一步
Amazon DynamoDB - 使用table的最高指導原則
Amazon DynamoDB - 注意事項

Sunday, October 20, 2013

西班牙葡萄牙我們來惹 (4) 快閃直布羅陀Gibraltar以及雪莉酒的故鄉Jerez

今天是Elia離開我們要踏上摩洛哥之旅的日子,
為了要趕上船班, 離開Ronda之後我們火速飛車前往直布羅陀!
在入境處排了長長的車陣讓我們十分憂心,
就這樣邊排邊吃著水果邊著急, 大概排了半個多小時這才順利踏上直布羅陀的領土.

[Gibraltar]
這裡的主要景點就是Rock of Gibraltar, 就是一個很大很大像山一樣大的石頭(非常爛的說明XD)
在這除了可以遠眺非洲俯看直布羅陀, 另外這裡還是一個生態保護區.

車子一路往上爬來到一處瞭望台能夠清楚俯看海港

接著來到Apes' Den, 這邊是直布羅陀猴子棲息的地方!
這裡的猴子都非常的我行我素, 不是攤在陽光下狂睡就是猛抓癢
據說要小心不要太接近跟它們互動以免遭到攻擊

媽媽猴幫小猴抓癢

有隻猴子爬到樹上練功, 都不怕摔下去勒

來個東施效顰

除了開車上來也可以選擇從山腳下搭纜車.

爬到山頂可以看到另一側的風景

直布羅陀算是英國屬地所以可以看到英國國旗哦!


接著我們就準備快閃離開, 出境也是要排隊排很久-_-
臨走前拍了極有特色的飛機跑,
因為國土小, 所以飛機跑道跟一般的車行道路是共用的,
每當有航班起降就會有欄杆封閉道路讓飛機安全通過, 真是很妙啊!


最後這就是Rock of Gibraltar的全貌.
by Elia


[Tarifa]
Tarifa已是西班牙的極南邊, 這裡不僅陽光炙熱, 連風吹來都濕濕黏黏的啊~
在這邊我們跟Elia道別, 她要前往我跟小大無緣的摩洛哥摟~


[Jerez de la Frontera]
Jerez以馬術及雪莉酒(事實上Jerez就是西班牙文的雪莉酒)聞名於世.
我們當然就是為了雪莉酒而來囉XD
可惜抵達時已是傍晚, 錯過了頂頂大名的Tio PePe酒莊的營業時間.

因為沒吃午餐已是餓極, 我們決定在這吃完晚飯後在趕路到預定的住宿地Sevilla.
可能是正好碰上了什麼慶典, 路上完全是萬頭鑽動的狀態
我們跟著人群走來到一處廣場, 轉角剛好有個小餐館看起來生意不錯就選它囉
在這我們不僅吃到超美味的Tortilla還如願喝到了Tio Pepe的雪莉酒
by LittleBig by LittleBig
兩個願望一次滿足真是超幸運

從天還是亮的吃到天黑, 出發之前我們灌了咖啡保持注意力
但無奈我還是在中途睡著了, 一醒來就有令人驚嚇的事情等著我啊~~~~~


View Larger Map

小大版:
直布羅陀Gibraltar & 雪莉酒的故鄉Jerez

[Day 3] Ronda(A) -> Gibraltar(B) -> Tarifa(C) -> Jerez(D) -> Seville(E)

西班牙葡萄牙我們來惹 (2) 太陽海岸 Costa del Sol: Nerja, Frigiliana, San Pedro
西班牙葡萄牙我們來惹 (3) 藍色小精靈村Juzcar以及鬥牛的故鄉Ronda
西班牙葡萄牙我們來惹 (5) Sevilla主教堂, 希拉達塔, 西班牙廣場
西班牙葡萄牙我們來惹 (7) Sevilla城堡

Sunday, September 22, 2013

西班牙葡萄牙我們來惹 (3) 藍色小精靈村Juzcar以及鬥牛的故鄉Ronda

離開Marbella我們驅車往山間行.

[Juzcar]
來到藍藍的村莊Juzcar, 這裡就是拍攝藍色小精靈的地方囉!

村子口有一間旅館.
by Elia
抵達的時候間又剛好是午休時間, 路上沒什麼人.
這裡除了房子是藍色的, 牆上也畫了很多藍色小精靈的角色.

另外也有藍色小精靈雕像, 在這邊我們也嘗試了多組雜誌封面情境照XD
by Elia
整個村莊.

畫有蘑菇的房子真是好搶戲啊!
by Elia
走走拍拍大概呆了一個多小時就往今天的住宿地點Ronda前進囉!

在山間穿梭中.



[Ronda]
在這兒也是花了好一番功夫才找到旅館TAT
安頓好再出來已是傍晚囉!
Ronda位於海拔750公尺的山間, 瓜達萊溫河(Guadalevín)流經此處形成深達100多公尺險峻的峽谷並將Ronda市區一分為二.
雖然一路奔波感覺有些疲憊, 但是呼吸著新鮮的空氣感覺微涼的氣溫又讓我活了過來.
by Elia
在峽谷邊眺望遠方的壯麗景色
黃黃的那棟是擁有絕佳視野的國營旅館(Prarador de Ronda)


太陽下山之後我們滿心期盼的來到以鬥牛士Pedro Romero命名的餐廳,

準備要來品嘗人生第一次的燉牛尾(還是一樣沒圖沒真相, 點小大版吧!)
但是不知是不是因為期待太高所以造成與現實落差太大, 牛尾是蠻嫩的但是並沒有讓人特別驚艷
點了tortilla送過來的竟然是omelette! 這就讓我們完全無言以對.
吃完之後就回到廣場上鄰近的小店買了甜點撫慰我們受創的心靈.

隔天我們在天還是濛濛亮就出發探索早晨的Ronda,
沿著新橋(Puente Nuevo)往舊城區走

橋的下方就是深不見底的峽谷


走啊走來到整修中的教堂(Colegiata de Sta. Maria La Mayor)

還有阿拉伯人所築的城牆遺跡(puerta y murallas de almocabar)

沿著谷地往回走霧濛濛的一片

途中經過了教堂還有長得相當怪異的阿拉伯浴場

太難拍所以就放棄了, 找到官方版的介紹影片有興趣的話可以瞧瞧

還不小心經過舊橋(Puente Viejo)

接著回到旅館吃了豐盛的早餐就準備去參觀鬥牛場啦!


鬥牛場外的牛雕像還真是精神抖擻啊~
by Elia
鬥牛場內靜悄悄, 很難想像鬥牛時黃沙翻騰, 人與牛之間心理戰的緊張氣氛, 觀眾席間高漲喧騰的情緒是怎樣的光景.

這裡便是牛衝出來的地方.

鬥牛場內還有牛隻飼養以及訓練的地方

還有馬廄.

鬥牛場兩側的走廊裝設了櫥窗, 有鬥牛的簡介以及展示了鬥牛士的服裝.
在紀念品商店買了幾張明信片,
這已是我們在Ronda最後一個景點!
by Elia
接著我們就要快馬加鞭趕路摟


View Larger Map
[Day 2] Nerja -> Marbella(A) -> Juzcar(B) -> Ronda(C)
[Day 3] Ronda(C) -> Gibraltar -> Tarifa -> Jerez -> Seville

小大版:
西班牙也有藍色小精靈 Juzcar
西班牙鬥牛之濫觴 Ronda

西班牙葡萄牙我們來惹 (2) 太陽海岸 Costa del Sol: Nerja, Frigiliana, San Pedro
西班牙葡萄牙我們來惹 (4) 快閃直布羅陀Gibraltar以及雪莉酒的故鄉Jerez
西班牙葡萄牙我們來惹 (5) Sevilla主教堂, 希拉達塔, 西班牙廣場
西班牙葡萄牙我們來惹 (7) Sevilla城堡