星期四, 3月 18, 2010

轉換

先提一下,我偷用了 Josh Ko 的 blog subtitle,將這個 blog subtitle 改成 Let's see how far we can go. 我自己也想看看,到底我們能走多遠,我們的其他人是誰呢 ? 其實對我而言也不是這樣重要,人總是會來來往往,在當下的時間與到朋友,或許那就是我們。也是會有持續走下去的朋友,所以我並不擔心。

或許,現在的我還在不斷的轉換吧。人生就是不斷的 Disco Disco Disco XD。

最近一直很閒,也是最忙的時候,因為忙著做想做的事,忙著做研究(我應該是這個字都提不上的人 XD),忙著超越自己,我的人生中很少以別人做目標,就跟我跟 Josh Ko 第一次聊天說的一樣,我沒有把任何人當偶像過,我唯一能做的是不斷的超越自己。或許也是因為這樣子想法,造成我現在的自大與無知吧(笑)

最近無論看什麼書都覺得自己有很長的路要走,老實說,我不怎麼害怕,但是的確有想自己要怎麼走下去,因為現在的我是不怎麼滿意的,雖然每天都會做到事,但是效率太低了。

其實我一點都不懂研究是什麼,想法跟以前一樣,大抵是提出一個創新的想法,或加以改善前人的做法。這樣子講是很空洞的,所以最近不斷的寫(紙筆或這個 blog) 用來學習一件事,藉以探索如何創造想法,不過似乎到目前為止都是失敗的,但是不急,我會持續到有結果再來看下一步吧。


---
似乎跟轉換沒什麼關係 XD。

星期一, 3月 15, 2010

雜想

昨天很晚睡今天卻很早就醒了,看來以後還是少喝飲料店的茶好了,睡不到六個小時的感覺其實不是很好 XD。醒來之後看了看自己的桌上,只有鉛筆,紙,書本,水杯,也很難得桌上只剩這些簡潔的東西了...

這個學期表面上要做的事大幅度的減少了,實際上要做的事卻比以前更多了。所以是時候得跟開學第一個禮拜一樣,過著比較規律的生活。

睡覺前還在想,直到現在還是無法忘記第一次看到 Introduction to Functional Programming using Haskell 的 Chapter 3,只靠著 data Nat = Zero | Succ Nat 再加以其他設定即可描述整個 Natural Number System (Josh 說公設系統都是如此XD),這樣子的簡單可以建構出複雜,真的是一件很感動的事 ! 而 Haskell 對於 List 的操作,Python 幾乎可以依樣畫葫蘆XD,但是對於 data type 的 recursive define,從 Real World Haskell 來說,用 OO 的 Polymorphism 來解也不會這麼簡潔漂亮,Haskell 對於 List 的操作固然是一絕,但是我覺得重點是 data type 還有 function 的操作,我想,我的學習只是剛開始而己。為什麼我要寫 Haskell ,因為這是一個讓我覺得寫作起來最為自由,思考可以很直覺的在操作上的語言。當然有不少的好處與不少的限制,限制之所以成為限制是因為人們不喜歡這個條件,好處則反之,對我而言,就是一堆條件吧 XD。

其實有想過給系上學弟妹做一個演講,談談我對程式設計與電腦的想法,不過大概沒什麼機會也不會有人理我,所以大概是自己在 blog 上寫一篇就收工了 XDXDXD,然後在寫這篇之前,會先寫 Perfume XD


---
其實我也分不出雜想與最近有什麼差別 XD。

星期五, 3月 12, 2010

Haskell Practice - Ugly Numbers

題目就在這,我就不再多做說明了,這題寫完,暫時要停下來,把 scm 老師的信消化,然後鳥書繼續前進 XD。

is_un n
    | n == 1 = True
    | n `mod` 2 == 0 = is_un (truncate (fromIntegral n/fromIntegral 2))
    | n `mod` 3 == 0 = is_un (truncate (fromIntegral n/fromIntegral 3))
    | n `mod` 5 == 0 = is_un (truncate (fromIntegral n/fromIntegral 5))
    | otherwise = False


is_un2 n
    | n == 1 = True
    | n `mod` 2 == 0 = is_un2 (until (\x -> x `mod` 2 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 2)) n) 
    | n `mod` 3 == 0 = is_un2 (until (\x -> x `mod` 3 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 3)) n)
    | n `mod` 5 == 0 = is_un2 (until (\x -> x `mod` 5 /= 0) (\x -> truncate (fromIntegral x/ fromIntegral 5)) n)
    | otherwise = False

is_un3 n = foldl judge n [2,3,5] == 1
    where judge n y = until (\x -> x `mod` y /= 0) (\x -> truncate (fromIntegral x/ fromIntegral y)) n

un_list :: [Integer] -> Integer -> [Integer]
un_list (x:xs) n 
    | n == 0 = (x:xs)
    | otherwise = un_list (min:x:xs) (n-1) 
    where min = minimum (filter (>x) [u*v | u<-(x:xs), v<-[2, 3, 5]])

傳說中這題是一行就可以寫完的,但是我不知道怎麼寫,我還是一樣照我的想法寫 XD,剛開始的想法非常簡單,一直除 2, 3, 5,最後的結果不等於 1 就不是,這方法當然很慢,不過練習還是有用的,因為從 is_un 至 is_un3 可以讓我練一下 foldl ,也讓我明確的了解到 foldl 和 foldr 的根本性不同 (沒錯,我之前又完全搞錯了,剩下只有 fold fusion 要搞懂了)

最後一個 un_list 的想法則是比較正面,找到前面 list 乘於 2, 3, 5 然後大於 list 最大的數的數列最小值,這速度顯然快很多 XD。在這樣子的狀況下寫成 tail recursive 比較直覺,但是其實將整個數列反過來算也是 ok 的,所以我就索性反過來算了。測試結果如下 ...

*Main> reverse (un_list [5, 4, 3, 2, 1] 1495)
[1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,64,72,75,80,81,90,96,100,108,120,125,128,135,144,150,160,162,180,192,200,216,225,240,243,250,256,270,288, ...

同場加映 Python 版,不過真的只能說 Haskell 影響 Python 很深,在 list 操作部分很像,但是沒有 Haskell 來的漂亮 XD

def ugly_number(list_size):
    ug_list = [1]
    for i in range(0, list_size-1):
        ug_list.append(min(filter(lambda x: x>ug_list[len(ug_list)-1], [x*y for x in ug_list for y in [2,3,5]])))
    return ug_list

---
該繼續打底了 ... XD


2010/03/15 05:58 pm 今天晚上可能無法再做練習了,可能要先看一下 paper ,不過初步的破爛想法是

makePrime x = if prime (x+add) then (x+add)
            else makePrime (x+add) 
            where add = if x `mod` 6 == 1 then 4 else 2
primes = 5: map primeCircule2 primes

其實不是沒有想過一次生二個 element (試著寫 let p = 5:7: map (6+) p),但是回傳時一定要產生一個 element,如果不是的時候總不能丟 0 XD,所以只好先交出一個破爛方法,剩下的明天再試。


2010/03/18 11:06 am 後來想到兩個數列分開算再用 merge 即可,不過速度上應該是佔不到便宜就是了 ...

makePrime_plusn n x = if prime (x+n) then (x+n) else makePrime_plusn n (x+6) 
primes = 5: map makePrime primes
primes2 = merge primes_plus2 primes_plus4 
    where primes_plus2 = 5: map (makePrime_plusn 6) primes_plus2 
          primes_plus4 = 7: map (makePrime_plusn 6) primes_plus4

星期四, 3月 11, 2010

Haskell Practice - Merge Sort

老實說我也不太清楚是不是 Merge Sort ,只是照著感覺寫,而且感覺是效率不佳的 Merge Sort ... Orz,其中的 merge 是 scm 老師寫的,他寫了一封信,我很認真的看再很認真的忘掉再重寫中。

insertionSort [] = []
insertionSort (x:xs) = merge [x] (insertionSort xs)

merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) 
    | x <= y = x : merge xs (y:ys)
    | otherwise = y : merge (x:xs) ys

測試結果如下:

*Main> mergeSort [3,1,5,2,6, -1, 10]
[-1,1,2,3,5,6,10]

---
想要改寫,不過應該是晚上的事了。


事情比想像中更糟,自己推一次,發現根本不是 Merge Sort 啊 ... Orz


上面那個應該是 insertion sort ... 緊急之間寫了下面這個 code 出來,但是會出錯 ... meeting 在即,等回來再說了 ...

mergeSort [] = []
mergeSort x = 
    if length x > 1 then 
        merge (mergeSort (fst (splitAt half x))) (mergeSort (snd (splitAt half x)))
    else x
    where half = truncate ( (fromIntegral (length x))/ (fromIntegral 2))

看起來是沒有出錯了,接下來該開始思考怎麼寫會比較好一點 XD。


2010/03/12 00:09 結果根本就在惡補怎麼操作 list ,發現自己是有看了,但是都忘完了 ... 到目前為止的版本

mergeSort (x:xs) 
    | xs == [] = [x]
    | otherwise = merge (mergeSort (take half (x:xs))) (mergeSort (drop half (x:xs)))
    where half = truncate ( (fromIntegral (length (x:xs)))/ (fromIntegral 2))

2009/03/12 10:19 AM 只是嘗試將 length 帶入 argument 中,實質上並無太大改變,我一直在想著長度的問題 ... 可是腦袋又是空掉了 ...

mergeSort [] = []
mergeSort x = mergeSort' x (length x) 

mergeSort' x l
    | l == 1 = x
    | otherwise = merge (mergeSort' (take half x) half) (mergeSort' (drop half x) (l-half))
    where half = truncate ((fromIntegral l)/(fromIntegral 2))

2009/03/14 11:38 pm 依 scm 在 comments 裡的建議把 uninterleave 寫出來,自己重寫 interleave ,發現有一點不太一樣(還好功能一樣 XD)
interleave [] ys = ys
interleave xs [] = xs
interleave (x:xs) (y:ys) = x:y:(interleave xs ys)
-- interleave (x:xs) (y:ys) = x:(interleave (y:ys) xs)

uninterleave :: [a] -> ([a],[a])
uninterleave [] = ([], [])
uninterleave (x:xs) = uninterleave' (x:xs) [] [] 

uninterleave':: [a] -> [a] -> [a] -> ([a], [a])
uninterleave' [] ys zs = (zs, ys)
uninterleave' (x:xs) ys zs = uninterleave' xs zs (x:ys)

mergeSort2 :: (Ord t) => [t] -> [t]
mergeSort2 [] = []
mergeSort2 (x:[])  = [x]
mergeSort2 xs = merge (mergeSort2 (fst (uninterleave xs))) (mergeSort2 (snd(uninterleave xs)))

星期二, 3月 09, 2010

Haskell Practice - Prime (2)

在寫了一個第一篇之後,scm 老師給予了很多建議

scm 提到...
Interesting code :). Some comments:
  1. 如你所說 isPrime 是 map 加上 foldr (不過這個 isPrime 測的好像是「不是質數」?)。另外,makePrimeList 是 filter.
  2. 其實 (&&) 這個 operator 碰到第一個參數是 False 的時候也並不會去算第二個。isPrime2 和 isPrime 的另一個不同點是碰到 y < sq 就停下來吧?這也可以用先做一個 takeWhile 達成。
  3. 用 makeList 的版本為什麼比較慢不能馬上斷定,一個猜測是和 x ++ [c] 有關係。串列的 (++) 花的時間和第一個參數的長度成正比,所以每產生一個新的 c 都得從最開頭把這個串列旅行一遍。
    另外,由於 makeList 是 tail recursive 的,makePrimeList 必須等到整個 6n+1 6n+5 的串列產生完畢後才能動作。(比較之下 makePrimeList_2 則可以隨到隨做,[2..x] 這個 list 的元素生出來、測試過後,就丟掉了,並不佔空間。)不知道 makeList 會不會使得 heap 使用量變大,GC 變多,程式就慢了。你可寫一個不是 tail recursive 的 makeList 試試看嗎?

所以第一個問題 isPrime 是錯的,因為我一開始是寫 notPrime XD,但是問題算小,我馬上重寫了一下(順帶一提, scm 老師說的 && 特性,我不確定 Haskell 有,現在知道有了,記得這有一個名詞稱呼這種特性,但是忘了是什麼,在寫 C/C++ 時很常用,大部分是用在 pointer check is not null 上。)

prime :: Integer -> Bool
prime x 
    | x == 2 = True
    | otherwise = 
        isPrime x [2..sq]
        where sq = truncate (sqrt (fromIntegral x)) + 1

isPrime :: Integer -> [Integer] -> Bool
isPrime x y
    | x == 2 = True
    | otherwise =
         case y of 
             [] -> True
             y:ys -> (x `mod` y /= 0) && isPrime x ys

這樣子應該就沒有錯了...(汗),然後我們再很快速的寫成 map 格式,也連帶的使用到 lambda function ,因為我不知道怎麼樣寫的比較精簡了 XD

isPrime4 :: Integer -> [Integer] -> Bool
isPrime4 x y
    | x == 2 || y == [] = True
    | otherwise = and (map ( \e -> x `mod` e /= 0) y)
--     | otherwise = and (map (/=0) (map (x `mod`) y)) 

接著我再把稍微改版的程式試著用 takeWhile 改寫(takeWhile 的相對是 dropWhile)

isPrime5 :: Integer -> [Integer] -> Bool
isPrime5 x y 
    | x == 2 = True
    | otherwise =
        isPrime5' x (takeWhile  (< (truncate (sqrt (fromIntegral x)) + 1)) y)

isPrime5' :: Integer -> [Integer] -> Bool
isPrime5' x y =
     case y of
         [] -> True
         y:ys -> (x `mod` y /= 0) && isPrime5' x ys

最後一個問題就是 makeList,我就沒有寫了,我把 makePrimeList 寫成如下型式

makePrimeList4 :: Integer -> [Integer]
makePrimeList4 x = [2, 3] ++ makePrimeList4' 5 x False [] 

makePrimeList4' :: Integer -> Integer -> Bool -> [Integer] -> [Integer]
makePrimeList4' c e b x
    = if c < e then
          if isPrime5 c x then
              makePrimeList4' (c+add) e (not b) (x ++ [c])
          else 
              makePrimeList4' (c+add) e (not b) x
      else x
      where add = if b then 4 else 2

這樣子的 code 就不需要另外產生 list ,因為產生的當下就檢查,不要就丟掉了,然而在生成 prime list 的時候還是 tail recursive ,有嘗試過另外的方法,卻發現快不起來。

如果要將 (x ++ [c]) 變成 ([c] ++ x),我嘗試寫了另外一個 isPrime7

isPrime7 :: Integer -> [Integer] -> Bool
isPrime7 x y 
    | x == 2 = True
    | otherwise =
        isPrime5' x (dropWhile (> (truncate (sqrt (fromIntegral x)) + 1)) y)

這樣子的確可以完全避免掉 tail recursive 的問題,但是速度會比較慢,因為產生的數列是 11 7 5 3 2 這樣子的排序,一般檢查是否為質數是正向檢查,逆向的時候能夠在檢查次數上佔到的便宜其實不多 (如果該數是被 5 整除的話...),所以這樣子寫反而比較慢,目前的想法是,如果想要完全漂亮的解決 tail recursive 問題的話,勢必是得重新設計方法而且更了解這個語言的。

---
可見自己數學真的不好 ... Orz

星期一, 3月 08, 2010

Haskell Pratice - Prime

今日目標算是達成了,明天再繼續。原始想法很簡單,如何寫出一個 prime list ? 於是我就寫了第一版

prime :: Integer -> Bool
prime x 
    | x == 2 = True
    | otherwise = 
            isPrime [2..sq] x
            where sq = truncate (sqrt (fromIntegral x)) + 1

isPrime :: [Integer] -> Integer -> Bool
isPrime x y =
    case x of 
        [] -> False
        x:xs -> (y `mod` x == 0) || isPrime xs

makePrimeList :: [Integer] -> [Integer]
makePrimeList x =
    case x of
        [] -> [] 
        x:xs -> if prime x then  
                    [x] ++ makePrimeList xs
                else 
                    makePrimeList xs

其中的 where sq = truncate (sqrt (fromIntegral x)) + 1 是在 Josh Ko 的幫助下寫出來的,但是我得隔日再戰,我很明確的知道是轉型問題,但是並不是能夠完全說清楚為什麼要這樣做(他有說明,但是我得再看一下書)。

而且在這一版中的 isPrime 實在是太暴力了,其實可以用 map + and (or fold) 寫出來,並不一定要用 recursive 寫,所以我採用了另外一個寫法,即是檢查到 `mod` == 0 就停下來。

isPrime_2 :: Integer -> [Integer] -> Bool
isPrime_2 x y
    | x == 2 = True
    | otherwise =
        case y of
            [] -> True
            y:ys -> if y < sq then
                        if (x `mod` y == 0) then False
                        else isPrime_2 x ys
                    else True 
                    where sq = truncate (sqrt (fromIntegral x)) + 1

速度是明顯快上不少,但這版對我而言只剩最後一個問題,就是每呼叫一次 sq 就要算一次,我目前唯一想到的解法是,把 sq 也當成引數,於是我就寫成

isPrime_3 :: Integer -> [Integer] -> Bool
isPrime_3 x y 
    | x == 2 = True
    | otherwise =
        isPrime_3' x y (truncate (sqrt (fromIntegral x)) + 1)

isPrime_3' :: Integer -> [Integer] -> Integer -> Bool
isPrime_3' x y sq =
    case y of
        [] -> True
        y:ys -> if y < sq then
                    if (x `mod` y == 0) then False
                    else isPrime_3' x ys sq
                else True

最後,再寫一個 makePrimeList 的 code 就搞定了

makePrimeList :: Integer -> [Integer]
makePrimeList x = makePrimeList_2 [2..x] []

makePrimeList_2 :: [Integer] -> [Integer] -> [Integer]
makePrimeList_2 u v =
    case u of 
        [] -> []
        x:xs -> if isPrime_3 x v then
                    [x] ++ makePrimeList_2 xs (v++[x])
                else
                    makePrimeList_2 xs v

最後 run 一下成果

*Main> makePrimeList 100
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

其實還可以更快,但是就明天再來來,依現在的程度寫出的 code ,雖然普通,可是很開心。

---
本週目標:練習 Prime


馬上就打了自己的嘴吧,我試著嘗試產生 6n+1 6n+5 的 list 用以減少 prime 的檢查次數,於是很粗糙的寫了如下的 code

makeList :: Integer -> Integer -> Bool -> [Integer] -> [Integer]
makeList e c b x =
    if c < e then
        if b then
            makeList e (c+4) False (x ++ [c])
        else
            makeList e (c+2) True (x ++ [c])
    else
        x

然後將 makePrimeList 改成如下

makePrimeList :: Integer -> [Integer]
makePrimeList x = makePrimeList_2 ([2, 3] ++ makeList x 5 False []) []

結果速度反而慢到嚇人啊...Orz 完全不知道為什麼,看來要好好研究了 XD。

星期日, 3月 07, 2010

愛的 ... ?

某天我把 Clara 說給我的話說給 gb014388 聽之後,他在白板上是這樣子寫的

Clara: 愛的抱抱相反是冷漠。

---
XD

星期二, 3月 02, 2010

趕工

這幾天一直在用 Python + Django 趕一個小型系統,我本來一點都不會 Django,但是還好會 Session 和 POST 這種很基礎的概念,所以硬幹起來還算快,接下來想辦法把這個系統改寫然後丟到 Apache Server + mod_python 上就算暫時告一段落了,接下來在嵐達網就要繼續正常發文了,這個 blog 的文章也要持續的寫作下去。

如果有關任何 Django 的筆記,我就直接放在 wiki 上,就不轉過來了 XD。

雖然這個系統很趕很破爛,不過我還決定幫這個系統命名一下(寫程式不太行,惡搞倒是很強 XD),Cobra Online Judge System XDXD,可以找個人畫眼鏡娘當作代表圖案嗎 XD


---
不像筆記的記錄 XD。

星期日, 2月 28, 2010

FLOLAC 10

FLOLAC 10
今年應該沒什麼能擋住我了吧 XD?


---
一定要去成 !

星期五, 2月 26, 2010

今日笑話


保護當事人,還有我的本名,我看到我就笑了 XD


---
以後走在路上報本名比較不會被打 XD

星期四, 2月 25, 2010

Django 撰寫

突然之間要我一個禮拜多一點就寫出一個小型的 web service,我立馬想到的是 PHP,但是我實在是不太想用 PHP 寫,大概是對於 weak type 有一種出自本能的害怕 XD,這次改用 Python + Django 撰寫這個 Service ,覺得 MTV (Model-Templat-View) 的架構,其實 PHP 做的出來,只是我之前沒想過,這次寫 Django 就算作給自己的一個全新練習吧 XD。不過我還是不想學 CSS ,這對不會美工的人而言還是太痛苦了 XD。

如果以後有需要,可以重新學一個 CMS 的相關開發或者是 PHP Framework 開發,應該會對這一行不會感到這麼陌生,不過我比較想要關心的是 PHP 的 hit-hop compiler ,但是至少要等這個禮拜過完吧 XDXD。


---
寫到一段落再說 XD。

星期日, 2月 21, 2010

改變與開始

所有的事正要改變嗎? 其實只是一個開始。


---
沒有答案的旅程。

星期六, 2月 20, 2010

mumur

明天就要回學校了,過了十天年假,雖然面對了很多問題,但是能解決的卻很少。

持續了之前的寫作,蠻開心的,只要能持續的學習與寫作就好了,不過,我想還是努力的學習努力的寫作吧。一直到這幾天才想通,要讓自己一天做很多事的要鍵是把事情分割,如果沒有分割到夠小單元,一天內就很容易淪為做一件事造成生產力低落,為此而開了一個 mirror wiki ,至少能讓自己寫完兩篇文字了,第三份也可以慢慢的完成,算是學習寫作的意外收獲吧 XD。

睡眠還是調不太回來,看來自己的身體比起以前差很多了,要開學了,不調回來也不行了。這次跟以前不太一樣的是,以前通常是上學期比較閒,下學期比較忙(就帳面上的資訊來說),這次剛好相反,所以我也不知道,應該是一個很有趣的新挑戰吧 XD。


---
just that XD.

Perfume 與音樂

本篇同時在 love the Perfume World 與 No title, no thinking, no meaning 發表。

改變與否 ?

當有很多人想要對這個世界改變些什麼時,我們只是想為自己留下些什麼。我並不是什麼聽音樂的專業人士,我只是想要開心的聽著音樂過生活 :) 。

名詞,為什麼聽 Perfume

到底名詞是用來解釋還是用來制約的,我一直都不是很懂,我從聽音樂以來,一直聽到不少名詞,Rock, Hip-pop, 英式搖滾,古典還有台灣的獨立音樂,非主流音樂,及流行音樂,一直到我聽到 Perfume 所謂的電音 (Electronic music),我的腦子已經一團亂了,現在的我頂多只能說,很吵的是 Rock(但是英式搖滾聽說又不吵),Hit-pop 就是會有人唱饒舌,獨立音樂就是人很少,那電音呢?

這對我而言一切都是困擾,當我聽到 Perfume 時,其實我已經放棄辨別是什麼音樂很久了,單純只是覺得我聽的下去,可以找到自己的感覺而聽的,我不是什麼事都想搞的很專業的人,雖然照我的個性,很想把很多事都弄清,但是光自己的領域都會被專有名詞搞到吐血時,我想在聽音樂這個方面保有一個單純的心態。

我是抱著這樣子的心情在聽 Perfume 的(笑)。

我所知道的 Perfume 與電音 (Electronic Music)

其實我是聽到 Perfume 才開始聽到這個名詞的。不然其實台灣人大多數對於電音的印象是電音三太子…Orz ,老實說,我不知道電音是什麼,但是 Perfume 的音樂給我這樣子的感受。

當人聲變成樂器成為一種可調控的角色時,和表演樂器平起平坐時,這一切對我而言都變成很有趣。 對我而言,這個世界,素人唱歌未必會比較差,真的嗎 ? 看看超級星光大道就知道了 XD。在這邊浮起一個問題,一般歌手唱的歌是具有可替代性了嗎? 我不知道。就我的觀察是,一首歌簡單的來分是人唱的部分與背景音樂,基本上只要節奏不要太差,唱歌的人夠強,就能夠完成一般所謂的成功詮釋一首歌,就會有人說你唱歌很有味道,蕭敬騰可以唱新不了情,我也不知道原唱是誰,但是我知道他唱的很好 XD。孫燕姿唱橄欖樹被念的很慘,齊豫唱時沒人說不好,一切都來自於感覺。所以如果有另外一個人能夠把感覺唱出來時,其實原歌手的可替代性就出來了(不過每個人都有不可替代之部分,這我也不太清楚怎麼說 XD。)

Perfume 的音樂顯然不是走這條路,如果把人聲視為樂器與其他樂器做交互作用時,基本上每個人的人聲是不盡相同的,再經過電音工作的調整(高八度啦低八度等等的複雜工作),獨一無二的樂器與組合就出來了,那就找到了這個音樂的無可替代性 (不太可能拿別人的聲音來重新合成,我想感覺會差蠻多的。)

Perfume 曾經在訪問時表示,中田ヤスタカ (音樂製作人,Perfume 的歌幾乎都是一手包辦) 要求他們坐在椅子上冷冷的唱。唱歌不帶入情感唱法,老實說,我是第一次遇到,不知道其他電音是不是也是如此 ? 但是因為這樣子,Perfume 表現出來的聲音冷冷的,不帶有感情,所以聽歌不太會有情緒被影響的問題(我每次聽 Linkin Park - Numb 都會覺得心情很糟 XD),人不太會待在同一個情緒有著很長的時間,所以聽 Perfume 的時候,我可以支配自己的情緒,算是意外中的好處吧 :)

電音不會想要製造什麼感覺,唯一能製造的感覺的是來自己的內心。

我們想聽的是什麼 ?

想聽的就是簡單。

前陣子,我認識的老師借與我一本書名為”簡單的法則”,裡面告訴你如何保持簡單,在複雜中保持簡單等等之類的。其實簡單是最複雜的。常常聽到有某些歌手去國外拍 MV 啦,重金請什麼樂團來伴奏,還是錄音很高級之類的。老實說,這些對聽歌的人一點都不重要,我不太在乎一張音樂製作的預算有多少(但是我相信音樂製作人蠻在乎的 XD),我只在乎我聽到了什麼。

很有趣的是,往往有名的歌都是很簡單的誕生的。

Perfume 的歌對我而言是簡單中帶著複雜,簡單的節奏,人聲下去組合,聽不到過多的音樂,但是要把這些元素組合好,需要很大的工夫。我聽歌聽了很多年,台灣的流行音樂的背景是我聽過最複雜的 XD。Perfume 真的很複雜,但是聽起來讓我有簡單的感覺,或許是因為簡單節奏做怪吧 XD。

高度整合的藝術

Perfume 在日本被人稱為近未來電音偶像,老實說我也搞不清楚是不是自稱,不過我很喜歡她們的另外一個稱呼 “奇蹟的女子三人組” :) ,基本上她們今天的成功不是單方面的,從三個人本身開始,服裝(剛開始蠻讓人覺得受到驚嚇的 XD),演唱會,音樂。可以說,我們從 youtube 上較難找到這樣子的組合與表演團體,就很像醫龍漫畫說的,做手術真是很像在高速的跑車上行駛 XD。多方面的合作缺一不可,或許是我覺得 youtube 上的表演達不到的一個吧。

另外一個方面就是,看她們的表演很輕鬆,看演唱會基本上也有一種很輕鬆的感覺,不虛假的感覺,我不知道這感覺以後會不會變,至少現在是存在的(笑)。

---
這次的討論其實很高空鳥瞰,考慮下次寫貼近 Perfume Music 的文字。第一次寫作關於 Perfume 的文字,有問題就請多多指教哩!

星期五, 2月 19, 2010

Josh Ko to go to Oxford University Computing Laboratory.

Trek through Pure Reason --- DPhil at Oxford University Computing Laboratory, Fully Funded!!

簡單的來說 Josh Ko 得到了 Oxford University 的全額獎學金,可以去英國開心做菸酒啦 XDXD。

這是我這一陣子聽到最開心的事啊,開心!! 以後可以跟他伸英國紀念品了,哈哈哈。希望他能開心的投入,然後我就可以開心的炫耀啦 XDXD。

---
本篇不允許回文喔 XD 請去本文回覆 XD

星期四, 2月 18, 2010

Haskell Index

這篇是不定時更新,基本上就只是一個目錄,沒啥內容性 XD 基本上我覺得是自己想整理吧 XD


---
希望有恆心持續整理 XD。

Literate Programming in Haskell

Literate Programming 簡單的來說就是讓你在寫文件和寫程式的同時,能用 programming language compiler(e.g ghc) & typeseeting compiler (e.g. LaTeX) 分別產生文件和程式,通常最常見的是寫書,不過一般的 imperative programming language 要進行這樣子的動作是很困難的(code dependence & side effect),在 Haskell 中,這樣子的問題顯的相對的簡單而且容易處理。

Literal Programming in Haskell 的 programming compiler 通常是選用 ghc,而 typesetting 則是使用 LaTeX (XeLaTeX 也可以,代表你可以寫中文),一個文件的過程大抵如下

  • 寫作一個 latex + Haskell 的 code ,但是 Haskell 的 code 必需寫在 \begin{code}\end{code}
  • 該檔案存成的副檔名是 .lhs (vim 認的出來),而我們在這個時候必需再使用另外一個套件 lhs2TeX 來處理,基本上我們可以使用 cabal 來安裝。
  • 使用 lhs2Tex 將該檔轉成 .tex 檔供 LaTeX 編譯

Document

LaTeX 的寫作就有如 LaTeX XDXD,就請參考其他的 LaTeX 文件嘍,而在 lhs2TeX 的這方面有兩份文件,分別是

Example

以下是從 Slide 中來的 example,sample code 如下

\documentclass{article}
%include lhs2TeX.fmt
%include lhs2TeX.sty
\begin{document}
This is the famous ``Hello world'' example,
written in Haskell:
\begin{code}
main :: IO ()
main = putStrLn "Hello, world!"
\end{code}
\end{document}
  • compile to tex file
    lhs2TeX --tt test.lhs -o test.tex
    pdflatex test.tex
    pdflatex test.tex
    and you will see test.tex
    當然 --tt 可以換成其他的選項,例如 --verb, --math, --poly,細節可以看簡報的說明。
  • compile .lhs to executable
    ghc -o hello.out hello.lhs
    基本上跟一般 compile 程式是相同的。

---
感覺上好像寫了一篇很簡單的說明 XD。draft

星期一, 2月 15, 2010

年假計畫

看到 Josh Ko 貼了年假計畫才想到,我的年假計畫真的是很簡單啊,大概就是看 PTIDES 和 Introduction to Functional Programming using Haskell,不知道能夠看多少,盡量看了。


---
希望有所進展。

星期六, 2月 13, 2010

節目

看來今年不用看新春特別難看節目了,真開心 XD。


---
看人玩 wii XD

星期五, 2月 12, 2010

mumur

已經忘了多久沒有這樣子面對自己的電腦了,不過,這幾天過了很頹廢的生活,認清現實之後,發現思考不用電腦,慢慢用紙筆描述自已的想法,是一件很輕鬆的事。

以前總覺得念這個科系要解決問題是少不了電腦的,但是,面對一個問題或一個最原始的方向,不管有沒有電腦,都是可以解決的。於是,我必需學會讓自己專心在如何學習及如何解決問題上。

面對一個現實就是,我的大學其實沒有學到什麼,大概就只有學到一點點的 imperative programming 的技巧,然而,要解決什麼問題,沒有一個解,也沒有任何專長,現在的我,充其量只是一個不入流的 coder 罷了。

是該把電腦蓋上,好好睡一覺了。

---
相信。