コンセントのない玄関にGoogle Home Miniを設置する

経緯

年末にGoogle Home Miniが半額になっていたので玄関に置こうと思って買ったんですが、いざ設置しようとしたらコンセントがないことに気付いてちょっと困りました。

ただ、せっかく買ったのに使わないのはもったいないので、とりあえず洗面台のコンセントを使って動かしてました。

f:id:LocaQ:20190120232305j:plain:w800

f:id:LocaQ:20190120232344j:plain:w400

でも色々問題がありました。

  • ドライヤーを使う時にいちいち挿し変えないといけなくて面倒
  • ドライヤーのワット数が1200W、洗面台のコンセントの最大ワット数も1200Wなので、電源タップを使えない
  • 洗面所のドアを閉められない
  • 洗面所に出入りすると、ドアがコードに当たって転がってひっくり返った状態になったりする
  • 電源コードの長さがギリギリで、そのうち断線しかねない

どうにかして電源を確保できないかネットで調べていたら、電球のソケットを使ってコンセントを増やすアダプターを見つけました。

f:id:LocaQ:20190120232521j:plain:w400 f:id:LocaQ:20190120232553j:plain:w400

しかし、もう1つ問題ができました。玄関の天井のソケットが斜めになっていて、このままではアダプターを挿せません。

f:id:LocaQ:20190120232649j:plain:w400

こちらは向きを変えられるアダプターがあったのでそれを使います。

使ったもの

以下のものを用意しました。

  • Google Home Mini
  • 可変式ソケット(E17口金→E26口金)
  • コンセント付きの電球アダプター(E26口金用)
  • LED電球(E26口金)
  • 電源タップ

store.google.com

注意として、コンセント付き電球アダプターがE26用のものしかありませんでしたが天井のソケットがE17でした。なので可変式ソケットはE17→E26へ変換するものを買いました。電球もそれに合わせてE26口金のものを買いました。

また、可変式ソケットがLED専用だったため、電球もLED電球にしています。ついでに人感センサー付きのものにしました。

設置

アダプターなどを接続するとこんな風になります。

f:id:LocaQ:20190120233353j:plain:w400

これを天井のソケットに挿します。

f:id:LocaQ:20190120233421j:plain:w400

可変式ソケットの傾きが足らなくて少し斜めになっていますが、他に合う可変式ソケットが見つからなかったのでこのままです。

次にアダプターのコンセントに電源タップを挿して、電源タップをシューズボックスに置きます。

f:id:LocaQ:20190120233452j:plain:w400 f:id:LocaQ:20190120233508j:plain:w400

上のシューズボックスの扉の背と壁の間が広すぎず狭すぎず、ちょうどコードを挟めるくらいの間隔だったのでコードを固定できました。

見た目はあまりよくないですが、壁から垂れ下がっているコードは玄関側からは見えないですし、天井のコードはLED電球が結構眩しくてあまり見られないのでこのままにしています。

Google Home Miniをシューズボックスの上に置きます。

f:id:LocaQ:20190120233520j:plain:w800

これでドライヤーを使うたびにコンセントを抜き差しする必要もなくなり、洗面所のドアも閉められるようになりました。

Google Cloud IoT Coreに登録されている端末の一覧をC#で取得する

概要

Google Cloud IoT Coreに登録されている端末の一覧をC#で取得する方法をまとめます。

Cloud IoT Coreに端末を登録する

Quickstart を参考にClout IoT Coreを作成して、端末を作成します。この記事の範囲では以下を行えばよいです。

  • Before you begin
  • Create a device registry
  • Add a device to the registry
  • Clean up

今回はTestDevice1TestDevice2という2つの端末を作成しました。

f:id:LocaQ:20190117230922p:plain:w800

また、それぞれの端末のメタ情報にNameを追加しました。

f:id:LocaQ:20190117230953p:plain:w900

認証

以下のページを参考にサービスアカウントというものを作成します。

認証の概要

作成するアカウントは以下を選びました。

  • サービスアカウント:Compute Engineのデフォルトのサービスアカウント
  • キーのタイプ:JSON

f:id:LocaQ:20190117231023p:plain:w600

※もしかしたらCompute EngineVMを作成していないとデフォルトのサービスアカウントは出てこないかもしれません。

「作成」ボタンを押すとJSONファイルがダウンロードされます。

サンプルプログラム

コード

Cloud IoT Coreに登録されている端末の一覧と、各端末の情報を表示するサンプルプログラムです。

Google Cloud IoT Coreに登録されている端末の一覧を取得するプログラム

プログラム中のPROJECT_ID, REGION, REGISTRY_IDは各自置き換えます。PROJECT_IDはClout IoT Coreを作成したプロジェクトのID、REGIONus-central1など、REGISTRY_IDはCloud IoT CoreのレジストリIDです。

端末の情報として以下の2つを表示しています。

  • ID
  • メタ情報のName

cloudIotService.Projects.Locations.Registries.Devices.List(parent).ExecuteAsync()で取得できる端末は、IDなどの限られた情報のみ設定されているようで、メタ情報は取得できません。

そこで、さらに各端末毎にcloudIotService.Projects.Locations.Registries.Devices.Get(name).ExecuteAsync()を呼び出して詳細な端末情報を取得します。このメソッドで取得した端末情報にはメタ情報なども含まれています。

必要な設定

このプログラムは環境変数GOOGLE_APPLICATION_CREDENTIALSが必要です。値はサービスアカウントの作成でダウンロードしたJSONファイルのパスです。 この環境変数GoogleCredential.GetApplicationDefault()で参照しているようです。

また、このプログラムでは Google.Apis.CloutIot.v1 を使っているので、プロジェクトに追加します。

参照

Dockerイメージを使ってWebアプリをGoogle Compute Engineで動かす

ASP.NET Core MVCのアプリをGCPで公開できたので、その手順をまとめます。

前提

Container Registryの認証設定

Container RegistryにDockerイメージを登録する時にはdocker pushを使いますが、その前に認証設定が必要です。

認証方法 | Container Registry | Google Cloud

このドキュメントの書かれていることがよく分からず、とりあえず以下の2つを実行しました。

ただよく読むと、どちらかだけ行えばよかったのかもしれません。Docker 認証ヘルパーとしての gcloudの節には、

可能であれば、この方法を使用することを強くおすすめします。この方法では、プロジェクト リソースに安全で短期間のアクセス権が付与されます。

と書かれているので、どちらかであれば上の方法の方がよいみたいです。

とりあえず両方のやり方を載せます。

gcloudをDocker 認証ヘルパーとして使う設定

以下のコマンドを実行します。

$ gcloud auth configure-docker
WARNING: `docker-credential-gcloud` not in system PATH.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
WARNING: `docker` not in system PATH.
`docker` and `docker-credential-gcloud` need to be in the same PATH in order to work correctly together.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
The following settings will be added to your Docker config file
located at [C:\Users\loca\.docker\config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

警告が出ていますが特に問題なくイメージの登録ができたので、今回は無視します。

スタンドアロン Docker 認証ヘルパー

以下の2つのコマンドを実行します。

$ gcloud components install docker-credential-gcr

Restarting command:
  $ gcloud components install docker-credential-gcr

$ docker-credential-gcr
C:\Users\loca\.docker\config.json configured to use this credential helper for GCR registries

DockerイメージをContainer Registryに登録する

以下のドキュメントに沿って登録します。

イメージの push と pull  |  Container Registry  |  Google Cloud

Dockerイメージへのタグ付け

Dockerイメージに以下のような決まったフォーマットのタグを付ける必要があるようです。

[HOSTNAME]/[PROJECT-ID]/[IMAGE]

HOSTNAMEはContainer Registryの場所で、以下の4つがあります。

・ gcr.io は米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
・ us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
・ eu.gcr.io は、欧州連合でイメージをホストします。
・ asia.gcr.io は、アジアでイメージをホストします。

今回は無料枠のCompute Engineを使うので、それに合わせて米国に作られるようにus.gcr.ioを使います。※Compute Engineの無料枠は米国の特定のリージョンでなければ適用されないため。

PROEJCT-IDは今回のアプリを動かすプロジェクトのIDです。Googleアカウントでログインしていれば、プロジェクトのホームの「プロジェクト情報」に載っています。

https://console.cloud.google.com/home

IMAGEはDockerイメージの名前で、今回はsampleappです。

以上から、タグの名前は以下のようになります。

us.gcr.io/[PROJECT-ID]/sampleapp

そしたらdockerコマンドでイメージにタグを付けます。

$ docker tag sampleapp us.gcr.io/[PROJECT-ID]/sampleapp

docker pushでDockerイメージをContainer Registryに登録します。

$ docker push us.gcr.io/[PROJECT-ID]/sampleapp
The push refers to repository [us.gcr.io/[PROEJCT_ID]/sampleapp]
cd1a588c63a5: Pushed
e5f18c307014: Pushed
e7ba18774395: Pushed
a0afac1d9f1c: Pushed
3fb318ee8d39: Pushed
ef68f6734aa4: Layer already exists
latest: digest: sha256:c60eae957fe7a7729b4b3c3199d96985674641962f579d7010cd8edb43511ffb size: 1581

これでContainer Registoryにイメージが登録されます。

Compute EngineでDockerイメージを使ってアプリを起動する

Compute Engineのインスタンス作成画面で以下のように設定し、他の項目は適宜変更して作成します。

  • 「この VM インスタンスにコンテナ イメージをデプロイします。」にチェック
  • 「コンテナイメージ」にDockerイメージの名前を設定
    • us.gcr.io/[PROJECT-ID]/sampleapp
  • 「HTTP トラフィックを許可する」にチェック

f:id:LocaQ:20190114231752p:plain

作成が完了して起動したら、外部IPアドレスを確認してブラウザからアクセスします。

http://xxx.xxx.xxx.xxx/

これでとりあえずアプリの公開ができました。

もしアクセスできなければ、以下のページのトラブルシューティングが参考になるかもしれません。

Running a basic Apache web server  |  Compute Engine Documentation  |  Google Cloud

Flashforge Adventurer3 のノズル詰まりの直し方

Flashforge Adventurer3 でプリントを開始してもフィラメントがまったく出てこなくなってしまったので、ノズルにフィラメントが詰まっていると考えて除去したら直りました。

マニュアルに詰まりの解消方法が書いてありますが読んだだけでは細かいところがよく分からなかったので、また必要になった時のために実際にやった手順を書こうと思います。

マニュアルの確認

マニュアルの3章Q&AのQ1にノズルが詰まった時の解決方法が載っています。

f:id:LocaQ:20180825203526p:plain:w500

また、方法1の「エアーチューブジョイント」は、マニュアルの「1.1 部品紹介」の「2. フィラメントガイドチューブジョイント」の事だと思われます。

f:id:LocaQ:20180825203650p:plain:w600

ノズル詰まり解消の手順

マニュアルの方法1と2を行います。

フィラメントをアンロードする

手順ではアンロードしていないのでこれはやらなくてもいいと思いますが、自分はやってしまったので一応書いておきます。

アンロードは本来のメニューの「樹脂交換」を選択して行います。フィラメントがアンロードされたら「確認」を押さずに、「←」を押してメニューのトップに戻ります。

ヘッドを移動する

フィラメントの除去ではヘッドの上部からピンツールを押し込むので、ヘッドの場所によっては作業ができません。なのでヘッドを作業しやすい場所へ移動します。ヘッドの移動はメニューの「ツール」→「設定」→「移動」でできます。

移動先は最下部から少し上のあたりにしました。ヘッドの上部に拳を入れるので下の方、ただし下過ぎるとノズルから出たフィラメントを取りにくくなるので最下部より少し上、という感じです。

f:id:LocaQ:20180825210528j:plain:w800

エクストルーダーを加熱する

メニューの「ツール」→「加熱準備」を選択してエクストルーダーの温度を200℃まで加熱します。プラットフォームは加熱しなくていいのでOFFにします。

f:id:LocaQ:20180825211029j:plain:w800

ヘッドからガイドチューブを取る

「フィラメントガイドチューブジョイント」を押してチューブを取ります。チューブジョイントは画像の黒い部品で、これを下に押し込むと体感で1mmくらい下がります。その状態のままガイドチューブ(ジョイントに繋がっている白いやつ)を引っ張って抜きます。ちゃんとジョイントを押し込めていればそんなに力はいらなかったです。

※エクストルーダーが熱いので触らないように気を付けます。

f:id:LocaQ:20180825211844j:plain:w400

ガイドチューブを取れました。

f:id:LocaQ:20180825212344j:plain:w800

フィラメントを除去する

詰まり除去用ピンツールを使ってノズルの中のフィラメントを押し出して除去します。

詰まり除去用ピンツールは付属品のこんなやつです。

f:id:LocaQ:20180825212317j:plain:w400

ピンツールをチューブジョイントの部分に差し込みます。フィラメントが中に残っていると柔らかい感触がするので押し込みます。押し込むとノズルからフィラメントが出てきます。これを繰り返してフィラメントを全て押し出します

f:id:LocaQ:20180825212618j:plain:w800

なんとなくコツを書くと、

  • ゆっくり押し込む
  • 中の空洞の側面にあるフィラメントを下に押し込む感じでやる
  • ノズルからフィラメントが出てこなくなっても念を押して何度も繰り返す

という感じでやりました。

念を押して何度も繰り返すのは、もう出ないと思っても意外と出てくるためです。1回1回では変化がなくても何度もやると変化があったりします。そしてちゃんと除去できていないとおそらく次のフィラメントのロードでまた詰まってしまいます。私は2回やりました。

元に戻す

フィラメントを除去し終わったら、チューブジョイントを押し込みながらガイドチューブを差し込んで元の状態に戻します。

フィラメントをロードする

除去が終わったらメニューの「樹脂交換」→「押出」を選択してフィラメントをロードします。もしここでフィラメントが出てこず、フィラメント吸入口から「ガッガッ」といった感じの音がしたら、まだフィラメントが詰まっていると思いますので上の手順を再度やります。

フィラメントがノズルから出てくるようになったら成功です。

仕上げ

最後にメニューの「ツール」→「設定」→「校正」を選択して校正します。

Flashforge Adventurer3のビルドシートを交換する

Adventurer3のプラットフォームからラフトを剥がせなくなってしまったので、ビルドシートを交換してみることにしました。

ビルドシートの注文

ビルドシートは公式サイトから注文することができます。

flashforge.shop-pro.jp

flashforge.shop-pro.jp

プラットフォームの掃除

シートを剥がしたら糊がプラットフォームにかなり残ってしまいました。結構強力で、ググって出てきた消しゴムをかけたり食器用洗剤を使ったりする方法では取れませんでした。

f:id:LocaQ:20180811133345j:plain:w800

ツイッターでつぶやいたところ、FLASHFORGE JAPAN の方から無水エタノールかシンナーで取れると教えていただいたので、無水エタノールを注文して試してみました。

準備

以下のものを用意します。

f:id:LocaQ:20180811133415j:plain:h300

また、掃除に入る前に以下のことをやっておくとよいと思います。(やらずに掃除をした後で気付きました。)

  • プラットフォームのつまみのネジにノリが付くので事前に取っておく
  • シートを正確に張れるように上下左右の間隔を測っておく

掃除

まず無水エタノールが床にかからないように段ボールを敷きます。そしてプラットフォームに無水エタノールをかけて数十秒待ってから雑巾でこする、を繰り返します。

最初は雑巾に無水エタノールを染み込ませてこすってみたんですが、何もなしでこするよりもだいぶ楽そうでしたが糊を取るのにかなりこする必要がありました。その後直接かける方法でやってみたらずいぶん楽に取れるようになりました。

f:id:LocaQ:20180811140926j:plain:w800

掃除が終わって綺麗になりました。上の方に少しノリが残っているように見えますが、触ってもベタベタしなかったので問題ないと思います。

f:id:LocaQ:20180811133500j:plain:w800

シートの貼り付け

綺麗になったプラットフォームに新しいビルドシートを張ります。ビルドシートは固めなので、皺ができることもなく簡単に張れました。

f:id:LocaQ:20180811133520j:plain