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

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

ただいまの
回答率

87.77%

railsアプリケーションにrubyのプログラムを組み込みたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 406

score 38

前提・実現したいこと

railsで作成しているアプリケーション内でデータベースに保存したデータを分析したいのですが、以前にデータベースではなくSDカードからデータを読み込み分析するプログラム(Ruby)があります。このプログラムをrailsのアプリケーション内に組み込む方法が知りたいです。

発生している問題・エラーメッセージ

外部のrubyプログラムをrailsに組み込み、動作させたい

調べた内容・試した内容

railsで外部のrubyプログラムを動作させたい
上記の質問での回答やそのコメントでclass化するや、methodにするといったアドバイスをいただきましたが、たくさんのクラスからなっているrubyのプログラムをどう組み込めばいいのかというところで詰まっています

該当のソースコード

require 'net/http'
require 'net/https'
require 'uri'
require 'json'

class AddressController < ApplicationController
    def show
      params = URI.encode_www_form({token: '*********'})
      # URIを解析し、hostやportをバラバラに取得できるようにする
      uri = URI.parse("apiのURL?#{params}")

      @query = uri.query
      puts "aaa"
      # 新しくHTTPセッションを開始し、結果をresponseへ格納
      response = Net::HTTP.start(uri.host, 
        use_ssl: true,  verify_mode: OpenSSL::SSL::VERIFY_NONE,
        #response = https.start
        # 接続時に待つ最大秒数を設定
        open_timeout: 5
        # 読み込み一回でブロックして良い最大秒数を設定
        #read_timeout: 10
        # ここでWebAPIを叩いている
        # Net::HTTPResponseのインスタンスが返ってくる
      ){|https| https.get(uri.request_uri)}

      puts "ccc"
      # 例外処理の開始
      begin
        print "response=" 
        puts response
        puts uri
        # responseの値に応じて処理を分ける
        case response
        # 成功した場合
        when Net::HTTPSuccess
          # responseのbody要素をJSON形式で解釈し、hashに変換
          puts "a"
          @result = JSON.parse(response.body)
          # 表示用の変数に結果を格納
          for i in 0..99 do
            @value = @result["results"][i]["value"]
            cannel = @result["results"][i]["channel"]
            if cannel == 0 then
              Rawdate.create(:time => @value)
            else
              Rawdate.create(:distance => @value)
            end
          end
          @size = @result["meta"]["count"]


        # 別のURLに飛ばされた場合
        when Net::HTTPRedirection
          @message = "Redirection: code=#{response.code} message=#{response.message}"
        # その他エラー
        else
          @message = "HTTP ERROR: code=#{response.code} message=#{response.message}"
        end
      # エラー時処理
      rescue IOError => e
        @message = e.message
      rescue TimeoutError => e
        @message = e.message
      rescue JSON::ParserError => e
        @message = e.message
      rescue => e
        @message = e.message
    end
  end
end
上記のcontrollerでデータベースに保存したデータを、下記のプログラムで処理したいと考えております。
すべてのプログラムを載せてしまうと膨大な量になってしまうため、mainだけ抜粋して載せます。
require_relative 'read/read_main'
require_relative 'object_data/object_data'
require_relative 'number_data/number_data_main'
require_relative 'S_D_data/S_D_data_main'
require_relative 'transit_time/transit_data_main'
require_relative 'range_data/range_main'
require_relative 'count/count_main'
require_relative 'write/write_main'

file_read = Read_main.new
write = Write_main.new
#p file_read.start_time
#p file_read.sensing_dis
#p file_read.data_cnt
p file_read.main

object_data = Object_data.new(file_read.main, file_read.data_cnt)
print "\n---------------object_data------------------\n"
#p object_data.main
object_data.drow
print "\n--------------------------------------------\n"


q_flag = 0

count = Count_main.new(object_data.main)

#p count.count_number #データの個数
#exit



count.count_number.times do |i|
  printf("\nデータ番号: %d\n", i)
  weight = 0
  number_data = Number_main.new(object_data.main)
  #p number_data.weight(i).class
  #p number_data.weight(i)
  if number_data.weight(i).class == Float
    printf("データ数重み: %f\n", number_data.weight(i))
    weight += number_data.weight(i)
  else
    printf("データ数重み: ?\n")
    q_flag = 1
  end

  if q_flag == 0
    s_d = S_D_main.new(object_data.main)
    #p s_d.val(0)
    #p s_d.weight(i)
    if s_d.weight(i).class == Float
      printf("標準偏差重み: %f\n", s_d.weight(i))
      weight += s_d.weight(i)
    else
      printf("標準偏差重み: ?\n")
      q_flag = 1
    end
  end

  if q_flag == 0
    transit_time = Transit_main.new(object_data.main)
    #p transit_time.drow(0)
    if transit_time.weight(i).class == Float
      printf("経過時間重み: %f\n", transit_time.weight(i))
      weight += transit_time.weight(i)
    else
      printf("経過時間重み: ?\n")
      q_flag = 1
    end
  end

  if q_flag == 0
    range = Range_main.new(object_data.main)
    #p range.val(0)
    if range.weight(i).class == Float
      printf("距離範囲重み: %f\n", range.weight(i))
      weight += range.weight(i)
    else
      printf("距離範囲重み: ?\n")
      q_flag = 1
    end
  end


  if q_flag == 0
    printf("重み合計: %f\n", weight)
  else
    printf("重み合計: ?\n")
  end

  write.count_car_or_human(weight,q_flag)

  q_flag = 0

end

#write.count_ans
printf("\n---------------------result------------------------\n")
printf("車であろう確率: %f %\n",write.probability_car(count.count_number))
printf("人であろう確率: %f %\n",write.probability_human(count.count_number))
printf("判定不可能なオブジェクトの確率: %f %",write.probability_q(count.count_number))
printf("\n---------------------------------------------------\n")

printf("\n---------------------result------------------------\n")
printf("全体のオブジェクト個数: %d \n",count.count_number)
printf("車であろう個数: %d \n",write.count_car)
printf("人であろう個数: %d \n",write.count_human)
printf("判定不可能なオブジェクトの個数: %d ",write.count_q)
printf("\n---------------------------------------------------\n")

補足情報(FW/ツールのバージョンなど)

ruby 2.6.5.p114
rails 6.0.2.1
sqlite3 3.30.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

独立したプログラムですと
1) 起動時にコマンドラインなどからどう動作するのか、の条件を取込み設定する
2) 処理する
3) 後始末する
とまあ大きく3つに分けられます。

classがいくつあろうと、2)の入り口は一つでしょうから、
0)DBからデータを取り出し、2)が動くのに使える形に整える
1') 動作条件を設定する
2)を呼ぶ
3')DBに書き出す
という具合に使えるように、2)の部分を切り出してみてください。

なお、このclass全体は vender とか lib とかに置くようにすると元々のRailsアプリと混乱しません。

追記
まずは main.rb を書きなおして
実質の実行文を

  初期化
  計算
  出力
end


の3行にしてしまい

def 初期化
end

def 計算
end

def 出力
end


に切り出すところをやってみてください。

次に、計算に使うデータを 今は何からかな? それをデータをDBから取り出すのに変更するわけですが、初期化でその部分だけをさらに method にして、DBからのに置き換える準備を行う

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/23 18:30

    返信ありがとうございます。
    データの取り出しに関しては今後一切をdbから行うので、完全に書き換えてしまおうと思っています。
    実装に関してですが、このmainとrequireされているファイルをrailsのlib下において、controllerでrequireして、methodを呼べばいいのでしょうか?

    キャンセル

  • 2020/01/23 18:47

    完全に書き換えてしまうのでしたら、中に組み込んでしまってもよいかと。
    どこにおいても取り込めますが、その計算の性格によって置き場所を考えてください
    その計算が
    本来はこのRailsアプリのやるべきこと であるなら models/consernsに

    キャンセル

  • 2020/01/28 08:56

    なるほどです、ありがとうございます。
    concerns下にmoduleで作っておいてみます。

    キャンセル

0

通常、移植とは異なるプラットフォームでも動作を可能とさせるための
作業をさします。
わかりやすく言うなら、iphoneで動作しているソフトウェアをアンドロイド端末でも
動作させるというような意味合いの時、移植作業とよびます。

発生している問題・エラーメッセージさえ何もない状態で何が問題なのかも
明確に記載されていません。

まずは、表題から見直し、なにをどうしたいのか整理し
実際に作業を行い、こういう事を実現したい所
やってみたら、hogehogeというメッセージがでて
実現したいことが出来なかった。
という様な文面にしたほうが、回答を得やすいとおもいます。

現状、何が問題で、なにがしたいのかわかりませんでした。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/23 17:06

    回答ありがとうございます。今回私の認識不足で「何が問題で、何がしたいのかわからない」といった状況を招いてしまったことを大変申し訳なく思っております。
    私自身、rails,rubyともに最近学習しはじめた者でありまして、調べ物をしてわからなければすぐ聞けばいいかという思いで質問をさせていただきました。今後はもう少し自分で問題を精査し、本当にわからないとなったところで質問をしようと思います。ありがとうございました。

    キャンセル

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

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

関連した質問

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