OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでAmazon SESからCC/BCCを設定して添付ファイルありのメールを送る

# はじめに
boto3でメールを送る際に、CCの設定などややこしくて悩みました。
最低限の実装はできたので自身の理解とともにここに残します。

# 結論
これです。
```python
# メールを送信する
def sendMail(attachFile=[]):
    ################################# メールの見える部分 ################################
    SUBJECT = '件名'

    # 送り主
    Sender = 'exampleSenderAddress@abc.com'

    # 宛先(カンマ区切り文字列)
    To = 'exampleToAddress_1@abc.com,
          exampleToAddress_2@abc.com'

    Cc = 'exampleCcAddress_3@abc.com'

    Bcc = 'exampleBccAddress_4@abc.com,
           exampleBccAddress_5@abc.com,
           exampleBccAddress_6@abc.com'
    
    # HTML見れない人用の本文
    BODY_TEXT = '本文'
 
    # HTML見れる人用の本文
    BODY_HTML = f"""\
    <html>
    <head></head>
    <body>
    <p>{BODY_TEXT}</p>
    </body>
    </html>
    """
    ###################################################################################
    client = boto3.client('ses')
 
    # 上記の見える部分をセットしてく
    msg = MIMEMultipart('mixed')
    msg['Subject'] = SUBJECT
    msg['From'] = Sender
    msg['To'] = To
    msg['CC'] = Cc
    msg['BCC'] = Bcc

    msg_body = MIMEMultipart('alternative')
 
    CHARSET = "utf-8"
    textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET)
    htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET)
 
    msg_body.attach(textpart)
    msg_body.attach(htmlpart)
    msg.attach(msg_body)
 
    # ファイルの添付
    for att in attachFile:
        tmp = MIMEApplication(open(att, 'rb').read())
        tmp.add_header('Content-Disposition','attachment',filename=os.path.basename(att)) 
        msg.attach(tmp)

    # メッセージの送付
    try:
        response = client.send_raw_email(
            Source='',
            Destinations=[x for x in [*To.split(','),*Cc.split(','),*Bcc.split(',')] if x != ''],
            RawMessage={
                'Data':msg.as_string(),
            },
        )

    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        print("Email sent! Message ID:"),
        print(response['ResponseMetadata']['RequestId']) 
```

# 解説
## 送付先
2か所メールアドレスを設定する部分があります。（ここがわからんかった）
ここと
```python
# 上記の見える部分をセットしてく
    msg = MIMEMultipart('mixed')
    msg['Subject'] = SUBJECT
    msg['From'] = Sender
    msg['To'] = To
    msg['CC'] = Cc
    msg['BCC'] = Bcc
```
ここのDestinations
```python
# メッセージの送付
    try:
        response = client.send_raw_email(
            Source='',
            Destinations=[x for x in [*To.split(','),*Cc.split(','),*Bcc.split(',')] if x != ''],
            RawMessage={
                'Data':msg.as_string(),
            },
        )
```
1つ目は書いてある通りメールの見える部分を設定しているだけで、**送付先には影響しません**。
2つ目のDestinationsが実際のメールの送付先で**ここに書いてある人にだけ送付されます**。

## 添付ファイル
ここで添付しています。
引数にファイルのパスのリストを渡してください。
```python   
# ファイルの添付
    for att in attachFile:
        tmp = MIMEApplication(open(att, 'rb').read())
        tmp.add_header('Content-Disposition','attachment',filename=os.path.basename(att)) 
        msg.attach(tmp)
```
ヘッダなどはお好みで変更してください。
【クエリビルダ：拡張表現】Val関数を使ってみる

`Val()`は、文字列を数値に変換する関数です。
### 元となるクエリの準備 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
SAP Business Oneデータモデルを使用して元のクエリを作成します。**参照番号1**フィールドは文字列型ですが、数値表現の値を持っていそうなので使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d81534df-6dfe-b692-2797-5cb18d5a8925.png)
クエリ結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/83dd72ae-b4a1-1488-4230-499f69a29eec.png)
### Val関数の追加 ###
出力領域の右クリックから**拡張表現を追加**を選択します。
`一般`タブで**出力参照名**と**説明**を記入し、一度`OK`ボタンで確定します。
この時、`拡張表現`タブの構文エディタが空白だと確定できないので、とりあえず**0**を入力し確定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c776c525-10ba-1d54-5b3d-5a032d6e7415.png)
再度、確定した拡張表現を開きます。拡張表現タブの関数一覧より**Val**関数を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。**参照番号1**フィールドを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/03322df5-a9b4-7780-4477-d12ce8dfa3c4.png)
出力列の定義はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/139d6329-4df7-8d7e-78c7-6fa98d68e727.png)
### 結果 ###
数値に変換されているのがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ea505879-9442-17e1-6cf7-df49820dd63a.png)
レポートのデザイン上、ご利用の必要性が発生した場合は是非試してみてくださいね。

では、失礼します。
pythonで伝達関数のステップ応答を計算する

# 伝達関数の出力の計算

controlパッケージの、lsim関数を用いる。
入力値と出力値が表示されるプログラムになっている。

```
from control.matlab import *
import numpy as np
import matplotlib.pyplot as plt

#伝達関数の準備
N = [200] #分子
D = [1,5,20] #分母
trans = tf(N,D)
print(trans)

#時間データの準備
t = np.linspace(0,10,1000)

#入力データの準備
u = []
for i in range(0,len(t)):
    if 3<t[i]<7:
        u.append(1)
    else:
        u.append(0)

#出力データの計算
y, T,x = lsim(trans, u, t)

plt.plot(T,y)#出力
plt.plot(T,u)#入力
plt.show()
```
あたらしい、お友達は、LPC812MAXでLチカ(準備中)



ＬＰＣ８１２ＭＡＸ

通販コード　M-07056
発売日　2013/10/25


目的
M0+系で遊ぶ


![o_con706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/862a1329-9bd4-487b-dfd4-dc68e5765f9c.jpeg)


![o_con705.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c0eb9f39-7d4e-02fb-4385-c992e0405e66.jpeg)





1. 繋ぐ
2.バグる
3.LPC LINKのアップデート

やりたいこと
0254_lpc11u35_lpc812xpresso_0x0000.bin

a. へ


https://os.mbed.com/platforms/NXP-LPC800-MAX/


とぶ


b.Firmware Update

arm MBED
DAPLink


https://daplink.io/?board=NXP-LPC800-MAX


クリック


c. ダウンロード


0254_lpc11u35_lpc812xpresso_0x0000.bin


d.リセットを押したまま繋ぐ

ファームを消して


0254_lpc11u35_lpc812xpresso_0x0000.bin


をコピー


4.はずす

5.プログラムをコンパイル、コピー


```c++


#include "mbed.h"

//DigitalOut myled(LED1);
//DigitalOut myled(D13);
DigitalOut myled(P0_7);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}


```


6. Lチカして数秒後にバグってとまる

7. 今ここ




![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/06021652-7173-1f7f-8631-7d0575af0989.jpeg)


-1-
【Unity】顔だけVTuberになるARアプリを作った【UI編】

こんにちはっ🌟八ツ橋まろんです

iPhoneの顔認識の機能を使って様々なARアプリの基盤となる機能を提供してくれるUnity Technology提供の[AR Foundation Sample](https://github.com/Unity-Technologies/arfoundation-samples)を元に改良し、

**「「「顔だけVTuberになるiPhoneアプリを作りました！！！」」」**

動作デモ↓↓

https://twitter.com/Maron_Vtuber/status/1564733099950321664?s=20&t=ExLluQH39mlfEcohYJ6jGA

App Storeのリンク↓↓

https://t.co/6U9ok0WhJS

この記事では、アプリのUIデザインと、アプリに実装したオフセット機能について書き、『ユーザー目線で開発することで気づけたことがあった』というのをお伝えしたいと思います。

# アプリのUIデザイン

アプリの指針として、
『とりあえず、DLしてすぐに使える』
『画面上に機能が不明なアイコンが2個以上ないこと』
を(心の中で)掲げていました。

前者はいろんなアプリで実践したい項目だと思います。「DLしたけどなんのアプリかよくわからないから消す」は機会損失が大きいです。
**そのため、このアプリは起動と同時に有無を言わさずユーザーの顔をアバターで乗っ取ります。**
オンオフ機能はありません。

後者は、「わからないアイコンが1個だけなら、押せばいい。2個以上あると、なんかそれぞれ押して確かめるの面倒くさい。」という自分の性格からきています。要するに、『自分が使いやすいように作る』です。自身がそのアプリのユーザーであることは開発・改良をすごくスムーズにしてくれます。


その結果、アプリ起動時の画面はボタン3つと非常にシンプルなものになりました↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/2cdb98fa-e21f-3864-5b69-13e7106d2217.png)

①誰でもわかる写真撮影アイコン📷(カメラアイコン)
②誰でもわかる設定メニューアイコン⚙(歯車アイコン)
③UIと書かれた謎のアイコン(UIを非表示にするだけです)

パッと見て意味がわからないボタンは1つだけで、その内容は非常にシンプルかつ押した瞬間に理解できるものにしています(③)

カメラアイコン(①)を押すと3秒タイマー固定で撮影され、自動で保存されます、それ以外の操作はありません(とてもシンプル)

各種設定は全て歯車アイコン(②)の中に入れました。これにより、「何かパラメータやいろいろを変えたい」と思った時に、全て『設定ボタンを押すところからスタート』するようにしています。これは、『ひと手間かかる』側面を持ちますが、『どこを押せばいいかわかりやすい』というメリットがあります。私自身、iPhoneの標準のカメラアプリは画面上のアイコンが多すぎて苦手です。**私が使いやすいように**、設定ボタン + スクロール画面で設定変更できるようにしています。(歯車アイコンを押して出てくるスクロール画面↓↓)
![IMG_0203.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/73042caf-87ad-4129-a634-6eb9860ce6b4.png)


# アプリに実装したオフセット機能
バーチャルな顔を被せるアプリですが、リアルの体格や、被せたいアバターは様々なので、適切にずらす(オフセットを持たせる)必要があります。
すぐに思いつく縦軸と顔のサイズ調整に加え、奥行き(割と大事)と角度(顎を上げる、下げる方向の角度。これも大事)を調整できるようにしています。

奥行き調整は、横を向いたときにずれるのを調整できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/09c1f44f-5505-2115-d3bc-14748ad9ebd2.png)

角度の調整については、「自身がユーザーだから気づいたこと」だと思っています。写真に写るとき、カメラのレンズではなくアバターの目を見ながら撮るんですよね。

アバターの制御が自分の表情に依存しているから、「うまく表情操作できているか確認しながら撮る」ので、カメラのレンズを見る撮るのと若干ずれます。
その差を上手く吸収するために角度調整が必要でした。自撮りに興味がなかったら追加してなかったでしょう。VRChatで自撮りし慣れていてよかった（笑）

アプリ自体が簡潔なので、短い記事でしたが、「自分が一番このアプリを使いたい」という気持ちで作ったため、ユーザー目線で気づけたことがいくつかありました。
そのいくらかでもお伝えできていれば幸いです。

それではっ🌟

八ツ橋まろん
Databricksノートブックの新しいビジュアライゼーションを試してみる

7月にこちらのマニュアルを翻訳していましたが、ようやく新しいノートブックのビジュアライゼーションがリリースされました。お待たせしました。

https://qiita.com/taka_yayoi/items/b3f7bd30907967afee17

ノートブックでSQLコマンドを実行するか、`display`関数を使用すると以下のようにデータフレームが表示されます。

```sql:SQL
%sql
SELECT * FROM japan_covid_takaakiyayoidatabrickscom.covid_cases
```
![Screen Shot 2022-09-01 at 11.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6a9ab66b-2e58-eb42-22e8-709af29cd6e5.png)

結果表示部分はタブ形式になっています。**テーブル**の右にある **+** をクリックするとメニューが展開されます。
![Screen Shot 2022-09-01 at 11.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1838172d-b32a-5045-33e5-fb8fa33bb48f.png)

**ビジュアライゼーション**を選択すると、Databricks SQLと同様のビジュアライゼーション設定画面が表示されます。

グラフタイプを選択したり、X軸、Y軸の値を選択することでプレビューが表示されます。
![Screen Shot 2022-09-01 at 11.47.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9acc6369-8e0c-9d6e-c8cd-dc2dffef303b.png)

**保存**をクリックすると設定画面が閉じ、ノートブックにグラフが表示されます。
![Screen Shot 2022-09-01 at 11.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f589a628-a79a-b808-0d6f-d090a7d7253a.png)

同様の操作を繰り返すことで、複数のビジュアライゼーションを追加することができます。
![Screen Shot 2022-09-01 at 11.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/126ed18b-08b9-09a2-054f-d728edf827d7.png)

タブ上のラベルをクリックすることで名前を変更することができます。
![Screen Shot 2022-09-01 at 11.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a762d474-7359-e9eb-4f64-69166b55daf8.png)

タブ名の右の![Screen Shot 2022-09-01 at 11.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0bb07948-ddf9-4c5b-ee7c-60ccc17ab691.png)をクリックすることで、メニューを展開することができます。
![Screen Shot 2022-09-01 at 11.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4bae27ad-32a4-618c-2de5-40d3a358ae69.png)

なお、**+** をクリックして**データプロファイル**を選択すると、対象データの分布などのプロファイルを追加できます。
![Screen Shot 2022-09-01 at 11.53.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cf0d3898-4c5e-1935-3275-c3ed81030290.png)

以前のビジュアライゼーションを追加したい場合には、**レガシーな可視化**を選択します。
![Screen Shot 2022-09-01 at 11.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e058c20-32d4-c990-fa78-841167255705.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Qoddi.comは使わないほうがいい

https://qoddi.com/

無料で使えると思いましたが、電話番号とクレジットカード求められます。やめましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/2d38fac1-c5a7-6a1c-bff9-5a0ff26ccde5.png)
iTerm2 おすすめ設定 (Mac)

iTerm2の個人的なおすすめ設定
※TeraTermの操作に近くなるように設定してます

# 文字の先頭・末尾へのジャンプ

「Preference」 > 「Profile」 > 「Keys」 → 「Key Mapping」

### 「Fn」 + 「←」 で先頭に移動
「+」 を押下して以下を設定する

```
Keyboard Shortcut: Home
Action: Send Hex Code
OxO1
```

### 「Fn」 + 「→」 で先頭に移動
「+」 を押下して以下を設定する

```
Keyboard Shortcut: End
Action: Send Hex Code
OxO5
```

# 過去操作の表示スクロールの制限をはずす

「Preference」 > 「Profile」 > 「Terminal」
`Unlimited scrollback`にチェック

# 選択した内容を自動でクリップボードにコピー
「Preference」 > 「General」 > 「Selection」
`Copy to pastedboard on selection`にチェック

# 右クリックでペースト
「Preference」 > 「Pointer」 > 「Bindings」

「+」 を押下して以下を設定する

```
Button/Gesture: Right Button
Click Type: Single Click
Action: Paste from Clipboard...
```

# さいごに
他のおすすめの設定あれば教えてください
/Users/*****/.rbenv/shims/rails: line 21: /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv: No such file or directoryの解決方法

## 何をしたらこのエラーが出たか
以下のコマンドを押したときにエラーが出た。
```
brew install imagemagick
```

## 解決までに試したこと
まず、cd start-appで移動してから、始まります。

```
[******@******: (画像投稿機能の実装)start-app]$rails s
/Users/******/.rbenv/shims/rails: line 21: /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv: No such file or directory
```
```
[******@******: (画像投稿機能の実装)start-app]$rbenv rehash
rbenv: cannot rehash: /Users/yuma_mukai/.rbenv/shims/.rbenv-shim exists
```
rehashができない。
ここで、rbenvに問題があることがわかる。

```
[******@******: (画像投稿機能の実装)start-app]$rbenv version
rbenv: version `2.6.3' is not installed (set by /Users/*****/start-app/.ruby-version)
```
```
[******@******: (画像投稿機能の実装)start-app]$rbenv -v
rbenv 1.2.0
```
```
[******@******: (画像投稿機能の実装)start-app]$which ruby
/Users/*****/.rbenv/shims/ruby
```
rbenv versionの結果で2.6.3がnot installedだったので、インストールする。
```
[******@******: (画像投稿機能の実装)start-app]$rbenv install 2.6.3
省略
```
```
[******@******: (画像投稿機能の実装)start-app]$rbenv version
2.6.3 (set by /Users/yuma_mukai/start-app/.ruby-version)
```
rbenv versionを再び確認すると、2.6.3がインストールされたことを確認できる。

また、先ほどrehashができなかったので、以下のコマンドで、本来消えるはずの一時ファイルを消す。
```
[******@******: (画像投稿機能の実装)start-app]$rm /Users/*****/.rbenv/shims/.rbenv-shim
```
```
[******@******: (画像投稿機能の実装)start-app]$rails s
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.6.0
```
表示が変わった！
```
[******@******: (画像投稿機能の実装)start-app]$rails --version
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.6.0
```
```
[******@******: (画像投稿機能の実装)start-app]$rbenv rehash
```
今度はrehashしてもエラーが出ていないので、成功。
```
[******@******: (画像投稿機能の実装)start-app]$rbenv -v
rbenv 1.2.0
```
```
[******@******: (画像投稿機能の実装)start-app]$rails s
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.6.0
```
railsがないと言っているので、bundle install

ここでrails sをすることで、立ち上がりました。

## 参考記事
https://qiita.com/ironsand/items/2f9f20e6e77ab1877160
【クエリビルダ：拡張表現】IsNumeric関数を使ってみる

この関数は、その名前の通り検査対象となるフィールドの値が、数値かそうでないかを判定します。
### 元となるクエリの準備 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
SAP Business Oneデータモデルを使用して元のクエリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d695d401-9b66-5b0a-0b0e-7a29868c1779.png)
クエリ結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f55ad275-a35d-4adf-1f58-1077237a134c.png)
### IsNumeric関数の追加 ###
出力領域の右クリックから**拡張表現を追加**を選択します。
`一般`タブで**出力参照名**と**説明**を記入し、一度`OK`ボタンで確定します。
この時、`拡張表現`タブの構文エディタが空白だと確定できないので、とりあえず**0**を入力し確定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2d6fd37b-6bef-eed3-9299-b459a51b18d6.png)
再度、確定した拡張表現を開きます。拡張表現タブの関数一覧より**IsNumeric**文を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。最初は、**顧客名**を検証対象にしてみます。`データ型`には**Boolean**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/130cf5da-d762-e986-facd-0e98b34101da.png)
出力列の定義はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e94b9139-c02b-35d5-d293-d716c22fad0a.png)

追加した拡張表現を選択した状態で右クリックメニューを開き、**複製**を選択します。
選択している出力アイテムが複製されます。一意の名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/01db8237-529a-e92c-ac6b-b4e99d710944.png)
ユニークコードの入力も促されますが、これはあまり重要ではないのでそのまま`OK`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e9de9699-1513-fa6e-bb2c-89ee623637a1.png)
複製されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4729b31d-a87d-2b3c-d083-ebd3bb749b15.png)
複製された拡張表現を開き、`一般`タブで**出力参照名**と**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a5c364fa-cca1-cd7b-afb4-8dd751e69770.png)
`拡張表現`タブに移動し、関数定義を以下のように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/03feda7d-22b8-0484-3588-c289d4bb226f.png)
出力列の定義はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eb2627a9-5a3b-3ddc-3e3c-05d397cfa8d0.png)
### 結果 ###
顧客名の検証では、文字列なので**False**、金額の検証では、数値なので**True**が返ってきてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ceaf19ee-4d2f-b741-fa75-5310dd015787.png)
レポートのデザイン上、ご利用の必要性が発生した場合は是非試してみてくださいね。

では、失礼します。
twitter広告を勉強しよう

twitter広告の利用を今後していきたいので、
ここにまとめて行きます。

支払いについては
https://business.twitter.com/ja/help/account-setup/billing-basics/billing-invoices.html

に細かく載っているみたい

# 先払いできるの？

できない

# いつ請求されるの？

・クレジット限度額の25%以上
・500ドル以上
・7日ごと
・月の末日

上記のいずれかの時点

# アカウントを複数持っていてそれぞれで支払いしたい場合はどうするの？

支払いは各広告アカウントごとに請求がされますのでクレジットカードも各アカウントごとに登録が必要
direnv: error can't find bash: exec: "bash": executable file not found in $PATHエラーの解決方法

## どういう状況だったか
あらゆるコマンド(ls,ruby -v,rails s等)を押しても、command not foundになってしまっていた。

## 原因
vim ~/.bash_profileで、PATHの環境変数をいじって、source ~/.bash_profileで反映させた時、誤字が含まれてしまった。実際に、echo $PATHで確認してみると、以下のように表示された。
https://gyazo.com/fa12919337960c038255c183cb6c765b

## 解決方法
bash_profileの中身がおかしくなっていた時に、上記のエラーが出た。そして、vim ~/.bash_profileコマンドでは弾かれたので、ホームディレクトリで/usr/bin/vi .bash_profileコマンドを押すことによって、bash_profileの中身は確認できる。

以下は同じ意味
```
/usr/bin/vim .bash_profile 
vim ~/.bash_profile
```

bash_profileに誤字かスペースが入っていたため、エラーが起きているので、bash_profileを一度削除し、新しく作り直すことで解決できた。

### ①bash_profileの中身をメモする。

### ②bash_profileを削除する
```
rm .bash_profile
```

### ③bash_profileを作成する
```
touch ~/.bash_profile 
```

### ④先ほどメモした中身を手動で入力していく

また、ターミナルは再起動しないと反映されていなかったりする。
Linux route、netstat、ss、ncコマンドについて（自分用メモ

●routeコマンド
ルーティングテーブルの表示、追加、削除は「route」コマンドを使用。

■routeコマンドの表示オプション

route [オプション]
・-F ルーティングテーブルを表示(オプション未指定と同じ)
・-C ルーティングキャッシュを表示する
・-n 名前解決をせずルーティングテーブルを表示

※ルーティングテーブルの表示までのプロセスを変えることによってすばやく表示するには、DNSの名前解決を行わず、「-n」オプションでアドレスのままでルーティングテーブルを表示することができる。

※ルーティングテーブルは「netstat -r」や「route( -F)」、「ip route show」コマンドで表示できる。
「netstat -r」と「route( -F)」の2つのコマンドの実行結果は同じ表示になる。

■
・ルーティングテーブルへの追加
　route add [オプション] <対象>
・ルーティングテーブルからの削除
　route del [オプション] <対象>

routeコマンドの追加・削除オプション
・-host 対象をホストのアドレスとみなす
・-net 対象をネットワークアドレスとみなす
・netmask サブネットマスクを指定
・gw ゲートウェイを指定
・default gw デフォルトゲートウェイを指定

※デフォルトゲートウェイを削除するには、デフォルトゲートウェイのIPアドレスを指定して削除する方法と指定しないで削除する方法がある。
IPアドレスを指定する場合は、「route del」の後に「default gw」というオプションの後でIPアドレスを指定。
IPアドレスを指定しない場合は、「route del default」のみでデフォルトゲートウェイの削除は可能。その場合「gw」は付けてはいけない。


■ルーティングテーブルの主な項目
・Destination 宛先ネットワークアドレス(デフォルトはデフォルトルート)
・Gateway 宛先ネットワークへのゲートウェイ。デフォルトルートのゲートウェイはデフォルトゲートウェイ。
・Genmask 宛先ネットワークのサブネットマスク(デフォルトルートは0.0.0.0)
・Flags 状態フラグ
・Iface 宛先ネットワークへの送信に使用するインターフェイス

▲状態フラグ(Flags)の項目
・U 経路が有効
・H 対象をホストとして設定
・G ゲートウェイを使用



●netstat
「netstat」コマンドはオプション無しで実行すると、有効なネットワーク接続や開いているソケットの情報等を表示。

netstatコマンドの主なオプション
・オプション無し　有効なネットワーク接続や開いているソケットの情報等を表示
・netstat -r ルーティングテーブルを表示
・netstat -i ネットワークインターフェースの統計情報を表示
・netstat -n アドレスやポートの名前解決をしないで表示


●ssコマンド
netstatの後継となるコマンドで、ネットワークのソケットの情報を表示する。
ifconfig、route、arp、netstatコマンドなど旧来のネットワーク関連ユーティリティであるnet-toolsの代替として開発されたiproute2ユーティリティに含まれている。

ssコマンドの書式と主なオプション

ss [オプション]

オプション
・-a 全てのソケットを表示
・-n サービス名の名前解決をしない
・-p ソケット使用中のプロセスを表示
・-t TCPソケットを表示
・-u UDPソケットを表示


●ホスト名を一時的に変更するには、「hostname」コマンドを使用。
「/etc/hostname」を使用して恒久的に変更することも可能だが、一時的に変更を反映したい場合は「hostname」コマンドを使用する。

hostname [ホスト名]

ホスト名の指定を省略すると、現在のホスト名が表示される


●Netcat(ncコマンド)
TCP/UDPを使った通信を手軽に行うことのできる便利なツール。

nc [オプション] [接続先アドレス] [宛先ポート番号]

オプション
・-l 指定したアドレス、ポート番号で接続を待ち受ける(listen)
・-p 送信元ポートを指定する(port)
・-u デフォルトのTCPではなくUDPで動作する(udp)

宛先ポート番号が未指定の場合、デフォルトで31337番ポートが指定されたものとして動作。

なお、一部のディストリビューション（Ubuntuなど）で採用されているnetcatでは-zオプションでポートスキャンを行うことができる。
laravelでのcomposerとは何か？

１、composerとは何か？
laravelにおいて使用可能な便利なフレームワークやライブラリを管理するシステムです。
composerがあることで、例えばAというライブラリをダウンロードする際に他に必要なライブラリも自動的にダウンロードしてくれるようになります。
（詳細：https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94）

２、laravelでcomposerが関連しているファイル・フォルダ

composer.json
インストールするパッケージ一覧を表示するファイル

composer.lock
実際にインストールされたパッケージの具体的なバージョンなどの情報が自動的に記録されるファイル

vendor	
インストールしたパッケージのソース本体が格納されたディレクトリ

composer.phar
composerの実行ファイル。
このファイルをもとにしてcomposerのコマンドが実行される。
そもそも拡張子.pharのファイルはphpのアーカイブファイル（複数のファイルやフォルダをまとめたファイル）のこと。


3、参照URL
https://weblabo.oscasierra.net/php-composer-1/
https://laraweb.net/surrounding/3973/ 
https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html
https://wa3.i-3-i.info/word11512.html
https://weblabo.oscasierra.net/php-composer-centos-install/
電子商取引

# 電子商取引（EC：Electronic Commerce)とは
商品を注文するとき発注、受注には伝票が必要になる。
その後の納品書、検収書も必要になる。
それらの手順、必要なものを電子化したもの

# 取引の形態
誰と誰が取引するかによってさまざまな形態がある。

## 誰を表すもの
### B(Business) 企業
### C（Consumer) 個人
### G(Goverment) 政府や自治体
### E(Employee) 従業員

## 形態の紹介
### B to B
```企業間```の取引
商取引のために、組織間で標準的な規約を定めてネットワークでやりとりすることを```EDI(Electronic Data Interchange)```という。

### B to C
```企業と個人```の取引
オンラインショッピングなどが該当する。

### C to C
```個人間```の取引
ネットオークションによる個人売買などが該当する。

### B to E
```企業と社員```の取引
企業が自社の従業員向けに提供するサービスが該当する

### G to B
```政府や自治体と企業間```の取引
官公庁が物品や資材の調達を行う電子調達や電子入札などが該当する。

### G to C
```政府や自治体と個人間```の取引
行政サービス（住民票や個人謄本等）の電子申請などが該当する。

# EDI（Electronic Data Interchange)
日本語に訳すと```電子データ交換```という。

```企業間取引```で発生する契約書や受発注書、納品書や請求書といった帳票を```専用回線やインターネットを用いて電子データとしてやり取りするシステム```
出典 https://it-trend.jp/edi/article/80-0004

ECにおいて円滑に取引を行うために```交換されるデータ形式の統一化と機密保持```が欠かせません。

## EDIの取り決め
上から下へ、下流から上流へ

### 情報伝達規約(第１レベル)
```コンピュータ間の通信手順```に係わる取り決め

### 情報表現規約(第２レベル)
交換するデータを双方のコンピュータが理解するために必要な、```データ記述方法```に係わる取り決め

### 業務運用規約（第３レベル）
```EDIの運用方法```に係わる取り決め

### 取引基本規約(第４レベル）
EDIを用いた取引に係わる```基本的な契約```

# カードシステム
ECにとって決済手段です。
磁気カード方式から、より```捏造に強く、多くの情報を記録することのできるICカード方式へ```と、順次変わりつつある。

## カードシステムの種類
### クレジットカード
買い物時点ではカードを提示するだけにとどめ、後日決済を行う後払い方式のカード

### デビットカード
銀行口座からリアルタイムに代金を直接引き落として決済するカード

出典 

https://gihyo.jp/book/2020/978-4-297-11781-8
Visual Studio Codeのワークスペースのフォルダの順番を変更する

macOS 10.14
Visual Studio Code バージョン: 1.70.2

![スクリーンショット 2022-09-01 10.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743849/ab141d8c-3c55-6494-4def-ea2ca2abb2af.png)

移動したいワークスペースのフォルダ名をOption[alt]キー押しながら、上下に移動し離すことで解決

![スクリーンショット 2022-09-01 10.36.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743849/cf7ac898-e74d-5e51-49dc-f8dc33a87d4f.png)
LibertyでOpenLDAPを構成して認証する

# 目的

OpenLDAPを構成してLiberyで認証できるようにします。

# Gitレポジトリ

用意したGitレポジトリをクローンします。

```
git clone https://github.com/pdprof/security-auth.git
cd security-auth/ldap-docker
```

# Dockerイメージのビルド

LibertyとOpenLDAPのイメージをビルドします。LDAPへの通信をするのに　DOCKER_HOST 環境変数の指定が必要です。

- 認証で使用するのでアクセス時のホストに一致させる必要があります。
- setup-docker.sh で docker の liberty(ll) と openldap(ldap) が開始します。
- 9080, 9443 のポートを使用している場合はそのプロセスを事前に停止します。

```
netstat -an | grep 9080
netstat -an | grep 9443
（.. ここで 9080, 9443 を使用している場合はプロセスを停止　..）
export ACCESS_HOST=172.17.0.1 # export ACCESS_HOST=`hostname` 
./setup-docker.sh
```

# 認証のテスト

登録済みのユーザー
|User | Password|
|---|---|
|wasadmin|passw0rd|
|pdadmin|passw0rd|
|myuser|passw0rd|

詳細はLDIFを確認します。
https://github.com/pdprof/security-auth/blob/master/ldap-docker/users.ldif

https://localhost:9443/security.auth
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/1b0186f7-0cbe-f323-bae9-cfe066c7bfcc.png)

にアクセスするとBASIC認証画面が表示、そしてログインのテストができます。LDAPの環境がすぐに作れるので、認証テストをしたいときのベースにできます。
気軽なファイルバックアップツールの勧め

# QTTabBarの機能
エクスプローラをタブ化するエクスプローラー拡張である[QTTabBar](http://qttabbar-ja.wikidot.com/)を私は使っているんだが、これには以下の機能がある。

| 選択しているファイルを引数に加えて、登録したコマンドをボタンを押すだけで実行できる |
|:-:|

この機能(アプリケーションランチャー)を使い、下記のbackup.pyを実行するように設定すると、ファイルを簡単にバックアップできるようになります。
ファイルを修正する時に、とりあえず今のファイルを残しておこうとかをすぐにやるようになるのでお勧めです。

* 参考ページ：[【中級者向け】QTTabBarのアプリケーションランチャを使う](https://ho-kiboshi.com/qttabbar/424/)

他のエクスプローラー拡張やファイラーでも同様の機能があれば、同じようにすれば便利です。

# backup.py
## 機能
* ファイルのコピーを作る。
* その際に作成日時は変更せず。
* コピー先のファイル名は、元のファイル名に「-backupYYYYMMDD」の形で、元ファイルの更新日時を含んだものとする。
* 同じ日にちの更新日時のものが複数になる場合は、「(1)」などと連番を付加する。
* 拡張子は元ファイルと同じまま。

## コード
```python:backup.py
# -*- coding: utf-8 -*-
import sys
import re

def fext(fname):
    """
      split file name to base name part and extension part
    """
    pat = re.compile('(\.[^.]*)$')
    res = pat.search(fname)
    return(fname[0:res.start()], res.group(1))


def cp(inp,out):
    """
      File copy
    """
    import shutil
    
    if False: # debug
        print(inp,' --> ', out)
    else:
        shutil.copyfile(inp,out)
        shutil.copystat(inp,out)


def backup(inp,ntry=10):
    """
      File backup copy
    """
    import os
    import os.path
    import time
    m = os.stat(inp)
    dstr = time.strftime('%Y%m%d', time.localtime(m.st_mtime))
    (base,ext) = fext(inp)
    out = base + '-backup' + dstr + ext
    i = 0
    while os.path.exists(out):
        i += 1
        if i > ntry:
            print("I am tired because I did many try!", file=sys.stderr)
            exit(1)
        else:
            out = base + '-backup' + dstr + '(' + str(i) + ')' + ext

    cp(inp,out)

# Main
if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(prog='backup.py')
    parser.add_argument('-n', '--ntry',
                        help='Number of Max. try',
                        nargs='?', type=int,
                        default=10)
    parser.add_argument('file', nargs='+')
    args = parser.parse_args()
    
    for f in args.file:
        backup(inp=f,ntry=args.ntry)
```
poetry 1.2.0 で cuda11 版 pytorch を入れる

# 概要
stable version になった `poetry 1.2.0` をインストールしたときのメモです。`poetry lock` が爆速になっているのでこれを機に `1.2.0` に上げることをお勧めします。

# how to install poetry
## download
以下のコマンドで最新の poetry (記事執筆時点では `1.2.0`) が入ります。
```bash
curl -sSL https://install.python-poetry.org | python3 -
```

バージョンを指定してダウンロードしたい場合は環境変数 `POETRY_VERSION` を指定してダウンロードします。
```bash
POETRY_VERSION=1.2.0 curl -sSL https://install.python-poetry.org | python3 -
```

## path を通す
download された poetry にパスを通します。

```bash
export PATH=$PATH:$HOME/.local/bin
```

Dockerfile の中でやるならこっち。
```Dockerfile
ENV PATH $HOME/.local/bin:$PATH
```

最後に `poetry --version` などでパスが通っていることを確認すれば完了です。パスが通っていれば poetry のバージョンが表示され、通っていない場合は command not found error が出ます。

**success ケース**
```bash
poetry --version
>> Poetry (version 1.2.0)
```

**failure ケース**
```bash
poetry --version
>> bash: poetry: command not found
```

失敗した場合は poetry のパスがデフォルトとは違っている可能性が高いので、`POETRY_HOME` にパスを通すと使えるようになるかもしれないです

## 備考
- windows は上記方法ではできないかもしれないです
- **`get-poetry.py` と `install-poetry.py` は deprecated になったようです**

# how to install pytorch via poetry

wheel ファイルのパスを直接指定することで cuda11 版の pytorch も install できるようになりました。torchvision なども同様の方法で入れることができます。

```pyproject.toml
[tool.poetry.dependencies]
torch = { url = "https://download.pytorch.org/whl/cu111/torch-1.9.1%2Bcu111-cp37-cp37m-linux_x86_64.whl"}
```

これによって Dockerfile の中で個別に pytorch を install しないで済むようになりました。うれし〜。


# その他メモ
- **`poetry lock` が爆速になりました**
    - 参考までに、`poetry==1.1.13` で `4000秒` 以上かかっていた lock が `500秒` くらいに高速化しました

# 参考
- [公式 installation ガイド](https://python-poetry.org/docs/master/#enable-tab-completion-for-bash-fish-or-zsh)
    - 本記事はほぼここの内容を訳しただけです
プロダクトキーでMicrosoft 365 Business Standardを購入した場合（既にアカウントを持っている人向け）


:::note warn
そのうち、正規の手段で可能になるかもしれません＆この手順も廃止されるかもしれません。
:::

amazon等で、Microsoft 365 Business Standard（法人向け）をプロダクトキーにて購入した場合、マニュアルでは、以下の指示がされます。

>以下のリンクより、セットアップ画面に進みます。
>https://office.com/setupkey

しかし、既に法人用のアカウントを持っている場合、プロダクトキーを入力して進もうとすると、エラーが出てしまいます。
サポートに連絡したところ、下記のURLが開示され、ここにキーを入力すると、無事、アクティベートすることができました。
>https://admin.microsoft.com/commerce/productkeyredeem.aspx

更新の場合は、管理センターの製品管理のメニューから、終了日を延長を選べばいいと思います。
（amazonのレビュワーに感謝です。）

office365については、困ったらサポートに連絡するのがいいと思っております。
artisan したら PHP Parse error:  syntax error, unexpected token ")" と Class "DOMDocument" not found が出た



Laravel のプロジェクトを人任せにしていたが自分の所でも開発をしなければならなくなったので、マイグレーションを作りたく artisan を使ってみたが、

```shell
$ php artisan make:migration add_hoge_to_fugas --table=fugas
PHP Parse error:  syntax error, unexpected token ")" in /home/test/projects/hogehoge-system/vendor/symfony/console/SignalRegistry/SignalRegistry.php on line 37
```

こんなエラーが出ますね。これは PHP のバージョンじゃなかろうか。WSL2 にはいってるのは

```shell
$ php -version
PHP 8.0.17 (cli) (built: Mar 20 2022 17:04:09) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.17, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.17, Copyright (c), by Zend Technologies
```

8.0.17 だったのであげてみる。

```shell
$sudo apt update
$sudo apt install -y php
```

公式からアップデートするだけで 8.1 系になりました。

```shell
$  php -version
PHP 8.1.9 (cli) (built: Aug 15 2022 09:39:52) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.9, Copyright (c), by Zend Technologies
```

もっかいマイグレーションしたら、

```
Class "DOMDocument" not found

  at vendor/nunomaduro/termwind/src/HtmlRenderer.php:32
     28▕      * Parses the given html.
     29▕      */
     30▕     public function parse(string $html): Components\Element
     31▕     {
  ➜  32▕         $dom = new DOMDocument();
     33▕ 
     34▕         if (strip_tags($html) === $html) {
     35▕             return Termwind::span($html);
     36▕         }

      +21 vendor frames 
  22  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
```

こんなことになったので php-xml をアップデートした。

```shell
$ sudo apt-get install php8.1-xml
```

はいこれで成功
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その010

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題10問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=M8eB4IXUxi0

<iframe width="560" height="315" src="https://www.youtube.com/embed/M8eB4IXUxi0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



問題はこちらです
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/74670c99-98ab-e868-4513-cf070bba2801.png)


Salesforceの設定でパスワードリセットの期間を設定することが可能です
その設定場所はどこでしょうか　という問題ですね

正解はCです。


ユーザに割り当てられたプロファイルからパスワードの有効期限の設定が可能です

プロファイルにひもづくすべてのユーザの設定が変更ができため、設定変更は気をつけてください


そのほかの
プロファイルのパスワードポリシー項目　の設定についてはこちらのヘルプをご確認ください
https://help.salesforce.com/s/articleView?language=ja&type=5&id=sf.users_profiles_password_policies_ref.htm

今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
それ、正規表現の置換で出来るよ

Slack雑談での出来事、実話です。

**俺：**「修正量が多いと思うけど、もしかして手で直してる？」
**駆け出しエンジニア：**「それも非効率なので移行用コードを書こうかと」

```html:修正前
<div class="foo"><a href="bar"><img src="images/example.png"></a></div>
```

```html:修正後
<a href="/path/bar"><img src="<?php echo get_stylesheet_directory_uri(); ?>/foo.png"></a>
```

- class属性値の`foo`を、新HTMLのsrc属性値の中間に
- href属性値の`bar`を、新HTMLのhref属性値の最後に

というように書き換える必要がありました。
各ファイルに数十行あり、それが数十ファイル。

**俺：**「それならコード書くまでもないし！エディタの置換コマンドが早いと思うよ」
**駆け出しエンジニア：**「えっ！置換でいけますか？」
**俺：**「そう、正規表現ならね（iPhone CM風）」

# 結論
エディタの置換機能で次のように指定すればOK。
正規表現に詳しいサイトはいくらでもあるので、ここで細かいことは解説しません。

```:検索文字列
^\s*<div class="(.+)"><a href="(.+)"><img src="images/example.png"></a></div>\s*$
```

```:置換文字列
<a href="/path/$2"><img src="<?php echo get_stylesheet_directory_uri(); ?>/$1.png"></a>
```

VSCodeなら`.*`にチェックを入れます。フォルダ内の複数ファイルにも対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/e9b18893-a69f-a857-9993-541f447e4e8f.png)
GoogleDriveが表示されない。

# はじめに
本記事はプログラミング初心者が、railsの学習を進めながら、躓いた部分、解決した箇所、またそれらの解決方法を備忘録も兼ねてまとめているものです。
最初はprogate。そのあと、「現場で使える RubyonRails5 速習実践ガイド」(通称)「現場Rails」を参考に進めていきました。
そのため、記事の内容には誤りがある可能性があることをご理解ください。
誤りがあればお手数ですが、ご指摘いただければと思います。よろしくお願いします。

# 環境
Ruby 3.1.2
Rails 7.0.3.1

```new.slim
  .d-flex.flex-column.bd-highlight.mb-3
    iframe src="https://drive.google.com/file/d/1VuZoeLxVGNaEAs41OFyc5tCWpTU8Wbq4/view?usp=sharing" width="100%" height="100%"
    .d-flex.justify-content-center
      = f.check_box :agreement, checked: false, id: 'check', class:'me-3 my-auto'
      = f.label :agreement
        a.text-decoration-none href="https://drive.google.com/file/d/1VuZoeLxVGNaEAs41OFyc5tCWpTU8Wbq4/view?usp=sharing"  利用規約
      |について同意する
    input(type="submit" class='btn btn-primary p-3' id='link3' value="結果を見る！" disabled)

    p.small.text-center ※利用規約にチェックを入れないと次に進めません。
```

# 問題のエラー
利用規約を読んでもらうときに、chrome上で見れるようにするため、iframeを活用しました。
GoogleDriveであれば基本的に見れると書いていたため、実際に上記のコードで埋め込んでみるが該当の箇所にエラーが出てしまいます。

![スクリーンショット 2022-09-01 8.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/ba63f732-e677-eb52-d4da-07911fba5700.png)


エラーを調べたところ、アクセス権に制限がかかっているんだとか。(以下参考)
https://blog.hubspot.jp/http-403-forbidden

しかしながら、アクセス権も対象を全員にしていたし他の問題についてはわからなかったので、メンターに質問。すると、以下のサイトを教えてくれました。

https://community.glideapps.com/t/embed-pdf-from-google-drive-with-webview/38965


# 解決方法
なんと、GoogleDriveのURLの`view`の部分を`preview`に変えることで、表示ができるようになるとのこと。
実際にやってみることに。

```new.slim
  .d-flex.flex-column.bd-highlight.mb-3
    iframe src="https://drive.google.com/file/d/1VuZoeLxVGNaEAs41OFyc5tCWpTU8Wbq4/preview?usp=sharing" width="100%" height="100%"
    .d-flex.justify-content-center
      = f.check_box :agreement, checked: false, id: 'check', class:'me-3 my-auto'
      = f.label :agreement
        a.text-decoration-none href="https://drive.google.com/file/d/1VuZoeLxVGNaEAs41OFyc5tCWpTU8Wbq4/preview?usp=sharing"  利用規約
      |について同意する
    input(type="submit" class='btn btn-primary p-3' id='link3' value="結果を見る！" disabled)

    p.small.text-center ※利用規約にチェックを入れないと次に進めません。
```
なんと、できるではないか...


![スクリーンショット 2022-09-01 8.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737125/564121dd-d817-57a0-7169-c53752056567.png)


# おわりに
今回はなぜこうなってるのかは、わかりませんがひとまず解決できたので、ここに書かせていただきました。
もし、もっといい方法などあったり、このやり方が間違っていたりしていたら、教えていただけるとありがたいです。
#2 エンジニア未経験のGitインストール〜 fatal: Not a git repository 〜

ご覧いただきありがとうございます。

なんと昨日の記事は
- 初の「LGTM」
- Twiiterに投稿したら公式Qiitaからいいね

をいただいたので、やる気が!!!

そのため、本日も投稿します。


# 対象者
- エンジニアとして就活されている方
- Gitを勉強され始める方
- `fatal: Not a git repository`　と出力された方

かなーと思っています！

# 事象：fatal: Not a git repository

では、早速事象から。

チュートリアルとして初めて実施した際に

```
% ~ git add
```
とターミナルにコマンドを打ち込みました。

すると、こちらのエラー表示が！

```
fatal: Not a git repository
```
なんじゃこりゃ〜〜〜 www という気持ちが

初めて実施してみたのに、このようなエラーとなったら不安になりますよね。

同じ方もいらっしゃるのではないでしょうか？

その為、ググって試したことをお伝えします。


# 解決策:git init
結論、**これ**だけでした。

```
git init // ファイルの初期化のコマンド //
```

をターミナルにてコマンド入力。

　その後、
```
git add 
```
のコマンドを使うと、エラーは出なくなりました。

その為、操作が可能と判断しました。

# 原因:そもそも今回ダウンロードはしていない

そもそも１から実施していなくて **中途半端なところから初めてしまったか** と思います。

調べるなかで

https://git-scm.com/

からダウンロードするとのことでした。

しかしその前に当方のMacにて

```
git --version
```

と入力すると

```
git version 2.32.1 (Apple Git-133) //2022.9.1時点の最新バージョンではないです//
```
と表示されました。

いつのまにgitがMacにと思いましたが、一旦置いときます。

- そもそもMacに搭載されている ~~のか~~ ようです！！！
- ~~言語を勉強する中で知らぬ間に落としていたのか~~

~~（ちょっとよく分からないので勉強していく中でわかったら書き換えます）~~

(追記-9/1:デフォルトでMacに搭載されているようでした。最新にするにはバージョンアップが必要！　
独学エンジニア(Udemyの講師である山浦先生)の2-18「Gitの初期設定をしよう」にておっしゃっていました。)

# 反省点:早とちり
 1. Udemyの講座を購入
 1. サル先生のGit入門

Udemy講座は有名な「Git： もう怖くないGit！チーム開発で必要なGitを完全マスター」です。

https://www.udemy.com/course/unscared_git/

反省点としては、チュートリアルだったので全体像を伝えていたことから私が早とちりしていました。

次の講義ではインストールのセクションがありました、、、。（ちゃんと最後まで目を通します）

あと、エラーを調べている中で

https://backlog.com/ja/git-tutorial/

を知ることができ、講義前に予備知識として読んだことで理解が深まりました。


# 補足:git initとは？

調べた中で、`git init`についてメモしたのでこちらにも。

> Gitのinitコマンドは、一言で言うと「リポジトリを新規に作成」するときに使用するコマンドです。
>
>initコマンドを実行すると、現在のディレクトリまたは指定したディレクトリに「.git」というリポジトリを構成するディレクトリが作成されます。
`.git`にはGitで使用するファイルが新規に作成されます。
そのため、既に存在するリポジトリを再度初期化を行いたい場合にもinitコマンドは使用されます。
[ 参照：SAMURAI ENGINEER](https://www.sejuku.net/blog/71268 "SAMURAI ENGINEER")

以上となります。

ご覧いただきありがとうございました！！！
人事のおじさんプログラミングを学ぶ Day10「算術演算子～FuzzBuzzのファンクション」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
算術演算子を使ってFuzzBuzzのfunctionを書いてみた。
![2022-08-30 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/79b42c33-dc71-4628-3022-cb2a0ea2f2a7.png)
![2022-08-30 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/003e5257-c181-5197-be91-eac4f98221a1.png)
Python,Ruby,PHP,Java,JavaScript,Perlの関数定義の比較 (メソッド定義・サブルーチン定義なども) | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの関数定義の比較 (メソッド定義・サブルーチン定義なども)

# Python

https://qiita.com/simonritchie/items/0f7b3768031dda834907

# Ruby

https://qiita.com/shizen-shin/items/dd41d1f0176a5e764f9f

# PHP

https://qiita.com/miriwo/items/a33688165a5f36ea8e76

# Java

https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c

# JavaScript

https://qiita.com/tomcky/items/988fc5f56d019e9dc097

# Perl

https://perlzemi.com/blog/20101130129876.html
Windows10でマルチディスプレイの出力設定が簡単に行えるキーボードショートカット（ミラーリング or 拡張の切り替えも）

# 概要

長めのケーブルを使って少し離れた場所にサブモニターを置いている。
サブモニターが焼き付かないように、不使用時はサブモニターに映像写さないようにしたい。
でも、サブモニターまで直接行って電源ボタンON OFFするのは面倒。

そんな時。

# やり方

```Windowsマーク + P``` でデュアルディスプレイの設定が出てくる。
出てくるのはPC画面の右端。
（サブモニターには出てこない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9b5af58b-4514-9fc2-94eb-8db714156599.png)

```PC画面のみ``` をクリックすればサブモニターの接続が切れる。

再度接続したい時は ```複製``` or ```拡張``` を押せばいい。
（ミラーリング or 拡張の切り替えもサクッとできる）

この方法でサブモニターをOFFにするとPC側の映像出力が無くなる。
なのでマシンパワーや電力の消費を抑えられる効果もある。
（モニター側の電源OFFだけではPC側の映像出力は止まっていない状態）

# PC画面（メイン）とセカンドスクリーン（サブ）の切替

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ee49427a-e42a-d333-92cf-f7c2412d0471.png)

PC画面（メイン）にしたい方を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9739891a-fbda-f8ee-4ee6-3771adc27554.png)

下記にチェックを入れれば選択した方がPC画面（メイン）に切り替わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c94388f4-e553-918f-f365-0a6a6b061241.png)

# 蛇足（切り替えをバッチ化できるよ）

下記参照。

https://qiita.com/waokitsune/items/e63e29ba519896f7ddc3

# 参考サイトさん

https://pctextbook.com/no-multi-display/

https://solutions.vaio.com/3188

# バージョン

Windows 10 Home 21H1 OSビルド 19043.1889
【Rails】ストロングパラメータについて勉強しました【form_with】

# 目的
[Railsチュートリアル 第7章](https://railstutorial.jp/chapters/sign_up?version=6.0#sec-strong_parameters)にて**ストロングパラメータ**という概念が紹介されていたので、その必要性と実装方法をまとめます。

# 今回開発するもの
**Userモデル**　ユーザー
has_many: posts
`id`カラム: userインスタンスが作成されると自動付与される値

**Postモデル**　ユーザーが行う投稿
belongs_to: user
`content`カラム: 投稿内容
`user_id`カラム: 投稿とユーザーを紐づける値

**表示画面**
`content`にテキストを入力し、送信すると新規postに`content`と`user_id`が入力される。
という機能を実装します。

これを実装するための`create`アクションをストロングパラメータを使わずに(Progate的に)書くと下記の様になります。
```ruby:posts_controller
def create
  @post = Post.new(
    content: params[:content],
    user_id: @current_user.id
  )
end
```
このとき`@current_user`は、現在ログイン中のユーザーを意味し、application_controllerで定義されています。

ビューファイルでは`form_with`を使って、下記のように表現します。

```erb:posts/new.html.erb
<%= form_with model: @post, url: "/posts/create", method: :post, local: true do |f| %>
  <%= f.label :content %>
  <%= f.text_area :content %>
  <%= f.submit "送信" %>
<% end %>
```
このとき、ユーザーは`content`情報のみを記入し、`user_id`は記入していないことがポイントです。


# ストロングパラメータの必要性

テキストエリアに入力された値は`params`によって取得されます。
このとき、`params`に不正な値が含まれる可能性があります。
例えば`params`に`admin = 1`のような値を入れ込まれると、Webサイトの管理者権限を奪われてしまい、セキュリティ的に問題が発生します。

ここでストロングパラメータを使うと**指定した属性以外がparamsに入れられるのを防ぐ**ことができます。

# ストロングパラメータを使った記載方法

ストロングパラメータを使った`create`アクションの記載方法は以下です。

```ruby:posts_controller
def create
  @post = Post.new(post_params)
end

private
  
  def post_params
    params.require(:post).permit(:content).merge(user_id: @current_user.id)
  end
```

createアクションでは`@post`を定義しています。
`@post`はPostモデルのインスタンスを新たに作成し、そのキーと値は`post_params`を使用します。

`post_params`はコントローラ内で定義されます。
このとき、privateで保護することで、このコントローラ外で`post_params`が使用されるのを防ぎます。

さて、`post_params`は`params`に対してどのようなメソッドが使われているのかを順番に見ていきましょう。
（やっと本題）

## `require`はデータをまとめるハッシュ
`require`メソッドは`Post.new`を送るデータをまとめるハッシュの要素を示します。
Railsでは`Post.new`で送られるデータは`params[:post]`というハッシュにまとめて送っており、このハッシュの要素が`require`メソッドで指定されます。

## `permit`は入力フォームで記入する値
ユーザーが実際に入力する項目を`permit`内で指定します。
今回の例だと`content`属性の値を記入するので、`permit(:content)`としています。


## `merge`は裏で渡す値

インスタンスの属性には含めるけどユーザーが記入しない項目は`merge`内で指定します。
今回の例でいうと、ユーザーは投稿時に自分のユーザーidを記入しませんが、`@post`には`user_id`が値として付与されます。
このように**裏で渡す値**を扱う場合は`merge`を使用します。


## 複数の属性を渡すときは`,`で区切る

例えば今、投稿時にユーザーが`content`以外に`genre`という属性も記入するとします。
このときの`post_params`は

```ruby:posts_controller
def post_params
  params.require(:post).permit(:content, :genre).merge(user_id: @current_user.id)
end
```
と、`,`で区切ります。

# まとめ
ProgateでRailsを一通り勉強した後、自分で簡単な投稿サイトを作成しました。
その後Railsチュートリアルで勉強し直したところ、より現場に近い設計思想をもとに話が進んでいると感じました。
自分で作った投稿サイトをProgateレベルからRailsチュートリアルレベルにリファクタリングする上で、知識が定着する感覚を得られました。

# 参考文献

[Railsチュートリアル 第7章](https://railstutorial.jp/chapters/sign_up?version=6.0#sec-strong_parameters)

[【rails】form_forとform_tagの違い](https://oyaoya1123.hatenablog.com/entry/2019/11/12/014308)

[【Rails】form_withの使い方とストロングパラメーターによるレコード登録](https://ichitasu.com/form-with/)

[【Ruby on Rails】ストロングパラメータって何なの？](https://qiita.com/ozackiee/items/f100fd51f4839b3fdca8)
初学者のswift学習アウトプット

iOSアカデミアで学んだ学習内容を適時アップしていこうと思います。

<h2>学習内容</h2>
・「protocol」:複数のクラスで共有するメソッドを記述。protocol名を付けたclassには、protocolで記述したメソッドを記述しなければならない。<br>
<br>
・「Delegate」：あるクラスの処理完了時に他のクラスの処理を実行させる。delegateを受け取る側のクラスには、以下のように定義しなければならない。

```
「例」：変数名.delegate = self
```
・「Extension」：クラスや型に拡張機能を持たせる構文。拡張機能とは、メソッドや変数を定義でき、一部のクラスや型に機能を持たせた場合に使用。swiftファイルを分割し見やすいコードになる（リファクタリング？）。<br>
<h3>Xcode</h3>
・「navigator area」：画面左側のカラム。【command + 0】で表示非表示の切り替えができる。<br>
・「storyboard」：アプリの画面を作成するためのファイル<br>
・「editor area」：中央に表示されているエリア。左側にはビュー階層が表示されている。<br>
・「utility area」：画面右側のカラム。画面に設定されているクラス名や部品の組み込みなどを行える。【command + option + 0】で表示非表示。<br>
・「UINavigationController」：iOSで標準で用意されているUI系クラスの一つ。画面の構成に使用される。<br>
・画面を構成するパーツを組み込む時、【command + shift + L】でショーライブラリを開き、組み込みたい部品を検索。ドラッグ&ドロップ
・画面左上にある再生ボタンを押すとシミュレーターの起動ができる。デバイスの種類が選択されていないと起動できない。<br>
<br>
<br>
・「View」：見た目を作る。StoryBoardファイル上で作成<br>
・「Controller」：見た目を動かす。swiftファイル上で作成<br>
・「UIKit」：モジュールの１つで、ファイルにインポートするとUIに関するクラスを格納したUIKitがインポートされ、ファイル内で使用できる。<br>
・「クラス継承」：インポートしたクラスやメソッドをファイル内で使用する場合は以下のように記述

```
「例：」　　class HomeViewController: UIViewController {}
```
・「viewDidLoad()」：このメソッドに記述されているものは、画面に表示される際に呼び出される。画面の表示非表示に応じて実行されるメソッドのことを「ライフサイクルメソッド」という。<br>
・「UITableView」：リスト表示を作成するために使用される。<br>
<br>
・「Autolayout」：配置したコンポーネントに対してConstraints(制約)をつけることで、自動的にレイアウトが調整される機能<br>
・「padding」：余白のこと。【top（上）】【bottom（下）】【leading（左）】【trailing（右）】　<br>　　　　　　　　エディターエリア右下の【add new constraint】で編集する。<br>
・「superview(Container)」：Viewの土台になっている一番大きなview。親Viewともいう。<br>
・「horizontal」：水平方向のこと。10,20と数値を増やすと右に動く。<br>
・「vertibally」：垂直方向のこと。10,20と数値を増やすと下に動く。<br>
・「conflict」：エラー。制約を付けた際に矛盾が生じてしまっている。
レコメンドでのEmbeddingに関する考慮点とリンク集

レコメンドするにあたり使えそうなEmbeddingを調べたのでまとめます。主に考慮点とリンク集です。

# Embeddingするデータ

1. テキストデータ: word2vec化
1. ID: ニューラルネットワークのEmbedding層
1. 購入/閲覧履歴: バスケット単位とするか、ユーザ単位とするかが検討点。

# 用途
1. コサイン類似度レコメンド: 単一アイテムに対してコサイン類似度が近いアイテムをレコメンド
1. Embedding層と他層で学習: ニューラルネットワークの1つの層としてEmbedding層を使用
1. 特徴量生成: word2vecのように特徴量を生成
1. リコール層: レコメンド候補となるアイテムの絞り込み(レコメンド対象は別途分類器/回帰で決定)

# アルゴリズムと論文
## シーケンシャル系
### Item2Vec: Neural Item Embedding for Collaborative Filtering
MSの論文

https://arxiv.org/abs/1603.04259

https://ohke.hateblo.jp/entry/2017/12/02/230000

https://qiita.com/FukuharaYohei/items/255d8df71bbf6b000ea4

### prod2vec: E-commerce in Your Inbox: 
Yahooの論文。Product Recommendations at Scale。

https://dl.acm.org/doi/10.1145/3219819.3219885

### prod2vec: Real-time Personalization using Embeddings for Search Ranking at Airbnb
Aribnbの論文。HostとGuestの双方向なのが特徴的らしい。

https://dl.acm.org/doi/10.1145/3219819.3219885

GitHubにPDFあり。
https://github.com/wzhe06/Ad-papers/blob/master/Embedding/%5BAirbnb%20Embedding%5D%20Real-time%20Personalization%20using%20Embeddings%20for%20Search%20Ranking%20at%20Airbnb%20(Airbnb%202018).pdf

### BERT4Rec
中身見ていないが論文リンク貼っておきます。

https://arxiv.org/abs/1904.06690

## Graph Embedding
### Random Walk

https://qiita.com/kk31108424/items/e05b32c1161f1e309328

Graph Embeddingとは何と思ったときに、この絵がわかりやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/9d67c23b-da38-0409-bdbc-f778d16fc96e.png)

### Graph NN
Embeddingじゃないけど参考

https://www.wantedly.com/companies/wantedly/post_articles/350811

# 参考
## 全般。
レコメンドと埋め込み表現。良くまとまっていて参考にしました。

https://qiita.com/yyyang/items/a8cdeea7717a30d2a139

実装している人。行列転置など参考になるかも。

https://ohke.hateblo.jp/entry/2017/12/08/230000

## 注意点
ハイパーパラメータ。論文の「Word2Vec applied to Recommendation: Hyperparameters Matter」で、結論だけ知りたければ「4. RESULT」の表の「fully optimized SGNS」を見ればOK。表中の()内4つの数値が、以下のハイパーパラメータに対応。

|順番|ハイパーパラメータ|gensimのWord2Vecパラメータ|
|:-:|:--|:-:|
|1|window-size|window|
|2|number of epochs|epochs|
|3|sub-sampling parameter|sample|
|4|negative sampling distribution parameter|ns_exponent|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/ad6b7157-96e2-93d1-223b-22211a241533.png)

https://arxiv.org/abs/1804.04212

gensimはこちら。

https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec

https://qiita.com/dcm_kkubota/items/4c0a87e3a947c2f3e14b
法人等略語マスタで組織名を名寄せする(SPSS Modeler データ加工逆引き6-7)

# 法人等略語マスタで組織名を名寄せする

![スクリーンショット 2022-08-10 13.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2685c90e-bd89-e3e4-9d2d-1d7fc8618a09.png)

*(株)を「株式会社」に置換する場合には逆引き２−10（文字列の置換）を参照ください。

https://qiita.com/416nishimaki/items/c233e724cce81fdc76d0

## 1.想定される利用目的

・顧客マスタや取引先マスタデータのクレンジング
・対象データの精査

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/rename_master.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-10 13.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d8f09267-4078-e91e-c04c-86d37ac757f7.png)

a.入力するデータひとつ目は以下の通りです。法人名略称との併用で表記揺れが起きています。
![スクリーンショット 2022-08-10 13.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e4c81fa0-1c6f-c1a3-d89e-d45f3a807d73.png)

b.入力するマスタは以下の通りです。括弧が全角と半角の2種類それぞれに用意しています。
![スクリーンショット 2022-08-10 13.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ebc63b84-db5d-36ad-dfc1-a042a49338a8.png)

c.[レコード結合]ノードを編集します。[レコード結合方法]は[条件]を選択しaを主テーブルに[部分外部結合]します。issubstring(略称, 会社名)はaの会社名列にbの略称を見つけた場合その位置を整数で返します。以下の式で、見つけた場合に限り該当レコードと結合します。
![スクリーンショット 2022-08-10 13.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/704f9e3b-b9ee-2737-da86-fc32187a1994.png)

[プレビュー]します。該当する略称を持つレコードに正式名称の列が追加されました。
![スクリーンショット 2022-08-10 14.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/14c1feea-3053-b7de-7430-ec45d66cc7c4.png)

d.[フィールド作成]ノードを編集します。略称がNullの場合には[会社名2]にはオリジナルの列を入れ、そうでない場合にはreplace関数で略称の文字列を正式名称で置き換えます。
![スクリーンショット 2022-08-10 13.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d2c3dd1-dc5f-06e1-bf35-b90a3574086f.png)

[プレビュー]します。
![スクリーンショット 2022-08-10 13.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/247b9767-6382-7d03-4668-30a0e6eb535b.png)

#### 注意事項

医療法人系の略称と正式名称が1対1でないためマスタから除きました。必要に応じてエクセルなどで適切なマスタを作成して利用ください。

## 4.参考情報

#### 名寄せとデータクレンジングを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-03/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
macOS: 新規Finderウインドウを開いたとき表示するディレクトリを設定するコマンド

Finderで新規ウインドウを開いたとき、どのディレクトリを表示するかはFinderの環境設定で変更できます。

![CleanShot 2022-09-01 at 05.42.55@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/2f911145-a3d3-3fa4-222b-7b18c26bac74.png)

この設定を`defaults`コマンドで変更するには、`com.apple.finder`の`NewWindowTargetPath`に、ディレクトリのパスを指定します:

```shell
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/Desktop"
```
Dockerを使ってMacでSQLServerを使用する

SQLServer本体や、GUIツールのSQL Server Management StudioはWindowsでしか使えない
MacでSQLServerを利用するためのメモ

## Dockerイメージの取得
`Docker pull`でDocker HubよりDockerイメージを取得する
```console
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
```
SQLServerの各versionはコロンの後に指定する
指定できるversionは下記を参照

https://hub.docker.com/_/microsoft-mssql-server

## Dockerコンテナ作成
`docker run`でコンテナを作成する
```console
sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" \
   -p 1433:1433 --name sql1 --hostname sql1 \
   -d \
   mcr.microsoft.com/mssql/server:2022-latest
```
`docker ps`でDockerコンテナを表示する
正常にDockerコンテナが作成されると`STATUS`が`Up`となる
```console:normal
sudo docker ps -a

CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                    NAMES
002b5cc5a9db   mcr.microsoft.com/mssql/server:2022-latest   "/opt/mssql/bin/perm…"   15 seconds ago   Up 14 seconds   0.0.0.0:1433->1433/tcp   sql1
```
エラーが出た場合、`STATUS`が`Exited`となる
下記はパスワード強度がSQLServerの基準を満たしておらず、エラーとなった事例
```console:error
sudo docker ps -a

CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                        PORTS     NAMES
f9da266bced0   mcr.microsoft.com/mssql/server:2022-latest   "/opt/mssql/bin/perm…"   12 minutes ago   Exited (255) 12 minutes ago             sql1
```
エラーログの確認
```console
docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection

Error response from daemon: Container f9da266bced092c0c6ecaa7df2dac5ee638ad5b0229e8acfd0b237f7dc70dc5f is not running
```
## SQLServerに接続する
稼働しているコンテナ名を指定して接続する
```console
sudo docker exec -it sql1 "bash"

mssql@sql1:/$ 
```
コンテナに入れたらフルパスとパスワードを指定
```console
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
```

SQLServerへの接続が成功した場合、`1>`が表示される

## Azure Data Studio
Azure Data Stduioは、OSを問わず利用できるGUIツール
MacからGUIで操作する場合におすすめ

https://docs.microsoft.com/ja-jp/sql/azure-data-studio/?view=sql-server-ver16

## Reference
https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&pivots=cs1-bash