OmniAICreator/Qiita-1.07M huggingface dataset:
Googleデジタルマーケティング＆Eコマース：コストに関連したパフォーマンスゴール（CPA,CPC）

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/41012708-dfb2-da45-b1a3-5a683fab51bc.png" width="800">

# コストに関連したパフォーマンスゴール

コストに関するパフォーマンスゴールには、ROAS（広告費用対効果）以外にも多くの種類があります。今回では、[以前紹介した入札戦略][ref]のパフォーマンスゴールについて説明します。

[ref]: https://qiita.com/mapami/items/3f2094a619d775888646

スマート自動入札（Smart Bidding）は、Google広告が目標を監視し、その目標に到達するために戦略を最適化することを可能にします。Smart Biddingと手動入札の両方が、以下のような指標に対して目標やパフォーマンス目標を使用します。

- CPA（Cost per acquisition）
- CPC（Cost per click）

:::note info
Smart Biddingでは、
- Target CPA
- Enhanced CPC

の2つの戦略を使用できます。CPC強化戦略は、手動CPC入札とターゲットCPAまたはターゲットROASを組み合わせたものです。
:::

## CPAを下げ、キャンペーン価値を向上させる

***<font color="MediumVioletRed">『CPAとは、各コンバージョンに対して支払われた平均コストのこと』</font>***

過去のキャンペーンの比較データがあれば、CPAの平均値をパフォーマンス目標として使用することができます。そして、キャンペーンの価値を向上させるために、より低いCPAを達成しようとキャンペーンを最適化することができます。

過去のキャンペーンデータがない場合は、業界平均値を出発点として使用してみることができます。業界平均値とは、ある業界全体で見られる典型的な値です。自動車業界の検索広告のCPA、アパレル業界のFacebook広告のCPA、EコマースのCPAなどはその一例です。

あなたは不動産会社のために働いているが、過去のキャンペーンデータを持っていないことを想像してみてください。検索広告の業界平均CPAが41.14ドルであることを知り、目標CPAを40ドルに設定します（下図の赤線）。検索広告の予算は10,000ドルなので、目標CPAの40ドルを達成または上回るために、少なくとも250のコンバージョンを目指します。赤線以下のコンバージョン数であれば、目標値を超えることになります。

- **「Number of conversions for improvement = Budget / CPA = 10,000USD / 40USD = 250」**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/74ac34cd-0bd2-8efc-63cb-9c6d6e92d245.png" width="700">

潜在顧客が不動産サービスの資料を請求することをコンバージョンと定義した場合、検索広告を見た後にその行動を起こす人が少なくとも250人必要です。250人以上がその行動を起こせば、あなたのキャンペーンの価値を不動産の業界平均よりも向上させたことになります。


## CPCを管理するために日々の支出を使用する

***<font color="MediumVioletRed">『CPCとは、ペイ・パー・クリック（PPC）広告で使われる指標』</font>***

コストをコントロールする方法のひとつに、キャンペーン単位でCPCを管理する方法があります。優先順位の高いPPCキャンペーンに、より多くの予算を割り当てることができます。

不動産会社で働く例に戻ると、複数の地域で全国規模の検索広告を展開しているが、北西部の販売地域の優先順位が南西部の販売地域よりも高い場合、北西部のPPCキャンペーンに予算をより多く使うことができるのです。両方の地域の最大CPCが$0.50であると仮定すると、北西部でより多くのクリックを達成するために、北西部でより高い1日の支出を割り当てることができます。北西部地域の1日の支出額を200ドル、南西部地域の1日の支出額を100ドルとすると、次のような計算が成り立ちます。

- **「Number of clicks in the northwest region = Daily Spend / CPC = 200USD/0.50USD = 400 clicks」**
- **「Number of clicks in the southwest region = Daily Spend / CPC = 100USD/0.50USD = 200 clicks」**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4d2e7edf-34f2-551b-bef8-145da6caf1be.png" width="700">

1日の消費額の差から、北西地域の支払いたいと思うクリック数（濃い青のデータポイント）は、南西地域の支払いたいと思うクリック数（薄い青のデータポイント）より多くなっています。キャンペーン中に1日の消費額をコントロールすることで、各地域のパフォーマンス成果を管理することができます。

# Activity Exemplar: Set performance goals

- CTR（クリックスルー率）
    - 広告がクリックされた回数を広告の表示回数（インプレッション数）で割ったもの
- CVR（コンバージョンレート）
    - 広告が受け取ったコンバージョン数を広告の総インタラクション数（クリック数）で割ったもの

https://docs.google.com/document/d/1RWnDOeXtR4Kslth1kAgKeiwyma2HA3nlhgJQ4vhKjWk/template/preview?resourcekey=0-hJsmyb_CmvKHxWk0xc_0bA
scikit-learnによる株価分析

AIに触れ始めて、最初に興味を持った株価分析について、まとめておきたいと思います。

### 概要

scikit-learnを利用して直前4日間の架空の株価から、当日の株価の上下を予想する。


### ・株価の学習と予測
stock_price.txtにフェイクの株価データが格納されている。
読み込んで変化率に変換し、4日分の変化率から次の日の株価の上下を予測するようにサポートベクターマシンを訓練する。

`*サポートベクタマシン（Support Vector Machine、SVM）は、機械学習の分野で広く用いられる教師あり学習のアルゴリズムの一つ。SVMは、与えられたデータを分類する境界線（決定境界）を決定するために使用される。`

```Python:Python
from sklearn import svm
from sklearn.model_selection import train_test_split

with open("株価のデータ", "r") as f:
  stock_file_data = f.read() #ファイルの読み込み
stock_file_data = stock_file_data.split() #改行で分割しリストに格納
stock_data = []
for stock_string in stock_file_data:
  stock_data.append(float(stock_string)) #小数に変換したうえでリストに格納
```


```Python:Python
# 株価の変化率
ratio_data = []
for i in range(1, n_price):
    ratio_data.append(float(stock_data[i] - stock_data[i-1]) / float(stock_data[i-1]))
    # (i番目の日の株価の値-前日の株価の値)÷前日の株価の値
n_ratio = len(ratio_data)
```
`
*株価の変化率は前日比
`
```Python:Python
# 前日までの4連続の変化率のデータ
successive_data = []
answers = []  # 正解値 価格上昇: 1 価格低下: 0
for i in range(4, n_ratio):
    successive_data.append([ratio_data[i-4], ratio_data[i-3], ratio_data[i-2], ratio_data[i-1]])
    if ratio_data[i] > 0:
        answers.append(1)
    else:
        answers.append(0)
```

入力として使うのは前日までの4連続の変化率のデータ

```Python:Python
#訓練用データとテスト用データの分割
x_train, x_test, t_train, t_test = train_test_split(successive_data, answers, shuffle=False)  # シャッフルしない
```


過去のデータを使って未来のデータの予測を行いたいので、この2つのデータのシャッフルは行わない。

```Python:Python
clf = svm.SVC()  # サポートベクターマシーン
clf.fit(x_train, t_train)  # 訓練

y_test = clf.predict(x_test)  # テスト用データで予測
```
```Python:Python
# 末尾の10個を比較
print ("正解:", t_test[-10:])
print ("予測:", y_test[-10:])

# 正解率の計算
correct = 0.0
wrong = 0.0
for i in range(len(t_test)):
    #予測結果と正解の比較
    if y_test[i] == t_test[i]:
        correct += 1.0
    else:
        wrong += 1.0
print ("正解率:", str(correct / (correct+wrong) * 100), "%")
```
表示した結果がこちら。

正解: [0, 0, 0, 1, 0, 0, 0, 1, 1, 0]
予測: [0 0 0 0 1 0 0 0 1 1]
正解率: 56.71342685370742 %


約57％という結果となりました。
そこまで高い数値とはなりませんでしたが、勘で予想するよりかは少し高いですね。
架空のデータを利用しているので、データを変えれば結果も変わると思いますし、単純にデータ量を増やしてやってみれば精度は高まっていくのではないかと思います。

実際のデータでもやってみて、分析が合っているかをチェックするのも面白そうです。
金融リテラシーが必須の世の中なので、株価とか分析してたらカッコいいですよね。笑笑


### まとめ
今回はライブラリのすごさを感じることができたのが大きな収穫です。
覚えるのは絶対に無理ですが、こういったことをこのライブラリを使えばできるんだな！ということが頭にあれば、あとは調べるだけ。って感じですね。

自分の振り返り用みたいな記事ですが、
こんな感じなのか！とちょっとでも参考になれば幸いです。
tokenで上手くいかない時にSourcetreeとGitHubを接続する方法（Mac）

# はじめに
新しくMacBook Airを買ったのでSourcetreeをGitHubに接続しようとしたところ、かなり沼ってしまったのでどうやって行ったか忘備録として残します。

ネットで検索してみるとSSHキーを作るだのPersonal Access Tokenを作るなどいろあっていろいろ試してみたのですがうまくいきませんでした。結局はSSHキーを作って何とかなったのですが、その前に同じことをしてうまくいかなかった気がするので何で成功したか正直よくわかりません。

# ~~対処法~~

https://sunny10side.com/how-to-connect-and-use-github-and-sourcetree-mac-version/#link2

~~ここにあるSSHでの提携法に書いてあるとおりにしたらうまくいきました。上に載ってるトークンを使う方法では~~
```
fatal: cannot exec 'git-remote-https': Bad CPU type in executable
```
~~とでて接続できませんでした。~~



# ~~さいごに~~
~~人様が作ったサイトのリンクを貼るだけじゃこのページの存在意義ないですね()
上記のページのおかげで大変助かりました。Windowsでの方法は[昔自分が書いたことがある](https://qiita.com/jisoku103/items/00aa6efcd63abf280d8a)のでよろしければご覧ください。~~

# 追記
　翌日プッシュしようとするとまた上記のエラーが発生しました。
結論としては、GitHubのデスクトップ版をインストールし、ログインした上でリモートリポジトリをクローンすることで解決しました。
mysqlの外部キーを一括で消す方法

## どんな内容？
全文検索用のレプリケーションDB作成時やデータ移行などの場面でmysqlの外部キーを一括で消したくなる時がありますが、その効率的な方法を記載しています。

## 手順

#### STEP1 外部キー削除に必要な部分の抽出sql

```sql
SELECT TABLE_NAME,CONSTRAINT_NAME
FROM information_schema.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_SCHEMA = 'test_db' AND CONSTRAINT_TYPE = 'FOREIGN KEY';
```

#### STEP2 出てきた値をスプシに貼って、下記のようなINDEXのDROP文を作成する

```sql
ALTER TABLE something DROP FOREIGN KEY `somedb_another_id_3a4999a1_fk_somedb_another_id`;
```
※上記を利用してSTEP1の結果を挟むようにクエリを作る(concatenate関数を使うのががおすすめ)

#### STEP3 出来上がったクエリを流す


以上の手順で終わりです。
おうちKubernetesを増強してケースファンをつける

# 経緯

我が家にはおうちKubernetesがあります。MDF板を使って少し大きめなケースにラズパイを収めています。過去の記事はこちら

https://qiita.com/commojun/items/09237c71b3ad06dfcd3b

こんな感じのケースを作りました。ねこもいます。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f37303132312f30366465663637302d386639622d356432302d653432312d6135633132373737333562352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/2f44bc05-9d45-e29a-55ff-90d9012dbbab.png)


ごちゃごちゃしたケーブル類も全部箱の中に入って、なかなかすっきりできたのですが、一点課題がありました。こちらは各RaspberryPiのCPU温度のグラフです。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f37303132312f39306538386661662d343238352d323931312d346634342d3035623836373036636234372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/881cd20e-02f3-7cad-f42a-c88868a00d55.png)

箱の中に空気がこもってしまっているため、CPU温度が高くなってしまうという問題がありました。

今回はそれを解決し、ついでにRaspberryPiのノードも1台増やします。

# 取り付けるファン

RaspberryPiに取り付けるファンの定番といえばこんな感じのやつですよね。
https://www.amazon.co.jp/dp/B07WH63ZNX

しかし個人的な経験則として、こういう小さなファンほど騒音が気になりがちかなと思いました。また、今回は箱の中にラズパイを収めているため、箱の空気を入れ替えるようなエアフローを作る必要があると考えました。

そこで、自宅に余っていた自作PC用の120mmPCケースファンを使うことにします。こんな感じのやつです。

https://www.amazon.co.jp/dp/B009MDBIHU

# 電源の取り方

RaspberryPi用の小型ファンであれば、GPIOピンにつなげることで本体の電源と連動してファンが回ってくれます。今回のケースファンでも同じことができると思ったのですが、ラズパイのGPIOピンの出力は最大5Vなのに対し、ケースファンに必要とされる電圧は12Vでした。

そこで、今回はこのようなUSB-ケースファン端子を変換するケーブルを使って、ラズパイのUSB端子から電源を供給するようにしてみました。
https://www.amazon.co.jp/dp/B07WW54Z4T

USBも基本的に電圧は5Vなので、この商品のように昇圧回路が組み込まれているものが必要となります。

# 背板を設計する

ケースファンは箱の背面にピタッとくっつけることにしました。そのため、ファンの風を通す穴、ビスを通す穴、電源ケーブルを通す穴の空いた背板を設計することにしました。ケースファンの寸法を測って、Fusion360で設計してみました。

こんな感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/52cc0d04-6701-6040-1fe9-6588260ed944.png)

これを図面にしてシール用紙に印刷し、MDF板に貼り付けて切り出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/a0cf5ecf-9606-8fc7-7314-d414e855272f.png)

レーザーカッターとかあればいいですが、持ってないのでこういうDIYツールで頑張って切り出しました。

https://www.amazon.co.jp/dp/B08BJ67S1C

# 組み立て

背板にファンを固定してみました。ハンドクラフトの割にぴったりで自分でも驚いています。

![IMG_20230124_164142.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/5a3956ad-73bd-447f-dfc4-26afba481360.jpeg)

箱に組み込んでこうなりました。

![IMG_20230126_220310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/58d7c9c3-e790-ead2-de67-3106870be5c0.jpeg)

思い切り飛び出しているけど中身もスペースが厳しいのでこれでよしとします。

中はこんな感じになりました。RaspberryPi4Bを1台追加しています。こちらはあまり特筆することは無いですが、SSDでOSが起動するようにしました。

![IMG_20230125_121143.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/24fe464b-9874-a41d-2bed-1cb203a8d5ea.jpeg)

# 結果

120mmという大きなファンを搭載したので、音はそんなに気にならないほどだと思います。なので、負荷による回転数の制御とかもしなくていいかなと思っています。

箱の中の空気が流れるようになったので、CPU温度は大幅に改善しました。これで安心かも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70121/36fcb438-c928-8ac8-f18a-754bacc7c5e8.png)

# まとめ

空気のこもっていたおうちKubernetesクラスタのケースにPCケースファンを搭載しました。Fusion360を使っての背板の設計にも挑戦してみました。こういうふうに、PCケースの自作みたいなことにも気軽に挑戦できるのもおうちKubernetesの楽しいところかもしれません。
極み-Home

# このページについて
極みが書いた記事をまとめたページです。

# トリップについて
トリップの機構について初心者にもわかりやすく（たぶん）説明しています。
トリップについて知りたい方はまずこちらをご覧ください。

https://qiita.com/KiwamiTrip/items/863baf9e82064603c22d

# 人狼Onlineにおけるトリップのつけ方
人狼Onlineで入村する際にトリップをつける方法について簡単に解説しています。

https://qiita.com/KiwamiTrip/items/565c8882ca026e347900

# トリップ関連用語集
トリップ関係の話をするとき、またトリップ関係のサイトでよく使われている単語について解説しています。
わからない用語がある際はこちらをご覧ください。

https://qiita.com/KiwamiTrip/items/10cdf41ddd2bcafac7f8
いまさらCIFAR-10をダウンロードして画像として保存する

## この記事を読むべき人

簡単に言えば、cifar10を画像として保存して使いたい人。
pytorchとかkerasとかでダウンロードしてチュートリアルはできるけど、凝ったことをするために画像として保存しつつ、色々いじいじしたい人向け。

意外とドンピシャなコードが落ちてないので、備忘録も兼ねて記載。

## コード全体
```python: main.py
import os
import tarfile
import requests
import pickle
import joblib
from PIL import Image
import numpy as np
import tqdm


# Download the tar.gz file
def download_cifar10(save_dir):
    url = "https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz"
    header = requests.head(url).headers
    size = int(header["Content-Length"])
    with open(os.path.join(save_dir, "cifar-10-python.tar.gz"), "wb") as f:
        pbar = tqdm.tqdm(total=size, unit="B", unit_scale=True)
        for chunk in requests.get(url, stream=True).iter_content(chunk_size=1024):
            ff = f.write(chunk)
            pbar.update(len(chunk))
        pbar.close()


# Unpickle the file
def unpickle(file):
    with open(file, "rb") as f:
        dict = pickle.load(f, encoding="bytes")
    return dict


# Save cifar10 image
def save_image(label, data, fname, type="train"):
    img = data.reshape(3, 32, 32)
    img = np.transpose(img, (1, 2, 0))
    pil_img = Image.fromarray(img)
    dir = f"./data/cifar-10/{type}/{label}"
    os.makedirs(dir, exist_ok=True)
    pil_img.save(f"{dir}/{fname.decode('utf-8')}")


save_dir = "./data"
os.makedirs(save_dir, exist_ok=True)
print(f"Process start: save directory={save_dir}")

print("Download the CIFAR10.")
if not os.path.isfile(os.path.join(save_dir, "cifar-10-python.tar.gz")):
    download_cifar10(save_dir)

print("Extract tar.gz.")
with tarfile.open(os.path.join(save_dir, "cifar-10-python.tar.gz"), "r:gz") as tar:
    tar.extractall(path=save_dir)

print("Save the training data as png.")
for i in range(5):
    unp = unpickle(os.path.join(save_dir, f"cifar-10-batches-py/data_batch_{i+1}"))
    joblib.Parallel(n_jobs=-1)(
        joblib.delayed(save_image)(label, data, filename)
        for label, data, filename in zip(
            unp[b"labels"], unp[b"data"], unp[b"filenames"]
        )
    )

print("Save the test data as png.")
unp = unpickle(os.path.join(save_dir, "cifar-10-batches-py/test_batch"))
joblib.Parallel(n_jobs=-1)(
    joblib.delayed(save_image)(label, data, filename, "test")
    for label, data, filename in zip(unp[b"labels"], unp[b"data"], unp[b"filenames"])
)

print("Done.")

```

## 実行結果

実行すると、スクリプトと同階層にdataフォルダが作られて、tar.gzがダウンロードされて、展開されて、画像として保存されます。

```
Process start: save directory=./data
Download the CIFAR10.
100%|██████| 170M/170M [00:27<00:00, 6.19MB/s]
Extract tar.gz.
Save the training data as png.
Save the test data as png.
Done.
```

以上。
PHP selectタグで変数格納

```select.php
<?php

$selected_value = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['my_select'])) {
        $selected_value = $_POST['my_select'];
        echo "選択された値: " . $selected_value;
    } else {
        echo "値が選択されていません。";
    }
}

$html = <<<EOT
<!DOCTYPE html>
<html>
<head>
    <title>PHP Select Example</title>
</head>
<body>
    <form action="{$_SERVER['PHP_SELF']}" method="post">
        <select name="my_select">
            <option value="option1">オプション1</option>
            <option value="option2">オプション2</option>
            <option value="option3">オプション3</option>
        </select>
        <input type="submit" value="送信">
    </form>
</body>
</html>
EOT;

echo $html;
?>
```
IBM Db2 for LUWの照会パフォーマンス改善を簡単に！ db2advisコマンドを使ってみよう！

## IBM Db2 for LUWの照会パフォーマンス改善を簡単に！db2advisコマンドを使ってみよう！

SELECT文のパフォーマンス改善に有効なものとして、一般的によく知られているものとして、効果的な索引の作成(CREATE INDEX)があります。

Db2 for LUWユーザーの方が
「改善対象のSELECT文があり、それに効果的な索引をできるだけ簡単に作りたい。」時、
お役に立てるのがDb2の標準機能であるdb2advisコマンドです。

このコマンドへ照会パフォーマンスを改善したいSELECT文を入力値として与えると、効果的な索引を作成するためのCREATE INDEX文を出力してくれます。
では基本的な使い方を見てみましょう。

**基本的な使い方 例１**
```
db2advis -d prototype -s "select * from addresses a
   where a.zip in ('93213', '98567', '93412')
   and (company like 'IBM%' or company like '%otus')"
```
この例１の’-d prototype’はデータベース名を意味します。
‘-s “select * from addresses a…..”’は、改善したいSELECT文になります。

「パフォーマンスを改善したいSELECT文が複数ある。または、改善したいのはもっと長くて複雑なSELECT文なのだけれど。」という場合は、テキスト・ファイルを作成し、その中に複数あるいは複雑なSELECT文を記述し、そのファイル名を入力値として与えることもできます。
これを例２として示します。

**基本的な使い方 例２**
```
db2advis -d sample -i db2advis.in -t 5
```
この例の’-d sample’は、データベース名です。
’-i db2advis.in’は、SELECT文が記述されたファイル名になります。
’-t 5’は、db2advisコマンドが解決策を出すまでに許容できる時間を与えます。
(分単位。この例では5分。0(デフォルト値)は無制限です)

次の例は、db2advis.in という入力ファイル内に複数のSELECT文、 および各SELECT文が実行される頻度を指定しているサンプルとなります。
```
--#SET FREQUENCY 100
SELECT COUNT(*) FROM EMPLOYEE;
SELECT * FROM EMPLOYEE WHERE LASTNAME='HAAS';
--#SET FREQUENCY 1
SELECT AVG(BONUS), AVG(SALARY) FROM EMPLOYEE;
   GROUP BY WORKDEPT ORDER BY WORKDEPT;
```
今回はdb2advisコマンドの基本的な2つの使用例をご紹介しました。
詳細な説明は割愛しますが、db2advisコマンドは内部で表に関する統計情報(レコード数、ページ数、平均レコード長など)や既存の索引が存在する場合、その索引に関する統計情報も利用します。
このため、db2advisコマンドの実行前に、RUNSTATSコマンドを対象となる表に対して実行しておき、最新の統計情報が取得されている状態にしておくことをお勧めします。

また、db2advisコマンドが出力したCREATE INDEX文を実際に実行し、新しく索引を作成した場合も、新しい索引に基づいた統計情報を収集する必要があります。
通常、db2advisコマンドの出力にはCREATE INDEX文に加えて、RUNSTATSコマンドも出力されていますが、RUNSTATSコマンドについては、コメントになっています(RUNSTATSの前に--(マイナス・マイナス)が記述されている)。
このままですと、CREATE INDEXのみ実行され、db2advisによって生成されたRUNSTATSはコメントとして扱われ、実行されないです。
db2advisが出力するRUNSTATSコマンド部分も確実に実行したい場合は、コメントを意味するRUNSTATSコマンドの前の--を削除し、生成されたRUNSTATSが実行されるようにしてください。

db2advisコマンドは、効果的な索引を提示するだけでなく、次のようなもっと高度なアドバイスをユーザーに提示することも可能です。
その他の考慮点などを含め、詳細はDb2のマニュアルをご参照ください。


・マテリアライズ照会表 (MQT)の作成
・表の再パーティション化
・マルチディメンション・クラスター化 (MDC) 表への変換
【Unity】Unityで３画面以上のマルチディスプレイをレイアウトする方法

Unityで３画面以上のマルチディスプレイをwindows向けアプリのexeでレイアウトする方法

①Camera毎のレンダリングDisplay情報
Camera.targetDisplay

②モニター情報
Display.displays[int]

①と②の番号は異なることが多い
∵②はwindows側の管理だから

〇目的を簡単に達成するには
1)モニターの最大数：Display.displays.length
2)Camera.targetDisplayの値をDisplay.displays.length-1の範囲で、設定画面にて可変にする。

※但し
Display.displays[0]は必ずWindows上のメインディスプレイになっているので、Camera.targetDisplay:0で固定して置く。
２画面構成の場合、メインディスプレイが固定されるのでサブディスプレイはCamera.targetDisplay:1として置くだけで良い。

※Unityのバグ
2022.2.11f1時点
Camera.targetDisplayが変更できないバグが放置されている。
https://forum.unity.com/threads/i-cant-set-a-cameras-targetdisplay-property-using-c-in-unity2022-2-editor.1394476/
2022以外では起きない。
2023最新版では修正済。
【Unity Azure Kinect】windows向けEXEで動かすための必要DLL＜KinectSensor1.4.1 / BodyTracking1.1.2＞

※exeファイルと同一階層にコピーが必要なもの
cudnn64_8.dll
cudnn_cnn_infer64_8.dll
cudnn_ops_infer64_8.dll
cufft64_10.dll
dnn_model_2_0_op11.onnx
onnxruntime.dll
【学生必見】GitHub Copilotを無料で使う方法

# はじめに

やあみんな、技術の食いつき虫[Rei](https://twitter.com/noll6451)だよ:v:！
- IDEACTIVE JAPAN PROJECTの学生アンバサダー
- GiTHub Campus Expert Trainee
- フロントエンドもバックエンドもネットワークプログラミング、SRE等
いろいろやっているよ
ぜひフォローしてね
https://linktr.ee/Rei_suzuki

## きっかけ
普段は、コーディングのほうが好きだから、技術記事を書かないんだけど、
- 自分が入っている[STECH](https://stech.careerselect.jp/)という団体のイベント(Qiita投稿大全)をやっている
- ChatGPT(GPT3.5、GPT4)やらGithub Copilot(Voice,X,Labs等)まで色んな技術が出てきすぎて、書かないといけないなあと思った。

STECHについてもっと知りたい・入ってみたいという人は
https://stech.careerselect.jp/
イベントに関して知りたい人は
https://twitter.com/STECH_FES

# この記事の対象者
- GitHub Copilotが気になっている
- GitHub大好き学生
- というかも学生
- [GitHub Global Campus](https://education.github.com/)に申請したけど使いこなせてない学生
- GitHub Campus Program partner schoolsに通っている学生・先生
    - 対象校かどうかはhttps://education.github.com/schools

# GitHub Copilotとは何ぞや

公式ページを見ると
より速く、より少ない作業でコードを書くことを支援するAIペアプログラマーと書いてある

要するに
賢くコードを提案してくれるということなんですね

![GitHub_Copilot.js-Visual-Studio-Code-2023-03-23-12-21-55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1393075/f2da612d-b81f-021c-6d02-472c2e31b6dc.gif)


上の画像だと、JavaScriptでやっていますが、他の言語でもできます
精度が高いのは、Python、JavaScript、TypeScript、Ruby、Go、C#、C++あたりです
しかもコメントからコード候補を生成するもできます(開発効率上がりますね！！)


# 無料で使う方法
### 前提

GitHub Global Campusに入る必要がある(GitHub Student Developer Packを申請している方は自動的に入ってます)
はいってない人は、学生メールアドレスと学生証を用意して申し込みましょう！
https://education.github.com/


### やること

まずはこのページにアクセス

https://github.com/features/copilot/

下にスクロールすると
![ホームページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1393075/b8d5ce3c-a990-816b-a7f0-cd1257358d7a.png)

が出てくるので、左側のindividualsの「Start a free trial」を押す

え！無料って制限付きなの！と思った方安心してください。
下のようになっていれば、制限なくつかえますよ！
![copilot無料.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1393075/4922ca8c-c9a2-1358-33b6-6bf52f7b7f34.png)


[Get access to GitHub Copilot]のボタンを押して

![copilot設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1393075/dc8560ed-5666-2922-1e99-1ae81ae06600.png)


ここでは
- GitHubに公開されているコードと一致する提案を許可するか選択します(Allowでいいと思います)
- GitHubが自分のコードを製品改良のために使用することを許可するかどうか選択します(お好み)
- 「Save and get started」を選択します

## お好みのエディタにインストール

- Visual Studio Code
- Visual Studio
- JetBrains
- Neovim
に対応しているのですが、拡張機能が用意されているので、どれも簡単にインストールできます

手順は、分かりやすいのがここにあります。
https://docs.github.com/ja/copilot/getting-started-with-github-copilot

注意点として
下のように拡張機能がいくつかあることがありますが、GitHub Copilotを選択してください。(他のは、ベータ版で特定の人しか使えない状況です。自分も今試しているので、いづれか記事にしますね笑)

![スクリーンショット 2023-03-23 130252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1393075/ffe5a7ef-9a78-6e4e-c617-39b12188f243.png)


それでは、よいGitHubライフを～～:hand_splayed:
20締で年月度と年度を求める関数をVBAで作る

### 環境
Excel 2019で検証

###経緯
20締で月度と年度が必要になりました。
標準関数でも作成できそうですが、関数の入れ子が気持ち悪いので作成してみた。

### 年月度を求めるコード

引数：日付
戻値：計上年月度

```
Function get_getsudo(mydate As Date) As String

    Dim myyear
    Dim mymonth
    Dim myday
    
    myyear = Year(mydate)
    mymonth = Month(mydate)
    myday = Day(mydate)

    If myday >= 21 Then
        myday = 21
        mymonth = mymonth + 1
        
        If mymonth = 13 Then
        mymonth = 1
            myyear = myyear + 1
        End If
      Else
    End If
    
    get_getsudo = myyear & "年" & mymonth & "月度"

End Function
```

### 年度を求めるコード

引数：日付
戻値：計上年度。１～３月は前年度です。

```
Function get_getnendo(mydate As Date) As String

    Dim myyear
    Dim mymonth
    Dim myday
    
    myyear = Year(mydate)
    mymonth = Month(mydate)
    myday = Day(mydate)

    If myday >= 21 Then
        mymonth = mymonth + 1
        
        If mymonth = 13 Then
            myyear = myyear + 1
        End If
      Else
    End If
    
    If mymonth <= 3 Then
        myyear = myyear - 1
    End If
    
    get_getnendo = myyear & "年度"

End Function
```
ソフトウェア開発委託契約について

:::note warn
本記事は、[ITビジネスの契約実務〔第2版〕](https://www.amazon.co.jp/IT%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%81%AE%E5%A5%91%E7%B4%84%E5%AE%9F%E5%8B%99%E3%80%94%E7%AC%AC2%E7%89%88%E3%80%95-%E4%BC%8A%E8%97%A4-%E9%9B%85%E6%B5%A9/dp/4785729031)をもとに、記述しています。
:::

受託開発企業でwebエンジニアとして勤務しています。
自分がどんな契約のもとで働いているかを知ることで、
業務にも活かせると思いソフトウェア開発委託契約について勉強したのでまとめます。

# ソフトウェア開発委託契約について
ソフトウェア開発委託契約とは、ソフトウェアの発注者がシステムベンダに対してソフトウェア開発に関する業務を委託する際に締結する契約のことです。
ソフトウェア開発の契約書で以下のことを意識する必要があります。
- 当事者間の権利義務関係を明確にする
- 紛争を防止する
- トラブルが生じた場合は解決・清算のための指針となる
- ソフトウェアの完成に向けて行動するための指針となる

ソフトウェアを開発では、契約締結後もユーザとベンダでやりとりは続くので開発プロセスにおける両者の役割や行動に関する指針を契約書で定義しておく必要があります。

# 多段階契約方式と一括契約方式について
契約の構成には、多段階契約方式と一括契約方式があります。

### 多段階契約方式
ソフトウェア開発を複数の工程に分けて工程ごとに個別契約を締結する構成です。
大規模なソフトウェア開発に関して、用件定義が定まってない状態では必要な工数や期間等を正確に見積もることが難しいです。
ベンダは規模を過小に見積もってしまうリスクがあり、ユーザはベンダがバッファを見込んだ見積りを提示する可能性があるのでどちらにとってもデメリットがあります。
工程ごとに個別契約を締結することで上記の問題を解消できます。

### 一括契約方式
ソフトウェアの完成までを一括で請け負う構成です。
規模が小さいソフトウェア開発では、見積りの振れ幅が小さいので複数の個別契約について交渉・締結の手続きを行う方が手間になることがあります。
このことから規模が小さいソフトウェア開発では一括契約方式の方が効率が良いこともあります。

# 請負契約と準委任契約について
ソフトウェア開発における個別契約では、請負契約もしくは準委任契約として締結されるのが通常です。

### 請負契約
あらかじめ決められた成果物を納品すること等、仕事の完成を目的とします。

### 準委任契約
事務の処理（エンジニア等の専門的スキルの提供）を目的とします。

請負契約か準委任契約かというのは、契約の名称や条項に記載することによって定まるものではなく契約書の実質的な内容や作業の実態等に基づいて定まるものです。

**請負契約と準委任契約の性質の比較**
|  | 請負契約 | 準委任契約 |
| --- | --- | --- |
| 委託の主題 | 仕事の完成 | 事務の処理 |
| ベンダの義務 | 仕事を完成させる義務 | 善良なる管理者の注意をもって事務処理を行う義務 |
| ベンダの主な責任 | ・仕事の完成が遅れたことによる債務不履行責任 <br> ・契約の内容に適合しない目的物を引き渡した場合における契約不適合責任 | 善良なる管理者の注意を払わないことによる債務不履行責任 |
| 報酬支払時期 | 目的物の引き渡しと同時 | ・委任事務を履行した後 <br> ・期間によって定めたときは期間の経過後 <br> ・成果の引き渡しを要するときは引き渡しと同時 |
| 中途終了時の報酬 | 可分な部分について注文者が受ける利益の割合に応じて請求可能 | 既にした履行の割合に応じて請求可能 |
| 解除 | 債務不履行解除 | 債務不履行解除 |
| 任意解除（解約） | 完成前は、ユーザはいつでも解除できる（ただし、損害賠償義務あり。） | 両当事者はいつでも解除できる（ただし相手方に不利な時期に解除すると損害賠償義務あり。） |

準委任契約は完成の責任を負わない契約であり請負契約よりもベンダに有利であると評価されることがありますが、それは正しい評価ではありません。
請負契約は仕事の完成を目的という重い責任を負いますが、
準委任契約だからベンダは事務を履行すれば良いということではありません。
準委任契約においてもベンダは適切に業務を遂行する義務を負うので、業務の遂行や結果に問題があれば責任を問われます。

# 成果報酬型の準委任契約について
事務の履行により得られる成果に対して報酬を支払う成果報酬型の準委任契約というものもあります。
成果の引き渡しが必要な場合は、成果の引き渡しと同時に報酬が支払われます。
成果に対して報酬が支払われるので、請負契約と類似していますがベンダがその成果を達成する義務を負っていないという点が請負契約との違いです。

# まとめ
ソフトウェア開発委託契約の方式と種類についてまとめてみました。
実際に契約に関する業務を行うことはありませんが、
自分はどんな契約のもとで働いているのか理解したかったので理解するために必要な知識は学べたかなと感じています。

# 参考文献
[ITビジネスの契約実務〔第2版〕](https://www.amazon.co.jp/IT%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%81%AE%E5%A5%91%E7%B4%84%E5%AE%9F%E5%8B%99%E3%80%94%E7%AC%AC2%E7%89%88%E3%80%95-%E4%BC%8A%E8%97%A4-%E9%9B%85%E6%B5%A9/dp/4785729031)
スクラム開発について

スクラム開発を導入しているチームにjoinして約3ヶ月が経過したので
実施しているスクラムイベントの内容と開発メンバーとして感じたことをまとめます！

# スクラムについて
アジャイル開発の手法の一つとしてスクラムがあります。
アジャイル開発は、短期間の開発サイクルを持ち継続的にサービスをリリースすることでユーザーのニーズに柔軟に対応できる開発概念で
スクラムの特徴は、チームを組みコミュニケーションを密に取りながら課題を解決していくことだと考えています。
スクラムイベントなどのルールや指針は[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)に記載されているので、それを元にしてそれぞれのチームに合った形で実施するのが良いと思います。
チームそれぞれで持っている課題は違うので、自由度が高いスクラムは汎用性の高い開発手法だと考えています。

# スプリントの流れ
私が参加しているチームでのスクラムイベントについてまとめます。
1~5のスクラムイベントを1週間単位で繰り返しています。
1. スプリントプランニング（1.5h）
前のスプリントで消化したタスクの確認を行い、次のスプリントで対応するタスクを決めます。
対応するタスクが決まったらそのままタスク分解の時間を取っています。
タスク分解では、必要な作業をチケットというもう一段階細かい粒度に分けていきます。
タスク分解をチームで行うことでチームメンバー全員が作業内容を把握している状態になっています。
2. デイリースクラム(0.25h)
毎日実施しタスクの進捗を共有をします。
3. プロダクトバックログリファインメント(1h)
PdMからタスクの共有を受けてストーリーポイント付けを行い、チームで開発内容の認識合わせを行います。
この時間でタスクに対する疑問点を解消しておくことで、次スプリントでスムーズな開発を行うことができています。
4. スプリントレビュー(1h)
消化したタスクのお披露目会です。
開発チームだけでなくビジネスチームも含めて開発した内容の共有やデモを行ったりします。
定期的に開発チーム以外の人とコミュニケーションを取れる機会があるのは開発チームに良い影響を与えていると思います。
5. 振り返り(0.5h)
スプリントを振り返ってざっくばらんに良かった点と改善できそうな点を挙げて話し合いをします。
スクラムマスターが意見出しをしやすい環境を作ってくれているおかげで、
メンバーが主体的にスクラムイベントをより良くしようとする動きが活発になっています。

# 感じたこと
### 柔軟性のある開発が行える
サイクルがあることで細かい粒度にタスク分解をする習慣があり、スプリントを跨ぐタスクがほぼ無い状態を保てています。それにより優先度に応じた開発ができています。
また、タスクが細かい粒度になっているおかげで開発自体も進めやすいです。
ユーザーにいち早くサービスを提供できる環境になっているなと感じました。

### チームの団結力が強い
今まで参加したチームの中で一番コミュニケーション量が多いです。
メンバーの人柄もあるとは思いますが、やはりスクラムイベントがメンバー間のコミュニケーションを活発にしていると思います。
メンバー間のコミュニケーションが活発だとチームとして開発を進めている感が強く、
開発の属人化も防げているのでスクラムの良い点が出ているなと感じています。

### 同期コミュニケーションは大事
前に所属していたチームが非同期コミュニケーションを推奨していたのもあり、
スクラムイベントだけで週4.5hも同期コミュニケーションを取っている、他のmtg等も入ってきたら作業する時間がどんどん少なくなるのでは？と不安がありました。
実際にスクラムイベントを経験してみた結果、
振り返りで日々スクラムイベントのブラッシュアップを行なっていることを知り
今の形式がチームに取って必要な時間だと実感できたので個人的に作業時間に対する不満が出てくることはありませんでした。

# まとめ
私のチームでは、「ユーザーに少しでも早くサービスを届けること」を目的としてスクラム開発を採用しています。
実際にチームに参加してみて、スクラム開発は目的を達成するために必要だと実感しています。
スクラムの形に正解はなく、チームそれぞれで違うと思います。
本記事が他のチームのスクラムの参考になれば幸いです。
エラー文"Unable to load dynamic library 'php_pdflib.so' "の解決法

## エラー内容

```
PHP Warning:  PHP Startup: Unable to load dynamic library 'php_pdflib.so' 
(tried: /usr/lib64/php/modules/php_pdflib.so
 (/usr/lib64/php/modules/php_pdflib.so: 
cannot open shared object file: No such file or directory), /usr/lib64/php/modules/php_pdflib.so.so 
(/usr/lib64/php/modules/php_pdflib.so.so: cannot open shared object file
: No such file or directory)) in Unknown on line 0 
```

## 解決方法

1 php.iniファイルを開くために、ターミナルで以下のコマンドを実行します。

```
php -i | grep "php.ini"
// Configuration File (php.ini) Path => /etc
// Loaded Configuration File => /etc/php.ini
```

2 viなどのエディタを使用して、上記コマンドで表示されたphp.iniファイルを開きます。
※上記の 『Configuration File => /etc/php.ini』を参照します。
```
vi /etc/php.ini
```


3 php_pdflib.soと記載されている行を削除するか、コメントアウトします。
コメントアウトする場合は、以下のように;を行の先頭に追加します。


```
;extension = php_pdflib.so
```

4 変更内容を保存します。

※特にVagrantやDockerを使用している場合は、
変更が反映されるように注意してください。
port 22: Operation timed outエラー

AWS初学者ですが、ターミナル上でSSH接続しようとしたら下記のエラーが出て苦しめられたので、ここに対策を書いていきます。

同じエラーが出ている方がいたら参考になればと思います。

↓ちなみにAWS学習はこのサイトを見ながら進めていました。その途中で起きたエラーです。
https://zenn.dev/naoki_mochizuki/books/1471ce20222227


```
cd ~/.ssh
$ ssh -i "*****.pem" ec2-user@**.**.**.**

ssh: connect to host ec2-**-**-**-**.ap-northeast-1.compute.amazonaws.com port 22: Operation timed out

※*はただの伏字なので気にしないでください
```



色々なサイトの対策記事を見てみましたが、どれもエラーの原因と解決法がバラバラでどれを参考にすればいいかわからなかったので、公式ドキュメントをチェックしました。
あまり期待してなかったのですが、AWSの公式ドキュメントはエラーが起きたときの原因と対処法が細かく書いてあってわかりやすかったので参考にしました。

https://repost.aws/ja/knowledge-center/instance-vpc-troubleshoot

このページに書いてある解決方法の上から順にこなしていくことにしました。

# ①セキュリティ設定で適切なアクセスが許可されていることを確認する

```・SSH を使用して IP アドレスからインスタンスへのアクセスを許可するようにセキュリティグループにルールを追加します。```

→タイプSSH  プロトコルTCP ポート範囲は22 ソースはマイIPで問題なさそう。

```・インスタンスがシステムおよびインスタンスのステータスチェックにパスしていることを確認します。```

→パスしていることを確認済み

# ②ネットワーク ACL でインスタンスへのアクセスが許可されていることを確認する
```・インバウンド、アウトバウンド共にルールがデフォルトのネットワーク ACL 設定と異なっているかどうかを確認します。```

→デフォルトのままだったので問題なし

# ③VPC ルートテーブルがインターネットとの間のトラフィックを許可していることを確認する　←原因これでした！

```インターネットゲートウェイをポイントするデフォルトルート (送信先が 0.0.0.0/0 であるルート) があることを確認してください```

**プロジェクト*******ap-northeast-1に送信先（0.0.0.0/0）がない！**

「[Destination] (送信先) が 0.0.0.0/0 で、インターネットゲートウェイ ID を [Target] (ターゲット) に持つ新しいルートを追加します。」
の通りに実行したら無事解決しました！！

# あとがき
port 22: Operation timed outエラーはいろんな原因が考えられるので、検索しても自分のエラー原因と合致している記事がなかなかでてこなかったりします。
公式ドキュメントを見るのが一番ですね！


参考:

https://zenn.dev/kumackey/articles/398645b471fb05d3814a
postgresql-12


```sh


sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

#PostgreSQLのインストール
sudo yum -y install postgresql12-server postgresql12-contrib

#PostgreSQLの初期化
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

#PostgreSQLの自動起動設定
sudo systemctl enable postgresql-12

#Postgresql.confの設定
sudo chmod 777 /var/lib/pgsql/
sudo chmod 777 /var/lib/pgsql/12/
sudo chmod 777 /var/lib/pgsql/12/data
sudo chmod 777 /var/lib/pgsql/12/data/postgresql.conf

#Postgresql.confの設定
sudo vi /var/lib/pgsql/12/data/postgresql.conf

#localhostのコメントアウトを解除する設定

pg_hba.confの設定
sudo chmod 777 /var/lib/pgsql/12/data/pg_hba.conf
```

pg_hba.confの設定（続き）
```
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     peer
#host    replication     all             127.0.0.1/32            ident
#host    replication     all             ::1/128                 ident

```

```
#アクセス権限の再設定

sudo chmod 700 /var/lib/pgsql/12/data

#PostgreSQLの再起動
sudo systemctl restart postgresql-12

```
#次回ユーザ設定から再開

```
【PHP】1つのxamppでPHPのバージョンを切り替えて使用する（PHP7 or 8 ⇄ 5）

# はじめに
今回は、XAMPP環境（PHP7 or 8）でPHP5を使えるようにするために、調査したことをまとめました。
`既存のxamppに別のバージョンのPHPをインストールし、PHPのバージョンを切り替えてApacheを起動する` イメージです。

PHP8 ⇄ 7の切り替えについては、以下参照ください。
[【PHP】1つのxamppでPHPのバージョンを切り替えて使用する（PHP8 ⇄ 7）](https://qiita.com/rikako_hira/items/571c6193c825bb8f6b8b)

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容のアウトプット

- PHPのインストール
- ComposerでPHPのバージョンを指定
- ApacheとPHPのbit数の関係

# 既存の開発環境
現状、既存のxamppに `PHP8` と `PHP7` が、インストールされています。

- xampp 8.1.10, 7.1.30　
- PHP 8.1.10, 7.1.30
- Composer 2.2.21
- Apache 2.4.54 (Win64)

# この記事の内容
1. PHPインストール
2. ComposerでPHPのバージョンを指定
3. Apacheのバージョン確認

# 1. PHPインストール
:::note 
今回、PHP5.6.28をインストールします。
:::

### 【１】 xampp5.6.28をダウンロード

- ダウンロード先

https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/

- ダウンロードするファイル
`xampp-win32-5.6.28-1-VC11.zip`

### 【２】 既存のxamppフォルダー内のファイル名を変更
以下2点の、ファイル名を変更する
- xapmm/php → php8110
- xampp/apache　→　apache_win64

Tips:
ファイル名は任意です。
ここでは、 `ファイル名 + バージョン`(php8110), `ファイル名 + bit数`(apache_win64)にしています。

### 【３】 既存のxamppフォルダー内に、ファイルを配置
先ほどダウンロードしたxamppのうち、ファイル名を変更した2点と同名のものを、既存のxamppフォルダーに配置する

**Tips：**
Apacheファイルごと配置する理由としては、
現状の `Apache2.4.54 (Win64)` では、 `PHP 32bit + VC11` を起動することができないためです。
そのため、`Apache2.4.23 (Win32)` を配置します。

### 【４】 PHPのバージョンを確認
以下コマンド実行し、phpのバージョンが確認できたら成功

```php
php -v
```


# 2. ComposerでPHPのバージョンを指定
### 【１】 composer.jsonを編集
xampp/htdocs/プロジェクト名/composer.jsonを、以下の通り編集する

```php
// 変更前
"phpunit/phpunit": "~4.0",

// 変更後
"phpunit/phpunit": "^5|^6|^7",
```

### 【２】 ComposerでPHPのバージョンを指定
以下コマンドを実行する

```php
// プロジェクトのディレクトリに移動
C:\Users\hoge-huga> cd C:\xampp\htdocs\プロジェクト名

// ComposerでPHPのバージョンを指定
C:\xampp\htdocs\プロジェクト名> composer config platform.php 5.6.28

// アップグレード or ダウングレードを適用
C:\xampp\htdocs\プロジェクト名> composer update
```

### 【３】 Apacheを起動
- .env ファイルを配置し、プロジェクトディレクトリで以下コマンドを実行

```php
Composer install
```

- Apacheを起動し、ブラウザが開いたら成功

<br/>

:::note warn
以下のような警告は無視してOKです。

**内容：**
パッケージhoge / hugaは廃止されました。使用しないでください。 代わりにhoge / hugaを使用してください。

```php
Package chumper/zipper is abandoned, you should avoid using it. No replacement was suggested.
Package jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.
//省略
```
:::

**上記警告について：**

https://qiita.com/nasubi987/items/8c49bc3e5ec0df45f776

# 3. Apacheのバージョン確認 
以下の通り、Apacheのバージョンとbit数を確認することができます。

- XAMPPのコントロールパネルを開く
- shellを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/5824c503-66cc-05fd-6621-d4cb4519f19c.png)
- `httpd -v` を実行

```
# httpd -v
Server version: Apache/2.4.23 (Win32)
Server built:   Jul  7 2016 11:13:22
```
巨視的空間膨張概念の思考実験（空間が動いたりはしないのか）

・序
空間をマクロで見たとき、遠くの銀河はより早く我々から遠ざかっており、光速をも越えるいると言われています。
この見えないポテンシャルをダークエネルギーと言ったりしています。
これを重力場として我々が認知する空間と定義したとき、斥力と考えられるかもしれません。
しかし光速不変の定理から考えると、これは矛盾します。
矛盾を無くす説明として用いられるのが、「膨らんでいく風船の表皮のようなもの」と例えられます。
空間が広がっている⇒空間が生成されていると捉えることが出来るでしょう。

・空間のスケールとダークエネルギー
全ての物質は空間の中にのみ存在しうるものだとします。
物理学で扱う単位は全て空間のスケールに依って定められています。
では、拡張する空間の中のスケール単位と収縮する空間の中のスケール単位の違いを、果たして我々は認識できるのでしょうか？
空間に拘束されて物質が存在しているのであれば、空間を図るスケールも相対的であり、観測する我々のスケールも相対的だと考えられます。
つまり自分の空間に紐づく物質からの観測では、その違いを観測することは不可能です。
これは何を意味するのかというと、空間が圧縮することも裏返せば、空間が広がっている（生成されている）と考えることが出来ると言う事です。
これがダークエネルギーの正体ではないでしょうか？

・空間とダークマター
ダークマターというものを定義する必要に迫られたのは、銀河の回転運動が力学的にその構造を維持できない速度で回転しており、また中心からの距離に応じた運動速度が物理的に説明がつかない速度差であるという事実を補完するためのパラメータとして数学的に予言されているものです。
しかし、重力による場の空間として考えたとき、何故空間自体が回転しているとは捉えられないのでしょうか？
ある銀河の重力的な支配下にある空間自体が回転していれば、何も不思議はない現象だと考えられます。

このように思考実験をすると、今言われているようなダークエネルギーやダークマターは、かつての天動説と同じく、概念的に間違っている可能性は高いと思われるのです。
Cannot find module ‘@hoge’ or its corresponding type declarations.

Nxでapps(Express)からlibs(TypeScript)をimportした時に
`TS2307: Cannot find module ‘@org/library’ or its corresponding type declarations.`
が発生。

~~~main.ts
import { isUser } from '@org/library';
~~~
エディターを再起動するとエラーが消えた。
終わり。
モデル駆動型アプリにPower BIを追加する

モデル駆動型アプリにPower BIを追加する場合、以下の２種類の方法があります。
①ダッシュボードとして追加する
②レポートとしてフォーム画面に埋め込む

マイワークスペース以外のワークスペースにレポート、ダッシュボードを準備しておいてください。

# ダッシュボードとして追加する
ソリューションを開いて、[新規]>[ダッシュボード]>[Power BI Embedded]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/025e4dd4-e6ac-add8-53b4-c85fc27a32e3.png)
表示名やレポートorダッシュボードを設定し、入れたいダッシュボードが入っているワークスペースを選択します。
次に、そのワークスペースに入っているダッシュボードを選択できるので、該当するダッシュボードを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/29fd3cc2-0e8d-bba1-1e93-b8c81a1b1da1.png" width=40%>

するとソリューションに追加されます。

モデル駆動型アプリの編集画面を開き、[ページの追加]>[ダッシュボード]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/90a65b54-2369-af26-1229-c9252525bdf0.png)

[ダッシュボードの選択]で、下の方に出てくるPower BIダッシュボードの項目に追加したダッシュボードが表示されます。こちらを選択し、追加ボタンを押すとアプリに追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5bdfe2df-0dd8-2956-13a9-14c3631b96a6.png)

:::note warn
ダッシュボードが反映されるまでに時間がかかります。
反映されるまで、全然関係ないダッシュボードが表示されますが、だいたい１日ほど待つと、選択したダッシュボードだけが表示されます。
:::

左のサイトマップで該当のページを選ぶとこのダッシュボードがページいっぱいに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ac933407-8dab-19ea-4824-04071a352e27.png)

# レポートとしてフォーム画面に埋め込む

ソリューションを開いて、[既存を追加]>[分析]>[Power BIデータセット][Power BI レポート]を選択します。
（データセットとレポートどちらも入れます。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/44700eb6-a158-0f7c-206d-c56785355319.png" width=60%>

表示されるメニューで[Power BIから]のタブを選択します。
ワークスペースを選択し、該当のデータセット（レポート）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b9512095-099f-4614-be22-669582a95e14.png)

フォーム編集画面を開きます。
左のメニューで[コンポーネント]>[Power BIレポート]を選択します。
出てくるメニューで該当のレポートを選択し、設定を行います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f651297c-8108-cb5b-a947-fa40cb1c1eec.png" width=70%>

すると、フォーム画面でBIレポートを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8b3f60d8-2852-1952-20f9-82f8d28f67d0.png)




# データ更新のスケジュールを設定する

定期的にデータの更新をするために設定する方法も一緒にご紹介します。
[Power BI](https://app.powerbi.com/)ワークスペースでデータセットを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1b7214b0-7c30-8295-6e0b-9fbb479388fd.png)

データセットの詳細画面の左上の[ファイル]>[設定]を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f7b32b46-7f23-cbda-d687-28f95ba3dc8f.png)

[データソースの資格情報]を開き、[資格情報を編集]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/465a4811-2481-5d2a-7027-55a6033e403f.png)

データソースのプライバシーレベルを設定し、サインインします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a11c8480-20ba-c15d-3545-d4473357f41a.png" width=80%>

資格情報の編集をすると、更新のスケジュールができるようになります。
[スケジュールされている更新]を開いて、データを最新の状態に保つをオンにします。
頻度やタイムゾーンなどを設定して[適用]ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/29ba6a9d-16b0-7c5f-5ac6-9e41f888422e.png" width=80%>
これで定期的にデータの更新が行われます。
let,constがなぜ推奨されるのか？ (備忘録)

## はじめに
主に自分用にメモしている備忘録のようなものなので読みづらいと思います。:bow_tone1:

varとlet,constの違いとしてスコープの違いがある。

var
関数内はどこからでも使用可能

let,const
ブロック内のみ使用可能
となっており、予期せぬエラーを少なくするためにできるだけ範囲を限定できるとよいためletが推奨され、varは非推奨になっているらしい。

また、constでは、再代入ができない（しようとするとエラーになる）

では、どんなときにlet,constを使うのか？
let 
変数を扱う時
const
定数の時
こんな感じで使用されることが多いらしいです。
【Python】`python --version`と打っても`Python`としか返してくれない

# `python --version`と打っても`Python`としか返してくれない

![スクリーンショット 2023-03-23 114143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/bdd13b93-5974-f8d6-45d3-5835edd65d4f.png)

# 解決方法

`設定`→`アプリ`→`アプリ実行エイリアス`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/22505e10-92a5-2742-0086-69ddc168f81d.png)

アプリインストーラーがオンになっているのでこれらをすべてオフにする。

無事解決。versionが表示されるようになった。

![スクリーンショット 2023-03-23 114724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/925ba067-9ba7-ebb1-b10a-bc834d27fa48.png)
WSL2 Ubuntuにpandocの最新版をインストール

バージョン 3.1.1-1

```
sudo apt-get purge --auto-remove pandoc

wget https://github.com/jgm/pandoc/releases/download/3.1.1/pandoc-3.1.1-1-amd64.deb

sudo dpkg -i pandoc-3.1.1-1-amd64.deb

pandoc --version
```
競技プログラミングと機械学習

こんにちは。スキルアップAI編集部です。
今回は競技プログラミングをしていて良かったこと、また競技プログラミングと関連性のある実用例について紹介をします。

(注) 個人の意見ですが、競技プログラミングはネットゲームという側面が強く、最短でスキルアップを目指すというよりは趣味で楽しくおこなうものであると思っています。

＜目次＞
1.競技プログラミングの概要
2.競技プログラミングを行うことの利点
3.競技プログラミングの経験が有効に働く実用例
4.まとめ
5.おわりに
6.参考文献

# 1.競技プログラミングの概要
競技プログラミングでは出題される問題に対して、より早く正確にプログラムを記述できるかどうかを競います。アルゴリズム・数学の知識を必要とする問題が出題されるコンテストが多いですが、ヒューリスティックな問題を扱うコンテストもあります。国内ではAtCoder[1]、世界ではTopCoder[2]などのサイトがあります。

# 2.競技プログラミングを行うことの利点
**学生や初学者がプログラミングをおこなう経験をすることができる**
大規模なプログラミングを書いたことのない人が、毎日過去問を解いて週末にコンテストに参加することで、習慣づけてプログラミングをおこなうことができます。

**計算量について意識を持つことができる**
競技プログラミングでは、サイト側の計算時間に制限があり、計算量を意識しないといけない場面があります。そこで計算量を意識することで、日常的にも計算負荷のかかるコーディングを避けることができます。
例えば、計算負荷がかかるものとして、無駄な複数forループが挙げられます。

**過去の自分や他者と競い合うことでモチベーションを維持することができる**
競技プログラミングサイトでは、定期的にコンテストが開催されます。それゆえ、自分のレート（自分の現在のレベルを数値で表したもの） の推移を確認することや、同じレート帯の人達と切磋琢磨することでモチベーションの維持につながります。

# 3.競技プログラミングの経験が有効に働く実用例
競技プログラミングでは、グラフ問題が出題されることもあります。
グラフ問題に対しては、ダイクストラ法や幅優先探索、深さ優先探索などのアルゴリズムを用いて解くことがあります。また機械学習には、画像認識・自然言語処理・最適化などの分野がありますが、「行動の最適化」の分野において競技プログラミングの経験が活躍する場合があります。
具体的な実用例として『配送計画問題』での組み合わせ問題があります。[3]

# 4.まとめ
競技プログラミングでは出題される問題に対して、より早く正確にプログラムを記述できるかを競います。趣味として楽しむ側面も大きいですが、プログラミングする経験を通して計算量やアルゴリズムの知見を得ることができます。

# 5.おわりに
スキルアップAIでは、関連講座として「[機械学習のためのPython入門講座](https://www.skillupai.com/python/)」を開講中です。
本講座では、Pythonプログラミング未経験レベルから、scikit-learnを用いて機械学習モデルを構築できるようになることを目指します。

また、毎週水曜日に実践的AI勉強会「[スキルアップAIキャンプ](https://www.skillupai.com/skillupai-camp/)」を開催しています。勉強会では、様々な実践的テーマを取り上げ、データ分析・AI開発の実務力アップにつながるヒントをご提供します。講師が参加者の皆さんからの質問や悩みに答えるコーナーもあります。
興味がある方はぜひ参加してみてください！

# 6.参考文献
[1] [https://atcoder.jp](https://atcoder.jp)
[2] [https://www.topcoder.com](https://www.topcoder.com)
[3] [https://dentsu-ho.com/articles/7632](https://dentsu-ho.com/articles/7632)

# 25卒向け！AIエンジニアになるための長期インターンプログラム参加者募集中！
25卒学生向けに、AIの基礎を学びながら就活も一括サポートする無料カリキュラムを提供しています。
修了するとE資格の受験資格も獲得できるプログラムとなっています！

<img width="700" alt="長期インターン" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/bfce4c26-1ebe-c54d-bacb-e804048a7a08.png">

**特長①AIエンジニアやデータサイエンティストの基礎が身に付く**
AIジェネラリスト基礎講座や機械学習のためのPython入門講座など、市場価値向上のための基礎を習得。

**特長②AI・データ分析領域の優良求人を紹介**
非公開求人や選考直結型インターンをご紹介し、早期内定の獲得をサポート。

**特長③長期インターンプログラム専用の学生コミュニティ参加可**
学生同士で就活情報をシェアしたり、学習を進めるうえでアドバイスをしあったりできるコミュニティに参加可能。

＞＞[長期インターン詳細](https://bit.ly/3pXW5JM)

☆☆☆
スキルアップAIのメールマガジンでは会社のお知らせや講座に関するお得な情報を配信しています。
配信を希望される方は[こちら](https://share.hsforms.com/1_XlReV-4Te-zcxCl9lhffA2mtef)

また、SNSでも様々なコンテンツをお届けしています。興味を持った方は是非チェックしてください♪
Twitterは[こちら](https://twitter.com/SkillupAi)
Facebookは[こちら](https://www.facebook.com/skillupai)
LinkedInは[こちら](https://www.linkedin.com/company/skillup-ai)
スキルアップAI公式YouTube AIビジネスチャンネルは[こちら](https://www.youtube.com/AIBusinessChannel)
【OpenSearch】サンプルデータを作る簡単な方法があったので紹介

# 背景
OpenSearchのPainless scriptを利用することで重い処理を意図的に行いスローログを出力できるかテストしようとした
その際に大量のドキュメントが含まれたインデックスが必要だった
その大量のドキュメントをサンプルとして生成できる方法があったので紹介
# 環境
AWS OpenSearch 2.3
CUIの踏み台はAmazonLinux2を使用
curl 7.84
# ポイント
CUIの場合OpenSearch Dashboards APIを使用するためにまずクッキーを取得する必要がある

# やってみた
## GUI ver
ログインをして、HomeからAdd data をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/bb1dcffc-f17a-605f-eace-4c616c83b88c.png)

Sample web logs > Add data をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/c2532981-167c-6596-10d5-1b03707786b5.png)


## CUI ver
踏み台EC2からパスワード認証で実施した
auth.txtにクッキー情報がある
```
curl -k -X POST  https://opensearch.local/_dashboards/auth/login  \
-H "osd-xsrf: true" \
-H "content-type:application/json" \
-d '{"username":"<ユーザ名>", "password":"<パスワード>"}' \
-c auth.txt

curl -k  -X POST  https://opensearch.local/_dashboards/api/sample_data/logs  \
-H "osd-xsrf:true" \
-H "content-type:application/json" \
-b auth.txt
```
osd-xsrf: true をヘッダーに追加しない場合、下記のエラーが生じますので注意

```
{"status": 400, "body": "Request must contain a osd-xsrf header."}
```



参考資料
[1] Quickstart guide for OpenSearch Dashboards - OpenSearch documentation
https://opensearch.org/docs/latest/dashboards/quickstart-dashboards/    
[2] Requests to OpenSearch Dashboards fail with “Request must contain a osd-xsrf header” | Common issues - OpenSearch documentation
https://opensearch.org/docs/2.0/troubleshoot/index/#requests-to-opensearch-dashboards-fail-with-request-must-contain-a-osd-xsrf-header 
[3] Set advanced settings with the Amazon OpenSearch Service Dashboards API | AWS Big Data Blog
https://aws.amazon.com/blogs/big-data/set-advanced-settings-with-the-amazon-opensearch-service-dashboards-api/
cscの作法 その296

# 概要
cscの作法、調べてみた。
udpを叩いてみた。
練習問題やってみた。

# 練習問題
upnpのm-searchを実装せよ。

# サンプルコード

```
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace ConsoleTest
{
	class Program {
		static void Main(string[] args) {
			UdpClient udp = new UdpClient(50000);
			udp.EnableBroadcast = true;
			string str = "M-SEARCH * HTTP/1.1\r\n" +
				"HOST: 239.255.255.250:1900\r\n" +
				"MX: 5\r\n" +
				"MAN: \"ssdp:discover\"\r\n" +
				"ST: upnp:rootdevice\r\n\r\n\r\n";
			byte[] sendBytes = Encoding.UTF8.GetBytes(str);
			//while (true)
			{
				udp.Send(sendBytes, sendBytes.Length, new IPEndPoint(IPAddress.Broadcast, 1900));
				IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
				Byte[] receiveBytes = udp.Receive(ref endPoint);
				string returnData = Encoding.ASCII.GetString(receiveBytes);
				Console.WriteLine("recv: " + returnData.ToString());
			}
		}
	}
}
```

# 実行結果

```
>ms
recv: HTTP/1.1 200 OK
CACHE-CONTROL: max-age=120
Location: http://192.168.1.1:2869/upnp/rootdevice.xml
SERVER: IGD-HTTP/1.1 UPnP/1.0 UPnP-Device-Host/1.0
ST: upnp:rootdevice
EXT:
USN: uuid:af4238da-50bdc726::upnp:rootdevice

```

以上。
Ruby 環境構築(備忘録)

### 実際の表示確認

〜メモ〜
とりあえず自分のMacにはRubyがインストールされていた為、VSCodeで実際に表示の確認をしてみました。

VSCodeでは、まずファイルを通常通り作成。そして、コマンドを叩いてターミナルで確認したがエラーが発生。。
色々調べた結果、以下のやり方をしなければいけない事を知りました（汗

```
ターミナルを表示
1 cd を叩く。
2 VScodeで作成したrubyファイルをドラックして、ターミナルに落とす。
3 Enter
4 ruby スペース ファイル名
5 Enter

すると、書いたコードが表示される
```

解決して、スッキリ。とりあえず、実際に実行して結果を確認出来るようになったのでよかった！
ベトナムオフショア開発で感じた情報伝達について

# はじめに
こんにちは！株式会社80&Companyの技術広報です。
弊社の開発部署では毎週火曜日の朝9:30から社内勉強会を行なっています。

弊社ではベトナム人とのオフショア開発を行なっています。
社内のベトナムオフショア開発に関わっているマネージャーが、社内勉強会でオフショア開発におけるベトナム人との情報伝達方法について発表したものを紹介します。
オフショア開発に興味のある方は参考にしてみて下さい♪

# 読者の対象
* オフショア開発に興味がある方
* オフショア開発での情報伝達方法に興味のある方
* ベトナムオフショア開発に興味がある方

# オフショア開発の全体像について
最初にオフショア開発の全体像について説明します。
オフショア開発とは、企業が自社の開発業務を国外にある別の企業にアウトソーシングすることを指します。
オフショア開発には、コスト削減や開発の迅速化、専門知識の獲得などのメリットがありますが、異文化やコミュニケーションの障壁などの課題もあります。

開発業務のアウトソーシング先の選定を行ったのち、開発に必要な情報の共有(要件定義、仕様書、設計書、テスト仕様書など)、開発の進捗報告や品質管理など綿密なコミュニケーションを行います。

![スクリーンショット 2023-03-17 16.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/91ba616b-b8d9-9ee2-4fa8-61db2889d02c.png)

# ブリッジSEとは？
オフショア開発には、日本側とオフショア側双方にブリッジSEが存在します。
ブリッジSEの呼び方には「ブリッジエンジニア」「BrSE」「コミュニケーター」「ブリッジシステムエンジニア」など複数存在します。

日本側の発注が大半なため、日本語でのコミュニケーションが最近は一般的になっています。
英語でのコミュニケーションを推奨される場合もあります。
ブリッジSEは設計・開発、運用保守など一般的なSEと同じ業務に加えて、橋渡しとしての役割も担います。
相手側に渡す資料としては、設計書や仕様書、作業依頼書などがあります。
これらの資料を日本語で記載し、オフショア側で開発を行ってもらい、日本側とオフショア側でこまめなコミュニケーションを取ります。

# ベトナム人の選定理由
オフショア開発の相手としてベトナム人を選んだ理由としては、下記5点の理由があります。
* 日本と生活の文化や価値観が似ている
* 価額が安いのでオフショアが成立する
* 時差が2時間と短い
* 勤勉で責任感の強い人が多い
* 日本語学校が多いため、日本語を使える人が多い

## ベトナムオフショア開発におけるやりとりの様子
ベトナムオフショア開発を行う中でのやりとりの様子を簡単に説明します。

ブリッジSEはオフショア側（以下、ベトナム側)のエンジニアに対して、オンライン上で日本語を使いプロジェクトについての説明を行います。
ただ単に設計書や仕様書に沿って話せば良いわけではなく、納期や開発方法など、文化の違いによる認識の差が埋まるよう、話を進める必要があります。
また、開発途中で仕様変更等があれば、その内容をベトナム側に共有する必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/0cf9546c-52af-19b1-0753-cf21ddc7a55a.png"  width="500" height="186" />
この際に1番大変な問題が「仕様が間違って伝わること」です。
日本語でやりとりを行う場合、ベトナム側の日本語能力が低い場合や日本側の仕様書に間違いがあった場合に、仕様の間違いが完成間近に伝わってしまい、取り返しがつかない状態になリます。
残り1週間、2週間でプロジェクトを巻き返さなくてはいけない状態が出てきます。

そのため、仕様が間違って伝わらないように注意深く話を進める必要があります。

# ベトナムオフショア開発のやりとりの中で気づいたこと
ベトナム人とのオフショア開発の実体験を通し、得た気づきを下記2点挙げます。
## ①「仕様を伝える＝情報伝達」であること
* 日本側の100%の情報をベトナム側に100%受け取ってもらわなければ、期待する作業や成果物を得ることができない
* 「言ったから分かるよね」とか「仕様書を読んだら分かるはず」という考えを持たず、伝えた気にはならずに情報をしっかりと伝えきることに常に集中する必要がある

## ②相手に対する理解が必要であること
* なるべく相手の母国語に合わせて資料等の準備をする必要がある
    * ベトナム側が日本語の仕様をベトナム語に翻訳して、開発メンバーに伝えていたりもする
* 日本側とベトナム側では生活の文化や考えた方が違うことを理解する必要がある
    * ２時間時差がある（日本の9時はベトナムの7時である)
    * 日本語がネイティブではない
    * ネットワークが不安定になる時がある

# ベトナムオフショア開発で気をつけた方がいいこと
ベトナム人とのオフショア開発の実体験を踏まえ、気をつけた方がいいと思われることを下記5点挙げます。
* 相手が知らない言葉は使わない
    * 相手のベトナム人が日本語能力試験を受けてくれている場合が多く、N1〜N5のレベルが定義されています。現地のベトナム人から、「N1はお金で買えるため、信用できない」という話を聞いたことがあり、レベルがN1だからといって日本語が伝わると思わず、会話を探りながら知っている言葉と知らない言葉を把握していく必要がある。
* 文章、言葉以外にも図や動画など、あらゆる角度から伝える
* 諦めずに伝わるまで伝える
* 相手に伝わらないのは伝え方が悪いと考えて改善する
* 「やさしい日本語」を使うこと
    * 小さい子供と会話する場合と同じ認識で、短いセンテンスで分かりやすい言葉で伝える

# 最後に
今回は、弊社社内勉強会で発表されたについて扱いました。
今後も継続的に80&Companyでの社内勉強会の取り組みを発信していきます！
[Qiita Organization](https://qiita.com/organizations/80andco)や[Twitter](https://twitter.com/80andcoDev)公式アカウントのフォローもよろしくお願いいたします！
最後まで読んでいただきありがとうございます！
[ECS]Dockerfileでコンテナ実行時に起動されるコマンドをTerraformで定義する際のTips

ENTRYPOINTとCMDは、Dockerfileでコンテナ実行時にコマンド定義するために使用します

- ENTRYPOINT
ENTRYPOINTは、コンテナが実行される際にデフォルトで実行されるコマンドを指定します。ENTRYPOINTで指定されたコマンドは、コンテナ実行時に上書きすることができますが、通常はコンテナのメインプロセスやアプリケーションの実行に使用する

- CMD
CMDは、コンテナが実行される際にENTRYPOINTに渡すデフォルトの引数を指定する
---
- ENTRYPOINTはコンテナのメインコマンドを定義し、CMDはそのコマンドに対するデフォルトの引数を定義する
```css
ENTRYPOINT ["/app/myapp"]
CMD ["--help"]
```
↓
```bash
/app/myapp --help
```
---
- TIPS
  - ECSタスク定義では、ENTRYPOINTとCMDを組み合わせることができないので、commandを使用してENTRYPOINTとCMDを組み合わせて制御します。

```cloudwatch_event_targe.tf
resource "aws_cloudwatch_event_target" "example" {
  for_each = local.example
  # ...
  input = jsonencode({
    containerOverrides = [
      {
        name    = "example",
        command = each.value.example
      }
    ]
  })
```
```locals.tf
locals {
  example = {
  # ...
      container_overrides = [
        {
          name    = "example"
          command = ["/app/myapp", "--help"] // ["entrypoint_command", "cmd_argument_1"]
        }
      ]
    }
```