前提・実現したいこと
railsで作成しているアプリケーション内でデータベースに保存したデータを分析したいのですが、以前にデータベースではなくSDカードからデータを読み込み分析するプログラム(Ruby)があります。このプログラムをrailsのアプリケーション内に組み込む方法が知りたいです。
発生している問題・エラーメッセージ
外部のrubyプログラムをrailsに組み込み、動作させたい
調べた内容・試した内容
railsで外部のrubyプログラムを動作させたい
上記の質問での回答やそのコメントでclass化するや、methodにするといったアドバイスをいただきましたが、たくさんのクラスからなっているrubyのプログラムをどう組み込めばいいのかというところで詰まっています
該当のソースコード
controller
1require 'net/http' 2require 'net/https' 3require 'uri' 4require 'json' 5 6class AddressController < ApplicationController 7 def show 8 params = URI.encode_www_form({token: '*********'}) 9 # URIを解析し、hostやportをバラバラに取得できるようにする 10 uri = URI.parse("apiのURL?#{params}") 11 12 @query = uri.query 13 puts "aaa" 14 # 新しくHTTPセッションを開始し、結果をresponseへ格納 15 response = Net::HTTP.start(uri.host, 16 use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE, 17 #response = https.start 18 # 接続時に待つ最大秒数を設定 19 open_timeout: 5 20 # 読み込み一回でブロックして良い最大秒数を設定 21 #read_timeout: 10 22 # ここでWebAPIを叩いている 23 # Net::HTTPResponseのインスタンスが返ってくる 24 ){|https| https.get(uri.request_uri)} 25 26 puts "ccc" 27 # 例外処理の開始 28 begin 29 print "response=" 30 puts response 31 puts uri 32 # responseの値に応じて処理を分ける 33 case response 34 # 成功した場合 35 when Net::HTTPSuccess 36 # responseのbody要素をJSON形式で解釈し、hashに変換 37 puts "a" 38 @result = JSON.parse(response.body) 39 # 表示用の変数に結果を格納 40 for i in 0..99 do 41 @value = @result["results"][i]["value"] 42 cannel = @result["results"][i]["channel"] 43 if cannel == 0 then 44 Rawdate.create(:time => @value) 45 else 46 Rawdate.create(:distance => @value) 47 end 48 end 49 @size = @result["meta"]["count"] 50 51 52 # 別のURLに飛ばされた場合 53 when Net::HTTPRedirection 54 @message = "Redirection: code=#{response.code} message=#{response.message}" 55 # その他エラー 56 else 57 @message = "HTTP ERROR: code=#{response.code} message=#{response.message}" 58 end 59 # エラー時処理 60 rescue IOError => e 61 @message = e.message 62 rescue TimeoutError => e 63 @message = e.message 64 rescue JSON::ParserError => e 65 @message = e.message 66 rescue => e 67 @message = e.message 68 end 69 end 70end
上記のcontrollerでデータベースに保存したデータを、下記のプログラムで処理したいと考えております。 すべてのプログラムを載せてしまうと膨大な量になってしまうため、mainだけ抜粋して載せます。
main
1require_relative 'read/read_main' 2require_relative 'object_data/object_data' 3require_relative 'number_data/number_data_main' 4require_relative 'S_D_data/S_D_data_main' 5require_relative 'transit_time/transit_data_main' 6require_relative 'range_data/range_main' 7require_relative 'count/count_main' 8require_relative 'write/write_main' 9 10file_read = Read_main.new 11write = Write_main.new 12#p file_read.start_time 13#p file_read.sensing_dis 14#p file_read.data_cnt 15p file_read.main 16 17object_data = Object_data.new(file_read.main, file_read.data_cnt) 18print "\n---------------object_data------------------\n" 19#p object_data.main 20object_data.drow 21print "\n--------------------------------------------\n" 22 23 24q_flag = 0 25 26count = Count_main.new(object_data.main) 27 28#p count.count_number #データの個数 29#exit 30 31 32 33count.count_number.times do |i| 34 printf("\nデータ番号: %d\n", i) 35 weight = 0 36 number_data = Number_main.new(object_data.main) 37 #p number_data.weight(i).class 38 #p number_data.weight(i) 39 if number_data.weight(i).class == Float 40 printf("データ数重み: %f\n", number_data.weight(i)) 41 weight += number_data.weight(i) 42 else 43 printf("データ数重み: ?\n") 44 q_flag = 1 45 end 46 47 if q_flag == 0 48 s_d = S_D_main.new(object_data.main) 49 #p s_d.val(0) 50 #p s_d.weight(i) 51 if s_d.weight(i).class == Float 52 printf("標準偏差重み: %f\n", s_d.weight(i)) 53 weight += s_d.weight(i) 54 else 55 printf("標準偏差重み: ?\n") 56 q_flag = 1 57 end 58 end 59 60 if q_flag == 0 61 transit_time = Transit_main.new(object_data.main) 62 #p transit_time.drow(0) 63 if transit_time.weight(i).class == Float 64 printf("経過時間重み: %f\n", transit_time.weight(i)) 65 weight += transit_time.weight(i) 66 else 67 printf("経過時間重み: ?\n") 68 q_flag = 1 69 end 70 end 71 72 if q_flag == 0 73 range = Range_main.new(object_data.main) 74 #p range.val(0) 75 if range.weight(i).class == Float 76 printf("距離範囲重み: %f\n", range.weight(i)) 77 weight += range.weight(i) 78 else 79 printf("距離範囲重み: ?\n") 80 q_flag = 1 81 end 82 end 83 84 85 if q_flag == 0 86 printf("重み合計: %f\n", weight) 87 else 88 printf("重み合計: ?\n") 89 end 90 91 write.count_car_or_human(weight,q_flag) 92 93 q_flag = 0 94 95end 96 97#write.count_ans 98printf("\n---------------------result------------------------\n") 99printf("車であろう確率: %f %\n",write.probability_car(count.count_number)) 100printf("人であろう確率: %f %\n",write.probability_human(count.count_number)) 101printf("判定不可能なオブジェクトの確率: %f %",write.probability_q(count.count_number)) 102printf("\n---------------------------------------------------\n") 103 104printf("\n---------------------result------------------------\n") 105printf("全体のオブジェクト個数: %d \n",count.count_number) 106printf("車であろう個数: %d \n",write.count_car) 107printf("人であろう個数: %d \n",write.count_human) 108printf("判定不可能なオブジェクトの個数: %d ",write.count_q) 109printf("\n---------------------------------------------------\n") 110
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5.p114
rails 6.0.2.1
sqlite3 3.30.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/23 08:15
2020/01/23 08:35
2020/01/23 09:30
2020/01/23 09:47
2020/01/27 23:56