2014年2月5日水曜日

[haskell] ubuntu 10.04 LTS (lucid) にhaskell platformをインストールする 手順

herokuのサーバーに手元でビルドしたバイナリをデプロイする目的でUbuntu 10.04 LTS(lucid)環境を作りました。herokuの仮想サーバーと同じ環境をローカルに用意して、そこでビルドしたHaskellのバイナリをサーバー上で動作させよう、という魂胆です。

必要なソフトウェアをapt-getでがしがしインストールしていったのですが、肝心のHaskellがghc6しか存在しません…。googleで検索してみるも、Ubuntu 11.x, 12.x向けであればghc7のパッケージが用意されているのですが、10.04向けのバイナリは見つからず。

という状況で試行錯誤した末、以下の手順でHaskell Platform環境を構築することができました。
  1. The Glasgow Haskell CompilerのページからLinux_x86_64のバイナリをダウンロード&インストール
    • バイナリアーカイブをDL
    • sudo make install
  2. ここの情報を参考にHaskell Platformが依存するライブラリ群をapt-getでインストール
    • apt-get install libgmp-dev
    • apt-get install libgmp3c2
    • apt-get install zlib1g-dev
    • apt-get install freeglut3-dev
    • (libbsdは既にインストール済みだったためパス)
    • また、古いHaskell関連パッケージは削除
    • apt-get remove ghc6 ghc-prof cabal-install
  3. Haskell PlatformのサイトからソースコードをDLしてきて、ビルド&インストール
    • ./configure
    • make
    • sudo make install
以上です。ghc6環境ではHaskell Platformのビルドができなかったため、1.の手順を実行しています。

2014年2月2日日曜日

[heroku] はじめてのheroku

インターネット上の情報を参考にしながら、自分のMacにherokuを利用する上で最低限の環境を構築しrubyとHaskellのサンプルウェブアプリを動かしてみた。

Mac上の準備:

  1. MacPortsをインストール(手順はここ
  2. portsでruby19をインストール(port install ruby19。こちらの手順で複数のバージョンを選択切り換えができます)
  3. heroku toolbeltをインストール(ここからインストーラをダウンロードして、インストール)
    • 以前はruby gemでherokuをインストールしていたようです(gem install heroku)

ruby版サンプルサーバーのherokuへのデプロイ:


    % git clone git://github.com/heroku/ruby-sample.git
    % cd ruby-sample/
    % heroku create
    % git push heroku master
    % heroku open

これだけで"Hello World!"が表示されるウェブアプリが動き始めた!ローカル環境にrailsもインストールしたのですが、heroku上でサーバーを動作させるだけであればrailsのインストールは不要でした。

 Haskell版サンプルサーバーのherokuへのデプロイ:

ここの情報を参考にherokuのサンプルも動作した!

    % git clone https://github.com/pufuwozu/haskell-buildpack-demo.git
    % cd haskell-buildpack-demo/
    % heroku create --stack=cedar --buildpack https://github.com/pufuwozu/heroku-buildpack-haskell.git
    % git push heroku master
    % heroku open

このサンプルではWarp(Haskell製ウェブサーバー)を直に利用している。 自分が利用しようとしているのはウェブアプリケーションフレームワークのYesod(内部でWarpを使用)なので、Heroku上でYesodを利用する方法は別途調査が必要。こちらにはsnap(yesodとは別のweb framework)のデプロイサンプルがある。
Haskellのサーバーをheroku上で動作させる方法は、このサンプルのようにビルドパッケージを利用する方法以外に、あらかじめコンパイルしてgitリポジトリにコミットしたバイナリを動作させる方法もあるようなので、後者についても少し調べてみる予定。

Yesodのチュートリアルサンプルのデプロイ:

試しに、昨年末にローカルで動作を確認したYesodチュートリアルサンプルをheroku上にデプロイしようとしてみましたが…エラーになりました。orz

% git push heroku master
Initializing repository, done.
Counting objects: 95, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (87/87), done.
Writing objects: 100% (95/95), 78.89 KiB, done.
Total 95 (delta 28), reused 0 (delta 0)

-----> Fetching custom git buildpack... done
-----> Haskell app detected
-----> Downloading GHC
######################################################################## 100.0%
-----> Downloading Cabal
######################################################################## 100.0%
-----> Updating Cabal
Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install
-----> Release the hounds! Installing application
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Yosog-0.0.0
trying: fast-logger-2.1.5
rejecting: warp-2.0.2, 2.0.1, 2.0.0.1, 2.0.0 (conflict: Yosog => warp>=1.3 &&
<1 .4="" conflict:="" rejecting:="" trying:="" wai-2.0.0="" warp-1.3.10.1="" warp=""> wai>=1.3 && <1 .5="" 2.0.0.1="" 2.0.0="" 2.0.1.1="" 2.0.1.2="" 2.0.1="" 2.0.2="" 2.0.3.1="" 2.0.3.2="" 2.0.3="" conflict:="" rejecting:="" trying:="" wai-1.4.1="" wai-extra-2.0.3.3="" yosog=""> wai-extra>=1.3 && <1 .4="" 1.3.2.4="" 1.3.3.1="" 1.3.3.2="" 1.3.3="" 1.3.4.1="" 1.3.4.2="" 1.3.4.3="" 1.3.4.4="" 1.3.4.5="" 1.3.4="" conflict:="" fast-logger="=2.1.5," rejecting:="" wai-extra-1.3.4.6="" wai-extra=""> fast-logger>=0.2 && <0 .4="" 1.3.0.1="" 1.3.0.2="" 1.3.0.3="" 1.3.0.4="" 1.3.0.5="" 1.3.0="" 1.3.1.1="" 1.3.1="" 1.3.2.1="" 1.3.2.2="" 1.3.2="" conflict:="" rejecting:="" wai-extra-1.3.2.3="" wai-extra="" wai="=1.4.1,"> wai>=1.3 && <1 .4="" 0.0.0.1="" 0.0.0.2="" 0.0.0="" 0.1.0="" 0.1.1="" 0.1.2.1="" 0.1.2="" 0.1.3.1="" 0.1.3="" 0.2.0="" 0.2.1="" 0.2.2.1="" 0.2.2.2="" 0.2.2="" 0.2.3="" 0.2.4.1="" 0.2.4.2="" 0.2.4="" 0.3.0="" 0.3.1="" 0.3.2.1="" 0.3.2="" 0.3.3="" 0.4.0.1="" 0.4.0.2="" 0.4.0.3="" 0.4.0="" 0.4.1.1="" 0.4.1.2="" 0.4.2="" 0.4.3="" 0.4.4="" 0.4.5.1="" 0.4.5.2="" 0.4.5="" 0.4.6="" 1.0.0.1="" 1.0.0="" 1.1.0.1="" 1.1.0="" 1.2.0.1="" 1.2.0.2="" 1.2.0.3="" 1.2.0.4="" 1.2.0.5="" 1.2.0="" conflict:="" rejecting:="" wai-extra-1.2.0.6="" yosog=""> wai-extra>=1.3 && <1 -="" .4="" app="" compile="" failed="" git="" haskell="" heroku.com:fierce-shore-6905.git="" master="" push="" rejected="" remote="" to=""> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:fierce-shore-6905.git'


(3/2追記)
上記のエラーは、ローカルでyesod init後にcabal installした際に、自分の環境の古い各種パッケージへの依存がYosog.cabalに記録され、Herokuで利用するビルドパック環境とあわないのが原因のようです。ローカルの環境をcabal updateで最新にして、cabal installした際に生成したYosog.cabalをコミットしてサーバーにデプロイしたところコンパイルは通るようになりました。
ですが残念なことに、heroku openしてもサーバーにはつながらず…。原因調査中です。