スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

web拍手 by FC2   

Windows上にNode.js環境を作った 後編 ※追記

Node.jsをWindowsで用意してみたのでその作業メモを残しておきます。
インストールして、TwitterのStreamingAPIを使うまでを行います。前編ではexpressのセットアップまで、後編ではローカルホストでWebアプリを動かすところまでやっていきます。
なお、使用しているOSは「Windows7 Professional 32ビット」です。64ビットやWindows7以外のOSの場合は画像やパスなどが異なる可能性があります。

前編: http://stersblog.blog15.fc2.com/blog-entry-420.html

C:\NodePrograms>express -h

Usage: express [options]

Options:

-h, --help output usage information
-V, --version output the version number
-s, --sessions add session support
-e, --ejs add ejs engine support (defaults to jade)
-J, --jshtml add jshtml engine support (defaults to jade)
-H, --hogan add hogan.js engine support
-c, --css add stylesheet <engine> support (less|stylus) (defaults to plain css)
-f, --force force on non-empty directory
前編の格闘した末に無事にexpressが出来ているようです
どうやらデフォルトではjadeとプレーンCSSがテンプレートエンジンとして使用されるようです。ejsやらlessやら色々できるのねこれ。
たまたま見つけたサイトではejsというものを使うようなのであわせてみます。
C:\NodePrograms>express -e NodeTwitter

create : NodeTwitter
create : NodeTwitter/package.json
create : NodeTwitter/app.js
create : NodeTwitter/public/javascripts
create : NodeTwitter/public/images
create : NodeTwitter/public
create : NodeTwitter/public/stylesheets
create : NodeTwitter/public/stylesheets/style.css
create : NodeTwitter/views
create : NodeTwitter/views/index.ejs
create : NodeTwitter/routes
create : NodeTwitter/routes/index.js

install dependencies:
$ cd NodeTwitter && npm install

run the app:
$ node app
これでNodeTwitterフォルダができており、この中に雛形が展開されているようです。
続いて依存関係をインストールします。
C:\NodePrograms>cd NodeTwitter && npm install
中略
express@3.0.0rc1 node_modules\express
├── methods@0.0.1
├── fresh@0.1.0
├── range-parser@0.0.4
├── cookie@0.0.4
├── crc@0.2.0
├── commander@0.6.1
├── debug@0.7.0
├── mkdirp@0.3.3
├── send@0.0.3 (mime@1.2.6)
└── connect@2.4.1 (bytes@0.1.0, pause@0.0.1, qs@0.4.2, formidable@1.0.11)

雛形で作成された各ファイル/フォルダについて軽く触れると、
・package.json
パッケージ管理用
・app.js
  サーバサイドJavaScript
・publicフォルダ
  クライアントに公開されるフォルダ。js/cssや画像などはここへ。
・viewsフォルダ
  クライアントに出力するテンプレート。app.jsで処理する際に動的な値が利用できる。
  (例:XXXさんがログインしました など)
・routesフォルダ
  「要求ごとに処理を定義するもの」らしいです。
  わざわざこちらへ入れずとも、app.jsに直に書くこともできるようです。
となっているようです。

続いて必要なライブラリ(socket.io、ntwitter)を入れていきます。
C:\NodePrograms\NodeTwitter>npm install socket.io
npm WARN package.json application-name@0.0.1 No README.md file found!
npm http GET https://registry.npmjs.org/socket.io
npm http 200 https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/socket.io/-/socket.io-0.9.9.tgz
npm http 200 https://registry.npmjs.org/socket.io/-/socket.io-0.9.9.tgz
npm http GET https://registry.npmjs.org/socket.io-client/0.9.9
npm http GET https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/redis/0.7.2
npm http 200 https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz
npm http 200 https://registry.npmjs.org/socket.io-client/0.9.9
npm http GET https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.9.tgz
npm http 200 https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm http 200 https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz
npm http 200 https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.9.tgz
npm http 200 https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm http GET https://registry.npmjs.org/hiredis
npm http GET https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http GET https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http GET https://registry.npmjs.org/ws
npm http 200 https://registry.npmjs.org/hiredis
npm http GET https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http 200 https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http GET https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz
npm http 200 https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http GET https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz
npm http 200 https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz
npm http 200 https://registry.npmjs.org/ws
npm http 200 https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http GET https://registry.npmjs.org/ws/-/ws-0.4.21.tgz
npm http 200 https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz
npm http 200 https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz
npm WARN package.json hiredis@0.1.14 No README.md file found!
npm http 200 https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz

> hiredis@0.1.14 preinstall C:\NodePrograms\NodeTwitter\node_modules\socket.io\node_modules\redis\node_modules\hiredis
> make || gmake

npm http 200 https://registry.npmjs.org/ws/-/ws-0.4.21.tgz
cd deps/hiredis && static
node-waf configure build
Error: 'node-waf' not found
'gmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
npm WARN optional dep failed, continuing hiredis@0.1.14
npm http GET https://registry.npmjs.org/zeparser/0.0.5
npm http GET https://registry.npmjs.org/commander
npm http GET https://registry.npmjs.org/tinycolor
npm http GET https://registry.npmjs.org/options
npm http 200 https://registry.npmjs.org/zeparser/0.0.5
npm http GET https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz
npm http 200 https://registry.npmjs.org/options
npm http GET https://registry.npmjs.org/options/-/options-0.0.3.tgz
npm http 200 https://registry.npmjs.org/tinycolor
npm http GET https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz
npm http 200 https://registry.npmjs.org/commander
npm http 200 https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz
npm http 200 https://registry.npmjs.org/options/-/options-0.0.3.tgz
npm http 200 https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz

> ws@0.4.21 install C:\NodePrograms\NodeTwitter\node_modules\socket.io\node_modules\socket.io-client\node_modules\ws
> node install.js

[ws v0.4.21] Attempting to compile blazing fast native extensions.
[ws v0.4.21] Native code compile failed (but the module will still work):
[ws v0.4.21] The native extensions are faster, but not required.
[ws v0.4.21] On Windows, native extensions require Visual Studio and Python.
[ws v0.4.21] On Unix, native extensions require Python, make and a C++ compiler.

[ws v0.4.21] Start npm with --ws:verbose to show compilation output (if any).
socket.io@0.9.9 node_modules\socket.io
├── policyfile@0.0.4
├── redis@0.7.2
└── socket.io-client@0.9.9 (xmlhttprequest@1.4.2, uglify-js@1.2.5, ws@0.4.21,
active-x-obfuscator@0.0.1)

C:\NodePrograms\NodeTwitter>npm install ntwitter
npm WARN package.json application-name@0.0.1 No README.md file found!
npm http GET https://registry.npmjs.org/ntwitter
npm http 200 https://registry.npmjs.org/ntwitter
npm http GET https://registry.npmjs.org/ntwitter/-/ntwitter-0.4.0.tgz
npm http 200 https://registry.npmjs.org/ntwitter/-/ntwitter-0.4.0.tgz
npm http GET https://registry.npmjs.org/oauth
npm http GET https://registry.npmjs.org/cookies
npm http GET https://registry.npmjs.org/keygrip
npm http 200 https://registry.npmjs.org/oauth
npm http GET https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz
npm http 200 https://registry.npmjs.org/keygrip
npm http GET https://registry.npmjs.org/keygrip/-/keygrip-0.1.7.tgz
npm http 200 https://registry.npmjs.org/cookies
npm http GET https://registry.npmjs.org/cookies/-/cookies-0.1.6.tgz
npm http 200 https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz
npm http 200 https://registry.npmjs.org/keygrip/-/keygrip-0.1.7.tgz
npm http 200 https://registry.npmjs.org/cookies/-/cookies-0.1.6.tgz

> keygrip@0.1.7 install C:\NodePrograms\NodeTwitter\node_modules\ntwitter\node_m
odules\keygrip
> node scripts/install.js

ntwitter@0.4.0 node_modules\ntwitter
├── cookies@0.1.6
├── oauth@0.9.8
└── keygrip@0.1.7
なにかところどころWARNINGが出たり"gmakeが見つかりません"なんて出ていますが大丈夫でしょうか…?
とりあえず進めて行きましょう。

◇ node.js + socket.ioでTwitterのStreaming APIを使ってみる
http://d.hatena.ne.jp/replication/20120318/1332044327
このページに載っている各コードを,丸コピ写経していきます。
app.jsとpublic/stylesheets/style.cssはおおよそそのままでいいのですが、layout.ejsは見つかりません。
のでlayout.ejsに書くものはindex.ejsに書きましょう。
ejsにUTF-8とあるので、それで統一したほうがよさそうです。

app.jsにConsumerKeyやらそのあたりを入力する必要がありますが、それはアプリケーション登録すると取得できます。このアプリではOAuth認証をしてるような雰囲気もないので、AccessTokenなども同様にアプリケーションのページから取得する必要があります。

鍵の入力が済んだら実行してみましょう。
C:\NodePrograms\NodeTwitter>node app.js
path.existsSync is now called `fs.existsSync`.
Socket.IO's `listen()` method expects an `http.Server` instance
as its first parameter. Are you migrating from Express 2.x to 3.x?
If so, check out the "Socket.IO compatibility" section at:
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
info - socket.io started

C:\NodePrograms\NodeTwitter\app.js:42
console.log("Express server listening on port %d in %s mode", app.address().po
^
TypeError: Object function app(req, res){ app.handle(req, res); } has no method
'address'
at Object. (C:\NodePrograms\NodeTwitter\app.js:42:67)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
Socket.IOのlisten()にhttp、Serverを入れろ、app.address()が見つからない、の2つが言われていますね…
どうやらNode.jsやらexpressのバージョンが違ったりなんだでだめなんですかね?

前者は
Migrating from 2.x to 3.x
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
を見ろ。と書いてあるのでチェック。
Socket.IO compatibility
var app = express()
, http = require('http');
, server = http.createServer(app)
, io = require('socket.io').listen(server);
server.listen(3000);
と書いてありますね。

app.jsには
var app = module.exports = express.createServer();
var twitter = require('ntwitter');
var io = require('socket.io').listen(app);
~~~~~
app.listen(3000);
と書いてあります。これを説明書きにのっとって次のように書き換えます。
var http = require('http'),
app = module.exports = express(),
server = http.createServer(app),
io = require('socket.io').listen(server),

twitter = require('ntwitter');

そして実行。。
c:\NodePrograms\NodeTwitter\app.js:45
console.log("Express server listening on port %d in %s mode", app.address().po
^
TypeError: Object function app(req, res){ app.handle(req, res); } has no method
'address'
at Object. (c:\NodePrograms\NodeTwitter\app.js:45:67)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
お、特に何も言われずに消えましたね。とりあえずこれで行きましょう。
次のapp.address()が見つからねーよ!はとりあえずこうしてみましたが、どうなんでしょう・・・。
var port = 3000;
app.listen(port);
console.log("Express server listening on port %d in %s mode", port, app.settings.env);
どなたか詳しいお方がいればこのあたりのことを教えて欲しいです!←
と、いうかプログラムのほうでポート指定できるの!?ほへー・・・

c:\NodePrograms\NodeTwitter>node app.js
info - socket.io started
path.existsSync is now called `fs.existsSync`.
Express server listening on port 3000 in development mode
はい、これでサーバが動いているようです。http://localhost:3000/にアクセスしてみましょう。
20120802_10.jpg
出たには出ました。が、動きません。
考えられるのはクライアント側のJavaScriptが動いていない、でしょうか。socket.ioはWebSocketのライブラリ(多分;)なので、これのクライアント側に出すjsファイルの自動生成がうまくいっていないのでしょう。
ソースから確認します。
20120802_11.jpg 20120802_12.jpg
えーっと・・・・・大先生に聞いてみましょう!w
「Cannot GET /socket.io/socket.io.js」の解決法 (Node.js v0.8.0/express v3.0.0/socket.io v0.9.6)
http://blog.fkoji.com/2012/06300058.html
なるほど、soket.ioのlisten()にはapp.listen()を渡してあげなくちゃいけないんですね。
早速直していきます。
var port = 3000,

http = require('http'),
app = module.exports = express(),
io = require('socket.io').listen(app.listen(port)),

twitter = require('ntwitter');

console.log("Express server listening on port %d in %s mode", port, app.settings.env);
Node.jsサーバの再起動をします。
と、いってもこの状態ではなにも受け付けてくれないので、Ctrl+Cを押して実行をやめてもらいます。
~~~~
^C
c:\NodePrograms\NodeTwitter>node app.js
info - socket.io started
path.existsSync is now called `fs.existsSync`.
Express server listening on port 3000 in development mode
そして先程のhttp://localhost:3000/socket.io/socket.io.jsに接続して確認してみます。
20120802_13.jpg
ちゃんと出てますね。
では、トップページに繋いで動作確認といきましょう。
20120802_14.jpg
ぶわわわわわわわわっと出てきましたw
使用しているTwitterAPIは'statuses/filter'
どうやらパプリックステータスからフィルタした結果を返してもらうAPIです。フィルタの仕様からか、わかれていない文字にマッチするフィルタは出来ないようです。
例えば"明日はいい天気だ"は"天気"でひっかからないみたいですね。そのせいか日本語でのフィルタは難しいようです。

はい。
以上でNode.jsの環境構築からTwitter連携のテストアプリが出来ました。
次はTwitter繋がりでOAuth認証に行ってみたいと思います。



追記
なんだか手元のファイルとここに書かれている内容が違う上に、使用しているモジュールのバージョンも不明なので、ここで記述されているソースや解説の信憑性があやしいことになっています。

再度、一から書き直しますのでそれまで。。

(OAuth認証やってみますね、とか書いたけどそれも書いてないしいろいろ駄目…)

web拍手 by FC2   

コメントの投稿


非公開コメント

コメント

STERS's Development Room

STERSの開発室っぽい何か。


プロフィール

Name:STERS
Unity3D/C#/PHP/js/C++/VB
などを勉強中です

[STERS's Room]
[ファイル置き場]

カテゴリー
最近の記事
最近のコメント
カレンダー
07 ≪│2017/08│≫ 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
RSSリンクの表示
ブログ内Google検索
Google
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。