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 にアクセスしてカメラの映像が見えることを確認します。
わんこがほぼ見えてない
途中適当に触っていたので、他にも必要だったかもしれませんが、概ねこのような手順で作れました。 わんこの様子を見に現場へ行くと、到着前に気が付かれてスタンバイされているので、これで確認することができて良さそうです。

Azure の Local Network Gateway の Gateway IP Addressを設定したい

うちの会社をAzureとVPN接続していたいなーと思いました。
しかし、会社は固定IP環境ではなく、AzureのローカルネットワークゲートウェイのゲートウェイIPアドレスにはIPしか指定できません。
それであれば、多少接続が切れてしまうけども、IPが切り替わるたびにゲートウェイIPアドレスを設定してやればいいじゃないかー、ということで、ちょうど 札幌 Azure/Microsoft Learn もくもく会 24 がありましたので設定方法を探してみました。
# ローカルネットワークゲートウェイのゲートウェイIPを設定するよ.ps1

#
# 
#
$UserName = "ユーザー名"
$Password = "パスワード"
$TenantId = "テナントID"
$SubscriptionId = "サブスクリプションID"

$ResourceGroupName = "リソースグループ名"
$LocalNetworkGatewayName = "ローカルネットワークゲートウェイの名前"


#
# Get external ip address
# なにかしらどこかから外部のIPを取得する。実際には自前で作ったサービスを使っています。
#
$ExternalIPAddress = (Invoke-WebRequest -Uri "https://www.myexternalip.com/raw").Content


#
# Login
#
$secureStringPassword = $Password | ConvertTo-SecureString -AsPlainText -Force 
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $secureStringPassword

Connect-AzAccount -Credential $credential `
    -Tenant $TenantId `
    -SubscriptionId $SubscriptionId 


#
# Set GatewayIpAddress
#
$lgw = Get-AzLocalNetworkGateway -ResourceGroupName $ResourceGroupName -Name $LocalNetworkGatewayName

$lgw.GatewayIpAddress = $ExternalIPAddress

Set-AzLocalNetworkGateway -LocalNetworkGateway $lgw


あとはこれをIPが変わったときだけ動かせばOKだと思ってますが、そこまでは試していないのでうまくいかなかったらごめんなさい。

Visual Studioのビルドが終わったら知らせてほしい!

長いビルドが走ると、他のことをやり始めて、ビルドしてたことを忘れます。もうやばい。

というわけで、終わったら通知できないかと探してみたら、普通にコントロールパネル>サウンドから設定ができるじゃないですか!

2016-04-21_15h03_50

でもビルドするたびに音が鳴るとうるさいよね。
長いときだけ、もしくは、VisualStudioが非表示/バックグラウンドにあるときだけ教えてほしい。

windows でパッケージ管理 scoop

Windowsでのアプリケーションパッケージの管理ツールはchocolateryを使っていたのだけど、
giboをインストールしようとしたらscoopじゃないとできないようだったのでscoopを使ってみた。

Scoop

インストール

とっても簡単。scoopのウェブに書いてあるとおり。powershellを開いて、

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

実行すると次のような出力がでて終了。

initializing...
downloading...
extracting...
creating shim...
adding ~\AppData\Local\scoop\shims to your path
scoop was installed successfully!
type 'scoop help' for instructions

使い方

パッケージリストの更新(たぶん)

scoop update

パッケージのインストール

scoop install gibo

パッケージの更新

scoop update gibo

chocolateryと何が違うんだろう・・・

一体何が違うのか、何が売りなのか・・・。本当にgiboを入れることしかしなかった・・・

giboで.gitignoreを生成したい・・・からのPowerShellのリダイレクト

ちょいと昔ならwindowsだと苦労したかもしれませんが、chocoやscoopによりインストールも楽だし、powershellも操作しやすくなったし、見たことないけどbashも動くらしいし、でだいぶ楽です。

simonwhitaker/gibo: A shell script for easily accessing gitignore boilerplates

インストール

scoop install gibo

対応する言語やエディタの一覧

gibo -l

VisualStudioなら

gibo VisualStudio > .gitignore

ですね

とは、いかなかったんですよ

もじこーどこのやろう。

powershellでリダイレクトすると、Unicodeで文字が書き込まれてしまいます。
すると、gitが.gitignoreを読めないのです・・・。
gitの鍛え方が足りないのですすみません。

というわけで、

> したいときは

gibo visualstudio | set-content .gitignore

>> したいときは

gibo visualstudio | set-content .gitignore

エンコードを変えたいときは

git VisualStudio | Out-File -encoding utf8 -filepath .gitignore

らしいです。

(ちなみにVisualStudioあれば.gitignoreを勝手に用意してくれる気がします)

社内用NugetServerを立てて社内ライブラリを管理する

社内で使うライブラリをもっと整理して使いやすくしようということで、社内にNuGetのサーバーを立ててみました。
そもそもNuGetのパッケージも作ったことなかったのでちょうど良かったですが、まだ全然調べていません。
まずは、NuGetサーバーを立てて、NuGetパッケージを作って、登録するところまでです。

NuGet.Serverの構築

非常に簡単です。

  1. Create New ASP.NET Empty Project
  2. Install-Packatge NuGet.Server
  3. F5

これで問題なければ、社内のIISにホスティングします。
必要であれば設定ファイルのAPIKEYを指定します。

ちなみに、NuGetパッケージには、デバッグシンボルとソースを含んだシンボルパッケージというのもあるようですが、それはこのNuGet.ServerにはPUSHできないようです。
次の記事を参考にすればできるようになりそうです(試してない)

NuGet Packageの作成

ざっくりと。

  • nuget spec でNuGetパッケージのプロジェクトファイルを作成し、
  • nuget pack でパッケージ化して、
  • nuget push {Package file name} -s {url} {API_KEY} でNuGetServerにプッシュする。

urlにはNuGet.Serverをブラウザで開いたときに表示されているURLを入力すればOKです。

あとは使うだけ

あとは、VisualStudioのオプションからNuGetサーバーのソースを追加して使うだけです。
自分たちのライブラリがNuGetの画面に出てくると、なんとなくうれしい感じがします・w・

参考

次のモバイルマウスはマイクロソフトの Mobile Mouse 3600 にしました。

カエレバでamazonの画像貼ってみたかった系のあれです。

携帯用に使っているマウス「Bluetooth® Notebook Mouse 5000」の持つところがベトベト になってきたので、新しいのを探してみました。

ちなみに、「Bluetooth® Notebook Mouse 5000」はとても好きだったので合計3個ほど買ったのですが、
経年劣化(?)で両サイドのゴムっぽいところがベトベトになってしまうのが残念です。

候補

今回はBluetooth® Notebook Mouse 5000がもう打ってなかったので(あっても販売終了になっていてプレミア価格orz)、
いくつか候補を絞って、実店舗で触らせていただいて決めてみました。

1. Logicool ロジクール ワイヤレス ミニマウス ブラック M187BK

すごく小さくみたいで携帯するには○
お値段も手頃です。
ただ、できればBluetoothのマウスがほしかったので、今回は見送りしました。

2. ELECOM マウス Bluetooth CAPCLIP 3ボタン IRLED搭載 充電式 ホワイト M-CC1BRWH

by カエレバ

形からしてすでにおかしい、すっごい小さい携帯するには間違いなくベストそうなマウス。
Bluetoothなのも○
しかし、やっぱり使いにくそう・・だよね?

3. マイクロソフト ワイヤレスマウス Bluetooth Mobile Mouse 3600 Black ブラック (PN7-00007)

超小型ではありませんが一回り小さめのボディーです。
画像だとよくわかりませんが、表面にはやわらかいコーティングがされていて、さわり心地は良かったです(1年もしたらツルツルになっちゃいそうな気もしますが・・・)。

また、今時のマウスっぽくクリック音も静かです。
モバイルシーンだとクリック音が気になってしまう小心者なのでありがたいです。

Bluetoothで接続できて、電池が単3電池1本なので軽そうです。

最終的にはコレとArc Touchで迷いました。

4. マイクロソフト ワイヤレス Bluetooth マウス Arc Touch Bluetooth Mouse (7MP-00018

だいぶ前からありますが、これ使ってみたいのです!
携帯性というか、カバンに収納するのが楽そうですし、
カチッっと折って電源ONするギミックも非常に心地よさそうです。

しかし、高い上にレビューを見ると接続が切れる、
ちょっと持ちにくい、持ちにくいのでボタンを押しにくい、
などが目についてしまい、最高に良い感じではなさそう。

実機を触ってみたかったですが、残念ながら訪れたお店にはありませんでした(T_T)

5. Logicool ロジクール MXAnywhere2™ ワイヤレスモバイルマウス BluetoothSmart・USB対応 MX1500

たかい!
しかし、質感、重さ、形状、大きさ、クリック感は非常に良い感じでした。

きっと耐久性も高いのでしょう。
でも高い!(しつこい

まとめ

今回は最後、arc touchとMobile Mouse 3600で迷いました。
マウスはどうしても1~2年で壊れてしまう印象なので、そこに8000円近いマウスを買うのも・・・でもあのギミックを試してみたい・・・と(=w=)
そんなタイミングで、Mobile Mouse 3600がamazonのタイムセールで 3,234 円になるようだったので、もういいやっ、ってことでモバイル マウス 3600にしました。

*届いてみた感想は、ちょこんとした小さな出で立ちで、触り心地よく使い心地もまずまずですが、そんなにクリックは静かではないです。

お手軽無料のSSL証明書発行サービス Let’s Encryptを使ってみる

ちょいと前ですが、正式サービスが開始されたようなのでLet’s Encrypt を使ってみた。

README / Introduction — Certbot 0.7.0.dev0 documentation

インストール

user@webserver:~$ git clone https://github.com/letsencrypt/letsencrypt
user@webserver:~$ cd letsencrypt
user@webserver:~/letsencrypt$ ./letsencrypt-auto --help

インストールなのかヘルプなのかよくわからないコマンドですが・・・。

インストールが終わるとパスが表示されるので、パスを通すなりなんなりする。

詳しい使い方はヘルプで。

$ letsencrypt --help all

SSL証明書の発行の仕方

nginxはbuggyだって書いてるので、certonlyで行う。apacheならインストールまでしてくれるっぽい。

nginxを使っていて、

  • domainが hoge.com
  • webのrootが /var/www/hoge.com

の場合

まず、普通にウェブを80ポートで動かして、アクセスできる状態にする。
認証の仕組みとしては、上記の webrootに認証用のファイルを配置して、letsencryptのサーバーからそこにアクセスして確認するっぽい。

証明書の発行は次のコマンド

sudo letsencrypt certonly --webroot -d hoge.com -w /var/www/hoge.com

処理が終わると、/etc/letsencrypt/live/hoge.com に証明書が保存される。

nginxへの設定

今回はすでに別のSSL証明書を設定しているnginxにドメインを追加しての設定だったので、SNI機能が有効かを確認。

$ nginx -V 2>&1 | grep SNI
TLS SNI support enabled

問題なければ、設定ファイルをつくる。

server {
    listen 443;
    server_name hoge.com
    ssl on 
    ssl_certificate /etc/letsencrypt/live/hoge.com/cert.pem
    ...

証明書の更新

サーバーにインストールしているすべての証明書のうち期限が近い証明書を更新する。

sudo letsencrypt renew

個別に更新したい場合には、発行時と同じコマンドを動かし、Renewを選択する

sudo letsencrypt certonly --webroot -d hoge.com -w /var/www/hoge.com

直接操作できないサーバーの場合

FTPのみの場合であれば、–manualで表示された内容を自分で設置すると同じようにSSL証明書を作成できる。

sudo letsencrypt certonly --manual -d hoge.com

Windows10(Vaio Z VJZ13B1)で無線LANが途切れる

Windws10(Vaio Z VJZ13B1)にして最初に困ったことは、無線LANがすぐ切れてしまうことです。数分で切れてしまいます。もういらいら。
はっきりと再現するわけではないですが、スリープの後が割とだめです。

解決策を探す

検索すると色々でてきます。

  1. 電源オプションのプランを、高パフォーマンスに設定する。
    =>バランスしかありません!

  2. プランの右側に▽みたいのがあるから押すとでてくるからそこから選ぶ
    =>▽ありません!

  3. 電源プランの詳細設定からwifiの省電力設定で省電力モードにならないように設定する。
    =>wifiの設定がありません!

  4. ネットワークアダプターのドライバ設定から省電力設定とWWM?の設定をする。
    =>Intel(R) Dual Band Wireless-AC 8260 が載ってるようですが、その設定はありません!

というわけで全く解決しません。

待望のドライバがリリースされてた。

やっぱりドライバで対応してもらうのが普通ですよね。

VJZ13B、VJZ131「Intel(R) Wireless LAN Driver Ver.18.40.2.3(Windows 10用)」アップデートプログラム

説明にも書いてありますが、プログラムと機能から「インテル(R) PROSet/Wireless ソフトウェア」をアンインストールしてからインストールしないとダメです。
私は適当にそのままやってみたら、全然新しいドライバを使ってくれませんでした。ちゃんとアンインストールしてからインストールしましょう。

これを入れてからは今のところは調子が良いです。