OmniAICreator/Qiita-1.07M huggingface dataset:
`pandas.read_csv` : CSVの列数が`names`引数で指定した列数より大きい場合、右側から列名が割り当てらる

# 環境
* Python 3.11.2
* pandas 1.5.3


```
In [37]: pandas.show_versions()
/home/vagrant/.pyenv/versions/3.11.2/lib/python3.11/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.
  warnings.warn("Setuptools is replacing distutils.")

INSTALLED VERSIONS
------------------
commit           : 2e218d10984e9919f0296931d92ea851c6a6faf5
python           : 3.11.2.final.0
python-bits      : 64
OS               : Linux
OS-release       : 5.15.0-60-generic
Version          : #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023
machine          : x86_64
processor        : x86_64
byteorder        : little
LC_ALL           : None
LANG             : ja_JP.UTF-8
LOCALE           : ja_JP.UTF-8

pandas           : 1.5.3
numpy            : 1.24.2
pytz             : 2022.7.1
dateutil         : 2.8.2
setuptools       : 65.5.0
pip              : 23.0.1
Cython           : None
pytest           : None
hypothesis       : None
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : 4.9.2
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 3.1.2
IPython          : 8.11.0
pandas_datareader: None
bs4              : None
bottleneck       : None
brotli           : None
fastparquet      : None
fsspec           : None
gcsfs            : None
matplotlib       : None
numba            : None
numexpr          : None
odfpy            : None
openpyxl         : None
pandas_gbq       : None
pyarrow          : None
pyreadstat       : None
pyxlsb           : None
s3fs             : None
scipy            : None
snappy           : None
sqlalchemy       : None
tables           : None
tabulate         : None
xarray           : None
xlrd             : None
xlwt             : None
zstandard        : None
tzdata           : None
```


# やりたいこと
ヘッダ行がないCSVファイルを`pandas.read_csv`関数で読み込みたいです。

```csv:input1.csv
1,Alice,Japan
2,Bob,U.S.
3,Chris,China
```


```
In [39]: df = pandas.read_csv("input1.csv", header=None, names=["id","name","country"])

In [40]: df
Out[40]: 
   id   name country
0   1  Alice   Japan
1   2    Bob    U.S.
2   3  Chris   China

In [41]: df.dtypes
Out[41]: 
id          int64
name       object
country    object
dtype: object

```


# ハマったこと
3列のCSVを想定していますが、以下のように末尾にカンマを付けて5列にしても問題なく読み込めると思っていました。

```csv:input1.csv
1,Alice,Japan,,
2,Bob,U.S.,,
3,Chris,China,,
```

しかし、列名に対応する値はズレていました。
また余った列は、`df.index`に使われていました。

```
In [75]: df = pandas.read_csv("input2.csv", header=None, names=["id","name","country"])

In [76]: df
Out[76]: 
            id  name  country
1 Alice  Japan   NaN      NaN
2 Bob     U.S.   NaN      NaN
3 Chris  China   NaN      NaN

In [77]: df.index
Out[77]: 
MultiIndex([(1, 'Alice'),
            (2,   'Bob'),
            (3, 'Chris')],
           )

```


# まとめ
CSVの列数が、`pandsa.read_csv`関数の`names`引数に指定した列数より大きい場合、右側から列名が割り当てられます。左側の余った列は、DataFrameのindexに使われます。



# 参考にしたサイト

https://qiita.com/yuba/items/d09e387a1ec191eb2738
BPO

# BPO（Business Process Outsourcing)
自社の業務プロセスの一部を```外部の専門業者へアウトソーシング(委託)```すること。

### オフショア
国内企業から見た海外を意味する用語。
業務プロセスにおいては、```情報システムの開発や運用を人件費の安い海外の企業や子会社に委託```すること。
オフショア開発、オフショアアウトソーシングなどがある。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
BPM

# BPM(Business Process Management)
* 業務分析、設計、業務プロセス構築、プロセスの実行とモニタリング、評価といった```PDCAサイクル```を繰り返しながら、```業務プロセスを継続的に監視・改善していく管理手法```.

    BPMを実施・運用するための基盤となる仕組みを```BPMS(BPM System)```という。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

* ```業務の流れを単位ごとに分析```し、整理することで```問題点を明確化```し、効果的に、また効率よく仕事ができるように```継続的に改善する管理手法```です。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4
PHPのnull許容演算子について簡単にまとめてみる

## はじめに
プロジェクトを通じて初めてnull許容演算子を使ったがよく理解していなかったので少しわかるようにまとめてみる。
これから出てくることも少なくないだろうからしっかりとここで頭に入れる。

## null許容演算子とは
PHPの`null許容演算子(?->)`は、PHP 7.4から導入された演算子で、オブジェクトがnullでない場合にのみ、プロパティやメソッドにアクセスするために使用される。

通常、PHPでオブジェクトのプロパティやメソッドにアクセスする場合、オブジェクトがnullであるとエラーが発生する。
null許容演算子を使用することで、nullチェックを行うことなく、安全にオブジェクトを操作することができる。

### null許容演算子の例
例えば、以下のコードでは、$userがnullである場合に
`Error: Trying to access property 'name' of non-object`というエラーが発生する。

```php
$user = null;
$name = $user->name;
```

これをnull許容演算子を使用して書き換えると、以下のようになる。
```php
$user = null;
$name = $user?->name;
```

上記の例では、`$user`が`null`であるため、`$name`には`null`が代入される。
`null許容演算子`を使用することで、`$user`が`null`である場合に発生するエラーを回避し、安全にコードを実行することができる。

また、null許容演算子は、メソッドに対しても使用することができる。以下は、`$user`が`null`でない場合に、`$user->getName()メソッド`を呼び出す例。

```php
$user = null;
$name = $user?->getName();
```
上記の例では、`$user`が`null`であるため、`$name`には`null`が代入される。
`null許容演算子`を使用することで、nullチェックを省略し、コードを簡潔に書くことができる。

### こんな使い方も
null許容演算子では以下のようなコードを一文で書くこともできる。

```php
$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}
// $countryが取り出せた
```

こうなる
```php
$country = $session?->user?->getAddress()?->country;
```

頑張って覚える。以上。
【Git】addを取り消したい

# はじめに
個人開発などは`git add .`で済ませているのですが、
インターン先で変更はするけど、コミットしないファイルがあり、アンステージングを新しく学んだので記録しておきます。

# 変更ファイルの確認コマンド
```
git status
```
![スクリーンショット 2023-03-08 15.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2319467b-f5b4-e83a-b7b5-a1c59528233a.png)

今回の例では`HomeView.swift`と`WebView.swift`を変更しています。

# ステージング
```
git add .
```
![スクリーンショット 2023-03-08 15.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/736eff46-a197-62b4-48cd-8429d3b45d31.png)

本来は`HomeView.swift`のみステージングしたかったのに間違えて`WebView.swift`もステージングしてしまった

# アンステージング
```
git restore --staged IconStudio/View/WebView.swift
```
![スクリーンショット 2023-03-08 15.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/38a772d6-2f2e-e0a7-20c8-0c7a7dcadea6.png)

アンステージングできました

# おわり
まだまだ知らないことが多そうです
AWS ポリシー lambdaから特定のEC2内のエンドポイントを実行するためのユーザーポリシー

# 概要

- lambda関数からEC2にアクセスしたい場合にlambdaに付与するロールに追加するユーザー定義ポリシーを紹介する

# 作りたいもの

- VPC内にあるEC2インスタンス内にあるWebサーバーにあるAPIエンドポイントにLambda関数（Node.js）からリクエストを贈りたい。
- その際にEC2インスタンスを指定してlambda → EC2インスタンスのアクセスを許可したい。

# 結論

- 特定のEC2インスタンスにしかアクセスさせたくないので下記の様に定義する。

    ```json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents",
                    "ec2:CreateNetworkInterface",
                    "ec2:DescribeNetworkInterfaces",
                    "ec2:DeleteNetworkInterface",
                    "ec2:AssignPrivateIpAddresses",
                    "ec2:UnassignPrivateIpAddresses"
                ],
                "Resource": "arn:aws:ec2:ap-northeast-1:当該EC2の詳細の「所有者」の数字:instance/当該EC2の概要にある「インスタンスID」"
            }
        ]
    }
    ```

- 前述のJSONをユーザー定義ポリシーとして作成しlambda関数に割り当てられているロールにそのユーザー定義ポリシーを追加する。

# 方法

1. 「lambdaをEC2と同じVPCに設置してEC2にアクセスする」ためのポリシーは実はAWSが既に用意してくれている。そのポリシーが`AWSLambdaVPCAccessExecutionRole`ポリシーである。
1. 下記に当該のポリシーを記載する。

    ```json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents",
                    "ec2:CreateNetworkInterface",
                    "ec2:DescribeNetworkInterfaces",
                    "ec2:DeleteNetworkInterface",
                    "ec2:AssignPrivateIpAddresses",
                    "ec2:UnassignPrivateIpAddresses"
                ],
                "Resource": "*"
            }
        ]
    }
    ```

1. ぶっちゃけ↑のポリシーをlambdaのロールに付与すれば事は済む。
1. ただリソース（EC2インスタンス）が指定されていないからAWSの言う「最小の権限」にはなってない。
1. そこで下記の記事を参考にEC2のインスタンスをarnで指定してあげただけである。

https://qiita.com/miriwo/items/6d44244f612bcbaa07a9
どこよりもわかりやすい？AWS EC2インスタンスのリソースネーム（arn）の割り出し方

## 概要

- どこよりもわかりやすく（誇張）EC2インスタンスのarnコードを割り出す方法を簡単にまとめる。

## 前提

- AWSのEC2のインスタンス一覧ページにアクセスして表示できる事

## 結論

- EC2のarnコードは下記となっている。（東京リージョンの場合）

    ```
    arn:aws:ec2:ap-northeast-1:当該EC2の詳細の「所有者」の数字:instance/当該EC2の概要にある「インスタンスID」
    ```

## 求め方

1. arnコードフォーマットをメモ帳かなにかにコピペで用意する

    ```
    arn:aws:ec2:ap-northeast-1:当該EC2の詳細の「所有者」の数字:instance/当該EC2の概要にある「インスタンスID」
    ```

1. インスタンス一覧ページを開く

    ![インスタンス___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7c48774f-571f-d606-b038-fdd5751d89b4.png)

1. 「所有者」の数字をコピーボタンをクリクしてコピーする。

    ![インスタンス___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/62a89371-6183-b796-c0b7-183ea358121f.png)

1. arnコードフォーマットの「当該EC2の詳細の「所有者」の数字」をコピーした「所有者の数字」で置き換える。
1. 「インスタンスコード」をコピーボタンをクリックしてコピーする。

    ![インスタンス___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ef16c686-d7a3-a101-00e7-476908aca42b.png)

1. arnコードフォーマットの「当該EC2の概要にある「インスタンスID」」をコピーした「インスタンスコード」で置き換える。
1. 下記のような感じになるはず（`*`とか`x`には実際の値が入る）これでarnコードは完成

    ```
    arn:aws:ec2:ap-northeast-1************:instance/i-xxxxxxxxxxxxxxxxx
    ```
Unity PhotonUnityNetwork2(PUN2) OnJoinedRoomが呼ばれない件について

# Unity PhotonUnityNetwork2(PUN2) OnJoinedRoomが呼ばれない
あるときPUN2が正常動作しないことに気づきました。
マスターサーバーに接続が成功すると呼ばれるコールバックメソッドのOnConnectedToMasterは正常に呼ばれています。

```
   public override void OnConnectedToMaster()
    {
        Debug.Log("PUN2 OnConnectedToMaster");
        PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
    }
```

ですが、ルームへの接続が成功した時に呼ばれるコールバックメソッドのOnJoinedRoomが呼ばれないことに気づきました。
```
public override void OnJoinedRoom()
    {
        //これが呼ばれない
        Debug.Log("PUN2 OnJoinedRoom");
    }
```

# PUN2のログの確認
何はともあれ、ログを確認してみます。
PUN2の詳細なログを出すには、
PhotonServerSettings.assetをUnityで開いてインスペクターのSupportLoggerにチェックを入れます。

以下のディレクトリパスにPhotonServerSettings.assetがあります。
`Assets/Photon/PhotonUnityNetworking/Resources/PhotonServerSettings.asset`

![スクリーンショット 2023-03-08 15.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249502/238b839b-4ece-2d34-0168-5a17059da7f9.png)

# エラーの確認
私の場合は以下のエラーが出ていました。
`OnJoinRoomFailed Failed to get server instance.`

# 解決
先ほどのPhotonServerSettings.assetを開いて「Dev Region」に「us」を追加したら解決しました。
恐らく、jpの方のサーバーが何かしらのトラブルが起きていて接続できなかったのだろうと推測しています。
デバッグ環境であれば問題ないですが、リリース時には必ず元の設定に戻してください。

Dev Region
`jp,us`

![スクリーンショット 2023-03-08 15.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249502/7e81422a-0a69-e4d9-6af0-0b8f652e237a.png)
DALL・E APIで犬に眼鏡を掛ける（実現方式編）

# はじめに

こちらは前回の記事の続きになります。

https://qiita.com/MEGAERA/items/115c78739541085c86a1

前回、犬の画像を自動生成するやり方を紹介しました。
ただ、DALL・Eでは画像を生成するだけではなく、下記のように画像に対して要素を追加する事が可能みたいです。

下記例だと、ただの部屋の写真にアヒルボート？みたいな何かが追加されています。
（これ、アヒル・・・？）

![image-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/d3ea7738-4cd8-e0c4-0266-90bddb2822ad.jpeg)
(DALL-E 2を発表したOpenAIブログ記事より抜粋)
https://openai.com/product/dall-e-2

詳細な使用方法はこちらに記載されています。

https://platform.openai.com/docs/api-reference/images/create-edit

なので、この技術を使用して**自動生成した犬の画像に眼鏡を掛けさせてあげたい**と思います！
長くなりそうなので、今回は実現方式についてのみ説明します。
実際のコードなどの説明はまた次回行う予定です。

# 実現方式

DALL・Eはあくまで画像を編集するのではなく、画像を生成するツールです。
DALL・Eで先ほどのアヒルのように、既存の画像に対して要素を追加する場合、「この部分に追加してね！」っていう事を明示しなくてはなりません。
 
そのため、編集してほしい箇所に対して透過処理を行う必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/4614bbc4-e606-a36d-188c-fe6a19d17372.png)

（因みに、この柴犬の画像もDALL・Eで自動生成した画像です。）

ただ、この透過加工をいちいち手動でやるのも大変なので、こちらも自動で透過させたいです。
それには、ワンちゃんの目の位置を検出させる必要があります。

そこで、OpenCVというライブラリを使用しました。
詳しい説明は割愛しますが、物体検出など画像の様々な処理が可能になるライブラリです。
詳細は下記リンクをご参照下さい。
今回は、その中の目を検出する「haarcascade_eye」という物を使用しました。
  
  
参考

https://shikaku-mafia.com/opencv-eye-detection/

こちらを使い、ワンちゃんの目の位置を特定する事が可能です。
![eyes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/bc750e39-d7b5-6a67-962d-27d0a1b8d6bd.png)

あとは、OpenCVで特定した目の位置の座標を元に、画像に透過処理を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/e3796449-2dbf-51cc-fd80-fe63ab38e6bb.png)

# DALL・Eにリクエストを送信
先ほど、透過処理を行った画像を **「put glasses on dog」** というリクエストと共に、DALL・Eへ送信します・・・
![result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/0bbab338-ebc9-d45d-191d-3a2643d78115.png)

透過した部分に、眼鏡を付けてくれました！
かわいい。

今回はかけ足で、実現方式だけ説明してしまいましたが、
詳しい実装の解説はまた次回行おうと思います。
XAMPPコントロールパネルのShellが開かない

xamppのコントロールパネルでShellを開こうとするとほんの一瞬表示されてその直後閉じてしまいます。
原因が分かる方がいらっしゃいましたら教えていただきたいです。

【試したこと】
WindowsのPowerShellは開く。
Xamppの再インストール。


Windows11 
Xampp　Control　Panel　v3.3.0

よろしくお願いいたします。
テスト記事です→こういうのは早く消さなければならないらしい



API経由でQiitaに記事を投稿している際に発生。

コメント欄より @shiracamus さんからご教授いただきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/6293958f-a764-0c20-24c7-81d8d100da18.png)

参考のURLは以下の通り。
ちゃんとしたコミュニティガイドラインに書かれていた。

https://blog.qiita.com/notice-community-guideline-update/

以下詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/d55c78c2-6c50-5e53-8a87-81f903eaa407.png)
「SDK for Adaptive Server Enterprise 16.0 SP04 PL03」 インストールと接続

# SDK for Adaptive Server Enterprise 16.0 SP04 PL03 インストール

SDKは「Software Development Kit」の略称になりますが、単純に
SAP ASEのSQLクライアントの感覚で認識してもらえるとわかりやすいかと

## インストーラダウンロード(トライアル)

### 事前準備

私はクライアント端末側はWindowsの想定なので、Windowsの64bit用
https://developers.sap.com/trials-downloads.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/fdd958d6-b5ae-2213-d095-168bb3c1f0e4.png)

### インストール

ダウンロードすると「winx64164003.ZIP」なるzipファイル。
わかりにくいので、名前変更して展開するとsetup.exeがあるので、実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/c89d29ad-8dfb-9604-20f6-642da700ed6e.png)

ユーザアカウント制御画面が出るので、はい
<img width="400" src= https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/fcbeac1a-17ff-4629-d9f0-49c03d798fa2.png>

そのまま日本語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/265bf0af-281f-5b18-f61f-e0445ee12535.png)

次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/b8e73f29-7117-84f4-c3d1-8d319458dcc8.png)

日本を選択して、ライセンス同意にチェック。次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/74ee0cea-d45c-789d-f96f-2d4d9f7dfe36.png)

インストール先を選択。次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/ec09b445-5f14-8ba5-1086-cb4fa57aa3e5.png)

標準で問題なし。次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/8e5c9c80-ac2e-2d71-6f7c-2730c3c8572a.png)

インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/84a3d955-c258-52da-bca0-9aa629e90369.png)

アクセス許可確認が出たら、アクセス許可
<img width="400" src= https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/a5d31644-944d-a9f8-d7ea-7c4d2120b28b.png>

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/515998ac-6377-299e-597c-1215c67f81df.png)


### ASEサーバへ接続

インストーされるのがinteractive SQL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/f9200fd5-2fda-97ab-9068-d524efcf67e1.png)

ログイン画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/d66a4fae-b946-7676-faf0-a366589f5a7e.png)

https://l-w-i.net/t/sybase/jconnect_001.txt

interfacesファイルのqueryエントリで指定されているとのことなので、ほい確認
※構築済みのSAPASEトライアル環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/d172f6f3-3976-859b-6ba4-048e6fc66a73.png)

VirtualBOXのポートフォワーディングを4901で設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/757f539e-af52-710a-5e4c-4c657685f587.png)


ログインポートを4901にして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/690e53fa-0f8a-22d2-3d7c-9499110e786f.png)

接続成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/436b02f4-0806-c13f-42f5-f1bb52a07a93.png)

こんな感じでクエリ実行OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2574123/396fb03a-1e78-82b7-fc32-c61b490cf09d.png)
OnenoteでTODOリストを作ってみた。

## 本記事から分かること
Microsoft社のOffice365にも標準搭載されているOneNoteを使用して
以下のような階層形式のTODOリストを作成します。
![TODO_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792638/f50e5176-6c14-baf8-54cc-36a69aa03e2b.png)


## 本文
 - **背景**
    - 日々のタスクを管理するにあたってタスクをアクションベースまで手軽に落とし込めるTODOリストを作成したかった。
    - PC搭載のメモ帳や付箋の場合、編集が行いづらくPC依存となってしまうため不便に感じていた。

- **作成方法**
　作り方は簡単です。

>1. 任意のノートブックを作成する
>1. その中のフィードにてTODOリストを作成する
>1. ノート内で好きな単位（月、週、日）のTODOリストを作成する
>1. ノート内で箇条書きフォントでタスクを書き出す
    
### メリット
以下に私自身が使って感じるメリットを記載します。

- TODOリストがOneNote上に一括管理できる。
- 仕事の記憶を遡る必要が生じたときにも検索ボックスからキーワード検索が行える。

- チェックマークを付けたり、取り消し線を挿入したりと手軽に進捗の管理ができる。


- マルチデバイスに対応しているため、どこからでもタスクを確認できる。


### デメリット
- タスクを管理することが重荷となってしまう。

- タスクを洗い出すだけに対してアクションが多く、慣れるまで時間を要してしまう。


## 便利機能（おまけ）

- 　"表示<デスクトップの端に表示" を行うことでデスクトップ上で邪魔にならないサイズに調節可能。

- 　ショートカットキーのカスタマイズが9個まで可能。（ [Ctrl]+ [1-9] ）

- 　シール（★、？）を活用することでタスクごとの差別化も可能。


## まとめ
　本記事では多くの企業でも導入されているOffice365上のサービスOneNoteによるTODOリストの作成をまとめました。
皆さんも日々のタスクによって大量のテキストファイルが生まれてしまう経験1度はあるのではないでしょうか。
その問題から解放され、日々のタスクを把握する手がかりになることを願っています。
paiza.ioでnadesiko その17

# 概要
paiza.ioでnadesikoやってみた。
練習問題、やってみた。

# 練習問題
ニューラルネットワークでxorを推定せよ。
tensorflow.jsでxorを学習した、ウェイトとバイアスを与える。
量子化されてる。
活性化関数は、tanhとsigmoid

# サンプルコード

```

w10 = [-35, 3, -15, 22, 23, 27, -19, -12]
w11 = [21, 2, 20, -14, -15, 19, 32, 19]
b1 = [-7, 3, 4, 3, 3, -4, 4, 2]
w2 = [14, 7, -24, -18, -25, 39, -19, -14]
b2 = 9

●mul(a, b) 
    c = []
	xを０から7まで繰り返す
		c[x] = a[x] * b
    ここまで
    cを戻す
ここまで
●add(a, b) 
    c = []
	xを０から7まで繰り返す
		c[x] = a[x] + b[x]
    ここまで
    cを戻す
ここまで
●sum(a, b) 
    sは0
	xを０から7まで繰り返す
	    s = s　+ a[x] * b[x]
	ここまで
	sを戻す
ここまで
●tanh(v) 
    c = []
    xを０から7まで繰り返す
        i = v[x]
	    a = EXP(i / 10)
        b = EXP(-1 * i / 10)
        c[x] = FLOOR((a - b) / (a + b) * 10)
    ここまで
    cを戻す
ここまで
●sigmoid(a) 
    c = FLOOR((1 / (1 + EXP(-1 * a / 10))) * 10)
    cを戻す
ここまで

「A B XOR」を表示
iを０から１まで繰り返す
    jを０から１まで繰り返す
        h = mul(w10, i)
        l = mul(w11, j)
        h = add(h, l)
        h = add(h, b1)
        h = tanh(h)
        y = sum(h, w2)
        y = y + b2
        y = sigmoid(y)
        「{i} {j} {y}」を表示
    ここまで
ここまで


```

# 

```
A B XOR
0 0 0
0 1 10
1 0 10
1 1 0
```

# 成果物

https://paiza.io/projects/LDvSmfNEjYvOG2QEJyjOfg


以上。
CSS Modules で :global を使うと「Error: Missing whitespace after :global」と言われてしまう件

下記のような書き方をすると `Error: Missing whitespace after :global` と言われてしまった。
書き方は間違えてないはずなんだけどなあ。

```scss:test.module.scss
.container {
  :global {
    &.active {
      color: red;
    }
  } 
}
```

どうやら `css-loader` に含まれている `postcss-modules-local-by-default` の不具合らしい。
https://github.com/webpack-contrib/sass-loader/issues/507#issuecomment-351065764

PostCSSの設定を変更すれば回避できるらしいけど、気軽に設定を触れる環境ではなかったので書き方で回避した。

```scss:test.module.scss
.container {
  &:global(.active) {
    color: red;
  } 
}
```

ま、これでいいか
LINE Messaging APIを使用してテキストメッセージを送信するためのPythonロジックの例

以下は、LINE Messaging APIを使用してテキストメッセージを送信するためのPythonロジックの例です。line-bot-sdkを使用しています。

```python
from linebot import LineBotApi
from linebot.exceptions import LineBotApiError
from linebot.models import TextSendMessage
```

# LINE Messaging APIのチャネルアクセストークンを設定

```python
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
```

# 送信先ユーザーIDと送信するメッセージを設定

```python
user_id = 'USER_ID'
message = TextSendMessage(text='Hello, World!')

# LINE Messaging APIを使用してメッセージを送信
try:
    line_bot_api.push_message(user_id, message)
    print('Message sent!')
except LineBotApiError as e:
    # エラーが発生した場合は、エラーメッセージを出力
    print('Error occurred: {}'.format(e))
```

上記の例では、LINE Messaging APIのチャネルアクセストークンを設定し、送信先ユーザーIDと送信するメッセージを指定しています。そして、line_bot_api.push_message()メソッドを使用してメッセージを送信しています。

この例は、ユーザーIDとチャネルアクセストークンを正しく設定した場合にのみ動作します。したがって、実際に使用する前に、自分のボットのユーザーIDとチャネルアクセストークンを使用するようにコードを変更する必要があります。
掲示板の日時を日本日時に変更する方法

## はじめに
投稿型の掲示板を作成される方、投稿がいつ何時に投稿されたか、表記がありますと優しいサイトに仕上がると思います。

デフォルトでは外国日時になっているのですが、
今回は日本日時に変更する方法をお教えします！

## 実装

まず、config/application.erbに追記します
```
config.time_zone = 'Tokyo'
```

これで東京時刻に変更されます。

次に、config/initializers配下にtime_formats.rbを追加してください。
このファイルには、viewファイルで使いまわせるフォーマットを作っていきます。
```
Time::DATE_FORMATS[:datetime_jp] = '%Y年 %m月 %d日 %H時 %M分'
```
このフォーマットでより分かりやすく日本語表記にしていくように漢字の設定を定義しています。



お次はviewファイルをいじっていきます。
表示させたいviewファイルに(今回は@boardsでやりました)
```
<% @boards.each do |board| %>
    <tr>
        <th><%= board.id %></th>
        <td><%= board.title %></td>
        <td><%= board.name %></td>
        <td><%= board.created_at.to_s(:datetime_jp)  %></td> #ここの記述
        <td><%= board.updated_at.to_s(:datetime_jp) %></td>　#ここの記述
     </tr>
<% end %>
```


こうすることによって掲示板の作成日時と更新日時を日本語表記にすることができました！！


# さいごに
自身の備忘録としてこれからも投稿していきますのでよろしくお願いいたします！
Cloudflare の Notification をテストする (webhook)

## Cloudflare の Notifications テスト (webhook)

[Notification webhook](https://developers.cloudflare.com/fundamentals/notifications/) の受け子に [tines](https://www.tines.com/) の一部を利用
簡単にすぐ使える。

1. [tines] tines のサインアップ
1. [tines] 新しい story の作成
1. [tines] Webhook をドラッグアンドドロップ
![Screenshot 2023-03-08 at 10.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/19c952e4-1263-e1b3-6202-b77e82e90def.png)
1. [tines] Webhook の URL をコピー
<img width="300" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/2eae7b0d-11f0-9483-8382-78059b107dbf.png"></img>
1. [Cloudflare] Notification の宛先 (webhook) を作成、コピーした URL を貼り付け、Save and Test
<img width="200" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/23feec04-a118-25d6-72b1-1379768a7186.png"></img>
1. [tines] Event を確認 (Test の Notification が飛んでいる)
![Screenshot 2023-03-08 at 11.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/3cfabc05-df9e-bd67-c1bf-beb69bff6aef.png)
1. [Cloudflare] Webhook 飛んでいれば Active になっている
![Screenshot 2023-03-08 at 11.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/2eb2efd3-81ba-22d7-ac84-5aa232ecc3a1.png)
1. [Cloudflare] 対象としたい Notification の宛先に作成した webhook を追加
<img width="200" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/a1785a1a-7f06-a9fb-74e6-0974be82c82a.png"></img>
1. [Cloudflare] 当該 Notification でテスト通知を送信
![Screenshot 2023-03-08 at 11.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/94018635-09cb-58a2-e30c-74344a9ea1dd.png)
1. [tines] 同様に Notification 個別にテストし、どのようなフォーマットや内容で来るのかを確認
![Screenshot 2023-03-08 at 11.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/1ac92a2e-3a48-8609-22c1-8c1f23df7d25.png)



他にも色々使えそうだな。
Javaを基本からまとめてみた【継承・オーバーライド】

## 継承

- 継承とは、既存のクラスをもとに変数やメソッドを追加したクラスを作ること
- 継承関係にある親のクラスのことをスーパークラス、子のクラスをサブクラスという
⇨ 継承を使うとコーディングとメンテナンスが楽!


```
public class サブクラス名 extends スーパークラス名{
    処理
}
// 継承できるクラスは1つ
// コンストラクタは継承しない
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/b15b121b-bb1c-ef67-c88c-672586050738.png)

```design(設計クラス).java
public class Student extends Person{
  private int stuNo;

  public void setStuNo(int $){
    stuNo = $;
}
 public void displayStuNo(){
 System.out.println( "学籍番号" + stuNo);
 }
}
```
```execution(実行用).java
public class StuSample {
	public static void main(String[] args) {
		Student stu = new Student();
//スーパークラスメソッド
 　　　　 stu.setName ("Kenny");
         stu.display ();
//サブクラスのメソッド
        stu.setStuNo(1);
        stu.displayStuNo ();
	}
}
```

## オーバーライド

- サブクラスでスーパークラスのメソッドを再定義することオーバーライドという
条件：『戻り値の型』、『メソッド名』、『引数の型』と数が全て同じ

```Sample.java
//スーパークラス
class Person{
 void display(){
　}
}
//サブクラス
 class Student extends Person{
void display(){
　　}
}
```
```design(設計クラス).java
public class Student2 extends Person{
  private int stuNo;

  public void setStuNo(int $){
    stuNo = $;
}
 public void displayStuNo(){
 System.out.println( "学籍番号" + stuNo);
 }
}
```
```execution(実行用).java
public class StuSample2 {
	public static void main(String[] args) {
		Student2 stu = new Student();
 　　　　 stu.setName ("Kenny");
         stu.setStuNo(1);
         stu.displayStuNo ();
	}
}
```



## 参考サイト
[継承のメリットやextendsの使い方を理解しよう【Java入門講座】4-1 継承](https://www.youtube.com/watch?v=XMOFM_XQ3dE)
[【初心者向け】Javaの継承とは？extendsの使い方をマスター！](https://camp.trainocate.co.jp/magazine/java-extends/)
PowerShellで動画の再生時間を取得するには

大量にある車載カメラの動画を整理することになった。
とりあえず、PowerShellでサクッとメディアのリストができないか調べた。


## Get-MediaInfo
Get-MediaInfoってモジュールがあるらしい
まさに求めていたものは是！

https://github.com/stax76/Get-MediaInfo

### インストール
インストールは以下のコマンドを実行
```powershell
Install-Module -Name Get-MediaInfo
```

https://www.powershellgallery.com/packages/Get-MediaInfo/3.7

### 使い方

インストールが正常のできると３つのコマンドレットが使えるようになる
* Get-MediaInfo
* Get-MediaInfoValue
* Get-MediaInfoSummary

### Get-MediaInfo
メディアファイルからMediaInfoオブジェクトを返す。

#### 例 フォルダ内のメディアファイルの情報をCSVに出力
```powershell
Get-ChildItem -Path .\ | Get-MediaInfo | Export-CSV -Path mediainfo.csv -NoTypeInfo -Encoding Default
```

#### 引数
* -Path 動画or音声ファイルのパスの配列 もしくは、パイプラインからのFileInfoオブジェクト
* -Video 対象を動画ファイルだけにしたい場合は指定
* -Audio 対象を音声ファイルだけにしたい場合は指定

### Get-MediaInfoValue

メディアファイルから特定のプロパティを取得

例 動画からビットレートを取得
```powershell
get-mediainfovalue -path C:\C0001.MP4 -Kind General -parameter BitRate 
```

#### 引数
* -Path メディアファイルへのパス
* -Kind MediaInfoの種類  General | Video | Audio | Text | Image | Menu
* -Index 0ベースのストリーム番号
* -Parameter 取得するプロパティの名前
Parameter で取得できるプロパティ名は後述するGet-MediaInfoSummaryに-Rawフラグを付けて実行すると確認できる

### Get-MediaInfoSummary

メディアファイルの要約をテキストで出力

```powershell
Get-MediaInfoSummary "./Sample.mp4"
```

#### 引数

* -Path 対象のメディアファイルのパス
* -Full より詳しいサマリーを出力
* -Raw パラメータ名をフレンドリーなものからMediaInfo APIで使用されている名称に変えて出力

作成者のstax76さんに感謝
フィールド名（列名）から接頭辞/接尾辞を除外する(SPSS Modeler データ加工逆引き9-9)

# フィールド名（列名）から接頭辞/接尾辞を除外する

![スクリーンショット 2023-02-28 18.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f74f442b-5612-b321-8724-75ac94f06b4a.png)

この記事は以下のブログを基に書かれています。


https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-11/

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

・フィルターノードで同じような列名の接頭辞/接尾辞の削除を効率化する

＊フィールドが多い場合、以下の処理を手作業で行うのは時間がかかる

![スクリーンショット 2023-02-28 18.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/694ca826-2393-bf5f-7c1c-96cacc8106ef.png)


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

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

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

![スクリーンショット 2023-02-28 18.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/93340f61-98c1-d60a-9758-74c213c8684f.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-02-28 18.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bdca4664-8516-a7cb-eef0-074156af7c78.png)

b.[行列入替]ノードを編集します。
![スクリーンショット 2023-02-28 18.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4be8d575-879b-5ffa-142f-2bdf09f51808.png)

[プレビュー]します。
![スクリーンショット 2023-02-28 18.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/991caabf-5b41-bae9-7c33-8473267ff611.png)

c.[置換]ノードを編集します。ハイフンの区切り文字の２カラム目を抽出する関数を利用しています。
![スクリーンショット 2023-02-28 18.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f72809a1-86c1-7a63-95ff-0a362c310e23.png)

[プレビュー]します。ID列から接頭辞と接尾辞が除去されました。
![スクリーンショット 2023-02-28 18.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ae68e126-0f24-7924-ab53-c456695e8c9a.png)

d.[行列入替]ノードを編集します。元のテーブル構造に戻します。
![スクリーンショット 2023-02-28 18.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/706d216e-75c1-7b38-8a26-3494bcf7fa90.png)

[テーブル]を実行します。
![スクリーンショット 2023-02-28 18.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f231ffd0-564c-182d-d25a-65163c2176a7.png)



#### 注意事項

今回は接頭辞がひとつ、接尾辞がふたつのルールでフィールド名が構成されていたため、それにあう関数を利用しました。文字列加工の関数は以下の参考情報にある記事をご覧ください。


## 4.参考情報

#### SPSS ModelerのCLEM式でよく使う「文字列」関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
JupyterLabでline-bot-sdkをインストールする

1.JupyterLabを開き、新しいノートブックを作成します。

２.ノートブックで、以下のコマンドを実行して、pipをアップグレードします。

```shell
!pip install --upgrade pip
```

３.次に、以下のコマンドを使用して、line-bot-sdkをインストールします。

```shell
!pip install line-bot-sdk
```

４．line-bot-sdkが正しくインストールされたかどうかを確認するために、以下のコマンドを実行して、SDKをインポートします。

```shell
import linebot
```

以上の手順でline-bot-sdkをJupyterLabにインストールできます。ただし、line-bot-sdkを使用するには、LINE Messaging APIのアクセストークンとチャネルシークレットを取得する必要があります。また、LINE Developersコンソールでボットを作成して設定する必要もあります。
[Vue] Propsに独自の型を設定したいときにやること

## 結論
`PropType<CustomClass＞`を使えば良い
これで型補完が使えるようになる
## 実装例
`Task`を外部から読み込み、`props`に設定すると以下のようになる。
```
<script lang="ts">
import { defineComponent, PropType, ref } from 'vue'
import { Task } from 'custom-types';
export default defineComponent({ 
    props: {
        task: {
            type: Object as PropType<Task>,
            required: true
        }
    },
    setup() {
    },
})
</script>
```
Laravel SQLserver リモート接続のエラー 解決

# SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL プロバイダー: 信頼されていない機関によって証明書チェーンが発行されました。

エラーの解決法を記述します
```
config/database.php

  'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST_02', 'localhost'),
            'port' => env('DB_PORT_02', '10.50.1.16'),
            'database' => env('DB_DATABASE_02', 'SMTLog'),
            'username' => env('DB_USERNAME_02', 'user'),
            'password' => env('DB_PASSWORD_02', 'k6vc47'),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
             'trust_server_certificate' => 'true',   <--を追加したら解決
```
# 原因 
SQLServerインスタンスの設定ではデフォルトでは [暗号化の強制] 設定は [いいえ] に設定されるそうで
それをコードでtrueにすることによって解決できます。
MacでPythonを使いたいので、AnacondaとJupyterLabを導入する

# MacにAnacondaをインストールする手順

1.公式サイトからAnacondaのインストーラーをダウンロードします。以下のURLにアクセスして、自分の環境に合わせたインストーラーをダウンロードしてください。

https://www.anaconda.com/products/individual

2.ダウンロードしたインストーラーを実行して、Anacondaをインストールします。ダウンロードしたインストーラーをダブルクリックすると、Anacondaのインストーラーが起動します。インストールの手順に従って、必要な設定を行ってください。

3.Anaconda Navigatorを起動します。インストールが完了したら、LaunchpadからAnaconda Navigatorを起動します。Navigatorを開くと、Anacondaの各種ツールが表示されます。

4.環境を作成します。Navigatorで「Environments」をクリックして、新しい環境を作成します。必要に応じて、パッケージを追加したり、環境を設定したりすることができます。

以上の手順で、MacにAnacondaがインストールされ、Anaconda Navigatorを使用して環境を作成することができます。また、AnacondaにはJupyter NotebookやJupyterLabなどの便利なツールが含まれているため、データサイエンスや機械学習の開発に役立てることができます。


# MacにJupyterLabを導入する手順

1.最初に、MacにPythonをインストールします。おすすめの方法は、Homebrewを使用することです。Homebrewをインストールしていない場合は、ターミナルで以下のコマンドを実行してインストールします。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

2.Pythonをインストールします。ターミナルで以下のコマンドを実行します。

```bash
brew install python
```

3.JupyterLabをインストールします。ターミナルで以下のコマンドを実行します。
```bash
pip install jupyterlab
```

4.JupyterLabを起動します。ターミナルで以下のコマンドを実行します。

```bash
jupyter lab
```

これで、MacにJupyterLabがインストールされ、起動されます。ブラウザを開いて、`http://localhost:8888/lab`にアクセスして、JupyterLabを使用することができます。
4分でdAppが作れるらしいAlchemyのcw3d試してみました

https://www.alchemy.com/create-web3-dapp

必要なもの
- nodejs (本ポストではv16.8.0で実行)
- Alchemy accounts https://alchemy.com/?r=86bf99545c6273ef (こちらのリンクからsign up していただくと、お互いに $100 in creditがアカウントに加算されます)


## プロジェクトの作成

```zsh
npx create-web3-dapp@latest

# ❯   Create pre-built template
# ❯   NFT Explorer
# ❯   Ethereum
# ❯   Mainnet
```


## アプリを起動
今回はアプリ名にデフォルトの設定をそのまま使っています。
```zsh
cd my-create-web3-dapp && npm run dev
```

inputフィールドにはデフォルトで`vitalik.eth`が設定されています。

![Screenshot 2023-03-07 at 10.10.14 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24723/0f064445-77cd-c06a-c7d5-5d56908ebcc4.png)


主要なウォレットはサポートされているみたいです。
![Screenshot 2023-03-07 at 10.10.26 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24723/c5e75c70-277d-944f-20a7-24ff2bb80e73.png)



`package.json`
`next`をベースにしているみたいです。`eslint`は入ってますが、prettierは使ってないみたいです。
気になるのはpackage.jsonに記載のパッケージがプロジェクト生成時にかなりダウンロードされています。
`wagmi`は`pages/_app.js`と`components/nftGallery.jsx`で使われているのに、package.jsonには含まれていません。
```json
{
	"name": "my-create-web3-dapp",
	"version": "0.1.0",
	"private": true,
	"scripts": {
		"dev": "next dev",
		"build": "next build",
		"start": "next start",
		"lint": "next link",
		"marketplace": "npx create-web3-dapp marketplace"
	},
	"dependencies": {
		"next": "13.1.2",
		"react": "18.2.0",
		"react-dom": "18.2.0",
		"alchemy-sdk": "^2.3.0",
		"@rainbow-me/rainbowkit": "^0.8.1"
	},
	"devDependencies": {
		"eslint": "8.20.0",
		"eslint-config-next": "12.2.3"
	}
}
```

## フォルダ構成
かなりシンプルな作りになっています。

![Screenshot 2023-03-07 at 10.20.20 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24723/1676e8cb-d239-bb91-267b-cda5d6c40d3c.png)


## Docs
https://docs.alchemy.com/docs/create-web3-dapp


これを元にして、複数チェーンのNFTを表示できるように変更するとかすると、入りとしてはいい勉強になりそうな気がします。


実際、4分足らずで、これが出来るのは結構面白い気がします。
Alchameyは去年からAlchemy Universityとか開始して、かなりDevRelにリソースを割いているので、今後もっと色々と簡単に使えるサンプルが追加される可能性はあるような気がします。
railsの関連付け データベースレベル

# ```blongs_to```
```belongs_toでは「参照の一貫性」が担保されません。```
そのため、ユースケースによっては以下のように参照カラムで```データベースレベルの外部キー制約（foreign_key: true）を追加```する必要があります。
```rb
create_table :books do |t|
  t.belongs_to :author, foreign_key: true
  # ...
end
```
# 出典
https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=belongs_to%E3%81%A7%E3%81%AF%E3%80%8C%E5%8F%82%E7%85%A7,true%0A%20%20%23%20...%0Aend

# ```has_many```
ユースケースにもよりますが、通常はこのbooksテーブルのauthorカラムに「一意でない」インデックスを追加し、オプションで外部キー制約を作成するのがよいでしょう。
```rb
create_table :books do |t|
  t.belongs_to :author, index: true, foreign_key: true
  # ...
end
```
# 出典
https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB,true%0A%20%20%23%20...%0Aend
### 気づき
* インデックスにすれば早くなりそうだ。

# 3.6 参照
add_referenceメソッドを使うと、適切な名前のカラムを作成できます。
```rb
add_reference :users, :role
```
このマイグレーションは、usersテーブルに```role_idカラムを作成```します。```index: falseオプションを明示的に指定しない限り、そのカラムのインデックスも作成```します。
```rb
add_reference :users, :role, index: false
```
add_belongs_toメソッドはadd_referenceのエイリアスです。

# 出典
https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86:~:text=3.6%20%E5%8F%82%E7%85%A7,%E3%81%AE%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82

### エイリアスとは？
エイリアスとは、```偽名、別名、通称などの意味を持つ英単語```。ITの分野では、ある対象や実体を、複数の異なるシンボルや識別子で同じように参照できるする仕組みを指す。別名。

### 出典
https://e-words.jp/w/%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html

### 気づき
```add_belongs_toメソッドはadd_referenceのエイリアスです。```は、
名前を変えただけで一緒ということなのかな。

# 実践
```rb
class AddBelongsTo********To***** < ActiveRecord::Migration[7.0]
  def change
    add_belongs_to :テーブル名, :モデル名, index: true, foreign_key: true
    add_belongs_to :テーブル名, :モデル名, index: true, foreign_key: true
  end
end
```
# 感想
一応できたと思っている。
時間がかかりすぎた。
localStorage, sessionStorage を操作しやすくする npm パッケージを作った

# EasyStorage

## 概要

localStorage, sessionStorage の操作をしやすくする npm パッケージです。

上位互換だったり似たような拡張機能は相当あると思いますが、 npm, node.js ついでに github actions や jest の学習が主な目的です。

<br>

## github

https://github.com/kanagama/easy-storage

## インストール

npm 経由でのインストールは後日設定するので、それまでは github 上から zip ダウンロードとかして dist/easy-storage.min.js を使って下さい

https://github.com/kanagama/easy-storage/archive/refs/heads/master.zip

<br>

## 使い方

```html
<script type="text/javascript" src="dist/easy-storage.min.js">
```

```js
// localStorage を使う場合はどちらもOK
const Es = new EasyStorage();
const Es = new EasyStorage('local');

// sessionStorage を使う場合
const Es = new EasyStorage('session');
```

<br>

### setItem(key, value)

localStorage, もしくは sessionStorage に指定のキーで値を格納します。

```js
const Es = new EasyStorage();
// localStrage の 'test' キーに 1 が格納されます
Es.setItem('test', 1);
```

<br>

### getItem(key)

localStorage, もしくは sessionStorage に格納された指定のキーの値を取り出します。

```js
const Es = new EasyStorage();
// localStrage の 'test' キーに 1 が格納されます
Es.setItem('test', 1);
// 1 が console に出力されます
console.log(Es.getItem('test'));
```

<br>

### removeItem(key)

localStorage, もしくは sessionStorage に格納された指定のキーの値を削除します

```js
const Es = new EasyStorage();
// localStrage の 'test' キーに 1 が格納されます
Es.setItem('test', 1);
// 'test' キーが削除されます
Es.removeItem('test');
```

<br>

### clear()

localStorage, もしくは sessionStorage に格納された指定のキーの値を削除します

```js
const Es = new EasyStorage();
// localStrage の 'test1' キーに 1 が格納されます
Es.setItem('test1', 1);
// localStrage の 'test2' キーに 2 が格納されます
Es.setItem('test2', 2);
// 全てのキー（'test1', 'test2'） キーが削除されます
Es.clear();
```

<br>

### hasItem(key)

localStorage, もしくは sessionStorage に指定のキーが格納されているか判定します

```js
const Es = new EasyStorage();
// localStrage の 'test' キーに 1 が格納されます
Es.setItem('test', 1);
// 'test' キーは格納されているため true が返却される
Es.hasItem('test');
// 'failure' キーは格納されていないため false が返却される
Es.hasItem('failure');
```

<br>


## 使っていただける方へお願い

他に欲しい機能を思いついたり不具合に気付いたりしましたらこちらのコメントもしくは github の issue にください。確認次第対応します。
Windows Powershellでnohupみたいなことをする

## tl;dr

下記のコマンドの`<YourCommands>`を書き換えれば良い．

```powershell
Invoke-Wmimethod -Class Win32_Process -Name Create -ArgumentList "powershell <YourCommands>"
```

## 背景

普段UNIX系のOSを使っているが，ひょんなことからWindowsにSSHで入ったときにnohupしたくなったら，意外と情報がなくて困ったので備忘録として書くことにした．
例えばJupyterとかを起動しっぱなしにしたい時に，SSHから起動するとBroken PipeしたときにJupyterごと落ちてしまう．

別プロセスで実行するコマンドとして`Start-Process`がある．下記のように表記する．
```powershell
$proc=Start-Process -FilePath 'Powershell.exe' -ArgumentList 'jupyter' -PassThru
```
しかし，この方法も別プロセスでプログラムは走るが，SSHから切断した瞬間にプロセスが落とされてしまった．
そこで，冒頭の方法に辿り着いた．

## Invoke-WmiMethodでプロセスを起動する

下記の方法だとSSHの接続が切れてもプロセスは残り続けるので，Linuxでいうところの`nohup`が実現できる．
```powershell
Invoke-Wmimethod -Class Win32_Process -Name Create -ArgumentList "powershell <YourCommands>"
```
実行すると次のような出力が返ってくるので，ProcessIdを控えておく．
```
__GENUS          : 2
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 8876
ReturnValue      : 0
PSComputerName   :
```

プロセスが動作中かどうかは，`Get-Process`で確認すればよい．
```powershell
Get-Process powershell

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    430      23    52372      55844       0.16   8684   0 powershell
    719      36    60984      65756       5.31   8876   0 powershell
    757      30    62512      74656       0.75  13060   0 powershell
```
先ほど実行したpowershellのProcessIdが実行されていることがわかる．

プロセスを落としたい場合は`Stop-Process`でいける．
```powershell
Stop-Process -ID "<ProcessId>"
```
USBボリュームコントローラーを使って、遠くにあるAVアンプの音量を調整する

# やりたいこと
* Denon AVR1500Hのボリュームボタンを遠隔で使いたい
![WIN_20230308_09_17_40_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/4849d60f-f516-d389-4977-aa95b0809d07.gif)

# 背景
* 普段座る位置から腕を伸ばしてもDenon AVR1500Hが遠すぎて届かない
![WIN_20230308_09_48_51_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/1e554762-def0-1473-2260-915a81cf3c3c.jpeg)


# 構想
* Denon AVR1500Hのリモコンを使えば、遠隔では操作できる
![WIN_20230308_09_32_23_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/ccfdd5b0-c719-127d-0721-c9b93026b276.gif)
* RaspberryPiと学習リモコン(ADRSIR)の組み合わせで任意の赤外線は送信できる

https://qiita.com/minatomirai21/items/140aa6e506bda70e0483

* USBボリュームコントローラーからの連続入力を認識して、連続的に音量調整用の赤外線を送信する

# 結果
* USBボリュームコントローラーを回すと、Denon AVR1500Hの音量が調整できた!
![WIN_20230308_09_17_38_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/93b34f82-e8c9-90e4-a32b-63ab70048db0.gif)

# 方法
### 1.前回の記事によって、USBボリュームコントローラーから`a`や`b`などを連続入力できるようにした。

https://qiita.com/shiganai/items/481ab2b6958758d5ad55

### 2.この記事によってターミナルから赤外線を送信できる。
ただし、この記事が書かれてから時間がたって修正されたのか、この記事に書いてある修正は必要なかった。

https://qiita.com/minatomirai21/items/140aa6e506bda70e0483

* 音量を下げる赤外線を`avr1500h_volme_down.dat`
* 音量を下げる赤外線を`avr1500h_volme_down.up`
で保存し、
```
python IR-remocon02-commandline.py t `cat avr1500h_volme_down.dat`
```
で赤外線を送信する。

### 3.ループと`read -n 1`を組み合わせて、入力される度に赤外線を送信する。
```
while true ; do
        echo "type command: "
        read -n 1 cmd
        echo #改行用

        # 何も入力されず、Enterが押されたとき
        if [ -z "$cmd" ] ; then
                echo "empty"
                continue
        fi

        # a,つまりUSBボリュームコントローラーがVol+側に回転したとき
        if [ "$cmd" == "a" ] ; then
                python /home/shiganai/I2C0x52-IR/IR-remocon02-commandline.py t \
                        `cat /home/shiganai/I2C0x52-IR/avr1500h_volme_down.dat`
                continue
        fi

        # b,つまりUSBボリュームコントローラーがVol+側に回転したとき
        if [ "$cmd" == "b" ] ; then
                python /home/shiganai/I2C0x52-IR/IR-remocon02-commandline.py t \
                        `cat /home/shiganai/I2C0x52-IR/avr1500h_volme_up.dat`
                continue
        fi
done

```

### 4.GUIで立ち上げたRaspberryPiに自動でターミナルが起動するようにする
`/home/shiganai/.config/autostart`に`.desktop`の拡張子を持つファイルが自動で起動するらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/4adc79f8-75f0-976e-1a74-4b4e6834e56b.png)

参考

https://teratail.com/questions/334030

https://qiita.com/tonosamart/items/f59daa481f90c85a8a99

### 5.homeディレクトリの.bashrcに3.で書いたスクリプトを実行するように末尾に書く。
なお、`/home/shiganai/my-autostart/ctl_43un700.bash`は普段使っているファイル。
3.で書いたスクリプトを中に含む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/0a9855a4-00e2-de70-4cad-041a22210ac8.png)

### 6.再起動してみて、ターミナルが自動で立ち上がるか、3.で書いたスクリプトがちゃんと回るかチェックする。
上手くいった。

# 参考サイト

ADRSIRについて

https://qiita.com/minatomirai21/items/140aa6e506bda70e0483

ターミナル自動起動

https://teratail.com/questions/334030

https://qiita.com/tonosamart/items/f59daa481f90c85a8a99
Understanding Deep Learning Requires Rethinking Generalization: 汎化の論点@2016

https://arxiv.org/abs/1611.03530
Submitted on 10 Nov 2016
Cited by 4835
Zhang, Google Brain

# 結論
* **DLはノイズデータを丸暗記できる**
    * 汎化はノイズ率に応じて悪化する
* 正則化は汎化の必要条件でも十分条件でもない
    * データオーグメンテーションは表現学習を改善するので有効なことが多そう
    * Batch Normalizationも有効に見える
* **丸暗記できる条件の理論証明**
    * データ数n、次元数dのとき、パラメタ数2n+dで活性化関数がReLuの2層のDLは、データを丸暗記できる
* **SDGで学習すると陰的にl2正則化が効いた解に辿り着く**
    * 無限の解の中から、SDGによってXXα=yを条件としたw=Xαが導かれる
    * l2正則化の解はよい汎化を示すが、よりよい汎化の解があるため、汎化の説明としては不完全

# 感想
* **複数の大切な論点を考察順に提起している論文**
    * 　2010年代はこういう論文が多い。精読中に頭の切り替えが必要
    * 　2020年代に入ると論文の論点は絞られている
* **汎化理解に関する当論文後のアップデート**
    * ノイズ率の影響はnoise transition matrixの仮定で後ほど公式化される
        * 実務上のノイズ対応は色々提起されているが未解決
    * 正則化の影響は、実践時にアーキテクチャごとに調べるのがよい
    * キャパの公式化・理論証明はNTKの観点等から進んでいる（実証多く理論の途中）
    * SDG・minimum norm・汎化の関係も研究進んでいる（実証多く理論の途中）
    * 汎化プロセス理解に大切な別の論点
        * 宝くじ仮説
        * 層ごとの役割
        * 点群(多様体)


# 詳細
### ノイズの丸暗記
* レーベルやインプットをランダム等のノイズにしてもDLが丸暗記と示した初実験
* **ノイズレーベルの学習は、インプットをガウス分布にした場合より学習に時間がかかる**
    * 自然に認められる潜在表現の点群が正解とずれている、と理解
![Screen Shot 2023-03-08 at 9.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123768/42c318ff-027e-5ebe-847b-512f2f942248.png)


### 正則化の影響
* データオーグメンテーションは表現学習を改善するので有効なことが多そう
* Batch Normalizationも有効に見える
![Screen Shot 2023-03-08 at 9.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123768/b262359c-0f65-01f6-a08c-9bc01795dd39.png)


### 丸暗記できる条件・理論証明
* 以下の2層ネットワークを想定する
    * ＜a, x＞-bが1層目(入力層)
    * maxがReLU
    * wjが2層目(出力層)
    * w, bがn個で、aがd個のため、合計パラメタ数は2n+d個
    * https://techblog.nhn-techorus.com/archives/16330
    * 以下に示すフルランクのMatrix Aを作るために、この条件としている
*  y=c(x)=Aw, Aij=max内とすると、任意のabでAをフルランクにできるので、wも解が存在 = 丸暗記
![Screen Shot 2023-03-08 at 10.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123768/d5ff3b52-b605-2f6d-b1b2-6d08baddacda.png)

### SDGによる陰的l2正則化
* 線形モデルで(Reluなし)、キャパ大きく無限の解が可能、と想定
    * Xw = yとなる...1
* SDGの学習によりwt+1 = wt - ηexで更新される
    * ηは学習率, eは損失, xはインプットデータ
* 学習の繰り返しで、w = Xαと表現される...2
    * w0 = 0としている
* XXα＝y（1, 2より）
    * K=XXのカーネルマトリックスなので、l2を最小化する解wを導く
    * https://www.iwanttobeacat.com/entry/2019/03/12/001051
【Git】Gitのつかいかた

# Gitの単語集
## 基本知識
| 用語 | 意味 |
|:-----|:----|
|**Git**|**ファイルの状態を更新履歴として保存しておけるツール**|
|**リポジトリ**|**Git管理したいディレクトリ**|
|**<font color="red">リモート</font>リポ**|**<font color="red">サーバ</font>のリポ**|
|**ローカルリポ**|**ローカルのリポ**|
|**ステータス**|**変更内容を確認**|

## <font color="red">リモート</font>⇨ローカル
※基本的にリモートをローカルに落としてから作業
| 用語 | 意味 |
|:-----|:----|
|**プル**|**<font color="red">リモリポ</font>の内容をローリポに反映**|
|**クローン**|**リモートリポをローカルリポとしてコピー**|

## ⇨ソースコードを修正

## ローカル⇨<font color="red">リモート</font>
※ローカルのソースコードを修正して<font color="red">リモート</font>に反映
| 用語 | 意味 |
|:-----|:----|
|**コミット**|**ローカルの修正内容をローリポに登録**|
|**プッシュ**|**ローリポの変更箇所を<font color="red">リモリポ</font>にアップする**<br>(コミットしないと反映されない)|
|**プルリクエスト**|**ローカルリポの修正内容をレビューアーに通知**|
|**リセット**|**コミットを取り消し**|
|**リバート**|**コミットを取り消した内容を記録する**|




| 用語 | 意味 |
|:-----|:----|
|**ワークツリー**|**履歴管理を行いたいファイルがある場所**|
|**インデックス**|**コミットしたいファイル又はファイルの一部を登録するところ**|
|**ハンク**|**変更した一範囲**|
フリーランスの苦悩　案件選び編

### 経緯
フリーランスになって3か月が経過した。
今回フリーランスになってから1発目の案件だったが、
正直地雷を踏んだといっても過言ではないだろう。

なにせ仕事をするうえで重要な「人」がよくない。
「人」がよくないと仕事の連携もできず、あらゆることが遅延する。
よって私はまともに仕事ができないと早々に判断し契約満了のタイミングで
次の案件を探す旅に出た。

### 多種多様な案件
今回はレバテック様ともう1社エージェントを使用している。
私はサーバの設計と構築をメインに仕事をしていて、ありがたいことに
2社とも探し始めて1週間目にして両社とも20件程度の案件をご提案いただいている。
その中に1件ぜひやってみたい案件があるのだが・・・これがフリーランスの案件選択の苦悩となる。

### 商談のタイミング
フリーランスの契約成立の流れは私が知る限りは
1.案件の紹介を受ける
2.エントリー
3.商談依頼が企業からくる
4.商談成立
5.現場へ入場

となるのだが、この商談依頼が来るタイミングが企業によってまちまちだ。
それは私のスキルセットをみて「欲しい」と感じていただいた順に商談依頼がくると私は解釈している。
そう、あくまで企業様が欲しいと思った順番に商談依頼がきてしまうので、下手に広くエントリーをしていると
本命前に別の商談が決まってしまうこととなるのである。

### 商談後企業様から来てほしいといわれたら

さて、前置きが長くなってしまったがここからが本題である。
商談後企業様から来てほしいと言われた後のこと。
私のスキルセット、人間性を見たうえで来てほしいといわれるのはうれしい。

　しかしながらたいていの場合「本日中」(長くても今週中)に返事が欲しいといわれてしまうのだ。
これはまさにうれしい悲鳴だが、フリーランス側からみても案件は慎重に選択しなければならない。
今回私の場合は本命があるのだが、困ったことに現状企業様の返信がきていない。

本当に案件というのは不思議なもので「縁」がなければ選択することはできないだろう。
故にタイミングも本当に重要だ。
自分の本当に入りたい案件を探し続けるか、OKをいただいた案件を選択するか、
これから数日間私は悩みに悩みまくるだろう。
また4月前ということで同じ状況の方も少なくないのではないかと思う。
もしそのような人がいたらお話をしてみたいなと願うばかりだ。
【データ基盤構築/dbt】ジョブを実行した際に、ジョブ内の「データに差分があるモデル」だけ実行する

# 今回の課題
dbtにてジョブを実行すると、実行する度に作成した全てのmodelに処理が走る。
実行する必要の無いmodelにも処理が走ってしまうため、クエリリソースを余分に多く消費してしまうという課題を感じていた。

dbtについての記事を読み漁っていたところ、
**差分データが存在するモデルだけを実行するCIジョブの設定ができる**ということが分かったため、
その方法を試してみた。

※参考記事：[dbt CloudにおけるCIについて](https://dev.classmethod.jp/articles/dbt-cloud-ci-job-only-modified-model/)

## 試してみた手順
### 手順1)本番デプロイ用のジョブを作成して一回実行しておく
こちらを実施することで、Artifactsが生成される。
ここで生成されたArtifactsと、この後の行程で生成するArtifactsの差分を確認して、
差分のあったモデルだけを実行するジョブを作成することができる。というイメージ。!


### 手順2)ジョブの編集画面を開く
この画面にて、色々と設定をしていく。
![InkedaaaaInked9a3ca1957ab195295c0300960ebe3df8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/f979faeb-ef07-2a63-f998-f57288bbcc9b.jpeg)

### 手順3)Defer to previous run state?の設定
`Defer to previous run state?`を、`Self: [ジョブ名]([環境名])`に設定する。
これによって、**手順1)** にて生成したArtifactと、次回のジョブ実行時に生成されるArtifactの差分を確認できるようになる。
![Inked286fe5b2573b2765d9e62751f20f3cb2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/830088bd-da36-64b5-5963-03d8d421e4a8.jpeg)

### 手順4)Commandsの設定
設定画面の`Commands`に、`--select state:modified+`を指定しておく。
![0a59cd90ecb11d3829da72aeee524069.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/d13e35bf-4c42-f137-7e25-85cc6909426a.png)

こちらを実施することで下記が可能になる。
* `state:modified`により、`Defer to previous run state?`で設定したジョブと差分があるmodelだけを実行対象とする
* 末尾に`+`をつけることで、差分があったmodelより下流に位置するmodelも全て実行する。


以上で、**差分のあるモデルだけが実行される**ように設定ができた。

## 実際にジョブを実行してみた
### まず、差分が無い状態でジョブを実行してみた
dbt buildのログの中に、下記の記述があった。
`state:modified+`はどのノードにもマッチしません。とのことで、
差分データが無かったため、ジョブを実行して`dbt build`が実行されたが、どのモデルにも処理が走らなかった様子。
```
2023-03-07 00:24:34.591773 (MainThread): 00:24:34  The selection criterion 'state:modified+' does not match any nodes
```

### 差分のデータを追加してジョブを実行してみた
特定のmodelのクエリにカラムを追加して、差分データを追加してみた結果、
そのmodelだけ実行されていた。

以上のような結果となり、無事差分データがあるモデルだけが実行されることを確認することができた。
Compound Interest Formula - Python Code

## Compound Interest Formula
```math
A = P \left(1 + \frac{r}{n}\right)^{nt}
```
where:
A is the final amount
P is the principal investment
r is the annual interest rate (as a decimal)
n is the number of times the interest is compounded per year
t is the time period in years

## Python Code
```python:compound_interest.py
def compound_interest(principal, rate, time, compound):
    amount = principal * (1 + (rate/compound)) ** (compound*time)
    return amount

principal = 1000
rate = 0.03
time = 5
compound = 8

amount = compound_interest(principal, rate, time, compound)

print("Compound interest after {} years: {:.2f}".format(time, amount))

# Output: Compound interest after 5 years: 1161.51
```
Outlook.comへの連作先のインポートがうまくできません

今まで使っていたメールソフトのアドレス帳を移行しようとしましたが、なぜかエラーはでないのですがメールアドレス他の項目がインポートされません。すべてメモ欄に記入されてしまいます。


探してみると

[連絡先のインポート後に連絡内容がメモ欄になってしまう。](https://answers.microsoft.com/ja-jp/outlook_com/forum/all/%E9%80%A3%E7%B5%A1%E5%85%88%E3%81%AE%E3%82%A4/a8de9e3a-ddff-4ce1-b1ce-56690e8ec9c2)

同じ現象のようです。何をやっても自動作成されたcsvファイルだと取り込めませんね。

# 結果

最終的にはOutlook.com内で１件連絡先を作ってエクスポートしたcsvファイルのヘッダを利用して元のアドレス帳のデータをマッピングしなおしたcsvを作成して使いました。


csvのヘッダが紹介されていました。

[Microsoft Office 365 (Outlook on the web) 連絡先のフィールド一覧](https://poweraddress.jp/ref/office365-outlook-field/)