顯示具有 Haskell 標籤的文章。 顯示所有文章
顯示具有 Haskell 標籤的文章。 顯示所有文章

2014年7月6日 星期日

[emac] Haskell-mode with ghci

自從改用 Emacs for mac os x 之後,原本一些 aquamacs 先包好的東西現在都沒有可以用爽爽。 其中最明顯的大概是 unicode 的問題,這邊可以找到我之前弄好的設定,不過細節等未來有機會再說。這邊要提的是一度讓我頭痛不已的另一個問題:haskell-mode。

haskell-mode 的 source code 放在 github 上,有需要直接去下載就可以。安裝方法基本上就是直接找個地方丟,然後進去執行一下

> make haskell-mode-autoloads.el

接著再去 ~/.emacs 裡面加上 load-path 和喜歡的 hook等等。我自己只加上了下面這五行:

(add-to-list 'load-path "~/.emacs.d/modes/haskell-mode/")
(require 'haskell-mode-autoloads)
(add-to-list 'Info-default-directory-list "~/.emacs.d/modes/haskell-mode/")
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)

之後隨便打開一個 .hs 檔案然後 C-c C-l 看看有沒有正常運作就可以了。



### 找不到 hugs ?!

之所以這個看起來安裝過程並不複雜的東西會可以困擾我好一陣子,是因為我的 haskell-mode 在裝好以後就一直想要去跑 hugs,但是我根本就沒裝過 hugs 囧mmm。 這個問題的原因是:haskell-mode 會去判斷系統的 haskell interpreter 是哪套然後直接生對應的參數出來。但是那個 inf-haskell.el 不管怎樣就是認為我的電腦裡面是 hugs = =

總之,最後我還是懶得改 haskell-mode 的 source code,所以就直接調 .emacs 。這裡提供兩種稍微粗暴的作法:

**[方法一]** 就是直接從選單裡面去打開 Customize 這個頁面,然後點進 Inferior Haskell 這個子頁面並且修改 Haskell Program Name 這個變數到你自己的 ghci 路徑去。

**[方法二]** 直接打開 .emacs 並且暴力要求先讀入 haskell-mode 然後直接修改變數值;也就是在上面五行之後再加上下面兩行:

(autoload 'haskell-mode "haskell-mode" "..." t)
(setq haskell-program-name "/usr/loacl/bin/ghci")

這樣原則上就可以用了,不過其實這真的是個爛方法,我應該研究一下怎麼樣把變數設定做成一個 hook。但是這就要等我超級有空再說了 XD

2011年8月21日 星期日

[Notes] Semantics, Category and their Implementation 1

此篇為彼篇之後續...

主要涵蓋了 denotational semantics 以及 fixed point iteration。

2011年4月4日 星期一

[ghc] Upgrade to 7.0.3 !!

upgrade my ghc into 7.0.3 via homebrew.

1. updating homebrew
> brew update

2. upgrade all package you installed
> brew upgrade
or, install lastest ghc only
> brew install ghc
> brew cleanup ghc

3.
kill cabal .. XD
> cd ~/.cabal
> rm -R *
> cd ~/.ghc
> rm -R <path>
path is, for example, i386-darwin-7.0.3

restart cabal by
> cabal update

now, you could install any lastest package you want. XD
> cabal install <any package you want>



There was a weird problem when I want to install the bindings to the LLVM compiler toolkit. I got a error message about pattern matching:
..skipped..
/var/folders/KU/KUdrsAaeFWOIeZoa4Zhsqk+++TI/-Tmp-/llvm-0.9.0.145987/llvm-0.9.0.1/Setup.hs:102:70:
Couldn't match expected type `[PackageDB]'
with actual type `PackageDB'

Well, this problem is due to the error of source code...
so, the thing to do for salving it is to modify that code.

> cabal unpack llvm
> cd ~/.cabal/packages/hackage.haskell.org/llvm-<version>
for example my llvm source code is
~/.cabal/packages/hackage.haskell.org/llvm-0.9.0.1

and then, open Setup.hs with any editor, and replace packageDb by [packageDb] on the line#102 .

now, you must config, build and install by yourself:
> cabal config
> cabal build
> cabal copy

PS, if you cannot config this package
plz google for more info.
there is a big problem about 32/64-bit ghc and/or llvm...
(seems could be solved by rebuild ghc/llvm)

2010年11月1日 星期一

[Note] The GUI Issue

gtk+,之前在Mac OSX上面跑太多次有問題,已經有點怕了說,不過這次用brew灌就可以用了!不過compile的時候要給的參數好多,照說應該link和load的路徑都不需要再給,改下次有空再來試好了。



裝qt,其實nokia往站上有binary可以裝,可是跑起來覺得怪彆扭的。重點是這樣就打壞了原本弄好的lib系統。所以還是看看homebrew有沒有,果然有,那就灌吧!
> brew install qt
然後,等超過一個半小時了還沒好,所以下次再寫qt筆記吧 XD



這兩天在弄gtk+,莫名其妙的弄半天以後發現,brew灌起來的gtk+應該是可以用。雖說會噴一個奇怪的error出來,但是至少有東西了(那個error好像和顯示裝置的驅動還是設定有關)。gtk可以跑,我當然一如往常的想去試一下多年的夢想「gtk2hs」!他官網晃一圈以後就想起一個慘忍的事實:gtk2hs在ghc 6.12上面有bug。Orz

好吧,只好忍痛和gtk2hs說掰掰。不甘心之餘又回頭去看看現在有什麼其他的GUI package可以用用看。東看西看,還是只有gtk2hs和wxHaskell比較大宗。Orz

無奈之下,試試看wxHaskell吧:
在開始裝wxhaskell之前,要先把mac os x內建的wxWidgets換掉:
> brew install wxmac
如果沒有做這一步,之後執行macosx-app出來的.app會不能執行(mac會該說這個東西格式不對)。

wxmac要build好一會兒(10~20分鐘左右)。然後就可以用cabal來install正主兒:
> cabal install wxcore
build的時候,有滿坑滿谷的cpp deprecated warning Orz。為保安全,紀錄下g++的version:
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Copyright (C) 2007 Free Software Foundation, Inc.
然後 > cabal install wx
我也不知道我幹麼分兩段裝,一定是白爛病發作了XD。裝好以後確定一下東西有進去ghc-pkg。
> ghc-pkg list
/usr/local/Cellar/ghc/6.12.3/lib/ghc/package.conf.d
..[略]..
/Users/Jaiyalas/.ghc/i386-darwin-6.12.3/package.conf.d
wx-0.12.1.6
wxcore-0.12.1.6
wxdirect-0.12.1.3

接下來才是問題所在,gui的東西似乎在mac上面都特別刁鑽。wx同樣也不是可以讓你乖乖跑一下就有結果可以開開心心用的。用ghc compile以後直接執行他會噴error如下,並且會跑出一個只能看不能用的視窗。
10:46:15: Debug: wxColour::Set - couldn't set to colour string 'GREY'
[Debug] 10:46:15: Adding duplicate image handler for 'PNG file'
[Debug] 10:46:15: Adding duplicate image handler for 'JPEG file'
[Debug] 10:46:15: Adding duplicate image handler for 'TIFF file'
[Debug] 10:46:15: Adding duplicate image handler for 'GIF file'
[Debug] 10:46:15: Adding duplicate image handler for 'PNM file'
[Debug] 10:46:15: Adding duplicate image handler for 'PCX file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows icon file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows cursor file'
[Debug] 10:46:15: Adding duplicate image handler for 'Windows animated cursor file'
[Debug] 10:46:15: Adding duplicate image handler for 'TGA file'
[Debug] 10:46:15: Adding duplicate image handler for 'XPM file'

解決的辦法是把原本的executable file包成.app再去打開它。不過這之前就需要macosx-app來作這件事。細節可以參考stackoverflow上的說明。這邊作個簡單的描述:
抓下macosx-app的模板順便改名字和操作模式
> wget http://code.haskell.org/wxhaskell/bin/macosx-app-template
> mv macosx-app-template macosx-app
> chmod a+x macosx-app
然後開個順手的editor把下面這段加到macosx-app的最上面:
#!/bin/sh

libdir=""

wxrezcomp="`wx-config --rezflags`"
wxrezfile=""
if test "$wxrezcomp"; then
for word in $wxrezcomp; do
temp="`echo $word | grep '[^_]*_mac-[^r]*r'`"
if test "$temp"; then
wxrezfile="$temp"
fi
done
fi

if test "$wxrezfile"; then
wxrezdir="`echo $wxrezfile | sed -e 's|\(.*\)/libwx_mac.*|\1|'`"
wxinstallrezcomp="`echo \"${wxrezcomp}\" | sed -e \"s|${wxrezdir}|${libdir}|g\"`"
wxinstallrezfile="`echo \"${wxrezfile}\" | sed -e \"s|${wxrezdir}|${libdir}|g\"`"
fi

rezcomp="$wxinstallrezcomp"
rezfile="$wxinstallrezfile"

直接執行macosx-app的話會看到他噴出一些warning
> ./macosx-app
Warning: --rezflags, along with Mac OS classic resource building is deprecated. You should remove this from your Makefile and build .app bundles instead.
error: you need to specify a program. Use "--help" to show valid options.
這邊可以不用理他(其實是我也不知道怎要怎麼解決,反正可以用 Orz)

以上都準備好以後就可以直接
> ghc -package wx -o helloworld HelloWorld.hs
> macosx-app -v helloworld
> open helloworld.app
感人的小視窗就會跳出來惹 OvQ

2010年7月28日 星期三

[LLVM] LLVM-2.7 & LLVM-0.8.0.2

一直不停re-compile llvm實在是太痛苦了,
所以好不容易弄完之後,決定來紀錄一下這整件
痛苦的事。

話說要裝llvm-2.7很簡單,就
> brew install llvm
輕鬆、快速又好吃~
然後就想要開開心心的灌一下llvm haskell binding
結果,config一直死掉:
...snip...
checking for unistd.h... yes
checking llvm-c/Core.h usability... yes
checking llvm-c/Core.h presence... yes
checking for llvm-c/Core.h... yes
checking for LLVMModuleCreateWithName in -lLLVMCore... no
configure: error: could not find LLVM C bindings
cabal: Error: some packages failed to install:
llvm-0.8.0.2 failed during the configure step. The exception was:
exit: ExitFailure 1

上網查了以後發現問題出在Mac上面,但是實際
原因不明。總之,作法很簡單:就是把llvm-2.7
重新build成universal binary就好了,以下
重現當時機歪的整個過程(含brew的link):

[0] 砍掉原本brew install來的llvm 2.7
> brew uninstall llvm

[0.1] 準備給homebrew用的folder
(假設homebrew的prefix=/usr/local)
> cd /usr/local/Cellar
> mkdir llvm-gcc
> mkdir llvm-gcc/4.2
> mkdir llvm
> mkdir llvm/2.7

[1] 抓一下llvm和llvm-gcc
> wget 'http://llvm.org/releases/2.7/llvm-gcc-4.2-2.7-x86_64-apple-darwin10.tgz'
> wget 'http://llvm.org/releases/2.7/llvm-2.7.tgz'
> tar xzf llvm-gcc-4.2-2.7-x86_64-apple-darwin10.tgz
> tar xzf llvm-2.7.tgz

[2] 手動安裝(copy)一下llvm-gcc-4.2到/usr/local/Cellar下面去
> cd llvm-gcc-4.2-2.7-x86_64-apple-darwin10
> cp -R ./* /usr/local/Cellar/llvm-gcc/4.2
> brew link llvm-gcc
> cd ..

[3] make/make install llvm-2.7
> cd llvm-2.7
> ./configure --prefix=/usr/local/Cellar/llvm/2.7 --with-llvmgccdir=/usr/local/Cellar/llvm-gcc/4.2
(這邊要等一會兒)
> set -x UNIVERSAL 1
> make
(這邊要等一個小時左右)
> make install
> brew link llvm
> cd ..
至此,llvm-2.7和llvm-gcc-4.2就都裝好了。

llvm重灌好以後就直接
> cabal install llvm
就ok了

llvm haskell binding裝好以後,可以跑一下
他的example。看是要去這裡抓?還是要直接
解開~/.cabal/packages/hackage.haskell.org/
llvm/0.8.0.2/llvm-0.8.0.2.tar.gz這一個檔案。進去以後直接
> make
以後再看想要執行程式即可。
如果執行起來有問題可以參考這個

以上參考自這篇這篇

2010年4月21日 星期三

[Note]Ray Tracing with Haskell using package:parallel

[草記=只是暫時紀錄,整篇會重寫]


這兩天都在弄ray tracing的事情
找了好幾個C/C++版本的code來參考
不過, 幾乎是看沒有懂
最後當然還是決定投靠haskell, XD

找了幾個版本的範例程式
其中一個用gtk作ui
這個版本暫時擱置
因為我gtk一直怪怪的,跑不出東西 Orz

另一個是平行版本

剩下一個是這個這個

除了gtk那個, 剩下都是直接輸出ppm檔
所以沒有parallel的那兩個都不需要特別題什麼
而且他們也沒有import什麼package進來
簡直就是一整個貼心 XD

parallel那個就囧了
一開始compile一直說 parse error
所以把L49和L5?的兩個"!"給砍了
然後就發現package有問題
所以灌了 AC-vector 1.2.2 和 parallel-2.2.0.1
compile以後, 還是有問題
他說*<>沒定義而且*|重複定義...
弄了好一會兒以後發現
因為原作者是用AC-vector 1.1.1
而AC-vector每次改版都大改... @@
所以又用 ghc-pkg hide AC-Vector-1.2.2
把新版的AC-vector disable掉
一番折騰之後
終於ok了
但是跑一下發現, CPU 只吃了50% @@
所以想說該不會是因為沒有開ghc的選項
所以找了一下以前的資料
在ghc --make ....... 後面加上一個「-threaded」
然後跑程式的時候加上 +SRT -N2 的選項
e.g. ./ray4-hs 5 50 +RTS -N2 > out.ppm
btw, parallel這個程式需要兩個參數, 遞迴的次數 和 邊長

而David J. King的那個版本則是>./ray 500 > out.ppm
500也是邊長參數

ps - .ppm閱讀 :
有人推薦xv, 不過因為它是x window所以難用
最後我裝了ToyViewer
雖說有一點點鈍鈍的
但是目前還不錯用

2010年1月29日 星期五

[OS] Taste of House

今天早上google了一下發現已經有人拿haskell來寫OS了,叫做House。其細節還沒細看,不過倒是抓下來試了一下。測試的環境基本上和這篇是一樣的。

首先在House的網站上載 hOp-x.y.flp 然後暴力把.flp給改成.img,接著就直接用VirtualBox去掛載這個映像檔到flppy device上面去,然後開機就可以了。

開機以後會進入GRUB的選單,接著就看想要進text mode還是graphics mode就好。

graphics mode大概長這樣,非常明顯這只是一個展示用的範例。這裡只提供了一些固定的功能可以稍微玩玩看。我甚至連怎麼關機或是離開都不知道。XD



這裡還發現一篇paper: A Principled Approach to Operating System Construction in Haskell (ICFP 2005)。最近如果沒有其他壓力的話,蠻想來研究看看這怎麼做的。

2008年11月24日 星期一

[Derivation] Gray Code

這學期的 Computational Intelligence 的第二個作業提到了要用Gray Code來做encoding。雖說我還在考慮整個作業是不是要用Haskell來寫,不過gray code的generator應該蠻好寫的。比起imperative language應該會有個比較乾淨的寫法。

首先,為了先來個直覺的pointwise版。來看一下兩個很簡單的情況:
length = 1 => [[0],[1]]
length = 2 => [[0,0],[0,1],[1,1],[1,0]]

我們可以考慮第二個case是由兩個部份構成[0,0],[0,1] 和 [1,1],[1,0]。很明顯, 前段是把 0 接上 [0],[1],而後段是把 1 接上 [1],[0]。而"[1],[0]"是"[0],[1]"的inverse!

根據上面的觀察結果
我們可以定義出第一版的gray-pw為
gray-pw 0 = [[]]
gray-pw (n+1) = let hypo = gray-pw n in
    (map (0:) hypo) ++ (map (1:) (reverse hypo))


--
待續 :
1) point-free版本
2) deriving for faster

2008年9月7日 星期日

[GTK2HS] Cairo Notes

/*以下前半段主要整理自Cairo官網的Tutorial及其他*/

有關任何function的參數/行為細節等請查閱這裡

CairoGraphics主要有兩個基本的概念NounsVerbs

※※※ Nouns ※※※
大多是一些抽象的surface,是構成整個Cairo畫面的基本元件

  • Destination
    或稱Destination Surface,是我們基本的作畫平面
    可以是一個像素陣列或是一些檔案(.SVG,.PDF,etc...)

  • Source
    相當於顏料(paint)
    但是Source除了單色以外,還可以是更複雜的形式
    例如另一個Destination或是樣式(Pattern)
    也還可以加上透明度(Transparency)

  • Mask
    Mask是介於Source和Destination之間的過濾版
    僅有被Mask允許的地方Source才能投影/映射到Destination上面

  • Path
    路徑(Path)的資訊會被紀錄在文本(Context)之上
    直到我們使用繪出(Draw)之類的動詞之時,
    Context中的Path才會直接轉換成一個Mask
    並且透過這個Mask將Source投影到Destination上面

  • Context
    Context是一個資料載體
    其包含了該圖片絕大多數的資訊
    context紀錄所有會被動詞(Verbs)影響的資訊/名詞
    例如當前的Destination,Source,Mask,以及一些其他的資訊
    像是筆觸(Stroke),位移(Translate)等等
    最重要的,Context紀錄了上一個動詞之後到目前為止所有的Path


  • ※※※ Verbs ※※※
    是由數個實際存在的function合稱而成
    主要的功能就是將目前Context的內容pop出來並且根據不同的Verb執行不同的繪畫

  • Stroke
    Stroke就是沿著Path畫線

  • Fill
    單純的把Path內部填滿Source上的顏色或圖片

  • Text/Glyphs
    做為動詞,我目前僅知showText這個方法
    另外也可以用textPath和glyphPath配合fill來間接產生文字

  • Paint
    就是單純的全頁面Source覆蓋
    有兩種形式:無透明的paint和有透明的paintWithAlpha


  • Mask
    作為Verb的Mask相當單純,就相當於覆蓋(Paint)
    唯一的差別是執行Mask還需要一個Pattern來當作Mask(名詞)
    另外還需要注意Compositing Operator對於Mask動作的影響


  • 接下來是更多的整理和常用工具的列表

    ※※※ Pattern ※※※
    Pattern大致上有三種
    withRGBPattern/withRGBAPattern
    withLinearPattern
    withRadialPattern
    分別是單色樣式,線性漸層樣式,圓形漸層樣式
    漸層樣式可以使用patternAddColorStopRGB(RGBA)來增加漸層色點

    Pattern有兩種用途
    作為Mask動作的Mask(名詞) : (mask pattern)
    或是直接轉換作為Source : (setSource pattern)

    實做上面則需要注意一點
    withXXXPattern的最後一個參數都是一個(Pattern -> Render a)的function
    這可以視為withXXXPattern會產生一個只存在於該function內的Pattern實體
    也就是說所有需要這個Pattern的動作都要在這個function中完成
    看個例子就很好理解
    withRadialPattern 45.0 45.0 10.0 45.0 45.0 40.0 (\pattern -> do
        patternAddColorStopRGBA pattern 0.0 1.0 1.0 1.0 1.0
        patternAddColorStopRGBA pattern 1.0 0.5 0.5 0.0 0.5
        mask pattern)

    關於Mask和Clip這篇Notes中並沒有細談
    因筆者個人需求問題所以暫時沒有計畫去研究這個部份
    有興趣可以自己參考這裡或是這裡

    ※※※ Setting Stroke ※※※
    Stroke有一些基本常見的設定
    setLineWidth 設定線寬
    setDash 設定虛線
    setLineCap CAP 設定端點
    setLineJoin JOIN 設定接點(折點)

    CAP(端點)有三種選擇
    LineCapButt 平面
    LineCapRound 圓角
    LineCapSquare 方塊

    JOIN(接點)也有三種選擇
    LintJoinMiter 尖角
    LintJoinBevel 斜切角
    LintJoinRound 圓角

    ※※※ Save/Restore ※※※
    Save和Restore是一組很好用的工具
    Save會紀錄下現在Context中的State資訊(不包含Path)
    Restore則是會回到上一次Save的狀態

    這組工具在需要來回切換數組狀態時相當方便
    例如說
    setSourceRGB 1.0 0.0 0.0
    moveTo 0.0 0.0
    lineTo 5.0 5.0
    stroke
    save
    setSourceRGB 0.0 0.0 1.0
    moveTo 5.0 5.0
    lineTo 10.0 10.0
    stroke
    restore
    moveTo 10.0 10.0
    lineTo 15.0 15.0
    stroke

    會畫出一條紅-藍-紅的線段

    ※※※ Transformation/Matrix ※※※
    基本的轉換大致有三種
    translate 平移
    scale 縮放
    rotate 旋轉
    中心點都是在圖形的左上角
    transformation也是save/restore的對象

    另外,Matrix也可以用來做transformation
    Cairo裡面另外有專門做Matrix運算的package: Graphics.Rendering.Cairo.Matrix

    該package裡面有很多function可以產生/修改一個Matrix實體
    (參考這裡)
    而自行產生的Matrix實體可以由transform來執行
    或是由setMatrix/getMatrix來運用

    ※※※ Path Tool ※※※
    moveTo 移動
    lineTo 直線
    curveTo 曲線
    relMoveTo 相對移動
    relLineTo 相對直線
    relCurveTo 相對曲線
    arc 弧線
    arcNegative 負角度的弧線
    rectangle 矩形Path
    textPath 產生字串的Path
    closePath 封閉現在的Path
    newPath 清除之前的Path


    最後一個,也是最複雜的重點
    ※※※ Compositing Operator ※※※
    Compositing Operator是Cairo在進行影像合成時的模式
    不同的Operator會造成兩個圖形合成出不一樣的結果
    主要是影響透明度和彩度
    官方的說明在這裡

    以下完全是根據自己的理解整理出來的 XD
    (Surface都是指Destination)

    { "較"單純的Operator }
  • OperatorClear (Bounded)
    將source當作橡皮擦,把交集的部份清除
  • OperatorSource (Bounded)
    完全無視Source的透明度,直接蓋上去
  • OperatorDest (Both)
    禁畫模式,source畫什麼都會失敗
  • OperatorXOR (Both)
    看半天看不懂,太複雜了 Orz
    不懂他的公式怎樣出來的?
    又代表什麼意思 ?
  • OperatorAdd (Both)
    透明度直接加總(最大到1)
    彩度上,兩者都根據自己原本的透明度而縮小之後再相加
    換句話說,越不透明就用能保有較多的彩度
    最標準的融合模式!!
  • OperatorSaturate (Both)
    透明度取直接加總(最大到1)
    顏色上,兩者都縮小之後再加成
    但是source會縮的比surface小(也就是說,會以surface的原色為重)
    有點類似於把source當作浮水印蓋上去


  • { 有相反模式的Operator }("不會"吃掉surface或是source的圖)
  • OperatorOver (Both)
    彩度和透明度都是 以source基礎,加上surface的弱化
    是Cairo的Default Operator
  • OperatorDestOver (Both)
    彩度和透明度都是 以surface基礎,加上source的弱化


  • { 有相反模式的Operator }(但是""吃掉surface或是source的圖)
  • OperatorOut (Unbounded)
    圖形使用source給的(surface但非交集的部份全部砍掉)
    彩度按照source不變
    透明度是根據surface的透明度而更加透明
    surface透明度=0 -> 完全按照source透明度
    surface透明度=1 -> 透明度0
  • OperatorDestOut (Both)
    完全顛倒於OperatorOut
    圖形使用surface
    彩度照surface
    透明度根據surface的透明度而更加透明
    Out 有點像是把surface當作一塊會造成透明化的板子,然後兩者疊合
    DestOut 則是將source當作那塊透明化板


  • OperatorIn (Unbounded)
    只會繪出新舊交集之處
    透明度是原本兩者相乘 = 變小
    彩度按照Source
  • OperatorDestIn (Unbounded)
    完全同上,只是彩度改成按照Surface

  • OperatorAtop (Unbounded)
    只繪出surface
    透明度完全照surface
    顏色基本上是兩者加總,但是會根據source的透明度加成
    source透明度=0 -> 以surface色彩為準
    source透明度=1 -> 以source色彩為準
  • OperatorDestAtop (Unbounded)
    只繪出source
    透明度完全照source,
    基本上是兩者加總,但是會根據surface的透明度加成
    surface透明度=0 -> 以source色彩為準
    surface透明度=1 -> 以surface色彩為準
    就像是在交集的地方多塗上一層對方的顏料
    而這個顏料的濃度則是根據對方的透明度決定


  • 題外一下
    我自己測試Mask只有在下面四個Operator有效果
    Add, DestOver
    Out, DestAtop
    不過其實這裡還有很多細節要另外去研究
    所以不是很肯定(簡單說就是不懂 XD)

    以上,是我最近幾天在試的東西 :)
    有待研究的主要是Mask和Clip
    還有如何在GTK+的元件上面繪圖

    2008年9月4日 星期四

    [GTK2HS] Taste of Cairo

    因為某個自己要用的軟體想要輸出簡單的SVG圖片來讓html開
    所以從SVG的wiki找上了Cairo
    連過去看赫然發現他有Haskell Binding
    高興之餘就想說來測試看看
    如果可以用就把之前的ruby版改成haskell版
    就算失敗了,Cairo也有ruby binding. XD

    結果在Cairo網站裡看半天也沒有看到說哪有haskell binding
    最後東連連西連連才發現
    原來是被放進gtk2hs裡面了
    所以又回頭去翻了一下gtk2hs的網站
    最後找是找到了,不過沒有太詳細的說明
    和gtk2hs本身一樣,都要自己花不少時間去摸 @@


    在Haskell,或說在GTK2HS的Cairo binding裡面
    首先是要先產生我們的Surface(此處相當於Destination的同義詞)
    然後把這個Surface傳進真正會執行Drawing的function裡面
    Context的產生也會在這個function中出現
    (怎麼有種Continuation的味道? XD)

    來個簡單的範例吧
    module Main where
        import Graphics.Rendering.Cairo
        main :: IO ()
        main = do
            withSVGSurface "sample.svg" (fromInteger 90) (fromInteger 90) myDraw
        myDraw :: Surface -> IO ()
        myDraw surface = renderWith surface $ do
            setSourceRGB 0.0 1.0 1.0
            moveTo 10.0 10.0
            relLineTo 70.0 0.0
            relLineTo 0.0 70.0
            relLineTo (-70.0) 0.0
            relLineTo 0.0 (-70.0)
            stroke

    因為我是想要做SVG檔
    所以這個程式就是輸出.svg
    以下是輸出的截圖

    更多細節請參考XXX一文

    2008年7月16日 星期三

    [Haskell] unit ( )

    很早就知道nullary tuple,也就是unit ( )的存在。
    不過一直以來都不太清楚那是做什麼的,只隱約知
    道type ( )有兩個elements : unit ( ) 和 bottom _|_ 。
    雖說大概可以猜說這個unit type是用來描述Relative
    Nothing和Absolute Nothing這樣的概念。但是也
    一直想不太到實際上這要做什麼。

    不過前幾天在書上看到一段在講unit。其中也有舉了
    一個簡單的例子。看完以後有種恍然大悟的感覺。

    圓周率一般的寫法如下

    pi :: Float
    pi = 3.14159

    這樣當然是正確的,沒什麼不好現在我們加入unit。

    pifun :: ( ) -> Float
    pifun ( ) = 3.14159

    這樣有什麼好處呢?如此一來我們就有一個function
    可以用。比起原本的pi,pifun因為是function,所以
    我們可以有更大的彈性以及更好的一些性質。例如
    說我們現在可以對pifun用compose,而不在只是
    把pi當作value餵給另一個function。

    (*2).(pifun)
    (*2) pi


    最後,補充一下有關Absolute Nothing和Relative
    Nothing的事情。在Ontology(形上學)中,主要是
    以Being(存在)為探討的主題。而相對於Being的概念,
    就有了Nothing(無)的概念。後來隨著各代哲學家的研究,
    出現了Absolute Nothing(絕對無)和Relative Nothing
    (相對無)這兩種略有不同的Nothing。AN是相對Being
    的東西,他相當於"完全沒有存在任何東西"。RN則比較
    像是欠缺什麼,也有點像是比較不嚴謹的AN。一個顯著
    的例子就是 Φ 和 { } 之間的差別:
    Φ 是沒有任何東西。
    { } 有一個空的東西。

    2008年5月10日 星期六

    [GTK2HS] Install on Mac OS X

    一時興起
    灌了wxHaskell和gtk2hs來用

    不過wxHaskell不知道為甚麼不能跑
    我猜是某個東西的版本不對
    不過我暫時也懶得去找問題了
    也許哪天用Arch來灌灌看(?) 
    有.空.的.話.啦... XD

    回到正題
    gtk2hs官方網站上的tutorial
    不知道為啥是用一個叫做Glade的軟體當作開發環境

    然後我試著去抓下來build
    不過build到一半有問題然後就卡住了
    看起來是我有少東西
    但是,懶散如我
    我另外去google一下有沒有其他的tutorial
    果不其然,找到了這個 
    一個gtk2hs的toturial
    (不過後來我也在gtk2hs官網上看到一樣的helloworld sample囧)

    簡單講一下helloworld的作法

    首先create一個檔案:
        import Graphics.UI.Gtk
        main 
    :: IO ()
        main 
    = do
          
    initGUI
          window 
    <- windowNew
          button 
    <- buttonNew
          
    set window [ containerBorderWidth := 10,
                       
    containerChild := button ]
          
    set button [ buttonLabel := "Hello World"]
          
    onClicked button (putStrLn "Hello World")
          
    onDestroy window mainQuit
          
    widgetShowAll window
          
    mainGUI



    然後用ghc compile一下
    > ghc --make gtktry.hs -o hello
    > ./hello
    這樣就好了
    因為是在mac os上
    所以會開出X11來
    有點醜,但是也只能忍耐了 T^T

    題外話1
    後來我用macport弄到了Glade3
    不過暫時沒有意願去測
    雖說看起好像還不錯用的說
    (port好強呀,什麼都有Orz)

    題外話2
    據說有個叫做HOC的東西
    (Haskell to Object-C binding)
    顧名思義,可以連接haskell和object-c
    然後據說可以藉此使用mac上的cocoa
    不過,cocoa我完全不熟
    (其實完全沒碰過沒用過)
    所以只是隨口提一下 XD

    2007年11月14日 星期三

    [GHC] 6.8.1 -Install

    最近把NB上的OS改成Ubuntu7.10
    所以就要重灌所有的東西
    ghc當然也不利外
    到網站上晃了一下以後發現
    ghc-6.8.1已經release了!!
    http://www.haskell.org/ghc/download_ghc_681.html

    抓了linux(x86)的版本之後
    $ tar -zxf ghc-6.8.1-i368-unknown-linux.tar.bz2
    $ cd ghc-6.8.1-i368-unknown-linux
    $ ./configure
    $ sudo make install
    等他跑玩就好了

    原先是這樣希望啦
    但是實際上灌好以後執行時噴了個error出來
    大意是說ghc時找不到libreadline.so.4
    原本以為是我的readline太老舊 (其實應該是不太可能才對= =a)
    所以重灌了一次realine5.0
    結果還是一樣找不到

    最後才在下載ghc的那個網頁上看到有"readline4 compatibility RPM"
    抓下來以後解壓縮才看到裡面是/lib/libreadline.so.4(等檔案)
    不過也沒說要copy到哪裡去
    所以就到處丟看看
    最後是存在/usr/lib/底下才解決的.
    $ sudo cp -R ~/lib /usr

    接下來就是agda和epigram了 XD