OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby oci8 で k:v形式のArrayでレコード取得

# Ruby oci8 で oracle接続して各行のデータをk:v形式のArrayで取り出す話

```ruby
#!/home/user/local/bin/ruby

require 'oci8'
oracle = OCI8.new('id','pw','service')
oracle.prefetch_rows = 100

result = []
sql = "select * from table_name"

oracle.exec(sql).fetch_hash(){|r| result << r.map{|colname,coldata| "#{colname} : #{coldata}"} }
```

`fetch_hash()`っていうふうに`()`を付けないとだめなのね。
レコードを普通にArrayで取り出したいときは`fetch()`。
oci8は癖があるな。mysql2のほうが扱いやすい。
ConoHaサーバーにSSHする際にちょっとハマったので備忘録

## 0. はじめに

ConoHaサーバーにTera TermでSSHしようとしたらちょっとハマったので、手順を備忘録として残しておきたいと思います。
（ConoHaサーバー使っている人、どれくらいいるんだろう🤔）

## 1. ConoHaコントロールパネルでやること

### 1-1. SSHキーを発行する

1. ConoHaコントロールパネルにて、「サーバー管理」を選択します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/b03cb3d9-ba86-b03d-e569-51ff8756f1b7.png)

2. 「SSH」を選択します。
3. 「SSH Key」ボタンを押下します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/ae57c0d2-d422-4fef-8441-b7832c330ba8.png)

3. 「保存」ボタンを押下します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/d5e9fb5e-6d1f-2434-a0b2-96602661398a.png)

4. 「ダウンロード」ボタンを押下します。

**:writing_hand:ここでダウンロードしたキーをTera Termで使用することになります。**

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/b3726a12-039c-b3cc-048e-e18702ea398b.png)

### 1-2. 「ホスト名」「ポート番号」「ユーザー名」を確認する

「ホスト名」「ポート番号」「ユーザー名」は以下に表示されています。

**:writing_hand:この3つをTera Termで使用することになります。**

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/1e2dbd42-ce17-71f2-cca4-32c25e2bca5f.png)

## 2. Tera Termでやること

### 2-1. SSHの設定を変更する

<font color="red">**最初にこの設定をやっておかないと、恐らくSSH接続できません。Tera Termを閉じたときに以下のエラーになるかと思います。**</font>
![err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/b06c3eba-42b9-8b8d-62e6-9cf44743fb12.png)

1. Tera Termを起動し、「設定」→「SSH」のダイアログを開きます。
2. 優先する鍵交換アルゴリズムの順を「ecdh-sha2-nistp521」→「ecdh-sha2-nistp384」→「ecdh-sha2-nistp256」に変更します。
3. 「OK」ボタンを押下します。
 
![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/e7929f7d-fbea-daee-79de-f51d1a769b77.png)

**必須ではありませんが、「設定」→「設定の保存」で、設定情報の保存をしておくとよいかと思います。**

### 2-2. ConoHaサーバーにSSH接続

1. Tera Termの新しい接続先ダイアログにて、「ホスト名」「TCPポート」を入力します。
2. 「OK」ボタンを押下します。
 ![input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/56bfb6b8-bd7a-5306-e827-c458266a6638.png)

3. SSH認証ダイアログにて、「ユーザ名」を入力します。
4. 「秘密鍵」ボタンを押下し、ConoHaコントロールパネルからダウンロードして秘密鍵（pemファイル）を選択します。
5. 「OK」ボタンを押下します。
![input2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/44632755-982b-48f0-540e-a56f358a8cf4.png)


以上で、ConoHaサーバーへSSH接続できるかと思います。
WindowsのPowerShellで環境変数の確認

# 背景
Windowsの環境変数をPowerShellのターミナルから確認したいと思い、
古い記憶から以下のように試してみたところあれ？となってしまったときに調べたときの備忘録です。
これはコマンドプロンプトでの確認方法でした。

```powershell
> echo %PUBLIC%
%PUBLIC%
```

# 指定した環境変数の確認
```powershell
> echo $env:[環境変数名]
```

## 例
```
> echo $env:PUBLIC
C:\Users\Public
```

環境変数は小文字でも大丈夫そうです。

```powershell
> echo $env:public
C:\Users\Public
```

# 環境変数一覧の表示
一覧の表示は以下のように`Get-ChildItem`を使うことで表示できます。
[Get-ChildItemについて(Microsoft)](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_filesystem_provider?view=powershell-7.1#getting-files-and-directories)

```powershell
> Get-ChildItem env:
```
FeliCaの読み取りに対応しているiPhone一覧

## 注意

私が非公式にまとめたので、正式な情報はAppleによる一次ソースをご確認ください。

## FeliCaの読み取りに対応しているiPhone一覧

Core NFC自体はiOS 11.0から使えますが、FeliCaの読み取りに対応したのはiOS 13.0からです。

そのため「iOS 13.0以上をサポートしている、かつNFCが搭載されているiPhone一覧」とほぼ同義です。
（「ほぼ」と言っている理由は追記をご参照ください）

```
iPhone 12 mini
iPhone 12
iPhone 12 Pro
iPhone 12 Pro Max
iPhone 11
iPhone 11 Pro
iPhone 11 Pro Max
iPhone XR
iPhone XS
iPhone XS Max
iPhone X
iPhone SE（第2世代）
iPhone 8
iPhone 8 Plus
iPhone 7
iPhone 7 Plus
```

## 追記： NFC-A/Bのみ搭載されている端末もある

[@treastrain](https://twitter.com/treastrain) さんからTwitterで以下を教えていただきました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">NFC は iPhone 6s から搭載されるようになりました。しかし、6s では NFC-A/B のみで FeliCa は使えません。<br><br>iPhone SE (1st) でも NFC-A/B のみ搭載されています。<br><br>FeliCa まで対応したのは iPhone 7 以降です。また、7 以降から Core NFC によるサードパーティー利用が可能となりました。</p>&mdash; treastrain / Tanaka.R (@treastrain) <a href="https://twitter.com/treastrain/status/1329638383702851586?ref_src=twsrc%5Etfw">November 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Apple 公式の1次ソースとして使えるのはこのページかと思います。<br><br>「nfc」にチェックが入っている端末で Core NFC によるサードパーティー利用ができます。<br><br>iPhone 6s 系、iPhone SE (1st) は Apple Pay 限定のためチェックがありません。<br><br>必要なデバイス機能 - サポート <a href="https://t.co/D4NWrf5SMR">https://t.co/D4NWrf5SMR</a></p>&mdash; treastrain / Tanaka.R (@treastrain) <a href="https://twitter.com/treastrain/status/1329638804571910145?ref_src=twsrc%5Etfw">November 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以下のiPhoneはNFC-A/Bのみ搭載されており、かつApple Payの利用に限定されているため、サードパーティーによる読み取りを行うことはできません。

```
iPhone 6s
iPhone 6s Plus
iPhone SE（第1世代）
```

## 参考リンク

- [サポートされるiPhoneのモデル - Apple サポート](https://support.apple.com/ja-jp/guide/iphone/iphe3fa5df43/13.0/ios/13.0)
- [サポートされるiPhoneのモデル - Apple サポート](https://support.apple.com/ja-jp/guide/iphone/iphe3fa5df43/14.0/ios/14.0)
- [必要なデバイス機能 - サポート - Apple Developer](https://developer.apple.com/jp/support/required-device-capabilities/)
- [Core NFC | Apple Developer Documentation](https://developer.apple.com/documentation/corenfc)
- [NFCFeliCaTag | Apple Developer Documentation](https://developer.apple.com/documentation/corenfc/nfcfelicatag)
【pandas_flavor】Pandas DataFrameのメソッドを追加する

# TL;DR

```python:BEFORE
dataframe_ = dataframe.loc[(dataframe.time == 'pre') & \
                           (dataframe.group == 'exp') & \
                           (dataframe.cond == 'a'), :]
sns.regplot(x='mood', y='score', data=dataframe_)
```

↓↓↓

```python:AFTER
dataframe.by(time='pre', cond='exp', group='a').regplot(x='trait', y='score')
```

[pandas_flavor](https://github.com/Zsailer/pandas_flavor)を使うことで、好きなメソッドをpandas DataFrame（およびSeries）に追加することができます。


# モチベーション

**Long形式のデータから条件に合う箇所を抽出するのはめんどい！**

例えばこんなデータがあったとします。

![スクリーンショット 2020-11-20 10.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/fef0cb2b-9962-5630-6ba4-435037db8bc9.png)

被験者50人をふたつの群（group: exp, ctrl）に分け、それぞれになにやら介入を行ったという設定です。
介入の前後（time: pre, post）で課題を行わせ、課題中のふたつの条件（cond: a, b）における成績（score）を測定しました。
同時に、課題をやっているときの気分（mood）も、条件（cond: a, b）ごとに測定しました。[^1]

測定データは、上の画像のようにlong形式でまとめるとその後の解析がやりやすくなりますね。

さて、いろいろな解析をやる前にひとまず、
**preにおけるexp群の課題条件aのときのscoreとmoodとの相関関係をプロットする**ことにしましょう。

以上の条件に合う行を抽出してくるので、↓こんなコードになりますね。

```python
dataframe_ = dataframe.loc[(dataframe.time == 'pre') & \
                           (dataframe.group == 'exp') & \
                           (dataframe.cond == 'a'), :]
sns.regplot(x='mood', y='score', data=dataframe_)
```

条件を表したbool型のSeriesを作り、`.loc`に入れてやってます。
うーん、なんか汚い。

`.query()`メソッドを使えば、↓こんなふうにも書けます。

```python
dataframe_ = dataframe.query('time == "pre" & group == "exp" & cond == "a"')
sns.regplot(x='mood', y='score', data=dataframe_)
```

こっちのほうがだいぶスッキリしていますが、もうちょっといい感じにならんかなぁ。
`.query()`使う方法はboolのSeriesを使う方法に比べて遅いそうですし。
やっぱり、**Long形式のデータから条件に合う箇所を抽出するのはめんどい！**

# Pandas DataFrameのメソッドを追加する
**ならメソッドを作ればいいじゃない**

そこで、DataFrameから条件に合うような行を抽出してくるような**新しいメソッド**を作ってやりましょう。
↓こんなふうに使える`.by()`メソッドをDataFrameに新しく追加します。

```python
dataframe.by(time='pre', cond='exp', group='a')
```
[pandas_flavor](https://github.com/Zsailer/pandas_flavor)というパッケージを使うと、簡単にこれを達成することができます。


## インストール方法
pipか、

```
pip install pandas_flavor
```

condaで一発です。

```
conda install -c conda-forge pandas_flavor
```

## 使用例

```python
import pandas_flavor as pf


@pf.register_dataframe_method
def by(self, **args):
    for key in args.keys():
        self = self.loc[self.loc[:, key] == args[key], :]
    return self
```

関数を書いて、デコレータとして`@pf.register_dataframe_method`を付けてやるだけです。
こちらの例では、`**args`とやることで引数を辞書型で受け取ります。
これによって、各引数で指定した行を抽出しています。

さらに、seabornの各種関数をメソッド化させるのもいいですね。

```python
@pf.register_dataframe_method
def regplot(self, **args):
    return sns.regplot(data=self, **args)
```

![スクリーンショット 2020-11-20 13.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/15096c32-cf84-be83-d193-4f266fc4239d.png)

と、こんな感じです。
pandas.Seriesにメソッドを追加してやりたければ、`@pf.register_series_method`で同じことができるようです。

今回の例は…、まぁ`.query()`使えばいいような気もしますが、色々と応用ができそうです。

[^1]: 言うまでもありませんが、すべてでっち上げの心理学実験です。数値はrandomモジュールで生成しています。
swift 名前がわかりづらい機能たち

はじめまして。初めて記事を書いてみます。

実際に見たことはあるのに名前がわからない機能があると、検索もできなくて悲しいですよね。
今回はそのために、機能とその名前をまとめてみました。
探してるのあったらラッキー程度に思ってください。

#Tab-Bar
![tabbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/5d9da97d-6b57-c9d7-5ac3-6ee6496a125b.png)
lineとかtwitterとかの下にあるやつです。これがあると一気にアプリらしくなりますね。

<br>

#activeViewController
<img width="400" alt="mojikyo45_640-2.gif" src="https://user-images.githubusercontent.com/60727025/99424044-90df4b80-2944-11eb-8372-f063711004a9.png">
SNSへシェアするときなどに、したからニュッと出てくるやつです。


#UISwitch
![スクリーンショット 2021-05-03 14.32.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/bdd06469-27d6-ce25-d12a-d73c73659d8a.png)
よくあるやつです。僕は最初「iOS スイッチ」で検索していました。

# バッジ
![スクリーンショット 2021-05-22 16.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/95d654a6-8d4f-7d89-3fb5-bfc491e0b931.png)
通知とかに使うよくあるやつです。

# ハーフモーダル
ラクマとかでも使われている、モーダルが半分になったやつです。画面遷移を伴わないことが特徴です。
https://commerce-engineer.rakuten.careers/entry/tech/0024

# 随時更新予定です
OSのアップデート後にGitコマンドを打ったらエラーが出た！（自分用忘備録）




タイトル通りです。
macOS Catalinaにアップデートした後Gitコマンドしたらエラーが出た。


```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

## 解決
```
xcode-select --install
```



## 追記
昔書いてた下書きを見つけたので、放流しました。
このままだと記事が短いので、何かあれば都度更新したい
プライベートIPを持ったCloud SQLインスタンスのIPレンジを予め決める方法

Cloud SQLのインスタンスはデフォルトでパブリックIPも持った状態で立ち上がりますが、プライベートIPを割り当てるように設定することもできます。
しかし、ドキュメントのチュートリアルに従ってコマンドを実行したり、GUIからぽちぽちすると気づいたらプライベートIPがランダムに割り振られて起動していることもあります。
GCPのみを利用する場合はこれでも問題なることは少ないですが、オンプレやawsとの間でVPNで接続する場合にはCIDRの重複を起こす恐れがあります。
この記事では、インスタンスのCIDRを予め指定する方法を紹介します。

# プライベートIPを持たせる仕組み
こちらのドキュメントのネットワーク図にあるように、実はプライベートIPをもったインスタンスは自分たちのプロジェクトのVPC内には存在しません。
Googleによって管理されているVPC内にインスタンスが存在し、そのVPCとの間でVPC Peeringが設定されています。

https://cloud.google.com/sql/docs/mysql/private-ip

では、このGoogle管理のVPC内のサブネットのCIDRはどのようにして決まるのでしょうか？
それを理解するためにはPrivate services accessの仕組みを理解する必要があります。

https://cloud.google.com/vpc/docs/private-access-options#service-networking

Private service accessは本来ならパブリックIPのみを持つGCPのリソースに対してプライベートIPを割り当て、VPC内からプライベートIPで接続できるようにするサービスです。
Cloud SQLのプライベートIP機能はこの機能の上に成り立っています。
また、Cloud SQLの他にMemoryStoreなどのプライベートIP機能もこの仕組を使っています。

そして、このPrivate service accessはGoogle管理のVPCに対して割り当てるCIDRを予め決める機能があります。
それがallocated IP address ranges機能です。
https://cloud.google.com/vpc/docs/configure-private-services-access

この機能でGoogle側に割り当てたCIDRは予約されたCIDRとなり、それに被るようなサブネットを作成することが不可能になります。
以下のresource定義で `192.168.0.0/20` のCIDRを予約します。

```terraform
resource "google_compute_global_address" "private_ip_alloc_google_managed_service" {
  name          = "google-managed-services-<VPCの名前>"
  network       = google_compute_network.hoge_network.id
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"  
  address       = "192.168.0.0"
  prefix_length = 20
}
```

そして、予約したCIDRをGoogleに割り当てます。

```terraform
resource "google_service_networking_connection" "private_service_connection_google_managed_service" {
  network                 = google_compute_network.hoge_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_alloc_google_managed_service.name]
}
```

Googleはこの割当てられたCIDRの中からサブネットを切り出し、その中にインスタンスを配置していきます。
割り当てるCIDRの広さには十分に気を使う必要があります。
例えばCloud SQLを使用する際にはリージョン毎に `/24` のCIDRのサブネットを切り出すため、マルチリージョン構成を取る場合は広めに割り当てるのが良いです。

また、将来的に他のネットワークとの接続をしない場合でも、CIDRを予約してから割り当てたほうが無難です。
以下に書かれているように、Dockerがネットワークをブリッジするために `172.17.0.0/16` をCloud SQLのために使うことはできません。

> The IP range 172.17.0.0/16 is reserved for the Docker bridge network. Any Cloud SQL instances created with an IP in that range will be unreachable. Connections from any IP within that range to Cloud SQL instances using private IP will fail.

https://cloud.google.com/sql/docs/mysql/private-ip#network_requirements

一方で、Private service access機能によって自動的に作られるサブネットはランダムであるため、運悪くこのCIDRになる可能性もあります。
予めCIDRを予約し、それをGoogle側に割り当てることでこの悲劇を防ぐことができます。
VisualStudio 16.8.xでC# Interactiveが文字化けする問題の解決策

# 注意

Windows10 Pro version 20H2
VisualStudio2019、version 16.9.0
で、下記の問題が解決されていることを確認した。

@ambleside138 さん、情報ありがとうございます。

# 問題

Windows10 Pro version.1909
VisualStudio2019、version.16.8.x
の環境下で、C# Interactiveが文字化けするようになった。
この文字が多数表示される→�


# 解決策

https://developercommunity2.visualstudio.com/t/C-Interactive-encoding-for-Russian-lang/1223701

1. コントロールパネルを開き、
2. 「時計と地域」→「地域」→「管理タブ」
3. 「システムロケールの変更」ボタン→「ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用(U)」にチェックを入れる
4. 再起動が求められるので、再起動する
Dockerでgccエラーが出た時の対処方法

## 概要
`google-cloud-bigquery`の最新バージョンをpython*alpineの最新版に入れようとしたら下記のようなエラーが出てインストールに失敗しました最終的に`修正後のDockerfile`のようにしたところ無事インストールできました。

## 修正前のDockerfile

```sh:Dockerfile
FROM python:3.9.0-alpine3.12

RUN apk --update add \
    curl \
    bash

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin

RUN mkdir -p /src

FROM python:3.9.0-alpine3.12

RUN apk --update add \
    curl \
    gcc \
    musl-dev \
    linux-headers \
    build-base \
    libffi-dev \
    bash

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin
```

* エラー1

```
error: command 'gcc' failed: No such file or directory
```

* エラー2

```
fatal error: limits.h: No such file or directory
```

* エラー3

```
fatal error: ffi.h: No such file or directory
```



```requirements.txt
google-cloud-bigquery==2.4.0
```


## 修正後のDockerfile

```sh:Dockerfile
FROM python:3.9.0-alpine3.12

RUN apk --update add \
    curl \
    gcc \
    musl-dev \
    linux-headers \
    build-base \
    libffi-dev \
    bash

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin

RUN mkdir -p /src

FROM python:3.9.0-alpine3.12

RUN apk --update add \
    curl \
    gcc \
    musl-dev \
    linux-headers \
    build-base \
    libffi-dev \
    bash

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin


```
Rでインド料理ビュッフェ過程 実装

# <font color="DarkSlateBlue">記事の目的</font>
Rを使用して、インド料理ビュッフェ過程を実装します。
参考: [ノンパラメトリックベイズ 点過程と統計的機械学習の数理](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153)


# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td><font color="DarkslateBlue">No.<td><font color="DarkslateBlue">目次
<tr><td><font color="DarkslateBlue">1<td><a href="#1-インド料理ビュッフェ過程の数式">インド料理ビュッフェ過程の数式</a>
<tr><td><font color="DarkslateBlue">2<td><a href="#2-実装">実装</a>
<tr><td><font color="DarkslateBlue">3<td><a href="#3-可視化">可視化</a>
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">インド料理ビュッフェ過程の数式</font>
![IMG_0204.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/1c5be028-d121-a1a1-7542-64fd8ae04faf.jpeg)


# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">実装</font>
```R:
n <- 30
alpha <- 5
set.seed(100)
for(i in 1:n){
  #ｍの計算
  if(i==1){
    m <- rep(1, rpois(1,alpha/1))
  }else{
    m <- apply(m.data, 2, sum)
  }
  #次の行のデータ作成
  z <- rbinom(length(m/(i+1)), 1, m/(i+1)) 
  m.next <- append(z, rep(1, rpois(1,alpha/(i+1))))
  #i行目までのデータを整理して、データ結合
  if(i==1){
    m.new <- append(m, rep(0, length(m.next)-length(m)))
    m.data <- rbind(m.new, m.next)
  }else{
    m.new.data <- t(apply(m.data, 1, function(x) 
      append(x, rep(0, length(m.next)-length(m)))))
    m.data <- rbind(m.new.data, m.next)
  }
}
```


# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">可視化</font>

```R:
library(ggplot2)
library(reshape2)
m.data <- data.frame(m.data)
m.data$row <- as.factor(paste0("Y", 1:nrow(m.data)))
m.data <- transform(m.data, row= factor(row, levels = paste0("Y", nrow(m.data):1)))
data <- melt(m.data)
ggplot(data, aes(variable, row)) +
  geom_tile(aes(fill=value))+
  labs(x="x",y="y",title="バイナリ行列")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/7ee2fe4a-c8e6-2658-ad7f-19c036f15b77.png)

◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
Rで中華料理店過程 実装

# <font color="DarkSlateBlue">記事の目的</font>
Rを使用して、中華料理店過程を実装します。
参考: [ノンパラメトリックベイズ 点過程と統計的機械学習の数理](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153)


# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td><font color="DarkslateBlue">No.<td><font color="DarkslateBlue">目次
<tr><td><font color="DarkslateBlue">1<td><a href="#1-中華料理店過程の数式">中華料理店過程の数式</a>
<tr><td><font color="DarkslateBlue">2<td><a href="#2-実装">実装</a>
<tr><td><font color="DarkslateBlue">3<td><a href="#3-alphaの推定を含む実装">alphaの推定を含む実装</a>
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">中華料理店過程の数式</font>
![IMG_0203.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/793b22e0-086d-da83-1109-3e7a3cd6b28a.jpeg)


# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">実装</font>
```R:
n <- 30
alpha <- 1
z <- 1
set.seed(100)
for(i in 1:n){
  n.k <- tapply(z,z,length)
  prob <- append(n.k/(i-1+alpha), alpha/(i-1+alpha))
  z.tmp <- which.max(rmultinom(1, 1, prob))
  z <- append(z, z.tmp)
}
#可視化
library(ggplot2)
ggplot(NULL, aes(x=z)) + geom_bar()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/fc18782e-1d5b-824b-7f67-11b12e16ee9c.png)


# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">alphaの推定を含む実装</font>
alphaの推定値は1.012666でした。

```R:
n <- 30
alpha <- 1
z <- 1
c1 <- 10
c2 <- 10
set.seed(100)
for(i in 1:n){
  n.k <- tapply(z,z,length)
  prob <- append(n.k/(i-1+alpha), alpha/(i-1+alpha))
  z.tmp <- which.max(rmultinom(1, 1, prob))
  z <- append(z, z.tmp)
  #alphaの推定
  #piのサンプリング
  pi <- rbeta(1, alpha+1, n)
  #sのサンプリング
  s <- rbinom(1, 1, (n/alpha)/(1+n/alpha))
  #alphaのサンプリング
  alpha <- rgamma(1, c1+length(n.k)-s, c2-log(pi))
}
#可視化
library(ggplot2)
ggplot(NULL, aes(x=z)) + geom_bar()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/7e32b460-6588-e22e-5f1b-c20e242086bd.png)

◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
MySQLで"Can't connect to local MySQL server through..."って出た時の対処法

<h1>"Can't connect to local MySQL server through..."って出た時の対処法</h1>

<h4>環境</h4>
<ul>
<li>MacOS : Catalina - 10.15.7</li>
<li>MySQL : 8.0.22 for osx10.15</li>
</ul>

<h4>起きたこと</h4>
<h6>１、Djangoのサーバが動かない</h6><br>
とある用事でMacBookを再起動させたあとにDjango触ろうとした時のお話。

<code>xxx@yyy $ python manage.py runserver</code>

を叩いてローカルにサーバを立てようとしたら、

<code>django.db.utils.OperationalError: (1130, "Host '10.0.2.2' is not allowed to connect to this MySQL server")</code>

って出てきた。書いてある通り、MySQL関係のエラーっぽい。
<br>
<h6>２、MySQLに入れない</h6><br>
MySQLを確認したいので下記コマンドを打つが、

<code>xxx@yyy $ mysql -u root -p
</code>
って入力したら、

<code>ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)</code>

とエラーを吐かれてMySQLが使えなかった。

<h4>原因</h4>
結果として、原因は再起動と同時にMySQLのサーバが止まってしまっていたこと。

そこで、

<code>xxx@yyy $ mysql.server restart</code>

を叩くことで解決した。

<code>xxx@yyy $ mysql -u root -p<br>
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> </code>

いけた。

比較的簡単に解決してよかった。
isaraの模写で余白の原因を探していたら意外な理由だった話

## ■ はじめに

タイトルについて記事にしました。
今回は（も？）あまり技術についてのお話ではありません。笑い話という事で目を通して頂ければと思います

#### 結論 ： 元画像の上下に小さな白い余白がありました

![スクリーンショット 2020-11-20 11.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/cfbfa2fe-ad97-facd-6947-ce9cc0eabc7c.png)

・気づかなかった原因：
見本は`background-position:center`や`background-size:cover`を使っていたが
railsのimage_tagを使っていて「いや、画像なんて出てればいいでしょ」という自己中な考えで使わなかった

小1時間調べた結果、謎の余白ができる原因という記事が色々あったので
今回勉強できたいい機会だったという事で、学習した内容を載せておきます

:sunny: 参考→[[CSS]ページのレイアウトで、意図せずできてしまった隙間の原因とその解決方法のまとめ](https://coliss.com/articles/build-websites/operation/css/6-cases-of-unwanted-spaces-in-page-layout-by-demosthenes.html)

## まとめ
・ リセットCSSの活用及び、`box-sizing: border-box;`プロパティを`*{}`全ての要素に適用する

・ 画像をブロック要素にするか、`vertical-align: bottom`で縦方向の揃え位置を下端に指定する

・ 元画像を検証する（困）
Local by flywheel で、admin押したらThis site can’t be reachedが出て管理画面が出ない

現在存在するwordpressのローカル環境構築方法で一番簡単なのは、Local by flywheelだと思うのですが、手持ちのMac(OS 10.13.6)だと、This site can’t be reachedというエラーが出てしまって、管理画面にもサイト画面にもアクセス不可の状態でした。

Local by flywheelはまだ新しいからか、ネット上にある解決方法も少なめ。

検索能力が低めなので、ググってもしても、Local by flywheelのおすすめ記事にしか到達できず、質問コミュニティでヘルプを求めたところ、色々なアドバイスをいただいた。

###結果的には、PC再起動で直りました
しかし、そこにたどり着くまでにプログラミング初心者の自分にはとても思いつかないようなファイルなどをチェックしたので、今後サーバー関連で問題が起こった時はどこをチェックすればいいのかの記録を残したいと思います。

###環境
・MacOS 13.10.6 High Sierra


# やった事① etc/hosts を確認

って思ったので、とりあえずそのままにググる。
「ホスト名とIPアドレスを対応させるためのファイル」らしい。

Macの場合はterminalを開いて、以下コマンドを実行すれば中身が見れる

####`$cat /private/etc/hosts`

その中に以下のようなLocal by Flywheelの表記があればhosts の更新はできているらしい。

```
# Local by Flywheel - Start ##
::1 testsitecom.local #Local Site
127.0.0.1 testsitecom.local #Local Site
::1 www.testsitecom.local #Local Site
127.0.0.1 www.testsitecom.local #Local Site
```


# やった事② MAMP, XAMMPなどのApacheサーバーと衝突していないか確認

私の場合は、上述したような表記があったので、hostsの更新ができている状態だった。
とすれば考えられるのは、別ツールで作ったApacheと衝突しているかもとのことで、こちらも助言をいただいた通りにチェックしてみた。

####①Local を終了
####②アクティビティモニタ (Applications -> Utilities) を開いて Process Name のなかにapache か nginx, httpdがあれば x ボタンで止める。(検索ボタンがあるので、それらを検索してなければok)

私の場合は、それもありませんでした。

# やった事③ Localの古いバージョンをインストールしてみる
こちらのサイト様の[ローカル開発環境 Local by Flywheel エラー検証「Missing hosts entry…」](https://bityl.co/4Wcv)を参考に、古いLocalのバージョンをインストールしてみました。

古いバージョンのインストールは[こちら](https://bityl.co/4Wd2)

が、This site can’t be reachedが出るのは変わらず..。

*備考 : ちなみに上記サイトの[既存サイトをLocal by Flywheelでローカル開発環境へインポート](https://bityl.co/4WUr) とかの記事もすごく勉強になります。




#やった事④ping testsitecom.localの応答を確認

```teminal.
$ping testsitecom.local #コマンド実行で以下のような応答があればok.
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.064 ms
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.069 ms
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.102 ms
```

わたしの場合は、これはきちんと応答があったので問題なかったらしい。

#やった事⑤　logの確認
Localの画面左側の testsite.com を control + click で Reveal in Finder とするとapp, conf, logsなどのフォルダが開ける。
この logs/nginx/error.log もしくはapache/error.logにはエラーの記録が残ってないか確認

わたしの場合は、apache/error.logの中に以下のような記述があった

```apache/error.log
logs/apache/error.log↓
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using MacBook.local. Set the 'ServerName' directive globally to suppress this message
[日付など〜] [mpm_event:notice] [pid 91617:tid 16桁の数字] 〜
```

Local by flywheelのエラーログってこうやって見ればいいのか..

#PC本体を再起動する
前述したように、最終的にはこんな簡単な手段で直りました。

サーバー関連は、再起動を一度してみるといいらしいです。
その際[こちらのLocalについて書いてある海外サイトのリンク](https://bityl.co/4Y3L)をいただきました。


今回わたしも質問サイトで調べる前に結構ググったのですが、何日かけても答えにたどり着けなかったのにも関わらず、質問サイトの回答者さんは1日もかからずにこのサイトにたどり着き解決まで導いてくださいました。

プログラミングをしていると、こういったエラーは頻繁に起こります。ネットでググって答えにたどり着ける力をもっとつけないとなと思いました。
jsを非同期であとで読み込む

Twitterを埋め込んだものをブログに表示したい。
まぁ、今回はVue.jsなんだが。

では、どうすれば良いかというと `vue.blade.php` に直接書いても先に `widgets.js` が作動してしまい、うまく表示されない。

ということで対応策として、

・記事が読み込まれる
・widgets.js を読み込む

という流れにする。

```

axios.post('/article/view/', dataform).then(e => {

    this.res = e.data.res;
    
   //ここが味噌 
    let recaptchaScript = document.createElement('script');
    recaptchaScript.setAttribute('src', 'https://platform.twitter.com/widgets.js');
    document.head.appendChild(recaptchaScript);

```

はい、以上です。
IBM Cloud Kunbetnetes Service のアップデートCLI実行ログ( 1.17 -> 1.18)


以前、[IBM Cloud Kunbetnetes Service のアップデート実行ログ](https://qiita.com/c_u/items/c02eed4f4951b7e1236f)　では GUI でのアップデートを実行しましたが、今回は CLI での実行ログです。

---

#### 環境
IBM Cloud Kubernetes Service (version 1.17)
 - master node 1, worker node 1

---
#### 準備

[Kubernetes version information and update actions](https://cloud.ibm.com/docs/containers?topic=containers-cs_versions&locale=en#prep-up)  をよく読んで、Unsupported になる内容や、対応事項をよく確認。

---

#### 実行

①マスター・ノードのアップデート

```
bash-3.2$ ibmcloud ks cluster master update --cluster xxxxxxx
Checking for the default Kubernetes version...
During the update, you cannot access or change the cluster. Worker nodes, apps, and resources that have been deployed by the user are not modified and will continue to run.
You might need to change your YAML files for future deployments. Review the docs for details: 'https://ibm.biz/iks-versions'.
Are you sure you want to update your Kubernetes API server xxxxxxx to 1.18.12? [y/N]> y
Updating cluster xxxxxxx...
OK
```

-> コンソール(GUI)で状態遷移確認をしました。
　　この環境では20分程度で完了しています。


参考：[ibmcloud ks cluster master update](https://cloud.ibm.com/docs/containers?topic=containers-cli-plugin-kubernetes-service-cli&locale=ja#cs_cluster_update)


②ワーカー・ノードのアップデート

```
bash-3.2$ ibmcloud ks worker update --cluster xxxxxxx --worker kube-tok0X-xxxxxxxxxxxxxxxxxxxxx-w1
Updating the worker node version can cause downtime for your apps and services. During the update, all pods might be rescheduled onto other worker nodes and data is deleted if not stored outside the pod. To avoid downtime, ensure that you have enough worker nodes to handle your workload while the selected worker nodes are updating.
You might need to change your YAML files for deployments before updating. Review the docs for details: 'https://ibm.biz/upworker'
Are you sure you want to update your worker node [kube-tok0X-xxxxxxxxxxxxxxxxxxxxx-w1] to 1.18.10_1532? [y/N]> y
Processing kube-tok0X-xxxxxxxxxxxxxxxxxxxxx-w1...
Processing on kube-tok0X-xxxxxxxxxxxxxxxxxxxxx-w1 complete.
OK
```

->  10 分くらいで完了しました。メールでもリロード通知が届きました。


参考：[ibmcloud ks worker update](https://cloud.ibm.com/docs/containers?topic=containers-cli-plugin-kubernetes-service-cli&locale=ja#cs_worker_update)


---



```
$ kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
xx.xx.xx.xx   Ready    <none>   631d   v1.18.10+IKS

$ ibmcloud ks worker ls --cluster xxxxxxxxxxx
OK
ID                                                 Public IP         Private IP      Flavor               State    Status   Zone    Version
kube-tok0X-xxxxxxxxxxxxxxxxxxxxx-w1   xx.xx.xx.xx  xx.xx.xx.xx   b3c.4x16.encrypted   normal   Ready    tok0x   1.18.10_1532

```


---

#### 実行後

実行後では、deployment や pod の状態など確認して、アプリケーション稼働を確認します。
また、kubectl コマンドが対応するバージョンになるように必要であれば、kubectl コマンドアップデートや、ibmcloud プラグインのアップデートを実行します。


参考： [CLIの更新](https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#cs_cli_upgrade)




簡易ですが、以上です。
一度削除してしまったgit submoduleを再度追加する

## 概要
ローカルリポジトリに追加しリモートにpushしたリポジトリ内のgit submoduleを諸事情で一度削除したが、再度追加しリモートにpushし直したいということがあった。
とりあえず、`git submodule add` で追加されたローカル上の.gitmodulesを消して、再度同コマンドで追加しようとしたら以下のようになった。

```console
A git directory for 'リポジトリ名' is found locally with remote(s):
s  origin リポジトリURL
If you want to reuse this local git directory instead of cloning again from
  リポジトリURL
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
```

## 解決方法
1. .gitフォルダ内のmodulesフォルダを削除する   
2. 同じく.gitフォルダ内のconfigファイル内の[submodule]の行を消す
3. 再度 `git submodule add` で追加し、コミット、pushする

無事追加されました！
ブロック要素とインライン要素を攻略

#目的
学習中、理解に時間を要した要素について言語化をすることで理解を深めたい。
今回はブロックレベル要素とインライン要素の違いについて。
HTMLにおいて、\<body>〜\</body>の中で定義される要素の多くは、**ブロックレベル要素**と**インライン要素**に大別される。


#ブロックレベル要素とインライン要素の考え方

###ブロックレベル要素
見出し・段落・表など、ウェブサイト上で「かたまり（ブロック）[^1]」として扱われる要素。
ブラウザでも一つのかたまりとして扱われ、一般的なブラウザでは前後に改行が入る。
このブロックを積木のように積み上げることで、ウェブサイトを構築していく。

よく使うタグ例
\<h1>\</h1>　見出しタグ
\<p>\</p>　段落タグ
\<div>\</div>　グループ化のための汎用タグ


###インライン要素
ブロックレベル要素の内容として用いられる要素で、文章の一部として扱われます。
\<strong>要素のように、段落のなかの一部を強調するような装飾の役割もある。

よく使うタグ例
\<a>\</a>　リンクを作るタグ
\<b>\</b>　文字を強調するタグ

#使いかた
基本的にはブロックレベル要素を用いて、積木を積む要領でウェブサイトの骨格を作っていく。
そのブロックの中に、インライン要素などを用いて肉付け、装飾をしていく。

[^1]: テキストでは「箱」と表現されている
Ionic + Firebase AndroidでFCMのデフォルトPush通知アイコンを設定する

IonicでPush通知を実装する方法はいくつかありますが、[Firebase Messaging Service(FCM)](https://ionicframework.com/jp/docs/native/fcm)を使うことで簡単に実装できます。

FCMの実装については、以下の記事が参考になりました。
[Ionic+CordovaでFirebase Cloud Messaging(FCM)の実装](https://qiita.com/KenNagami/items/20e8f0e16815cc83562b)

この記事では、Android端末でのデフォルトのPush通知アイコンを設定する方法をご紹介します。

#設定しない場合の表示
Push通知で表示されるアイコンですが、送信側と受信側で画像を設定しない場合、白色の画像が表示されます。
FirebaseのCloud MessagingでAndroid端末に通知を送信してみます。
以下のように、通知画像を設定せずにテストメッセージを送信します。
![スクリーンショット 2020-11-20 10.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/e43ea58f-e881-83dd-3fbd-3ef5a32f4e8d.png)
受信した端末では、以下のように白色の丸で表示されました。
![スクリーンショット 2020-11-20 10.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/1fd824bc-725c-a2aa-cfbb-808af7f6eb81.png)
この白色の丸を、指定の画像と色で表示する方法を以下に示します。

#アイコン画像を設定する
AndroidManifest.xmlに以下を追記します。

```AndroidManifest.xml
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/fcm_push_icon"/>
```

これで`platforms/android/app/src/main/res/drawable/fcm_push_icon.png`の画像がPush通知のアイコン画像として表示されます。

#デフォルトのアイコン画像の色を設定する
以下のようなcolors.xmlを作成します。設定したいカラーコードに変更してください。

```colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorAccent">#3880ff</color>
</resources>
```

このcolors.xmlを`res/values/`と`platforms/android/app/src/main/res/values/`に配置します。
config.xmlとAndroidManifest.xmlに以下を追記します。

```config.xml
<resource-file src="res/values/colors.xml" target="app/src/main/res/values/colors.xml" />
```

```AndroidManifest.xml
<meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent"/>
```

これでpush通知のアイコン画像が、設定した色で表示されます。

#参考
https://stackoverflow.com/questions/58668110/ionic-4-fcm-how-to-fix-the-compiler-error-coloraccent-not-found
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja
Power BI Servicesにてワークスペースの作成ケースに関する整理

## ワークスペースの作成ケース
Power BI Services上のワークスペースが作成されるケースを整理します。
(2020/11時点の情報です)


| 番号 | 作成ケース                                              | リンク                                                       |
| ---- | ------------------------------------------------------- | ------------------------------------------------------------ |
| 1    | 新しいワークスペースを手動で作成                        | [Power BI で新しいワークスペースを作成する](https://docs.microsoft.com/ja-jp/power-bi/collaborate-share/service-create-the-new-workspaces) |
| 2    | デプロイ パイプラインで空のステージにデプロイする際に作成 | [デプロイ パイプラインの使用を開始する](https://docs.microsoft.com/ja-jp/power-bi/create-reports/deployment-pipelines-get-started#step-3---deploy-to-an-empty-stage) |
| 3    | クラシック ワークスペース*を手動で作成                   | [Power BI でクラシック ワークスペースを作成する](https://docs.microsoft.com/ja-jp/power-bi/collaborate-share/service-create-workspaces) |
※[新しいワークスペースとクラシック ワークスペースの違い](https://docs.microsoft.com/ja-jp/power-bi/collaborate-share/service-new-workspaces#new-and-classic-workspace-differences)


## ワークスペース作成権限に関する注意事項
これらの操作にはすべて、ワークスペースの作成権限が必要となることに注意が必要です。

特にデプロイパイプラインの利用では注意が必要で、現時点では割り当て後に既存のワークスペースを他のステージに指定することができないので、Microsoft 365（Power BI）管理を行う部署が統括的にワークスペースの作成を管理する場合には、利用に時間がかかることが予想されます。

ワークスペース作成時には、併せてデプロイパイプラインの利用有無を確認して、デプロイパイプラインを使用したワークスペース作成も依頼しておくのがよさそうです。

デプロイパイプラインについては、下記記事にて手順を紹介しております。

- [Power BIの配置パイプライン機能を試してみた](https://qiita.com/ryoma-nagata/items/d089e2ffdf4c7d33ad2b)

### デプロイパイプラインで割り当て後に既存のワークスペースを他のステージに指定する機能への投票
必要そうだという共感いただけたらぜひ投票してください
https://ideas.powerbi.com/ideas/idea/?ideaid=f9532b40-cc1d-44a0-9dff-f2b432eaeef0
Azureの仮想マシンにVScodeからSSH接続する方法

# この記事について
本記事ではAzureでVMを作成した後、VScodeからSSH接続する方法の記録を残しています

# 手順
1. 任意のAzure VMを作成する
2. VMのプライベートキー「{VM名}.pem」をダウンロードし、`~/.ssh`に配置
3. VScodeの拡張機能「[Remote-SSH(この拡張機能が含まれたパックへのリンク)](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)」をインストールする
4. `~/.ssh/config`を下記の内容で作成
5. VScodeのウィンドウ左下の緑のボタンから、接続を開始する

```config:~/.ssh/config
Host {任意の名前}
    HostName {ホスト名}
    User {ログインユーザ名}
    IdentityFile {プライベートキーのパス}
```
※configファイルの詳細については下記の記事を参照

>.ssh/configファイルでSSH接続を管理する
>https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1
プログラミング超初心者がFlutterの環境構築をしてみた


やったこと
KBOYさんのYouTubeを見ながら、Flutterの環境構築をしました。

１、Flutterのインストール
２、Flutterのパスを通す

２からすでに、苦戦するという「マジか」と思いつつなんとかできました。

.bash_profile にパスを記載しようとしたのですが、
最近のPCは　bash ではなく　

.zshrc っていうのが最近の新しいパス設定の場所らしい

参考にした動画
https://www.youtube.com/watch?v=kpvVENfDCRc&list=PLuLRJz1UnJzE4-HlkLTG8ARbZ2TDBNHzZ
AWSの主要なサーバレスサービス 4選！

# はじめに
今回はAWSのサーバレスサービスを紹介します！

ここでいうサーバレスは、AWSがサーバーを管理し、利用者側は<b>サーバ管理不要</b>なコンピューティングサービスを指すことにします。

利用者はサーバー管理不要なので、毎週のように来る脆弱性対応やミドルウェアの設定・管理、スケーリングを考えた構成をしなくて済みます。
また、利用者はビジネスロジックに集中でき、使用した分だけ課金されるので、コスパの良いサービスを作ることができます。

# YouTube動画
動画で確認したい方はこちらをどうぞ
[【YouTube動画】 AWSの主要なサーバレスサービス4選](https://youtu.be/YXxwzl0hf7Y)
[![AWSの主要なサーバレスサービス4選](https://img.youtube.com/vi/YXxwzl0hf7Y/0.jpg)](https://youtu.be/YXxwzl0hf7Y)


# AWS Lambda
LambdaはAPI呼び出し時やイベント発生時にLambda関数を実行できるサービスです。
Lambda関数はNode.jsやRuby, Pythonなどで書かれたコードを実行するために利用します。

S3やSQSと連携して、データを処理したり、スケジューリングにより定期実行したりできます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/d507ad13-59a4-bcef-0b4f-caca6767c1b7.png' width='650'>

# Amazon API Gateway
API Gatewayは様々なサービスと連携して、REST APIやWebSocket APIを作成し、管理できるサービスです。

LambdaやDBと連携すると、CRUDのアプリも作れます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/709944bf-2858-c2f3-4710-bcc815555d2c.png' width='650'>



# AWS Step Functions
AWS上の様々なサービスを連携させて、ワークフローを作れるサービスです。

Lambda1の処理が終わったら、Lambda2に情報を渡したいといった場面で威力を発揮します。
このサービスを使わない場合は、Lambda1にLambda2の情報を入れておく必要があります。
Lambda関数の実行順やエラー時の対処をLambda関数外で制御でき、Lambda間を疎結合にできます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/1ee3f993-2502-0c5d-b61e-5c9bbec18dca.png' width='650'>



# AWS AppSync
GraphQLのAPIを簡単に作れるサービスです。

GUIでクエリ文を書いて実行できます。
ビジネスロジックはVTLという言語で記述します。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/3be504fe-508e-9914-5b0b-00a79c54c0a4.png' width='650'>


# おわりに
今回はAWSのサーバレスサービスについて紹介しました！

サーバレスを簡単に扱うためのサーバレスフレームワークもいくつか候補があります。
例えば、[AWS SAM CLI](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)や[Serverless](https://www.serverless.com/)などがあり、ローカルで実験してデプロイすることもできます。
既存のフレームワークと同じように書きたい場合もRubyならRSpecが標準で使える[Jets](https://rubyonjets.com/)などがありますし、一度触ってみてはいかがでしょうか？
【React】React Tableで行をクリックした際のonclickイベントハンドラを設定する方法

メモとして残します。

みんな大好き、[React Table](https://github.com/tannerlinsley/react-table/tree/v6 "reactTable")ですが、行をクリックした際のイベントハンドラの設定方法メモとして残します。

#■やり方
下記の通り`getTdProps`プロパティに設定をします。

```jsx
<ReactTable
    getTdProps={(state, rowInfo, column, instance) => {
        return {
            onClick: e => {
                //if(column.id !== 'col-check'){
                    // 基本的な処理
                //  return
                //}
            }
        }
    }}
/>
```

ちなみに、`getTrProps`というプロパティもありますが、このプロパティだと、例外的にイベントを発火させたくない列があったときに対応できないため、`getTrProps`はあえて、採用しませんでした。
他thといった要素にも設定できるため、公式で確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/be1098c7-edd6-6eac-e0f1-ac85cdda1cb5.png)





以上。
Org-mode based development

Gitでこまめにcommitした方がいいのがわかってはいるけれど、
うまくcommitできないというかいちいちどうメッセージを打てばいいか分からなくなる
一方で、研究資料含めてorg-mode(+beamer export)でまとめる癖がついていたので、
README.mdをorg-modeで書いてみることに。
そういえば実験結果も一緒にcommitして仕舞えば後で見返せるな...

研究室サーバーにtrampでログインしておいて、
README.orgファイルに次の実装計画などを追加していく。
プログラム開発用にはVSCodeを使っているので(以前はPyCharmだったけど、機能が多すぎて重たいと感じていたので移行した)
ある程度まで書いたりTODOのタスクが一つ終了するたびにcommitして、
尚且つREADME.orgに記載していたタスクをsubtreeごとコピペしてcommit(magit)する
そうすると、メモをgit logに関連して見直せるし便利。
また、文章をいちいち書くのめんどくさくてcommitしていなかったという問題も解消される。

プログラムコードとして残る変更はいいんだけど、
環境構築系の後から見直してこれどうしたんだっけみたいなものも、
org-modeの方に参考にしたサイトとかのメモを取っておけば自然と問題が解消されるし、
README.org ファイルを変更したことを検出してくれるから、
自然とプロジェクトの進捗の段階に応じてcommitできる。

...magit便利...
# magit+org-mode+org-beamer-export
作業記録をorg-modeで取った後、beamerを使ってスライドにまとめる。
作業記録それ自体が残っていると、viewが飛んだりして非常に扱いづらいから、
magitからgit showをして、過去のファイル(作業履歴)を見返しつつ、
話の流れそれ自体は独立にまとめるというか綺麗なファイルに一から記載して行った方がわかりやすいスライドになりがち。
gitに保存されているので、過去の作業記録も過去のスライドも躊躇なく消せるのが素晴らしい...
c.f. https://qiita.com/eggc/items/948f8df70069334e8296
# Future Work
Org-modeのsubtreeみたいに、編集履歴というかcommitのlogもツリー上にする方法ないのかな...
いちいちbranch作るのは面倒だし...
logで見返すときだけでいいんだろうけど
ServiceNow - フィールドの下にいつもメッセージを表示させる

#概要
注釈の「ヘルプ表示」と「常に展開」をチェックするとフィールドの上にメッセージは表示される。

#上に表示（注釈）
<b>設定</b> 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/7714aa23-3757-ca51-cb54-20fdec86cca4.png)
<b>出力</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6d3d3b8c-012f-3601-10db-bc9e39810caa.png)

#下に表示（showFieldMsg()）
フィールドの下にメッセージを表示する場合はクライアントスクリプトでshowFieldMsg()を使う。
isLoadingはページがロード(onLoad)の判定であり、newValueは値が設定されているかの判定である。何時も表示するにはページがロードされる時も未入力の時もメッセージを表示する必要があるのでこれらを判定しているif文をコメントアウトする。
<b>設定</b> 
Field 2 (info)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/91859123-3a52-e88d-81d0-6c6c1f804dc3.png)
Field 3 (warning)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/96454efa-ef62-3019-4726-69eb3b74545b.png)
Field 4 (error)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c5cd316f-1ee3-1c2d-1d42-10f85d416e19.png)

<b>出力</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/53cb38ea-382c-6631-bb8c-3482c43f9dd7.png)

以上
Power BI Services Premium容量に関するロールと権限の整理

## 概要
Power BI ServicesにてPower BI Premium容量を利用する際のロール付与方法とその動作について整理します。
(2020/11時点の情報です)

Power BI Premium容量の設定権限をもつロールは3種類あり、下記の表に整理します。詳細内容は後述。

| 番号 | ロール       | Power BI管理ポータルで設定可能な項目 | ワークスペースへのPower BI Premium容量割当方法       |
| ---- | -------------- | ---------------------------------- | ---------------------------------------------------- |
| 1    | Power BI管理者 | すべての項目                       | Power BI管理ポータル、ワークスペースの個別設定で可能 |
| 2    | 容量管理者（Power BI Premium）     | 容量の設定と更新の概要                         | Power BI管理ポータル、ワークスペースの個別設定で可能 |
| 3    | 共同作成者（Power BI Premium）     | なし                               | ワークスペースの個別設定で可能                       |

## 詳細確認
### Power BI管理者
#### ロール付与方法
Microsoft 365管理センターで設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/31a5140f-3d05-f38b-b29b-592fcb32fa80.png)

#### Power BI管理ポータルで設定可能項目
Power BI Premium容量の設定を含むすべての項目を設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c9322dcb-7206-fdf1-8f55-28ce5427c038.png)

#### ワークスペースへのPower BI Premium容量割当方法
管理ポータルかワークスペース設定の双方で可能

Power BI管理ポータルで設定可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/838d6fe0-1982-cb77-3e00-f53a5406b448.png)

ワークスペースの設定にて設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/125ee02d-65d0-e51d-21c1-03d1891b4e1e.png)

### 容量管理者
#### ロール付与方法
Power BI管理ポータルの容量の設定にて設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/79a8f3f4-94be-65d0-fd52-0c8d5917abb8.png)

#### Power BI管理ポータルで設定可能な項目
権限付与されたPower BI Premium容量における"容量の設定"と"更新の概要"のみ設定が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2baaf4f6-adac-b62f-aa41-e6d583708434.png)

#### ワークスペースへのPower BI Premium容量割当方法
管理ポータルかワークスペース設定の双方で可能

Power BI管理ポータルで設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/838d6fe0-1982-cb77-3e00-f53a5406b448.png)

ワークスペースの設定で設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/125ee02d-65d0-e51d-21c1-03d1891b4e1e.png)

### 共同作成者
#### ロール付与方法
Power BI管理ポータルの"容量の設定"にて設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/caffccca-1c4c-26a6-2a21-4bbb7797a94c.png)

#### Power BI管理ポータルで設定可能な項目
設定可能な項目は表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d146a724-37ae-5712-2fbf-cdf072a2174c.png)

#### ワークスペースへのPower BI Premium容量割当方法
ワークスペース設定からのみ。

ワークスペースの設定にて設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/125ee02d-65d0-e51d-21c1-03d1891b4e1e.png)
【PHP】セッションとクッキーを初心者向けに説明

超詳しい参考サイト
[Web Design Leaves](https://www.webdesignleaves.com/pr/php/php_basic_07.php)

`クッキー`とは？`セッション`とは？から始まる話は難しいので上記のサイトを参考にしてください。
最高にわかりやすいです。

ここでは`使用例`とセッションとクッキーの`関連性`に絞ります。

#### 保存先

セッションの保存先は`Webサーバー`です。
クッキーの保存先はクライアントの`ブラウザ`です。

セッションはブラウザとサーバーが接続された時に session_start()によって生成されます。

|        | 保存先 | 変数名 | 
| ------ | ----------- | -------- | 
| セッション   | Webサーバー | $_SESSION | 
| クッキー | ブラウザ   | $_COOKIE | 

#### クッキー（クライアント）のセッションID

ブラウザ側にある`クッキー`には`PHPSESSID`が保存されます。
例えば下のような値です。

| セッション名  | 　 | 値                           |
| ------------ | --- | :--------------------------: | 
| PHPSESSID    |    | '682dos0637qu0g1l8clhs9sv7a' | 

#### WebサーバーのセッションID

Webサーバーは数多く保存しているセッションがどのクライアントに紐付くかをPHPSESSIDで判断しています。

| Webサーバー（SESSION）       |     | ブラウザ（PHPSESSID）                   | 
| ---------------------------- | :-: | ---------------------------- | 
| '682dos0637qu0g1l8clhs9sv7a' |<----->  | '682dos0637qu0g1l8clhs9sv7a' | 
| '7qu0g1l8cl682dos063hs9sv7a' |     |                              | 
| 'lhs9sv7a682dos0637qu0g1l8c' |     |                              |

#### セッション変数

セッション変数は`Webサーバーに保存できる変数`です。
Webサーバーに変数が保存できると何が便利なのでしょうか？

`セッション変数`の利点
・`ページをまたいで`値のやりとりができる。
・`ブラウザを経由しない`ため改ざんされづらい。

具体例
`send.php`にアクセスすると即時`receive.php`に飛んで'51'を画面出力します。

```php:send.php
<?php
session_start();
$_SESSION['id'] = '51';
//リダイレクト
header('location: ./receive.php');
```

```php:receive.php
<?php
session_start();
echo $_SESSION['id'];
//string -> 51
```
どうでしょう？うまくいきましたね！
send.phpで`$_SESSION['id']`を**保存**して、receive.phpで**アクセス**できました！

`session_start();`はセッションを使用するときの**おまじない**です。
各ファイルの`先頭`に必ず置いてください。

#### クッキーのセッションIDを確認する
ここで、クッキーに保存されている`PHPSESSID`を確認してみましょう。
`Chrome:`
デベロッパーツール -> Applicationタブ -> Cookies -> URL -> Value

`Safari:`
Safariの準備 -> 環境設定 -> 詳細 -> メニューバーに“開発”メニューを表示
開発タブ -> Webインスペクタを表示 -> ストレージタブ -> Cookie -> 値

PHPSESSIDが確認できたでしょうか？
PHPSESSIDはそれが`破棄されるまで`同じ値が使用されます。

#### セッションの破棄

上で破棄されるまでと言いました。
それでは破棄してみましょう！（[公式](https://www.php.net/manual/ja/function.session-destroy.php)）

```php:delete_session.php
<?php
session_start();
//セッションの初期化
$_SESSION = [];
//セッションクッキーを削除
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 42000, '/');
    unset($_COOKIE[session_name()]);
}
//セッションを破壊
session_destroy();

//ここまででPHPSESSIDもセッションも消去されています。

//リダイレクト -> send.php -> 新たなPHPSESSIDが生成される
header('location: ./send.php');
```

send.php, receive.php, delete_session.phpは同じフォルダに入れてください。

デベロッパーツールで`PHPSESSID`を観察しながら、
`send.php`動作 -> `delete_session.php`動作で。
PHPSESSIDが`生成` -> `変更` されているのが見えます！

ぜひデベロッパーツールで確認してみてください。

どうでしたでしょうか？
セッション変数の利用の一助になれば幸いです。

LGTMお願いします！
ストックのついでにお願いします！
モチベーションがあがります！
LaravelでDocker環境構築後にルーティング設定が効かなくなる時の対処法


#解決方法

###１．Routeが存在するか確認

```
php artisan route:list
```

###２．httpd.confを確認する

```
sudo vim /etc/httpd/conf/httpd.conf
```
httpd.confの内容が以下になっているか確認する

```
DocumentRoot "/var/www/html/laravel/public/"

<Directory "/var/www/html/laravel/public">
Allowoverride All
</Directory>
```


###３．rewrite.loadがあるか確認してみる

```
ls /etc/apache2/mods-enabled/

a2enmod rewrite
```

### ４．再起動をしてrewrite.fileが追加されているか確認

```
service apache2 restart　又は　apachectl restart

ls /etc/apache2/mods-enabled/
```


dockfileからRUNコマンドでできる方法もあるみたいですが、今回はこちらの方法でしました。


参考元
http://peacock.ky-3.net/laravel/laravel_404notfound

https://qiita.com/dokkoisho/items/03746e58d975bd7a35ec
先に行かせろ！「この接続ではプライバシーが保護されません」から進む方法

Chromeが対象になるけど
個人でサイト作ったりの過程で確認をしようとすると
証明書の絡みですぐにページが見れない時が割とある
![プライバシーが.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/dd7b6515-71fd-cc5a-86d8-447e169a4a82.png)
こんな感じ↑

わかっているから先に行かせろ！って
思いをはせることがしばしばあったのですが
意外な方法でさくっと先に進めることを最近知った。

### 「thisisunsafe」

個人的には
そんな方法があったのか〜と
これまでのこの画面に対して使っていた時間が勿体無いと感じてしまった。

この「thisisunsafe」の使い方は
先ほどの画面が表示された状態で何もいじらずに
「thisisunsafe」を打ち込んでEnterを押す。
なんとも簡単な(￣▽￣)

これから色々と作成する方は是非とも活用してほしい
ただ自分が作ったものでもないもので
この様な状況になる場合はしっかりと考えた上でどうするか決めましょう！
nth-childとは

# nth-childとは
複数ある要素のうち、ある特定の要素を指定したい場合に使用する。

:例

```index.html
    <h2>:nth-childについて</h2>
    <div>
        <span>Item 1</span>
        <span>Item 2</span>
        <span class="cls">Item 3</span>
        <span>Item 4</span>
        <span>Item 5</span>
    </div>
```

```style.scss
div{
  & span{
    color: olive;

    &:nth-child(2){
      color: purple;
    }
  }
}
```
→２つ目の要素、つまりItem2のみがpurpleとなる。

また、偶数のものを指定したい時はnth-child(2n), 奇数のものを表示したい時はnth-child(2n + 1)とすることでそれらを表示させることができる。

その他にも偶数を表す場合はnth-child(even),奇数を表す場合はnth-child(odd)とすることでもスタイルが割り振られる。

#最後に
ここまで記事を読んでいただき、ありがとうございます。
本投稿が学習の一助となれば幸いです。
ServiceNow - ITOMの概要

#ServiceNow ITOMの概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/14180255-3a0f-0b3f-9f57-448835cf063e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/1bc50108-2ed1-7352-33cf-1579671441fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/685cae99-295a-651e-162c-4d9630061014.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e9cd74a7-c193-b394-a9a3-9c70a74cd3c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e8a95941-0333-99a5-bb7e-6609c4c60a4d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/2878833a-42ed-8bd0-c3a1-4a8013f36f76.png)

#ネットワーク管理での利点
- 従来ではネットワーク機器の設定を調べる場合は各機器にログインして情報を調べる必要があった。機器によりWebページから設定を行える場合もあるが、機器毎にログインして設定を行う必要がある。ServiceNow ITOMを利用することが一括してネットワーク機器の情報を取得することができる。<br/>機器のモデル，製造元，シリアル番号など基本情報の他に設定されているインターフェース，VLAN，IPアドレス，ルーティングテーブル，ACLなどの設定をServiceNowから閲覧することが可能。
- ServiceNowはマルチベンダー対応。複数社のネットワーク機器を一括管理することが可能。
- 設定の変更管理ができる。従来では障害が発生した場合はだれかがどの設定を変更したのかを探す必要がありました。ServiceNowは設定情報をデータベースに登録しているため、以前の設定を比較することがどの設定が変更されたかを調べることがでる。
- ServiceNowは機器の関連情報も取得する。どの機器を接続しているのかを知ることができる。ネットワーク構成が変更された場合は新しい構成を検出することができる。
- 接続している機器情報も管理しているため、アラートが発生した場合に問題が発生した可能性が高い機器からのアラートのみからインシデントを作成することが可能。
- 従来ではイベント及びアラートを管理していたが、ServiceNowではインシデントで管理することができる。イベントをフィルタを掛けてアラートを作成して、更にフィルタを掛けてインシデントを作成するため通知を少なくできる。
- 機器の履歴情報を閲覧することができる。インシデントは機器と紐づいているため、過去のインシデントを閲覧することが可能。インシデントが頻繁に起こる機器を特定して入れ替えることを検討できる。
- ネットワーク機器及びサーバの他にサーバで可能しているアプリケーション及びサービスもITOMで管理することが可能
- ネットワーク機器での障害がどのアプリケーション及びサービスに影響を与えるかを把握することが可能。アプリケーション及びサービスのダウンタイムにより発生するコストを算出することで、どの機器及びネットワークサービスに投資するかがベストだか判断することができる。
- インシデントが発生した場合に自動的に処理を実行することが可能。例えば自動的にネットワークの切り替えるとか。
- ネットワーク管理に使われている作業とその時間を測定することができる。多くの時間を使われている作業を特定して、効率化を検討することが可能。また、以前と効率化した後の時間を比較して数量的に効果を計ることが可能。⇒ネットワーク管理コストを削減することが可能。

#纏め
- ITOMなしでも手動でインシデントを作成することは可能
- ServiceNow以外にもネットワーク機器管理を行うツールは多くある。こららのツールは機器情報やイベント／アラート情報を収取することはできる。ServiceNowはそれに加えてビジネスへの影響、コスト削減、投資効果などの算出を支援するツールがある。
nextcloud で サブディレクトリ運用

* DocumentRoot の下に `./nextcloud/`を作ってそこで稼働させる例。

```diff:nextcloud/config/config.php
  <?php
  $CONFIG = array (
    (略)
+   'htaccess.RewriteBase' => '/nextcloud/',
  );
```

## 途中でdataディレクトリの場所を変更したい場合

```diff:nextcloud/config/config.php
  <?php
  $CONFIG = array (
    (略)
-   'datadirectory' => '/var/www/html/data',
+   'datadirectory' => '/var/www/html/nextcloud/data',
  );
```