質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

2回答

1913閲覧

node.jsのライブラリをRubyで書くための基本質問

tqkqt0

総合スコア155

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2017/04/20 01:41

編集2017/04/21 04:21

node.jsをrubyに書き換えたいのですが、node.jsがわからず困っています。
わかる限りで質問に答えていただければと思います。

プログラムはONVIFというネットワークカメラのスナップショットを取得するというものです。
ライブラリはhttps://github.com/agsh/onvifを使用
ruby onvifのgemもあるのですが、V1.8.7には非対応のため使用できず…またこれにはスナップショットをとるメソッドがない。

質問はコメントアウトしています。
難易度が高く、また読み取って頂かないと回答が難しいと思いますのでわかる範囲で構いません。
SOAPリクエストをRubyでかけたらいいのかなと思っていますがあってますかね・・
質問自体は初心者レベルかとは思いますが、大変恐縮ですがご教授いただければと思います。

node.js

1<class='javascript'> 2var CAMERA_HOST = '0.0.0.0', 3 USERNAME = 'admin', 4 PASSWORD = 'pass', 5 PORT = 80; 6 7var http = require('http'), 8 Cam = require('./lib/onvif').Cam; 9 10new Cam({ //質問① このCamは 11 hostname: CAMERA_HOST, 12 username: USERNAME, 13 password: PASSWORD, 14 port: PORT 15}, function(err) { //質問① Cam(オブジェクト?)にhostnameなどのプロパティと関数を入れている? 16 if (err) { //質問② errはなにか、このif errでerrがあればtrueなのか。 17 console.log('Connection Failed for ' + CAMERA_HOST + ' Port: ' + PORT + ' Username: ' + USERNAME + ' Password: ' + PASSWORD); 18 return; //質問③ if文をぬけるといった使い方? 19 } 20 console.log('CONNECTED'); 21 this.getSnapshotUri(function(err, ans){ //質問④このerrにはなにが入っているのか。このthisはRubyのself? 22 console.log(ans); //質問⑤ ans など定義されていないように見えるが、なにが表示されるのか。 23 }); 24}); 25</class>

▽ライブラリの使用されていると思われるメソッド

Cam.prototype.getSnapshotUri = function(options, callback) { if (callback === undefined) { callback = options; options = {}; } this._request({ //質問⑥ このthisはCam.prototype.getSnapshotUri それとも Cam.prototype.getSnapshotUri.function? service: 'media' , body: this._envelopeHeader() + '<GetSnapshotUri xmlns="http://www.onvif.org/ver10/media/wsdl">' + '<ProfileToken>' + (options.profileToken || this.activeSource.profileToken) +'</ProfileToken>' + '</GetSnapshotUri>' + this._envelopeFooter() }, function(err, data, xml) { if (callback) { //質問⑦ if callbackってcallbackがあればtrue? callback.call(this, err, err ? null : linerase(data).getSnapshotUriResponse.mediaUri, xml); } }.bind(this)); //質問⑧ このthisは? }; Cam.prototype._request = function(options, callback) {//質問⑨ 変数の中に関数をいれてる? var _this = this; var callbackExecuted = false; var reqOptions = options.url || { //質問⑩ ||がないとしたら_request変数のなかにまた変数を定義して options.url入れてる? hostname: this.hostname , port: this.port , path: options.service ? (this.uri[options.service] ? this.uri[options.service].path : options.service) : this.path }; reqOptions.headers = { 'Content-Type': 'application/soap+xml' , 'Content-Length': Buffer.byteLength(options.body, 'utf8')//options.body.length chinese will be wrong here , charset: 'ut-8' }; reqOptions.method = 'POST'; var req = http.request(reqOptions, function(res) { var bufs = [], length = 0; res.on('data', function(chunk) { bufs.push(chunk); length += chunk.length; }); res.on('end', function() { if (callbackExecuted === true) { return; } var xml = Buffer.concat(bufs, length).toString('utf8'); /** * Indicates raw xml response from device. * @event Cam#rawResponse * @type {string} */ _this.emit('rawResponse', xml); parseSOAPString(xml, callback); callbackExecuted = true; }); }); req.setTimeout(this.timeout, function() { if (callbackExecuted === true) { return; } callback(new Error('Network timeout')); callbackExecuted = true; }); req.on('error', function(err) { if (callbackExecuted === true) { return; } /* address, port number or IPCam error */ if (err.code === 'ECONNREFUSED' && err.errno === 'ECONNREFUSED' && err.syscall === 'connect') { callback(err); /* network error */ } else if (err.code === 'ECONNRESET' && err.errno === 'ECONNRESET' && err.syscall === 'read') { callback(err); } else { callback(err); } callbackExecuted = true; }); this.emit('rawRequest', options.body); req.write(options.body); req.end(); };

node.js

1//実行結果 2CONNECTED 3{ uri: 'http://0.0.0.0/onvif/snapshot', 4 invalidAfterConnect: false, 5 invalidAfterReboot: false, 6 timeout: 'PT0S' }

//質問① Cam(オブジェクト?)にhostnameなどのプロパティと関数を入れている?
//質問② errはなにか、このif errでerrがあればtrueなのか。
//質問③ if文をぬけるといった使い方?
//質問④ このerrにはなにが入っているのか。このthisはRubyのself?
//質問⑤ ans など定義されていないように見えるが、なにが表示されるのか。
//質問⑥ このthisはCam.prototype.getSnapshotUri それとも Cam.prototype.getSnapshotUri.function?
//質問⑦ if callbackってcallbackがあればtrue?
//質問⑧ このthisは?
//質問⑨ 変数の中に関数をいれてる?
//質問⑩ ||がないとしたら_request変数のなかにまた変数を定義して options.url入れてる?

質問が多くて申し訳ございません。足りない情報があればコメントください
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

SOAPリクエストを直書きしてる部分を見つけたのでそれで何とか書き直せそうです。

投稿2017/04/20 07:12

tqkqt0

総合スコア155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

V1.8.7には非対応のため使用できず

結論から言えば、いまどきRuby 1.8.7を使って開発を行おうというのは、超ハードモードです。「既存のコードに埋もれて移行できない」などでない限り、せめてRuby 2.0以上で開発を行うべきです。

投稿2017/04/20 02:03

編集2017/04/20 02:04
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tqkqt0

2017/04/20 02:07

そうなのですが、、業務上1.8.7からあげれないためどうしようもないのです…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問