syshen's blog

關於部落格
我不想限定我的 blog 方向,但是在這裡的都是我最認真的紀錄。
  • 63849

    累積人氣

  • 2

    今日人氣

    0

    訂閱人氣

網頁自動化測試

要作網頁的 Unit test 有幾個工具可以用,例如 Ruby on Rails 本身就有提供 Unit test framework 了,而 PHP 也有幾套可以用,例如 PHPUnit、SimpleTest 以及 Spike PHPCoverage 測 code coverage,除了 RoR 我有用過外,PHP 的那些工具我都沒用過,不過這並不是我這篇想講的重點,我這裡主要是想介紹一個最近在玩的玩具,Web Service 的自動測試工具 - <a href="http://wtr.rubyforge.org/" target=_>Watir</a>。

Watir 全名是 Web Application Testing in Ruby ,沒錯!你看到 Ruby 了,他就是用 Ruby 開發的測試架構。Watir 有什麼好處呢?第一,他是用 Ruby 開發,寫 Test Case 也是用 Ruby,感覺就親切許多,第二,他是直接 launch IE,並透過操控 IE 來測試你的 Web Application,所以可以測出一些可能在瀏覽器上才會遇到的問題,第三,寫好 Test Case 後,一切都可以自動化執行,第四,不管你的 Web Application 是用什麼語言寫的,Watir 都可以支援,因為他是啟動 IE 來瀏覽。不過它也有些缺點,第一,目前只支援 Windows 平台,第二,目前只支援 IE 瀏覽器,第三,因為是靠 IE 操作,所以測試時間會較其他測試方法長,不過總是比人工測快許多。
繼續閱讀

++LC-A+++++++++++++++++++++++++++++++

<img src="http://www.lomographyasia.com/pictures/11931/642269.jpg" width="200" align="left"> LOMO 老母雞 LCA 重出江湖,這次由俄+中國製造,純手工製作,增加了幾個新功能:<ul>
<li>多重曝光按鈕讓大家可以不受限制,在同一格底片上多重曝光。</li>
<li>膠卷感光範圍擴大,兼容ISO 800及ISO 1600度膠卷。</li>
<li>機背增設膠卷顯示窗,令大家在拍攝的過程中仍然知道膠卷資料。</li>
<li>附設標準快門繩插孔,方便長時間曝光拍攝。</li>
<li>鏡頭前方兩旁附設配件插軌。</li>
</ul><br />
<a href="http://shop.lomography.com/lca+/index.html" target=_>官方網站</a>
第一批限量 30 台,不過價格不便宜,要價台幣 8750,剛剛也在<a href="http://goods.ruten.com.tw/item/show?10061001737310" target=_>露天拍賣</a>發現它的蹤跡,飛到台灣價格自動飆漲到 1 萬台幣了 :p ,嚇死倫的貴。
<br clear=all>
<br />
不過看到這則新聞,讓我想起經常被我冰凍在防潮箱中的 LCA 初代機,應該多善待它的,多拿出來拍。<br />

繼續閱讀

Sony GPS-CS1 使用感

Nikon 的高階 DSLR 在很早就引入了 GPS 的支援,在它的中高級機種上,可以外接 GPS 器,在拍攝照片的同時,相機便會把所處的全球座標位置同步紀錄在照片當中,這項功能在以前對專業攝影師相當有幫助,例如一些專業的生態攝影師或者風景攝影家,可以靠這些座標資訊整理照片,也可以在多年後仍能夠回到原地拍照。不過很可惜的是,Nikon 在後續的機種中並沒有繼續加強這個功能,功能仍是在,但是存在著很多不便,像是他只支援 RS232 接頭的 GPS 裝置,目前這種裝置比較難找到,有也比較貴,此外還要另外接一條 Nikon MC-35 訊號線,這訊號線除了不便宜外,在台灣也不太容易買到,所以網路上可以找到不少文章都是在討論如何改裝,透過藍牙或是改線來讓 GPS 接收器接上相機,或者如何透過熱靴從相機偷電,不過對於怕麻煩的我來說,想到要改裝一堆東西就頭大。有時候我會很納悶,Nikon 的相機都支援 Wireless 了,怎麼會沒想到用藍牙去支援 GPS 呢?畢竟現在多數的 GPS Mouse 都是藍牙訊號。<br />
<br />
<a href="http://www.mobile01.com/topicdetail.php?f=164&t=171134&last=1300749" target=_>Nikon MC-35 "借電"學與自製 RS-232 GPS 連接線</a><br />
<a href="http://www.mobile01.com/newsdetail.php?id=2809" target=_>Nikon D200 與 GARMIN 60CSx 異國聯姻</a><br />
<br />
<img src="http://static.flickr.com/103/282007253_3180e25471_o.jpg" align="left"> 或許 Nikon 沒注意到一般使用者對於 GPS 與相機的結合也會有興趣,不過 Sony 注意到了。Sony 用另外一種方式來結合 GPS 以及數位相機,不再透過硬體與硬體的結合,而是由軟體來整合。前不久 Sony 就推出了 GPS-CS1 這個產品,他標榜的就是在拍攝照片的同時,利用 CS1 記錄當時的位置,等到回家後,再透過軟體從 CS1 中下載座標位置,並由該軟體自動比對數位照片的時間與座標位置記錄時的時間,便可以知道該照片拍攝時的位置了,不再需要透過一堆線將兩台機器結合在一起,而且適用於大部分的數位相機,即使是非 Cybershot 的相機也可以使用,例如我現在就是用我的 Nikon D200 跟他搭配。<br />
<br clear=all/>
我是剛好在禮拜五下班前收到包裹,正好趁著週末假日出去玩時試用,真感謝郵差先生及時送達。底下是我禮拜六去「<a href="http://www.juming.org.tw/" target=_>朱銘美術館</a>」參觀遊玩時一路上的紀錄,GPS-CS1 所記錄下來的 log 檔可以直接上傳到 <a href="http://www.gpsvisualizer.com/index.html" target=_>GPS Visualizer</a> 網站,由該網站幫妳描繪在 Google Maps 上,相當方便,<a href="http://gais4.cs.ccu.edu.tw/~sys89/gmaps/20061028.html" target=_>第一張圖是路線圖</a>,我從台北景美出發,沿著二高到基隆金山,再到朱銘美術館。<br />
<br />
繼續閱讀

My flickr viewer

國內的 Album Service Provider 如 wretch 或者 xuite 等,大部分長的都很像,就像是 gallery 系統一樣,中間一張小圖,下面一串縮圖,這樣的設計沒什麼不妥,看的人進到這個 Album,多數不會只看一張圖就走,通常會順著底下縮圖一張一張的點下去,所以在底下放上前後張縮圖操作起來也順暢。不過我常常納悶,為什麼是放下面?螢幕多半是長方形,左右較寬,放在旁邊不是可以讓畫面有比較好的效果嗎?而且每次點下一張時,就必須要等待頁面重載,圖檔慢慢顯示,這很煩人,當妳在看這張圖檔時,我相信有相當大的機率會點下一張,為什麼不先偷偷下載,讓瀏覽器去暫存,等到妳看下一張時圖片會立刻出現,這樣不是順暢許多,只不過缺點是頻寬的浪費,不過我順暢的瀏覽與頻寬的利用應該是可以取得一個平衡點。

因為這樣我嘗試照著我的想法去做個 prototype 出來,利用一些 AJAX 的技巧,以及搭配一些 Javascript library 跟 Flickr API 去做出這個 <a href="http://gais4.cs.ccu.edu.tw/~sys89/gallery" target=_>gallery prototype</a> 來。

<a href="http://www.flickr.com/photos/syshen/279086656/" title="Photo Sharing"><img src="http://static.flickr.com/84/279086656_57553d6792.jpg" width="500" height="326" alt="second" border="0" /></a>

我把 photostream 擺在右手邊,圖檔縮圖透過 phpFlickr 去抓出來,當妳往下拉動 scrollbar 時會動態去抓更多圖檔出來。如果妳點了其中一張圖,就會顯示在左邊的畫面中。而且在載入縮圖的同時,大圖的圖檔也預先載入到瀏覽器的快取中,所以當妳點選時,有很大的機會圖片會很快的顯示出來。

這個 prototype 還有很多缺點,不過最近心灰意冷,所以不想改了,大家隨意看看吧。
繼續閱讀

壹零壹

山上餵蚊子的傍晚..
繼續閱讀

innerHTML 與 createElement 的差異

查了一下網路上有關於 innerHTML 與 createElement() performance 的比較,都是顯示 innerHTML 有較好的 performance ,這跟我以前的印象有蠻大的差距,我一直都以為 innerHTML 會較差,直接 createElement() 以及 appendChild() 會有比較好的 performance,不過既然測試出來的數據都是這樣,看來也應該如此。

innerHTML 的優點是容易實做,程式碼容易維護,再加上 performance 較好,那麼我真的不知道使用 createElement() 跟 appendChild() 的理由為何了。

感謝 midoli 糾正我上一篇文章,我一時不查,以原本的想法觀念,寫了一篇錯誤的文章出來,看來作學問還是要秉持著嚴謹的態度。
繼續閱讀

[AJAX Pattern] Amazon A9 Search

<div style=""> 上次在 Amazon 的 A9 Search 看到一個很有趣的 AJAX 應用,看了就很想自己實作看看,實際上也不困難,如果瞭解 AJAX 的原理,Javascript event 處理等就能寫出來了,所以在這裡介紹給大家看看。<br/> <br/> <font size="3" style="FONT-WEIGHT:bold">[Amazon A9 Search]</font><br/> 傳統的搜尋引擎如 Google 或 Yahoo 等,在將搜尋結果丟出來後,會以分頁來顯示這些結果,使用者想要找的結果如果不是在第一頁的話,就會一頁接著一頁向後找尋。這種作法也沒什麼不對,很直覺,但是我看了 A9 的用法後,我反而覺得 A9 的作法更為實際,更加直覺。A9 怎麼操作的? Scrollbar !<br/> <br/> <a href="http://www.flickr.com/photos/syshen/271224359/" title="Photo Sharing"><img alt="ss" border="0" height="326" src="http://static.flickr.com/65/271224359_337e698b10.jpg" width="500" /></a><br/> A9 會先丟出前幾筆的結果於網頁上,例如排名前 20 筆,但是當妳使用 Scrollbar 往下拉動時,更多資料就會源源不絕的顯示出來,同時妳也會發現左邊的 Scrollbar 越來越小,代表資料量越來越多。用寫的來描述這行為實在很難,妳可以上 <a href="http://www.a9.com" title="http://www.a9.com">http://www.a9.com</a> ,透過實際操作便可瞭解。為什麼說他更直覺呢?因為如果第一次沒看到你想要的資料時,同時妳又看到 scrollbar 在旁邊,直覺上的操作就是會去拉動 scrollbar ,如同妳在 google 的搜尋結果中,也會拉動瀏覽器視窗的 scrollbar 來看底下的資料,如果沒有再點下一頁,所以既然都在拉動 scrollbar 了,何不在同時也去抓新的資料,所以我說他的操作方式更加直覺。<br/> <br/> <font size="3" style="FONT-WEIGHT:bold">[怎麼做?]</font><br/> <br/> 假設我們想讓內容顯示在一 DIV 區塊中,藉由使用者拖拉 scrollbar 來動態增加顯示內容的話:<br/> <br/> <span style="FONT-WEIGHT:bold">第一步、</span>於 DIV 區塊上顯示 scrollbar<br/> 這很簡單,只需要透過簡單的 style 屬性設定即可,前提就是妳必須先設定 DIV 區塊高度,並設定屬性 overflow:auto ,例如:<br/> <blockquote>&lt;div id="content" style="width:490px;height:490px; overflow: auto"&gt;<br/> ....&nbsp; 妳想要顯示的內容。<br/> &lt;/div&gt;<br/> </blockquote>當妳於 DIV 區塊中的內容超過 DIV 高度時,瀏覽器便會於右邊出現 scrollbar。<br/> <br/> <span style="FONT-WEIGHT:bold">第二步、</span>攔截使用者 scrolling 動作<br/> 檢而言之,攔截該 DIV 區塊的 onscroll 事件,例如:<br/> <blockquote>// 注意:以下程式碼使用 prototype.js 語法<br/> $('content').onscroll = checkScroll;<br/> </blockquote>checkScoll 函式便是我們想要處理 scrolling event 的函式。<br/> <br/> <span style="FONT-WEIGHT:bold">第三步、</span>呼叫 AJAX,向伺服器要新資料,例如:<br/> <blockquote>// 注意:以下程式碼使用 prototype.js 物件<br/> var opts = new Object;<br/> opts.parameters = 'page=' + page_num;<br/> opts.onComplete = showResponse;<br/> var ajax = new Ajax.Request (url, opts);<br/> page_num ++;<br/> </blockquote><br/> <span style="FONT-WEIGHT:bold">第四步、</span>取得 AJAX 回傳結果,也就是上述程式碼中的 showResponse 函式:<br/> <blockquote>function showResponse(origReq) {<br/> &nbsp;&nbsp;&nbsp; $('content').innerHTML += origReq.responseText;<br/> }<br/> </blockquote>看,這樣就完成了!超簡單!所以來 re-factoring 一下。<br/> <br/> <font size="3" style="FONT-WEIGHT:bold">[Refactoring]</font><br/> 我們將這樣的概念稍微把他物件化,讓它可以重複被使用,而且增加一些保護措施。<br/> <blockquote>function showResponse(origReq) {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nav = $(this.nav.contentID);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var last = nav.lastChild;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (last.nodeName != 'DIV') {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last = last.previousSibling;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nav.removeChild (last);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nav.innerHTML += origReq.responseText;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nav.innerHTML += '&lt;div style="background: #AAAAAA;"&gt;Fetching ... &lt;/div&gt;';<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fetching = false;<br/> }<br/> <br/> function ScrollNav(contentID, url) {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.contentID = contentID;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.contentObj = $(contentID);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.contentObj.nav = this;&nbsp; // 記錄目前物件,給 checkScroll 函式使用<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fetching = false;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.scrollTop = this.contentObj.scrollTop; // 記錄一開始 scrollTop<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.scrollHeight = this.contentObj.scrollHeight; // 記錄一開始 scrollHeight<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.url = url;<br/> <br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.idx = 0; // page number<br/> <br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.checkScroll = function() {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this.nav.scrollTop == this.scrollTop)<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.fetching)<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br/> <br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.nav.scrollTop = this.scrollTop;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.scrollHeight == parseInt(this.style.height) + this.scrollTop) {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var opts = new Object;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opts.parameters = 'page=' + this.nav.idx;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opts.onComplete = showResponse.bind(this);<br/> <br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ajax = new Ajax.Request(this.nav.url, opts);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fetching = true;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.nav.idx ++;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/> <br/> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 攔截 onscroll event<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.contentObj.onscroll = this.checkScroll;<br/> }<br/> <br/> function init() {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nav = new ScrollNav('content', 'scroll_test.php');<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nav = new ScrollNav('content2', 'scroll_test2.php');<br/> }<br/> </blockquote><br/> 這裡頭有個 ScrollNav 物件,就是將這些東西都包進去了,此外,於 checkScroll 函式中會檢查 event 是否被重複攔截,以及檢查目前 scrollbar 是否被拉動至最下方,唯有 scrollbar 被拉到最下面時,我們才向伺服器要求更多的資料,避免頻寬資源的浪費。scrollTop 跟 scrollHeight 都是內建的屬性,scrollTop 代表目前顯示的 view 距離最上方多少有 pixel,而 scrollHeight 則代表內容 view 的總長,同樣是 pixel,當妳資料越塞越多時,scrollTop 跟 scrollHeight 都會跟著增加,如果要判斷 scrollbar 是否為拉到最下方,最簡單的方法便是計算 scrollTop 和 DIV 區塊的高度總長是否等於 scrollHeight 即可。<br/> <br/> 至於在 showResponse() 函式中,我們會在每次抓到的新資料中都塞進個「Fetching ...」的字眼,代表目前正在抓取更多資料,這是一種小技巧,就像在大部分的 AJAX Pattern 中都可以看到的 Loading 字眼,妳也可以用個 gif 動畫來取代,只不過每次取得新資料時,必須將上一個「Fetching ...」移除。<br/> <br/> 想看結果嗎?請看 <a href="http://gais4.cs.ccu.edu.tw/%7Esys89/scroll.html" title="Demo">Demo</a> 。裡頭有兩個 DIV 區塊,左邊的 DIV 區塊所 request 的 PHP 檔執行較快,而右邊的每次都會 sleep 5 秒鐘,所以感覺起來比較慢,拉動兩個 scrollbar 妳便可以發覺兩者間的不同。<br/> <br/> <font size="3"><span style="FONT-WEIGHT:bold">[其他問題?]</span></font><br/> 目前這個範例還有些存在性的問題:<br/> <ol> <li> 別吃光 browser 的記憶體了。塞資料時要設立停止點,別一直狂塞,吃光妳瀏覽器的記憶體了。</li> <li> 不一定要拉動到最下方才開始抓取資料,可以在使用者的 scrollbar 接近最下方時,便向伺服器要求新資料,可以達到更順暢的操作。<br/></li> </ol> <br/> <br/> <font size="3"><span style="FONT-WEIGHT:bold">[這可以應用在哪?]</span></font>< br/> 我想這些概念,實作都是很簡單,重要的是妳有沒有創意,有沒有想到這些 idea,以及怎麼應用在妳的網頁中,這我想應該讓妳自己去想想看,不過我覺得可以應用在某些功能上,例如 blog 留言版,留言版並不是每個人都想看,如果留言眾多時,每次都將留言塞到使用者的瀏覽器上也不甚合理,如果透過類似的方法,先讓使用者看到最新的留言,如果想繼續看下去,只需要拉動 scrollbar 即可。應該還可以想出更多有趣的應用,不過還是大家自己想想看吧。<br/> <br/> <br/> <br/> <br/> </div>
繼續閱讀
" meta-author="syshen"> 分享至facebook

隧道內還是盡量不要變換車道

Mobile01 討論串看來的,危險多多,還是不要在隧道內換車道的好。

<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/2Qy2cQ3u3oA"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/2Qy2cQ3u3oA" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>

影片內容是俄羅斯莫斯科 Lefortovo 隧道內的安全攝影機所拍攝的。
繼續閱讀

Jay-Z

最近來台灣開演唱會的 Jay-Z 資料。

節錄部分:<blockquote>
Jay-Z, 他或許是美國饒舌音樂圈裡, 最具影響力的饒舌歌手之一, 除了一些商業面賦予
的附加價值, 包括五度奪得葛萊美獎…估計超過三億美金的身價…專輯張張白金唱片的數
字銷售量…榮登2006年時代雜誌一百位全球最具影響力的人之一…經營唱片公司, 旗下歌
手各個打進告示排行榜…橫跨體育事業(最有名的就是他也是NBA紐澤西籃網隊的股東)…
目不暇給的連續印象衝擊下, Jay-Z達成了許多不可思議的成就。

原名Shawn Corey Carter的Jay-Z, 生於1969年的12月4日, 成長於紐約布魯克林區惡名昭
彰的Marcy Houses貧民窟, 12歲時父母離異, 小Carter便由母親撫養長大, 在Jay-Z以自
己生日為名的歌曲December 4th有也提到, 母親Gloria Carter甚至也參與歌曲中的一段
唸白…總喜歡晚餐時在餐桌上敲敲打打胡亂製造節奏的小Carter, 被母親發現他對音樂的
天份, 因而買了一台錄音機送給小Carter, 開啟了他的音樂之路…但是另一方面, Jay-Z
的學生之路倒是很不順遂, 據說是為了討生活而在街頭販毒遭到逮捕, 導致Jay-Z高中沒
畢業就被退學了, 這一段黑暗的遭遇也成為Jay-Z刻劃冷血街頭的記憶來源之一。

從一台小小的boombox到慢慢練習即興饒舌, 壓韻技巧, 小Carter慢慢在鄰里之間有了自
己的綽號『Jazzy』(Jay-Z的前身), 他的饒舌事業一直到他參與一場即興饒舌擂台比賽才
突飛猛進, 當時與他對擂的對手是一個叫Zai的, Jay-Z很快的痛宰了Zai, 贏得滿堂采,
也贏得了許多唱片公司的青睞, 獲得跟一些饒舌歌手合作的機會(包括已故哈林區地下傳
奇Big L)。
</blockquote>

資料來源 ptt hip-hop 版,全文: <a href="http://www.ptt.cc/bbs/Hip-Hop/M.1159807868.A.4DF.html" target=_>[歌手]:Jay-Z
</a>

LP 與 Jay-Z 於 Collision Course 的合作:
繼續閱讀

我哥的小豆子

我哥的小 baby 出生, 10/3 天秤座,提早出生,體重也比一般嬰兒輕了許多,只有 2500 公克,所以也在醫院住了特別久,連中秋都是在醫院裡度過。上週四回家前順道到新竹探望了這個小姪子,那時候都還不能抱,只能透過玻璃觀看,好像在動物園的可愛動物館一樣,不過看到小小的新生命,又是跟自己有關係的親人,感覺畢竟是不同。

看看小豆子的照片吧:
繼續閱讀
網誌分類篩選
收起分類
分類篩選
相簿設定
標籤設定
相簿狀態