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

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

ただいまの
回答率

88.31%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,131

tqkqt0

score 143

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

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

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

<class='javascript'>
var CAMERA_HOST = '0.0.0.0',
        USERNAME = 'admin',
        PASSWORD = 'pass',
        PORT = 80;

var http = require('http'),
        Cam = require('./lib/onvif').Cam;

new Cam({ //質問① このCamは
        hostname: CAMERA_HOST,
        username: USERNAME,
        password: PASSWORD,
        port: PORT
}, function(err) { //質問① Cam(オブジェクト?)にhostnameなどのプロパティと関数を入れている?
        if (err) { //質問② errはなにか、このif errでerrがあればtrueなのか。
                console.log('Connection Failed for ' + CAMERA_HOST + ' Port: ' + PORT + ' Username: ' + USERNAME + ' Password: ' + PASSWORD);
                return; //質問③ if文をぬけるといった使い方?
        }
        console.log('CONNECTED');
        this.getSnapshotUri(function(err, ans){ //質問④このerrにはなにが入っているのか。このthisはRubyのself?
                console.log(ans); //質問⑤ ans など定義されていないように見えるが、なにが表示されるのか。
        });
});
</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();
};
//実行結果
CONNECTED
{ uri: 'http://0.0.0.0/onvif/snapshot',
  invalidAfterConnect: false,
  invalidAfterReboot: false,
  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入れてる?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/20 11:07

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

    キャンセル

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

  • ただいまの回答率 88.31%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る