CoffeeScriptのコンパイル方法とか資料を調べてみた

大ざっぱにまとめ

  1. browser で直接コンパイル
  2. coffee-script.js を利用して手動でコンパイル
  3. 自動で watch してコンパイルして serve してくれる便利フレームワーク

くらいの方法があるみたい。

browser で直接コンパイルして実行

とりあえず動かす分にはこれでも大丈夫。本家ドキュメントにもしっかりこの使い方は書かれている。

コマンドラインでコンパイル

npm の coffee コマンドでコンパイル

browser で直接コンパイルして実行するのは遅いので事前に .js に変換したい。そういう場合は npm で

npm install -g coffee-script

でインストールできる

coffee

コマンドを使うのがいちばんの王道。

Windowsの場合

2011-08-13 現在 Windows では npm は動かない(node.exeはある)ので、他の方法を考える必要がある。

CoffeeScript on Windows? - Stack Overflow

だいたい以下の方法に落ち着くみたい。

  • WSHを使う方法
  • 海外では jsdb.exe が比較的人気?
  • 日本では NILScript が比較的人気?

具体的にはこの辺。

CoffeeScript-Compiler-for-Windows は本家からも参照されている。

ruby からエンジンをいい具合に選んでコンパイル

  • ruby をすでに使っていて
  • gem が使えて
  • なんらかの JavaScript エンジン(含む node.exe)は入っている
  • しかし npm は使えない

この場合は、わざわざ別途 JavaScript エンジン付きのコンパイラをインストールする必要はない。以下の gem を利用すればそのとき使える適当な JavaScript エンジンを利用してコンパイルしてくれる。

josh/ruby-coffee-script - GitHub

こいつは本家の Rakefile にある coffee-script-source gem を利用している1ので、上に挙げたような独自コンパイラ実行環境を使うよりは、古いバージョンを使い続ける可能性が少し低いので安心かもしれない。

使い方は以下のような感じ。

ruby -r coffee-script -e \
  'puts CoffeeScript.compile( open("/path/to/script.coffee"), opts )' \
  > /path/to/dest.js

Windows の cmd.exe だとこう。

ruby -r coffee-script -e \
  "puts CoffeeScript.compile( open(\"/path/to/script.coffee\"), opts )" \
  > /path/to/dest.js

node.exe が入っていればちゃんと Windows でも node.js を利用してコンパイルしてくれる。

自動でコンパイルしてほしい

毎回手でやるのは面倒くさいしばからしい。

npmが使えるなら

coffee --watch

で ok

Rubyなどのいい具合にしてくれるフレームワークを利用する

あくまで Web 上での利用でとにかく楽をしたい場合は上のコードを透過的に実行してくれる

  • Rails 3.1+
  • Middleman

なんかがオススメ。

どっちも Windows には厳しいけど。

CoffeeScript でテストを書く

mhevery/jasmine-node - GitHub

とかで利用できる。

素の jasmine は rspec に比べるとだいぶしんどい感じなので、CoffeeScript で書けるとかなり嬉しい気がする。そのままだと rake に統合できなかったりブラウザでテストしたい場合とか考えると Rails プロジェクトなんかだと逆に面倒かもしれないけど、昨今の JavaScript の応用範囲の広さはハンパないので、いろんなシーンで検討の余地はありそう。

資料

文法など

その他の環境など

本家の情報がだいぶ充実してる

  1. CoffeeScript の開発には Ruby が使われてるわけです 

VirtualBox の設定ファイルを簡単にバックアップするツールを作って公開する過程で分かったこと

まとめ

  • bin/ ディレクトリに置いて gemspec の exectables に入れてやれば Rakefile も実行ファイルとしてインストール可能
  • github で gem を公開するには repository の設定で [ Rubygem ] にチェックを入れて gemspec を push するだけ

cutagem 簡単だし依存も少ないし、いいよ! PHP で Pear パッケージ作るより楽だと思うよ!

vbox_tools

wtnabe's vbox_tools at master - GitHub

昨今なんでもかんでも rake でやりたい病の wtnabe です。今回は VirtualBox の設定ファイルのバックアップの取り回しを rake でやります。

背景

なんでこんなもん作ったか。

  • VirtualBox はバージョンアップで xml ファイルに非互換が入る場合がある
  • VirtualBox はバージョンアップするとなんだか分からないけど guest が kernel panic で起きなくなる場合がある。その際、extradata の部分を一度削除して素の状態に戻すると普通に起動できることが多い。
    • 一度新しいバージョンで起動できると extradata を元に戻しても以前と同じように動作する。

という、困った症状が Windows host, MacOSX host 問わず起きることがあります。経験から言うと Windows host の方がトラブルが多い気がします。Linux host では使ったことがありません。

そして設定ファイルのフォーマットに非互換が生まれる場合しか VirtualBox はバージョンアップ時に自動的に設定ファイルのバックアップを取ってくれません。これはちょっと怖いというか何かあったときに面倒くさい。

ということで作りました。

中身は VBoxManage1 と FileUtils の組み合わせで、そんなに面白いもんじゃないです。苦労したのは設定ファイルなどをエディタに渡して開くところで、最終的に Windows では満足いく動作を得られていません。

Rakefile を gem で bin としてインストールしたい

bin としてインストールするためにやったことは簡単で、

bin/vbox_tools ( <- Rakefile )

に Rakefile を置いてこれを gemspec に exectables として追加するだけ2。これで gem install すると PATH の通った bin ディレクトリにこの Rakefile を読み込むだけのファイルができあがります。

ただし、開発時にはこのままでは実行できないので shebang を

#! /PATH/TO/rake -f

にしておきます。あ、実際に作ったものは

#! /usr/bin/env rake -f

にしてあるんだけど、これで動くのは *BSD だけかも。

Windowsでは

ただし Windows の場合は事情が違います。Windows で gem install すると bin/vbox_tools が Ruby をインストールした bin ディレクトリ、たぶん C:\Ruby\bin に作られ、さらにこれを ruby で実行するための .bat ファイルが生成されます。

しかしこの自動生成の .bat ファイルはあくまで Ruby で呼び出すことを目的としているので Rakefile を bin としてインストールしたい場合は嬉しくありません。

今回は解決方法が分からなかったので gem の中に予め .bat を用意しておいて、Windows の人は手作業でこの .bat ファイルを C:\Ruby\bin などの中に copy して使ってくれとドキュメントの中に書くことでお茶を濁しました。

何かいい方法あるんでしょうか。

cutagem で github に gem を置きたい

先日のgem 作るには何がいいのという記事には全然反応がありませんでしたが3、結局依存が少なくて手間の少なそうな cutagem を使うことにしました。

準備

gem source -a http://gems.github.com
gem install genki-cutagem

作業開始

cutagem GEMNAME

すると

  1. 指定した名前のディレクトリがカレントに作成される
  2. その中に skelton がダダっとできる
  3. 何かキーを押すと Rakefile を編集するためにエディタが起きる
    • ここで AUTHOR や EMAIL など必要な情報を入れて閉じる

試しにこの段階の vbox_tools は以下のようなツリーになります

vbox_tools
|-- ChangeLog
|-- README
|-- Rakefile
|-- lib
|   `-- vbox_tools.rb
`-- test
    |-- test_helper.rb
    `-- vbox_tools_test.rb

Rakefile がありますね。早速

rake

と叩くといきなりテストが動いて、当然何もコードがないので RED になります。いいですね、TDD です4。こういう環境がお膳立てされるのはゼロから自分でテストツールの使い方を調べて導入して…とやっていくより断然楽ちんなので、すぐにスタートを切ることができます。

で、今回は github の話なので

作ったディレクトリで git init

を忘れずに。

cutagem にできること

rake -T
rake clean            # Remove any temporary products.
rake clobber          # Remove any generated file.
rake clobber_package  # Remove package products
rake clobber_rdoc     # Remove rdoc products
rake debug_gem        # Show information about the gem.
rake gem              # Build the gem file vbox_tools-0.0.1.gem
rake gemspec          # Update gem spec
rake package          # Build all the packages
rake rdoc             # Build the rdoc HTML Files
rake release          # Package and upload the release to rubyforge.
rake repackage        # Force a rebuild of the package files
rake rerdoc           # Force a rebuild of the RDOC files
rake rubyforge        # Publish to RubyForge
rake test             # Run tests for test

今回使うのは gemspec, test だけです。

作る

省略。

rake で test しまくって目的の動作を実現してください。

実行ファイルを gemspec の exectables に追加

skelton の bin/ ディレクトリの中に実行バイナリとしてインストールしたいファイルを置くだけでは gem install したときにはインストールされません。

cutagem で作った Rakefile の中に

BIN_FILES         = %w()

という行がありますので、ここを書き換えます。vbox_tools の場合は

BIN_FILES         = %w( vbox_tools )

としました。

gem を公開するまで

いちばん簡単に書くと

repository 側の準備が

  1. github 上にアカウントを取って repository を作成する
  2. repository admin で [ Rubygem ] にチェックを入れる

で ok. 手元の作業としては

  1. rake gemspec
    • .gemspec を生成します。lib/ 内の VERSION の値が自動的に使われるので、gem のバージョンを上げる場合はこの値を変更します。
  2. git commit
  3. git push

で、おしまいです。github では gemspec が生成、更新されたタイミングで gem を生成するらしいので、動作が安定するまで gemspec は放置で、必要に応じて rake gemspec してあげればよいということになります5。なるほどよくできてる。

実際には今回自分は Windows と MacOSX 両方での動作を確認するために

  1. rake gem で gem を生成
  2. Dropbox 経由で Windows に転送
  3. Windows, MacOSX で gem install XXX.gem を実行して、生成した gem をローカルでインストールし、動作を確認
  4. 必要に応じて修正

という作業を行っていました。Dropbox 内のファイルって別ドライブとしてコピーされるんじゃなくて、移動になるんですね。初めてまともに使った。便利だ。

ハマったところ

github 上で gem が生成されるのは

  • repository の [ Rubygem ] にチェックが入った状態で
  • gemspec ファイルが生成されたか更新されたタイミング

のようです。

私は

  1. Rubygem のチェックを忘れたまま gemspec を上げていた
  2. 忘れていたチェックを入れて gemspec のバージョンを上げてみたけど反映されなかった
  3. 一度消して( rm -> push )、これを戻した( revert -> push )ら、あっという間に生成された

という経緯でした。ま、新しいことをやってみるんだから一度や二度ハマるのは想定の範囲内ってもんです。

special thanks

以下の発言、記事に助けられました。ありがとう!

  1. VirtualBox付属のCLI管理ツール 

  2. cutagem を使った例を後述します。 

  3. あれは書いたのは昨日で、実際に調べたのがあの日付なのです 

  4. テスティングフレームワークは標準の Test::Unit です。依存が多くないところも GOOD 

  5. 当然 .gemspec ファイルは git add されてないとだめだよ! 

果物のダンボール箱はなんで金属で留めてるのかな

まぁ箱を作る機械があってそれが金属で留めるようになってんだろなってことは予想がつくわけですが。

今はほらゴミの分別がやかましいじゃないですか。ダンボールは古紙だけど留めてるところは金属なわけですよ。でこの金属のやつがまた外れにくくできてるんで、バラすのめんどくさいの。このご時世にこのツクリはないだろと思うわけ。

まぁ強度的な問題もあるのかもしんないけど、金属で部分的に留めるのと、テープでみっちり留めるのだったら、テープの方が実は頑丈にできんじゃねぇかなぁとか思わなくもないんだな。

いずれにしても、いまどきの梱包材は廃棄のことを考えて作ってくんないと。果物が目につくからそれを題材にしたけれども、たぶんこういうのって業界別に箱作りマシンの流通具合が違うんじゃないですかね。どうですか、箱作りマシン業界の方。ご一考いただけないですか。

makerss.rb の面白くない挙動

たださんとこの rss をチェックしているとよく分かるが、ツッコミを削除しただけでその日の日記が更新された日記として浮上してきてしまう。確かに正しい動作なんだけど、荒らしなツッコミを削除しただけで浮上してきてしまうと荒らし対策が浮き彫りになってしまうので面白くない。

過去の日付の日記をインポートしても同じように浮上してしまう(と ishinao さんも言っていた)が、ツッコミの編集に関しては明らかにやりすぎというか、意図的に無視すべきもののような気がするなぁ。

msearch 導入

とりあえず localhost へ。

  • index を起こすスクリプトが interactive なコマンドラインツールか CGI しかなくて、オプションを指定して一発でって使い方はできない。
    • やりたければ interactive な部分にあらかじめ答えを用意した sh スクリプトなどが必要
  • インデックスの保存場所の指定方法がなんかよく分からない
    • genindex, msearch.cgi と同じ場所に置くのは確かに簡単だけど、仮に公開サイトでこれを使う場合はちょっと permission に気を使うからやだなぁ。
  • 検索精度は Namazu の方がいい
    • これはどうしようもないのかな。辞書とか使うようにしたら違うんだろうけど。
  • jcode.pl 依存なので utf-8 には対応できない。
    • Unicode版が別にあるけど

ちょっと検索精度がなぁ。ビミョーな感じ。確かに速いんだけど。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm