NixOS + haste-complier

なんだらう
ちょっといま いい氣分なので 少し書かうかな と思ふ


hasteの入れかた

ちなみに ここは書いてゐるうちに 追加しやうと思ったのだが
現在hasteを入手するには

sourceforge.net

でダウンロードして
linuxの環境下で 解凍したフォルダにある install.sh といふファイルを

sudo ./install.sh

で 實行し /user/local/bin にPATHを通すのが 一番手取り早いと思ふ
この install.sh は 中身を見れば分かるのだが 單に 解凍したフォルダ内にある實行ファイルを /user/local/binなどのフォルダにコピーしてゐるだけだ
これで hastec といふプログラムが利用可能になる
たとへば haskellでつくったコードが Main.hs といふ名前だとすると

hastec Main.hs

とするだけで
Main.js
といふ javascriptコードができてしまふのだ


ここまでが追記

hasteへの思ひ

hasteは haskellのコードから javascriptを生成するものだ
私にとって 本當なら haskellのコードで ブラウザ(ネットを見るソフト)に いろいろできれば それが一番いい
例へば haskellブラウザゲーム(ネット上で動くゲーム)を書き それがそのまま ゲームとして動けば 一番いい といふことだ
だが 現状はさうなってゐない
javascriptでブラウザを操作するのが一般的だと思ふし 最近でてきた web assembly を使ふ方法は 敷居がちょっと高いと思ふ
肌感覺を言へば haskellまはりは 最近 haskellコードから web assembly (ブラウザが理解できて早く動くコード) を作らう といふ方向で 動いてはゐる
でも まだまだ ちょっと haskell で SDL2(ゲームをつくるのに向いてゐるライブラリ(プログラム))を使って つくったゲームを そのまま web assembly にして ブラウザで實行する(しかも ほぼ自動的に) といふ段階ではないかな と感じてゐる
それより 今ある環境で なるべくなら「ゲームをつくるための環境ゴチャゴチャ設定」にあまり時間を使はずに 「ゲームをつくってやってもらふこと」に専念したい と思ふわけだ
「なら Unity つかへよ」 だと?!
私は haskell で書きたいのだ
それが 「ゲームをつくってやってもらふこと」より 優先するのだああああ!(狂)
・・・・・
すると 私にとって haste は重要なプログラムになってくる
私がつくって web上にアップした HA とか Fi とかいふアプリは hasteで haskellコードから javascriptコンパイル(まあ 變換みたいなもん) された
同じやうなことをするプログラムにghcjs といふものがある
たぶん haskell界隈では haskellコードをjavascriptにするなら ghcjs といふ感覺が一般的だと思ふが 今のところ これは 私には「合はない」
とにかく 色々と向きあってきたつもりだが 「何かよくわからない」「そもそもインストールできない」「インストールしても それからどうするのか 分からない」
haste は 最終的に更新されたのが4年くらい前
比べて ghcjs は 去年に一應更新されてゐるが
ghcjsにしても 「積極的に更新されてゐて 誰でも手軽に使はれるやうになることが 目ざされてゐる」やうには どうしても見へない
なんといふか 直感的に ghcjsといふのは 大きな會社で利用されてゐて その會社でしかなかなか知ることができない 設定方法や ノウハウが蓄積されながら それが いってみれば「オープンにはしてゐるが 素人に手が出せない」やうな状態に置かれてゐる氣がする
一方hasteは 一時は ホームページごと見られなくなる始末で なぜか今は回復してゐるものの 實行ファイルのダウンロードができてゐたリンクは 削除されてゐる
私から見ると Haskellの達人さんが hasteを改良したはうが ghcjsを改良するより ずっとhaskellコーディングの敷居が低くなる と思ふのにだ
たぶん これは一般的に言へることだと思ふし 存在することだと思ふのだが 企業といふものは その企業の利益にプラスになるやうなことで動く場合が多いので 企業が公表しない 「企業秘密」なんてものも きっとあるのだらう
なんらかの「大人の事情」で hasteが世からはじき出され といふかもっと言へば haskell自體に脚光が集まらず(學んぢゃだめだみたいなレッテルが貼られたり) JavaPython そして c# のやうな言語が世の主流を行く といふことも あり得なくはないんぢゃないかな
まあ 私が haskell好き(別にそれを使ひこなしてゐなくても)なのは ちょっとhaskellが はぐれものだったり(といっても有名な企業でメッチャ使はれてるけど) lazy evaluation (遅延評価と訳されてるけど 評価するのに 「怠けもの」みたいな表現が好き) だったりするところも あると思ふ
日本生まれの tron-os とか それこそ ガラパゴスと呼ばれた 昔のケータイとか
私は さういふものに愛着を感じる・・・ はなしが逸れまくったな

さて
ソース(プログラムコード本體)から ビルド(實行ファイルをつくること)する場合 少なくとも私にとっては 多くの困難が立ちはだかってゐた


hasteビルド體驗記

まず 今のバージョンのNixOS (23.11) のパッケージ(まあ アプリみたいなやつ) に ghc710は存在しない
haste は ビルドする際 ghc(有名なhaskellコンパイラ) のバージョン 7.10.3 くらゐなものが必要なのだが NixOS は ある時點で このバージョンの扱ひを打ち切ってゐる
ただし 古いNixOSのバージョンには この ghc 7.10.3 が入ってゐて NixOSの仕組み上 これをテスト環境で組み込むことができる
NixOSのターミナルで

nix-shell -p ghc -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/5d54038    7713f2d29dac423f5faadafd5aea2ff09.tar.gz

を實行すると このターミナルの中に 「ghc 7.10.3が入ってゐる環境」がつくられる
この環境から出るには ただ

exit

とすればいいだけだ
ちなみに この古いバージョンのghc

lazamar.co.uk

のページへ行き Nix channel が nixos-22.11 のときの Package nameに ghc を入れて検索したら出てきた
さて

git clone https://github.com/valderman/haste-compiler.git

として hasteのソースを入手したら(gitがインストールされてゐる前提)

cd haste-compiler

としてその中に入り

stack install

として成功したいものだが
全然ダメだ
よく分からないエラーがでて 結果對処できなかった
しかし まず

nix-shell -p cabal-install

として この環境下に さらに別の環境 すなはち 「cabal-installといふアプリが入ってゐる」といふ環境をつくることができ
そこで

cabal update

さらに

cabal install

とすると はじめのうち エラーが出ずに 色々インストールされてくる
結構ここでワクワクするのだが・・・
やはり 途中でエラーとなる
しかし エラーログを追ってゆき
「zlib」といふものが必要さうだと分かったら

nix-shell -p zlib

としてアプリ(プログラム?)を環境下に入れる
ちなみに どんなパッケージ(アプリ? プログラム?) が 現行のNixOSに入ってゐるか といふのは コマンドでも確認できないことはないが 時間がかかるので

search.nixos.org

で調べることができる
一應 公式に近いのでは と思ふサイトで 古いものが調べられるところも紹介してをく

history.nix-packages.com

ちなみにさっき紹介した 古いものを調べるサイトは 「公式ぢゃないよ」と書いてあった
それでも てこずったのは
libbz.h がない とか bz2 がない とかいったエラーで
色々インストール(つまりは nix-shellをつかった環境づくり) を試みたが失敗
なんと 全然違ふ名前の

nix-shell -p bzip2

としたら入った
そして あと一歩
haskell-compilerそのものがコンパイルされる あと一歩のところで
「shellmate-extras」がビルドできへん
みたいなエラーが發生
このエラーは 今でも解決できてゐない


今のところ hasteを入れる方法としては
NixOSとしては たぶん「きたない」やり方になると思ふが
始めに追記されてゐるやうに
實行ファイルをダウンロードして インストールスクリプトを實行し PATHを通す(デフォルトでは NixOSは /usr/local/bin にPATHを通してゐない) 方法しか 私にはできなかった
でも 今回の一連の作業で
NixOSのやばさ(すごさ) が垣間見れたやうな氣がする
本格的にシステムにインストールしなくても どんどん自分が必要な環境をつくって プログラムをお試しできたりする なんて これ結構すごくね?
まう全然わけわかんなくなっちゃって こんがらがっても
exit
ひとつで そこから出られる
ぶっちゃけシステムを變へてしまふやうなことをやらかしてしまっても
前のシステム構成に戻れる
あっ ここで一應 前のシステム構成にもどす方法を 私なりに書いておきたい


前のシステムに戻す

なんかこれ NixOSの賣り のはずなのだが
ここでつっかかる人も多いのでは と思ってしまふ
わたしが現に つっかかってゐたからだ
いや この時の操作などで NixOSのブート(起動)に問題が置こり
まるっと Nixをインストールしなおすはめになった 操作でもある
私としても 完全に理解をしてゐないので 私の説明は中途半端かもしれないが
これまでいぢってきた 経験と直感で話すことにする

nix-channel --list-generations

とすると
左に通し番号が そして右に日付とか時間
そして どれかひとつに (current) と書かれてゐる
この current といふのは 「今あんたは ここにゐるよ」
みたいなやつで
コマンドにもある generations といふのは 「なんか 色々つくってきた NixOSの環境のあつまり」 みたいなものだと思ふ
NixOSをインストールすると ブートローダーといふ NixOSを立ち上げるアプリ(?)もインストールされると思ふのだが 通常に立ち上げるのではなく Advanced Option みたいなところを選ぶと たぶん 今ゐる generation の環境が いくつか 新しい順から表示される と思ふ
たとへば 最後にやった設定で問題が起きてしまひ (たとへば 私のやったやうに 間違ったビデオドライバの指定をして 画面が表示されなくなったみたいな)
前の環境に戻りたいときには その Advanced Option から デフォルトで選ばれるひとつ下の環境を選んでやるとよい
そして 正常な環境が戻ったら やっちまった箇所を直して

sudo nixos-rebuild switch --update

とする
この作業をすると たぶん 現行の generation の一番「最近の」環境がつくられるので
次回デフォルトで起動したときには 正常な環境で起動できると思ふ
もっと前の generationに戻りたい といふときは

sudo nix-channel --rollback

といふのが ひとつ前の generationに戻るやつで

sudo nix-channel --rollback 2

とかやると --list-generations のときに左に出てゐた番号のgenerationに戻ることになる
さうして 起動すれば
Advanced Option に 指定したgenerationの環境が並ぶことになるのでは? と思ふ(ここは ちゃんと確かめてない)


こんなところだらうか
最初に氣分が良いといった理由は 「何となく」で
べつに 何かが實現したから とか さういふのではない
でもやはり hasteが NixOSに入り fi の開發ができるのは 嬉しい
いささか風邪氣味だが 明日には治るだらう
それでは このへんで