今からでも遅くない
Smalltalk入門

Pharoではじめよう!

Smalltalk忘年会2017

合同会社ソフトウメヤ 梅澤真史

Borderless

「垣根がない」

いいところ1

プログラミング言語の壁

  • アプリを使う人
    • アプリケーションのユーザ
  • アプリを作る人
    • プログラマ
  • 言語を作る人
    • プログラミング言語開発者

Smalltalkには垣根が無い

「オブジェクトにメッセージを送る」ことで、アプリを作るのみならず、
プログラミング言語そのものを変更していくことができる

「この言語にはこれがないから…」=>「だったら作ればいいじゃん?」

Simple

「シンプル」

いいところ2

ミニマリズムの言語

  • 予約語は 6つのみ
    • nil, true, false, self, super, thisContext
    • あとは「オブジェクトにメッセージを送る」

「こんなふうに短く書けます」的なシンタックスシュガーはない

安易ではなく、簡潔

少ないルールの組み合わせによって何でも作っていける

Direct

「直接つかめる」

いいところ3

動いているオブジェクトに直接触れる

  • メモリにうかんだオブジェクトをメッセージ
    送信で変容させていくスタイル
    • 常にデバッガの中でプログラムを作っているようなもの

Smalltalker的には、テキストエディタに書かれたプログラムは、「ただの文字列」で死んでいる

「動いてないし、ある部分を選択してメッセージを送れない」

自由の世界へ

  • Kent Beckさんの Facebookでの記事
  • “The greater my knowledge, the freer I feel. It’s like walking under a Montana sky instead of being jostled down a narrow, one-way corridor”
  • 知れば知るほど、自由を感じる。狭い一方通行の廊下に押し込まれて進むのではなく、モンタナの空の下を闊歩するようなものだ」

Pharoとは

  • OSSのSmalltalk処理系で最もポピュラー、開発も活発
    • https://pharo.org

  • VMも高速(https://www.slideshare.net/pharoproject/pharo-vm-performance)
  • イメージはWin, Mac, Linuxでバイナリコンパチブル
  • ライブラリも豊富 (Catalog Browserですぐに入る)

Zeroconf Scriptで入れてみる

  • curlやwgetで気軽に入れる
    • http://get.pharo.org

  • 64部分がないと32ビット版になる(が、おすすめしない)

curl get.pharo.org/64/61+vm | bash

wget -O- get.pharo.org/64/61+vm | bash

pharo-ui 起動

./pharo-ui Pharo.image

フォントを日本語に

  • デスクトップのクリックでメニューがでる
    • System -> Settings で Settings Browserが開く (Cmd + os)
    • Search for: の検索窓に'font'と打つ
    • Use Free Type をoffしてonにするとフォントを読む
    • Standard font -> Default の箇所で日本語のフォントを指定して"Force All"のボタンを押す

ライブラリを入れる

  • Tools -> Catalog Browser
    • 検索窓に'soup'と入れてみる
      • 絞り込まれるので
        選択して右クリックし
        "Install stable version"
  • Soup
    • スクレイピング用のHTMLパーサ
      • PythonのBeautiful Soupっぽいもの

特定のリンクを抽出する

  • Playgroudを開く (Cmd + ow)
    • Smalltalkコードを書いて評価するためのツール
  • http://swikis.ddo.jp/squeak の勉強会関連リンクを取り出す
  • テキスト選択して右クリックで "Inspect it"
    • あるいは Cmd + i

soup := Soup fromUrl: 'http://swikis.ddo.jp/squeak'.
((soup // 'a') select: [ :each | each text beginsWith: '第'])

collect: [ :each | each text -> (each @ 'href')]

実行結果は...

画像をまとめて取得し保存

  • "Do it" あるいはCmd + d

soup := Soup fromUrl: 'http://swikis.ddo.jp/squeak'.
baseUrl := 'http://swikis.ddo.jp' asUrl.

dir := './downloads' asFileReference ensureCreateDirectory.

imageUrls :=((soup // 'img') @ 'src') collect:

[:each | baseUrl / each ].

imageUrls asSet do:

[:each |each saveContentsToFile: dir / each file].

実行結果は...

Smalltalk場合、文法よりも体験

  • 難しくはないが異質
  • 習うよりも慣れろ
  • Smalltalk勉強会に参加すると良いことがあるかも

まとめ

  • Smalltalkは古くて新しい不思議な言語
    • 味わっておいて損はない
      • 妥協しないピュアなオブジェクト指向
      • オブジェクトがうごめくライブな環境
  • まずはPharoがオススメ
    • 開発が活発
    • 実プロジェクトも多い
SmalltalkWithPharo - Google Slides