ひよっこ。

I want to…

Posts Tagged ‘node’

vimでnodelintを有効化してQuickfixを活用する

Posted by hikaruworld : 2012 5月 3

最近触っていなかったnodeを触ろうと思って、vimの構成を少し弄っていました。
当時はjslintでやっていたvalidationを、nodelintでやってflymakeしよう思い
Vimでnode.jsの文法チェック(nodelint編)』を参考に設定を調整してたんですが、
ちょっとハマッたのでメモしておきます。

なお、以下のバージョンで構築しています。

OS MacOSX(SnowLeopard)
vim MacOSX(SnowLeopard)デフォルトの7.2.108
errormarker.vim Version 0.1.13
node 0.7.8
nodelint 0.6.1

errormarker.vimとnodelintの導入

とにかく、上記サイトに従ってerrormarker.vimとnodelintを導入します。
nodelintの設定まではここでは行いません(npm install -g nodelintまで)。
なお自環境との違いは、homebrewではなくてnaveベースなことです。

nodelintの設定変更

自分の確認したnodelint 0.6.1では、–reporterという引数でnodelintの出力形式が指定できるようです。

以下のコマンドでデフォルトで提供される出力形式が確認できます。

nodelint --list-reporters

以下、出力結果です。

Build-in reporters: 
* default: Default reporter
* idea: IDEA reporter
* textmate_full: Textmate full HTML reporter
* textmate_summary: Textmate full HTML reporter
* vim: VIM syntastic reporter
* xml: XML reporter

ご丁寧にvimの出力形式が準備されているのでありがたく使わせて頂きましょう。
ただ、ちょっとだけ出力形式が見づらいので修正します。

実際のvim用のreporterファイルは以下にあります。
$NODE_PATH/../node_modules/nodelint/lib/reporters/vim.js
変更内容は以下です。半角スペース入れて、文字列を一部切り詰めます。

41c41
<       str += file  + 'line ' + error.line +
---
>       str += file  + ' line ' + error.line +
43c43
<         ' Error: ' + error.reason + ' ' +
---
>         ' E: ' + error.reason + ' ' +

errormarkerの設定

基本的には参考サイトの通りですが、–reportersの設定を追加する事とerrorformatの設定を変更します。
あと、自分の場合は、$HOME/.vim/bundle/errormarker/ftplugin/javascript/flyquickfixmake.vimになります。

setlocal makeprg=$NODE_PATH/../../bin/nodelint\ --config\ $NODE_PATH/../node_modules/nodelint/config.js\ --reporter\ $NODE_PATH/../node_modules/nodelint/lib/reporters/vim.js\ %
" main.js line 2 column 1 E: ......
setlocal errorformat=%f\ line\ %l\ column\ %c\ %t:\ %m

if !exists("g:javascript_flyquickfixmake")
    let g:javascript_flyquickfixmake = 1
    au BufWritePost *.js silent make
endif

いくつか補足をば。
* makeprgの指定に関しては、naveを利用している都合上都度変更されるため、$NODE_PATHを基点に定義しています。
* –reporterに関しては既に記述した通りです。
* config.jsはインストール時のまま特に弄っていません(参考サイト通りに変更していません)。
* errorformatは–reporter vim.jsの出力形式にあわせています。
* make処理は一々表示して欲しくないのでsilentにしています。

.vimrcの設定

一部.vimrcの設定も変更しました。

" 保存時にerrormaker.vimでCUIの画面がぶれるので、いったん再描画する
autocmd QuickfixCmdPost make redraw!
" quickfixに対象が存在した場合に自動起動する用に設定
autocmd QuickfixCmdPost make if len(getqflist()) != 0 | copen | endif
" quickfixに対象が存在しなかった場合に自動で閉じるように設定
autocmd QuickfixCmdPost make if len(getqflist()) == 0 | cclose | endif

以上です。

参考にしたサイト

それマキ(それ今mackeeがやってるよ)
vimdoc-jar quickfix

おまけ

そういえば、:signが有効になんないんですよね。

E319: Sorry, the command is not available in this version

とか言って怒られますorz…

Posted in program | タグ: , , , | Leave a Comment »

npm completionがあると聞いて

Posted by hikaruworld : 2011 12月 27

npmについてまとめてみるというブログのエントリーをを見ていて、
npm completionという便利なコマンドがあると知ったので設定してみた。

自分の環境ではnave経由なので、
こんな感じに~/.bashrcに書いてみました。気持ちはpythonのvirtualenv風味。
起動時に$NAVEが設定されていた場合対象バージョンのinstalledディレクトリのpostactivateが存在した場合に読み込みます。

# read nave postactivate script
if [ -n $NAVE ]; then
    echo $NAVE_ROOT/$NAVEVERSION/postactivate
    if [ -f $NAVE_ROOT/$NAVEVERSION/postactivate ]; then
        . $NAVE_ROOT/$NAVEVERSION/postactivate
    fi
fi

postactivateはこんな感じ。
node有効にしたときの処理を色々書けていいかも。

#!/bin/bash

# read npm completion
. <(npm completion)

快適になった♪

naveのやつはないのかな。
あと、postactivateするとpostinstalledとか作って必要なnpmパッケージをインストールしたくなりますね。
nave.sh的のソース見てたんですが、サブシェルの起動まわりをちゃんと理解してなかったのでまた気が向いたときにでも。

以上です。

Posted in program | タグ: , , , | Leave a Comment »

vim-ref-node(オフライン用)とか試しに作ってみた

Posted by hikaruworld : 2011 12月 5

最近javascriptはvimで書いていたりします。
自分はエディタ(というかIDE)はEclipseな人なんですが、
javascriptはそこまで補完が聞いてくれないので、pythonとかでも使っていたし、
いい機会だと思ってvimで作業しています。

で、vimには様々なプラグインがある訳ですが、その中でvim-refというプラグインがあります。
これとても便利で、vim上でAPIリファレンスが簡単に見れます。

色々vim-refのプラグイン的なものもあるんですが、javascriptやHTML5がなかったので、
書いてみました。

とりあえず、nodeのvim-refを作ったのでlaunchpadにUPしておきます。
まぁbzr使ってる人もあんまりいないと思うので、こちらからもtar.gzで落とせます。

# githubにあげようと思ったけど、アカウント忘れてめんどくさくなった。
# そのうち…

vimscript初心者がvim-jqueryをまねててきとーに作っただけですので
バグっていると思いますが….。
気になったのが、w3mで確認したんですが、アンカー指定で渡してもうまく行かないよう。
後でもうちょっと調べてみたい。
これの問題が解決すればfs.watchみたいな感じでドット間で補完できるようにしたいデス。

nodeのリファレンス自体は、githubにおいてあるのでそこから引っ張ると良いでしょう。
# githubってどれがマスターかいまいち分からんorz…
# 自分はこれを頂きました。

以上です。

Posted in program | タグ: , , , , | Leave a Comment »

proxy環境でnpm使おうとしたら、Error: socket hang up

Posted by hikaruworld : 2011 10月 27

バージョンはnodeが0.5.10、npmが1.0.101。
OSはVirtualbox上に構築したUbuntu11.10。
nave経由でインストールした、npmでnpm install hogehogeしたらこんなエラーが発生。

hikaruworld@hikaruworld-VirtualBox:/tmp$ npm install express
npm ERR! Error: socket hang up
npm ERR! at createHangUpError (http.js:1083:15)
npm ERR! at CleartextStream. (http.js:1166:27)
npm ERR! at CleartextStream.emit (events.js:88:20)
npm ERR! at Array.0 (tls.js:719:22)
npm ERR! at EventEmitter._tickCallback (node.js:194:26)
npm ERR! Report this *entire* log at:
npm ERR!
npm ERR! or email it to:
npm ERR!
npm ERR!
npm ERR! System Linux 3.0.0-12-generic
npm ERR! command “node” “/home/hikaruworld/.nave/installed/0.5.10/bin/npm” “install” “express”
npm ERR! cwd /tmp
npm ERR! node -v v0.5.10
npm ERR! npm -v 1.0.101
npm ERR! code ECONNRESET
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /tmp/npm-debug.log
npm not ok

ちなみにhttpもhttpsのproxyは設定済み。
wgetやcurl、apt-getが動くことは確認済み。
npm config set proxyもやってある。
/etc/resolve.confも設定されてる。

というわけで半泣きになりながら検索してたら、GoogleGroupで、Node install behind auth proxyという投稿を発見。

一縷の望みをかけて、

npm config set registry http://registry.npmjs.org/

を実行。

無事登録されたみたいなので、再度npm install。

上手くいったョ!。

Posted in program | タグ: , , , , | Leave a Comment »

今更だけどDotcloud上にnode.js環境をデプロイしてみる(1)

Posted by hikaruworld : 2011 7月 27

今更ですが、node.jsを使ってdotcloud0.4上に環境を構築してみました。

ちなみにローカル環境はMacOSX10.6.7(SnowLeopard)です。
この辺りを参考にしていたんですが、6/22にdotcloud0.4がリリースされて
ちょこっと変わったらしく、結局公式ドキュメントを読んでやりました。

1.DotCloudのアカウント登録

何はともあれ、dotcloudにアカウントを登録してAPIKey(あとで必要になります)を取得可能な状態にしておきます。

2. ローカル環境にDotCloudのCLIツールをインストール

DotCloudにログインすると、右上からDashboardやsettingにアクセス可能になります。

このDashboardにアクセスしてみると…
Start deploying by INstalling the CLI.とな。

まだないようです(ー。そのうちGUIが提供されるのでしょう〜。

というわけでリンク先にあるようにDotCloudを操作するために
dotcloudというコマンドをローカルマシンにインストールします。
python製ですので、easy_installなりpipで行うのですが、公式サイトのリファレンスでは

sudo easy_install pip && pip install dotcloud

とのことなのでpipでインストールしておきましょう。

※最初easy_installでインストールしてしまったのですが、
easy_installはアンインストールを手動で行う必要があるので、pipの方が楽チンですョネ。

3. dotcloudのセットアップ

dotcloudのインストールが終わったら、dotcloudコマンドのセットアップを行うために、以下のコマンドを実行します。

dotcloud setup

以下のように聞かれるので、

Enter your api key (You can find it at http://www.dotcloud.com/accounts/settings):

settingsに記述されているAPIKeyを入力します。

このコマンドを実行すると、設定したキー情報が~/.dotcloud以下に格納されます。

.dotcloud/
├── dotcloud.conf
└── dotcloud.key

4. アプリの登録

今回は冒頭にあるようにNode.jsでアプリを作っていきます。
DotCloud上にNode.jsで構築する方法は公式ドキュメントに詳しく書いてあります。

まず、DotCloud上で利用するアプリケーション名を登録します。
このアプリケーション名は自身のアプリケーション内で一意である必要があります。
ここではとりあえずhelloNodeというアプリケーション名にしてみます。
というわけで、以下を実行します。

dotcloud create hellonode

無事作成出来るとこんな感じに出力されます。

Created application “helloNode”

dotcloud上への登録はこれだけです。

5. アプリの作成

次に登録するアプリの実体を作成していきます。
任意のディレクトリを切ってそこで作業します。私の場合は~/programs/dotcloud/helloNodeとしました。

$ mkdir -p ~/programs/dotcloud/helloNode
$ cd ~/programs/dotcloud/helloNode

dotcloud.ymlの作成

次にdotcloud.ymlというビルドファイルを作成します。
これはYAML形式でアーキテクチャやプログラミングコードの設定を行うことが可能です。
今回はDBを利用しないので、こんな感じになります。

www:
    type: nodejs
    approot: helloNode

wwwという風につけたserviceをnodejsのプログラミング言語を使ってルート以下のhelloNode以下に作成するという意味になります。
wwwはあくまでもサービスの名前なので後で変更可能です。
typeは利用するプログラム言語、
approotとは、ルートディレクトリからの指定でこの指定されたディレクトリ以下が設定された対象になります。複数のサービスを定義する場合にはdbやbatchと行った感じで設定を増やすことが可能です。

これをふまえて現在のディレクトリ構造はこんな感じになっています。

helloNode/
├── dotcloud.yml
└── helloNode

supervisord.confの作成

起動用の設定ファイルとしてsupervisord.confを作成します。

$ cd helloNode
$ vim supoervisord.conf

こんな感じでチュートリアルと同じ設定を書いておきます。

[program:node]
command = node server.js
directory = /home/dotcloud/current

commandには実行するnodeコマンドを書きます。
directoryはDotCloud環境上にUPされる場所が/home/dotcloud/currentとのこと(変更可能?)。

server.jsの作成

これは通常のnode.jsのファイルになります。
とりあえずこんな感じに書いておきます

var http = require('http');

var server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"})
    var output = "Hello World!\n";
    response.end(output);
});

server.listen(8080)

ま、いわゆるHelloWorldですね。
listenしているportは8080ですが、これはセキュリティ上の理由からだそうです。
実際のURLは80でアクセスできるとのこと。

なお、この時点でのディレクトリ構造はこんな感じになっています。

helloNode/
├── dotcloud.yml
└── helloNode/
    ├── server.js
    └── supervisord.conf

6.クラウド環境へのデプロイ

作ったアプリの動作確認をしたら、クラウド環境へのデプロイをpushコマンドで行います。

dotcloud push helloNode ~/programs/dotcloud/helloNode

デプロイ => 起動までが無事完了するとこんなログが流れます。

# upload helloNode/ ssh://dotcloud@uploader.dotcloud.com:21122/hellonode
# rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added ‘[uploader.dotcloud.com]:21122,[XXX.XX.XX.XX]:21122’ (RSA) to the list of known hosts.
building file list … done
./
dotcloud.yml
helloNode/
helloNode/server.js
helloNode/supervisord.conf

sent 594 bytes received 98 bytes 106.46 bytes/sec
total size is 352 speedup is 0.51
Deployment for “hellonode” triggered. Will be available in a few seconds.
2011-07-26 11:27:12 [api] Waiting for the build. (It may take a few minutes)
2011-07-26 11:27:12 [www.0] Deploying…
2011-07-26 11:27:34 [www.0] Service booted
2011-07-26 11:27:34 [api] All the services are ready. Beginning the build.
2011-07-26 11:27:34 [www.0] The build started
2011-07-26 11:27:35 [www.0] Fetched code revision rsync-1311679630.79
2011-07-26 11:27:39 [www.0] node: stopped
2011-07-26 11:27:39 [www.0] node: started
2011-07-26 11:27:39 [www.0] The build finished successfully
2011-07-26 11:27:39 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://6634c12a.dotcloud.com/

おまけ:ignoreの設定

当然分散バージョン管理使っている訳で、バージョン管理ファイルやデプロイしたくないファイルがある訳ですが、
DotCloudさんはその辺はまだ対応していないようです。
現在これを実現したい場合はGitかHgでバージョン管理を行い、リポジトリからデプロイするようにしなければいけないとのこと。そうした場合gitやhgのignoreを反映してくれるそうです。

bzrは???(涙)…bzr-hgとかbzr-git使えってことですね。はい。

7.動作確認

6.で表示されたURLにアクセスすることで該当環境にアクセスできます。
早速やってみましょう。
http://6634c12a.dotcloud.com/へアクセスします(今はつながりません)。
HelloWorldと表示されました。

8.npmの依存関係解決

node.jsでプログラミングする以上パッケージ管理のnpmは使いたいところです。

DotCloudではnpmの依存関係もpackage.jsonを用意しておくことで自動でダウンロード及び参照してくれます。

ここではexpress(とjade)のテンプレートをdotcloud上で動かしてみます。
なお、expressとjadeは既にグローバルインストール(npm install express -gd)されているものとします。

まずは4.と5.でやったようにアプリを登録して、デプロイ用のディレクトリを作成します。

dotcloud create hexp
mkdir hello-express
cd  hello-express

expressコマンドを使って(パスが通っている前提)、ひな形のアプリケーションを作成します。

express create app

グローバルにインストルしたnpmのモジュールを紐つけます。

npm link express jade

この時点でディレクトリ構成はこんな感じになります。

hello-express/
├── app
│   ├── app.js
│   ├── node_modules
│   │   ├── express -> ~/.nave/installed/0.4.9/lib/node_modules/express
│   │   └── jade -> ~/.nave/installed/0.4.9/lib/node_modules/jade
│   ├── package.json
│   ├── public
│   │   ├── images
│   │   ├── javascripts
│   │   └── stylesheets
│   │       └── style.css
│   └── views
│       ├── index.jade
│       └── layout.jade
└── dotcloud.yml

dotcloud上に必要な設定を書いていきます。
まずはdotcloud.ymlを既存の構成にあわせて書き直します。

www:
  type: nodejs
  approot: app

package.jsonを修正します。
既にテンプレートインストール済みですので、しなくても大丈夫ですが…どうせなのでnameを変更しておきます。

{
    "name": "hello-express"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.4.3"
    , "jade": ">= 0.0.1"
  }
}

app.jsのlistenするポートを変更します。

//app.listen(3000);
app.listen(8080);

app以下にsupervisord.confを作成します。

[program:node]
command = node app.js
directory = /home/dotcloud/current

dotcloud上にデプロイします。

dotcloud push hexp hello-express

長いのでログは省略しますが、一部だけ。

ignoring unsafe symlink “/home/dotcloud/repositories/3/d/1/2/7/13093/hexp/rsync/app/node_modules/express” -> “~/.nave/installed/0.4.9/lib/node_modules/express”

と出ました。シンボリックリンクは無視してくれるみたいです。グッジョブ!

2011-07-26 12:18:39 [www.0] npm info build Success: hello-express@0.0.1
2011-07-26 12:18:39 [www.0] npm info build Success: jade@0.13.0
2011-07-26 12:18:39 [www.0] npm ok

と行った感じでpackage.jsonに書かれている必要なライブラリをビルドしてくれます。

9.その他のコマンド

dotcloudにはその他に便利なコマンドが準備されています。
一部ここで紹介しておきます。

利用可能なコマンドはdotcloud -hと打つことで参照可能です。
ちなみに、これPythonのCmdというパッケージを使って実現しているようです。便利デスヨ。

おまけ:application.service

helpを見ていると頻繁にapplication.serviceという表現が頻繁に出てきます。
これはapplicationはcreateしたアプリ名を指し、
serviceは、dotcloud.ymlに定義したservice名(今回でいえばwww)を指します。
application.serviceという表記は、hexp.wwwというように指定します。

コマンド

setup/create/pushは今まで使ってきましたので省略。

list

createした環境の一覧を表示します。

hexp:
  - www (type: nodejs; instances: 1)

versions

pushでデプロイした際のrsyncのバージョンが表示されます。

- rsync-1311682682.25
- rsync-1311683164.82

run

dotcloud環境上でコマンドを実行します。
たとえばlsだとこんな感じになります。

dotcloud run hexp.www ls

なお、引数を与えたい場合は–を使います

dotcloud run hexp.www ls -- -ls

logs

ログを出力します。実体はtail -Fで/var/log/supervisor/*.log が流れます。

dotcloud run hexp.www ls 

alias

ヘルプを見ると、独自ドメインに紐つけるとのこと。持ってないので未確認

destroy

createで登録したアプリケーションを削除します。

url

デプロイしたアプリケーションのURLを参照します。
うっかり忘れた時用。

info

アプリケーションないしはサービスの情報を参照します。
アプリケーションであればURLやプログラミング言語、インスタンスなど、
サービスであればhttpのアクセスやsshのアクセスのURLなどが参照できます。

status

supervisorctlを通して起動しているサービスの状態が参照可能です。

node RUNNING pid 230, uptime 0:28:42

rollback

???

ssh

該当アプリケーションのサービスにsshでアクセスします

restart

指定したアプリケーションのサービスを再起動します。

参考サイト

以下のサイトがとても参考になりました。
http://docs.dotcloud.com/services/nodejs/
http://d.hatena.ne.jp/replication/20110603/1307026830

以上です。
次はmongodbとつなげてみようと思います。

Posted in program | タグ: , , , | Leave a Comment »