PharoでSeasideを動かす

以前SqueakでSeasideを動かそうとしたことがありましたが、途中でエラーが出て放り出したので、今回改めてPharoでSeasideを動かしてみました。

Seasideでアプリケーションを動かす

実装する内容として先日会社で素数チェッカがどうこうという話を聞いたのでそれでやってみようと思います。どこかにあるチェッカでは大きい数字のチェックができないというのに加えて実行時間がかかるとかいう話もあったので、Smalltalkならば、ということで勢いで動かす企画です。

Pharoを入手する

まずPharoを動かさないと始まらないので、ダウンロードしてきます。
https://pharo.org/

最初にPharo Launchcerが立ち上がるので、Pharo7(64bit)あたりを動かします。一度起動してしまえば、あとは普通のPharo環境でした。以降は別のバージョンのイメージを使うのでない限りLauncherは不要で、いつも通りにimageをvmに食わせて起動する感じの使い方ができそうです。

Seasideを入手する

次にPharo上でSeasideをアプリケーションサーバとして動かしたいのでそれを用意します。昔はもうちょっとインストールが面倒だった気がしましたが、今ならgithubから直接インストールできるようで一発で入ってしまいました。
http://www.seaside.st/

Metacello new
  baseline:'Seaside3';
  repository: 'github://SeasideSt/Seaside:master/repository';
  load

ここまでで http://localhost:8080/ にアクセスすると、Seasideのトップページが開きます。

コンポーネントを追加する

ビューのクラスを追加します。ここでは PrimeCheckerView としました。

WAComponent subclass: #PrimeCheckerView
  instanceVariableNames: 'number result'
  classVariableNames: ''
  package: 'Seaside-Sample'

作ったビューをurlとして参照できるようにします。

WAAdmin register: PrimeCheckerView asApplicationAt: 'prime'

これで http://localhost:8080/prime のURLができました。

あとは細かい実装をまとめて埋めていきます。

PrimeCheckerView>>number 
  ^number.

PrimeCheckerView>>number: anInteger
  number := anInteger.

PrimeCheckerView>>result 
  ^result.

PrimeCheckerView>>check 
  result := number asString, (number isPrime
    ifTrue: [ ' is a prime number.' ]
    ifFalse: [ ' is not a prime number.' ])

PrimeCheckerView>>renderContentOn: html
  html form: [ 
    html text: 'Number:'.
    html textInput 
      callback: [ :value | self number: value asInteger ];
      value: (number ifNotNil: [ number asString ]).
    html break.
    html submitButton 
      callback: [ self check ];
      value: 'Check!'.
    html break.
    result ifNotNil: [ html text: result ] ]

これでSeasideでアプリケーションを動かすところまでできました。

Screenshot

まとめ

あっという間にできてしまってちょっと拍子抜けですが、 renderContentOn: を細かく見ていくと時間がかかりそうです。

本来ならばこのあと、dockerでnginxを動かしてリバースプロキシするところもあるのですが、眠いので次回。