Herokuアプリをスリープさせない対策

Herokuアプリの無料枠だとアクセスが30分間無いとスリープしてしまう。
スリープさせない簡単な方法はHeroku Schedulerを使うこと。

手順

  • Herokuにログインする (アプリはすでにあるものとする)
  • Dashboard画面右上のメニューの「Elements」をクリック
  • Heroku Elementsで「Heroku Scheduler」を検索
  • 「Add-ons」の「Heroku Scheduler」を選択
  • 「install Heroku Scheduler」をクリック
  • 「App to provision to」で自分のアプリ名を検索して選択
  • 「Provision add-on」でアプリに追加する
  • アプリの「Resources」の「Add-ons」に「Heroku Scheduler」が追加されている
  • 「Heroku Scheduler」を開いて以下の設定をする
    • $ の欄に「curl https://アプリ名.herokuapp.com/」を設定
    • 「Frequency」に「Every 10 minutes」を設定

Node-REDでMongoDB

ここではHeroku上のNode-REDでのMongoDBの扱い方について説明する。HerokuでのNode-RED環境構築や、HerokuのMongoDBアドオンの使い方については前記事を参照。

MongoDBのノード

Node-REDでMongoDBを扱うためのノードはいくつかある。

このほか、Bluemix用のnode-red-bluemix-nodesにもMongoDBを扱うノードが含まれる。
ここでは比較的多機能なnode-red-contrib-mongodb2を使ってみる。node-red-contrib-mongodb3もAPIのバージョンが異なるもののほぼ使い方は同じと思われる。

パレットにmongodb2ノードを追加

  • Node-RED画面右上のメニューの「パレットの管理」を開く
  • 「ノードの追加」タブで「node-red-contrib-mongodb2」を検索し「ノードを追加」
  • 左側ペインのノードパレットにmongodb2のノードが追加される
  • ノードは1種類しかない。後述するようにノードの設定またはmsgで機能(API)を指定する

f:id:licheng:20190218090808p:plain

データベースサーバーの設定

  • パレットからmongodb2ノードをフローに置く
  • ノードをクリックして設定を開く
  • 「Server」の鉛筆マークをクリックし、MongoDBサーバーの設定を入力して「更新」
    (前記事の要メモ事項を参照)
    • URI」: mongodb://ドメイン名:ポート番号/データベース名
    • 「Name」: 区別のために任意の名前をつける
    • 「Username」: ユーザー名
    • 「Password」: パスワード

f:id:licheng:20190218091942p:plain

ノードの設定

  • 「Service」は「External seivice」を選択
  • 「Server」は上記で設定したデータベースサーバーの名前を選択
  • 「Collection」は処理の対象とするMongoDBのコレクション名を指定
    ※ 空欄にして msg.collection で指定することもできる
  • 「Operation」で機能(API)を選択する
    ※ Dynamic (msg.operation)」を選択して msg.operation で指定することもできる

f:id:licheng:20190218091955p:plain

使い方のサンプル

いくつかの機能(API)の使い方のサンプルを以下に示す。下記JSONファイルの内容をコピーして、Node-REDの右上メニューの「読み込み」>「クリップボード」で貼り付け。データベースの設定は、各自の環境に合わせて前述のように設定のこと。

f:id:licheng:20190217213844p:plain:w800

insert (挿入)

  • mongodb2ノードの「Operation」を「insert」に設定する。
  • ノードの入力の msg.payload に挿入したいドキュメントをオブジェクト形式またはJSON形式で格納する。
  • このサンプルでは https://アプリ名.herokuapp.com/insert にブラウザでアクセスすると insert が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例
// msg.payload = { 'name' : 'Alexander', 'age' : 32 }; // JSON形式
msg.payload = { name : 'Alexander', age : 32 }; // オブジェクト形式
return msg;



以下のAPIの動作確認のため、データベースに下記のようなドキュメントを作成しておく。「_id」は各ドキュメントが必ずユニークな値を持つキーであり、ドキュメント作成時に自動で生成される。
f:id:licheng:20190217212720p:plain

find (検索)

  • mongodb2ノードの「Operation」を「find.toArray」に設定する。
  • ノードの入力の msg.payload に検索条件を格納する。下記の例では age が 60未満のドキュメントを検索する。
  • ノードの出力の msg.payload に見つかったドキュメントの配列が格納される。
  • このサンプルでは https://アプリ名.herokuapp.com/findにブラウザでアクセスすると find.toArray が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例
msg.payload = { age: { $lt: 60 } };
return msg;

findOne (一つだけ検索)

  • mongodb2ノードの「Operation」を「findOne」に設定する。
  • ノードの入力の msg.payload に検索条件を格納する。下記の例では name が Alexanderであるドキュメントを検索する。
  • ノードの出力の msg.payload に見つかったドキュメントが格納される。
  • このサンプルでは https://アプリ名.herokuapp.com/findOneにブラウザでアクセスすると findOne が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例
msg.payload = { name : 'Alexander' };
return msg;

findOneAndUpdate (一つだけ検索し更新)

  • mongodb2ノードの「Operation」を「findOneAndUpdate」に設定する
  • ノードの入力の msg.payload に検索条件と更新値のペアを配列で格納する。下記の例では name が Alexanderであるドキュメントを検索し、age を 33 に更新する。
  • このサンプルでは https://アプリ名.herokuapp.com/updateにブラウザでアクセスすると findOneAndUpdate が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例
msg.payload = [
    { name : 'Alexander'},
    { name : 'Alexander', age : 33 }
    ];
return msg;

concrete5のページをhttpからhttpsへリダイレクト

.htaccessに以下の2行追加するだけ。

RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

.htaccess全体は以下の通り。

DirectoryIndex index.php index.html index.cgi

# -- concrete5 urls start --
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
</IfModule>
# -- concrete5 urls end --

MPU-6050系モーションセンサまとめ

6軸モーションセンサではSTマイクロのLSM6DS3とならんでメジャーなTDK InvenSenseのMPU-6050。派生型番がいろいろあってややこしいのでまとめ。

f:id:licheng:20190216221214p:plain:w500

  • MPU-6050はI2Cのみで4mm角QFN。
  • MPU-6500はI2C/SPIで3mm角QFNだけどあまり見かけない。
  • MPU-9150 = MPU-6050 + AKM8975 の9軸だけど既にディスコン
  • MPU-9250 = MPU-6500 + AKM8963 の9軸。

これらMPU-xxxxがたぶん旧InvenSenseの型番でスイッチサイエンスとかでモジュール基板が手に入りやすい。しかし、新規に基板を起こすなら非推奨。以下のようなICM-xxxx型番のものを採用すべし。ただ、ICM型番のものはまだモジュール基板はあまり出回っていないようだ。

  • ICM-20689はMPU-6050と同じ4㎜角QFNの6軸でI2C/SPI、ただしDMP無し。
  • ICM-20648/20948はMPU-6500/9250と同じ3㎜角QFNの6軸/9軸。
  • ICM-20602は3mm角LGA(手ハンダ不可能!)の6軸、DMP無し 。

おもなピンの配置はおおむね同じだけど若干異同あり。また、特性のパラメータにも異同あるので必ずメーカーのカタログとデータシートを参照のこと。

HerokuのMongoDBアドオン

データベースのPaaSというと、選択肢はここに書ききれないくらい多いと思う。また、Node-REDでノードが用意されているデータベースというのも1ダースくらいはある。(こちらの記事を参照→Node-REDで扱えるDBノード総まとめ - Qiita)
ここではHerokuのアドオンでmLab MongoDBを使う方法を紹介する。mLab MongoDBはMongoDBのPaaSである。ちなみにHerokuボタンでNode-REDをデプロイすると、もれなくmLab MongoDBのアドオンがついてくる。また、Node-REDにはMongoDBのノードが用意されている。(これについてはまた別記事で書く。)

MongoDBとは

  • いわゆるNoSQLのひとつ。つまりRDBではない。
  • スキーマレスである。つまり好きなときに動的にフィールドを追加できる。
  • つまり正規化もなにもあったもんじゃない。
  • データはJSON形式で保存される。(正確にはBSON=バイナリ型JSON)
  • RDB用語との対応は下表のようなかんじ。
RDB MongDB
テーブル コレクション
レコード ドキュメント
カラム フィールド

手順

※ HerokuボタンでNode-REDをデプロイした場合、7までの手順は不要

  1. Herokuにログインする (アプリはすでにあるものとする)
  2. Dashboard画面右上のメニューの「Elements」をクリック
  3. Heroku Elementsで「MongoDB」を検索
  4. 「Add-ons」の mLab MongDB を選択
  5. 「install mLab MongoDB」をクリック
  6. 「App to provision to」で自分のアプリ名を検索して選択
  7. 「Provision add-on」でアプリに追加する
  8. アプリの「Resources」の「Add-ons」に「mLab MongoDB」が追加されている
  9. 「mLab MongoDB」を開くと詳細が表示される
  10. データベース名、サーバーURI、ユーザー名を確認する
    ※ デフォルトのユーザーはデータベース名と同名である
  11. 画面右上の「user: ユーザー名」からユーザー設定画面を開き、パスワードを設定する
  12. または、「Users」の「Add database user」で適宜ユーザー名/パスワードを設定する
    ※ なぜかデフォルトのユーザーではNode-REDからアクセスできなかった (要調査)
  13. 「Collections」の「Add collection」で適宜コレクションを作成する

要メモ事項

  • データベース名: heroku_mg??????
  • サーバーURI: mongodb://ds??????.mlab.com:ポート番号/データベース名
  • ユーザー名 / パスワード
  • コレクション名

※ ユーザー名 / パスワードをURIに含める場合は、
mongodb://ユーザー名:パスワード@ds??????.mlab.com:ポート番号/データベース名

参考サイト

qiita.com

HerokuのCloudMQTTアドオン

MQTTブローカーのPaaSはCloudMQTTが手軽で便利。ふつうにユーザー登録して使ってももちろんいいけど、Heroku上のアプリからCloudMQTTを使うならアドオンを利用すれば登録の手間がなくてなお便利。

手順

  1. Herokuにログインする (アプリはすでにあるものとする)
  2. Dashboard画面右上のメニューの「Elements」をクリック
  3. Heroku Elementsで「CloudMQTT」を検索
  4. 「Add-ons」の CloudMQTT を選択
  5. 「install CloudMQTT」をクリック
  6. 「App to provision to」で自分のアプリ名を検索して選択
  7. 「Provision add-on」でアプリに追加する
  8. アプリの「Resources」の「Add-ons」に「CloudMQTT」が追加されている
  9. 「CloudMQTT 」を開くと詳細が表示される
  10. 下記の要メモ事項を確認する

要メモ事項

  • サーバー: m??.cloudmqtt.com
  • ユーザー名 / パスワード
  • SSLポート番号
  • WebSocketポート番号 (WebSocketで使う場合)

HerokuでNode-RED

Node-REDをPaaSで利用する場合、IBM Cloud(旧称Bluemix)が王道だと思うけど、Herokuでもボタンひとつでデプロイできる。仕組みがイマイチよく分からんけど、下記のHerokuボタンをポチっと押すだけ。
elements.heroku.com

手順

  1. herokuのアカウントを作成してログイン
  2. クレジットカードを登録 (無料枠での利用でも登録が必要)
  3. 上記のHerokuボタンをポチっと押す
  4. Node-REDアプリのアプリ名、ユーザー名、パスワードを設定して「deploy app」
  5. デプロイの処理が走るのでしばらく待つ
  6. 「Your app was successfully deployed」でデプロイ成功
  7. 「View」をクリックしてNode-REDアプリの画面へ進む
  8. Node-REDアプリのユーザー名、パスワードでログイン
  9. Node-REDが使える!

要メモ事項

  • herokuのアカウント (ユーザー名、パスワード)
  • 作成したNode-REDアプリの アプリ名、ユーザー名、パスワード
  • アプリのURLは https:/アプリ名.herokuapp.com/red/

参考サイト

qiita.com