PureScript ver. 0.7.0 以上で “ブラウザーで” Hello, World!

先日の記事では Node で Hello, World! するところまでできた。では、それをブラウザーで動かすにはどうするんだって思って調べてうまくいったのでまとめる。

CommonJS

psc コマンドで吐いた Javascript には require 関数が使われてて複数のファイルに分かれていてこいつどうするんだって思ってたんだけど、これは CommonJS っていう仕様なのね。ブラウザーは CommonJS に対応してないので(全部がそうか調べたわけじゃないけど)こいつをなくす変換をする必要がある。

Browserify

require ブラウザー」とかで検索すると Browserify (とか RequireJS)が引かっかるのでそれを使うのかと思ったんだけど、これを使わなくていいみたい。

psc-bundle

この WikiPureScript Without Node」に書いてあって psc-bundle コマンドを使えばいい。psc をインストールしたときについてきているはず。このコマンドを使うとモジュールに分かれた JS を1つにまとめた JS にしてくれる。

> psc-bundle output\*\*.js --module Main --main Main -o main.js

--module オプションと引数で、どのモジュールがエントリーポイントなのかを指定する。そのモジュールから辿れない関数は成果物から除去される。このオプションがなければ依存モジュールの全部の関数が成果物に含まれる。

--main オプションと引数で、実行される main 関数のあるモジュールを指定する。JS 読み込み時に実行したいわけではなかったらこのオプションは要らない。

-o オプションと引数でどのファイルに出力するかを指定する。なければ標準出力に出力される。

残りの引数には psc コマンドで生成された JS を指定する。

これで先日の Main.purs をコンパイルした JS をバンドルすると下記 JS が生成される。

// Generated by psc-bundle 0.7.1.0
var PS = { };
(function(exports) {
  /* global exports, console */
  "use strict";

  // module Control.Monad.Eff.Console

  exports.log = function (s) {
    return function () {
      console.log(s);
      return {};
    };
  };
 
})(PS["Control.Monad.Eff.Console"] = PS["Control.Monad.Eff.Console"] || {});
(function(exports) {
  // Generated by psc version 0.7.1.0
  "use strict";
  var $foreign = PS["Control.Monad.Eff.Console"];
  var Prelude = PS["Prelude"];
  var Control_Monad_Eff = PS["Control.Monad.Eff"];
  exports["log"] = $foreign.log;;
 
})(PS["Control.Monad.Eff.Console"] = PS["Control.Monad.Eff.Console"] || {});
(function(exports) {
  // Generated by psc version 0.7.1.0
  "use strict";
  var Control_Monad_Eff_Console = PS["Control.Monad.Eff.Console"];     
  var main = Control_Monad_Eff_Console.log("Hello, World!");
  exports["main"] = main;;
 
})(PS["Main"] = PS["Main"] || {});

PS["Main"].main();

そして下記の HTML ファイルを生成してブラウザーに読ませると無事ブラウザーのコンソールに Hello, World! が表示される。

<html><head><script type="text/javascript" src="main.js" ></script>

参考

PureScript ver. 0.7.0 以上での Hello, World!

PureScript 0.7.1.0 で Node でコンソールに Hello, World! するところまでできたのでそのまとめ。

実例による PureScript を読んで勉強していたんだけど、先月終わりのバージョンアップの関係でそのままでは動かなくって調べたんでまとめる。英語の本家の方のドキュメントもこれから対応させていくらしい。

コマンドは Windows コマンドプロンプトのを使っているので UNIX 系の人は適宜読み替えること。

環境構築

用意するものは、PureScript コンパイラー(psc)と Node(NPM も使う)と Bower。(好みによって Cabal も。)NPM と Bower (と Cabal)がどういう使い分けをされてるかは以下な感じ。

  • NPM
    • Bower のインストー
    • Grunt のインストール(自分はまだ使ってない)
    • 開発ツールの管理に使うっぽい
  • Bower
    • purescript-prelude のインストー
    • ライブラリーの管理はこっちでするっぽい
  • Cabal

psc のインストー

Homebrew なり Chocolatey なり NPM なり Cabal なり、直接バイナリーをインストールするなりする。詳しくはこちら

Cabal というか Stack が楽なので Stack でインストールする方法は次の通り。

Stack はここからバイナリーをダウンロード。stack setup して、stack install purescript すると Stackage にないファイルが必要だといわれるのでそれを設定ファイルに記述する。設定ファイルの場所は Windows なら %USERPROFILE%\AppData\Roaming\stack\global\stack.yaml。さっきのエラーにファイルの場所が書かれている。設定ファイルに追記するものもエラーに書かれているのでそれを下記のように追記する。

extra-deps:
    - aeson-better-errors-0.9.0
    - bower-json-0.7.0.0
    - boxes-0.1.4
    - pattern-arrows-0.0.2

で、もう1度 stack install purescript するとインストールされる。どこに実行ファイルが保存されたかが表示されるのでパスを通す。

Node と NPM のインストー

apt-get なり Homebrew なり Chocolatey なり直接インストーラーでインストールするなりする。

Bower のインストー

> npm install -g bower

Hello World プログラム

下記が 0.7.0 以降での Hello World プログラム。Main.purs で保存する。

module Main where

import Control.Monad.Eff.Console (log)

main = log "Hello, World!"

0.7.0 より前のは下記。

module Main where

import Debug.Trace

main = trace "Hello, World!"

0.7.0 での変更点から今回のプログラムに関係するものを取り出すと下記になる。移行ガイドもある。

  • Debug.Trace モジュールは Control.Monad.Eff.Console モジュールに置き換えられた
  • psc に標準ライブラリーがついてこなくなった

コンパイル

先のプログラムが依存するモジュールをインストールする。

> dir
Main.purs
> bower install purescript-console
> dir bower_components
purescript-console
purescript-eff
purescript-prelude

コンパイルする。

> psc --ffi 'bower_components\purescript-*\src\**\*.js' 'bower_components\purescript-*\src\**\*.purs' Main.purs
> dir output
Control.Monad.Eff
Control.Monad.Eff.Class
Control.Monad.Eff.Console
Control.Monad.Eff.Unsafe
Main
Prelude

実行

生成された output\Main\index.js ファイルを見ると main 関数をエクスポートするだけのプログラムになっているので、実行する Javascript を書く。ここでは main.js としておく。

require("Main").main();

Node で require するためのパスを指定して実行する。

> set NODE_PATH=%cd%\output
> node main.js
Hello, World!

参考

stack コマンドを使ってみた

6月9日に FP Complete から stack コマンドがリリースされました(公式ブログ)。とりあえずブログ1文目を訳すとこんな感じです。

stack は新しく、完璧で、クロスプラットフォームで動作する開発ツールで、新参も古参も対象にしていて、コンパイラーをインストールしてセットアップして、必要なパッケージをインストールして、ビルドして、プロジェクト内の1つ以上のパッケージのテストをするもしくはベンチマークを取るためのものです。

stack is a new, complete, cross-platform development tool aimed at both new and experienced Haskell developers alike, for installing and setting up the compiler, installing packages needed, and building, testing or benchmarking one or more packages in a project at a time.

とりあえずこれさえ入れておけば Haskell に必要なコマンドはこれで完結するというような謳い文句です。1つのプロジェクトをビルドしたら別のプロジェクトがビルドできなくなったというようないわゆる deps hell も解決すると書かれています。

stack コマンド

stack ghcGHC が起動します。インストールされていなければダウンロードしてインストールからしてくれます。同じように stack ghcistack runghc が使えます。

stack build でプロジェクトのビルドができます。設定は stack.yamlproject-name.cabal ファイルに書きます。stack は cabal を置き換えるものらしいですが、.cabal ファイルは使うようです。

cabal install に当たるようなコマンドはなさそうです。

設定ファイル

.cabal ファイルは cabal が使っていたものと同じです。stack.yaml は Stackage のどのバージョンを使用するかを表す resolver が必須になります。なので、最低限下記な感じ。

resolver: lts-2.13

Stackage に存在しないパッケージを利用する場合は extra-deps を追記します。

extra-deps:
- foo-1.2.3.4
- bar-9.8.7.6

パッケージ

インストールされるパッケージは、GHC と一緒についてくるものについては global に、Stackage にあるものについては snapshot に、extra-deps で指定したものについては local に保存されます。global には追加では一切パッケージは保存されなくて、snapshot はプロジェクト間で共有、local はプロジェクトごとに固有になっていて、deps hell を避けるようになっています。

感想

とりあえず Windows での Haskell 環境がめっちゃ楽になったぞい、です。

詳しい内容はこの辺Wiki を見てください。

ちなみにまだバージョン 0.0.0 ですが、0.1 が出ると tanakh さんがもっと詳しい記事を書いてくれると思います。

今見たら 0.0.1 は欠番?で 0.0.2 が出てた。

(2015.06.25 追記) tanakh さんがもう少し詳しくて新しい情報をまとめてくれました。

TEX Yoda TrackPoint Keyboard が来た&組み立てた

トラックポイントが付いてて Cherry MX スイッチなキーボードがクラウドファンディングで買えたのでポチった。

TEX Yoda TrackPoint Keyboard ってやつです。 特徴としては下記な感じ。

  • Cherry MX スイッチ(注文時に何色か選べる)
  • トラックポイント
  • 自分で組み立て(追加料金で組み立て済みもあった)

1月30日に購入して4月3日にアメリカ合衆国から発送されてドイツ経由で到着が4月15日。事業を始めたいっていうクラウドファンディングじゃなくて共同購入みたいな感じで購入者が多くなるほど廉くなるっていうしくみで、お値段 $199.99、送料込みで $261.47 でした。あと、日本の消費税が1000円と税関手数料が200円でそれは配達に来た郵便局員に手渡しました。消費税はどういう計算なんだろう…… そもそも税関で値段分からないような?

クラウドファンディングのサービスのロゴの入った箱とシールで来ました。

税関で箱開けられたみたいで郵便局のシールがその上に貼られてました。

量産品じゃないので TEX Beetle ってやつの箱に入ってました。

中身は筐体と回路基板とスイッチとキートップで、スイッチを1つずつ基板に半田付けしていきます。

スイッチをアルミ板にはめていって基板の穴にスイッチの端子を通したところ。キーの2倍の数の端子を穴に通さなくっちゃいけなくて結構手間取りました。

せっかく自分で半田付けするんで、秋葉原千石電商で追加のスイッチを買って場所によってスイッチを変えてみました。基本はキーボードと一緒に届いた黒軸で、修飾キーには黒より軽い赤軸を、マウスボタンにはクリック感のある茶軸を使ってみました。修飾キーを軽くしたのは小指で使うからで、マウスボタンはクリック感のあった方がいいかなとなんとなくです。追加のスイッチだけで2500円。

ここに組み立て手順書があるんですけど、単に「LED を付ける」って書いてあるところで実はスペーサーをかますべきだったみたいでした。後からパーツが余ったので気付きました。ただ、キートップが黒だとキーに埋もれるように LED が来てしまって分かりにくいのでスペーサーをかまさなかったのはわりとよかったです。

後はキートップを被せて完成。元々使ってた Filco Majestouch と。

裏に DIP スイッチがあって修飾キーの配置を変えられるので、OS でのリマップではどうにもならない Fn キーの位置だけを好みの場所に合わせました。

ちょっと値段が高かったけどトラックポイントが結構快適で満足な買い物でした。

一つ、箱の中の仕切りの紙がなぜ鏡文字だったかだけが謎。

Krile をビルドする手順

この記事は Krile Advent Calendar 2014 の8日目の(7本目の)記事です。

ふと、Krile をビルドしてみようかなと思いました。せっかちな人は最後の項だけ見ればいいです。ここに書いてあるのは最短手順ではないです。自分のしたことを辿っています。

きっかけ

Krile Advent Calendar 2014 を見付けます。Visual Studio Community 2013 がとりあえずインストールだけされてあります。

ソースコードを落とす

GitHubソースコードがあります。Git 環境は適当に調えなさい。

$ git clone git@github.com:karno/StarryEyes.git

Visual Studio Community 2013 をインストールする

ここからダウンロードして、インストーラーを起動すればよいです。分からないオプションは全部チェックしとけばいいんじゃないですかね。

VS 2013 Express が入ってたらアンインストールした方がよさそうです。

自分の環境では Language Pack のインストール中に下記のエラーが出て、新規にインストールした Community と前から入ってた Express をアンインストールしてから再度インストールしてみましたが結局日本語化できませんでした。

プロジェクトを開く

git clone したリポジトリーのルートディレクトリーにある StarryEyes.sln ファイルを VS で開きます。

おもむろに、緑色の再生マークのアイコンのある Start ボタンを押します。エラーです。

Error    1   An exception occurred during a WebClient request.   StarryEyes.Nightmare
Error   2   The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568. C:\Users\kazuki\Programming\StarryEyes\StarryEyes.Albireo\StarryEyes.Albireo.csproj 108 5   StarryEyes.Albireo
Error   3   Metadata file 'C:\Users\kazuki\Programming\StarryEyes\StarryEyes.Albireo\bin\Debug\StarryEyes.Albireo.dll' could not be found   
…

めくるめくエラー

エラーメッセージ内のリンク先を見ます。.NET の知識皆無でよく分かりません。

git submodule が使わてることに気付きます。

$ git submodule init
$ git submodule update

アップデートのある NuGet のパッケージをアップデートします。エラーが変わります。

なんか MahApps ってやつが使われていることに気が付きます。VS の Tools > NuGet Package Manager > NuGet Packages for Solution... からインストールしてみます。エラーがまだあります。git submodule で参照してるものが MahApps だったことに気付きます。さっきインストールしたパッケージを消します。

Error    1   The tag 'MetroWindow' does not exist in XML namespace 'clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro'. Line 1 Position 23.    C:\Users\kazuki\Programming\StarryEyes\StarryEyes\Views\Dialogs\AuthorizationWindow.xaml    1   23  StarryEyes
Error   2   The tag 'ProgressRing' does not exist in XML namespace 'http://metro.mahapps.com/winfx/xaml/controls'. Line 21 Position 14. C:\Users\kazuki\Programming\StarryEyes\StarryEyes\Views\Dialogs\WorkingWindow.xaml  21  14  StarryEyes
Error   3   The tag 'MetroWindow' does not exist in XML namespace 'clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro'. Line 1 Position 23.    C:\Users\kazuki\Programming\StarryEyes\StarryEyes\Views\Dialogs\KeyOverrideWindow.xaml  1   23  StarryEyes
…

XAML の中で独自クラスをタグとして使うところでなにか失敗してるなーぐらいしか分かりません。とりあえず、その線でググってみます。(ビングりはしません。)

あきらめます。

昼寝します。

起きます。

最初からトライ

$ git reset --hard
$ git submodule init
$ git submodule update

ディレクトリーをまっさらにします。

VS で Start します。

Krile が起動します。

やったね。

最近ミニ四駆がアツすぎるんだが #mini4wd

この記事はミニ四駆アドベントカレンダー 2014 の1日目の記事です。

「『ミニ四駆』そういえばそんなものもあったなぁ」という人向けに、「最近こんなんなっとんねんで」というのを伝えられたらなぁと思って書いています。

【おさらい】そもそもミニ四駆とは

こんなコースで

f:id:kakkun61:20141201225203j:plain

こんな模型を走らせます。

f:id:kakkun61:20141201223739j:plain

  • 手を離したら見守るだけ
  • 事前のセッティングが命

な遊びです。

15年前、25年前に2度のブームがあり、ダッシュ四駆太郎や爆走兄弟レッツ&ゴー!!などの漫画・アニメがはやりました。

爆走兄弟レッツ&ゴー! !  Blu-ray BOX

爆走兄弟レッツ&ゴー! ! Blu-ray BOX

ちなみに私がコロコロコミックを買ってもらいだしたころはレッツ&ゴー!!終わってましたし、アニメは電波が届きませんでした。なので、あんまりなつかしさがなかったりします。

で、今、第3次ブームと呼んでもいいんじゃないかという風が吹いています!

1988年から1999年まで12年間続いたジャパンカップが、2012年に13年ぶりに復活!

f:id:kakkun61:20140424163019j:plain

ミニ四駆、30年以上も続いたホビーですが今なお進化しつづけています。今のミニ四駆がどんなかを紹介しましょう。

2014年のミニ四駆とは

まず、驚くのがミッドシップ

f:id:kakkun61:20141201225607j:plain

モーター・電池を真ん中に置き、モーター軸の両端から車軸に運動を伝達します。もちろん今まで通りのシャフトドライブのシャーシにも新型が出て使われています。

次に大きく異なるのが、「制振」です。

昔はコロコロコミックに踊らされてとりあえず肉抜きをし、いかに軽くするかを考えていました。

それが今は、重りが載っています!

f:id:kakkun61:20141201231029j:plain

というのもコースに「立体」というものがあり、それをどう制するかの中で考え出された改造なのです。

f:id:kakkun61:20141201231700p:plain

このコースは左の山を駆け下りてそのままジャンプします。この重り、上下方向には固定されておらず自由に動くようになっています。ジャンプ後の着地でこの重りを跳ねさせることにより衝撃を逃がしてマシン自体の制振をしようというマスダンパーなのです。

もちろん今でも「平面」のコースもありますし、軽量化は大事な要素には変わりありません。

ほんとにはやってんの

正直、レッツ&ゴー!!の2次ブームほどではないです。ただ、去年の東京大会だと13時に会場に着いてもエントリーできたのに、今は9時に来るとエントリーを締め切られていることもあるくらいで、結構な速さで人が増えていっていることは確かです。

また、コロコロアニキという漫画雑誌が刊行され、大人になった烈と豪が漫画になったり、2015年3月15日発売予定のコロコロアニキ2号には、小学生当時にミニ四駆のデザインをし「シューティングスター」として採用された漫画家武井宏之さんによる連載「ダッシュ!四駆郎」が始まります。

これ以上人気が出ると大会の朝が早くて困るなぁというのもあるのですが、ミニ四駆楽しいので1000円にぎって模型屋さんに行ってみませんか?

ミニ四駆ステーション&ミニ四駆販売店 一覧