なになれ

IT系のことを記録していきます

AngularFireでRealtime DatabaseからCloud Firestoreに変更した

AngularFIreを使用してアプリを作っていたのですが、最近のAngularFireのアップデートでRealtime DatabaseからCloud Firestore推しな雰囲気を感じたので、Cloud Firestoreに変更してみました。
AngularFireを使用する上でのRealtime DatabaseとFirestoreとの違いについて書きます。

データ構造

Choose a Database: Cloud Firestore or Realtime Database  |  Firebase

Cloud Firestore Data Model  |  Firebase

Firebaseのページに比較とFirestoreのデータモデルについての情報があります。
開発の際の注意点としては、データ構造を変更しないといけない可能性があります。
Realtime DatabaseではJSONに乗っ取っていれば、データを保存できました。
Firestoreになるとコレクション、ドキュメントという構造に合わせてデータを保存する必要があります。

例えば、以下のような例です。

FireStore

db.collection('objects').doc('object').set(data);

コレクション、ドキュメントという構造に準拠しないといけないです。

Realtime Database

db.object('object').update(data);

Realtime Databaseだと、JSONであればそのまま保存可能でした。

クエリ

angularfire2/querying-collections.md at master · angular/angularfire2 · GitHub

FIrestoreでは、クエリ表現が変わっています。
ページングのためにorderByを使用していたのですが、影響がありました。
Realtime DatabaseではorderByKeyというメソッドでkey順で並べ替えることができました。
Firestoreだと、それに相当するメソッドはなく、orderByというメソッドに並べ替えの機能は集約されています。
orderByメソッドでkey順(Firestoreだとid順)に並べるには特殊な指定が必要でした。

以下の通りです。

Firestoreでkey順に並べ替えるやり方

import { firestore } from 'firebase';
// 中略
db.collection('items', ref => ref.orderBy(firestore.FieldPath.documentId()));

firebaseのnpmモジュールにあるFieldPathクラスを利用をする必要があります。

ただし、keyの命名方法が変わっているので、どのように並び替えたいかによってはそもそもやり方を変える必要がありそうです。
Realtime Databaseの場合、データの作成順に順番に命名されるような形でした。
なので、key順で並べ替えれば、結果として、データを作成した順番に並べ替えができました。
Firestoreの場合、keyの命名は順番に関係なくランダムなようなので、データを作成した順番に並べ替えが必要であれば、データ内に作成日時を付与して、そのフィールドで並べ替えるといった工夫が必要と思われます。

まとめ

上記につまづいたくらいで、そのほかはメソッド名を変更するくらいで比較的簡単にRealtime DatabaseからCloud Firestoreに変更できました。
Firebaseのドキュメントを見てみると、今後はCloud Firestoreがスタンダードになりそうな雰囲気なので、今後はこちらを使っていくようにしたいと思います。

MCP70-532:「Microsoft Azure ソリューションの開発」の試験に合格しました

試験 70-532: Microsoft Azure ソリューションの開発に833点で合格しました。備忘録的に合格までの過程を残したいと思います。
問題や解答は持ち帰れないので、記憶にあるうちにです。

試験の内容

試験時間:150分
問題数:30問
合格点:700点以上
試験問題の形式:

※問題数はうろ覚えなので、若干異なる可能性があります

ケーススタディ形式は、ある企業のシステム開発の状況が問題の条件として与えられていて、各問題に答える形式です。C#のコードの穴埋めを択一問題形式で答える問題が多かったです。

二者択一形式は、前提条件は共通で、各問題でYESかNOかで答える形式です。

C#のコードの問題がケーススタディ形式でほぼ出題されて、そのほかはAzureのサービスに関しての知識を答える問題というような感じでした。workerロールとか、Service Busとかマイナーなイメージがある問題が結構出たりして、試験内容が古いのかなと思いました。

全体的に、択一問題形式でも二択になっているものもあり、まぐれで当たる可能性が大いにある試験だと思いました。
試験時間は150分ありますが、問題数が30問しかないので時間はかなり余ると思います。
私の場合、100分くらいで試験を終えました。

試験勉強の方法

以下のコンテンツを活用しました。

Udemyのコンテンツは試験の範囲を網羅しているので、初学には向いていると思います。英語なのが難点ですが、動画なので、Azureを実際に使いながら見てみると分かりやすいかと思います。
注意点として、この講座自体は最新の試験を反映していて、日本版の試験は遅れています。なので、古い内容で勉強しておく必要があります。具体的にはネットワーク関連の問題は最新だと省かれているようですが、日本版の試験だと出題されていました。

MeasureUpの練習テストは公式の練習テストということですが、本番では練習テストにはない二者択一形式の問題が出題されたり、本番よりも難易度が高いと思われる問題があるなど、ちょっと微妙かもしれません。
練習テストの問題が分かるレベルが必要と思ってしまうと、実はそんなことなかったというのが実際のところです。
練習テストが難しいと思っても、案外なんとかなるような気がします。
PowerShellのコードの穴埋め問題が結構あったのですが、本番では、ほぼ出題されませんでした。

最終的にはAzureの公式ドキュメントのチュートリアルを実践しながら学習しました。実際にAzureを触りながら学習すると理解が深まると思います。

Raspberry Pi3で赤外線リモコンを作る

よく耳にするけどラズパイを使ったことがなく、ふとラズパイで何か作ってみようと思い立ち。
そこそこ実用的であろう赤外線リモコンに挑戦してみました。
電子工作とは無縁な初心者向けの内容になります。

f:id:hi1280:20171015094557j:plain:w300

用意したもの

全てamazonで購入しました。

よく分からなかったので、初心者向けの電子工作キットを購入していますが、最終的に以下があれば良かったです。

  • ラズパイ3
  • ラズパイ用電源
  • microSDカード
  • ブレッドボード
  • ジャンパワイヤ
  • 赤外線受信モジュール
  • 赤外線LED
  • 200 Ω 抵抗

赤外線受信をする

配線

工作キットの提供サイトの情報をそのまま利用します。
http://osoyoo.com/ja/2016/12/15/raspberrypi-ir-remote/

LIRCのインストール

LIRCとはLinuxで赤外線を操作可能にするパッケージです。

sudo apt-get install lirc
ラズパイでLIRCを利用するための設定

/boot/config.txtを以下のように修正します。
ラズパイが赤外線のデバイスを認識する為に必要なようです。

修正前

# dtoverlay=lirc-rpi

修正後

dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17

GPIO18が赤外線受信PINになり、GPIO17が赤外線送信PINになります。

ラズパイを再起動します。

sudo reboot
LIRCの起動

/etc/lirc/lirc_options.confを以下のように修正します。

[lircd]
nodaemon = False
driver   = default
device   = /dev/lirc0

lircdを再起動します。
lircdは赤外線の送受信を行うプログラムです。

sudo systemctl restart lircd.service
赤外線受信のテスト

以下のコマンドを実行することで、赤外線を受信できているかを確認できます。
受信モジュールに向かって赤外線を送信するとコンソール上にコードが出力されます。

mode2 -d /dev/lirc0 --driver default

f:id:hi1280:20171015151854p:plain

赤外線受信内容の記録

以下のコマンドを実行することで赤外線受信の内容を記録することができます。

irrecord -f -d /dev/lirc0 --driver default  ~/lircd.conf

プログラムの案内に従い、赤外線の内容を記録します。
何の操作なのか分かる名前を設定して、赤外線を受信させるということを繰り返します。
lircdの設定ファイルが作成されます。

設定ファイルをLIRCの設定に追加します。

sudo cp ~/lircd.conf /etc/lirc/lircd.conf

赤外線送信をする

配線

工作キットの提供サイトのLED点灯の配線を参考にして、赤外線LEDの配線をします。
http://osoyoo.com/ja/2016/04/07/use-led-to-test-gpio-pin/

GPIO17が赤外線送信のピンなので、そこだけ変更します。

赤外線送信をする

赤外線送信の設定を以下のコマンドで確認します。

$ irsend LIST "" ""

TV
$ irsend LIST TV ""

0000000000000001 KEY_PLAY

赤外線の送信を以下のコマンドで行います。

irsend SEND_ONCE TV KEY_PLAY

感想

一連の流れを書くと何のことはない感じですが、systemdとか知らずにコマンド実行レベルで悪戦苦闘してました。
そこらへんが事前に分かっていれば、すんなり行ったはずです。
これでTVのON/OFFがリモートでできるようになりました。

本記事の内容を改良しました

hi1280.hatenablog.com

参考情報

http://osoyoo.com/ja/2016/12/15/raspberrypi-ir-remote/

http://osoyoo.com/ja/2016/04/07/use-led-to-test-gpio-pin/

LIRC - Linux Infrared Remote Control

RaspberryPi3でlircを使ってリモコン化する時の注意事項まとめ - Qiita