OmniAICreator/Qiita-1.07M huggingface dataset:
aws cliで Unable to parse config file: xxx/.aws/config が出たが解消できた

# 概要

* とあるAWS IAMのクレデンシャルをaws cliに登録した
* その直後から aws 実行時に file: xxx/.aws/config というエラーで正常終了しなくなった
* 原因は `.aws/config` 内のフォーマットが不正だった

# 詳細

とあるAWSのクレデンシャルを登録した。

```sh
aws configure --profile someprofilename
```

それは成功したが直後からすべてのawsコマンドで以下のエラーが出るようになった。

```sh
aws --version

Unable to parse config file: /root/.aws/config
```

dockerのaws cli使っていたので、初めはdocker側を疑ったが怪しいところは見つからず。
mac versionもインストールしてみたが同じようなエラーが出た

```sh
aws configure list

Unable to parse config file: /Users/<username>/.aws/config
```

同様の現象はググっても見つからず。
で、改めて、動いていた時からの差分を確認してみた。

```sh
open ~/.aws/config
```

するとこんな形になってた

```text
（略）
[profile xxx]
source_profile=xxx
region=xxx
role_arn=xxx
mfa_serial=xxx[profile someprofilename]
region = ap-northeast-1
```

を？フォーマットおかしくない？改行入ってなくない？

で、手動で改行入れて保存すると、無事解決。

## 補足

再現方法は調べてないので、何故、aws configure コマンドで設定したにもかかわらずフォーマットが崩れたかは不明です。 このような現象が起こりうることが分かったので、同じような現象が起きた際に参考になれば。
Scanner.nextLine()で一行目の文字列を取得した後に、配列にして、目的の文字を要素で取得する方法

```
// 入力例:System.in = {A B C}
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] params = line.split(" "); // 配列にしてしまう

System.out.println(params[0]); // A
System.out.println(params[1]); // B

// 蛇足
System.out.println(params); // オブジェクト名が表示される(例：[Ljava.lang.String;@5f184fc6)
```
ラズパイ3B+にHome Assistantを入れて自作スマートデバイスを作ろうとした話-導入-


## Home Assistantとは

https://www.home-assistant.io/

自分が最初に思ったのは、照明のHueやスイッチボットを自作できるのかと思い、やりたくなりました

具体的にやりたいのはスマートデバイス化されていない、テープLEDをGoogleHomeで動作させたかったです

実際に買ったのはこれ

https://www.amazon.co.jp/gp/product/B08RDDHC9S/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

電源はUSBでしたが、そこからテープLEDにつなげるところはACアダプタだったので、そことESP系をつなげてそこにPOSTかなにかやればいいかなぁと考えました

### 自作スマートデバイス化のメリット

他にももっと簡単で実現できる方法はあると思います。

例えば、IFTTTとBlynkなど

ですが、IFTTTだとGoogleHome(Assistant)へ話しかけるのはワード単位で、せいぜい4パターンくらいだったと思います

やりたいのは、照明として登録し、「照明つけて」や「照明をON」とかの表記ゆれをGoogleがいい感じに勝手にやってくれたり、「いってきます」と同時に他の家電と一緒にOFFとか（これも実際はIFTTTでできる）

なによりもIFTTTは無料枠でやるのがきつくなって、他のiPaaS(Zapireやintegromat)にはなかったでした

ただ、デメリットもあって、ラズパイを常時起動させてないとだめですねぇ

## 環境



## 手順

今回はすでにラズパイOSが入っているものに入れていきます

### 1. 公式通りに進める

https://www.home-assistant.io/installation/raspberrypi/#install-home-assistant-core

自分の場合はPythonのバージョンが3.7系がインストールされ、3.8にアップグレードしなければいけないです

### 2. pythonのアップグレード

https://intellectual-curiosity.tokyo/2019/12/07/raspberry-pi%E3%81%A7python%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

こちらを参考にしました

しつこく毎回 `python3 -V` でバージョン確認しました

### 3. ラズパイのその他設定

https://piccolo.hatenablog.jp/entry/2020/05/12/191058

それでも動かなかったので、とりあえずこちらを参考に `samba` の設定と `sudo raspi-config` から `I2C` の許可、 'アップデート' したらなぜか動きました


## 続き

https://qiita.com/odetarou/items/4407d06d030c83180364

こちらの記事を見つけてこのまま勧めていこうと思ったのですが…けっこうやること多いな…

ということでいったんこの記事は導入まででした
【PHP】WordPressでwp_insert_postを使用し重複タイトルを回避する方法

メモ用です。

公式ドキュメント

post_exists( string $title, string $content = '', string $date = '', string $type = '' )

https://developer.wordpress.org/reference/functions/post_exists/


```index.php

function post_exists( $title, $content = '', $date = '', $type = '' ) {
    global $wpdb;
 
    $post_title   = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
    $post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
    $post_date    = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );
    $post_type    = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) );
 
    $query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
    $args  = array();
 
    if ( ! empty( $date ) ) {
        $query .= ' AND post_date = %s';
        $args[] = $post_date;
    }
 
    if ( ! empty( $title ) ) {
        $query .= ' AND post_title = %s';
        $args[] = $post_title;
    }
 
    if ( ! empty( $content ) ) {
        $query .= ' AND post_content = %s';
        $args[] = $post_content;
    }
 
    if ( ! empty( $type ) ) {
        $query .= ' AND post_type = %s';
        $args[] = $post_type;
    }
 
    if ( ! empty( $args ) ) {
        return (int) $wpdb->get_var( $wpdb->prepare( $query, $args ) );
    }
 
    return 0;
}
```
【Git】エイリアスを付けてコマンド入力を楽にする

題名の通り、エイリアスを付けることでコマンド入力が楽になる方法を学んだので、アウトプットさせていただきます。

```
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.co checkout
```

alias.の後に、自分が分かりやすいエイリアスを設定します。
例）commit → ci

--globalを付けることで、pc全体に設定を反映させることができます。

簡単ではありますが、参考になったら嬉しいです。
結合先テーブルの論理削除に対応したSQLを書く

# TL;DR
`LEFT JOIN 結合条件 AND 論理削除の条件`を使え。
JOIN句にはANDをつけられるぞ。

# はじめに

論理削除とは、次のように削除されたかどうかの情報をカラムに持たせ、SQLを発行する際に常にWHERE句を使って、そのデータを取ってこないようにすることで、そのデータを削除されたかのようにユーザーに見せるテクニック、管理手法のことです。
論理削除の是非は置いておいて、このような設計がなされているテーブルを見ることは多いと思います。

|id|company_name|line_name|is_deleted|
|--|--|--|--|
|1|JR北海道|深名線|**true**|
|2|JR北海道|名寄本線|**true**|
|3|JR北海道|羽幌線|**true**|
|4|JR東日本|東北本線|false|
|5|JR東日本|磐越西線|false|
|6|JR東日本|岩泉線|**true**|
|7|JR東海|身延線|false|
|8|JR東海|名松線|false|
|9|JR西日本|三江線|**true**|
|10|JR西日本|福塩線|false|
|11|JR西日本|芸備線|false|
|12|JR四国|高徳線|false|
|13|JR四国|予土線|false|
|14|JR九州|鹿児島本線|false|
|15|JR九州|三角線|false|
|16|JR九州|山野線|**true**|

```sql
SELECT * FROM railways
WHERE is_deleted = false;
```

|id|company_name|line_name|is_deleted|
|--|--|--|--|
|4|JR東日本|東北本線|false|
|5|JR東日本|磐越西線|false|
|7|JR東海|身延線|false|
|8|JR東海|名松線|false|
|10|JR西日本|福塩線|false|
|11|JR西日本|芸備線|false|
|12|JR四国|高徳線|false|
|13|JR四国|予土線|false|
|14|JR九州|鹿児島本線|false|
|15|JR九州|三角線|false|

# 問題

次のようにテーブルが二つに分かれていて、結合先のテーブルに論理削除を効かせつつ、親テーブルの行の存在の情報だけは得たいとき。

companiesテーブル

|id|company_name|
|--|--|
|1|JR北海道|
|2|JR東日本|
|3|JR東海|
|4|JR西日本|
|5|JR四国|
|6|JR九州|

railwaysテーブル

|id|company_id|line_name|is_deleted|
|--|--|--|--|
|1|1|深名線|**true**|
|2|1|名寄本線|**true**|
|3|1|羽幌線|**true**|
|4|2|東北本線|false|
|5|2|磐越西線|false|
|6|2|岩泉線|**true**|
|7|3|身延線|false|
|8|3|名松線|false|
|9|4|三江線|**true**|
|10|4|福塩線|false|
|11|4|芸備線|false|
|12|5|高徳線|false|
|13|5|予土線|false|
|14|5|鹿児島本線|false|
|15|6|三角線|false|
|16|6|山野線|**true**|

こういう情報がほしい

|company_name|line_name|
|--|--|
|**JR北海道**|**NULL**|
|JR東日本|東北本線|
|JR東日本|磐越西線|
|JR東海|身延線|
|JR東海|名松線|
|JR西日本|福塩線|false|
|JR西日本|芸備線|false|
|JR四国|高徳線|false|
|JR四国|予土線|false|
|JR九州|鹿児島本線|false|
|JR九州|三角線|false|

# 誤った解法

```sql
SELECT *
FROM companies
LEFT JOIN railways ON company.id = railways
WHERE railways.is_deleted = false;
```
これだと論理削除された行がまるごと吹き飛んでしまうので、JR北海道の存在がなくなってしまいます。

# 解決
```sql
SELECT *
FROM companies
LEFT JOIN railways ON company.id = railways
                  AND railways.is_deleted = false;
```
結合先に論理削除がある場合は、JOIN ONの条件を複数にしてください。これで望むようなデータが得られます。

# 中間テーブルがあるようなリレーションでも
次のように中間テーブルがあるようなリレーションでも同様のことができます

students

|id|name|
|--|--|
|1|一郎|
|2|二郎|
|3|三郎|

student_subject

|id|student_id|subject_id|is_cancelled|
|--|--|--|--|
|1|1|1|0|
|2|1|2|0|
|3|1|4|0|
|4|2|1|0|
|5|2|2|0|
|6|2|3|0|
|7|3|2|1|
|8|3|3|1|

subjects

|id|name|is_cancelled|
|--|--|--|
|1|微分積分学|0|
|2|有機化学|0|
|3|無機化学|0|
|4|物理化学|1|

```sql
SELECT * 
FROM students st
LEFT JOIN student_subject ss ON st.id = ss.student_id AND ss.is_cancelled = 0
LEFT JOIN subjects sb ON ss.subject_id = sb.id AND sb.is_cancelled = 0
```

以下のようなデータが得られるはずです。

|name|subject|
|--|--|
|一郎|微分積分学|
|一郎|有機化学|
|二郎|微分積分学|
|二郎|有機化学|
|二郎|無機化学|
|三郎|**NULL**|

# ORMのあるようなフレームワークでは
下記のような記事が参考になるかと思います。

EloquentのJOINで結合テーブルに論理削除を効かせる
Qiita https://qiita.com/danishi/items/726fcbed683c03ef389e

【Rails】結合先のテーブルで条件つけたいけど, 結合元のレコードは全部欲しいってときはScoped Association | SharpKnock
 https://sharpknock.com/posts/programming/scoped-association.html
justify-content、align-contentを使ってフレックスアイテムの位置を調整する【CSS】

# justify-content、align-contentを使ってフレックスアイテムの位置を調整する【CSS】

<!-- 概要を記載 -->
フレックスアイテム（Flexboxまたはdisplay:flex;などで横並びにした要素）の位置を調整する方法を紹介します。



<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 【justify-content】横方向に位置を指定する
justify-contentはフレックスアイテム（Flexboxまたはdisplay:flex;などで横並びにした要素）の主軸方向の位置を横方向に指定します。
<br>
<br>

## justify-content: flex-start;（初期値。行頭揃え。通常は左揃え。）
![justifyContent flexStart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/874fa16c-0e7f-e681-7c96-c45619421f62.png)

<br>

## justify-content: flex-end;（行末揃え。通常は右揃え。）
![justifyContent flexEnd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/34e59397-19df-e7e7-d76f-e49d5b7effe1.png)

<br>

## justify-content: center;（中央揃え。）
![justifyContent Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/ef9f7be3-8660-7f19-1bce-40be6f94a592.png)

<br>

<a id="#Chapter2"></a>
# 【align-content】縦方向に位置を指定する
align-contentはフレックスアイテム（Flexboxまたはdisplay:flex;などで横並びにした要素）の主軸方向の位置を縦方向に指定します。

## align-content: stretch;（初期値。フレックスアイテムが伸ばされて揃えられる。）
![alignContent Statish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/13a2ed53-569d-35a8-48f8-448788033cb9.png)

<br>



## align-content: flex-end;（終了位置揃え。通常は下端揃え。）
![alignContent flexEnd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/f6ca6293-3ff6-bd4b-2113-5f5c31eb4cb6.png)
<br>

## align-content: center;（中央揃え。）
![alignContent Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282434/caa1d155-d465-58b4-360e-17ce52d84040.png)

<br>

<a id="#Chapter3"></a>
# まとめ
justify-content、align-contentはフレックスアイテム（Flexboxまたはdisplay:flex;などで横並びにした要素）の位置を調整するプロパティです。

margin:auto;などを設定するよりも簡単にアイテムの縦横中央揃えや、等間隔配置が実現できるのでぜひ使用してみてください。

<br>

<a id="#reference"></a>
# 参考文献
- [http://www.htmq.com/css/justify-content.shtml]

- [http://www.htmq.com/css/align-content.shtml]
[UE4]メッシュインポート時の軸変換問題について

Mayaで作ったデータをFBXでExportし、UE4にImportするフローをよく使っています。
その時に遭遇した問題点と解決策をまとめました。
元はUE4.24で調べたことなんですが、たぶんUE4.26でも同じ状態だと思います。

# 軸変換問題とは？
UE4とMayaでXYZ軸がどっちを向いているか、右手座標系/左手座標系が異なっています。

**参考** 

|  | 上向き | 正面 | 座標系 |
|:-:|:-:|:-:|:-:|
| Maya | Y | Z | 右手座標系 |
| UE4 | Z | X | 左手座標系 |


Mayaで作成したモデルデータを、UE4へインポートした時、デフォルトのオプションだと上向きの違いは変換をしてくれます。（Y-up → Z-up）
しかし、ZとYを入れ替えるだけで正面の向きは変換してくれません。そのため、Y-frontとして扱うことになります。

そうすると、以下のような問題が起きます

* ACharacterなどで使われている、MeshComponentにSkeletalMeshを指定すると横を向く
 * 大抵の場合、Meshを270度(-90度)回転して回避していると思います
* SkeletalMeshのソケットの向きがX軸で90度回ってしまう
 * その結果、アタッチしたときに意図しない方向を向くことになります
 * データ側でアタッチ用ボーン/ソケットに90度の回転を入れて回避したこともあります

# 解決策

FBXインポートオプションで**Force Front XAxis**があるので、これを有効にすることです。
これを行えば、MeshComponentの補正や、前述のデータ調整による回避策は不要になります。

あくまで、Mayaで出力したFBXの場合なので、他のDCCツールは座標系を確認して要/不要を判断してください。

# 新規FBXをインポートする場合
インポートダイアログの設定(**Miscellaneous>Force Front XAxis**)を有効にする。
![FBXImport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/6653441e-3bf7-3707-133b-d92f8f8d0b65.png)

# 既にインポート済みのアセットの場合

アセットをダブルクリックで開いて、ペルソナの**アセット詳細>Import Settings>その他>Force Front XAxis**を有効にする。
その後、**再インポート**を行う。
![FBXImportSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/e6d63708-5592-7c4d-2b02-250f6cd03ac2.png)

# 注意点＆FAQ
## 既存データに適用した場合の回転値について
既存データを変更すると、モデルの向きが90度回ります。そのため、

* 配置したActorの回転値を修正
* ACharacter派生などで使っているMeshComponentで指定した回転値の修正

など、回転値に関する修正が必要になります

## スケルタルメッシュとアニメーション
スケルタルメッシュとアニメーションは密接に結びついているため、これらの片方だけ**Force Front XAxis**を有効にすると、表示が崩れます。

その場合でも、**Force Front XAxis**を有効か無効のどちらかに統一すれば直ります。
大規模な開発の場合、移行作業はスケジュールを調整してまとめて行うことをお勧めします。

## グレイマン(SK_Mannequin)はY-frontだけど…
混乱の一因でもありました。グレイマンがY-frontになっているので、それで問題ない。と思っていたのですが、この元データはY-upではないようです。
そのため、Jointの向きはデータ作成者の意図通りになっており、アタッチなども問題なく行えます。

なお、ThirdPersonCharacterで問題なく使えているのは、MeshConponentに270度の回転が入っているためです。

## MayaとUE4で軸の向きが違う
**Force Front XAxis**の対応をした後でも、以下の画像のようにMayaとUE4でJointの軸の向きが異なっているように見えます。
![JointAxis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/843fd0cf-6a03-156d-b8db-618bbf383abc.png)
結論から言うと問題ありません。
ただ、

|  | Maya | UE4 |
|:-:|:-:|:-:|
| UP | Y（緑） | Z（青） |
| FRONT | Z（青） | X（赤） |
| SIDE | X（赤） | Y（緑） |

と対応を見てみると、異なるのはSIDEのみです。これは、右手座標系、左手座標系の差異からくるもので、問題ありません。

# あとがき
会社的にも技術情報の共有が推奨される事になりました。
他にもUE4の一般的な調査項目のまとめがストックされているので、暇を見て記事を書いていこうと思います。
エラー「xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun」が起きた時の対応

macOSのメジャーアップグレード後によく発生するようです。

## Xcode Command Line Tool のインストール

```
$ xcode-select --install
```

インストール完了で解決できました。

## 参考

https://www.studytonight.com/post/solved-mac-os-xcrun-error-invalid-active-developer-path-missing-xcrun
stripe connect入門メモ

# このドキュメントの目的

stripe connectでできることを調べる。

# stripe connectでできること

- CtoCマーケットを作る際に支払先を複数に振り分けることができる
- 支払先になるユーザーの本人確認

# アカウントとは

販売者のユーザーアカウントをアカウントとして管理する。顧客（支払う側）はcustomer。

# アカウントの種類

- standard
- express
  - 
- custom

- 実装後にアカウントの種類を移行することは可能なのか？

## expressとcustomの違い

- 本人確認のフォーム
  - customでもstripe側がフォームを用意してくれてあまりここは変わらない。
  - Custom アカウント向けの Connect アカウント登録
    - https://stripe.com/docs/connect/connect-onboarding
- stripeアカウントの登録が必要か？
  - expressだとメールアドレスの登録が増える
- 入出金の申請
  - どちらもダッシュボード上で可能
  - customだと自社のページから申請できる
- 入金可能額などのダッシュボード
  - どちらもダッシュボード上で可能
  - customだと自社のページから申請できる
- 入金スケジュールの管理
  - どちらも可能

# アカウントのケイパビリティ

https://stripe.com/docs/connect/account-capabilities

アカウントのケイパビリティとはプラットフォーム内の販売者に可能なことで例えば送金を可能にするためにはtransfersのケイパビリティを付与する必要がある。

- transfersは送金でcard_payments（カード支払い）は直接その支払を販売者が受け取れる
VirtualboxでCentOS7のインストール~ネットワーク設定＆エラー解消

#環境
```
Windows10
VirtualBox 6.1.22
CentOS 7
```

#VirtualBoxのインストール＆セットアップ
インストールは[ここ](https://www.virtualbox.org/)から、コマンドで入れても良し
セットアップは[ここ](https://qiita.com/ebkn/items/751ed657629ba8d4ab0a#vm%E4%BD%9C%E6%88%90)から、参照元はMacだがWindowsでも問題なさそう。

しかし、全体的に動作がもっさりで思うように動かなかった。
[この記事](https://aresei-note.com/8255)の通りの設定に変更したがまだ少し重かった。
よく見たら何故かVirtualBoxの使用率制限が1%になっていた。（デフォルトでは100%のはず）
これを100%に設定し直したらちゃんと動作するようになった。
使用率制限の設定は　`設定`>`システム`>`プロセッサー`　で変更できる。

#VMにCentOSを読み込ませる
CentOSは[ここ](https://www.centos.org/download/)からISO形式でダウンロードする。

VMにCentOSをインストール
[この記事](https://qiita.com/maitake9116/items/5a85e6dfcac232bac4c6#%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%ABcentos%E3%81%AEiso%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)の通りにやれば問題なし。
VMを起動する前に読み込ませないとエラーを吐く

VirtualBoxを開いて`起動` > `日本語` > `インストール先` > 何もせずに`完了`
    > `インストール開始` > `ROOTパスワード` > `完了`

#CentOSのネットワークの設定
[この手順](https://qiita.com/ebkn/items/751ed657629ba8d4ab0a#centos%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A)の通りに進めたが9でエラー発生

```
$ service NetworkManager restart

$ service network restart
```
 
```ruby:エラー内容
Job for nerwork.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe"for details.
```
要するに途中でエラー吐いたから
**"systemctl status network.service"**と**journalctl -xe**で確認しろとのこと

```
$ systemctl status network.service

→ Failed to start LSB: Bring up/down networking.
```

```
$ journalctl -xe

→ Unit network.service entered failed state.
→ network.service failed.
→ Unregistered Authentication Agent for unix-proce.
```

おそらく[この記事](https://savemanual.com/2020/07/17/post-110/)と同じ現象が起きてるっぽい。

```
$ nmcli connection
```
**DEVICE**が**ーー**になっているNAMEがエラーの原因箇所
自分の場合、enp0s3が繋がっていませんでした。
 
そこで自動接続をオフにし、ネットワークを再起動

```
$ nmcli connection modify enp0s3 connection.autoconnect no
$ systemctl restart network.service
```

```
$ service network restart
```
[ OK ]と表示されたらネットワーク設定完了
【AtCoder】ABC202をPython3で解説

ABC202の解説。

https://atcoder.jp/contests/abc202

## A - Three Dice
### 解説
3つのサイコロを投げて、出た目と反対の面が表す整数を足し合わせた値を求めるもの。

そもそもサイコロは、表と裏を足して7になるようにできている。つまり、1の裏は6、2の裏は5、3の裏は4となっている。

したがって、出た目を`a, b, c`とすると、それぞれの裏の値は、`7-a, 7-b, 7-c`となる。これらを足し合わせたものが答えなので、`(7-a)+(7-b)+(7-c)=21-(a+b+c)`となる。

つまり、次のようなコードとなる。
### コード

```python
a, b, c = map(int, input().split())
print(21 - (a + b + c))
```

## B - 180° 
### 解説
問題としては、`S`を180度回転したものを出力するというもの。

文字列は、`0, 1, 6, 8, 9`なので、反転すべきものは、`6, 9`のみ。
`test`に値を代入して、`6, 9`ならば、`9, 6`に入れ替える。それ以外の値はそのまま新しいリストに追加する。

あとは、そのリストをそのまま反転させるだけ。

最後は、`''.join()`でリストの値を連結する。
### コード

```python
S = str(input())

l = []

for s in S:
    test = s
    if test == '6':
        test = '9'
    elif test == '9':
        test = '6'
    l.append(test)

print(''.join(reversed(l)))
```

## C - Made Up
### 解説
`A_i = B_(C_j)`となる`(i, j)`の総数を出力するもの。
となっているが、単なる数え上げ問題。

まず、`A`に何の数字が何個あるのかを辞書にする。その際には`Counter()`を用いる。
例えば、`A = [1, 2, 2]`ならば、`Counter({1: 1, 2: 2})`となり、`1`が1つ、`2`が2つであることがわかる。

次に、これを`B`と参照していく。`B`の値を辞書で参照して、順番に値を探していく。
例えば、入力値が`3`であれば、先程の辞書には値がないため、新しいリスト`l`に`0`が追加（append）される。入力値が`1`であれば、個数（`value`）として`1`が取りだされ、リスト`l`に`1`が追加される。同様に入力値`2`で、リストに`2`が追加される。

最後に`C`を見ていく。これは少しわかりにくいので、先に例を出す。例えば、入力値が`2`であれば、`A_i = B_2`となるような値を探しに行くことになる。ここでいう`B_2`の値は、2番目に入れた`1`の値である。つまり、`1`が`A`にいくつあるのか、これは先ほど作成したリスト`l`で確認できる。

今回`B`では、2番目だが、Pythonのリストのindexは`0`から始まるので、indexは`1`である。つまり、`l[i-1]`の値を参照することで求められる。

これらを`C`の入力値それぞれで検証し、`ans`に足していくことで答えが出力される。

### コード

```python
# O(n)

from collections import Counter

N = int(input())
ans = 0

A = list(map(int, input().split()))
# それぞれの数字が何個あるかの辞書
tmp = Counter(A)

l = []

# 入力した値がAの辞書にいくつあるのか確認
for i in map(int, input().split()):
    l.append(tmp[i])

# jは1から始まるので、[i-1]の値を参照
for i in map(int, input().split()):
    ans += l[i-1]

print(ans)
```

### おまけコード（TLE）

```python
# O(n^2)

from collections import Counter

N = int(input())

A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))

cnt = 0

for c in C:
    result = Counter(A)
    cnt += result[B[c-1]] # n^2回実行で、TLE

print(cnt)
```
iPadやAndroidでhostsを書き換えたい時

## はじめに
実際に iPadやAndroidのhostsを直接書き換える方法、ではありません。
この質問が出る時に使える代替方法の話です。

##ドメイン名の名前解決とは？
例えば、ブラウザに https://yahoo.co.jp と入れてエンターを押すと、Yahooのホームページが表示されます。
それは、
１）yahoo.co.jp というドメイン名が登録されている
２）世界中から、"yahoo.co.jp" を調べて、IPアドレスに変換（DNSによる名前解決）
３）ブラウザは、そのIPアドレスにアクセスしてページの情報をもらって表示する
という一連の作業が連携して行われているからです。

参考例：
![powershell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/43032efd-2f85-fa5d-3ba0-6787ed2133b2.png)

実際の開発の現場では、「まだ世界に公開されていないドメイン名だが、今だけ、自分のマシンの中でだけ名前解決させたい」というニーズが生じることがあります。そんな時、WindowsマシンやLinuxマシン、Macなどでは、「"hostsファイル"に、ドメイン名とIPアドレスの独自の紐付け情報を登録する」ことで解決できます。

<span class="important-marker">Wikipedia: <a href="https://ja.wikipedia.org/wiki/Hosts" target="_blank" rel="noopener noreferrer">hosts の用途のページ</a></span>

上記のページは、hostsの使い方として、アンチウイルスソフトウェアがどうやってこの機能を活用しているか、なども解説されていて興味深いページです。

## Windowsマシンでのhostsファイルの書き換え
Windows 10のマシンでは、hostsファイルは下記の場所にあります。
<span class="success-under"><strong>C:\Windows\System32\drivers\etc\hosts</strong></span>
テキストエディタなどでこのファイルを開き、「指定したいIPアドレス （スペース）そこと紐付けたい独自のホスト名」を1行ごとに登録しましょう。（セキュリティにも関係する重要なファイルですので不用意に編集することはお勧めできません。またファイルを編集するには管理者権限が必要になるはずです。）間にスペースを入れてあけておきます。ちなみにこのファイルの中には、「127.0.0.1 localhost」という設定がすでに含まれているはずです。そのため、ブラウザに http://localhost などと入れると、Windows 10は標準で、それを"127.0.0.1" というアドレス（ループバックアドレス）に変換して処理する仕様になっています。

では製品チェックなどの際、<span class="danger-under">「iPadやAndroid端末をテスト用に使用し、なおかつ、開発時のみのドメイン名解決が求められる場合」にはどうすれば良いでしょうか。</span>モバイル端末の場合には、内部の隠されたところにあるため、容易な書き換えはできません。それで、別の方法で解決することになります。

## Windowsマシンからインターネット回線を分けてもらって解決</h2>
「アンドロイド端末などのインターネット回線をノートPCが使えるようにすること」を「テザリング」と言ったりします。この反対の動作を設定して、今回の問題が解決できるか試してみます。これは、「Windows 10のノートPCの回線をアンドロイド端末が使えるようにすること」ですので、「逆テザリング」と呼ばれることもあるようです。
方法は以下のとおりです。

（１）Windows 10の設定から、「ネットワークとインターネット」を探す。
![683b52b79b845436e0f44090ad5b1525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/4fc1071d-d6bc-b506-e8d9-1daffc552963.png)


（２）左の項目に「モバイルホットスポット」という項目があれば、逆テザリングができます。
![ddd8444cd2c5eb26e065bd2807ffcf9d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/dbd170ce-9ac5-e505-6c1e-8fc76f3bc6f4.png)

（３）「編集」というメニューから、適切なネットワーク名とネットワークパスワードを設定して、モバイルホットスポットをONにします。
![edad67588a22887471354fa07cf81682.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/6ef8b5be-c92b-88ab-c378-29619f0771c4.png)


（４）編集メニューでは、下記のような形で、ネットワーク名やパスワードを指定できます。
![f41f02be01724a6ed10c419453f33625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/6b1d2d56-0019-c12a-1639-701be3c1b1ec.png)

その後、モバイル端末から、「Windows 10のPCから出ているWifiモバイルスポット」を選択し、インターネットに接続してみてください。<span class="danger-under">Windows 10マシンのhostsファイルで設定した内容が反映されるインターネット回線で、モバイル端末も同じようにテストできる</span>ようになります。「hostsファイルを書き換えてください、と言われて、モバイル端末を脱獄（改造）しないといけないかと思っていた！」と困っていたテスターの方々はこれを使えるかもしれません。

hostsファイルは、DNSというシステムが普及する以前に開発された名前解決の仕組みですが、今でもその機能が各PCに残っており、こうした開発の現場では現役で動いている、というのも興味深いです。
Prism コードサンプル学習：10-CustomRegistrations

# Prism コードサンプル学習：10-CustomRegistrations

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/5194c4620860b68c98b8>

## 10-CustomRegistrations

本サンプルでは、前回に引き続き、Viewの型からViewModelを取得する際の解消方法を変更しています。
ただし、デフォルトの規則を変えるのではなく、追加して規則を登録しているという点が異なります。
サンプルの例では、ジェネリックな型を用いたパターンで登録していますが、コメントアウトの登録方法でも可能なようです。

```cs
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        ...

        protected override void ConfigureViewModelLocator()
        {
            base.ConfigureViewModelLocator();

            // type / type
            //ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(CustomViewModel));

            // type / factory
            //ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<CustomViewModel>());

            // generic factory
            //ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<CustomViewModel>());

            // generic type
            ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();
        }
    }
```

- 上記の4つの方法ではそれぞれ以下のメソッドと対応します。
  - [type / type](https://github.com/PrismLibrary/Prism/blob/342689ba9a10e511418943438d0f5c57534ca623/src/Prism.Core/Mvvm/ViewModelLocationProvider.cs#L183)
  - [type / factory](https://github.com/PrismLibrary/Prism/blob/342689ba9a10e511418943438d0f5c57534ca623/src/Prism.Core/Mvvm/ViewModelLocationProvider.cs#L160)
  - [generic factory](https://github.com/PrismLibrary/Prism/blob/342689ba9a10e511418943438d0f5c57534ca623/src/Prism.Core/Mvvm/ViewModelLocationProvider.cs#L150)
  - [generic type](https://github.com/PrismLibrary/Prism/blob/342689ba9a10e511418943438d0f5c57534ca623/src/Prism.Core/Mvvm/ViewModelLocationProvider.cs#L170)
- これら4つの方法はファクトリーを登録するか、タイプを登録するかで登録方法が2つに分かれます。オーバーロードによって実現されています。
  - ファクトリーを登録：type / factory, generic factory
  - タイプを登録：type / type, generic type

## おわりに

今回はViewModelLocatorの型の解消の変更方法について、別途登録する方法を学習できました。
フレームワークとして様々な登録方法が用意されているのは勉強になります。
自分であれば、いずれかの方法で登録できれば良いと考えてしまいそうなので。。
次回、[11-UsingDelegateCommands](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/11-UsingDelegateCommands)について見ていこうと思います。
Let's Encryptの中間証明書に「ISRG Root X1」が追加された (2021年5月)

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/35e7f6fd-4352-6d31-8ad9-37196cb78aaf.png)

これにより

中間証明書の有効期限が

* 旧 : 2021-09-30 04:21:40 JSTまで
* 新 : 2025-09-16 01:00:00 JSTまで

となった。
Djangoでwebアプリを作る　基礎設定

基本設定/usrls.pyに基本の設定を書く

from django.urls import path, include
from django.contrib import admin


urlpatterns = [
   path('admin/', admin.site.urls),
   path('', include('blog_app.urls')),
]


1、使うプロジェクトで読み込む関数が変わる
2、

6、include()関数を使ってblog_appのurls.pyファイルを読み込む（アプリようのファイルを読み込む）
5、http://127.0.0.1:8000/adminにアクセスするとadmin.site.urlsを読み込む




アプリ側のurls.pyを作る
同じ名前でややこしい

from django.urls import path
from . import views

app_name = 'blog_app'
urlpatterns = [
   path('', views.index, name='index'),
]

1,2行目でpathが使えるようにする

path('', views.index, name='index'),ですが、pathの第一引数が空の場合（''）この状態→http://127.0.0.1:8000/の時は、views.pyファイルのindex関数を読み込みます。
path（第一引数がからの場合、）
.同じ階層のviewsの中のindexを使えるようにする


同じ階層のviews.pyに書き込む

サイトのリクエスト（どのページhtmlが欲しいか)を入れる
viwesは名前通り


読み込むファイルを作る
1、templateを作る
設定ふぁいるのsettinguのTEMPLATESに
temoletaフォルダーを読み込ませる

import os
をする

import os
from pathlib import Path

になる
TEMPLATES = [
   {
       'BACKEND': 'django.template.backends.django.DjangoTemplates',
       'DIRS': [os.path.join(BASE_DIR, 'templates')], #追加
       'APP_DIRS': True,
       'OPTIONS': {
           'context_processors': [
               'django.template.context_processors.debug',
               'django.template.context_processors.request',
               'django.contrib.auth.context_processors.auth',
               'django.contrib.messages.context_processors.messages',
           ],
       },
   },
]

templateフォルダに
その中にindex.htmlを入れる
【AWS】AMIの利用方法

#プログラミング勉強日記
2021年5月24日

#AMIの利用方法

##1. OSの選択
　利用したいサーバーのOSの選択として、利用していたサーバーを復元する際にAMIを利用する。

##2. EC2のバックアップ
　既存のEC2インスタンスからAMIを作成して、バックアップとして取得する。EC2インスタンスをバックアップとして構成内容を保存するが、このバックアップにはEBSボリュームのスナップショットも含まれるのでEBS分の復元も可能。

##3. ゴールデンイメージ
　最適なEC2インスタンスの構成をAMIとしたうえで、構成を複数利用できる。最適なEC2インスタンス構成を反映したAMIをゴールデンイメージという。

##4. AMIの共有
　AMIを共有するユーザのAWSアカウント番号を指定することで他アカウントでAMIを共有できる。

##5. リージョンの移動
　AMIはリージョン内でのみ移動可能だが、別リージョンにコピーすることができる。このAMIはリージョンのAMIとして別のAMIになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/17ffbf3c-23bf-1b28-f007-2331c5c6e2fb.png)


#EC2 Image Builder
　EC2インスタンスとは別の機能として提供されている。このAMIの変更管理を自動化・効率化する仕組み。ソースとなるAMIを指定してEC2 Image Builderに設定する。EC2 Image Builder上で設定されているソフトウェアの更新方法をスケジューリングして自動でソフトウェアのアップデートするパイプラインを作る。
　ソフトウェアを更新したらEC2 Image Builder内の独自のEC2インスタンス内でそのAMIがうまく設定されているかテストされたうえで更新してくれる。

　AMIは一度作るとそのあとの更新は手作業でやる必要がある。EC2 Image Builderを使うことで自動で更新することができる。そのため、EC2 Image Builderを使ってAMIの更新管理をすることが大切。
[Webを支える技術] マイクロフォーマットとは？

# マイクロフォーマット
意味情報と構造化データを HTML に埋め込むために使用される規格です。日付や検索エンジンの評価などに使われ、すべてのHTMLタグに付けることができます。class属性に付けて、そのタグに書かれた意味を確定させます。

```html:h-card
<a class="h-card" href="http://alice.example.com">Alice Blogger</a>
```

h-cardとはその組織を表します。

http://microformats.org/wiki/h-card

>パーサーがこのタグを読み込むとURLが http://alice.example.com/ の Alice Blogger という名前の個人または組織を説明する「カード」が含まれていることがわかります。パーサーは、さまざまなアプリケーションで使用できるAPIを介してこのデータを利用できるようにします。

https://runebook.dev/ja/docs/html/microformats

このように、microformatsを使うことで、検索エンジンやソフトウェアが情報を抽出しやすくなり、それによって本来なら自分で作成しなければならないWeb APIやその学習コストを払わなくてもいいようになり、また意味が書かれていることによってメンテナンスコストを下げることができます。

https://ascii.jp/elem/000/000/641/641954/
Formsの添付ファイルのファイル名からユーザー名を取り除く

# はじめに
Forms(グループフォーム)でファイルを添付すると、ファイル名が「元のファイル名＋アンダーバー＋ユーザー名」に変更されて、Sharepointに保存される。
これについて、元のファイル名に戻す(「元のファイル名＋アンダーバー＋ユーザー名」→「元のファイル名」)方法を考案したので紹介する。
(もっと簡単なやり方があれば、是非教えてください！)

# 概要
Power Automateを利用する。
## 使用するトリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/193c7260-ac8a-3338-1257-7363809b5c90.png)
## 使用するアクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/dd35ac40-441d-74ce-6491-87ac6f8a7c02.png)

### 補足
Formsのコネクターは使用しない。
(Formsの投稿をトリガーにすると、複数ファイルを添付した際の対応を考慮する必要が発生してしまうと考えたため)

# アクションの内容補足
## 配列 filename_username
```
split(triggerOutputs()?['body/{Name}'],'_')
```
## 変数 length of filename_username
```
length(variables('filename_username'))
```
## length of filename_username - 1
「変数の値を減らす」アクションを選択して、以下の通り入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/e7b56a97-67f9-b70a-733d-22b19be37ff3.png)

## 配列 filenames
```
take(
    variables('filename_username'),
    variables('length of filename_username')
    )
```
## 変数 filename
```
join(variables('filenames'),'_')
```

## SharepointにHTTP要求を送信します
### 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/a9742625-cbd2-dfe7-8f91-192e734cc27b.png)

### URI
````
_api/web/lists/getbytitle('(ライブラリ名)')/items(triggerOutputs()?['body/ID'])
```

### ヘッダー
|  |  |
|:-----------|------------:|
| X-HTTP-Method|MERGE|
|IF-MATCH|*|
|content-type|application/json;odata=verbose|

### ボディ
```
{'__metadata':{'type':'(取得したListItemEntityTypeFullName)'},'FileLeafRef':'@{variables('filename')}'}
```

#### ListItemEntityTypeFullNameの取得方法
以下のURLにアクセスし、表示されたページの`<d:ListItemEntityTypeFullName>`直後の文字列をコピーする

```
https://(sharepointのサイトURL))/_api/web/lists/getbytitle('(ライブラリ名)')?$select=ListItemEntityTypeFullName
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/1f4a074d-ca82-06e2-b239-a393b1c37b90.png)
※デフォルトのドキュメントライブラリを使用する場合は、ライブラリ名の枠に「Documents」と入力する


# 変数関連のアクションでやっていることの全体像
1. アンダーバーを区切り記号として、ファイル名を分割して配列にする
1. 作った配列から、最後の要素のみを取り除く
1. 加工した配列について、アンダーバーを区切り記号として再度結合して文字列にする

# その他ポイント
- トリガーで「ファイルが作成されたとき(プロパティのみ)」を選択する
- アクションで「sharepointにHTTP要求を送信します」を使用する

# 参考にした記事
https://social.technet.microsoft.com/wiki/contents/articles/53731.power-automate-update-file-name-of-sharepoint-document-on-file-upload-using-http-action.aspx

https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference
CloudFront FunctionsをTerraformで書いてみた

# はじめに

awsのproviderバージョンが `v3.41.0` から `aws_cloudfront_function`  リソースがリリースされ、CloudFront FunctionsをTerrafromで管理することができました。

リリースされたので、コード化をしてみようと思います。

```hcl:provider.tf
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "3.41.0"
    }
  }
}
```

# 前提条件

- Terraformのバージョンは `v0.13` 以降であること
- awsのproviderは  `v3.41.0` 以降であること

# Terraformコード
[CloudFront FunctionsでBasic認証ができるか試してみた](https://qiita.com/yoshuuua/items/c575a2b077f8004a0747) で書いたコードをTerraform管理します。
`aws_cloudfront_function` リソースでCloudFront Functionsを記載します。
現状(2021/05/24) `runtime` は `cloudfront-js-1.0` しかありません。
また、 `publish = true` を設定することにより、 `code` が変更・作成されたときにCloudFrontへ適用してくれます。

```bash:main.tf
resource "aws_cloudfront_function" "example" {
  name    = "example"
  runtime = "cloudfront-js-1.0"
  comment = "example function"
  publish = true
  code    = file("${path.module}/function.js")
}

resource "aws_cloudfront_distribution" "example" {
  # ... other configuration ...

  # function_association is also supported by default_cache_behavior
  default_cache_behavior {
    # ... other configuration ...

    function_association {
      # specific event_type viewer-request or viewer-response
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.example.arn
    }
  }
}
```

# コード化してみた感想

`aws_cloudfront_distribution` リソースの取り回しが難しいとは思いました。

`aws_cloudfront_distribution` を公式ではなく自前でmodule化していると新たに `default_cache_behavior` or `ordered_cache_behavior` を追加しなければならず、
コードの大幅な変更が求められます。

現在、`cache_behavior`は`aws_cloudfront_distribution` でしか変更ができないので、
コードを書いていて不便に感じました。リソースを切り出してくれないかなと思ってます。

[公式のCloudFrontモジュール](https://github.com/terraform-aws-modules/terraform-aws-cloudfront/blob/master/main.tf)は良くできているので、自作するよりも公式を採用した方が良かったと反省してます。
rails scaffoldで最速サイト作成

#scaffold（スキャフォールド）コードを自動生成する
RubyのフレームワークのRuby on Railsには、コードを自動生成する便利なものが多く存在し、今回はその一つであるscaffold（スキャフォールド）を紹介します。

```
rails g scaffold モデル名 カラム名1:データ型1 カラム名2:データ型 2
```

```
rails generate scaffold Vegetable name:string image:string body:text weight:integer memo:string
```

そしてマイグレーションを行う

```
rails db:migrate
```

一連の流れを汲んだサイトが完成する
データを開くとマテリアルのアサインが剥げる

今回の現象
-
モデラーから来たデータをopen/import すると特定のマテリアルが剥げる。

状況確認
-
モデラーに確認しつつ整理

    ファセットアサインを使っている部分が剥げる
    オブジェクトを複製して保存すると複製した奴は剥げない

これらを見るに・・・・・

    groupIdがどこかで欠損していると予想
    
マテリアルが剥げたデータを確認すると、
ファセットアサインに使用されている groupIdが一部欠損している

問題はどこで欠損したか・・・
なんやかんやで色々調べてみたところ、ハイパーシェーダーの挙動によって消えてしまっていた。

挙動としては

    ファイルを開く　（まだ無事
    ハイパーシェーダーを開く　（まだ無事
    ファイルを保存する　（ここでコネクト外れる

または

    ファイルを開く　（まだ無事
    ハイパーシェーダーを開く　（まだ無事
    ハイパーシェーダーを閉じる　（ここでコネクト外れる

ファイルを保存する際にも　ハイパーシェーダーを閉じる　と同等の処理が走っているようで、どうやら　ハイパーシェーダーを閉じる　という挙動に原因がある様子。

前後でデータを見比べると・・・・・
nodeGraphEditorInfo　の数が増減している
ノードエディターとかハイパーシェーダーの　グラフエディター部分の情報保持用で、
本来は１つあれば十分なのにやたらといっぱいある

元々こんな感じにあったのが

    nodeGraphEditorInfo
    nodeGraphEditorInfo2

ハイパーシェーダーを閉じる と

    nodeGraphEditorInfo


こんな感じに減る

groupIdは結構いろんなところで使用されてて、このグラフエディターの表示にも流用されている様子。これが問題。

ファイルを開いた際に、

nodeGraphEditorInfo2がカレントに指定されていて読み込まれる

nodeGraphEditorInfo2　には　ファセットアサインを使用したネットワーク全体が登録されている

ハイパーシェーダーを閉じる際に、nodeGraphEditorInfo2の情報nodeGraphEditorInfoに統合する処置が走る。

nodeGraphEditorInfo2が削除される際に、nodeGraphEditorInfo2につながっている groupIdはグラフエディタのフィルターとして認識され一緒に削除されてしまう。

ファセットアサインのgroupIdもこの挙動に巻き込まれて削除されてしまう。

このまま保存すると、再度openしたときにマテリアルが剥げてしまう。


今回の対策
-
ハイパーシェーダーを開く前にnodeGraphEditorInfoにつながってる groupIdを引っこ抜いておく

そもそもファセットアサインを使用しないのが最高なのだけども、諸般の事情から無理なそうなので
社内ファイルブラウザーの open/import挙動に上記の処理を仕込んでおくことで対策。
flutterでPod installのエラーが出る

# メモ

Pod installできない

```
$ flutter run
```
すると

```
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update
```

なんていう感じでエラーが出る。

こんな時は
ios/Podfile.lock
を消して解決する。
Windows10　環境変数の設定方法 

# 設定手順

- (1) Windows10　画面左下検索窓に"sysdm.cpl"と入力し、sysdm.cplを選択する。
- (2)「詳細設定」タブをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90108/c1fb6f1e-8077-48fd-0f4c-fd4999fcde4e.png)


- (3)「環境変数」ボタンをクリックすると以下の画面が表示される。上がユーザー環境変数、下がシステム環境変数となっている。基本的には**ユーザー環境変数**を編集する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90108/255c48aa-0ffd-7024-a5fe-9912eb9b34fd.png)


- (4)変数欄に対象となる変数がある場合は、「編集」ボタンをクリックする。
    - 以下の画面が表示されるので「新規」ボタンをクリックして、変数値を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90108/61117d3f-095a-96ad-9669-5274410eab6f.png)


- (5)変数欄に対象となる変数がない場合は、「新規」ボタンをクリックする。
    - 以下の画面が表示されるので変数名と変数値を追加する。
 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90108/76a9dc3c-a2d2-b055-5823-ab8cb56acf0f.png)


# 環境変数とは？

環境変数とは、Windows上で動作する様々なプログラムの中で利用できる変数とその値です。プログラムでは、環境変数とそこに設定された値を参照して、動き方に変化を加えています。

そのため、環境変数がプログラムが想定しているように設定されていない場合は、正しく動作しない場合があります。

より詳しく知りたい方はWeb上に記事がたくさんありますので、調べてみてください。
[エラー] Golang-migrationを使っていて 「Dirty database version 2. Fix and force version.」が出た時の対処法

# この記事で説明すること
`golang-migrate`ライブラリを使っていてデータベースのマイグレーションをしたときに

```
error: Dirty database version 1. Fix and force version.
```
というエラーが出た時の対処法

# 環境
- golang 1.15
- MySQL

# 解決法
`migrate force` コマンドを使う

```
$ migrate -database 'mysql://root:golang@tcp(mysql:3306)/golang_db?charset=utf8&parseTime=true&loc=Asia%2FTokyo' -path migrations/ ${VERSION}
```

-database以降はDBのURLを指定
-pathでマイグレーションファイルの場所指定
${VERSION}の部分はエラーで出ているVERSIONを数字で指定。


# エラーが起きた原因
テーブルを構成を編集したくて、`migrate down`コマンドを使った後に、マイグレーションファイルを編集して再度マイグレーションをしようとしたら起きた
Google Script 開発のまとめ

# Google Script 開発のため、以下のリックに参考出来ます
## 一般的な
- Appscript 
https://developers.google.com/gsuite/aspects/appsscript
- Typescriptで開発したい
https://codelabs.developers.google.com/codelabs/clasp/#0

## Addon
- チュートリアル
https://developers.google.com/gsuite/add-ons/cats-quickstart
- ドキュメント
https://developers.google.com/gsuite/add-ons/concepts/card-interfaces
マイグレーションファイルを削除する方法

①rails db:migrate:status　で現在のマイグレーションファイルの状況を確認
②マイグレーションテーブルにversionがあればup、無ければdownとなっている。
③upの場合は　rails db:migrate:down VERSION=(Migration ID入力) でdownにしてあげる
④最後に　rm db/migrate/(Migration ID入力)_(※migration_name).rb　で削除できる
※Create microposts　の場合は、全て小文字にし、 create_microposts　と書く
[競プロ]p進数でのbit全探索

# 2進数での通常のbit全探索
n(割と小さめ)個のものがあり、それぞれに二つの状態があるとき、全探索をする際はいわゆる「bit全探索」を行うと思います。これは2<sup>n</sup>通りを全探索しています。競プロでは「使うor使わない」や「ON/OFF」などの文脈において全探索する際に便利です。
以下がコード例です。

```c++
for(int bit=0; bit<(1<<n); bit++){
    // 右からi番目にビットが立っているかどうか(2進数で表したときに1であるか)
    for(int i=0; i<n; i++){
        if(bit & (1<<i)){
            // i番目が1である
        }else{
            // i番目が0である
        }
    }
}
```

# p進数でのbit全探索
2進数の時と同様に、n(割と小さめ)個のものがあり、それぞれにp個の状態がある時、p<sup>n</sup>通りを全探索したい時があると思います。
例えば次の問題ではp=4(Aに使う・Bに使う・Cに使う・使わない)での全探索を行いたいです。

https://atcoder.jp/contests/abc119/tasks/abc119_c

p進数を用いることで、すべての状態を探索すること
ができます。
以下がp進数でのbit全探索のコード例です。

```c++
int p=4;
for(int bit=0; bit<pow(p, n); bit++){
    int tmp=bit;
    vector<int> state(n);
    // 右からi(0~n-1)番目の状態(0~k-1)
    for(int i=0; i<n; i++){
        state[n-1-i]=tmp%p;
        tmp/=p;
    }
    // 各状態をチェック
    for(int i=0; i<n; i++){
        cout << state[i] << " ";
    }
    cout << endl;
}
```
これの出力は次のようになります

```
0 0 0 0 0  
0 0 0 0 1  
0 0 0 0 2  
0 0 0 0 3  
0 0 0 1 0  
0 0 0 1 1  
0 0 0 1 2  
0 0 0 1 3  
0 0 0 2 0  
0 0 0 2 1
.
.
.
3 3 3 2 0
3 3 3 2 1
3 3 3 2 2
3 3 3 2 3
3 3 3 3 0
3 3 3 3 1 
3 3 3 3 2
3 3 3 3 3
```
n個それぞれ0~3の全ての状態について探索できました。
【備忘録】お名前.comで作成したドメインの証明書をACMを使用して取得する

#楽なやり方
お名前.com側に検証レコードを作成するやり方でも可能だが以下の方法が楽。
お名前.comで作成したドメインをRoute53で運用する場合、お名前.comのネームサーバーの設定をRoute53のNSレコードの値に設定する必要がある。お名前.com側に検証レコードを作成して検証する場合、お名前.comのネームサーバーの設定がデフォルトのネームサーバーである必要がある為、検証後に変更が必要になり手間がかかる。

>
1. お名前.com のネームサーバをRoute 53で発行したNSレコードの値に変更する  
https://teratail-v2.storage.googleapis.com/uploads/contributed_images/b3d8ac46d90d00cacea0bbb30ca4744f.png  
上記の  0N.dnsv.jp となっているところを Route53で作成したゾーンのNSレコードの値に変更する
2. Route53で作成したゾーンに、 DNS認証のためのCNAMEレコードを追加する   
https://teratail-v2.storage.googleapis.com/uploads/contributed_images/6e8308822adf239fbc0e7e4c86a33ff5.png  
上記で表示されたCNAMEレコードをRoute53で取得したゾーンに追加する
>

こちらより引用

https://teratail.com/questions/221009
We couldn’t deliver this payload: timed out｜GitHubのwebhookでのエラー


# 解決した方法（私のところでは）
プルしている本番環境で自動的に変わってしまっていたファイルを
元に戻してプルし直したら治りました。

# 状況
数カ月ぶりの更新をしたサイトでエラーがでました。

# エラーメッセージ
これはGitHubのwebhookのログ画面で確認しています。

```error.log

Request
We couldn’t deliver this payload: timed out

Payload
We can’t highlight this payload because it’s too large

```

画面ではこんな感じで表示されます。

![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169482/de474622-671f-8758-3c2c-d560ec576478.jpeg)

# 環境
ここで環境を整理しておきます。
管理しているプロジェクトはWordPressでwp-contentディレクトリごと管理をしています。
ここでポイントなのはWordPressはプラグインというプログラム部品を組み込んで使うのですが
プラグインが自動でファイルを追加したり変更したりすることがあります。
（現時点最新のWPを使用していればプラグインの自動更新制御のチェックがあります）

# 原因
本番にsshログインしてgit statusを叩いてみたら
変更されたファイル、追加されたファイルがずらっと並びました。
つまりadd前の変更されたファイルがあってpullが実行できない状態でした。
プラグインが勝手に編集したんですね。
便利なこともありますがこう言った原因を生むこともあります。

# 修正作業
下でも重ねて書いていますが

**作業前にバックアップ必須です。**

本番で自動的に変わってしまったファイルの変更をなかったことにします。

```git.sh

$ git checkout .

```

これで編集、削除されたファイルは元に戻りましたが
追加されたファイルが消えていません。
これらも以下のコマンドで消していきます。

ここで一つ注意点！

**★★★★★　　git cleanを実行する前にはバックアップ必須です！　　★★★★★**

理由としては一度削除してしまうと戻せないファイルが出るからです。
具体的に整理してみましょう

.gitignoreで管理対象外にしていたディレクトリがあるとします。
それらがgit cleanを実行するディレクトリにあれば**一緒に削除されます。**
この管理対象外ディレクトリはgitコマンドで戻せるでしょうか？

戻せませんね。git管理から外していたディレクトリですから
ですから誤ってgit cleanを実行してしまった場合はバックアップファイルから戻すしかありません。

心配な場合は面倒でもディレクトリ一つ一つ確認しながら削除するというのもありだと思います。

これらを踏まえて以下のコマンドを見ていきましょう。

```gitclean.sh

//１つ１つ丁寧に削除するパターン
$ git rm -r [削除したいディレクトリ]

//nオプションで削除されるファイルを確認できます。
$ git clean -n

//カレントディレクトリのファイルを削除
//管理対象外のファイルも削除されます！！！
$ git clean -f

//カレントディレクトリにさらにディレクトリがありそれも含めて削除
//管理対象外のファイルも削除されます！！！
$ git clean -df


```

# 確認
現在のヘッドの状態を確認します。

```git.sh

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#   (use "git push" to publish your local commits)
#
nothing to commit, working directory clean

```

マスターブランチはきれいになりました。

これでGitHubのwebhook経由自動pullが通るようになりました。

# ふりかえり
管理体制を見直してみようかな。
オススメの管理方法がありましたら教えてください。
STM32G031とMCP3425で0から2.048000Vまで62uV単位をソフトウェアシリアル出力


目的
シャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫ等の電圧を測る

構成
STM32G031J6M6
MCP3425A0T-E/CH

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり



```c++


#include <Wire.h>

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

//MCP3425A0T-E/CHのアドレス
#define ADD 0x68

//#define in7 1 //uno
#define in7      PB7  // 1pin

#define DW   digitalWrite

//#define UART_DELAY 832 //  1200bps ok 031
#define UART_DELAY 102   //  9600bps ok 031

//10の割り算 0から1028までは、正しい。主に0から999
//#define DVI10(n) ((n*205)>>11)

//16ビットadcの4ビットの変換テーブル
#define ADC4BIT { 0   , 62 ,125 ,187 ,250 ,312 ,375 ,437 ,500 ,562 ,625 ,687 ,750 ,812 ,875 ,937 }

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
  
  DW(in7, HIGH);
  
    //q_st =  micros(); //debug

  DW(in7, LOW);//START
  delayMicroseconds(UART_DELAY);
  
  for(int ii=0;ii<8;ii++){
    DW(in7, (ch>>ii)&1  );
    delayMicroseconds(UART_DELAY);
  }//for
  
  DW(in7, HIGH);//Stop
  delayMicroseconds(UART_DELAY);
  
    //q_et =  micros(); //debug 引いた数が0で1041usなら正解
  
  return(0);
  
}//pc_putc

//文字列の表示
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        pc_putc(*str1 ++);
        //Serial.print( *str1 ++ ); //uno

    } //while

    //戻り値
    return(0);
}//pc_printf

//0から999まで文字列に変換
char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
  int a,b,c;
  
  b=l_num/10;
  c=l_num-(b*10); //1の桁
  a=b/10;         //100の桁
  b=b-(a*10);     //10の桁
  
  ch_hex_a_b[0] = '0' + a;
  ch_hex_a_b[1] = '0' + b;
  ch_hex_a_b[2] = '0' + c;
  ch_hex_a_b[3] = 0;

  return(ch_hex_a_b);
}//ch_hex_a


void setup()
{
  //ポートをhiにする 初期化
  pinMode(in7, OUTPUT);
  DW(in7, HIGH);
  delayMicroseconds(UART_DELAY*10);

  //while(1){pc_putc('A');delay(1000);} //debug
  //pc_printf("\r\nSTART\r\n"); //debug

  //Wire.begin();         //i2cの初期化 uno
  Wire.begin(sdaPin,sclPin); //STM32G031J6M6

  //Serial.begin(9600);

    // 7 *(1)待ち
    // 6 *(0)
    // 5 *(0)
    // 4 (0)ワンショット,*(1)連続
    // 3 | (00)12ビット,(01)14ビット
    // 2 | *(10)16ビット
    // 1 I *(00)x1,(01)x2
    // 0 I (10)x4,(11)x8

  //初期値の書き込み
  Wire.beginTransmission(ADD);
    Wire.write(0b10011000); //16bit 15sps PGA x1
  Wire.endTransmission();

} //setup

int read_data()
{
  //2文字の読み込み
  Wire.requestFrom(ADD, 2);

  //戻し
  return ( (Wire.read() << 8 ) + Wire.read() );
}//read_data


int s;   //101
int ii;     //ループカウンタ
int bit4[]=ADC4BIT;

void loop()
{
  s = read_data();
  //s = (65536/2)-1;
  //s = 65536/4;

char *gk;

ii=(s >> 4);
if     ( ii >= 2000 ) { ii = ii - 2000; gk="2.";    }
else if( ii >= 1000 ) { ii = ii - 1000; gk="1.";    }
else                  {                 gk="0.";    }

  //Serial.print( gk ); //uno
  pc_printf( gk );

  //Serial.print( ch_hex_a( ii ) ); //uno
  pc_printf( ch_hex_a( ii ) );
  
  ii = bit4[ s & 0xf ];
  //Serial.print( ch_hex_a( ii ) ); //uno
  pc_printf( ch_hex_a( ii ) );
  
  //Serial.println(""); //uno
  pc_printf("\r\n");

  delay(1000);
} //loop



```

![com_1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/256f3644-a962-05fe-91af-342a4b1ea4ec.jpeg)
【React】axiosのgetを使ってみる


細かい書き方は正しくないかもしれませんが、一旦getできたのでメモとして。
`Some`というコンポーネントを作成し、その中で`axios.get()`を使っています。

```typescript:Some.tsx
import React from 'react';
import axios from 'axios';

interface SomeResponse {
  id: number;
  title: string;
  ...
}

export default class Some extends React.Component {
  clicked() {
    axios.get<SomeResponse[]>('https://hogehoge.com/api/fugafuga')
      .then(res => {console.table(res.data)})
      .catch(error => {console.log(error)})
  }

  render() {
    return (
      <button onClick={this.clicked}>click</button>
    );
  }
}

```

取得したデータの型を`SomeResponse`という名前で`interface`として定義しておき、
`axios.get`の後ろにジェネリックとして渡します。

`axios.get()`の返り値は`Promise`型なので、後ろに`.then()`や`.catch()`を付けられます。

http通信のレスポンスには`data`プロパティが含まれているので、
それを`console.table()`に渡すことでデベロッパーツールのコンソールに表形式で出力します。
【tailwind】ふわっと背景色が切り替わるアニメーションを実装する

![画面収録-2021-05-24-8.41.35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/d0f58a9e-4446-9453-3ad8-b2fb33d7696a.gif)

自分の実装力を上げるためスクラッチで、Vuetifyのカレンダーコンポーネントのようなものを作っています。
今日はtailwindcssを使って日付ラベルをhover時にふわっと背景色が切り替わるアニメーションを実装したので、備忘録を残しておきます。

```html
<div :class="{ 'text-red-default' : isToday(day) }" class="text-center">
  <span class="rounded-full transition duration-500 ease-in-out cursor-pointer inline-block w-6 h-6 hover:bg-grey-light">
    {{ day.label }}
  </span>
</div>
```

classに`transition` `duration-500` `ease-in-out`を指定するとgifのようにふわっと背景色が切り替わるようになります。
window.openでpdfを別タブで開く方法

```
// 同じタブ内でpdf開く
window.location.href = pdfDownloadUrl;

// 別タブでpdf開く
window.open(pdfDownloadUrl, '_blank')
```

###蛇足：vue-test-utilsの記述例
```
it('同じタブ内でpdf開くときのテスト', async () => {
    // window.location.hrefを書き換える
    global.window = Object.create(window);
    Object.defineProperty(window, 'location', {
        value: {
            href: "",
        },
    });

    // axiosでAPIレスポンス設定、mountなど色々

    // 検証
    expect(window.location.href).toBe(pdfDownloadUrl)
})

it('別タブでpdfを開くときのテスト。'', async () => {
    // windowオブジェクトをモック化
    const mockedOpen = jest.fn();
    const originalOpen = window.open;
    window.open = mockedOpen;

    // axiosでAPIレスポンス設定、mountなど色々

    // 検証
    expect(mockedOpen).toBeCalled();
    expect(mockedOpen).toHaveBeenCalledWith(pdfDownloadUrl, "_blank")
    // windowオブジェクトを復元
    window.open = originalOpen;
})
```
【python・Django初学者】Djangoの環境構築とディレクトリ構成について爆速で解説していく


#環境構築
###仮想環境作成

```
python3 -m venv [newenvname]
```

###仮想環境activate(Mac)

```
source [newenvname]/bin/activate
```
###仮想環境activate(Windows)

```
.\[newenvname]\Scripts\activate
```


###Djangoインストール

#プロジェクトを作成

```
django-admin startproject mysite
```
設定ファイルなど様々なモジュールを集めたものが作成される。

###プロジェクトの動作確認

外側のmysiteディレクトリに移動しコマンド入力

```
$ python manage.py runserver
```
```
Starting development server at http://127.0.0.1:8000/
```
この後半のurlで確認を行う
成功すれば
![スクリーンショット 2021-05-11 18.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/54e0c906-25b2-4ebf-735e-51138a946e13.png)

このような画面が表示される

#アプリの作成

```
python manage.py startapp polls
```


#ディレクトリ構造

```
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```
これがDjangoのディレクトリ構成図

https://docs.djangoproject.com/ja/3.2/ref/django-admin/

###manage.py
公式docによるとdjango-adminとほぼ同じと考えて良いみたい
単体のDjangoプロジェクトならmanage.pyの方が簡単だから推奨されている。
Djangoを扱うためのコマンドが記載されているファイルと思えばいい。
例えばプロジェクトのスタートでも

```
$ django-admin startproject myproj
```

```
$ python manage.py startproject myproj
```
このようにしてdjango-adminもしくはmanage.pyが使われている

###mysite/__init__.py
mysite_がpythonパッケージだとpythonに伝えるための空ファイル

###mysite/settings.py

MODULEレベルの変数が記載されたpythonモジュール

```
MY_SETTING = [str(i) for i in range(30)]
DEBUG = False
```
例えば１行目のようにpython構文で動的に値を設定もできる

###mysite/urls.py

名前の通りどのurlにリクエストが来たらどの関数が実行されるかを示すモジュール

###mysite/asgi.py
>プロジェクトを提供する ASGI 互換 Web サーバーのエントリポイント
Djangoとwebサーバー(ApacheやNginxなど)が依存しないようにASGIやWSGIなどのインターフェイスを置く。その設定などのためのファイル。

###mysite/wsgi.py
>プロジェクトを提供する WSGI 互換 Web サーバーのエントリポイント

#参考

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e

https://docs.djangoproject.com/ja/3.2/ref/django-admin/

https://docs.djangoproject.com/ja/3.2/intro/tutorial01/
【音速】python初心者が爆速でDjangoでLINEbotを作成した話


#LINE Developersにアクセスする

https://developers.line.biz/ja/
このURLからmessageAPIの今すぐ始めようをクリックし、ログインする。


#LINE Developersに登録する(初期設定)

チャンネル作成自体は特に難しい事はありません。言われるがままに身を任せて・・・
![スクリーンショット 2021-05-08 午後4.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/321c38ff-d582-5285-0cf9-c733a0d99003.png)

画像の下にあるはずのchannelIDとChannelSecretはメモをしておこう。

画像中央のMessaging APIをクリックし、QRコードをスマホで読み込み、自分のLINEに登録しよう。

#色々インストール

前回の記事でpython３系をインストールできたはずだから、pythonのコマンドであるpipコマンドで色々とインストールしていく
###LINEのライブラリ

```
pip install line-bot-sdk
```

###Djangoインストール
```
pip install django==1.11
```

###Djangoプロジェクト作成

Djangobotのディレクトリ作成後djangobotディレクトリに移動し、起動
このフェーズ前に"Desktop/python/"などの場所に移動しておくとベター

```
django-admin startproject djangobot && cd djangobot
python manage.py startapp bot
```
するとこんなエラーが....

```
SyntaxError: Generator expression must be parenthesized
```
https://docs.djangoproject.com/en/dev/faq/install/#what-python-version-can-i-use-with-django
Django1.11.xはpython3.7.xと互換性がないためアップデートをする必要があるようです!?
ということで...
#Djangoのupdate


```
pip install -U Django
```
https://kurozumi.github.io/pip/reference/pip_install.html?highlight=u#cmdoption-u

ついでに
bot/にurls.pyを作成しておきます。

```
cd bot && touch urls.py
```

#Django各種ファイル編集
###djangobot/settings.py


#エラーが出てどうしても解決しない時

```
heroku logs --tail -a アプリケーション名
```

```
fatal: not a git repository (or any of the parent directories): .git
```
このエラーが出た場合は一度git initで初期化してください

もしくはコメントしてくれれば出来る限り応えようと思います。

#参考
Djangoでmigrateできなかった時の対処方法(Python 3.7.0 , Django 1.11)
https://hakonebox.hatenablog.com/entry/2019/02/13/185225

https://dashboard.heroku.com/apps/yutoparrotbot/deploy/heroku-git

https://murabitoleg.com/line-bot/

https://qiita.com/yakan10/items/b7ad35c2cbba5db81462
JavaのTreeMap


Javaの連想配列の使い方の記事です。データベースのデータの受け取り処理、ファイルを読み込む処理の時に良く使います。今回は標準入力、標準出力でのサンプルプログラムです。



```Java
package sakamichi;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;


public class Sample1 {
	public static void main(String[] args) {
		Map<String,Integer> data = new TreeMap<String,Integer>();
		Scanner sc = new Scanner(System.in);
		System.out.println("データの個数を入力してください");
		String line = sc.next();
		int N = Integer.parseInt(line);
		for(int i=0;i<N;i++) {
			System.out.println("名前を入力してください");
			String name = sc.next();
			System.out.println("番号を入力してください。ただし重複はNG");
			String num = sc.next();
			int num2 = Integer.parseInt(num);
			data.put(name,num2);
		}
		for (String key:data.keySet()) {
			int value = data.get(key);
			System.out.println(key + " " + value);
		}



	}
}
```