三則讀後小感

小感 #1

讀 1998 年 John Hughes 談 Haskell Monad 與 Arrow 的文章,其中提到對於 Monad 的解釋

class Monad m where
return :: a -> m a
(>>=)  :: m a -> (a -> m b) -> m b

說:這意思是,做為定義中的參數 m 這個資料類型是個 Monad ,透過 m 可以構成一組結構,格式為 m a 或者 m b ,意思是 m 表示一種執行完之後能傳回資料類型是 a 或 b 的一種計算行為。

哇賽,這定義非常是個 functional 風味的定義。如在 C 語言所看到許多稱為「函式」的那些 function ,它們的模式正可表達為 m a ,做完一些動作之後會跑出資料類型為 a 的傳回值。於是,在 Haskell 中看到的函數定義為 putStrLn :: String -> IO () ,所以 putStrLn “hello,world" :: IO () 的意思是列印一段文字的程式是一套計算動作,做完之後傳回 () (一對括號,稱為 unit ,基本單位的意思)。

小感 #2

讀 “An Introduction to Programming in Emacs Lisp" ,介紹 Emacs 這套編輯器。文件開頭說,可以把 Emacs 認知為可擴充的計算環境,可以把 Emacs Lisp 當作是一套獨立的程式語言。

小感 #3

同上一本書,簡介 Lisp 的意義也很有味道: LISt Processing ,列表處理。

回想 Lisp 程式都是長為一套原始的結構:有個開頭的左括號,並且有個結尾的右括號,並且可以以空格為分隔符號,安插任何數量的辭彙進去二括號之間。這樣的結構稱為 list ,而 list 之內的任何辭彙也可以是 list 。 Lisp 的左右括號有明確的分隔意義,不但可以分隔前一句與後一句,並且可以區別 parent list 與 child list 。

於是,我聯想到的是,組合語言的結構也是這麼簡單。

廣告
張貼在 Haskell, Lsip

Haskell ($) 運算符號

在 GHCi 打 `:t ($)` 可見到下列結果

Prelude> :t ($)
($) :: (a -> b) -> a -> b

簡單看,就是把函數套上參數而已。不過,運算的內涵, ($) 是一個比起 (+), (*) 等數學運算符號來,優先權更低的運算符號。

試想,我們所知道的數學運算符號, (*) 比 (+) 優先:

3 + 2 * 4 = 3 + (2 * 4)

那麼,在 Haskell 所見的 ($) 優先等級最低,則在 ($) 左右邊的算式,形同分別把整段加上括號。所以以下二行是相同意思:

succ $ 3 * 2
(succ) (3 * 2)

並且,以下二行也是相同意思:

take 3 $ repeat 3
(take 3) (repeat 3)

於是,如下例,可以運用 let-in 語法與 ($) 運算,寫結構複雜的句子而不必加上括號:

Prelude> :{
Prelude| let n = succ $ 3 * 2
Prelude| in take n $ repeat n
Prelude| :}
[7,7,7,7,7,7,7]

結語

($) 運算符號為最低優先等級的運算符號,並且運算順序為右方結合。

張貼在 Haskell | 標記 ,

在 Windows 安裝 Haskell Tool Stack (重來)

前情提要:Haskell Stack ,方便操作 Haskell Platform 的工具

在前一篇文章,所提到 Haskell Tool Stack 的操作參數有些多餘累贅的參數。本篇文章,經過再三確認,指出目前在 Windows 10 安裝 Haskell Tool Stack ,可以更簡便、更清楚。

Haskell Tool Stack 版本stack-1.5.1-windows-x86_64-installer.exe

Windows 版本: Windows 10

標的

  1. 將 Haskell Tool Stack 安裝在 D:
  2. 透過 Haskell Tool Stack 安裝的 GHC 也安裝在 D:
  3. 安裝之後,要能透過 Haskell Tool Stack 順利運作 GCC (在 Windows 10 若將 GCC 安裝路徑加上含有空格的名稱,如 “Program Files" ,則 Haskell Tool Stack 所需要運用 GCC 編譯的 library , configure 時檢測失效,無法繼續 build )

執行步驟

下載並安裝 stack-1.5.1-windows-x86_64-installer.exe

將環境變數 STACK_ROOT 修改為 D:\haskell_tool_stack (或者,在指令畫面設定 –stack-root <路徑> 的指引)。

打開命令提示字元 (Command Prompt) ,使用指令 stack path 產生預定的設定檔,並可看到 “No compiler …" 字串,說明它是根據前一步驟所指定的 STACK_ROOT “D:\haskell_tool_stack" 目錄裡的設定檔來取得設定值。

開啟文件 D:\haskell_tool_stack\config.yaml ,加上一行 “local-programs-path: D:\haskell_tool_stack" 。之後在指令畫面打 stack path 會看到 “No compiler …" 字串提到需要使用指令 stack setup 將 compiler 安裝在前項所指定的 local-programs-path “D:\haskell_tool_stack" 的子目錄裡。

打開命令提示字元 (Command Prompt) ,使用指令 stack setup 安裝 GHC 與 MSYS2 ,於是它會安裝在前步驟所指定的 STACK_ROOT “D:\haskell_tool_stack" 目錄。

張貼在 Platform | 標記 , ,

Haskell Stack ,方便操作 Haskell Platform 的工具

很久沒有寫 Haskell 程式,最近想重新寫 Haskell 並且特別著重在應用,才發現, Haskell 已經進展為 Haskell Platform 了。而我更想在 Windows 上,能以雷同於 Ubuntu 上寫 Makefile 的方式來處理 Haskell 平台、工具與程式。

獨立於 Haskell Platform 之外,有個叫做 Haskell Stack 的工具,顧名思義能用來整理 Haskell 的軟體組合。但是,我第一次是開開心心安裝了 Haskell Platform 8.2.1 ,之前還有 7.x.x 版本的舊安裝份量,而發現不曉得如何安裝額外的 Haskell 軟體套件如 http-client 之類的。

經過二番研究,我大致了解由 Haskell Stack 安裝配置 GHC 的方式,依下列順序介紹並說明:

  • 安裝 Haskell Stack
  • 調整 Haskell Stack 對自身的設定,並且重整安裝
  • 調整 Haskell Stack 存放 GHC, MSYS2 等的目錄位置,並且執行安裝後者。

好,那麼以下說明各段步驟吧。

安裝 Haskell Stack

由 Haskell Stack Install/upgrade 文件頁面下載安裝檔案 Windows 64-bit Installer

執行 Windows 64-bit Installer 並且修改安裝目標位置,例如我要安裝在 D:\Program Files\Haskell Platform\

調整 Haskell Stack 對自身的設定,並且重整安裝

安裝完成之後,打開命令提示字元 (Command Prompt) ,打 `stack –version` 印出的版本文字為 “Version 1.5.1, Git revision 600c1f01435a10d127938709556c1682ecfd694e x86_64 hpack-0.17.1″

可是不知為何,即使它把 Stack 安裝在我指定的位置,但是,各種 yaml 設定檔案,卻仍然放在 C:\sr\ 目錄中

翻開 Windows 環境變數 STACK_ROOT ,發現設定項預定為 C:\sr\… ,我將此項修改為 “D:\Program Files\Haskell Platform"

再打開命令提示字元,打 `stack path` 指令,它自行在 “D:\Program Files\Haskell Platform" 放置預定的設定檔

刪除 C:\sr\ 目錄

再打一次 `stack path` 指令,確認仍可以運作,將訊息印出,只是訊息開頭說 “No compiler found, …"

調整 Haskell Stack 存放 GHC, MSYS2 等的目錄位置,並且執行安裝後者

打開 D:\Program Files\Haskell Platform\config.yaml 文件,加上三行: “local-programs-path: D:\Program Files\Haskell Platforms" 、 “compiler: ghc-8.2.1″ 、 “compiler-check: match-exact" (詳情請參閱 YAML Configuration 文件頁面

打開 D:\Program Files\Haskell Platforms\global-project\stack.yaml ,加上二行: “compiler: ghc-8.2.1″ 、 “compiler-check: match-exact"

打開命令提示字元 (Command Prompt) ,打 `stack setup 8.2.1` 指令,使它開始在 D:\Program Files\Haskell Platforms\x86_64-windows\ 安裝 GHC 等平台與工具

等待 GHC 安裝完成之後,重新打開命令提示字元,打 `stack path` 確認它可以印出各種系統路徑。

開始使用 GHC

打開命令提示字元,打 `stack ghci` ,等看到 “Prelude>" 提示符號,即可確定平台安裝完成。(然後再打 “:q" 可退出 GHCi)

 

 

 

張貼在 Platform, Uncategorized | 標記 ,

monodevelop 開啟 ASP.net 專案的二個小問題

問題一
情況:在 Linux 環境安裝 mono, monodevelop ,開啟 ASP.net MVC 專案,並且以 xsp 執行。
問題:由於 MVC 按照慣例會去找相同名稱的檔案,而且 Windows 檔案系統不區分大小寫,但是 Linux 檔案系統區分大小寫。
解決:設定專案設定檔的運行參數 MONO_IOMAP 值為 all 。
2017-08-21 14-26-26 的螢幕擷圖

問題二
情況:在 Linux 環境用 mono 執行 ASP.net 網站。
問題:網站啟動時,出現「 Access to the path “/etc/mono/registry" is denied. 」文字。
解決:這篇網誌文章試著說明 mono 為何要像 Windows 那樣設定 registry 。而解決辦法則是建立 /etc/mono/registry 並且將權限安排為 777 。

張貼在 Uncategorized

魯凱族歌謠 Alubaling (鬼湖之戀)歌謠譜

18557138_1654831684530073_2830204000607879624_n

我暫停工作,轉去學習原住民的文化。最近反覆學了一首歌,鬼湖之戀,是魯凱族在唱百步蛇與巴冷公主的傳說故事。

以親身曾經參與過大量資料處理的工作經驗,對音樂曲調的處理,覺得可以很快找到 pattern 。我構想了簡單的記譜系統,能把魯凱族或其他如卑南族古調加以記錄,同時兼顧發音與調性。

以下是另一曲卑南族古調,是由歌手 Panai Kusui 教導的。

18581628_1654246404588601_6413897829814416137_n

參考資訊

  1. 「一起陪原住民劃出回家的路」 Facebook 粉絲專頁 https://www.facebook.com/IndigenousTransformativeJusticeTW/
  2. 鄭雅茹唱鬼湖之戀 https://www.youtube.com/watch?v=RfA69XYjLws
  3. 舞思愛唱鬼湖之戀 https://www.youtube.com/watch?v=INj2RTb5Ni4
  4. 巴冷公主片頭動畫 https://www.youtube.com/watch?v=BA8cD6G8zEA
  5. MIT 冬探聖湖祕境一 大鬼湖暖暖平安夜">MIT 台灣誌「冬探聖湖祕境一 大鬼湖暖暖平安夜」https://www.youtube.com/watch?v=evFWokpt-Y0
  6. 2017/5/16 20:30 「凱道小講堂 x 一起唱歌」之「巴奈教你唱古老的歌」 https://www.facebook.com/2016mayawbiho/videos/851145005038420/
張貼在 Programming | 標記 , , , , , , , ,

實作 Landmark Window 與 Sliding Window

由於在 “Knowledge Discovery from Data Streams" 第 17 頁見到 windowing 技術的概括分類,

%e6%93%b7%e5%8f%96

我試著實作 Landmark Window [1] 和 Sliding Window [2] 。

Windowing 技術,以 Sliding Window 為例,為了能保留較近的資料,同時拋棄較遠的資料,一段連續的資料段落需要被保留起來。 Landmark Window 從尾端放進了多少資料,就需要保留多少資料。 Sliding Window 則實作 FIFO ,當新的一筆資料放進去尾端時,假如 window 的資料數目已達到 window 的容量,則前端最早的一筆資料則要退出。

實作上, window 的容量,定義為資料數目。每一筆資料都編列一個號碼,而由於 Erlang 語言有能力以字面寫出超大數字,並且可以操作,所以用一個變數 next 標記下一筆即將進來的資料編號,並且只要有 next 變數,就可以指出串流資料的數目。 Sliding Window 需要多用到一個變數 size ,表示 window 的容量,而資料數目需要由 next 和 size 二變數來求出。

串流資料的保存,我選擇以字典格式 dict 搭配二變數,提供 FIFO 的能力,同時保留其他方面的彈性,例如隨機存取。我沒有選擇以許多個 list 實作 queue 來表達 sliding window ,因為對於 queue 的結構與驗證等細節,要多做討論。

[1] Landmark Window 實作: https://github.com/streamarium/DataStreamsErlang/blob/master/src/landmark_window_of_int.erl

[2] Sliding Window 實作: https://github.com/streamarium/DataStreamsErlang/blob/master/src/sliding_window_of_int.erl

張貼在 Uncategorized | 標記