2010年5月5日 星期三

如何使用 Dropbox 同步不同 Mac 上的行事曆(iCal)

如何同步數台 Mac 的行事曆(iCal) [轉載請註明出處]

這個問題相信困擾過不少人
常用的解法有兩種
1. 申請 MobileMe 帳號
2. 自己架設 snow leopard server
(與 google calendar 同步不在此討論範圍內)

這兩種方式都要花錢 一個是每年付費 3,300
另一個可能是買一台 mac mini server 版 24 小時不關機

在此提供另一個方法 使用 Dropbox 同步 iCal

原理很簡單
iCal 的資料全部都存在 ~/Library/Calendars
我們只要想辦法將這兩台 Mac 的~/Library/Calendars 同步即可

第一台 Mac (iCal 裡有資料的那一台)
1. 申請 Dropbox 並安裝 (預設目錄為 ~/Dropbox/)
2. 打開 terminal 執行以下指令 (請先離開 iCal 程式)

mv ~/Library/Calendars/ ~/Dropbox/
ln -s ~/Dropbox/Calendars ~/Library/Calendars

3. 等 Dropbox 將檔案全部同步到網路上後 再設定另一台 Mac

第二台 Mac
1. 申請 Dropbox 並安裝 (預設目錄為 ~/Dropbox/)
2. 刪除 ~/Library/Calendars/ 整個資料夾
2. 打開 terminal 執行以下指令 (請先離開 iCal 程式)

ln -s ~/Dropbox/Calendars ~/Library/Calendars


目前遇到的問題是兩台電腦的 iCal 都執行起來
可能會有事件無法刪除的情形
我猜應該是我的 cache 當初沒清乾淨
不過只要行事曆不同時打開 目前還沒遇到什麼問題

ps: 同理 AddressBook 也可以用同樣的方式同步

[+/-] 繼續閱讀...

2010年2月18日 星期四

Aperture 3 V.S. LightRoom 2.6 V.S. Capture One Pro 5 V.S. DPP 3.7.2

今天針對這4款相片後製軟體做了些比較
Aperture 3、LightRoom 2.6、Capture One Pro 5、Digital Photo Professional 3.7.2

環境:
Mac mini 2.53GHz : 320GB
Max OS X Snow Leopard
4GB ram
NVIDIA GeForce 9400M

相片
400D & 5D Mark II CR2


1. 預設設定:
在完全沒調整任何的參數下(也沒套用 camera profile) 呈現的色彩討喜度是
DPP(勝) > LightRoom >= CaptureOne >= Aperture
1.1. CaptureOne: 在色彩上 Brightness 暗一點
1.2. LightRoom: Black Point 高一些
1.3. Aperture: Tint 偏綠

LightRoom 與 CaptureOne 預設有調整銳利度(Sharpen) 和雜訊(Noise reduction)
所以在沒做任何調整下 Aperture 的銳利度會低些
這些都是可以設定的 只是 LightRoom 和 CaptureOne 安裝好就設定好了

在沒套用 camera profile 的狀況下
有些偏差其實是2~3秒內就很容易調整好的
所以若以稍微調整過後且沒用 profile 情形下做比較
DPP(勝) > LightRoom >= CaptureOne = Aperture

根據功力和經驗 呈現的色彩經過調整 也是差不多的
只是需多花很多時間微調
而整體來講 如果一張圖只給你10秒鐘
DPP 超優
LightRoom 成像討喜一點
CaptureOne 成像接近真實一點
Aperture 成像介於 LightRoom CaptureOne 兩者間

若是套用 camera profile 成像品質如下
DPP(勝) > LightRoom > CaptureOne = Aperture

2. Export Full Quality Jpeg (Image Quality 12)
三者以原始大小轉出最高品質的 jpeg
在1:1下觀看實際上差不多 (銳利度等等參數已盡量調整一致)
現在 RAW 檔那麼大 然後軟體也一直更新
我個人是感覺不出來所謂的誰的演算法比較好
轉出來的成像銳利度和色彩會比較好
這4套工具我挑了幾張在 RAW 檔原始比率下 調整到差不多後再轉成 Jpeg
我已經分辨不出差異在哪兒
看得出來的人可以舉個例子順便貼個照片給我
(網路上的例子不是直入直出 不然就是只給結果 沒有前後對照的)

由於不同軟體的關係 相片大小會有些微的差異
但是以最高品質的設定轉出 jpeg (直接輸出)
其檔案大小就相差頗大 (當然最高品質下檔案最小者勝出)
轉出最高品質 Jpeg 後檔案大小
LightRoom(勝:最小) < DPP < CaptureOne < Aperture

其中 Aperture 2 的壓縮演算法有問題 在最高品質(Image Quality = 12)下
所轉出來的 jpeg 有可能比原始的 RAW 檔還大
Aperture 3 已修正此問題

3. Export Jpeg (Image Quality 11)
這部分比較難評 因為 Image Quality 範圍不同
DPP (0~10)
Aperture (0~12)
LightRoom (0~100)
CaptureOne (0~100)
實際上 LightRoom 的範圍又和 Aperture 一樣 只有13個層級(0~12)
可以簡單測試一下 92% ~ 100% 的 Image Quality
就會發現檔案都一樣

在此比較 Image Quality 0~11
DPP 就不考慮了
檔案大小: CaptureOne(勝:小) > LightRoom > Aperture
基本上成像品質可以說是與檔案大小成反比了
會有這個結果是因為 Aperture 壓縮空間比較小 所以失真比較小
基本上就看自己可以容許的檔案大小和相片品質了
(我自己覺得 Image Quality 10 以上就都很好了)
所以同樣是 Image Quality 為 11 的設定下
檔案大小:
CaptureOne(勝:小) > LightRoom > Aperture
影像品質:
Aperture(勝:失真小) > LightRoom > CaptureOne

4. 後製可調整參數
參數代表後製的空間 對於攝影師來講 也是一個不可或缺的要素
可以救回不少失敗的作品
Aperture 雖然沒有 camera profile
但是卻可以靠著強大的後製能力
調整出相當的色彩(當然需要經驗與對色彩的敏銳度)
還可存成範本供他人使用
Aperture(勝) > LightRoom > CaptureOne > DPP

4.1. Aperture: 在這項特性上 體無完膚的表現出 "快、狠、準" 的定位 而且又有 face place 功能!
4.2. LightRoom: 該有的功能都有 此軟體定位在基本後製 所以更進階的功能會希望你打開 PhotoShop 來修改
4.3. CaptureOne: 只有基本的功能 比較適合幾乎不需修改的相片 例如商攝作品 或者是拍照的那瞬間就對自己的觀景窗負責的攝影師
4.4. DPP: 精神在於不修也很好看 所以修改的參數選項很少

5. 整體執行效能 & 流暢度
雖然流暢度大部分取決於操作者對該工具的熟悉程度
但是 user friendly 的介面與即時的參數反應也是不容忽視的
Aperture 還提供 stack 與龐大的 plug-in
而 LightRoom 近年來也有後來居上的潛力
Aperture(勝) > LightRoom > CaptureOne > DPP

6. RAW 轉檔速度
這裡以 Jpeg 最佳 Image Quality 做比較
(Aperture 3 比起 Aperture 2 又有小幅度上的進步)
38張全幅
Aperture 3(勝3:28) > Aperture 2(3:50) > LightRoom (4:54) >CaptureOne (10:26) >DPP (12:16)

7. 相片管理
Aperture 強大的相片管理功能相信不需要我再次說明了
Aperture(勝) > LightRoom > CaptureOne > DPP

8. 學習曲線
我是從 Aperture 一路學回來的 所以感觸很深
Aperture 學了半年以上才得心應手
LightRoom 花了幾天 (因為不少東西和 Aperture 重複)
CaptureOne 和 DPP 不到半小時
DPP(勝:簡單) > CaptureOne > LightRoom > Aperture

心得:
整體來說 我覺得預設校調 LightRoom 與 CaptureOne 相當
(但.. 除了懶人外誰會用預設校調?)
但 CaptureOne 真實點 而 LightRoom 順眼點
因為 LightRoom 的 Black point 有高一些
有些暗部細節沒呈現出來 合乎時下一般的漂亮(?)
而 Aperture 則需要調一下 Tint 因為預設的 camera profile 偏綠
另外我對 CaptureOne 無法調整 Black Point 很不滿意

相片管理 & 工作效率 Aperture 勝出
不外乎參數調整的即時反應速度 與功能強大的工具

如果你不知道哪一套工具對你最適用,可以參考以下我個人對這三套工具需求的看法
Aperture:
攝影狂 & 職業攝影 需要處理大量相片(一出遊就數千張的人)
又需要管理這龐大相片資料庫的人

LightRoom:
一般出遊拍照 以相片記錄人生 相片量不大於200張 不過份後製相片的人

CaptureOne:
商攝作品 & 專業攝影 所拍攝的相片在按下快門前 就已經針對測光、白平衡等各式各樣環境因素考慮周全的人

DPP:
很重視相片"好不好看"的人 或初學後製又想要好相片的人

如果同時又要處理很多相片 又希望特別挑幾張好看的相片
可以考慮 Aperture + DPP 或 LightRoom + DPP

結論:
Aperture:
優點: 後製快 管理功能強大 提供相片強大的修改空間 轉檔速度最快
缺點: 成像品質一般 需要手動調整 或自訂 profile 套用

LightRoom:
優點: 後製快 基本的管理 有 camera profile 可用 成像品質佳 轉檔速度快
缺點: 管理功能普通

CaptureOne:
優點: 注重在色彩上的調整 和細部的微調
缺點: 管理功能普通 轉檔慢

DPP:
優點: 成像最佳 有 camera profile 可套用 簡單
缺點: 只有最基本的修改功能 欠缺相片管理功能 轉檔慢

[+/-] 繼續閱讀...

2009年10月22日 星期四

WeeePhoto: Best Connected TV Award on Yahoo Open Hack Day 200

很幸運的! 我們撈回來了一個獎項 Best Connected TV Award
Brian & Richard
Sapp
網站連結:
http://mbsapp.no-ip.org/weeephoto

目前還在規劃接下來的 Schedule,有打算在今年開放給朋友玩。
這些都是提外話,在這裡做個簡單的記錄,敘述一下這幾天的心得。

參賽:
原本我已經對比賽這回事沒什麼興趣,CP值不高,搞那麼久的時間獎金還不夠支付我的薪水,就在報名截止的前一天晚上(當時還不知道報名截止日),Brian 丟了我 msn,問我要不要參賽,當時心裡想著『反正上個月初就提辭呈了, 這幾天應該就走人了, 玩玩也好』,也就口頭上答應了。基於行程規劃,也順口問了一下比賽日期,和報名截止日,當下才知道隔天報名截止,而且比賽日期... 你知道的,就是 10/17 ~ 10/18 兩天,當時很天真的以為這種競賽突然出現,突然比賽,一切都是比創意,不像以往的比賽一比就是半年,然後每個團隊拿出來的作品都是實驗室做了大半年的東西,或者是十幾個人寫的東西,三四個代表出賽,總之,一切的一切都在很緊急的情況下進行...

Taiwan Beer Golden version
本以為至少可以開心喝酒與妹聊天然後和高手 social,沒想到只是藉酒精麻醉自己熬夜的痛苦

Hack Girl
這是中場串場的 hack girl

IDEA:
整個想法的雛形是由 Brian 發起,並由 Richard 和我一同討論出最後的模樣,實際上 Brian 的第一個 IDEA 報名隔天就被我和 Richard 給 reject 掉了XD,但隔沒兩天 Brian 就提出這個可行的創意還讓我們覺得滿不錯的,之後就是討論討論再討論,大概長什麼樣子,什麼東西要什麼東西不要,只能說 idea 源源不絕的一直冒出來。

競賽當週:
因為都在上班,所以平時都用 gmail 連絡,也是當週的星期一開始寫 code 的。我本來是養老精神,不熬夜不加班的人,那個星期不知道怎麼回事,每天都搞到天亮,平均睡不到三個小時 (後來我發現大部分的時間都是該死的 Yahoo API 害的!),星期六早上報到時要說完成度的話,大概就只完成 1/3 不到吧... 而且都是我隊友貢獻來的,哈哈。

競賽第一天:
IMG_6351
進入會場很巧的遇到隔壁桌的碩班學長 XD

基本上我遲到了,十點多才到,到位置換好衣服後,大概閒聊一下,認識一下剛見面的 Richard,接著就到大廳討論要做什麼與分工。
1. 大致上就是:
Brian: 美工、YUI、DB 兼監工
Richard: flex、YQL、YMap 兼技術溝通人員
Sapp: server 端、Flickr、OAuth、Y! MEME
2. 當天真的很神奇,報到前的完成度大概是:
Brian: 拉了兩頁 main page (其中一頁沒有 demo,東西太多被我們從120秒中捨棄了)、基本的 DB 弄好
Richard: flex 弄了個地圖出來,可以在地圖上 show 小圖片
Sapp: 自以為搞定 OAuth API
3. 大概11點左右討論完分工,就開始下去瘋狂的 coding,當天晚上12點前的完成度是這樣:
Brain: 和 Richard 合力把首頁幹了起來
Richard: 小照片點下去會出現大照片,和一些經過我們計算過的相片價值
Sapp: 提供最省時省力的 flickr query 給 Richard 和 Brian,自以為把 OAuth API 整合到我們的系統內

競賽第二天:
其實過12點我就算第二天了,為了睡飽飽加上省時間,我搭了計程車回家,回到家才發現不得了,登入登出的 OAuth 認證有問題,解到3點後,又把 Y! MEME 的 API 看了一下,想說明天也許用得到。
後來睡不到3個小時又爬起來趕到會場,這時大概早上9點:
Brian: 和 Richard 把相片交易的部分搞定
Richard: 把歷史記錄折線圖搞定
Sapp: 把昨天自以為弄好的 OAuth 搞定XD
大概簡短的討論一下分工與取捨,我們捨去一些不夠吸引眼光的部分,像是排名,相片搜尋,非地圖式顯示,以特有的 slide 方式呈現結果,追縱相片,Contact 整合(後來想想這個地方應該留著的XD)
然後開始最後衝刺,Demo 前:
All: 不斷修飾待會120秒間,Brian 要 Demo 的內容和流程
Brian: 解決不同瀏覽器的 CSS 問題
Richard: 提供 flex 與我這邊的溝通管道,並解決 layer 相互重疊等問題
Sapp: 把 Y! meme 整合進來

Our Presentation
IMG_6384
然後就是 Demo,當下只覺得這整個 IDEA 很有趣,回響也不錯,就整個覺的很有機會 (老實說,當我看到一整排的評審是教授時我臉都綠了,我一直以為來的都會是像 tempo 這種技術底子硬是了得的人)。等全部的 Demo 結束後沒多久我們就開始睡了,一整個累啊... 我當時覺得我的五臟六腑都在滾了說,等到頒獎開獎我還在考慮要不要上前拍照,後來就索性坐在舞台正中央下面,有人站上去就拍照,有人喊得獎隊伍就拍照。
IMG_6471
萬萬沒想到在 Connected TV Award 的時候喊到的隊伍號碼是 Twenty-Two XD,我是一整個錯愕啦,雖然當天曾有想過把那個 Connected TV 放進去,不過評估了一下還是沒有放,沒想到得了這個獎,評審說的也沒錯,的確不知道該把我們放在那個分類,既然這樣就放在評審特別獎、佳作或優勝啊XD。所以我在錯愕下上了台,相機也忘了拿給別人,因此我的相機沒有我們得獎的合照,哈哈
IMG_6534

總之,一整個過程是很有趣啦,因為我曾想過要不要去Y!,要是我曾是 Y! 員工的話,我想我就不能參賽了XD,那不就很可惜~"~ (之前玩 Android 就是看到那個條款,所以才用這個原因 reject 某H??),不過在這短短的一個星期內有撈到一個獎還不錯,只能說老外真的太強了,兩天真的是很拼,我們拼死拼活也花了一星期。

幹樵時間到!!!
OAuth API:
1. 最好是申請 API Key 的時候全部的欄位都要填,然後全部的欄位都會檢查
2. 最好是沒選任何一個 API 的時候,認證就不讓我過 (曾經,現在不確定)
3. 最好是特定 domain name 申請不了 API Key,還跟我說是 internal error
Y! meme API:
1. 都沒人教你們 API 放出來要把 GET implement 完嗎?
2. 最好是除了 query 之外的動作只有 jsonp 通
3. 最好是 Yahoo.inc 給我一個不完整的版本,怎麼沒提供 callback 選項
4. 最好是除了 new post 之外的所有 repost comment 都會給我 delay
5. 最好是討論最熱烈的是葡萄牙文,啊不就還好有 google translate
Flickr API:
1. 為什麼你們都沒有缺點讓我幹橋 (除了 md5 那個漏洞該補一補之外 XD)

最後談談我們可能獲獎原因:
1. Idea 沒重疊,好像也沒什麼人玩這個
2. 用了比較少人用的東西
a. OAuth API: 只有我們現場 Demo,不過我猜大部分的評審也看不懂這個 API 難搞的程度有多高啦
b. Y! meme: 英版服務上個月推出,API 也才前一個星期才釋放出來
c. flickr api: 因為我玩很兇,所以有在用,可能台灣沒什麼人玩,所以這次也沒啥人用吧
3. 版面漂亮乾淨

有人問我為什麼不用 wretch api? 我只能說沒開放出我們要的東西,如果他的 API 和 Flickr 一樣豐富,下次我們也許會用。

[+/-] 繼續閱讀...

2009年8月14日 星期五

八八水災振災行

臨時便道軌跡 (去程) 總長約0.48英里 約800公尺
臨時便道軌跡 (回程)
去程路線軌跡示意圖

振災行即時相片集
如果行動電話還打得通的話 我將陸續上傳我看到的一切
如果無法對外連絡
等我回來再上傳此行所看到的景像

登山上阿里山 會利用空閒時間上傳看到的一切 和目前所在地的坐標

我的 plurk 歡迎留言

8/17 阿里山樂野運送物資相片記錄 全部相片請按此
因為拍攝環境良好 相片轉檔直接上傳
記錄此行的點點滴滴

以下是我挑出幾張我覺得拍得還不錯的
IMG_3577
總共載了四台小貨車 + 四台箱型車的物資
IMG_3593
在山上的停車場集合並且分組 當我跟過去拍的時候 大家已經正要起身準備離開了
IMG_3604
沿路上拍的落石和泥濘 圖上的小屋似乎很早是廢屋了
IMG_3605
這個時候在會車
IMG_3611
此時海拔一千多公尺 已經有雲層的出現
IMG_3617
地層下陷的地方 都看得到地基了
IMG_3620
這就是傳說中斷掉的隧道
IMG_3651
隧道兩旁都是為打通路線而堆起的沙石
IMG_3623
遙遠的前方有一個人背了一個人高的物資
IMG_3627
隧道內部都是沙石
IMG_3628
隧道外圍的地沒有泥濘 反而比較好走
IMG_3631
一出隧道就啥路都沒了
IMG_3633
右方綠色那一塊再過去一點點就是我們的目的地 短短800公尺卻要花上半小時
IMG_3634
一路上高低起伏 幾乎沒有平一點的走道可走 又有可讓你整隻腳陷下去的泥沼 其實並不好走
IMG_3645
左上角是起點"隧道" 右下角是抵達的終點"樂野" 右下角剛好有一個人從山壁那邊走了下來
IMG_3653
終點"樂野" 運送物資的人力都是從這兒走下來的
IMG_3649
當地傾斜超過30度的電線桿
IMG_3654
在旁休息的人們
IMG_3657
小孩發現我在拍照XD
IMG_3658
當地很有型的機車
IMG_3659
愛心無國際 老外也來幫忙運送
IMG_3670
志工休息吃肉綜填個肚子 不過我胃不好 所以不吃糯米類的東西 自己帶了乾糧(可是也沒吃)
IMG_3672
滿是泥濘的雨鞋 借拍組員的 我的洗掉了 哈哈
IMG_3682
雨鞋洗乾淨上車才不會把別人的車弄髒 不過我沒帶布鞋出門
所以當時牧師接我們的時候 我有發現後座的地上有黃黃的乾土
還載我們載到快沒油 真是辛苦了
IMG_3684
準備回程 大家辛苦了
IMG_3686
同車的大愛記者們 記者也很辛苦 據說他們還要待幾天才回去 採訪真的很累
IMG_3695
怪手出現
IMG_3700
回家了 離開觸口
IMG_3705
這張是用慢速快門拍的 還好天色夠暗 不然拍不出來

[+/-] 繼續閱讀...

2009年6月9日 星期二

WWDC 2009: mbp + snow leopard + iphone

今年的 WWDC 2009 從凌晨1點看到現在剛好1個半小時
有些不少讓我驚奇的 不過還沒看到壓軸
不知道最後的爆點是什麼?
簡單記錄我有興趣的部分

Macbook pro 便宜又強大

snow leopard 穩又強 重點是超便宜!!
leopard 升級版只要 $29
整個把 Windows 7 打趴在地上

iPhone 3.0 除了之前報的那些東西外
又重提了P2P 但這次的 P2P 讓我有了一些想法
TOMTOM 上了 iPhone 還多了一個多功能車架
我只能說 Gxxxxx 不知道在想什麼大便
不知道講了幾十次了 就是那個死腦袋
接下來我就想看看那個 Certificate 是什麼東東了
如果能網路下單就無敵了...
台灣的手機都撿角了

結果我還是看完了....
最後也沒啥梗了.. iPhone 3Gs 長一樣 (有點賺到的感覺XD)
台灣 2009 8月上市
8G $99
16G $199
32G $299
不知道是綁啥約XD

[+/-] 繼續閱讀...

2009年5月29日 星期五

Svn + WebSvn + SSL + Trac on Leopard

參考文章:
svn + ssl + trac http://www.sonzea.com/articles/subversion-trac.html
python on svn http://trac.edgewall.org/wiki/TracOnOsxNoFink
Enable Apache + php http://foundationphp.com/tutorials/php_leopard.php
有群組權限設定的教學 http://october388.blogspot.com/2009/03/openssl-httpdsubversion.html

學生時代有實驗室的 server 可以用,工作後有公司的 server 可以用;除些之外, 自己寫寫 code 如果要控管的話,只有兩種方式:
1. 找免費的 svn server
2. 自己架

用 Mac mini 來架 server 不失為一個好方法,在 Leopard 已經內建 svn 1.4.4 和 Apache,要架一個 svn server 並非一件難事

Install subversion

首先準備一台有 Leopard 的 Mac 電腦,下載 svn 目前 Mac OS X binaries 最新版為1.6.2
我是下載 openCollabNet (Universal) 的版本
Includes:
* Complete Subversion 1.6 Installation
* Apache 2.2.x Subversion Modules
* Java, Perl, Python and Ruby Subversion Language Bindings
* Both repository access layers
* All repository data stores (Berkeley DB and FSFS)

打開 dmg 檔後執行 Subversion-1.6.2.pkg,點選"繼續"直到完成安裝,最後新版 svn 會安裝在 /opt/subversion 下,安裝完後可看一下 svn 版本是否正確,因為環境變數 PATH 此時並沒有包含/opt/subversion/bin,如果此時在 Terminal 執行 svn 會執行到 /usr/bin 下的舊版本 (1.4.4)。
1. 修改 ~/.bash_profile,在文件最後面加一行
export PATH=/opt/subversion/bin:$PATH

2. 重新登入後,檢查 svn 版本
$ svn --version
svn, version 1.6.2 (r37639)
compiled May 14 2009, 14:24:28

如果版本編號和新安裝的版本編號不同的話,可是會執用到舊版的 svn 喔。

Create a subversion repository

建立一個存放所有 svn repository 的目錄,/opt/subversion/repos 路徑隨便你建, 不要建到太奇怪的地方讓自己找不到就好了
$ cd /opt/subversion
$ mkdir repos
$ sudo svnadmin create /opt/subversion/repos/repoOne

下面的步驟是新增一個 tmp 目錄,連到 local 端的 svn server,checkout最新版本的 repoOne 專案下來,接著在 local 端建立三個子目錄 tags, branches, trunk,最後再將這三個子目錄 check-in 到本地端的 svn server上。

$ cd /opt/subversion/repos
$ mkdir tmp //建一個tmp目錄測試用
$ cd tmp
$ sudo svn co file:///opt/subversion/repos/repoOne //從指定的file路徑checkout抓最新版本的下來
$ cd repoOne //這個路徑是剛抓下來的專案根目錄
$ sudo svn mkdir tags branches trunk //隨便建了三個目錄
$ sudo svn ci -m "initial structure by sapp" // 把剛建好的三個目錄 check-in 到主機的 /opt/subversion/repos/repoOne

基本上做到這一步就大功告成了,你已經可以在你自己電腦的 local 端上使用 svn (但是我們的最終目的是架 svn server 讓多人同時使用)。

通常 svn server 也不會只建一個專案,以下指令建了另一個 sapprepo。

$ cd /opt/subversion
$ sudo svnadmin create /opt/subversion/repos/repoSapp
$ cd /opt/subversion/repos
$ mkdir tmpSapp
$ cd tmpSapp
$ sudo svn co file:///opt/subversion/repos/repoSapp
$ cd repoSapp
$ sudo svn mkdir tags branches trunk
$ sudo svn ci -m "initial sapprepo structure by sapp"

Enable Apache, PHP5, MySql

以往我都是使用 MAMP 架設我的 web server,一方面省麻煩,另一方面也不用設定一大堆東西,但是在 Leopard 中其實早就內建這些套件,只是沒有啟動而已,以下是兩者之間的版本差異。
MAMP 1.7:
# Apache 2.0.59
# PHP 5.2.5
# MySql 5.0.41

Leopard 10.5.7:
# Apache 2.2.6
# PHP 5.2.4
# MySql 5.0.45

今天我不使用 MAMP 的原因是因為它對 svn 的支援度不夠,必須要使用額外的模組,才能使 svn 正常運作 (其實也是我找那個模組找到累了)。

1. 啟動php,修改 /etc/apache2/httpd.conf 第 114 行
#LoadModule php5_module libexec/apache2/libphp5.so
ToLoadModule php5_module libexec/apache2/libphp5.so

2. 將 /etc/php.ini.default copy 一份放在 /etc/ 下,並重新命名為 php.ini
cd /etc
sudo cp php.ini.default php.ini

3. 修改 /etc/php.ini 第 305 行
error_reporting = E_ALL & ~E_NOTICE
Toerror_reporting = E_ALL

4. 打開 系統偏好設定 > 共享 > 將網頁共享選項打勾
網頁路徑預設為 DocumentRoot "/Library/WebServer/Documents"
若修改 listen port 80,SSL 認證時會得到以下Error
SSL 收到含超出最大允許字串長度的記錄。
(錯誤碼: ssl_error_rx_record_too_long)

5. 如果還需要 MySql 的話,再把MySql 啟動

Enable HTTP access

如果使用 MAMP,在這一個步驟會無法載入 mod_dav_svn.so 和 mod_authz_svn.so


1. 新增 httpd-subversion.conf 檔案,放在 /etc/apache2/extra
內文如下,前兩行是最新版 subversion 的 mod_dav_svn.so 和 mod_authz_svn.so 所在地,後半段設定子網域 repo 在主機上的實體路徑。
LoadModule dav_svn_module /opt/subversion/lib/svn-apache/mod_dav_svn.so
LoadModule authz_svn_module /opt/subversion/lib/svn-apache/mod_authz_svn.so

<location /repos>
DAV svn
SVNPath /opt/subversion/repos/repoOne
</location>

再將這兩行加到 httpd.conf 裡面,擺放的位置在 LoadModule ssl_module libexec/apache2/mod_ssl.so 之後即可。
# Subversion
Include /private/etc/apache2/extra/httpd-subversion.conf


ps: 如果要透過 http 來存取 svn 的話,svn repos 要 chown 為 _www。以本篇第一個新增的 repoOne 為例,需要將 /opt/subversion/repos/repoOne 的 owner 改為 _www,如此一來,Apache 才有權限去對這個目錄做修改。
sudo chown -R _www /opt/subversion/repos/repoOne

Enable SSL on your Web Server

因為 Leopard 預設為沒有把 SSL 打開,而 svn 的密碼是用明文的方式傳送,如果怕被人竊取密碼,可以自己產生憑證並打開 SSL 功能,使用 https 的方式登入。
以下步驟乍看之下有點煩鎖,實際上只需要照著指令一步一步執行。

1. 首先,產生自己的 key
$ openssl genrsa -des3 -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
.......................................................................................................................++
.............................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for ca.key: // 設定 ca.key 密碼
Verifying - Enter pass phrase for ca.key:

2. 產生對應的 CA
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Enter pass phrase for ca.key: // 輸入 ca.key 密碼
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sapp
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:SappLiu
Email Address []:your_mail@gmail.com

3. 產生 server key
$ openssl genrsa -des3 -out server.key 4096
Generating RSA private key, 4096 bit long modulus
.............................................................++
.................................................................................++
e is 65537 (0x10001)
Enter pass phrase for server.key: // 設定 server.key 密碼
Verifying - Enter pass phrase for server.key:

4. 產生對應的 CSR,這裡必須特別注意,Common Name 必須打上你的 domain name,總之,就是主機的網址,例如: localhost, sapp.com.tw。
$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: // 輸入 server.key 密碼
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SappServer
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:your-domain-name
Email Address []:your_mail@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:y
string is too short, it needs to be at least 4 bytes long
A challenge password []:sapp
An optional company name []:

5. Sign the CSR with the CA
$ openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
Signature ok
subject=/C=TW/ST=Taiwan/L=Taipei/O=Sapp/CN=SappServer/emailAddress=your_mail@gmail.com
Getting CA Private Key
Enter pass phrase for ca.key: // 輸入 ca.key 密碼

6. Make an insecure version of the key
$ openssl rsa -in server.key -out server.key.insecure
Enter pass phrase for server.key: // 輸入 server.key 密碼
writing RSA key
$ mv server.key server.key.secure
$ mv server.key.insecure server.key
$ sudo cp server.key /etc/apache2/server.key
Password:
$ sudo cp server.crt /etc/apache2/server.crt
$ cd /etc/apache2
$ sudo chmod 600 server.key
$ sudo chmod 600 server.crt

7. 最後再修改 /etc/apache2/httpd.conf
#Include /private/etc/apache2/extra/httpd-ssl.conf
ToInclude /private/etc/apache2/extra/httpd-ssl.conf

8. 重新啟動 Apache (系統偏好設定 > 共享 > 網頁共享)。

不過因為這種憑證發放方式不是花錢向 VeriSign 這種第三方,公正數位憑證發行者買的,所以別人進到你的網頁會出現以下錯誤。請他直接新增例外就可以了,反正我們的主要目的是為了 svn 的密碼不外洩。
該憑證未受信任,因為簽發者憑證未知。
(錯誤碼: sec_error_unknown_issuer)

Make the Subversion repository require SSL

接下來讓 svn 支援 SSL,修改 /etc/apache2/extra/httpd-subversion.conf
<Location /repos>
DAV svn
SVNPath /opt/subversion/repos/repoOne
</Location>
To<Location /repos>
DAV svn
SVNPath /opt/subversion/repos/repoOne

# Require SSL connection for password protection.
SSLRequireSSL
</Location>

重新啟動 Apache後,連到 http://your-domain-name/repos,你會得到
Forbidden
You don't have permission to access /repos on this server.

因為我們沒設定帳號密碼,所以無法存取是正常的,請照著以下步驟新增帳號密碼
1. Create the authentication file.
$ sudo htpasswd -cm /etc/apache2/subversion.auth sapp
Password:
New password: // 輸入新增帳號的密碼
Re-type new password:
Adding password for user sapp
$ cd /etc/apache2/
$ sudo chmod 600 subversion.auth
$ sudo chown _www /etc/apache2/subversion.auth

若要新增另一組帳號密碼,參數用 -m 即可 (-m 以 md5 加密),否則會洗掉先前建立的帳號 sapp
$ sudo htpasswd -m /etc/apache2/subversion.auth jack

產生帳號後,修改 /etc/apache2/extra/httpd-subversion.conf
<Location /repos>
DAV svn
SVNPath /opt/subversion/repos/repoOne

# Require SSL connection for password protection.
SSLRequireSSL
</Location>
To<Location /repos>
DAV svn
SVNPath /opt/subversion/repos/repoOne

# Require SSL connection for password protection.
SSLRequireSSL

# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /private/etc/apache2/subversion.auth

# only authenticated users may access the repository
Require valid-user
</Location>

重新啟動 Apache 後,連到 https://your-domain-name/repos,就會跳出登入視窗讓你輸入帳號密碼。

特別加碼,顯示多個 svn 專案

我們若是建立多個 svn 專案,希望在 https://localhost/repos 列表顯示所有 svn 專案,可以修改/etc/apache2/extra/httpd-subversion.conf
<Location /repos>
DAV svn
SVNParentPath /opt/subversion/repos
SVNListParentPath on


# Require SSL connection for password protection.
SSLRequireSSL

# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /private/etc/apache2/subversion.auth

# only authenticated users may access the repository
Require valid-user
</Location>


Install WebSvn

下載 WebSvn 解壓縮後,放到 /Library/WebServer/Documents,將 include/distconfig.php 改名為 config.php,並修改 config.php,告訴 WebSvn 以下事情。

1. 執行的 svn binary 檔案在何處
因為我裝的 subversion 1.6.2 和內建於 leopard 1.4.4 的 PATH 不一樣
$config->setSVNCommandPath('/opt/subversion/bin');

2. 新建立的專案實體路徑的父目錄
$config->parentPath("/opt/subversion/repos");
或者可以更改顯示名稱
$config->addRepository('顯示名稱', '/opt/subversion/repos/repoOne');

3. 設定其它範本
$config->setTemplatePath("$locwebsvnreal/templates/BlueGrey/");
//$config->setTemplatePath("$locwebsvnreal/templates/calm/");

4. 設定 Tabs 需要顯示寬度
$config->expandTabsBy(4);

5. 新增 httpd-websvn.conf 放在 /private/etc/apache2/extra,讓 websvn 支援 SSL
<location websvn="">
# Require SSL connection for password protection.
SSLRequireSSL

# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /private/etc/apache2/subversion.auth

# only authenticated users may access the repository
Require valid-user

</location>

6. 在 /etc/apache2/httpd.conf 載入 WebSvn設定
# WebSvn
Include /private/etc/apache2/extra/httpd-websvn.conf

Install TRAC
如果沒有 gcc 的話,必須先安裝 Xcode

因為 Leopard 很貼心的內建 Python 和 SQLite,所以安裝 TRAC 只需再下載兩個東西,clearsilver 和 TRAC 並安裝就可以了。
下載clearsilver-0.10.5.tar.gz,解壓縮後使用 Terminal 進到clearsilver 目錄下編譯,然後安裝 (其中 --build=i386 這個參數是 intel-based 的電腦才需要加的 G5 以前的不需要)
$ tar xzf clearsilver-0.10.5.tar.gz
$ cd clearsilver-0.10.5
$ ./configure --build=i386 --disable-ruby --with-python=/usr/bin/python
$ make
$ sudo make install

接著進到 python 目錄執行 setup.py
$ cd python
$ python setup.py install

下載 Trac-0.11.4.tar.gz
$ sudo python ./setup.py install

到此為止,Trac 已經安裝完畢,接下來就只剩下設定 Trac,就大功告成了。通常在一台 svn server 上不會只有一個 svn 專案,因此我也將介紹如果用 Trac 管理多個 svn 專案的設定。不過為了簡化複雜度,使接下來的文章有條有序,先介紹單一 svn 專案的設定方式,再介紹多個 svn 專案的設定。

1. 首先新增一個目錄用來放置所有 Trac 專案
$ sudo mkdir /usr/local/trac


2. 接下來使用 trac-admin 指令來產生 Trac 專案,以下是產生一個名為 "Hello Trac" 的 Trac 專案,其存放的路徑在 /usr/local/trac/FirstTrac。
$ sudo trac-admin /usr/local/trac/FirstTrac initenv
Project Name [My Project]> Hello Trac
Database connection string [sqlite:db/trac.db]> // 預設使用 sqlite,除非你要用MySql,否則直接不用改
Repository type [svn]> // 直接回傳,除非你不是用 svn
Path to repository [/path/to/repos]> /opt/subversion/repos/repoOne // 想要管理的 svn 專案目錄路徑 (之前建好的)

3. 修改 owner 為 _www
$ sudo chown -R _www /usr/local/trac/FirstTrac

3.1 通常這個時候可以啟動測試,不過因為有權限的問題,因為我們已經把 owner 改為 _www,如果下此指令的 User 不是 _www 的話,測試會出現沒有 read _and_ write permission 的 Error
$ tracd --port 8000 /usr/local/trac/FirstTrac

然後連到 http://localhost:8000/FirstTrac 做測試。

3.2 因為我已經更新了 svn 1.6.2, 而 python 預設支援的版本並沒有更新, 所以在這裡我們必須把以下兩個目錄
/opt/subversion/lib/svn-python/libsvn
/opt/subversion/lib/svn-python/svn
複製到
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python


4. 為 Apache 設定 FastCGI 來跑 TRAC
將早先下載的Trac-0.11.4.tar.gz 解壓縮後,把 Trac-0.11.4/cgi-bin/trac.fcgi 複製/Librarys/WebServer/CGI-Executables

新增一個檔案 httpd-fastcgi.conf 放在 /private/etc/apache2/extra,設定 FastCGI,內容為:
# Enable fastcgi for .fcgi files
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /private/var/run/fastcgi
</IfModule>

LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so

再新增一個檔案 httpd-trac.conf 放在 /private/etc/apache2/extra,設定 Trac,內容為:
ScriptAlias /trac /Library/WebServer/CGI-Executables/trac.fcgi
FastCgiConfig -initial-env TRAC_ENV=/usr/local/trac/FirstTrac

<Location /trac>
SetEnv TRAC_ENV /usr/local/trac/FirstTrac
SetEnv PYTHON_EGG_CACHE /tmp
</Location>

<Directory /Library/WebServer/CGI-Executables>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

其中 SetEnv PYTHON_EGG_CACHE /tmp 的設定是為了權限問題,預設位置在 /Library/WebServer,但是 Apache 在這個路徑並沒有 mkdir 的權限,因此更改 PYTHON_EGG_CACHE 的路徑到 /tmp 中。

最後再更改 /etc/apache2/httpd.conf 裡面的設定,載入剛新增的兩個設定檔。
# FastCGI
Include /private/etc/apache2/extra/httpd-fastcgi.conf

# TRAC
Include /private/etc/apache2/extra/httpd-trac.conf

5. 同樣的,如果還想為 Trac 加上 SSL,就必須再修改 /private/etc/apache2/extra/httpd-trac.conf
ScriptAlias /trac /Library/WebServer/CGI-Executables/trac.fcgi
FastCgiConfig -initial-env TRAC_ENV=/usr/local/trac/FirstTrac

<Location /trac>
SetEnv TRAC_ENV /usr/local/trac/FirstTrac
SetEnv PYTHON_EGG_CACHE /tmp
# Require SSL connection for password protection.
SSLRequireSSL

AuthType Basic
AuthName "TRAC Project"
AuthUserFile /private/etc/apache2/subversion.auth

Require valid-user
</Location>

<Directory /Library/WebServer/CGI-Executables>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

特別加碼,建立多個 Trac 專案管理多個 svn 專案

以下設定是已經建立一個 Trac 專案的前提下去做修改的,為了不贅述,只做重點說明。
$ sudo trac-admin /usr/local/trac/SecondTrac initenv
Project Name [My Project]> Sapp Trac
Database connection string [sqlite:db/trac.db]>
Repository type [svn]>
Path to repository [/path/to/repos]> /opt/subversion/repos/repoSapp // 另一個 svn 專案

修改 owner 為 _www
$ sudo chown -R _www /usr/local/trac/SecondTrac

設定 Trac
修改檔案 /private/etc/apache2/extra/httpd-trac.conf
ScriptAlias /trac /Library/WebServer/CGI-Executables/trac.fcgi
FastCgiConfig -initial-env TRAC_ENV_PARENT_DIR=/usr/local/trac

<Location /trac>
SetEnv TRAC_ENV_PARENT_DIR /usr/local/trac
SetEnv PYTHON_EGG_CACHE /tmp

# Require SSL connection for password protection.
SSLRequireSSL

AuthType Basic
AuthName "TRAC Project"
AuthUserFile /private/etc/apache2/subversion.auth

Require valid-user
</Location>

<Directory /Library/WebServer/CGI-Executables>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>


最後再重新啟動 Apache (系統偏好設定 > 共享 > 網頁共享),然後連到 https://localhost/trac 就會發現有兩個 Trac 專案可以選擇。Hello Trac 和 Sapp Trac。

小插曲

整個安裝完成後,我使用 Eclipse 去 checkout 檔案,發現每次都會出現 Error,還以為是我那邊的權限沒有開。後來才發現是我的 subclipse 沒有更新,更新到 1.6.x 之後就一切正常了。

[+/-] 繼續閱讀...

2009年5月18日 星期一

天使與魔鬼 (大雷)

星期六晚上去環球看這座強片
天使與魔鬼
同事跟我說 先看過這本書再去義大利的話 有些景點你會不想錯過
我們在2/14情人節當天飛往義大利
今天再回過頭來看這部電影
其實裡面有提到的教堂和景點
都是大景點 XD 其實也都幾乎去過了
哈哈
大不了下次有機會再去一趟義大利的時候 再補足罷了
話不多說 接下來的內容有雷 還沒看過劇情 又不想事先知道劇情的話
就等你看完電影再回來這兒吧

整個故事的主軸圍繞在梵諦岡(天主教)與光明會(科學)之間
片頭以歐洲粒子對撞中心以加速粒子對撞產生出來的反物質(造成宇宙大霹靂的物質)
揭開序幕
其中以羅馬各景點教堂雕像符號做為訊息 逐一解密
而談到羅馬 自然而然想到的第一個景點就是羅馬競技場了
可惜劇中沒有提及
IMG_4450 - Version 2

主角布蘭登教授為解教教宗呼聲最望的四位樞機主機
並找出足以造成五千萬噸炸藥威力的反物質
避免天主聖地梵諦岡被夷為平地
而開始解讀光明路徑的起點

梵諦岡是在義大利境內的一個小國 周圍以高牆圍住
這個地方是一般觀光旅客要參觀梵諦岡的入口
往往有一整排的遊客在門口排隊
IMG_5312 - Version 2

瑞士衛兵團為教宗的忠誠護衛
誰也不相信 是天主教的狂熱份子
IMG_5725 - Version 2

聖彼得大教堂 整個故事許多場景都在此地發生
教宗即位也是登上此大教堂接受眾人的膽仰
IMG_5710 - Version 2

此教堂之大可由這張相片右下角的遊客與整體的比例看出它的震撼力
IMG_5683 - Version 2

中間黑色的主祭壇下方就是總司庫最後自焚的地方
IMG_5667 - Version 2

聖彼得廣場為信眾聚集的地點
當教宗過逝時 全球的信眾都聚集在這裡
等著閉門會議的結果
而各地的媒體也都在關心著誰會是下一任教宗
IMG_5630 - Version 2

當四位樞機主教被擄走時
大選舉官仍然選擇繼續舉行閉門會議
西斯汀禮拜堂就是眾主教們開會的地方
IMG_5574 - Version 2

為避免四位樞機主教送上土、氣、火、水四種屬性的祭壇而遭殺害
此時的布蘭登教授已經開始著手解密
解讀出光明路徑的起點就是拉斐爾之墓的所在地
於是前往萬神殿 其所代表的是土
萬神殿的入口是神殿式的圓柱
IMG_5193 - Version 2

大門無時無刻擠滿著觀光客
即使日落天黑仍然不減人潮
劇中的人潮比我們三月去的時候還多很多
可能是旺季的關係吧
IMG_5195 - Version 2

上方的圓洞就是布蘭登誤會為惡魔眼的洞
所以才會錯失良機
IMG_5209 - Version 2

後來布蘭登發現真正的起點是人民聖母教堂裡的基吉小教堂 土的聖堂
趕過去已經來不及了 第一位樞機主機已經陣亡 以土塞住呼吸道悶死

這是人民聖母教堂的大門口 原本就有安排這個景點的
只是無奈沒算好中午休息時間
而先跑去對面的雙胞胎教堂 真是可惜
IMG_4769 - Version 2

這兩個教堂就是雙胞胎教堂
右邊是奇蹟聖母教堂 左邊則是聖山聖母教堂
兩個教堂幾乎一模一樣 因此稱之雙胞胎教堂
IMG_4807 - Version 2

布蘭登教授根據雕像的指引
推論出代表氣的聖堂指向聖彼得大教堂
但教堂上無數的雕像都是聖人 並沒有天使
IMG_5636 - Version 2

布蘭登在看手錶的同時 發現地上的浮雕也是一種雕像
最後在聖彼得廣場找到代表氣的聖堂的西風浮雕
圖中埃及紀念碑的地方就是第二位樞機主教陣亡的地方
肺穿刺而亡
IMG_5631 - Version 2
IMG_5734 - Version 2


代表焚身的聖特蕾莎所在的勝利聖母教堂即是火之聖堂
雖然主角們已提前趕到 但殺手在此大開殺戒
最後第三位樞機主機仍然被火焚身而亡

此為天使聖母教堂 位於勝利聖母教堂旁
不知道為什麼我就這樣錯過了勝利聖母教堂
明明那個焚身的聖特蕾莎雕像是我既定的行程啊..
IMG_4599 - Version 2

最後一位樞機主教欲被謀殺的地點為拿佛利廣場上的海神噴泉
因為當時行程安排沒排好 若再去海神噴泉的話 就會很晚回旅館
所以此景點也忍痛從我們的行程中刪除

最後布蘭登教授憑著第四位樞機主教給的訊息
遁著光明路徑來到聖天使堡
聖天使堡自古以來就是一個做為戰時防禦的保壘
IMG_5740 - Version 2

從它的外型可以看得出來 高聳的城牆 與厚實的壁壘
加上聖天使堡與梵諦岡間的密道
這也難怪他會成為作者心目中的光明會聚集地
IMG_5844 - Version 2
IMG_5850 - Version 2

只是我很好奇廂形車是怎麼開進去的
記得當初我們進去的入口都不大 好像也沒很大條的路可供行走的樣子
IMG_5746 - Version 2

拜義大利蜜月之旅所賜
在看這部影片時 特別有感覺
每個環節都和當初的景象環環相扣
據說在拍此片的時候 因為對天主教的不友善
因此梵諦岡並不是那麼願意提供場地拍攝
所以不少場景都是在棚內架設而成
真的是很厲害

[+/-] 繼續閱讀...