月 の 上

GWでHaskell入門した

日記です。 GWの自由研究でHaskell入門してた。

動機

一つに、同僚の影響がある。 弊社の社員は皆さまざまな言語を書く。 たまに「これはHaskellでいうと○○で〜〜」みたいな会話がされたりして、いつかはやらねばな〜と思っていた。 今年入ってきた後輩もHaskellとかOcamlをバリバリやっていたらしい。 今のチームではScalaを使っているので、関数型言語の概念とか考え方を一度ちゃんと学んだ方が有利に違いない。 入社から丸3年が経過した今、せめて同僚たちの会話をなんとなく理解できるようになりたい。

もう一つの理由は、ライブコーディング界隈でHaskellがよく使われていることだ。 現在ライブコーディング音楽で最も盛り上がっているTidalCyclesや、AltGLSLのHylogenなど、なぜかライブコーディング界隈ではHaskellが好まれている。 簡潔な文法や抽象的な操作が得意なことから、ガリガリ書いて実行していくライブコーディングに向いているのかもしれないが、まあ理由はどうでもいい。

TidalCyclesを使いこなしたりパッチを当てたりするには必須だし、Haskellを書けるようにならんとな〜と考えていた。

やったこと

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

まず、大学生の時買って積んでた「すごいHaskellたのしく学ぼう」(通称「すごいH本」or 「LYAHFGG」)をガッと読んだ。 Kindleには5年前に書いたメモとか残ってて便利。 仕事で1年間Scalaを書いたことで、学生時代よりもスッと理解できた感じがする。

すごいH本を読んで、色々な概念が登場することはわかったけど、まだ動くものを書ける気がしなかった。 というわけで、 Haskell チュートリアル とかでググって出てきた以下の教材をやってみることにした。

48時間でSchemeを書こう - Wikibooks

「48時間でSchemeを書こう」(以下「WYAS48」)は、簡単なSchemeの実行環境を作りつつ、Haskellの書き方を身につける、という教材。 そもそもSchemeの文法がわからない(大学でちょろっとやった)くらいなので、Gaucheで動作を確かめながら写経していった。

レポジトリはこちら。 「IOプリミティブの作成」の章までやってある。

github.com

ただ写経するだけじゃつまらないので、Stackでレポジトリを構成し、Hspecでテストを書いた。

Stackとは

StackはNode.jsでいうnpm、Scalaでいうsbtのようなもの。 ghcのバージョンを指定したりできるので、どちらかというとsbtに近い。 stack buildでビルド、stack testでテストが走る。

Haskellのパッケージマネージャーは、昔はCabalというものが使われていた。 HaskellのライブラリはHackageに公開され、 cabal コマンドでインストールできた。 ただし、Cabalは依存ライブラリを管理するファイルが独自フォーマットだったり、ライブラリの相性が悪いときに依存関係を管理するのが大変だったりした、らしい。

StackはCabalをラップして使いやすくしてくれる。 (正確には、StackはHpackというCabalラッパーを利用している)

StackにはStackageという仕組みがあって、これを使うとライブラリの相性を考える必要がなくなる。

Stackage は Stable Hackage の略で、どんな組み合わせでも依存関係でエラーが起きないように調整されたパッケージの集合 (スナップショット) を提供しています。

頭いいなー。 Stackageのバージョンは、stack.yamlresolver: lts-9.21 のように指定できる。

環境構築

まずstackをインストール。

$ brew uninstall --force cabal-install ghc # 紛らわしいので事前に消しておく
$ brew install stack

次にAtomHaskell関連のパッケージを入れる。 Atom-Haskellというプロジェクトがあって、Haskell用の便利パッケージがいくつも公開されている。 (コード補完、Linter、型チェック、コード変換、ドキュメント検索など)

atom-haskell パッケージを入れると、関連パッケージをまとめてインストールしてくれる。

atom-haskell.github.io

続いて、パッケージが依存しているライブラリをstackでインストールする。

$ stack install stylish-haskell
$ stack --resolver lts-9 install ghc-mod

ghc-mod は最新のStackageだと動かないので (ghc 8.2に対応していない)、 --resolver lts-9 を指定する必要がある。

最初、↑のWebサイトの存在に気付かず、自力でghc-modとかをインストールした所エラーが出まくってめっちゃ詰まった……

WYAS48学習メモ

  • ghc-modハマった
    • stack.yamlresolver: lts-9.21 としないとビルド通らない
    • dist/ があるとghc-modが動かないので消しとく
  • Control.Monad.Error 使ってるとこに Use Control.Monad.Except instead とメッセージ出るけど、こういうことっぽい
  • Hlintの声に従ってコードを整理していくと、どんどんコードの密度が高くなる……
    • liftM List $ load filenameList <$> load filename になる
  • maybe関数の引数の順序難しい
    • maybe (失敗した場合に返す値) (成功した場合に値を適用させる関数) (Maybeモナド) の順番
    • Scalafold に似てる?
  • モナド変換子、頭爆発するかと思った
  • doブロックで別のモナドを使うと怒られる
  • IORef使うと何故かHaskellの世界の外にグローバル変数みたいなのを作れる
  • テストでは unsafePerformIO 使ってIOモナドの中身を取り出してる
    • doブロックを抜けるとIORefで作った参照も壊れる?

感想

いろんな新しい概念を覚えるのは楽しいですね。 モナドとか型クラスとかは、Scalaでなんとなく存在を理解してたつもりだったけど、Haskellの方が実装が素直な気がする。 (Scalaの型クラス、ノールックで実装できない……クソザコ人材なので……)

すごいH本に出てきたZipperとかは、言語というより実装の知恵という感じで、デザインパターンを初めて学んだときと似た感じを受けた。 こういう先人の知識を組み合わせて問題を解くの、遊戯王カードやってるみたいな気持ちになる。

あとAtomでの開発環境構築はScalaの500倍楽だった。

やりたいこと

とりあえず夏のあいだにどれかやりたい:

  • CLIツールかなんか作る
  • Webアプリ作る
  • PureScript (Haskell風AltJS) で遊ぶ
  • TidalCyclesにPR送る

今年は他にもMUSTで学ばないといけない事があるので、目標は低め……。 (仕事でUnityとかTouchDesignerをやる可能性がある)

なんかオススメのタスクあったら教えてください。

参考URL

GLSLライブコーディングについて講義しました

去る2018/04/28(土)、GLSLライブコーディングのワークショップを開催しました。

資料について

speakerdeck.com

サンプルファイル: GitHub - fand/veda-toplapjp02

ワークショップは、こちらの資料を参照しつつ、サンプルファイルを手元で実行して学習する、というスタイルで進行しました。 サンプルファイルには、あらかじめ様々な処理がコメントアウトされた状態になっています。 これらのコメントを一つずつ外して実行することで、講義内容を段階的に学べるようになっています。

講義はまず、GLSLとは何か?から始まり、フラグメントシェーダーによるシェーダーアート1の基礎、動画エフェクトとしてのGLSLの利用法を学びます。 続いて、頂点シェーダーを利用したシェーダーアートについて紹介し、最後に音声入力を利用したエフェクトについて学びました。 GLSLを書いたことがない人でも、ライブコーディングパフォーマンスが出来るようになる、というのを目標にしています。

動画素材はbeepleから、3Dモデルはturbosquid等からライセンスフリーのものを拝借しました🙏

もっと詳しく学びたい方へ

GLSLを触るのが初めてという方は、The Book of Shadersを読みましょう。 こちらはWebサイト上でコードを編集しつつ実行して学べる教材になっています。

The Book of Shaders

より高度な表現を学びたい方は、wgld.orgのGLSLに関する記事を読むと良いです。 シェーダーアートで頻繁に使われるレイマーチングという手法を学べます。

wgld.org | GLSL |

また、つい最近東京でUnity向けシェーダーアートについての発表がありました。 こちらはGLSLではなくHLSLとなりますが、基本的な考え方はGLSLでも通用しますので、参考にしてください。

setchi.hatenablog.com

講師として心がけたこと

今回のワークショップは、moxusさんとDMして「1時間だと厳しいので2時間で行きましょう」と決定したのですが、資料を作り始めると(あれ……?2時間で教えるのメッチャ厳しくね……?)という事に段々気がついてきた……。 GLSLは奥が深く幅の広い技術ですが、今回はライブコーディングに的を絞り、本来の3DCGにおける役割や、OpenGL/WebGLでの利用法の解説は完全に省きました。 また、なるべく時間を節約するため、受講者にはあらかじめVEDAのインストールをお願いしておきました。

(ハンズオン等では、最初の環境構築に時間を取られることが多いので、自己紹介の前に資料URLやサンプルファイルを共有しておくと便利です)

僕は昨年末にも GLSLスクール の講師を行った事があるのですが、その時とはかなり状況が異なるので、資料はほぼ一から作り直すことになりました。 GLSLスクールでは、受講者はGLSLの基本文法については把握しているという前提だったので、僕はライブコーディング文化や、VJパフォーマンスを行うためのTipsを教えることに集中できたのです。

今回は、講義のはじめに「わからなくても気にしない」というスローガンを掲げました。 GLSLはC言語ライクな文法と言いつつ、いろいろと独特な言語なので、初歩でつまりがちです。 文法について一々説明しておくと時間が足りませんし、あとでゆっくり資料を参照すれば済む話です。 せっかくワークショップに参加していただいているので、言語についての知識よりも、どのようにパフォーマンスを行うか、体験で掴んでもらうということを目標にしました。

(メチャクチャ雑に言うと、「GLSLには様々な関数があり、様々なことができる」ということを体験してもらえれば良い)

なんかこれデジャヴュ感あったので、去年のReactハンズオンの資料を見直してみたら、だいたい同じこと言ってた。

資料作成、意外と手間取ってしまって、当日の朝7時まで徹夜で作ってたので、後半は口調がフランクになったり解説が雑になってるかもしれない……

僕がGLSLライブコーディングを知って1年が経った

僕がGLSLライブコーディングの世界に興味を持ったのは丁度一年前。 2017/04/29に六本木でチャネル#16を観たことがきっかけでした。

blog.gmork.in

それから一年、ライブコーディングの世界に惹かれて、GLSLの学習やVEDAの開発を続けてきました。 たった一年ですが、色々なイベントに出演させていただいたり、ワークショップの講師として声をかけていただくことがあり、幸甚の至りです。

今回のワークショップは、初心者にGLSLの世界を広めるだけでなく、僕自身にとってもライブコーディング文化について知る良い機会となりました。 参加者の皆様、主催の moxus 様、ありがとうございました!


  1. 僕はGLSLなどのシェーダーを用いたアート作品やパフォーマンスを「シェーダーアート」と呼んでいます。参考: GLSLによるシェーダーアートことはじめ