2014年1月30日木曜日

[mac] XQuarzでリモートクライアントからの接続を許可するには

このサイトを参照し、XQuartz(X Window System)をmacにインストールしたものの、X clientからmac上のX serverに接続してウィンドウを開こうとすると、以下のようなエラーが表示され困っていました。

 xterm Xt error: Can't open display: 192.x.x.x:0.0 

クライアント側のDISPLAY環境変数は正しい、サーバー側でxhostによりクライアントが登録されていることも確認、にもかかわらずエラーになる状態です。今日ふとメニューバーから[X11] - [環境設定]を開くと「セキュリティ」タブの中に「ネットワーク・クライアントからの接続を許可」というチェックボックスが存在していることに気がつきました。このチェックボックスをONにして再起動したところバッチリつながるようになりました!

2014年1月13日月曜日

[haskell][yesod] Hashkell and Yesod(Basics章)学習メモ

Yesod学習のためにオンラインで公開されているHaskell and Yesodを読んでいます。本エントリにはBasicsの章について自分の理解をまとめておきます。


Basics
  • Hello World
    • サンプルコード(helloworld.hs)を起動するにはコマンドラインから単に以下のコマンドを実行すればよい。
      • runhaskell helloworld.hs
      • {-# LANGUAGE QuasiQuotes           #-}
        {-# LANGUAGE TemplateHaskell       #-}
        {-# LANGUAGE TypeFamilies          #-}
        import           Yesod
        
        data HelloWorld = HelloWorld
        
        mkYesod "HelloWorld" [parseRoutes|
        / HomeR GET
        |]
        
        instance Yesod HelloWorld
        
        getHomeR :: Handler Html
        getHomeR = defaultLayout [whamlet|Hello World!|]
        
        main :: IO ()
        main = warp 3000 HelloWorld
    • コンパイル後ウェブサーバーが起動される。起動されたウェブサーバーにアクセスするには、ブラウザに以下のURLを入力する。
  • Routing
    • 以下のようなコードでrouteを定義する。
    • mkYesod "HelloWorld" [parseRoutes|
      / HomeR GET
      |]
    • 上記のコードは、次のことを意味している。
      • "HelloWorld"アプリケーションはrouteを1つ持つ
      • このrouteを"HomeR"と呼ぶ。
        • "R"はresourceを表すものに付与する接尾辞。従うべきconvention。
      • このruoteは"/"(アプリケーションのroot)に対する、GETリクエストに応答する
      • mkYesodはTemplate Haskell関数、parseRoutesはquasi-quote)
  • Handler Function
    • 上記のHomeRというrouteに対するGETリクエストにレスポンスを返すにはgetHomeRというHandler Functionを用意する。
      • "get"はrouteの"GET"に対応
      • HomeRはrouteの名前
    • helloworldサンプルではdoc type, tagなどを自動的に付与してレスポンスデータを生成してくれるdefaultLayout関数に[whamlet|Hello World!|]という引数を渡している。
      • whamletはhamlet syntaxをwidgetに変換するquqsi-quote
      • hamletはYesodのでフォルトHTMLテンプレートエンジン
  • The Foundation
    • 全てのYesodアプリケーションはfoundationデータ型を持つ。 このデータ型はYesod型クラスのインスタンスでなければならない。以下のような項目を制御する。
      • DBのコネクションプール
      • コンフィグファイルから読み込んだ設定値
      • HTTPコネクションマネージャ
      • rumdom number generator
    • Yesodはヘブライ語で"foundation"という意味らしい。
  • Running
    • YesodはWeb Application Interface(WAI)上でビルドされており、以下の環境で動作する
      • FastCGI
      • SCGI
      • Warp
      • Webkitライブラリを利用するデスクトップアプリケーション
  • Resources and type-safe URLs
    • 複数のページ(HomeR, Page1R, Page2R)を遷移するサンプル:
    • {-# LANGUAGE QuasiQuotes           #-}
      {-# LANGUAGE TemplateHaskell       #-}
      {-# LANGUAGE TypeFamilies          #-}
      import           Yesod
      
      data HelloWorld = HelloWorld
      
      mkYesod "HelloWorld" [parseRoutes|
      / HomeR GET
      |]
      
      instance Yesod HelloWorld
      
      getHomeR :: Handler Html
      getHomeR = defaultLayout [whamlet|Hello World!|]
      
      main :: IO ()
      main = warp 3000 HelloWorldI
    • 上記のサンプルではwhamletでtype-safe URLを用いている。"@{...}"で囲まれた部分はYesodが自動的に正しいURL文字列に変換した上でクライアントにレスポンスデータとして返される。
    • type-safe URLは非常に価値があるもの:
      • 開発時に何度URLを変更しても決してリンク切れになることはない 
      • コンパイル時にパラメタ込みで不整合が検知される

  • The scaffolded site
    • 本書ではscaffold site関連のツールは意図的に用いていないが、実際の開発ではscaffold siteを利用することを強く推奨する。
    • yesod init
      • いくつかの質問を入力すると、デフォルトのscaffold siteが格納されたディレクトリが生成される
    • cabal install --only-dependencies
      • yesod initで生成されたディレクトリの中で実行
      • DBなどの付加的な依存ライブラリをビルドする
    • yesod devel
      • サーバーを起動する
  • Development Server
    • yesod develを利用すると、
      • コードの変更に対して自動的にリビルド・リロードがかかり、インタープリタ言語の強みであるrapid prototypingに相当する恩恵がえられる。
      • production site用には最適化されたバイナリを生成でき、fast productionも実現できる



2014年1月12日日曜日

[haskell][yesod] Hashkell and Yesod(Introduction & Haskell章)学習メモ

Yesodのチュートリアルを一通りなぞったものの、いざ自分でweb appを作ろうとするといろいろとわからないことが多いため、Haskell and Yesodを最初から読むことにしました。
本エントリで主に自分が重要だと感じたポイントをメモにして残しておきます。

  • Introduction
    • YesodおよびHaskellを用いるメリットは以下の通り。
    • Type Safety
      • 入力として期待している型を記述できる
      • データのマーシャリング機能で境界値問題を抑制できる
    • Concise
      • formsライブラリでコーディング量を削減できる
      • routesで型安全性を損なうことなく簡単な宣言ができる
      • DBへのデータの登録・取り出しコードを自動生成してくれる 
    • Performance
      • コンパイル時にHTML, CSS, JavaScriptを解析することで、サーバー実行時のdisk I/Oを削減してくれる
      • Haskell製の最速のウェブサーバーであるWarpを利用しているので高速
  • Haskell
    • Haskell全てに精通していなくてもYesodでアプリケーションは開発できるが、以下の項目は押さえておく必要がある
    • Terminology
      • Data type
        • type GearCount = Int
        • newtype Make = Make Text
        • data Vehicle = Bicycle GearCount | Car Make Model
      • Data constructor
        • PersonMakeBicycleCar
      • Type constructor
        • PersonMakeVehicle
      • Type variables
        • data Maybe a = Just a | Nothing
        • data Person = Person Text Int
    • Language Pragmas
      • Yesodでは強力なtype class, syntax changesなどの言語拡張機能を利用しているがその宣言はソースコードで行うことを強く推奨する
        • {-# LANGUAGE MyLanguageExtension #-}
      • GHCの-XMyLanguageExtensionオプション、cabalのextensionブロックの指定は環境依存になってしまうので使わない方がよい
    • Overloaded Strings
      • HaskellStringには以下の制限があるため、HaskellはOverloadedStringsという仕組みを用意している。
        • メモリアロケーションが各consに必要、要素のcharacter毎にmachine wordを消費するなどのパフォーマンスの問題
        • ByteStringsやHTMLなど、文字列っぽいデータを扱いたいことがある型
      • IsString型のインスタンスにはTextStringより効率がよい)、StringおよびHtmlなどがある。
      • ただし"hello"のように宣言されたデータの型が一意に決まらなくなるため、明示的な型指定が必要になることがある点に注意が必要。
    • Type Families
      • 複数の異なる型の関連を記述する。
    • Template Hashkell(TH)
      • THはコード生成の一つの手順で、Abstract Syntax Tree(AST)を構築する。GHCは、以下のような"$("で始まる関数をTemplate Haskell(TH)関数と認識する。
        • $(hamletFile "myfile.hamlet")
    • QuasiQuotes
      • QuasiQuotes(QQ)はTemplate Haskell(TH)のちょっとした拡張。以下のように"["と最初の"|"の間にquasi-quoteの名前を記述し、contentsを"|"の間に記述する。
      • {-# LANGUAGE QuasiQuotes #-}
        [hamlet|This is quasi-quoted Hamlet.|]
      • Haskell and Yesodのサンプルではコピペ(動作確認)を容易にするためにQQを多様しているが、実際の開発においてはhamletFileなどを用いて外部ファイルを参照することを奨める。

Basicsの章以降は別エントリで。

2014年1月4日土曜日

[mac] MacPortsでパッケージインストール時にバージョンを表すサフィックスを外す方法

MacPortsでは複数のバージョンが存在するパッケージをインストールすると、バージョンのサフィックスがついたファイルが/opt/local/bin/以下に配置されうれしくありません。例えばruby19パッケージをインストールすると、以下のファイルが存在する状態になります。

-rwxr-xr-x  1 root  admin   4402  8 22 21:59 erb1.9*
-rwxr-xr-x  1 root  admin    551  8 22 21:59 gem1.9*
-rwxr-xr-x  1 root  admin    323  8 22 21:59 irb1.9*
-rwxr-xr-x  1 root  admin   1236  8 22 21:59 rake1.9*
-rwxr-xr-x  1 root  admin    793  8 22 21:59 rdoc1.9*
-rwxr-xr-x  1 root  admin    193  8 22 21:59 ri1.9*
-rwxr-xr-x  1 root  admin  13056  8 22 21:57 ruby1.9*
-rwxr-xr-x  1 root  admin    303  8 22 21:59 testrb1.9*

この状態でrubyやirbコマンドを実行しても、以下のように Command not foundというエラーになってしまいます。

$ ruby
ruby: Command not found.

意図したコマンドを実行するためにシンボリックリンクを張りたくなりますがわざわざ手動で設定するのは面倒ですよね。こんなときにはportコマンドで以下の手順を実行すれば、該当のパッケージでインストールされたファイルに対してもれなく自動でシンボリックリンクを設定してくれます。

$ port select --set ruby ruby19
Selecting 'ruby19' for 'ruby' succeeded. 'ruby19' is now active.

上記のコマンド一発で、以下のシンボリックリンクファイルが生成されます。

lrwxr-xr-x  1 root  admin      21  1  4 23:45 erb@ -> /opt/local/bin/erb1.9
lrwxr-xr-x  1 root  admin      21  1  4 23:45 gem@ -> /opt/local/bin/gem1.9
lrwxr-xr-x  1 root  admin      21  1  4 23:45 irb@ -> /opt/local/bin/irb1.9
lrwxr-xr-x  1 root  admin      22  1  4 23:45 rake@ -> /opt/local/bin/rake1.9
lrwxr-xr-x  1 root  admin      22  1  4 23:45 rdoc@ -> /opt/local/bin/rdoc1.9
lrwxr-xr-x  1 root  admin      20  1  4 23:45 ri@ -> /opt/local/bin/ri1.9
lrwxr-xr-x  1 root  admin      22  1  4 23:45 ruby@ -> /opt/local/bin/ruby1.9
lrwxr-xr-x  1 root  admin      24  1  4 23:45 testrb@ -> /opt/local/bin/testrb1.9


この仕組みを利用するとruby20, ruby186といった複数バージョンのrubyのパッケージを全てインストールしておき、サフィックスなしのコマンドで起動するバージョンを選択できるようになります。

$ port select --list ruby
Available versions for ruby:
 none
 ruby19 (active)
 ruby20

で選択可能なバージョン一覧を表示できます。

$ port select --show ruby
The currently selected version for 'ruby' is 'ruby19'.

で、現在選択されているバージョンが表示されます。

ruby19からruby20への切り替えの様子。すばらしい!

$ ruby --version
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12]
$ port select --set ruby ruby20
Selecting 'ruby20' for 'ruby' succeeded. 'ruby20' is now active.
$ port select --show ruby 
The currently selected version for 'ruby' is 'ruby20'.
$ ruby --version
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin12]