雑多開発ブログ(仮)

[Rails] 配列にしたHashをform_withでpostする

Hashを配列に入れてformでpostを試みると、Stringに変換されてしまいました。
JSON.parseで元に戻せないかと試してもうまくいきませんでしたが、一工夫でちゃんとpostできました。

解決方法

こちらを参考にさせていただきました。

kei178.me

postする前にto_jsonで変換すると、JSON.parseでStringからHashに変換することができました。

まず、配列内の全てのHashをto_jsonで変換します。

@hashs = hashs.map do |h|
     h.to_json
end

次にViewでformを用いて配列をpostします。

<%= form_with url: hoge_path do |f|%>
     <% @hashs.each do |h| %>
         <%= f.hidden_field(:hashs, multiple: true, value: h )%>
     <% end %>
<% end %>

postで配列の中のStringをJSON.parseを用いてHashに変換します。

hashs = params[:hashs]
results = hashs.map do |h|
     JSON.parse(h)
end

これでresultsは元のHashの配列になりました。

VR IK モデルのねじれ Rotation修正値リスト

VR IKはアタッチして設定しただけだと体がねじれる現象が多々見られます。そこでターゲットとなるオブジェクトをRotationさせて正常な体勢になるように調節します。

モデルによってRotationの値が違うようなので、自分で正常な体勢を確認できたモデル名とその値をリストにします。
リストでは左手、右手、頭のIKターゲットを IK_Left, IK_RIght, IK_Headと表記し、Rotationの値を表にしています。
参考にしたサイトがある場合、表の下に記載しています。

ニコニ立体ちゃん (Alicia)

Place X Y Z
IK_Left 0 0 180
IK_Right 0 180 0
IK_Head -90 0 0

Space Robot Kyle

Place X Y Z
IK_Left -90 0 90
IK_Right 90 -90 0
IK_Head 0 -90 -90

参考元

VR製作のまとめ-その1-FinalIKを適用 | あもらのなかブログ

Robot KyleにVR IKをアタッチしてもReferencesが自動で適応されない

VR IK(Final IK)をUnity AssetsのRobot KyleにアタッチしてもReferencesが自動で設定されませんでした。 原因はRigがHumanoidになっていないからでした。

  • Unity v2017.3.1f1
  • Final IK v1.8
  • Robot Kyle v1.0

解決方法

こちらのモデルの設定を参考にしました。

qiita.com

Asset/Robot Kyle/Model/Robot Kyle.fbxを選択すると、Inspector/RigにAnimation Typeの選択欄が表示されます。
f:id:lilacxi:20190601195431p:plain

そこでLegacyからHumanoidに変更してApplyを押します。その後、 VR IKをアタッチすると

f:id:lilacxi:20190601195653p:plain

ちゃんとReferencesが自動で設定されています。

Twitter Search APIの種類とPremium Search APIを使うための準備

すっごく昔のツイートをSearch APIで取得しようとしたらなぜかできませんでした。なので、Search APIの詳細を調べてみることにしました。

Search APIの概要

Overview — Twitter Developers

こちらはTwitterが提供する検索用APIの情報です。(上記サイトママ)

Category Product name Supported history Query capability Counts endpoint Data fidelity
Standard Standard Search API
7 days Standard operators Not available Incomplete
Premium Search Tweets: 30-day endpoint
30 days Premium operators Available Full
Premium Search Tweets: Full-archive endpoint Tweets from as early as 2006 Premium operators
Available Full
Enterprise 30-day Search API
30 days Premium operators
Included Full
Enterprise Full-archive Search API
Tweets from as early as 2006
Premium operators
Included Full

無料で使えるStandard APIではツイートを過去七日間までしか遡ることができません。私が使っていたのはどうやらこれのようです。
対してPremium API及びEnterprise APIでは過去30日のツイートを検索できる30-day endpointと2006年以降の全期間のツイートを検索できるFull Archive endpointが提供されています。こちらを使えばひと昔のツイートも取得することができそうです。

Standard APIの使い方はいろいろな所で紹介されているので割愛します。また、Enterprise APIはその名の通り企業向けです。
したがって、過去のツイートを個人で取得するにはPremium APIを使うのがよさそうです。

Premium APIを使うための準備

TwitterAPIを使うためのtokenやkeyを発行するにはTwitterのDevelopers accountを取得する必要があります。

Developer — Twitter Developers

Developerへの登録はこちらを参考にしました。

qiita.com

Developerの登録を終え、アプリを作成したら右上の[アカウント名]→[Dev Environments]を開きます。

f:id:lilacxi:20190518185236p:plain

f:id:lilacxi:20190518185450p:plain

使いたいendpointの[Set up dev environment]を押すと以下の画面が出てきます。

f:id:lilacxi:20190518185750p:plain

ここで、Dev environment labelとAppを選択します。labelはAPIURIに含まれます。お好みで設定してください。Appは選択するか、新しいのを作成してください。
この設定をすると、選択したAppでそのendpointが使えるようになります。

また、Premium APIは無料枠が一月ごとに決まっています。これは右上のDashbordから確認することができます。

f:id:lilacxi:20190518190408p:plain

無料枠では足りない方はSubscriptionでUpgradeすることができます。

これでPremium APIが使えるようになりました。
APIのリファレンスはこちらにあります。

Premium search APIs — Twitter Developers

使い方などはまた別記事でまとめる予定です。

discordrbでbotを作ってみた

lilac-xi.hatenablog.com

こちらの記事で紹介したbotを作った過程をまとめた記事です。 本botはdiscordrbを使って作成しています。

github.com

botのコードはこちらにあります。

github.com

作っただけだとすぐ忘れるので記事にしたためます。

  • Ruby v2.5.3
  • discordrb v3.3.0

Discord開発者アカウントの登録とbotアプリ作成

discordapp.com

こちらからDiscord開発者用ページにログインします。専用アカウントを作ってもいいですし、普段使ってるDiscordアカウントでログインしても大丈夫です。 f:id:lilacxi:20190410032530p:plain

右上のNew Applicationを押すと、アプリケーション名の入力欄が出てくるので入力します。この名前は後から変更可能です。これでアプリケーションが作成できました。
次にbotの登録を行います。作成したアプリケーションを選択し、左にあるSETTINGSの一覧からBOTを選びます。するとこんな画面がでます。 f:id:lilacxi:20190410033111p:plain

右にあるAdd Botを押してYESを押しましょう。出てくるポップアップはこの操作は取り消せないという内容です。
これを完了するとbotが登録されます。discordrbでbotを扱うにはBotTOKENGeneral InformationCLIENT IDが必要です。コピーしておきましょう。
これでbotの登録は一通り完了しました。

discordrbの準備

discordのbotRubyで作る際にはdircordrbが必須なのでGemfileに記載します。また、私はtokenなどの情報を.envに記載するのでdotenvも入れます。そのため、Gemfileは以下のようになりました。

gem discordrb
gem dotenv

記載したらbundle installします。また、本botではボスを通知する際に音声でも通知できるようにしています。
discordrbで音声を送る際はここVoice dependenciesにあるものを入れる必要があります。
つまり、導入するのはlibsodium-dev,libopus0,FFmpegの三つです。

sudo apt-get install libsodium-dev libopus0 ffmpeg

もし、音声送信がうまくいかなかった場合、libopus-devを入れてみてください。

また、忘れないうちに.envにTOKENとCLIENT IDを書いておきましょう。

TOKEN="hogehogehoge"
CLIENT_ID="0000000000000"

Bot本体

詳細はGithubのbdboss.rbを参照してください。
requireでdiscordrbとdotenvを呼び出すのを忘れないようにしてください。 TOKENやCLIENT_IDをbotに認証させるには以下のように宣言します。

bot = Discordrb::Commands::CommandBot.new(
    token: ENV["TOKEN"],
    client_id: ENV["CLIENT_ID"],
    prefix:'b ',
)

prefixはbotを呼び出す時にユーザーが使うキーです。この場合はb (コマンド名)と入力するとこのbotが呼び出されるようになります。
botのコマンド名と処理は以下のように宣言します。

bot.command :コマンド名 do |event|

   ~処理内容~

end

これでdiscord上でコマンドを使えるようになりました。
discordrbのclassやmethodはこちらから探すことができます。

Module: Discordrb — Documentation for meew0/discordrb (master)

メッセージを送るのはsend_messageを使えばいいとかがわかります。用途で探してください。

コードの最後にbot.runと記載すると、.rbファイルを実行した時にbotが起動します。これでdiscordrbを使うbotの完成です。
ただPCの裏でずっとbotを動かしているわけにはいかないので、私はHerokuやGCEなどのクラウドサーバーで常時起動できるようにしています。
クラウドサーバーで常駐させる方法はまた別の記事に書きます。

「黒い砂漠」ボス時刻を通知するBotを作ってみた「Discord」

#2019/7/30追記
botが時々落ちるため不定期に再起動することがあります。再起動した場合、設定したタイマーなどは初期化されますのでご承知ください。

昨年末、黒い砂漠に二年ぶりに復帰しました。現在はDiscord有のギルドに入っているのですが、身内の中でボスを通知してくれるbotがあればいいなーという話があがりました。
調べた所わりと簡単にDiscordのbotが作れそうだったので作ってみました。本記事ではbotの使い方の解説をします。技術的な話はまた別記事にさせていただきます。 (2019/4/12 追記 書きました。)
また、本botは音声通知の音源としてsoftalkの読み上げ音声を利用させていただいております。

Bot登録

discordapp.com

こちらからbotをサーバーに追加できます。このbotが行えるのはメッセージの送信、ボイスチャットへの参加及び発言のみです。

使い方

他のbotと同様に基本的にはコマンドを入力して使用します。全てのコマンドの頭にbが付きます。したがって、b ○○○のような形式で入力してください。

b next

現在の時刻から見て次に来るボスを通知します。

f:id:lilacxi:20190220214205p:plain

次のボスが二体の場合でも両方共に通知します。次のボスがなんだったか簡単に知りたい時に使ってください。

b today(2019/4/10 追加)

当日に出現するボスの一覧を通知します。

f:id:lilacxi:20190410160801p:plain

b join

コマンドを入力したユーザーが参加しているボイスチャンネルにbotを参加させます。

f:id:lilacxi:20190220214207p:plain

音声によるボス通知を設定したい場合はこのコマンドでbotを通話に参加させてください。

b kick

b joinで参加させたbotをボイスチャンネルから退場させます。

f:id:lilacxi:20190220214209p:plain

このコマンドではボス通知をオフにすることはできません。その場合は後述するコマンドを使用してください。

b set (通知時間) (再通知間隔)

メイン機能。数値Nを指定することで、ボスが登場するN分前に通知を行います。

f:id:lilacxi:20190220222723p:plain

上記の画像のようにb set 20 5と入力すると、ボスの20分前に最初の通知を行います。その後、ボスが登場するまで5分おきに通知を行います。
この再通知間隔を設定せずにb set 20と入力しても使うことができます。その場合、再通知は行いません。
通知時間は5の倍数分で設定することができます。(5,10,15,20...など)
通知を正確に行うために、コマンドを入力した時刻から一番近い5の倍数分からタイマーがセットされます。(16時43分にコマンドを入力した場合、16時45分からタイマーが開始します。)
タイマーが開始されるまでは、再セット及びオフにすることはできません。

またbotb joinによってボイスチャンネルに接続している場合、メッセージによる通知と同時に音声による通知を行います。もし、音声通知を希望する場合はb joinbotを通話に参加させてください。

b off

b setで設定したタイマーを解除します。

f:id:lilacxi:20190220222725p:plain

b setと同様にコマンドを入力した時刻から一番近い5の倍数分にタイマーが解除されます。

まとめ

取り合えず自分の欲しい機能だけを用意したのでどこかしら不便な所があるかもしれません。
不具合や要望がある場合は私のツイッターに連絡をお願いします。

twitter.com

session_keyの名前を見つける方法

Rails5.1からはどうやらデフォルトでconfig/initializers/session_store.rbが作られなくなったようです。 session_store.rbを自分で作る際にsession_keyの名前がわかりませんでしたが、consoleで見ることができました。

環境

方法

stackoverflow.com

こちらにあるようにconsoleで

Rails.application.config.session_options[:key]
=> "_hoge_session"

と打てばsession_keyの名前がでてきます。session_store.rbには

Appname::Application.config.session_store :cookie_store, key: '_hoge_session', :expire_after => 1.hour

のように記述しますが、AppnameはRails newをした時の名前のようです。この名前はconfig/application.rbで確認できます。

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Hoge
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

moduleの横に書いてあるものがアプリケーションの名前です。