Rails 5.1へのAdminLTE導入メモ

Railsアプリケーションの管理画面がAdminLTEで構築しようとしています。最近のRailsのやり方でやってみようとしました。

dazooo.hatenablog.com

ただ、この方法だとAdminLTEのバージョンが2.3.8で、最新は2.4.0になっていました。そのため、AdminLTEはパッケージの仕組みではなく、assetsディレクトリーに保管するようにしました。

jQueryはyarnでセットアップしました。

$ brew install yarn
$ yarn add jquery

application.jsにjQueryを追加します。

//= require rails-ujs
//= require jquery
//= require_tree .

今回はBootstrapもassetsディレクトリ以下に保存しました。

OmniAuthでFitbitのOAuth2認証を利用

以前はFitbitではOAuth 1.0とOAuth 2.0の両方のインターフェースが用意されていましたが、OAuth 2.0のほうが利用できるデータも多いですし、Fitbitの公式ドキュメントもOAuth 2.0を前提とした記述になっています。

omniauth-fitbit-oauth2を利用します。

github.com

Gemfileに以下の記述を追加します。

gem 'devise'
gem 'omniauth-fitbit-oauth2'

bundleコマンドでインストールして、Deviseに関連するファイルを作成します。

$ bundle
$ rails g devise:install
$ rails g devise User
$ rails g devise:views

db/migrate以下にあるxxxxxxxxxxxxxx_devise_create_users.rbにカラムを追加します。

## Omniauthable
t.string :uid
t.string :provider

config/initializers/devise.rbにOAuth 2.0 Client IDとClient (Consumer) Secretを指定します。また、scopeに操作するデータを指定します。

config.omniauth :fitbit_oauth2, "CLIENT_ID", "CLIENT_SECRET", scope: 'heartrate'

これらの値は、Fitbitの場合は以下のサイトでアプリケーションを登録して取得することになります。CLIENT_IDはOAuth 1.0とOAuth 2.0で違ったものになります。

dev.fitbit.com

また、Callback URLを指定する必要があります。例えばRailsの開発環境で動作させるためには、以下のように指定します。

http://localhost:3000/users/auth/fitbit_oauth2/callback

app/models/user.rbにomniauthableオプションを追加します。

devise :omniauthable, omniauth_providers: [:fitbit_oauth2]

config/routes.rbにdeviseのルーティングを設定します。

devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }

OmniAuthのコールバックのためのコントローラーを作成します。

$ rails g controller users/omniauth_callbacks

app/controllers/users/omniauth_callbacks_controller.rbに以下の記述を追加します。

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def fitbit_oauth2
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "Fitbit") if is_navigational_format?
    else
      session["devise.fitbit_data"] = request.env["omniauth.auth"].except("extra")
      redirect_to new_user_registration_url
    end
  end
end

request.env["omniauth.auth"].except("extra")としているのは、request.env["omniauth.auth"]のままだと、Cookieのサイズの問題でエラーが発生してしまうためです。

app/models/user.rbに以下のメソッドを追加します。その際、emailについてはuidを利用したものを仮想的に入力するように指定します。これは、DeviseではUserのemailがユニークな必要があるためです。

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    if auth.provider == 'fitbit_oauth2'
      user.email = "#{auth.uid}@fitbit.com"
    else
      user.email = auth.info.email
    end
    user.password = Devise.friendly_token[0,20]
    # user.name = auth.info.name   # assuming the user model has a name
    # user.image = auth.info.image # assuming the user model has an image
  end
end

DeviseとOmniAuth関係の基本的な設定はこれで完了です。

$ rails g controller welcome index

app/controllers/welcome_controller.rbを以下のように編集します。

class WelcomeController < ApplicationController
  before_action :authenticate_user!

  def index
  end
end

app/views/welcome/index.html.erbを以下のように編集します。

<h1>Welcome#index</h1>
<p>Find me in app/views/welcome/index.html.erb</p>

<% if user_signed_in? %>
  Signed in as <%= current_user.email %>.
  <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
<% else %>
  <%= link_to "Sign up", new_user_registration_path %> or
  <%= link_to "Sign in", new_user_session_path %>
<% end %>

config/routes.rbにrootを指定します。

root 'welcome#index'

これで、OAuth 2.0を利用してFitbitアカウントとDeviseのomniauthableオプションを利用した認証が動作するようになりました。

Devise+OmniAuthで直接Googleのログイン画面を表示する方法

DeviseとOmniAuthでGoogleアカウントと連携するアプリケーションを開発しています。Deviseでは認証が要求される場合には、Deviseのログイン画面が開きます。しかし、Googleのアカウントのみと連携するアプリケーションであれば、直接Googleのログイン画面を表示させたほうがシンプルになります。

以下の情報を参考にして設定することができました。

stackoverflow.com

qiita.com

  • config/initializer/devise.rb
# ==> Warden configuration
# If you want to use other strategies, that are not supported by Devise, or
# change the failure app, you can configure them inside the config.warden block.
#
# config.warden do |manager|
#   manager.intercept_401 = false
#   manager.default_strategies(scope: :user).unshift :some_external_strategy
# end
config.warden do |manager|
  manager.failure_app = CustomAuthenticationFailure
end

リダイレクト先にGoogleのログインページにリダイレクトするパスを指定します。

  • lib/custom_authentication_failure.rb
class CustomAuthenticationFailure < Devise::FailureApp
  protected
  def redirect_url
    user_google_omniauth_authorize_path
  end
end

libディレクトリ以下のファイルをロードするように設定します。

  • config/application.rb
config.autoload_paths += %W(#{config.root}/lib)

これらの設定で、これまでDeviseのログイン画面を表示していた処理が、直接Googleのログイン画面を表示するようになりました。

Material Design LiteでAdsenseを2回ロードさせない方法

Material Design LiteでAdsenseのコードを貼り付けると、2回ロードされてしまうことがあります。

github.com

mdl-componentupgradedイベントで処理する方法が示されていて、日本語の解説記事もありました。

b.0218.jp

ただ、私がこの方法でやってみて、最初はうまくいきませんでした。Javascriptのコードは記事に示されていた通り、以下のように記述していました。

document.addEventListener('mdl-componentupgraded', function() {
  if (!document.getElementById('adsbygooglejs')) {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.id = 'adsbygooglejs';
    script.src = "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js";
    head.appendChild(script);
  }\
});

原因は私のAdsenseを呼び出すHTMLが間違っていました。私の場合、以下のように記述していました。

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-xxxxxxxxxxxxxxxx" data-ad-slot="xxxxxxxxxx" data-ad-format="auto"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

さきほどのJavascriptはAdsenseのJavascriptをmdl-componentupgradedイベントで読み込むようにしていたので、それ以外の場所でAdsenseのJavascriptを読み込むようにしてはいけないことに気づきました。さきほどのHTMLの最初の行を削除して、以下のようにして正常に動作させることができました。

<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-xxxxxxxxxxxxxxxx" data-ad-slot="xxxxxxxxxx" data-ad-format="auto"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

バーベキューの食材の調達にREALBBQ

千葉県八街のバーベキューに誘われたので行きました。私にとって数年ぶりのバーベキューでした。

バーベキューの食材は調達がなかなか大変で、スーパーで大きめのお肉を買うくらいしか現実的な選択肢は無いと思っていたのですが、現地にはどう見ても普通では買えないような食材が並んでいました。「REALBBQ」というシールが貼られていました。

realbbq.jp

お肉はどれも大きなサイズで肉厚、そして柔らかいという素晴らしいものばかりでした。REALBBQの通販サイトがあって、ここで購入できるようです。価格的にも、この品質なら十分にリーズナブルな設定のように思いました。これからバーベキューをする機会があれば、REALBBQを利用することを選択肢に入れていきたいです。

market.realbbq.jp

ヘルスグリッド株式会社で発表したニュースアーカイブ(2015年4月〜2017年5月)

私が2017年5月末で退職したヘルスグリッド株式会社ですが、会社のWebサイトに掲載されていたニュースが削除されていました。私の実績のリンク集として利用させていただいていた情報でもあったので、こちらのページにアーカイブとして保存しておくことにしました。

私が勤務していた2015年4月〜2017年5月のニュースアーカイブです。この期間の実績は、2017年5月31日に退職した私と部坂英夫氏が中心になってやっていたことばかりです。

これらの活動の方針に異議を唱えた棚橋孝江氏の多数派工作によって、株主総会で会社の経営方針の転換が決定されました。これらの活動には終止符が打たれ、2017年5月31日以降の新しい経営体制で「生涯健康口座」というものを進めていくそうです。

2017年5月31日

このたびヘルスグリッド株式会社におきまして、株主総会および取締役会が開催され、代表取締役社長として車田直昭が選任され、就任いたしました。また取締役には、山田恒夫および山羽教文が選任され、就任いたしました。今後、創業時の棚橋孝江の構想である健康情報に関するプラットフォーム構築等を推進してまいります。今後とも引き続き倍旧のご指導ご支援を賜りたく、よろしくお願い申し上げます。

(株主総会で大騒ぎしてヘルスグリッド株式会社の代表取締役社長に就任した車田直昭氏の所信表明も、Webサイトから削除されていました。一体、何があったのでしょうか。)

2017年3月15日

弊社社長の部坂が「ヘルスケア&スポーツ 街づくりEXPO 2017」で講演した記事が公開されました。

techon.nikkeibp.co.jp

2017年3月7日

経済産業省主催「ジャパン・ヘルスケアビジネスコンテスト2017」で優秀賞を受賞しました。

www.meti.go.jp

techon.nikkeibp.co.jp

2017年3月1日

整骨院向け健康スコアリングシステム「カラダスコア」をリリースしました。

prtimes.jp

2017年3月1日

「Microsoft Azure」クラウド上で動作する ヘルスケアデータ分析システムをリリースしました。

2017年1月30日

一般財団法人バイオインダストリー協会ヘルスケア研究会分科会3で講演いたしました。

2017年1月1日

東横INN情報誌「たのやく」1月号に弊社社長の部坂と服部取締役のインタビュー記事「身体年齢を数値化することで世の中の価値観は変わる」が掲載されました。

www.bodyinvestment.jp

2016年11月25日

日経MJに松本市の導入事例が掲載されました。「松本で身体年齢測定 ヘルスグリッド 市民に健康促す」

2016年11月22日

長野県松本市で「ボディスコア」が採用されました。

2016年10月11日

2016年10月10日に開催されたイベント「健康長寿 〜家族の健康を守ろう〜」(主催:奈良県立医科大学)において、「メタボスコア」のクラウドシステムを提供しました。

2016年9月5日

2016年9月3〜4日にハウステンボスで開催された「美活フェス2016」に出展して「ボディスコア」と「メタボスコア」の計測サービスをしました。

2016年8月17-18日

共同通信社からの配信記事「健康な社員に掛け金上乗せ ヘルスグリッド、確定拠出年金に特典プラン」が以下の新聞12社に掲載されました:FujiSankei Business i、日本工業新聞新社、神奈川新聞社、静岡新聞社、河北新報、北海道新聞社、岩手日報社、東奥日報社、信濃毎日新聞社、佐賀新聞社、四国新聞社、沖縄タイムス社

2016年7月29日

ボディスコアを活用した「インセンティブ型確定拠出年金プランを開発」をプレスリリースしました。

2016年7月22日

日経産業新聞にボディスコアを活用したインセンティブ型確定拠出年金プラン「健康になれば掛け金アップ」が掲載されました。

2016年7月15日

ResearchKitを用いたiPhoneアプリケーション「メタボウォッチ」を開発しました。

www.waseda.jp

2016年6月29日

ファミリーイナダ株式会社の新製品 家庭用医療機器「ファミリーメディカルチェア ルピナス FMC-LPN10000」にメタボスコアが採用されました。

2016年6月

ヘルスグリッドオンラインを公開しました。

2015年9月

デジタルヘルスDAYS 2015に出展いたしました。

techon.nikkeibp.co.jp