OmniAICreator/Qiita-1.07M huggingface dataset:
Slack APIを使ってチャンネル一覧をダウンロード(CSV形式/JSON形式)

チャンネルの数が異常に増えて，一度チャンネル一覧を出力したいと思ったのでそのまとめ．
[以前](https://qiita.com/YoheiHayamizu/items/a385f59d90e2a9c4d1a1)はSlack APIを使用できるようにした．

#参考資料
https://github.com/slackapi/python-slackclient
https://api.slack.com/methods/conversations.list
https://stackabuse.com/reading-and-writing-json-to-a-file-in-python/

#環境
MacOS Mojave 10.14.5
Python3.7
slackclient 2.0.1

#準備
以前の手順を踏んでいるのが前提．
Appに以下のスコープを付与(conversations_listを使用するため)．

- channels: read
- groups: read  
- im: read  
- mpim: read 

使用する関数ごとにAppに与えるべきスコープの範囲が異なるので，必要に応じて[slack公式のリファレンス](https://api.slack.com/methods)から参照して設定すること．

まずはスラックチャンネルの一覧を取得する．

```python
def get_channels(client):
    channels = client.conversations_list(limit=1000)
    if channels['ok']:
        return channels['channels']
    else:
        assert channels['ok']
        return None
```

#JSON形式での保存
```python
json_data = json.dumps(channels)
with open("channel_list.json", 'w') as fp:
    json.dump(channels, fp)
```

#CSV形式での保存
一度取得したチャンネルをDataFrame形式にしてからCSVへ変換
```python
df = pd.DataFrame(channels, columns=channels[0].keys())
df.to_csv("channel_list.csv")
```

#ソースコード

```python
import os  # 環境変数取得のため
import slack  # SlackAPIの使用

import json  # json形式で保存
import pandas as pd  # csv形式で保存


# チャンネルの取得
def get_channels(client):
    channels = client.conversations_list(limit=1000)
    if channels['ok']:
        return channels['channels']
    else:
        assert channels['ok']
        return None


if __name__ == '__main__':
    cli = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])
    channels = get_channels(cli)

    json_data = json.dumps(channels)
    with open("channel_list.json", 'w') as fp:
        json.dump(channels, fp)

    df = pd.DataFrame(channels, columns=channels[0].keys())

    df.to_csv("channel_list.csv")
```
S3でアクセス元を制限する

# はじめに
まずS3のバケットに対して、指定したIPからのみアクセス許可するIAMポリシーを紹介します。VPCプライベートサブネットからのアクセスを許可する場合は、NATゲートウェイのグローバルIPを指定するのではなく、「VPCエンドポイント」を指定する方が良いため、こちらの設定を紹介します。

# 設定方法

## IPアドレスによるアクセス制限

グローバルIPを指定したアクセス制限のIAMポリシーの例です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "XXXXXXXXXX",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<バケット名>",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<IPアドレス>/32"
                }
            }
        },
        {
            "Sid": "XXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<IPアドレス>/32"
                }
            }
        }
    ]
}
```

## VPCエンドポイントによるアクセス制限

VPCプライベートサブネットからS3のバケットにアクセスする場合でも、NATゲートウェイを使用して、上記の設定でNATのグローバルIPを指定することも可能です。
しかしVPCプライベートサブネットからのアクセス制限をする場合、NATゲートウェイ経由とするのではなく、VPCエンドポイントを使用することをおすすめします。

メリットとして、インターネット経由でのアクセスからではなくなるためセキュアとなります。さらにNATを通過しないため、NATのネットワーク負荷が軽減させることができます。
またインターネット経由で接続するよりも料金も安く、デメリットは特にないです。
注意点としては、VPCエンドポイントを経由したアクセスにする場合、S3のバケットとVPCが同じリージョンである必要があるため気をつけてください。

1. VPCエンドポイントを、プライベートサブネット上に作成します。
作成はVPCのメニューから可能です。

1. IAMポリシーの設定
IPアドレスを指定するのでなく、VPCエンドポイントIDを指定して、アクセス制限をすることが可能です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "xxxxxxxxxx",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<バケット名>",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPCエンドポイントID>"
                }
            }
        },
        {
            "Sid": "xxxxxxxxxx",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPCエンドポイントID>"
                }
            }
        }
    ]
}
```

# 参考
https://qiita.com/flat-8-kiki/items/5392d931d8e34a4e2ae4
https://dev.classmethod.jp/cloud/vpc-endpoint-for-s3/
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html
Rubyの定数は、なんちゃって定数である件について

## 経緯
こないだ仕事で同僚のPRをレビューしていた際に定数が使われていて、ふと、何のために定数を使っているのか気になった。
それで定数ついて軽く調べてみた。

## そもそも定数とは?
僕の前提知識としては
定数 = (一般的には)代入した後、変更できなく一つのオブジェクトを指すよう固定されたもの。
でもRubyの定数は確か違うっていう曖昧な理解をしていた。

Rubyにおいての書き方は大文字からはじまる識別子。
ex) `Constant`, `CONSTANT`

定数を調べてみたところ、[wikipedia](https://ja.wikipedia.org/wiki/%E5%AE%9A%E6%95%B0_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))によると
> 変数同様プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。 ただし変数とは異なり、一度初期化するとその内容（値）を変更することはできない。よって、内容が変化しないことが保証される名前が必要なときに使用される。

なるほど、やっぱ一度定義したら変更できないのね。
つまり、イミュータブルで再代入もできないってことか。

## でRubyでは?
irbで見てみた。

```ruby

CONSTANT = "constant"
=> "constant"

# まずイミュータブルかどうか
CONSTANT.upcase!
=> "CONSTANT"

CONSTANT
=> "CONSTANT"

# 普通に変更できてる。


# 次に再代入できるか
CONSTANT = "can_be_reassigned?"
(irb):4: warning: already initialized constant CONSTANT
(irb):1: warning: previous definition of CONSTANT was here
=> "can_be_reassigned?"

CONSTANT
=> "can_be_reassigned?"

# warningが出るが再代入できてる。
```


## 結論
結局、変数と定数の違いは下記のようなものか。

#### 1.スコープ
定数は`Class::CONSTANT`のような形で定義元のclassの外でも呼べる。
変数については種類によってスコープが様々だが。

#### 2.継承やインクルードができるか
classやmoduleの定義には定数が使われてるので。


ってことで、
本来の一般的な定数の
### 「内容が変化しない」ってその性質は持ち合わせておらず、可変性においては変数とほぼ同じ。
####Rubyの定数は、なんちゃって定数。笑

## どういう時に使うの？

`CONSTANT = "constant"`のような形でシンプルに代入する時に定数を使う意図としては

#### enum的な使い方でマスタ情報を model に持っておいて外で呼び出す。(MVCにおいて)
か
#### そうでなければ、「これ定数だから破壊的メソッドとか、再代入とかしないでよ！」って示す、特別感出す。
ってとこか。


#### あとがき
本当にこんな違いだけか？って思っているので、
「それ以外にもあるよとか」、「違うよって」とこがあれば伺いたいですorz
【GoogleAppsScript】実行可能API(Execution API)の初期設定でハマったので流れをメモする

#概要
GoogleAppsScript(GAP)で書いたコードを外部から実行させようとGSPのスクリプトコンソールから[実行可能APIとして導入...]をクリックした際、以下のエラーが出て前に進められなくなった。
<img width="694" alt="スクリーンショット 2019-06-09 11.31.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/e07ac55f-df68-6075-5e57-a5c0322485e7.png">
ユーザが管理する Cloud Platform プロジェクトが必要です


#結論
GoogleCloudPlatform(GCP)のプロジェクトを手動でGSPのプロジェクトで関連づける設定が未実施だったため上記のメッセージが出力していました。
※2019年4月8日　GAPとGCPの連携に仕様変更があり、以前だとGAPでのプロジェクト作成時に自動でGCP側のプロジェクトが紐づいていたが、今現在(2019/06/09)だとその機能が無効になっている。
https://developers.google.com/apps-script/guides/cloud-platform-projects

#確認方法
1.　GAS側操作)外部公開したいコード(実行可能APIとして設定したいGASプロジェクト)のWebコンソール画面を開く
2.　GAS側操作)上段の[リソース]=>[Cloud Platform プロジェクト]を選択
3.　GAS側操作)以下画像と同じく、プロジェクト番号が空になっていることを確認

|<img width="700" alt="スクリーンショット 2019-06-09 11.59.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/e590f6b5-d756-2fac-230c-783063592791.png">|
|:-:|

この状態だと、GCP側のリソースや機能を連携して利用することができない状態になっています。つまり、本事象と合致している可能性があります。


#設定方法
1. GCP側操作)GCPよりAPIを公開する際に紐付けるプロジェクトを開く
(GCPの初回登録やプロジェクトの作成方法は省略)
2. GCP側操作)ダッシュボードより[プロジェクト情報]=>[プロジェクト番号]をコピー
3. GAS側操作)GCP側で認証情報設定を完了させてください。という旨の表示が出る。
4. GCP側操作)[APIとサービス]=>[認証情報]を選択
5. |<img width="273" alt="スクリーンショット 2019-06-09 12.14.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/f6c09c88-9c20-6ed8-c2b0-f920c7cf19da.png"> |
|:-:|

6. GCP側操作)[認証情報]を[参考記事](https://qiita.com/soundTricker/items/1bcfc5c9e80d29a7ae4b#client-id%E3%82%92%E7%99%BA%E8%A1%8C)等を拝見しつつ設定
7. GCP側操作)[OAuth同意画面]を[参考記事](https://qiita.com/ShishidoToru/items/67a7cad6b997e316cb20#%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E8%A8%AD%E5%AE%9A)等を拝見しつつ設定
8. GAS側操作)[確認方法-3](#確認方法)で表示したGAP側のフォームにプロジェクト番号を貼り付け、[プロジェクトを設定]をクリック
9. |<img width="391" alt="スクリーンショット 2019-06-09 12.28.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/e12e1990-125e-a554-f6b5-2c60532d472b.png"> |
|:-:|
10. GAS側操作)紐づいたら上記9のようにGCPのプロジェクト名が表示される
11. GSPのスクリプトコンソールから[実行可能APIとして導入...]を実行した際のエラーは解消を確認ください

 
#参考サイト
- [Google Cloud Consoleを弄ってみる](https://officeforest.org/wp/2018/04/11/google-cloud--console%E3%82%92%E5%BC%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)
- [GASのExecution APIを使ってGASを外部からぶっ叩く](https://qiita.com/soundTricker/items/1bcfc5c9e80d29a7ae4b)
- [Google Apps Scriptにおける「プロジェクト」の関係](https://qiita.com/sebisawa/items/4faa6d859f480e306f46)
- [【GAS】Execution APIを使ってJavaScriptからGASにアクセスする](https://qiita.com/ShishidoToru/items/67a7cad6b997e316cb20)
OculusQuestで録画した動画の管理方法

##録画

メニューのシェアから録画を選択すると始まります。
もう一度押すと停止です。
![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e252baa2-462e-59f6-6583-6797c5ee5864.jpeg)


##エクスプローラーからは見れない
エクスプローラーから録画した動画を開こうとしても
エラーが出て開くことはできません。
![errorOculusMovie.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e7648f07-f5b4-e395-68f3-2d58cee1c60a.png)


##adb pull

adbコマンドが打てる状態であること　が前提条件です。
下記コマンドを実行すると`C:\Users\ユーザ名`に`VideoShots`というフォルダがコピーされます。

```
adb pull /sdcard/Oculus/VideoShots
```

取得するファイル名(今回で言うとビデオの名前)を指定することもできます。
移動先のディレクトリ名も指定できるので、組み合わせて使うのが一番だと思います。

```
adb pull /sdcard/Oculus/VideoShots/ファイル名　 C:\Users\ユーザ名\Videos
```

##Windowsのインポート機能

ラズさんがまとめてくださってました。→[インポート機能](https://raspberly.hateblo.jp/entry/OculusQuestFileImport)

Questを繋いで右クリックして`画像とビデオのインポート`を選択します。
![インポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/c24ffc42-0398-a554-789c-c34ef313032f.png)


インポート時には左下のその他の設定からインポート設定を変更できます。
インポート先のフォルダを指定できるので便利です。
![インポート設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/84dc1454-37b4-821e-1556-8a6c0126d45d.png)


##Quest内での画像と動画の判別
録画した動画はそのままの状態だと、再生時間が表示されません。
開いて確認するまで動画か画像かわからないので面倒です。

adb pull でPCに読み込んだ動画を`VideoShots`の中に入れるか、
インポート機能を利用してPCに読み込んだ動画を`VideoShots`の中に入れるか
どちらかをしてあげれば動画の再生時間が表示されます。
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/0b312dfa-7ee0-06ae-196a-1b1be145cbf7.jpeg)
Magento2 on Docker が日本語化対応し、最短2コマンド起動するようになりました

Adobe が Magento を買収して一年の2019年5月。

公式コミュニティ活動によって開発された Magento2 日本語化拡張が Marketplace に公開されました。ベリテワークスさんありがとうございました。

2019/05/09
[ブログ - ついに公式Magento日本語化エクステンションがMarketplaceに公開されました | Magentoと越境ECの総合サポート Principleworks](https://principle-works.jp/blog/finally-official-magento-japanese-localize-extension-published-in-marketplace/)

というわけで、これまで自動化スクリプトが組みづらかった Magento2 日本語化に対応した Docker 環境構築キットを作成しました。最短2コマンドで日本語化済み Magento CE 2.3.1 が初期化できます。超便利。

[kzkick2nd/magento2-on-docker: Magento2 on docker-compose kit](https://github.com/kzkick2nd/magento2-on-docker)

macOS のみ利用対象です。
その他、ローカルに composer がある場合はキャッシュを効かせるために利用して高速化を図っています。
最低限の依存環境も Dockerfile にまとめたので参考になるかと思います。

それではよい Magento ライフを。
Dockerリソース使用状況の確認方法

本投稿では、ホストOS上で現在稼働しているコンテナのリソース使用状況の確認方法およびコンテナで実行したコマンドのログを確認する方法を記載します。

## 1. テスト用コンテナをバックグラウンドで起動

まず、リソース確認用にテスト用コンテナを作成し、バックグラウンドでコンテナを起動します。<br>
コンテナは、コンテナ作成時に **-d** オプションを付与することでバックグラウンドで実行することができます。

```shell:bash
$ docker container run \
> -d \  # バックグラウンドで実行
> --name test0001 \
> -h host0001 \
> -it \
> centos:7.5.1804 /bin/bash
fb6f53e1d4f599f26947bd39c40b20d48a22597ba3689c63df9598981d31fa12
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fb6f53e1d4f5        centos:7.5.1804     "/bin/bash"         18 seconds ago      Up 17 seconds                           test0001
```

## 2. リソース使用状況を確認

次に、コンテナのリソース使用状況を確認します。リソースの使用状況の確認には、 **docker container stats** コマンドを実行することで確認することができます。<br>
また、実行時に以下のコマンドオプションの指定や **--format** オプションで出力する項目をカスタマイズすることができます。

### docker container stats コマンドのオプション

| オプション | 説明 |
| :--- | :--- |
| -a | 停止しているコマンドも含めて全てのコンテナのリソース使用状況を表示 |
| --no-stream | 使用状況を一度だけ表示し、コマンドプロンプトに戻るオプション |
| --no-trunc | 完全なコンテナIDを表示 |
| --format | リソース使用状況の表示する項目を指定して表示 |

### **--format** オプションで指定可能な項目

| パラメータ | 説明 |
| :--- | :--- |
| .Container | コンテナ名またはコンテナID |
| .Name | コンテナ名 |
| .ID | コンテナID |
| .CPUPerc | CPU利用率 |
| .MemUsage | メモリ使用量 |
| ,NetIO | ネットワークIO |
| .BlockIO | ディスクIO |
| .MemPerc | メモリパーセンテージ（Windowsは使用不可） |
| .PIDs | PID番号（Windowsは使用不可） |

### docker container stats コマンドの実行例

```shell:bash
$ docker container stats \
> --no-stream \
> --format "table {{.Name}}\t{{.ID}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"  # 表示する項目を指定
NAME                CONTAINER ID        CPU %               MEM USAGE / LIMIT   PIDS
test0001            fb6f53e1d4f5        0.00%               804KiB / 1.952GiB   1
```

## 3. コンテナで実行したコマンドのログ確認方法

最後に、テスト用コンテナで実行したコマンドのログを確認する方法を記載します。<br>
ホストOS上で **docker container logs** コマンドを実行することでコンテナ内でのコマンド実行ログを確認することができます。<br>
ホストOS上で[rsyslog](https://www.rsyslog.com/)などを活用することで、リアルタイムでのコンテナのログ出力など拡張することも可能です。

### テスト用コンテナでコマンドを実行

```shell:bash
$ docker container attach test0001
[root@host0001 /]# ls
bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@host0001 /]# hostname
host0001
[root@host0001 /]# read escape sequence
```

### ホストOSで時刻付きでテスト用コンテナで実行したコマンドログを確認

```shell:bash
$ docker container logs -t test0001  # -t オプションを付与して時刻付きで表示
[root@host0001 /]# ls
2019-06-09T03:10:06.464865400Z bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
2019-06-09T03:10:09.631366100Z [root@host0001 /]# hostname
2019-06-09T03:10:09.636110800Z host0001
```

## 参考文献

1. 古賀政純, "Docker実践ガイド 第２版", pp.126-130 (2019).
2. The rocket-fast Syslog Server - rsyslog, https://www.rsyslog.com/, Online; accessed 9-June-2019.
layoutメソッドと includesメソッドについて

#layoutメソッドとincludesメソッドの復習アウトプット


#1.はじめに
以下のようなコードを例にして、layoutメソッドと includesメソッドについて、復習していく。

```ruby

items_controller.rb
class ItemsController < ApplicationController
  layout 'hogehoge'

  def index
    @items = Item.includes(items_users: :users)
  end
end
```

#2.layoutメソッドについて
layoutメソッドとは、コントローラによって、ヘッダー・フッターのデザインを変更したり、読み込むCSSを切り替えるメソッドである。

layoutメソッドは、他にも細かい使い方があるが、今回は、**「コントローラ単位で適用するレイアウトの指定」**について解説する。
※他に詳しく知りたい方は、以下のURLにアクセスしてみてください！
https://www.javadrive.jp/rails/template/index3.html


コントローラ単位で適用するレイアウトの指定する場合、コードの書き方としては、以下のようになる。

```ruby

class コントローラ名 < ApplicationController
  layout 'レイアウトファイル名'

  def アクション名
  end
end
```
コントローラに記述ができたら、次にlayoutsのビューファイルを作成する。
ファイル名の作成方法は、**layouts/レイアウトファイル名.html.erb**という書き方をする。
今回の具体例では、layout 'hogehoge'としていしているため、
layouts/hogehoge.html.erbというファイル名となる。

上記のようにコントローラ、ビューの設定ができた場合、どのような処理が行われるのか、について解説する。
itemsコントローラのアクションが呼び出された場合、レイアウトファイルとしてapp/views/layouts/hogehoge.htmlが使われるようになる。
また、何も指定しない場合はapp/views/layouts/application.htmlが読み込まれるようになるという処理が行われる。

#3.includesメソッドについて
includesメソッドについての定義や役割については、以下の記事をご覧ください。
https://qiita.com/okamoto_ryo/items/d4cfeb3aab97e8d50c8a

includesメソッドの書き方は、includes(:モデル名)という書き方になる。
そのため、今回の具体例では、のような書き方となる。

```rybu
@items = Item.includes(items_users: :users)
```
しかしながら、私見では、なぜitems_users:が記述されている意味がいまいち理解することができなかった。
そのため、理解できる方は、ご指摘いただけると助かります。よろしくお願いします。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
UnityCloudBuildでテスト用のiOS端末を追加登録する方法

## まえがき
私は UnityCloudBuild で iOS/Android 対応のアプリをビルドしています。

iOS でアプリの実機テストを行うときは、事前に AppleDeveloper にテスト端末の UDID を登録し、その情報を含んだ ProvisioningProfile を UnityCloudBuild に適用する必要があります。

テスト端末が増える機会は半年に1度くらいしか無いので、忘れても良いように手順を残すことにしました。

※既存の設定に端末を追加登録するときの手順ですので初回の設定作業には触れていません。
※UnityCloudBuildに関する内容は最後のほんの一部だけでそれ以外は一般的な内容です。

## iTunes でテスト端末の UDID を取得する
1. 今回追加するテスト端末を PC に接続します。
2. iTunes を起動して端末の情報を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/5887d606-4580-b198-80d5-68533d7ccbd3.png)

3. シリアル番号をクリックすると表示が UDID に切り替わるので UDID をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/61e60c70-b2f1-c82e-375c-5bc733982f5a.png)
↓ シリアル番号をクリックすると表示が変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/a5b8cd91-9e72-6c88-b919-0f0b75d64b21.png)
これで UDID を取得することができました。

## AppleDeveloper に端末を登録して、ProvisioningProfile を更新/取得する
1. https://developer.apple.com/account/ にサインインします。
2. Certificates, IDs & Profiles を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/bd743f32-858e-9525-8366-0026848ee26a.png)

3. Devices を選択して、 ＋ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/0aadf654-18ab-496e-5cfd-22feddb4fd37.png)
4. Platform を選択して、任意の DeviceName を入力して、端末の UDID を入力したら Continue を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/495b8c1c-8104-7730-f9b4-642d995ef22e.png)
これで端末の情報が登録されました。
5. Profiles の中から編集したい Profile を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/8ded39b6-26cb-0452-30f2-1dedbb858e3c.png)
6. この Profile に登録する Device が選べますので、今回追加した端末にチェックをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/f911635f-05ea-0da0-f642-f51a121335d8.png)
チェックを入れたら Save して Download します。
これで更新された ProvisioningProfile（.mobileprovision ファイル）を取得できました。

## UnityCloudBuild へ ProvisioningProfile を適用する
1. https://developer.cloud.unity3d.com/projects/ にサインインします。
2. Credentials を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/3a3af932-9cab-8636-db68-5a9c6d4a23dd.png)

3. 対象の Credential の︙ボタンを押し、UpdateProvisioningProfile を押して、先程生成した .mobileprovision を適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/04946d7a-c09f-832b-f037-d1d8ac34144f.png)

設定が間違っていなければこれで作業は完了です。
ビルドして動作確認してみましょう。
AWS認定Big Data勉強記 - 10: 合格しました

みなさん、こんにちは、えいりんぐーです。
データ分析や機械学習周りの仕事をしています。

先日、AWS認定ビッグデータ専門知識の試験を受け、幸いなことに合格することができました。今回は、簡単に試験の振り返りをしたいと思います。

## 点数
||今回|前回|[nakazaxさん](https://qiita.com/nakazax/items/757d4c7c46618e2193be)|[ぼぶろぐさん](https://ameblo.jp/hackerbobchan/entry-12402034809.html)|
|---|--:|--:|--:|--:|
|Overall|64|46|78|42|
|Collection|50|25|50|37|
|Storage|66|44|100|22|
|Processing|87|62|75|62|
|Analytics|50|50|87|25|
|Visualization|85|42|71|42|
|Data Security|50|50|80|60|

前回の結果から、コレクション・ストレージ・ビジュアライゼーションが弱いと感じていたので、その辺りを改善できてよかったです。
アナリティクスとセキュリティが向上していないのは悲しいです...
点数全体としては、プロセッシングとビジュアライゼーションで稼いだ感じになっていますね。
また、正直、64%で合格できるのかーとちょっと思ってしまいます。
手応えとしては70%いっていると思ったのですが...

## 勉強内容

基本的にこのブログでやっていたように、ブラックベルトの資料とよくある質問をまとめてブログに書いていました。書くという作業が、サービスの詳細を覚えるのに役立ったかと思います。
特に、よくある質問は意外と深い内容まで説明しているので、認定取得を目指す方はしっかり読んでおいたほうがいいと思います。また、適宜細かいところを開発者ガイドを読んで補足していきました。

加えて、ビッグデータ資格は他と違って模擬試験がPDF版のものしかなく、ちょっと物足りないのですが、AWS が提供する[無料のデジタルトレーニング](https://www.aws.training/learningobject/curriculum?id=21332)があり、いくつかのユースケースに関して本番さながらの問題とその解説を提供しています。少なくとも模擬試験とこのデジタルトレーニングに出てくる内容は完璧に抑えておくことが望ましいと思います。


## 反省

S3に関してはそこまで優先度をあげて取り組んでいなかったのですが、やはり根幹をなすサービスであるだけに、関連した問題は出て来ました。もう少し勉強するべきでした。

## AWS Summit 2019
私は AWS Summit に参加する予定なのですが、資格保有者は[ちょっとした特典](https://dev.classmethod.jp/cloud/aws/aws-summit-tokyo-2018-lounge/)があるらしいので、楽しみにしています。

## 終わりに

2月ごろからちょっとずつ勉強していて、4月に受験した際は落ちてしまったのですが、最終的に合格できてよかったです。
私の記事が他の方の参考になれば幸いです。
ありがとうございました。
初心者による初心者のためのVue.js入門

# はじめに

Vue.js をこれから勉強しようとしている方、初心者の方が見ていると思います。<br>
自分が途中まで学習して躓いた点を中心に書いているので読んでいただけたら嬉しいです。<br>
Vue.js つよつよエンジニアさんは優しい気持ちで見ててください。<br>


Vue使えるようになった今考えると[Nuxt.js](https://ja.nuxtjs.org/)を使ったほうが簡単かもしれません (2019/11/05追記)

# 1.Vue のインストールなど

※この先 Node.js(&npm)がインストールされていることを前提に話を進めます、まだインストールが済んでいなければ[公式サイト](https://nodejs.org/ja/)からインストールしてから進めてください。

## Vue-cli のインストール

vue-cli は vue を開発する上で便利な物が詰まっています。
適当にフォルダを作成し、その中で下のように入力してください。

```
npm install -g @vue/cli
```

容量が結構あるので少し時間かかるかもしれません。

## Vue プロジェクトの作成

cli が入ったと思うのでコマンドでプロジェクトを作成します、とよくあるサイトや記事では書いてあると思いますが初心者には難しいと思います。UI でやりましょう。

```
vue ui
```

と入力してください。<br>
`Vue プロジェクトマネージャー`というのがブラウザで起動したと思います。
真ん中にある`作成`->`ここにプロジェクトを作成する`を順に押し
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265244/36dc9aed-fe8e-7841-29a0-b52bdbe3573e.png)
このようなページになれば OK です、プロジェクトフォルダに名前を入れて次に進んでください。
次も特に設定する必要は無いのでデフォルトを選んで作成に進んでください。少し時間かかります。

これで Vue プロジェクトの作成は終わりです。

# Vue の実行

まだ UI を使います、左のタスクを選択してください。
`serve`の下にあるタスクの実行をして少し待ってください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265244/f0e029d1-3ba2-3b64-c08d-5118e701f94f.png)
画像のように右の丸にチェックマークがついたら完了です。

アプリを開くを押せばあなたの最初の Vue のページが表示されます。

# Vue の編集

ではあなたが作成した Vue のフォルダを見てください。
`src`というフォルダを見つけれましたか？

その中が私達がメインに編集しサイトなどの内容物を作成するものです。

## App.vue

このファイルを見つけたら開いて見ましょう。

Vue.js のメインのファイルです。HTML でサイトを作った人ならわかると思いますが index.html に当たります。（本当の index.html は public フォルダにあります）

３つの大きな塊があると思います。
`template`/`script`/`style`の３つです、HTML の経験ある人はだいたい分かると思いますが`template`は body に当たります。

では編集していきましょう。

```vue
<HelloWorld msg="Welcome to Your Vue.js App" />
```

msg=の後ろを好きに変更してください。

先程開いたページを見ると変更した内容に変わっていると思います。

## HelloWorld.vue

`component`フォルダにあります。
こちらも先程と同じで３つの塊がありますね。

説明はあまりないので書き換えて行きましょう。
`template`の`div`中は書き換えても問題起きないので好きに変えてください。

ページを見て思ってたように出たら完成です。

# おわりに

初心者が初心者なりにいくつかの問題を踏まえて書かせていただきました。
今回は簡単にするために v-系の説明等は省かせていただきました。

参考 : [Vue.js 公式サイト](https://jp.vuejs.org/index.html)
【git】git logや git reflogの実行後、コマンドを入力できなくなった

# コマンド入力に戻れなくなった時の対処法

## 書いてる人のレベル感
gitに関しては数年`SourceTree`を利用しており、 gitコマンドはほぼ使ったことなし。
近々参画するチームでgitコマンド推奨とのことなのでgitコマンド勉強中。
gulp、npm script、webpack等々利用のため、黒画面は実業務で経験あり。 
コマンド自体に恐怖心はないが手練れではない。

## 事象
`git log`、もしくは`git reflog`でログを表示させたのち、コマンドが打てなくなり困りました。

ちなみにログが少ない場合は問題なく続けてコマンドを打てるのですが、ログの量が増えてくると本事象が発生しました。

表示としては下記の通り、最下行に`:`が表示され、
`Ctrl + c`、`Enter`、`Esc`を打ってもどうにもなりません。
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336910/2a1a8775-bb71-9da5-903a-2d12938b64f4.png)
別のコマンド打ちたいんで元の現在ディレクトリのパス表示に戻ってほしいんです。。

## 解決方法
このキーを押すだけです。
`q`

## 解説
less画面という画面に入ってしまったらしいです。

## 参照
- [覚えておきたいターミナルでのvim/lessの抜け方](https://hacknote.jp/archives/7660/) 
- [【 less 】コマンド（基本編）――メッセージやテキストファイルを1画面ずつ表示する](https://www.atmarkit.co.jp/ait/articles/1702/09/news031.html)

## 所感
gitコマンド初心者向けの記事は多くありましたが、本事象については見かけなかったので、コマンド初学者などにはつまずきポイントかなと思いました。（自分がつまづいたので）
ActiveStorageでlightbox2を使う。


#Active Storageでlightbox2

```show.html.erb
<% if @comment.image.attached? %>
  <%= link_to image_tag(@comment.image),@comment.image, :rel => "lightbox" %>
<% end %>
```

参考サイトがあまりなかったので載せました。

##参考にさせて頂きました。
https://qiita.com/hmmrjn/items/7cc5e5348755c517458a
MacでグローバルなPython3環境を構築する

MacでPython3のグローバル環境を作る際、いつも手順を忘れてしまうのでメモ

# 背景
MacにはデフォルトでPython2の環境が入っているが、これはシステム用のものであり、そのまま利用するのは環境が汚れてしまうためよくない
環境を分ける策として、virtualenv等の環境切り替えシステムにより、用途ごとに専用のPython環境を作る方法がある
しかし、ちょっとした用途でPythonを動かしたい時などに専用の環境を都度作るのは手間である

そのような場合に利用できる、グローバルのPython3環境を構築する手順を紹介する

# 環境構築手順
まず、brewコマンドにてPythonをインストールする
特にバージョンを指定しなければ、Python3の最新バージョンがインストールされる

```shell
brew install python
```

この場合`python3`コマンドにて、インストールしたPython3のインタープリタが起動するようになるので、確認する
（単純な`python`コマンドでは、システム標準のPython2のインタープリタが起動する）

```shell
python3
```

インストールしたPython3に対し、`pip3`コマンドにてvirtualenvパッケージをインストールする
（pipに関しても、単純な`pip`コマンドでは、システム標準のPython2に対するpipが起動する）

```shell
pip3 install virtualenv
```

グローバルに利用するPython3の環境フォルダを任意の場所に作成する
ここでは仮に、ユーザディレクトリの`bin/python3/`に作成することにする

```shell
mkdir -p ~/bin
cd ~/bin
virtualenv python3
```

最後に、Terminalを起動した時に都度実行されるスクリプト`~/.bash_profile`に、以下の内容を追記する
（ファイルがない場合は作成する）

```shell:~/.bash_profile
export VIRTUAL_ENV_DISABLE_PROMPT=0
source ~/bin/python3/bin/activate
```

環境変数`VIRTUAL_ENV_DISABLE_PROMPT`に何かしらの値が格納されていると、virtualenvで環境を切り替えた際のプロンプトへの環境名表示が無くなる
この行は個人的な好みで含めるか否かを選択してよい

Terminalを再起動し、`python`コマンドにてPython3のインタープリタが起動すれば完了である

# 環境破棄手順
## 一時的なグローバル環境破棄手順
Terminalにて、以下コマンドを実行する

```shell
deactivate
```

これにより、コマンドを実行したTerminalのみで、`python`コマンドでシステム標準のPythonが起動するようになる

## 恒久的なグローバル環境破棄手順
`~/.bash_profile`の追記した箇所を削除し、brewでPythonをアンインストールする

# 参考
- https://virtualenv.pypa.io/en/stable/reference/#envvar-VIRTUAL_ENV_DISABLE_PROMPT
初めてのポートフォリオ作り方【考え方編】

#自己紹介
初めまして、レンです。Qiita初投稿なので、簡単に、まず自己紹介からしていきます。
現在は、都内にあるIT企業の営業職として働いる社会人2年目です。

そこでの経験を通じて「価値を販売」するではなく「価値を作る」側になりたいと考え、
WEBエンジニアを転身することに決めました。と...小難しいこと書きましたが、
単純に作ることが好きなので、それをITを使って貢献できたらなというのが本音です。

#スキルセット
まだ現場経験がないので、実務レベルではないですが、簡単にスキルセットを書いていきます。
マークアップ、ライブラリも含めると6つ。
- PHP
- MYSQL
- JapaScript
- JQuery
- CSS
- HTML

サーバサイド言語とフロントエンド言語が混じっているのは、自分がどっちに向いているか判断
できなかったので両方やってみたって感じです。

正直なところ、現段階では適正とかは判断できなかったのですが、直感的な書きやすいのは
フロント系かなという印象です。

#学習の過程
ちょうど3ヶ月まえ、今年(2019年）の2月末からプログラミング学習開始。
最初は「ドットインストール」という動画学習支援サービスを見ながら、
簡単のWEBサイト作りました。

参考までにリンクを貼っておきます。
[ポートフォリオ](https://iwasakiren.github.io/myportfolio/)

クオリティについては、あまり触れないでください...
その後に、皆さんお馴染みの「Progate」でHTML、CSS、JavaScript、JQuery、
PHP、MYSQL、コマンドライン、Gitのコースを一通りやりました。レベルでいうと150ぐらいです。

学びの総仕上げとして、技術書の数冊購入しJavaScriptでフォトギャラりー、PHPでメモアプリ、掲示板
を作りました。Progateからの移行で環境構築やセッション、クッキーの理解で苦戦しましたが、そこは省きます。

#WEBアプリ考え方
やっと本題です。正直まだWEBアプリを作成してはいないですが、
コード書く前にアイデア出しのところで、苦戦する人多いんじゃないのかと思い、記事を書いています。
正直、自分の考えを整理したいというのもありますが...

##考える順番
大きく、ステップは5つ
1. 考え方の記事を読む
2. 世の中の課題を考える
3. 解決策を考える
4. 機能を考える
5. 簡単な実装イメージを考える

順番に詳細を解説していきます。
1.最初に、自力で考えるのハードルが高いので、ネットに落ちている記事を読み漁りましょう。
ここでの、ポイントはアイデアをパクるのではなく、考え方を真似することです。

僕が読んだもの中で、特に役にたった記事を参考までに、リンクを貼っておきます。
[Web サービスを自力で作る上で大事な考え方](https://www.bokukoko.info/entry/2017/08/14/151528?amp=1)

2.課題というよりも、「周りの人や自分はどんな悩みがあるかな〜」と考えると思いつきやすくなります。
現段階でも「何も思いつかないよ〜」という方は日常生活の中で、友達や自分が困ったことをメモする癖を
付けておくと良いです。

僕の場合は、
- いつも、最後まで読む前に挫折してしまう
- 読んでない本が家にたくさん飾ってある
などの悩みをもっている友人がいたので、「脱積読」をテーマに考えました。
正直ところ、僕も積読気味なところもあります...

上の二つの課題を深掘ると

- ネットの記事よりも文字数が多い
- 現在地がわかりづらい
- 同時に複数の本を買ってしまう

解決すべき課題が明確になってきます。

3.課題を解決するために何が大切かを抽象度の高い言葉でくくる。
上の課題で共通していることは、「モチベーション維持」です。
この共通点について、施策を考えていきます。

モチベーション維持するためには、
- 現在地の見える化
- 専用チャットグループ
- 同時に、一冊しか本を登録できない
- 応援メッセージ
- 読書ログ

が効果的であることが考えつきます。パッと答えが見つからない人は、
課題の頭に入れて散歩してみると良いです。

4.解決策を実現するために具体的に何が必要かを考えます。
ランダムで良いので、まずは思いつくままに書き出していきます。

登録
- 本の登録ができる
- ページ数の登録ができる

表示
- %で現在地を表示できる
- 読書数を表示できる
- 画像を表示できる
- ページを表示できる
- 達成度に応じて、自動でコメントを表示できる
- 読書ログを表示できる

＋α
- 同じ本を登録している人のチャットグループ参加できる
　- メッセージの表示ができる
　- 進捗状況をシェアできる

上では、わかりやすいように「登録」「表示」「+α」の3つに分けましたが、
最初はそこは気にせず後からラベルを付けていくイメージです。

あと、語尾を「できる」で統一しているのは、「本の登録」のような曖昧な機能にならない、
語尾を考えという余計な負担を減らしてくれます。これは、「よくわかるPHP」という技術書に
書いていたので、参考にして見ると良いです。

5.最後ですが、ここは自力では思いつかない方が多いと思うので、今まで学習の中で
「〇〇と〇〇を組み合わせたらいいんじゃないかな」ぐらいに置いといて、あとはググりながら
情報収集していった方が早いです。

僕の場合のざっくりな例をあげると

- 登録フォーム
- ログイン画面
- データベース設計
- AmazonのAPI
- LINEのAPI

などが考えられます。
正直ここは、僕もあまり自信がないので、これから検索するなりして情報収集して実装していく予定です。

以上でこの記事で紹介したかったことは終わりです。
最後まで、読んでいただいた方、本当にありがとうございます。
また、自作アプリが完成したら、Qiitaで公開するので、よろしくお願いします！

もし、今回の記事で紹介した内容で、ここは〇〇した方がもっと良くなるな〜
という指摘、アドバイスなどありましたら、ぜひコメントお願いします。
楽しみにお待ちしております！
矢印キーをホームポジションあたりに割当てる

# はじめに
タイピング時に激しく矢印キー(←↑↓→)とホームポジションを移動するのが煩わしくなり設定した。
躓かなければ15分くらいで設定できる。

1. AutoHotKeyのインストール
2. Change Keyのダウンロード
3. 右側のAltをF13に変更
4. AutoHotKeyのキー設定

# 設定内容
## 1. AutoHotKeyのインストール
インストーラをダウンロードして実行する。
[AutoHotKey](https://www.autohotkey.com/)
※編集時点でCurrent Versionは1.1.30.03

## 2. Change Keyのダウンロード
右AltキーをF13に変更する際に利用するためダウンロードする。
ダウンロードしたLZHファイルを解凍するとChgKey.exe実行ファイルが入っている。
無くさないようにChgKey.exeファイルはAutoHotKeyのインストール先ディレクトリに配置した。
[窓の社 Change Key](https://forest.watch.impress.co.jp/library/software/changekey/)

## 3. 右側のAltをF13に変更する
Change Keyを管理者権限で実行してレジストリを書き換えて右AltキーをF13(0x0064)に変更する。
Change Keyを終了するタイミングで再起動がかかる。
参考用 → [右AltにIME オン/オフ キーを割り当てる](http://takk.hatenablog.com/entry/2016/02/08/175559)

## 4. AutoHotKeyのキー設定
キーリストを参考に設定用のahkファイルを作成してスタートアップのフォルダに配置する。
※スタートアップのフォルダ表示 [Win + R]→[shell:startup]→[Enter]
Vim配置やCapsLockをCtrlに変更してもいいかもしれない。
[キーリスト参考用](http://ahkwiki.net/KeyList)

```MySettingKey.ahk
F13 & J::Send,{Blind}{Left}         ;←
F13 & K::Send,{Blind}{Down}         ;↓
F13 & I::Send,{Blind}{Up}           ;↑
F13 & L::Send,{Blind}{Right}        ;→
F13 & U::Send,{Blind}{PgUp}         ;PgUp
F13 & O::Send,{Blind}{PgDn}         ;PgDn
F13 & H::Send,{Blind}{Home}         ;Home
F13 & `;::Send,{Blind}{End}         ;End
F13 & A::Send,{Blind}{Backspace}    ;Backspace
F13 & S::Send,{Blind}{Delete}       ;Delete
F13 & Enter::Send,{Blind}{AppsKey}  ;右クリックメニュー表示
F13 & E::Send,{Blind}{esc}          ;esc
```


ahkファイルの右クリックメニューから[Run Script]で常駐させれば設定完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228134/745092cf-35fa-5991-5a64-43a7a579e131.png)
Jetson Xavier 性能情報

#目的
Jetson Xavierは、高いperformanceの数字が示されている。
NVIDIAのサイトから情報を拾う。

出典：
https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-agx-xavier/

#Jetson Xavier 性能情報

## size
>At just 100 x 87 mm

## performance

>an unparalleled 32 TeraOPS (TOPS) of peak compute

## power

>sers can configure operating modes at 10 W, 15 W, and 30 W as needed for their applications

#GPUスペック

GPU
>512-Core Volta GPU with Tensor Cores

DL Accelerator
>(2x) NVDLA Engines

動作周波数は？？？


→　演算性能は？？？

どういう計算で、32Teraなどの高い数字になるかわかっていません。
現状、以下。

(出典: http://info.nvidia.com/rs/156-OFN-742/images/Jetson_AGX_Xavier_New_Era_Autonomous_Machines.pdf )

>1377MHz 512 CUDA cores, 64 Tensor Cores 22 TOPS INT8, 11 TFLOPS FP16

INT8について、CUDA Coresで考えると、
1377(MHz) * 512 CUDA Cores * 2(積和) * 4(INT8なので）→　5.64　TOPS
よって、上記の22TOPSは、「64 Tensor Cores」が中心？

DLAは、
https://en.wikichip.org/wiki/nvidia/tegra/xavier
の記載では、

>11.4 TOPS (int8) 
5.7 TFLOPS (FP16) 

となっている。GPUとDLAの合計で、32Teraに届きそう。
（別途、整理する。）





#その他の情報

リリース時期は、以下。
以下は、wikiより
( https://en.wikipedia.org/wiki/Nvidia_Jetson )
>announced as a development kit in end of August 2018 with a fulfillment promise of "early September"


#NVIDIA GPU 共通情報
世代など。

(出典： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html )

|  世代   |  EMBEDED   | COMSUMER DESKTOP,<br>LAPTOP    | PROFESSIONAL<br>WORKSTATION    | DATA <br>CENTER    |     
|:---:|:---:|:---:|:---:|:---:|
|  Turing<br>CC7.x   | Xavier    |     |     |     |     
| Volta<br>CC7.x | Xavier    |     |     |     |     
|  Pascal<br>CC6.x   | Tegra X2<br>[jetson TX2]    |     |     |     |     
| Maxwell<br>CC5.x    |Tegra X1<br>[Jetson NANO]     |     |     |     |     
| Kepler<br>CC3.x    |Tegra K1     |     |     |     |     
※CC: Compute Capability。
※[ ]内、機種名
※ニンテンドースイッチは、Tegra X1。
※半精度浮動小数点演算は、CC5.3以上でサポート。
    以下の引用のところに書かれています。
(図　引用： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html  )
<img width="564" alt="16bit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9f5dcc69-0b7b-6e3d-00dd-c180b9f4f34d.png">

#まとめ
とりあえず、基礎情報のみ記載しました。。。。

#今後
適宜、記載を追加します。
コメントなどあれば、お願いします。:candy:

#関連（本人）
[Jetson TX2 性能情報](https://qiita.com/enoughspacefor/items/76423f7442e675515fa5)
[良書 「GPUを支える技術　超並列ハードウェアの快進撃[技術基礎]」を読む](https://qiita.com/enoughspacefor/items/31e9461b6a07b484b643)
[資料『JETSON AGX XAVIER AND THE NEW ERA OF AUTONOMOUS MACHINE』を読む](https://qiita.com/enoughspacefor/items/fa825bf907604b2eb9b8)

#関連（本人以外）
以下を参考にしました。
[NVIDIA Teslaスペック](https://qiita.com/yukoba/items/10d0ba3fb1d19a6ab6a5)
RaspberryPi環境のdocker


## 概要

Rasberry Piの環境でDocker環境を構築しました。普通にインストールするとインストールはできるものの、起動で失敗しました。そのため、バージョンをダウングレードし、`18.06.3~ce~3-0~raspbian`で正常に利用できることを確認しました。加えて、docker-composeの導入にはpipを利用しています。
最終的な環境に持っていくためのスクリプトは下記になります。

```sh
# dockerのインストール
$ curl -sSL https://get.docker.com/ | sh  # install
$ sudo usermod -aG docker hoge  # dockerグループにhogeユーザを追加
$ sudo systemctl enable docker  # 自動起動設定
$ sudo apt list -a docker-ce  # バージョンの確認
$ sudo apt install docker-ce=18.06.3~ce~3-0~raspbian # 2019/6/9時点で動作するバージョン

# docker-composeのインストール
$ sudo apt install -y libffi-dev
$ pip3 install docker-compose
```

## 環境

* Raspberry Pi Zero W
    * `cat /etc/issue`: Raspbian GNU/Linux 9

## dockerのインストール

まずは現状の最新バージョンを含め、dockerをインストールします。ただ、docker daemonを起動できなかったため、インストール完了後にバージョンを下げて再インストールします。

```sh
# dockerのインストール
$ curl -sSL https://get.docker.com/ | sh  # install
$ sudo usermod -aG docker hoge  # dockerグループにhogeユーザを追加
$ sudo systemctl enable docker  # 自動起動設定
```

この状態でログインしなおしたり、リブートしてdockerの状態を確認すると、docker daemonの起動に失敗していました。インストールされているバージョンなどを確認すると下記のような状態となっていました。

```sh
$ sudo apt list -a docker-ce

docker-ce/stretch,now 18.09.0~3-0~raspbian-stretch armhf
docker-ce/stretch 18.06.3~ce~3-0~raspbian armhf
docker-ce/stretch 18.06.2~ce~3-0~raspbian armhf
docker-ce/stretch 18.06.1~ce~3-0~raspbian armhf
# 以下省略
```

幾つかの情報を調べたところ、ダウングレードすると起動すると治る場合があるとのことで、今回は、一つしたのバージョンを利用しています。

```sh
$ sudo apt list -a docker-ce  # バージョンの確認
$ sudo apt install docker-ce=18.06.3~ce~3-0~raspbian # 2019/6/9時点で動作するバージョン
```

これで再起動すると正常に利用できることを確認しました。

## docker-composeのインストール

公式からdocker-compose.ymlをダウンロードしてきて動作するのかわからなかったため、pipを利用して導入しました。途中でパッケージ不足を指摘されたため、いくつかのパッケージを追加しています。

```sh
$ sudo apt install -y libffi-dev
$ pip3 install docker-compose
```

上記コマンドが正常に終了するとdocker-composeコマンドが利用可能になります。

## 参考資料

* [Raspberry Pi で TensorFlow する Docker 環境構築][kohbis]
* [Raspberry pi zeroにDockerをインストールする][kmatae]

[kohbis]: https://qiita.com/kohbis/items/53c27ce6c62a7039aaa2
[kmatae]: https://qiita.com/kmatae/items/310213f8068ff28038d4
Android の Camera2 API と　Mobile Vision API を使って 文字列を検出する

[Android の Mobile Vision API を使って バーコードを検出する](https://qiita.com/ohwada/items/7caf29e1acc28b96042b)
の続きです。

### 概要

前回の記事では、カメラからの連続画像からバーコードを検出した。
今回の記事では、カメラからの連続画像から文字列 (Text) を検出する。

下記の公式サンプルコードでは、カメラの制御に 旧来の Cameara　API を使っている。

[googlesamples : ocr-reader](https://github.com/googlesamples/android-vision/tree/master/visionSamples/ocr-reader)

[Cameara API](https://developer.android.com/reference/android/hardware/Camera)

この記事では、Camera2 API を使って 同様の機能を持つ アプリを作成する。

前回の記事で作成したバーコード検出のアプリをベースにする。

余談 : 文字列検出 (Text Detection) のこともを OCR (光学的文字認識 Optical Character Recognition) とも言う。
(Text と Character, Detection とRecognition, 同じ意味合いだが、微妙な違いがある。

### Mobile Vision API の設定

AndroidManifest.xml を変更する

``` AndroidManifest.xml

    <!-- バーコード検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="face" />

    <!-- 文字列検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="ocr" />
```

### 文字列を検出する

顔検出やバーコード検出のときと同様の処理を行う。

### TextRecognizer

TextRecognizer を生成する

```
  OcrDetectorProcessor processor

        TextRecognizer textRecognizer = new TextRecognizer.Builder(this).build();

        textRecognizer.setProcessor( processor );
```

[reference : TextRecognizer](https://developers.google.com/android/reference/com/google/android/gms/vision/text/TextRecognizer)

余談 : 検出器 (Detector) の名称は、
顔検出 と バーコード検出のときは、 FaceDetector とBarcodeDetector ですが、文字列検出は TextRecognizer です。

### FrameProcessor

カメラからの連続画像を受け取り TextRecognizer に渡すためのFrameProcessor クラスを作成する。

このクラスは、バーコード検出のものをそのまま流用する。

余談 : 検出の結果を受け取るための クラス は、
顔検出やバーコード検出のときは、Tracker を継承していて、
名称も Tracker です。
文字列検出だけ、やり方が違う理由は、わからない。

[reference : Detector.Processor](https://developers.google.com/android/reference/com/google/android/gms/vision/Detector.Processor)


### 検出した文字列の上に長方形を表示する

顔検出やバーコード検出のときと同様の処理を行う。

ViewGroup を継承した CameraSourcePreview を作成する。
CameraSourcePreview の子のビューとして、カメラのプレビュー画面を表示する TextureView と長方形を表示するオーバーレイ用の View を作成する。

### 複数の文字列から１つを選ぶ

画面をタッチして選択する。

タッチした画面の位置と文字列の長方形の位置から、近くにあるものを選択する。

余談 : バーコード検出と、コードが微妙に違うが、気にしないことに。


### スクリーンショット
![vision4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/d46719c0-4f11-1fb2-bbe7-6376876706ef.png)

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Vision4
pythonをストレスなく使う！（結局docs.python.orgのreferenceが納得感が高い気が、、、)

#目的
　**pythonをストレスなく使う！**
そのためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。
ここで記載しているのは、
**結局docs.python.orgのreferenceが納得感が高い気が、、、**です。

リファレンスは、以下のサイトです。
https://docs.python.org/ja/3/reference/
https://docs.python.org/3/reference/

#docs.python.orgのreferenceが一番わかりやすい例

##内包表記
たとえば、リスト内包表記で以下のような書き方をする。

(下記1行　引用：「入門 Python3」オライリー・ジャパン）

```
a_list = [number for number in range(1,6) if number % 2 == 1]
```
この形式は、以下の説明が、網羅されていて良い。
（後から、こんな書き方もできると言われると、多少、混乱するため。）
ここでは、comprehensionの構成と、それが入るlistの構成が示されている。

（出典： https://docs.python.org/ja/3/reference/expressions.html ）

<img width="626" alt="naiho.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/1a9ee645-9d80-b0c1-bf99-c17ff483c39e.png">


（出典： https://docs.python.org/ja/3/reference/expressions.html ）

<img width="634" alt="list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/b1c0b956-4d6e-06ac-99cb-8f1200132bb1.png">

## (式の説明における)「プライマリ(primary)」
「6. 式 (expression)」　に以下の説明がある。
以下の説明で、***aaa.bbb*** のようなドットでつなぐ書き方の説明としては、
非常にわかりやすい気がする。説明が網羅されている感じが、***いい***。


（出典： https://docs.python.org/ja/3/reference/expressions.html ）

<img width="627" alt="primary.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/da1d1e5d-a8d2-1148-c71e-e4e840612a65.png">


（出典： https://docs.python.org/ja/3/reference/expressions.html ）

<img width="619" alt="atom.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/71e63b8e-2167-672a-a4b9-a6a1af899887.png">

##import
***importの説明も、docs.python.orgのreferenceが一番わかりやすかった。***
[python入門[import]　「from relative_module import identifier」 とか](https://qiita.com/enoughspacefor/items/051b219ff403ef9a4ed5)

##シーケンス
***シーケンスを理解するのにも、docs.python.orgのreferenceの説明が役立った。***
[PythonのData model(データモデル)のThe standard type hierarchy(標準型の階層)](https://qiita.com/enoughspacefor/items/fb38c539ec4d9366a789)

#docs.python.orgのreferenceのちょっとと思う部分
項目の階層が、、、少し、クセがあるかも。同じ階層で、、、細かい、話に移行する場合あり。

#まとめ
docs.python.orgのreferenceは、良いと思うので、
馴染もうと思います。


#関連（本人）

[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
【Python】指定ディレクトリのファイル/フォルダサイズを一覧表示

PCやネットワークドライブのストレージがいっぱいになって来た時、どこにどれくらい容量を使っているのか、パッと調べたいことがありました。その時作ったのがこちらです。

```Python:scan_dir_size.py
import os
import sys


def get_dir_size(path='.'):
    if not os.path.exists(path):
        print('存在しないPath: %s' % path)
        return 0

    total = 0
    try:
        with os.scandir(path) as it:
            for entry in it:
                if entry.is_file():
                    total += entry.stat().st_size
                elif entry.is_dir():
                    total += get_dir_size(entry.path)
    except FileNotFoundError as e:
        print(e)
    finally:
        return total


def scan_dir_size(dirPath):
    if not os.path.exists(dirPath):
        print('ディレクトリが存在しません')
        return

    filesAndDirs = os.listdir(dirPath)
    subDirs = [os.path.join(dirPath, f) for f in filesAndDirs
               if os.path.isdir(os.path.join(dirPath, f))]
    files = [os.path.join(dirPath, f) for f in filesAndDirs
             if os.path.isfile(os.path.join(dirPath, f))]

    sumSize = 0
    for f in files:
        sizeGb = os.path.getsize(f) / 1000 / 1000 / 1000
        print("filePath: %s, size: %.2f Gbyte" % (f, sizeGb))
        sumSize += sizeGb
    for folder in subDirs:
        sizeGb = get_dir_size(folder) / 1000 / 1000 / 1000
        print("dirPath: %s, size: %.2f Gbyte" % (folder, sizeGb))
        sumSize += sizeGb
    print("合計: %.2f Gbyte" % sumSize)


if __name__ == '__main__':
    argvs = sys.argv
    if len(argvs) == 2:
        scan_dir_size(argvs[1])
    else:
        print('引数にディレクトリのパスを設定してください。')

```

使い方は、

`$ python scan_dir_size.py {サイズを調べたいディレクトリのパス}`

引数にCドライブのパスを指定した場合、実行結果はこんな感じになります。

>filePath: C:\hiberfil.sys, size: 3.37 Gbyte
filePath: C:\pagefile.sys, size: 9.13 Gbyte
filePath: C:\swapfile.sys, size: 0.02 Gbyte
dirPath: C:\$RECYCLE.BIN, size: 9.49 Gbyte
dirPath: C:\Apache-Subversion-1.10.2, size: 0.01 Gbyte
dirPath: C:\Config.Msi, size: 0.00 Gbyte
dirPath: C:\cygwin64, size: 12.89 Gbyte
dirPath: C:\Documents and Settings, size: 0.00 Gbyte
dirPath: C:\LOG, size: 0.00 Gbyte
dirPath: C:\Fujitsu, size: 12.04 Gbyte
dirPath: C:\Intel, size: 0.00 Gbyte
dirPath: C:\MSOCache, size: 0.00 Gbyte
dirPath: C:\grin, size: 94.26 Gbyte
dirPath: C:\PerfLogs, size: 0.00 Gbyte
dirPath: C:\Program Files, size: 19.47 Gbyte
dirPath: C:\Program Files (x86), size: 8.84 Gbyte
dirPath: C:\ProgramData, size: 3.41 Gbyte
dirPath: C:\Qt, size: 49.30 Gbyte
dirPath: C:\Recovery, size: 0.00 Gbyte
dirPath: C:\Renesas, size: 0.00 Gbyte
dirPath: C:\System Volume Information, size: 0.00 Gbyte
dirPath: C:\Users, size: 62.22 Gbyte
dirPath: C:\Windows, size: 24.17 Gbyte
dirPath: C:\WorkSpace, size: 0.00 Gbyte
合計: 308.61 Gbyte

これで少なくとも一個一個プロパティを開く必要はなくなりましたな、、、
unityのAVPROで色444を再生できるようにする

#はじめにと問題だった状況
unityのAVProで色444の動画再生するために設定変更が必要だったのでメモ

元素材となる動画はffmpegで
```ffmpeg -r 60 -i 8K/%04d.png -vcodec libx265 -pix_fmt yuv444p -r 60 8K-60fps-60sec-h265-444.mp4```
といった感じで作成した`8K-60fps-60sec-h265-444.mp4`を利用。

unityのAVPROでは`07_Demo_Mapping3D.unity`をテストとして利用。

この状態で上述で作成した`8K-60fps-60sec-h265-444.mp4`を指定しても真っ白になるだけで再生できなかった。
同様に作成した色420の動画は再生できていた。

# 対応策
## decoderのinstall
[LAV filters](https://www.gigafree.net/media/codecpackage/lavfilters.html)をインストールする。
これをいれないと色444のmp4が再生できない。

## unityの設定

[AVPro Videoで映像の再生ができなくなった時の調査したことまとめ](http://portaltan.hatenablog.com/entry/2016/11/02/170302)
を参考にさせていただき、
下図右下のように、
`Platform Specific`で`Windows`を指定し、`Preferred Video API`を`Direct Show`にする
<img width="1920" alt="スクリーンショット 2019-06-09 10.39.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102253/710485b7-2aec-9b4b-9eef-e6fde9ecd967.png">

以上を行うと色444のmp4が再生できるようになった。
ISUCON でミドルウェアの設定ファイルを Git 管理したときのメモ

## 目的

`/etc` 以下にある設定ファイルを Git 管理下の所定のディレクトリに移動し、もとの設定ファイルはそこへのシンボリックリンクとしたい。

操作ミスによってファイルが消えないよう、安全にやりたい。

## 操作手順

以下の例は `/etc/my.cnf` を `/home/isucon/etc` 下に置いて管理したい、という想定。

まずは対象のファイルを Git 管理下のディレクトリコピーします。

```bash
cp /etc/my.cnf /home/isucon/etc/my.cnf
```

失敗しても復帰できるよう、先にコミットしておきます。

```bash
cd /home/isucon/etc
git add my.cnf
git commit -m "add my.cnf"
```

最後にシンボリックリンクを作成します。

`/etc` 下への書き込み操作なので `sudo` をつけます。

```
sudo ln -sb /home/isucon/etc/my.cnf /etc/my.cnf
```

## 補足説明

`-b` オプションは、作成するシンボリックリンクと同名のファイルが存在している場合に、その既存ファイルのバックアップを作成してからシンボリックリンクを作成する、というものです。

以下のようにファイル名末尾に `~` がついたファイルが作成されていることが確認できます。

```
$ ls -l /etc | grep my.cnf
lrwxrwxrwx 1 root root      23 Jun  8 15:39 my.cnf -> /home/isucon/etc/my.cnf
-rw-r--r-- 1 root root     194 Apr 21 13:25 my.cnf~
```

「末尾に `~` がついていても設定ファイルとして認識されていた」という事故を防ぐため、正しくシンボリックリンクを作成できたことを確認したらこのバックアップは削除したほうがよいでしょう。
(IntelliJ + gradle)Spring BootでHello Worldする

# はじめに
IntelliJでSpringBootの開発がしたい。
現在関わっている開発プロジェクトがこの組み合わせなので仕組みを勉強するために構築。
そのうちmysqlと連携するRESTAPIを作ってみたい。

- 環境情報
    - Windows10
    - IntelliJ IDEA Community Edition 2019.1.1
    - Spring Boot 2.1.5

# プロジェクト作成
以下リンク先のSpring Initializrでプロジェクトの雛形を作成します。
https://start.spring.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/e9fa8e07-aa15-a52c-ec22-4059a98aecaa.png)

- Project: [Gradle Project]を選択
- Language: そのまま
- Spring Boot: そのまま
- Project Metadata: そのまま
- Dependencies: [Spring Web Starter]を追加 

### 設定後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/0914ded0-26f2-3b89-5965-aa6be7fba023.png)

設定が完了したら、画面下部の「Generate the project」ボタンを押下してください。
プロジェクトのzipがダウンロードされるので解凍してください。

# プロジェクトのインポート
1. エクスプローラにて解凍したフォルダより「build.gradle」を選択し、右クリック。
プログラムから開く→IntelliJを選択
2. IntelliJのダイアログが表示されるので何も変更せずOKをクリック。（もしかしたらjdkの選択は必要かもしれない）
<img width="790" alt="paste.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/aeb6d969-8a29-fdca-a32d-93bfcb7c2307.png">
3. ビルドが終わるまで待つ。
4. 終わったら以下のような構成になっているはず。
<img width="1082" alt="paste2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/8b245974-25e2-f086-df90-14833ffa5972.png">


# Hello World を表示させるため、編集する
5. DemoApplication.javaを以下のように編集する。

```java:DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

	@RequestMapping("/")
	String index(){
		return "Hello World!";
	}

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}
```

# 起動する
Gradleウィンドウより、Tasks → application → bootRun を実行。

実行後コンソール
<img width="803" alt="paste3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/00b4f371-8bae-4523-9259-4086294625c7.png">

# ブラウザで確認
`http://localhost:8080/`に接続。
Hello Worldが出力されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/caa8056d-34a3-8b04-6228-c27198094737.png)
今日お茶行きたい！ボタンをランチ募集サービスteapotで作った話

# 背景

https://www.tea-pot.net/

teapotというランチやお茶を気軽に募集できるサービスを運営しています。ここで今日お茶行けるよ！を表明できるボタンを作りたいなと思ってその際の仕様の決定する背景や開発内容をまとめました。

# やりたいこと

* 11:00までにお茶行きたいボタンをマイページから押す
* その日の15:00までhomeで表示

# 仕様概要

## table設計-なぜpostにカラム追加しなかったか-

postに特定のカラム追加してそこに日時をupdateしていくが最初に思いついた構成だったが一応その人が過去にどれくらい今日お茶行きたいボタンを押したかなどを残しておきたいなと思い、専用のtableを用意してそこにpost_idを送るようにした。

## 全体設計

![teapot-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/155696a6-2fa5-83af-2d22-4e3b28e9a67b.jpeg)

* todaytable（今日お茶行きたい人の投稿のリスト）のcreated_atが今日の人を参照
* 時間制限は共通の変数を作成し、その時間じゃなければボタンや一覧の表示をしないで制御。正確にはURLたたけたりするけどまあ今回はそこまで制御しない

```
<% if Time.now.strftime("%H").to_i >= @today_start && Time.now.strftime("%H").to_i <= @today_end && @subposts.present? %>
```

こんな感じで@today_startなど共通の変数作ってapplication_controller.rbに記述して共通化する。

## timezoneの変更

https://qiita.com/ikemura23/items/52ab8a5d260c7ee4d42b

timezoneを上記の方法で日本時間に変更した

# 詰まったところ

## timezone周り

```application.rb
module Teapot
  class Application < Rails::Application
    config.load_defaults 5.1
    config.time_zone = "Tokyo"
    config.active_record.default_timezone = :local
  end
end
```

timezoneの書く場所

# 使ってみてね！

https://www.tea-pot.net

今回の機能はさくっと今日誰かとランチしたいなというのをつなぎたいというのももちろんありますが、teapotの思想であるなんの繋がりもなかったtwitterでちょっと気になる人を繋ぐにあたって今日という時間軸で繋ぐというのを目的にしています。

teapotがあったから友だちになりましたって人が少しでも増えると嬉しいです。
関数

##いろいろな関数の書き方
```go
func add(x int, y int) {
	fmt.Println("add function")
	fmt.Println(x + y)
}

func main() {
	add(10, 20)
}
```

```go
func add(x int, y int) int { //(x, y int)に省略可
	return x + y
}

func main() {
	r := add(100, 200)
	fmt.Println(r)
}
```

```go
func add(x, y int) (int, int) {
	return x + y, x - y
}

func main() {
	r1, r2 := add(100, 200)
	fmt.Println(r1, r2)
}
```

```go
func cal(price, item int) (result int) {
	result = price * item //返り値のところでresultを宣言しているので:=は使えない。再定義できない。
	return                //この関数はresultを返すというのが分かっているのでresultを省略可
}
func main() {
	r3 := cal(300, 500)
	fmt.Println(r3)
}
// func convert(price int) float64{
// 	return float64(price)
// }
// このように、どういう処理をしているか明らかな場合には変数を宣言する必要はない。
```

```go
func main() {
	f := func(x int) {
		fmt.Println("hoge func", x) //hoge func 1
	}
	f(1)

	func(x int) {
		fmt.Println("hoge func", x)
	}(1)
	//同じ結果
}
```

>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
Google カレンダーの予定をトリガーにトーク BOT で LINE WORKS に通知

本記事では、Google Calendar に登録した予定の開始時間にトーク BOT で LINE WORKS に通知する手順を紹介します。

#Azure Automation の準備

Azure Automation の Runbook の準備は、こちらの記事を参照してください。

TITLE: LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信
URL: https://qiita.com/iwaohig/items/3056b95597772061d17b

IFTTT では、Runbook を直接呼びだすことはできませんが、Azure Automation で Webhook が設定できるので、IFTTT の Webhooks の機能を利用します。

TITLE: webhook を使用した Azure Automation の Runbook の開始
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-webhooks

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/f941f876-44b6-4cec-5907-63db362f74a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/c9ff1848-a2ce-3b54-ef64-840ad64fa2e4.png)

#IFTTT の準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/9d1ea6c5-796c-1b51-3066-543c779bcb5b.png)

IFTTT のアプレット作成時に "this" のトリガーに "Google Calendar" を指定します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/565d23e5-f098-29cf-41e5-83eacbf70205.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/432684bb-46d2-c0be-3bce-d06d4b3fc145.png)


IFTTT のアプレット作成時に "that" のアクションを指定する部分で Webhooks を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/641311cd-6f29-7c6b-0f3e-778de28b2a0a.png)


Webhokks の URL に Azure Automation の Runbook で生成した Webhook の URL を記述し、Method は POST を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/fa8abc5f-3355-d228-3717-fdc783c18ad6.png)

#動作確認

Google カレンダーの予定開始時に、LINE WORKS の Bot からトークメッセージが送られることを確認します。