[Rails] 配列にしたHashをform_withでpostする
Hashを配列に入れてformでpostを試みると、Stringに変換されてしまいました。
JSON.parseで元に戻せないかと試してもうまくいきませんでしたが、一工夫でちゃんとpostできました。
解決方法
こちらを参考にさせていただきました。
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 |
参考元
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
解決方法
こちらのモデルの設定を参考にしました。
Asset/Robot Kyle/Model/Robot Kyle.fbxを選択すると、Inspector/RigにAnimation Typeの選択欄が表示されます。
そこでLegacyからHumanoidに変更してApplyを押します。その後、 VR IKをアタッチすると
ちゃんとReferencesが自動で設定されています。
Twitter Search APIの種類とPremium Search APIを使うための準備
すっごく昔のツイートをSearch APIで取得しようとしたらなぜかできませんでした。なので、Search APIの詳細を調べてみることにしました。
Search APIの概要
こちらは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を使うための準備
TwitterのAPIを使うためのtokenやkeyを発行するにはTwitterのDevelopers accountを取得する必要があります。
Developer — Twitter Developers
Developerへの登録はこちらを参考にしました。
Developerの登録を終え、アプリを作成したら右上の[アカウント名]→[Dev Environments]を開きます。
使いたいendpointの[Set up dev environment]を押すと以下の画面が出てきます。
ここで、Dev environment labelとAppを選択します。labelはAPIのURIに含まれます。お好みで設定してください。Appは選択するか、新しいのを作成してください。
この設定をすると、選択したAppでそのendpointが使えるようになります。
また、Premium APIは無料枠が一月ごとに決まっています。これは右上のDashbordから確認することができます。
無料枠では足りない方はSubscriptionでUpgradeすることができます。
これでPremium APIが使えるようになりました。
APIのリファレンスはこちらにあります。
Premium search APIs — Twitter Developers
使い方などはまた別記事でまとめる予定です。
discordrbでbotを作ってみた
こちらの記事で紹介したbotを作った過程をまとめた記事です。 本botはdiscordrbを使って作成しています。
botのコードはこちらにあります。
作っただけだとすぐ忘れるので記事にしたためます。
- Ruby v2.5.3
- discordrb v3.3.0
Discord開発者アカウントの登録とbotアプリ作成
こちらからDiscord開発者用ページにログインします。専用アカウントを作ってもいいですし、普段使ってるDiscordアカウントでログインしても大丈夫です。
右上のNew Applicationを押すと、アプリケーション名の入力欄が出てくるので入力します。この名前は後から変更可能です。これでアプリケーションが作成できました。
次にbotの登録を行います。作成したアプリケーションを選択し、左にあるSETTINGSの一覧からBOTを選びます。するとこんな画面がでます。
右にあるAdd Botを押してYESを押しましょう。出てくるポップアップはこの操作は取り消せないという内容です。
これを完了するとbotが登録されます。discordrbでbotを扱うにはBotのTOKENとGeneral InformationのCLIENT IDが必要です。コピーしておきましょう。
これでbotの登録は一通り完了しました。
discordrbの準備
discordのbotをRubyで作る際には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登録
こちらからbotをサーバーに追加できます。このbotが行えるのはメッセージの送信、ボイスチャットへの参加及び発言のみです。
使い方
他のbotと同様に基本的にはコマンドを入力して使用します。全てのコマンドの頭にb
が付きます。したがって、b ○○○
のような形式で入力してください。
b next
現在の時刻から見て次に来るボスを通知します。
次のボスが二体の場合でも両方共に通知します。次のボスがなんだったか簡単に知りたい時に使ってください。
b today(2019/4/10 追加)
当日に出現するボスの一覧を通知します。
b join
コマンドを入力したユーザーが参加しているボイスチャンネルにbotを参加させます。
音声によるボス通知を設定したい場合はこのコマンドでbotを通話に参加させてください。
b kick
b join
で参加させたbotをボイスチャンネルから退場させます。
このコマンドではボス通知をオフにすることはできません。その場合は後述するコマンドを使用してください。
b set (通知時間) (再通知間隔)
メイン機能。数値Nを指定することで、ボスが登場するN分前に通知を行います。
上記の画像のようにb set 20 5
と入力すると、ボスの20分前に最初の通知を行います。その後、ボスが登場するまで5分おきに通知を行います。
この再通知間隔を設定せずにb set 20
と入力しても使うことができます。その場合、再通知は行いません。
通知時間は5の倍数分で設定することができます。(5,10,15,20...など)
通知を正確に行うために、コマンドを入力した時刻から一番近い5の倍数分からタイマーがセットされます。(16時43分にコマンドを入力した場合、16時45分からタイマーが開始します。)
タイマーが開始されるまでは、再セット及びオフにすることはできません。
またbotがb join
によってボイスチャンネルに接続している場合、メッセージによる通知と同時に音声による通知を行います。もし、音声通知を希望する場合はb join
でbotを通話に参加させてください。
b off
b set
で設定したタイマーを解除します。
b set
と同様にコマンドを入力した時刻から一番近い5の倍数分にタイマーが解除されます。
まとめ
取り合えず自分の欲しい機能だけを用意したのでどこかしら不便な所があるかもしれません。
不具合や要望がある場合は私のツイッターに連絡をお願いします。
session_keyの名前を見つける方法
Rails5.1からはどうやらデフォルトでconfig/initializers/session_store.rbが作られなくなったようです。 session_store.rbを自分で作る際にsession_keyの名前がわかりませんでしたが、consoleで見ることができました。
環境
方法
こちらにあるように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の横に書いてあるものがアプリケーションの名前です。