2014年9月15日月曜日

Cloud9を試す(2)-Nitrous.IOと連携

Sublime Textとtern.jsで、Node.JSを書いているのですが、Cloud9と比較し、コードの補完機能が物足りなく感じます。Cloud9のIDEを使って、Nitrous.IOのBOXにあるソースを編集できないものでしょうか。
Nitrous.IOとCloud9というキーワードで検索してみると、こちらに行き着きました。
エントリにはCloud9IDEとNitrous.IOのBoxをSSH接続で連携させる手順が書かれています。見るとCloud9のエディタでちゃんとコード補完されています。これは是非試したい。

Cloud9でNitrous.IOのプログラムをコーディングする

英語がわかる人は、元のエントリの通りの手順を践めば問題はないはずです。以下には、少し引っかかった箇所を補足して手順を記載しています。
  1. Create a new NodeJS Box on Nitrous.IO
    まず、Nitrous.IOにNodeJSのBOXを作成します。こちらを参考にして下さい。既にNodeのBOXが在る場合はこのステップは不要です。
  2. Note the information about the new box
    BOXのSSH URIを書き留めるか、クリップボードに記憶させておいて下さい。
    私の場合ssh://action@apne1.nitrousbox.com:<ポート番号>でした
    enter image description here
  3. Add a new SSH Workspace on Cloud9
    Cloud9のダッシュボードから、SSH Workspaceの新規作成を実行します。なお、無課金の範囲でCloud9を使用する場合、SSH等プライベート領域で外部公開しないWorkspaceは、1ユーザに付き1つのみ作成可能となっています。既にプライベートWorkspaceを作成済であった場合は、Workspaceを削除するか、課金により、複数のプライベートWorkspaceを作成可能にして下さい。
    下記の様に設定して下さい。
    enter image description here
    • HostName
       NitrousIOのBOXに対応するSSH URI、先ほど確認したやつから、ユーザID(action)を除いたものを設定します。 (例apne1.nitrousbox.com)
    • Username
       ”action”を設定します。 SSH URIの@より前の文字列が、ユーザIDとなっています。
    • Node.JS Binary Path 
       Node.JSが導入されたBOXに関して、Node.JSコアのバイナリがある場所を指定します。本エントリー記載の時点では、pathは/home/action/.parts/packages/nodejs/0.10.26/bin/nodeでした。バージョンによってはこのpathは変更されるので、Nitrous.IOのコンソールから、実存するファイルか確認したほうが良いでしょう。
    • Initial Path
      任意で設定します。ログイン時にどのディレクトリをCloud9のWorkspaceエクスプローラの基点とするか設定します。 
    なおLOGINTESTボタンを押してみたくなりますが、未だ押さないで下さい。次の手順を実施しないかぎり、おそらくログインは失敗します。
  4. Copy the SSH Key shown in the Cloud9 window
    ここの手順について、本家の手順では、/home/action/.sshに、authorized_keyファイルを配置すれば良いような記載がされています。が、どうも本家の記載の通り実施しても、上手くいきませんでした。
    当方はNitrous.IOのPublicKeyにCloud9側のSSH Keyを登録して解決しました。
    イ) NitrousIOのAdd Public Keyをクリック
    enter image description here
    ロ) Cloud9側のYour SSH Key(SSH Setting画面に表示)をコピペする
    enter image description here
    ここでは、Nameを仮にC9としておきます。Add keyボタンを押下します。
  5. You can now connect to the Nitrous.IO box via the Cloud9 IDE.
    Cloud9側のSSH Setting画面に戻り、LOGIN TESTボタンを押下し、ログインできるか確認してください。ログインできない場合、指定しているパスに誤りがないか、NitrousIOのBOXがDeactiveになっていないかを確認して下さい。
    Cloud9に作成したWorkspaceを開く(最初は少し時間がかかります)と、NitrousIOに作成したWorkspaceが、Cloud9でも開けているのがわかります。
    enter image description here
これで、Cloud9の強力なコード補完機能が、NitrousIO上のコード編集でも使えるようになりました。
※コード補完が使えるようになるまでの時間が掛かる場合もあります。Cloud9がWorkspaceの補完候補をクローリングするに時間を要する為だと思います。
Written with StackEdit.

2014年9月14日日曜日

Sublime TextとNitrous.IO環境でNode.JS開発環境を作成する(2)

 前回までは、Nitorus.IOでの開発環境の作成、NitorusDesktopの導入までを行いました。
 今回は、NodeJSSublime Textで編集できるようにします。コード補完機能も使えるようにします。


NitorousDesktopのfilesyncの有効化

 NitorusDesktopは、Nitrous.IOのデスクトップアプリケーションです。
 インストールしたNitorusDesktopを起動し、File Syncを有効にして下さい。


Sublime Text 2にNodeJS補完機能を導入する

 Sublime Text2は、必要に応じてパッケージを導入することで、機能を強化する事ができます。しかしSublimeText2に最初から組みこまれた入力補完機能では少々もの足りないので、TernJsを導入して、NodeJSのコード補完機能を有効にさせます。以下の手順を実施します。


1. Sublime TextへPackageControllerを導入する

 Sublime Text をインストールした際に、最初に実施するのは、Sublime TextにPackegeManagerを導入する事です。
 パッケージマネージャは、Sublime Textでのパッケージの導入と管理を容易にします。
 Sublime TextのviewメニューからShowConsoleすると、画面下部に表示されたコンソールが表示されます。PackegeControllerの公式ページに有るPythonコードをコピペするか、下記をコピペして下さい。導入が完了したら、一度Sublime Textを再起動して下さい。

import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

2. TernJSを導入する

 TernJSは、NodeJSのコード補完機能をSublime Textに組みこむ事ができるパッケージです。
 TernJSの公式ブログのアドレスはこちらです。
 なおTernJSはEmmet社製のプラグインですが、既に他のEmmetのプラグインを導入されている方は、注意点があります(後述)。

 PackageManagerを導入しSublime Textを再起動したら、メニューのTools>CommandPaletteを選択し、テキストボックスにInstallと入力します。インクリメンタルサーチされた一覧から、InstallPackegeという検索結果を選択します。
 少しすると、InstallPackageのテキストボックスが開いて、再度入力を促されます。
 今度はTernと入力すると、サーチ結果がドロップダウンされますので、TernJSを選択し導入します。
 導入が終わったらSublime Textを再起動して下さい。
 
 先述した注意点ですが、既に他のEmmetプラグイン導入済の環境では、pythonのパッケージPyV8が導入されている場合だと、コード補完が少し遅くなる事があるかもしれません。その場合は、PyV8パッケージをパッケージコントローラから削除してください。これにより、次回起動時に最適なバージョンPythonパッケージが導入されます。

3. Tern-Projectファイルの作成

 Sublime Textの再起動により、TernJSの導入が済んだら、これらのコード補完機能を有効に設定するための設定ファイルの更新を行います。

 Sublime Textのメニューで、Preferenceメニューから、Settings - Defaultを選択し、"auto_complete": trueになっている事を確認して下さい。trueなら、Sublime Text全般の自動補完機能が有効となっています。(デフォルトはTrue)

 NitorusDesktopは、クラウド上に配置されたNodeJSの開発環境を、そのままローカルに同期する機能を持っています。
 同期はNitorusDesktopを呼び出すNアイコン(Windowsの場合タスクバーより、macの場合NitrousDesktopを起動後の通知バーより)をクリックし、Nitrous Desktop画面でBoxesがStart状態である時、FileSyncトグルボタンをDisable→Sync(Syncing)に切り替えます。すると同期が開始されます。
enter image description here
 同期フォルダを開いて、開発環境が所定のフォルダに同期された事を確認するには、Nアイコンを、今度は右クリック(Macの場合Nアイコンをクリック)し、Open Nitrous Folderを選択すると、ローカルの同期フォルダ(<ユーザ>\Nitrous)が開きます。
enter image description here
 この同期フォルダにファイルを保存していくと、クラウド上のBOX(NitousIOの開発環境)に同期されるようになります。
 このフォルダに、TernJSの各種設定を記述したNodeProjectファイルを作成します。こうしておけば、異なる環境間、たとえば、自宅とオフィスのPCとの環境間で、都度プロジェクトの設定をしなおす手間がなくなります。

 では、このフォルダのmynodeフォルダ(<ユーザ>\Nitrous\mynode)に、下記の記述で作成した"tern.sublime-project"ファイルを配置して下さい。

{
  "auto_complete_triggers":
  [
    {
      "characters": "<",
      "selector": "text.html"
    },
    {
      "characters": ".",
      "selector": "source.js"
    }
  ],
    "folders":
    [
        {
            "follow_symlinks": true,
            "path": "."
        }
    ],

  "word_separators": "./\\()\"'-:,.;<>~!@#%^&*|+=[]{}`~?",

  "ternjs": 
  {
      "exclude": ["wordpress/**", "node_modules/**"],
        "libs": ["browser", "jquery","node"],
              "plugins": {
                "requirejs": 
                {
                  "baseURL": "./js"
                }
              }
  }
}

4. コード補完機能の確認

 それでは、TernJSの補完機能を使って、実際にコーディングを行ってみます。
 Sublime Textを起動して、メニューバーから、Project > OpenProject とメニューを辿り、先ほど作成したtern.sublime-project(<ユーザ>\Nitrous\mynode\tern.sublime-project)を開いて下さい。
 次にSublime Textから、プロジェクトフォルダとなる<ユーザ>\Nitrous\mynode\に
example.jsというファイル名でJSのソースを作成します。ソースには、下記のフォルダをコピペし保存します。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8888, '0.0.0.0');
http://nodejs.org/ の「AN EXAMPLE: WEBSERVER」ソースをNitrous.IO検証用に僅かに改変)

 そして、コード補完機能が有効である事を確認します。先ほどコピペし、保存したexample.jsの行末に、下記のコードを入れてみます。

console.log('Server running at http://0.0.0.0:8888/');

co・・・と入力したあたりで、TernJSのコード補完機能が一見働いたように、下記のような補完リストが表示される筈です。
enter image description here
 しかし、この補完リストは、Sublime Textの標準の補完機能が表示しているものです。既出の文言から予測される入力を単に一覧で表示されているに過ぎません。 
 TernJSの場合本来は下記のように、もっと沢山の補完リストが表示される筈です。
enter image description here

 実は、新規作成したソースについては、TernJSはコード補完対象として認識しません。記載したソースをTarnJSの補完対象にするには、TernJS:Reloadというコマンドを実行して、新たに作成したソースをコード補完対象にしてやる必要があります。
 Reloadは、CommandPalletから実行します。Sublime Textのメニューから、Tools > Command Palatteを選択し、テキストボックスに、Reloadと打ち込むと、TernJS:Reloadが候補としてリストされるので、選択してTernJSをReloadします。
enter image description here
 
 今度は、補完されましたか?
enter image description here


5. Nitrous.IOでの動作確認

 記述したコードをNitrousIOで実行してみます。
 Nアイコンをクリックし、NitorusDesktop画面を表示します。
 enter image description here
 IDEボタンをクリックして、NitrousIOのIDEを開きます。
enter image description here
 
 作成したソースが、クラウド上の開発環境に同期されているのが判ります。
 
 では、Example.jsを実行します。
 画面下部のConsoleのカレントディレクトリをWorkspaceに移動し、NodeJSを実行します。

cd workspace/
node example.js

 正しく起動できた場合は
 Server running at http://0.0.0.0:8888/ が表示される筈です。
 この状態で、IDEのメニュー Preview > Port8888を選択して下さい。
enter image description here

 ブラウザのタグやウィンドウが開いて、下記の表示になれば成功です。
enter image description here
 
 以上で稼動確認終了です。お疲れ様でした。

Written with StackEdit.

2014年8月11日月曜日

NodeJSで気になる点

var Iconv   = require("iconv").Iconv;
var cheerio = require('cheerio')
var urlutil = require('url');
var url_util = require('url'); //不本意な記述

var charsetDetector = require("node-icu-charset-detector");
特に問題はないコードと言えますが、気に入らないのは、var urlutil = require(‘url’);の箇所で定義した変数。
以降のコードには、
var getWebPageTitle = function(url, callback) {
    var urlElements = url_util.parse(url, false);

http.createServer(function (request, response) {
    var urlObj = urlutil.parse(request.url, true);
などと、別の使用局面で、同じような記述をする事になるのですが、なぜかurlutilはスコープ外完で使い回す事ができない。undefinedとランタイムエラーが起こる。今の記載のように局面毎に、別変数を定義してやる必要が有った.
 これはどうも、良くわからない仕様だと思った次第です。
Written with StackEdit.

2014年8月3日日曜日

iTemがNitorus.IOに接続出来なかった→解決

 2時間ほど悩んだので、メモを兼ねて。
 Nitrous.IOは、ssh経由で、ローカル環境に導入されたターミナルから接続できます。
 普段私が使うターミナルはiTerm2ですが、Nitrous.IOのBoxにssh接続しようとしても、下記のエラーが出て、以前のように接続できなくなりました。

$ ssh action@apne1.nitrousbox.com -p 20150
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
95:1c:0c:ed:15:13:a2:39:f2:f6:3e:2f:4a:be:dc:b0.
Please contact your system administrator.
Add correct host key in /Users/hanori/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/hanori/.ssh/known_hosts:4
RSA host key for [apne1.nitrousbox.com]:20150 has changed and you have requested strict checking.
Host key verification failed.

 思えば、接続しようとしたBoxは一度同名のBox名で作成して、一旦削除して再度作成しなおしたのでした。
 よって、Local側とBoxに登録されたSSH鍵認証の情報を再作成しなおさなければなりませんでした。
 Nitrous desktopを使う方法であれば、比較的簡単に復旧する事ができます。

下記がその手順になります。

  1. 既存のSSHを削除する
  2. Nitrous DesktopからShellを起動

1. 既存のSSHを削除する

Nitrous.IOのホスト名によって登録された鍵を検索し、ssh-keygenにて削除します。
冒頭に引用したssh接続時のエラーメッセージには、下記の記載がありました。

RSA host key for [apne1.nitrousbox.com]:20150 has changed and you have requested strict checking.

 この[apne1~]がローカルにて管理されたSSHのホスト名になります。
 下記のコマンドを実行すれば、ローカルに鍵情報が存在する事を確認できます。

ssh-keygen -F [apne1.nitrousbox.com]:20150

 # Host [apne1.nitrousbox.com]:20150 found: line 4 type RSA
 /Users/hanori/.ssh/known_hosts updated.[apne1.nitrousbox.com]:20150 ssh-rsa AAAAB3NzaC~(鍵情報)~El

 次に、登録された鍵を削除します。

ssh-keygen -R [apne1.nitrousbox.com]:20150

# Host [apne1.nitrousbox.com]:20150 found: line 4 type RSA/Users/hanori/.ssh/known_hosts updated.
Original contents retained as /Users/hanori/.ssh/known_hosts.old

これで、ローカルから一旦、鍵の登録を削除する事が出来ました。

ssh action@apne1.nitrousbox.com -p 20150

上記のコマンドを実行してみて、接続できるかどうか確認して下さい。
私の環境では、この対処だけでは接続出来ませんでした。私と同様、Boxに接続出来無かった場合は、次に進んで下さい。


2. Nitrous DesktopからShellを起動

 ローカルから鍵の登録を削除するだけで、接続できるようになる場合も在りますが、私の環境では、下記のエラーが出て、まだ接続できませんでした。

ssh action@apne1.nitrousbox.com -p 20150

The authenticity of host ‘[apne1.nitrousbox.com]:20150 ([176.34.56.246]:20150)’ can’t be established.
RSA key fingerprint is 95:1c:0c:ed:15:13:a2:39:f2:f2:f2:f2:f2:f2:dc:b0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘[apne1.nitrousbox.com]:20150,[176.34.56.246]:20150’ (RSA) to the list of known hosts.
Permission denied (publickey).

 Public Keyの更新が拒否されました。
 なぜPublic Keyの更新ができないのか判りません。sudoでルート権限下で、いままでの手順を繰り返してもやはりダメでした。
 最終的に、下記の手順で復旧しました。

  1. Nitrous Desktopを起動(既に起動している場合は再起動)
  2. NitrousDesktopで「SHELL」ボタンをクリックし、SHELLを起動
  3. PublicKeyを置き換える(?)か聞いてくるので、OKをクリックする

iTerm2から、下記のコマンドを実行すると、接続が問題無くできるようになった事が確認できました。

> ssh action@apne1.nitrousbox.com -p 20150
action@mynode-130750:~$ ls
README.md  tmp  workspace

 なお、下記のメッセージが出てしまう場合は、いろいろ対処しているなかで、無操作の一定時間経過によってBoxが既に停止してしまっている可能性があります。(無償利用時)

ssh: connect to host apne1.nitrousbox.com port 20150: Connection refused

 その場合はNetrous.IOのダッシュボードのページから、BoxをStartして、再度接続をしてみて下さい。

以上です。

2014年7月27日日曜日

Sublime TextとNitrous.IO環境でNodeJS開発環境を作成する(1)

 Nitrous.IOとSublimeTextがあれば、コード補完機能付きの開発環境が入手できます。
SublimeTextは、macやWindowsなどマルチOSで使える汎用テキストエディタです。
 Nitrous.IOは、Nodejsを初め、ruby、pythonといった、現在主流の各種Web開発スクリプト系言語の開発環境が、僅かな操作でクラウド上に作成できます。
 契約にはフリーミアムモデルを採用しており、一定の枠内で無償利用可能なWeb開発環境となっています。
 Nitrous.IOには、ブラウザベースで操作できる統合開発環境が用意されていますが、言語を問わず汎用的に作られていることから、テキストエディタにコード補完機能はありません(2014/07/20現在)。
 その為、コード補完機能を用いてコーディングしたい時は外部エディタを使う事になります。
 今回は、SublimeTextでNodejsをコーディングする環境を整える事とします。
 下記の順序で説明します。
  • Nitrous.IOに登録する
  • Node.JS開発環境をNitrous.IOに作成する
  • Nitrous Desktopをインストールする
  • SublimeTextをインストールする
  • (Sublimeにコード補完機能を導入する)- 次回に続く

Nitorous.IOに登録する

enter image description here
アカウントの作成
登録はメールアドレスの他に、Linkedin、Github、Google+等のアカウントがあれば、簡単に登録できます。

Nodejs開発環境をNitrous.IOに作成する

enter image description here
新しいBoxの作成
enter image description here
NodeJS開発環境の作成
クラウド上に、Boxと呼ばれる開発環境を作成します。今回は東アジアリージョンでNodejs開発環境のBoxを作成します。Boxは1分程度で作成されます。
 
 
 Nitrous.IOの特徴として、ユーザアカウント毎に割り当てられるN2Oという単位があります。ユーザは割り当てられたN2Oを使って、Boxのメモリの割り当てを増やしたり、ディスクを増やしたりできます。N2Oをもっと増やしたければ、課金やソーシャルへのNitrous.IOおすすめ投稿などをする事になります。
 また、無課金の範囲で使う場合の注意点として、開発環境は一定の時間操作されなかった場合には、環境そのものを自動的にシャットダウンします。ですので、次の日に開発の続きをする場合、再度Boxをスタートさせる必要があります。Boxのスタートは、Nitrous.IOの統合開発環境などから実行します。

Nitrous Desktopをインストールする

Nitrous.IOは、先述の通り、Webベースの統合開発環境をすでに持っていますが、一方ターミナルや開発環境の起動と停止操作を行うといった機能を持つデスクトップアプリケーションも提供しております。また、作成したNodejs実行環境の$HOME以下のディレクトリを、ローカルのディスクにミラーリング・同期する機能を有しています。イメージとしてはDropboxでのフォルダ同期機能が一番近いものでしょうか。
 クラウド環境と同期されたローカルのソースファイルは、当然、自身のローカルにインストールされたエディタで編集する事が可能です。
 Nitrous.IOのデスクトップアプリケーション、NitrousDesktopは、Webページからリンクをクリックしてダウンロードできます。導入も通常のセットアップを行うだけなので、特に説明は不要かと思います。NitrousDesktopはツールバー(macの場合)か通知領域アイコン(Windows)のNアイコンから開きます。
 以下がNitrousDesktopを開いた時の画像です。
NitorusDesktopを開く

SublimeTextをインストールする

SublimeTextは、mac,Windowsなど、クロス環境で使用できる多機能なテキストエディタです。アドオンを導入しカスタマイズしていく事で、あらゆるプログラム言語のコード補完機能を使えるようになります。Nitrous.IOが提供する統合開発環境は、コード補完機能がありませんが、クラウドとローカルが同期されているソースファイルをSublimeTextで編集できればコード補完機能によって生産性が向上します。
 SublimeTextとググると、ダウンロードのリンクが出てくるので、特に説明は不要ですが、後ほどコード補完機能プラグインとして導入するTernJsは、現時点でSublimeText(Version)2への導入を前提としている為に、ここではSublimeText2を導入する事とします。

(NodeJSコード補完機能をSublimeTextに導入する)

次回に続きます。
http://hanorionrails.blogspot.jp/2014/09/sublime-textnitrousio.html
Written with StackEdit.