CosmosDB Serverless preview

CosmosDBのserverlessのPreviewがきたということで、【オンライン】札幌 Azure/Microsoft Learn もくもく会 25(2020/08) でちょっと試してみました。といっても限界まで試したとか金額計算したというわけではないので、そこらへんはしばやんさんのブログがわかりやすいです。

Azure Cosmos DB Serverless が Preview になったので試した – しばやん雑記

今回は、.netのコンソールアプリからCosmosDBにアイテムを追加するところを試してみました。

CosmosDBの準備

1.適当にリソースグループを作成します。
2.リソースグループにCosmosDBを作成します。
Capacity modeを Serverless(preview) に設定します。

3.接続文字列をメモっておきます。

CosmosDBにアイテムを追加してみる

1.Visual Studio から .Net Frameworkのコンソールプロジェクトを作成します。
2.nugetから Microsoft.Azure.Cosmos をインストールします。
3.下のような感じのプログラムを作ります。
CosmosClientを作って接続して、CreateDatabaseIfNotExistsAsync、CreateContainerIfNotExistsAsyncでデータベース、コンテナを作成し、CreateItemAsyncでコンテナにアイテムを追加します。
using Microsoft.Azure.Cosmos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CosmosDB_BulkSupport
{
    class DemoItem
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedOn { get; set; }
        public string PartitionKey { get; set; }
    }


    class Program
    {
        static async Task Main(string[] args)
        {
            var connectionString = "xxxx";
            var databaseId = "TestDB";
            var containerId = "TestContainer";
            var partitionKey = "/partitionKey";


            // SerializerOptionsで CosmosPropertyNamingPolicy.CamelCaseを指定しているので、
            // CosmosDBに投げるJSONは "PartitionKey": "..." ではなく "partitionKey": "..."になる。
            // そのため、コンテナの PartitionKey には "/partitionKey" を指定する
            // また、CosmosDBのアイテムに id が必要なので、 CosmosPropertyNamingPolicy.CamelCase を指定しない場合には、
            //         [JsonProperty(PropertyName = "id")]
            //         public string Id { get; set; }
            // こんな感じで Id を id にしてあげる。
            // その場合には、コンテナのPartitionKeyには、"/PartitionKey"を指定する(のだと思う。試してない)


            var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions
            {
                AllowBulkExecution = true,
                SerializerOptions = new CosmosSerializationOptions
                {
                    PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                }
            });


            Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
            Container container = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);


            var tasks = Enumerable.Range(1, 10000)
                                  .Select(x => new DemoItem
                                  {
                                      Id = Guid.NewGuid().ToString(),
                                      Name = $"Test-{x}",
                                      CreatedOn = DateTime.Now,
                                      PartitionKey = Guid.NewGuid().ToString()
                                  })
                                  .Select(x => container.CreateItemAsync(x, new PartitionKey(x.PartitionKey)));


            await Task.WhenAll(tasks);
        }
    }
}
4.実行して、Azureのコントロールパネルからアイテムの登録やRUの状況を確認します。
これだけだとServerlessは全然関係ないですが、料金の感じを見ると、平均してRUを消費するわけではなく、Free Tierを超えるような使い方であればちょうどよい・・・んでしょうか。つかってないのでよくわかりません。 次のような記事もありましたので、今度どこかでマスタ系にFree Tierを使ってみて、感触を確かめてみようかなーとおもいます。

Azure Cosmos DB Free Tier をプロダクション環境で使う – PaaSがかりの部屋

raspberry pi と motion でわんちゃんライブカメラを作ってみる

ワンチャンではなく、わんちゃん(犬)です。
最近、わんこ様が家族の仲間入りをしたのですが、普段どうしているのかの確認のために、Raspberry Piを引っ張り出してきて作りました。ModelB+だったと思うけど動きは遅いですね。最近のRaspberryPiがほしいです。 今回は motion を使ってウェブカメラの映像を見れるようにしてみました。

Raspberry Pi OSのインストール

知らないうちにraspbianから名前が変わっていたRasapberry Pi OSをインストールします。まずはイメージをSDに書き込むソフトウェアをダウンロードします。 Raspberry Pi Downloads – Software for the Raspberry Pi https://www.raspberrypi.org/downloads/
ダウンロードが終わったら imager_1.4.exe を起動してインストールします。
起動したら、CHOOSE OSからOSを選択します。
次にSDカードを選択します。
WRITERを選択してイメージを書き込みます。
OSイメージのダウンロードを行って。SDに書き込んでくれているのだと思うのでのんびり待ちます。
おわったらメッセージが出る(次の画像はダウンロードしたイメージを書いたときのものなのでメッセージが違います)

起動する

できあがったSDカードをRaspberryPiに差し込んで起動します。
起動したら pi / raspberry でログインします。

無線LANの設定

まずは無線LANとSSHの設定をしてリモートから接続できるようにします。 USBの無線LANをつけて /etc/wpa_supplicant/wpa_supplicant.conf を設定します。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="SSID"
        psk="xxxxxxxxxxxxxxxxx"
}
iwconfig を実行して次のようになっていたら接続できています。
wlan0     IEEE 802.11  ESSID:"SSID"
          Mode:Managed  Frequency:2.462 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate=65 Mb/s   Tx-Power=20 dBm
          Retry short  long limit:2   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=51/70  Signal level=-59 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:24  Invalid misc:25   Missed beacon:0
接続できていないときは、raspi-config から設定してみても良いかもしれません。raspberryのバージョンによって画面が違うかもしれませんが、Network Optionsあたりから設定しても無線LANに接続できました。 固定IPにしたいので /etc/dhcpcd.conf に設定を追加します。IPの設定は /etc/network/interfaces ではなくなったんですね。
interface wlan0
static ip_address=xxx.xxx.xxx.xxx
static routers=yyy.yyy.yyy.yyy
static domain_name_servers=zzz.zzz.zzz.zzz
次にSSHで接続できるようにします。opnessh-serverはインストール済みだったので、/etc/ssh/sshd_configを変更します。
#Port 22
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
とりあえず接続できれば良かったのdえ、ListenAddress 0.0.0.0 だけコメントアウトして自動起動するよう設定し設定を読み込み直します。
sudo systemctl enable ssh
sudo systemctl reload ssh
これで別のPCからSSHで接続できるようになりました。

ウェブカメラを使えるようにする

では本題のウェブカメラを使えるようにしていきます。 まずはおもむろにUSB ウェブカメラを差し込んで、dmesgを実行して認識していることを確認します。次のような感じの出力があれば使用できます。
[ 1042.539163] input: UCAM-DLG200H: UCAM-DLG200H as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input10
[ 1042.544619] usbcore: registered new interface driver uvcvideo
[ 1042.544637] USB Video Class driver (1.1.1)
今回は、motion を使ってウェブカメラのサーバーを構築してみます。まずはインストール
sudo apt update
sudo apt install motion

motionの自動起動の設定

/etc/default/motion の no を yes に変更する
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

motionの設定

/etc/motion/motion.conf を変更する。設定が多いのでそれぞれ確認しつつちょうどよい設定にしてください。 今回は、ストリーミングでカメラの映像を確認できれば良いので、動体検知機能、静止画撮影、動画撮影はオフにして、フレームレートを15fpsで表示できるようにしました。 設定が終わったら次のコマンドでmotionを再起動
sudo systemstl restart motion
ブラウザで xxx.xxx.xxx.xxx:8080 にアクセスしてカメラの映像が見えることを確認します。
わんこがほぼ見えてない
途中適当に触っていたので、他にも必要だったかもしれませんが、概ねこのような手順で作れました。 わんこの様子を見に現場へ行くと、到着前に気が付かれてスタンバイされているので、これで確認することができて良さそうです。