OmniAICreator/Qiita-1.07M huggingface dataset:
102.ループ文　for while

# ループ文とは
＊{ }の中を繰り返す処理を記述します。
ループ分で大事なのは
1.いつまで繰り返すのか
2.何を繰り返すのか
3.どうすれば終わるのか

ということを意識します。
# for 文
## 書き方 
for(繰り返す値;条件;1周回った時にどのくらい追加されるか){
    //　中身
}
1.いつまで繰り返すのかが、真ん中の;条件;です。
2.繰り返す値は左側に宣言していきます
3.右側が1周回った時に追加される値です
#### 例
条件　i > 5までだったら{}ないが起動するので
i=0 i > 5
i=1 i > 5
i=2 i > 5
i=3 i > 5
i=4 i > 5
i=5 i > 5→これは成立しなくなったので繰り返し終了ー
```javascript
for(let i =0;i < 10;i++){
    console.log(i);
}
```
![スクリーンショット 2022-09-06 16.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/a9a217ca-7d78-1521-35a5-9f2b493b6e93.png)

# while 文
## 書き方 
while(条件){
    //　中身
}
＜注意しておきたいこと＞
1.いつまで繰り返すのかが、真ん中の;条件;です。
2.繰り返す値は左側に宣言していきます
3.右側が1周回った時に追加される値です
先ほどfor文で紹介しましたが、
1.何を繰り返すのか
2.1周回った時追加される値を自分で書かなくてはいけないのです。
具体的には
1.{}外に繰り返す変数を宣言する→{}外じゃないと毎回値が更新されてしまう。（繰り返さない場所に）
2.{ }内にi =i+1などを記入して、条件がいつかfalseになるようにする
#### 例
```javascript
 let i = 0
 while(i < 10){
   console.log(i)
  i = i + 1
 }
 
 // 実行させない
 while(false){
   console.log("hello!")
 }
```
一般ユーザでNASをsshfsでマウントする

## なぜsshfsでマウントするのか
「なぜsshfsでマウントをしたいか」ですが、一般ユーザが、自分の管理するディレクトリにNASをマウントして使うようにしようと考えました。
まずはMacOS上でテストをして、Linux(CentOS)での動作も確認しました。

## マウントするNAS
Synology DS2419 
![ds2419plus-2_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/e633c800-aac5-0227-26ad-d352ac018139.jpeg)


## NAS側の準備
##### ssh接続のための準備
コントロールパネル->端末とSNMP->SSHサービスを有効にするにレを入れる
![スクリーンショット 2022-09-07 13.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/095ac743-f38d-0491-3b16-1599a2748896.png)


##### sshfsでの接続の準備
コントロールパネル->ファイルサービス->SFTPサービスを有効にするにレを入れる
![NAS_sftp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/2aea79df-cb64-9218-a8d6-2047af7cabf0.png)

この操作をしておかないとsshfsコマンド実行時に
'remote host has disconnected'のエラーとなる
## sshでNASのログインできるか確認
```
~ $ ssh hoge@192.168.1.22               
hoge@192.168.1.22's password:

Could not chdir to home directory /var/services/homes/hoge: No such file or directory
hoge@DS2419-1:/$ ls /volume1/share3/
@eaDir　　README.txt
```

上記のエラーが気になるときは、NAS側で「ユーザホームサービス」を有効にする
![dshome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/a88f75a5-d3cc-56ca-1595-2a9e0869edc8.png)



### sshfsコマンドでマウントする
```
~ $ sshfs -p 22 hoge@192.168.1.22:/share3  /Users/hoge/mnt
hoge@192.168.1.22's password:
~ $ ls mnt
README.txt  
```

NASの中のディレクトリは/volume1/share3だったので、マウント時に/volume1から指定すると、下記のエラーになる。
```
~ $ sshfs  -p 22 hoge@192.168.1.22:/volume1/share3  /Users/hoge/mnt
hoge@192.168.1.22's password:
hoge@192.168.1.22:/volume1/share3: No such file or directory
```

### アンマウントする
fusermountコマンドでアンマウントを行う
```
[hoge ~]$ fusermount -u mount-point/
[hoge ~]$ ls mount-point/
```

MacOS上ではummoutコマンドでアウンマウントが実行できたが、Linux(CnetOS)では、unmoutコマンドはエラーになるので、fusermountコマンドを使う
```
[hoge ~]$ umount mount-point/
umount: /MD/home/hoge/mount-point: umount failed: 許可されていない操作です
```
初心者が第3正規化までまとめました。

<h1>正規化の前提知識として</h1>
<h3>テーブルとは</h3>
テーブルとは、共通点を持ったレコードの集まりです。
なので、テーブル名は英語名で複数形で書けます。複数形で書いてみてどこか不自然を感じたら、そのテーブルにはどこか間違いがあるということです。
ex. Employees Orders

<h3>キーとは</h3>
キーとは、リレーショナルデータベースのテーブルになくてはならない物の１つです。キーとは、あるレコード（1行とは限らない）を特定するための列の組み合わせ、という意味です。特に重要なキーとして、主キーと外部キーがあります。
<h3>主キーとは</h3>
主キーはテーブルにおいて必ず１つ存在しなければならず、かつ１つしか存在しません。主キーはその値を指定すれば必ず1行のレコードを特定できるような列の組み合わせのことです。
「1行を特定する」　→ 「一意に識別する」　→ unique
主キーが存在しなければならないということは、テーブルには重複行は存在できない、ということです。
場合によっては、複数列を組み合わせなければ主キーを作れないこともあります。その場合は、複数の列を組み合わせて作るキーを複合キーと呼びます。
<h3>外部キーとは</h3>
外部キーは２つのテーブルの間の列同士で設定します。
外部キーは人間の親子関係と同じ。
外部キーが設定されている場合は、データの削除は子から順に操作するのが吉。
外部キーとなる列には、コードやIDなど表記体系の定まった固定長文字列を用いる。

<h3>NULLとは</h3>
データベースにデータを登録する時に、その値が定まらない時があります。その時にデータをNULLという扱いにすることができます。つまり、空欄です。
主キーとなる列には、DBMS側で暗黙にNOT NULL制約が付与されます。重複が許されないため、NULLも許されないのです。

<h1>第1正規形</h1>
第1正規形の定義とは、１つのセルの中には１つの値しか含まないです。
この値のことをスカラ値と言います。スカラ（scalar）とは単一のという意味です。
なぜ、１つのセルに複数の値を入れることが認められていないのか？その理由は、セルに複数の値を許せば、主キーが各列の値を一意に決定できないからです。
これは、主キーの定義に反しています。

<h1>第2正規形</h1>
第２正規形とはテーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作ることです。
やり方は、部分関数従属の関係にあるキー列と従属だけ独立のテーブルにすれば良いです。
第2正規化は必ず正規化する前の状態にテーブルを戻ることができるようになっています。これを可逆的（reversible）と呼びます。
情報を完全に保存したままテーブルを分割する操作のことを無損失分解と言います。
<p>※正規化の逆操作は結合</p>

<h1>第3正規形</h1>
テーブル内部に存在する段階的な従属関係のことを<b>推移的関数従属</b>といいます。
第3正規化は推移的関数従属によるデータ登録時の不都合を解消するためにする。
テーブルを分割していくことで、非キー列はキー列に対してのみ従属するようになります。
第3正規化も無損失分解です。
アクセスポートとトランクポート

ccnaのスイッチングで学んだことをアウトプットしてしっかり記憶します。

そもそも、スイッチポートは、どのVLANに対応しているかという観点でアクセスポートとトランクポートに分類されます。

## アクセスポート
１つのVLANに対応。エンドユーザーのPCを接続するポートなどに利用される。
デフォルトはVLAN1。

## トランクポート
複数のVLANに対応。スイッチ同士やスイッチとルータを接続（VLAN間通信の際に利用）するポートなどに利用される。
トランクリンクではIEEE 802.1Qを使用して、VLAN情報を識別します。
在庫の管理

在庫管理をするときに全てのものを管理するのは難しい。
なので管理手法を約束して在庫管理をする。

### 先入先出手法
* ```先に仕入れた商品から、順に出庫```していったとみなす計算方法
* 先に仕入れた商品から先に販売したと仮定して、期末在庫の評価（計算）する方法
    出典 https://biz.moneyforward.com/accounting/basic/48514/

### 後入後出手法
```後に仕入れた商品から、順に出庫```していったと見なす計算方法

### 移動平均法
商品を仕入れるたびに```残っている在庫分と合算して平均単価を計算し、それを仕入れ原価```とみなす計算方法

#### 期首在庫（期首商品棚卸高）とは？
「前期末の```在庫をそのまま翌年の期首に繰り越したもの```」をいいます。

出典 https://www.zaico.co.jp/zaico_blog/what-is-beginning-inventory-explain-about-basic-knowledge-and-relationship-to-cost-of-sales-and-gross-profit/#%E6%9C%9F%E9%A6%96%E5%9C%A8%E5%BA%AB%EF%BC%88%E6%9C%9F%E9%A6%96%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%EF%BC%89%E3%81%A8%E6%9C%9F%E6%9C%AB%E5%9C%A8%E5%BA%AB%EF%BC%88%E6%9C%9F%E6%9C%AB%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%EF%BC%89%E3%81%AE%E9%96%A2%E4%BF%82

##### 期末在庫とは？
前の仕訳例で見たように、```前期から繰り越した商品（期末在庫）```を期首在庫へ振り替えました。

つまり、期末在庫と期首在庫は密接にかかわっています。
出典 https://www.zaico.co.jp/zaico_blog/what-is-beginning-inventory-explain-about-basic-knowledge-and-relationship-to-cost-of-sales-and-gross-profit/#%E6%9C%9F%E9%A6%96%E5%9C%A8%E5%BA%AB%EF%BC%88%E6%9C%9F%E9%A6%96%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%EF%BC%89%E3%81%A8%E6%9C%9F%E6%9C%AB%E5%9C%A8%E5%BA%AB%EF%BC%88%E6%9C%9F%E6%9C%AB%E5%95%86%E5%93%81%E6%A3%9A%E5%8D%B8%E9%AB%98%EF%BC%89%E3%81%AE%E9%96%A2%E4%BF%82

### 気づき
これから勉強していこうと思う。
ちょっと関心が薄い。
Docker PostgreSQLのエラー PANIC:  could not locate a valid checkpoint record

Docker PostgreSQLで
今まで普通に動いていたのに、急に動かなくなった
```
db_1   | 
db_1   | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1   | 
db_1   | 2022-08-30 06:07:15.130 UTC [1] LOG:  starting PostgreSQL 14.5 (Debian 14.5-1.pgdg110+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
db_1   | 2022-08-30 06:07:15.130 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2022-08-30 06:07:15.130 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2022-08-30 06:07:15.135 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2022-08-30 06:07:15.171 UTC [27] LOG:  database system was shut down at 2022-08-30 02:50:13 UTC
db_1   | 2022-08-30 06:07:15.180 UTC [27] LOG:  record length 2013368472 at 0/7BDF4248 too long
db_1   | 2022-08-30 06:07:15.180 UTC [27] LOG:  invalid primary checkpoint record
db_1   | 2022-08-30 06:07:15.180 UTC [27] PANIC:  could not locate a valid checkpoint record
db_1   | 2022-08-30 06:07:15.181 UTC [1] LOG:  startup process (PID 27) was terminated by signal 6: Aborted
db_1   | 2022-08-30 06:07:15.181 UTC [1] LOG:  aborting startup due to startup process failure
db_1   | 2022-08-30 06:07:15.184 UTC [1] LOG:  database system is shut down
backend_db_1 exited with code 1
```

dockerの設定ファイルなど、いろんな記事を見て変更したが、変わらず。。。。。

## 解決手順
backend/tmp/db 配下を削除後、
再度
db:create 
で解決

dbで不整合が起こっていたみたい
C# VisualStudio コードスニペット（補完）


C#のコード補完で最近よく使っているもの。
(Visual Studio2019で利用）

# プロパティ生成
prop と入力後、tabキーを２回押す。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/7326fc21-7043-43f9-18c5-95532fbd57e9.png)
生成されるコード
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/bd56b174-1af3-a483-2c05-f05552555981.png)

```csharp
public int MyProperty { get; set; }
```

# コンストラクタ生成
ct と入力後、tabキーを２回押す。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/5d439faa-eb2f-0e9d-409b-7f34a4070f33.png)
生成されるコード
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/bdfe75ce-2b95-d6ce-ad3d-e0a56e705e35.png)
```csharp
        public Class1()
        {

        }
```
Macbook Air M2（mem16GB）のローカル環境でStable Diffusionを動かす（2022.9.6版）

## はじめに
- 2022年8月に書いた以下の記事が古くなったので書き直し
    - [Macbook Air M2(mem16GB)で環境作ってStable-Diffusionを試す（2022/8/24版）](https://qiita.com/hevo2/items/e646148a05118074fecf)
    - 参考ページとしていた magnusviri氏によるapple-silicon-mps-supportブランチがメイン（？）の方にマージされて消えたため
- Macbook Air M2 (mem16GB)利用。GPU(MPS）利用。1画像出力で3分くらい。使用メモリーはおよそ13GBくらい。

## 参考ページ
- 使うリポジトリ
	- https://github.com/lstein/stable-diffusion
- 参考としたドキュメント
	- https://github.com/lstein/stable-diffusion/blob/main/README-Mac-MPS.md


## 事前に学習済みモデルをダウンロードしておくこと
- https://huggingface.co   でsignupしておく
- https://huggingface.co/CompVis/stable-diffusion-v-1-4-original へ移動
- 「Access Repository」ボタンを押して承認
- 「sd-v1-4.ckpt」をダウンロード。4.27GBなので相当にサイズ大きい。たいていは自PCの~/Downloads フォルダにダウンロードされるはず

## brew でインストール
- python3が必要
- インストール：　git, cmake, protobuf, rust

``` terminal
% python3 -V
Python 3.8.9

% brew install git cmake protobuf rust
省略
```

## minicondaのインストール
```
% brew install miniconda
省略

% conda -V
conda 4.12.0

% conda init zsh
省略

% source ~/.zshrc
```
- 「conda init ＜SHELL_NAME＞」で、うちはzsh使っているため。
- 「~/.zshrc」を生成してくれるので、読み込む。
- % プロンプトの前に(base)と表示されることを確認

## repo. をクローンしてそのディレクトリで作業
```
(base) % git clone https://github.com/lstein/stable-diffusion.git
省略

(base) % cd stable-diffusion
```

## ダウンロードしたモデルファイルを指定位置に配置・ファイル名変更
```
(base) % mkdir -p models/ldm/stable-diffusion-v1/

(base) % mv ~/Downloads/sd-v1-4.ckpt ./models/ldm/stable-diffusion-v1/model.ckpt
```

## Pythonパッケージのインストール
```
(base) % PIP_EXISTS_ACTION=w CONDA_SUBDIR=osx-arm64 conda env create -f environment-mac.yaml
（大量のインストール表示）

(base) % conda activate ldm
```
- 以降、%プロンプトの前は(base)から(ldm)に変わる

## 一回だけ実行しよう
```
(ldm) % python3 scripts/preload_models.py
(succcessなどの数行の表示)
```

## enjoy!
```
(ldm) % python3 scripts/orig_scripts/txt2img.py --n_samples 1 --plms --prompt "a photograph of a space cat"
```
- 「--n_samples 1」にして一度に出力する画像数を減らすと処理が早く終わる
- だいたい3分30秒くらい。
- 標準だと縦横512x512サイズの画像だけど、横幅を「--W 256」に小さくするともっと早い。なお縦横ともにサイズは64の倍数である必要

## どこに画像出力？
- ./outputs/txt2img-samples　以下
![00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47569/b6ccde7a-5510-3697-a4d5-c4c222185176.png)


## 毎回CUIでパラメータやpromptを入力するのが面倒なら

```
% python3 scripts/dream.py --web
```

- ブラウザで http://localhost:9090 を開くと以下のようなUI表示。

![スクリーンショット 2022-09-06 16.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47569/78f3397f-2a96-c9ac-a605-20e6f01085aa.png)
aws cli v2で"Invalid base64"が出た時の対応方法

kms encryptで暗号化する際の出来事。
aws cli v2を使用している場合、エンコードで使用される文字コードがv1から変わっているのでエラーが出る。
v1と同じように出力するためには「--cli-binary-format raw-in-base64-out」を追加する

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html#cli-configure-options-cli-binary-format

```bash
$ aws --version
aws-cli/2.1.14 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

$ aws kms encrypt --key-id alias/hoge --plaintext "hoge/hoge"
Invalid base64: "hoge/hoge"

 ↓

$ aws kms encrypt --cli-binary-format raw-in-base64-out --key-id alias/hoge --plaintext "hoge/hoge"
{
    "CiphertextBlob": "AQICAHgRiong2g/42V4cr7XORzdNrTD5fP0itLwSUgnU...",
    "KeyId": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXX:key/XXXXXXX-XXXXX",
    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}

```
package.jsonとpackage-lock.jsonの違いについて

# package.jsonとは
- 現在のプロジェクトの情報を保存するファイル。
- `package.json`はプロジェクトのルートディレクトリに保存され、アプリケーションの依存性などを記録する。

`package.json`ファイルの各情報はkey-valueと保存される。（jsonオブジェクト）
プロジェクトのnameとversionは必須として記載しなければならなく、インストールすべきパッケージのリストを、`dependencies`または`devDependencies`に明示しなければならない。

#### `dependencies`と`devDependencies`の違い
devDependenciesは開発環境時にのみ必要なパッケージを追加するところ。
例えば、`jest`や`style-loader`などは、主に開発環境でしか使わないパッケージであるため、`devDependencies`に記載して別途管理する。

しかし、axiosやvue-routerなど、本番環境でも利用するパッケージに関しては、`dependencies`に記載して別途管理する。

ここで`dependencies`と`devDependencies`に分けて記載するためには`npm`でインストールする際にオプションを与えることで分けて記載することができる。

`npm install < パッケージ名 >`　->　`dependencies`に記載される。
`npm install < パッケージ名 > --save-dev`　->　`devDependencies`に記載される。

# package-lock.jsonとは
- 依存関係のパッケージのバージョンの詳細を記載したファイル
- `package-lock.json`は`node_modules`の構造やpackage.jsonが修正または生成される際の依存性を正確かつ具体的な情報を記載する。

`npm install < パッケージ名 >`でインストールすると、`package.json`にはインストールしたパッケージの大まかなバージョンが記載されると同時に`node_moduls`が生成・追加される。
しかし、時間が経過して新しいバージョンのパッケージが配布されてから`package.json`をもって再度`npm install`を行うと、新しいパッケージパッケージがインストールされる。
つまり、インストールした時点によってバージョンが異なるので、アプリケーションの動作の保証ができない問題があり、それで生まれたのが`package-lock.json`である。

#### 実際のファイルの中身の違い
package.jsonの例
![packageJson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785890/1ad298cc-fb1b-7dd1-bfc8-7fd23c1bd9c2.png)
package-lock.jsonの例
![packageLock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785890/82522de6-916d-4e94-dd2a-1271f03df56c.png)

# package-lock.jsonがあるときの`npm install`の動き
`package-lock.json`があると`npm install`の動きはちょっと変わる。
具体的には、`package.json`を利用して`node_modules`を生成しないで、`package-lock.json`を利用して`node-modules`を生成する。
LPの下にフォームがあり、バリデートの時にLPの上にファーストビューが行ってしまう。

場面は、下記のような時、

![スクリーンショット 2022-09-06 14.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398426/b86e710e-a2c6-c9e6-cdbc-fbcd030c4bdd.png)

確認ボタンを押して、エラーが出る。

![スクリーンショット 2022-09-06 14.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398426/5ed0d803-3dff-71b4-e940-e8907bfce105.png)

この時の画面がこうなっていて欲しい↓

![スクリーンショット 2022-09-06 14.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398426/48345101-932e-db9b-d9ec-8587049c8f08.png)


これの方法

```:html
<form method="post" action="dummy" name="huga" id="hoge">
    <!-- いろいろな項目 -->
    <button type="submit">確認</button>
</form>
```

↓
```:html
<form method="post" action="dummy#hoge" name="huga" id="hoge">
    <!-- いろいろな項目 -->
    <button type="submit">確認</button>
</form>
```

```action``` にフォームのIDを載せる

以上。
Ubuntuデスクトップで改行コードと文字コードを楽に一括置換する

Linux上についうっかりCRLFでCP932なファイルを置いてしまったときの
もっとも楽な対処法。GUIとgeditが使える環境限定だが・・・
今までviでせこせこ全置換していたがそんなことは必要なかった。

1. geditで対象ファイルを開く。
2. 右上のバーガーメニューから「名前をつけて保存」。
3. 保存メニューウィンドウの下辺に文字コードと改行コードのメニューがある。
4. 望みのものを選んで保存して終了。

ものすごく単純で楽なことだった。もっと早く気づけばよかった。
Chipyard上で動作するRISC-Vマルチコアプログラムを作りたい

ググってもなかなか出てこないのでメモ代わりに書いておく．動作確認はしてますが間違いがあるかもしれません
Chipyardは詳しくないので知ってる人がいたらコメントで教えて下さい
（今後追記・修正するかも）
# Chipyardでの簡単なプログラムの実行
事前にChipyard(https://github.com/ucb-bar/chipyard )とriscv-tests(https://github.com/riscv-software-src/riscv-tests )をクローンしておき，Chipyardでhttps://chipyard.readthedocs.io/en/latest/Chipyard-Basics/Initial-Repo-Setup.html を参考にツールチェインとかをビルドしておく．

Chipyardのディレクトリで次を実行
```sh
source env.sh
cd sims/verilator
make debug CONFIG=DualSmallBoomConfig VERILATOR_FST_MODE=1
```
（chipyard/generators/chipyard/src/main/scala/config/BoomConfigs.scalaにある次のコアをビルドするらしい．他のConfigを参考にすれば自分好みのマルチコアを作れると思う）

```scala
class DualSmallBoomConfig extends Config(
  new boom.common.WithNSmallBooms(2) ++                          // 2 boom cores
  new chipyard.config.AbstractConfig)
```

riscv-tests/benchmarks/common/crt.Sの125行目を次のように書き換える（ここのa1レジスタでコアがいくつあるかを示す）
```
li a1, 2
```
次のように`hello.c`を作る
```c
#include<stdio.h>
#include<stdlib.h>

volatile int _wait = 0;

void thread_entry(int cid, int nc)
{
    if(cid == 0) {
        while(_wait == 0);
        printf("Core ID; %d\n", cid);
        exit(0);
    }
    else {
        printf("Core ID: %d\n", cid);
        _wait = 1;
        asm volatile("wfi;");
    }
}
```
要するにコア0では`_wait`が0以外になるまで無限ループで待って，終了する．コア1では`_wait`を1にして，その後`wfi`命令で割り込みがあるまで待機する．

`hello.c`を次のようにコンパイルする（riscv-testsのMakeの出力を参考にした）
```sh
riscv64-unknown-elf-gcc -I/home/hidetaro/github_dir/riscv-tests/benchmarks/../env -I/home/hidetaro/github_dir/riscv-tests/benchmarks/common -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf -fno-tree-loop-distribute-patterns -o hello hello.c /home/hidetaro/github_dir/riscv-tests/benchmarks/common/syscalls.c /home/hidetaro/github_dir/riscv-tests/benchmarks/common/crt.S -static -nostdlib -nostartfiles -lm -lgcc -T /home/hidetaro/github_dir/riscv-tests/benchmarks/common/test.ld
```
Chipyardの`sims/verilator`ディレクトリで次のように実行する（最後のところはプログラムの場所に応じて変更する）
```sh
./simulator-chipyard-DualSmallBoomConfig-debug --vcd=dualboomhello.fst --verbose ~/riscv/chipyard_test/hello
```
# 実行結果
```
using random seed 1662501447
This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1.
Listening on port 45895
[UART] UART0 is here (stdin/stdout).
Core ID: 1
Core ID; 0
*** PASSED *** Completed after 34928 cycles
```

両方のコアがたぶん動作していることが確認できる．ただしコア0の部分でwhileとprintfを入れ替えると何故か動作しなくなったりするのでどっかたぶん間違えてそう
StableDiffusionとFILM( Frame Interpolation for Large Motion)を使ってアニメーション生成プログラムを作ってみた

# text2animation
ちまたで話題となっているテキストから画像を生成するAI「StableDiffusion」と2つの入力画像から複数の中間フレームを合成するフレーム補間アルゴリズム「FILM: Frame Interpolation for Large Motion」を用いて、StableDiffusionで作成した画像を使ったアニメーションを生成するプログラム”text2animation”を作ってみました。

GoogleColaboratory上で動作します。
https://colab.research.google.com/github/noriakihanya/text2animation/blob/main/text2animation.ipynb
※「StableDiffusion」への入力は日本語にも対応

* text2animation
https://github.com/noriakihanya/text2animation
* StableDiffusion
https://github.com/CompVis/stable-diffusion
* FILM: Frame Interpolation for Large Motion
https://github.com/google-research/frame-interpolation

# デモ
![org_ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633460/0fe0fa24-86ad-b6f8-5808-dd9d51192f30.gif)

# 使用方法概略
* Access Tokensの取得
まずはHuggingFaceのサイトでアカウントを作成し、CompVis/stable-diffusion-v1-4へのAccess Tokensを取得
https://huggingface.co
画面右上のアカウントのアイコンから[Settings]->[Access Tokens]に移動しTokenをコピーする
<img width="231" alt="スクリーンショット 2022-09-05 16 46 36" src="https://user-images.githubusercontent.com/105255463/188396200-aaa52531-b73e-4301-8f11-ea2c62769876.png">
<img width="855" alt="スクリーンショット 2022-09-05 16 47 42" src="https://user-images.githubusercontent.com/105255463/188396409-4ba60f3c-3942-45b0-b900-965350ece6f0.png">

* Access Tokensの入力
コピーしたAccess Tokensを入力する
<img width="662" alt="スクリーンショット 2022-09-05 16 50 47" src="https://user-images.githubusercontent.com/105255463/188396987-b91a1e2a-05d7-4a99-9df1-78904ff9b076.png">

* FILMの学習済みモデルのロード
FILMのモデルはColabからダウンロードできないため、GoogleDriveのMyDriveにモデルのショートカットを追加しロードできるようにする
<img width="903" alt="スクリーンショット 2022-09-02 15 23 41" src="https://user-images.githubusercontent.com/105255463/188397188-0f8661a7-1840-4b47-aa04-4d9514bbe214.png">
<img width="884" alt="スクリーンショット 2022-09-02 15 24 07" src="https://user-images.githubusercontent.com/105255463/188397227-6736fefd-b653-4529-ae08-7f2cfc1ea3d1.png">

* 生成したい画像イメージを入力
日本語入力に対応しているため、'日本語入力'か'英語入力'を選択する
英語入力にはあらかじめいくつか選択肢を用意しているが、任意の文字列を入力することも可能
<img width="1105" alt="スクリーンショット 2022-09-05 16 43 16" src="https://user-images.githubusercontent.com/105255463/188395581-b7bc3574-493c-4dc7-94a1-9ee13d3c40d4.png">

* アニメーションの再生時間を入力
<img width="548" alt="スクリーンショット 2022-09-05 16 44 57" src="https://user-images.githubusercontent.com/105255463/188395865-a7c0aaff-4b98-4a78-a36e-0c3da1f67e3d.png">

* Real-ESRGANによる高解像度処理
オプションとして、Real-ESRGANによる高解像度処理が使用できます。
<img width="663" alt="スクリーンショット 2022-09-05 17 04 04" src="https://user-images.githubusercontent.com/105255463/188399592-0c7c841c-f76e-42c8-8ae1-6254c03ba885.png">

* Real-ESRGAN
https://github.com/NightmareAI/Real-ESRGAN

# 最後に
生成した画像がアニメーションでは一瞬で通りすぎてしまうので、生成画像が長く再生されるよう調整したい。
また、アニメをもっと簡単に編集できる機能も付けてみたい。


# 参考サイト
https://www.12-technology.com/2022/08/stable-diffusion-aipython.html
https://www.12-technology.com/2022/02/film.html
Rails/InverseOfの謎　activerecord関係　忘却録

##はじめに
この記事は自分のために書く忘却録である
また初学者が記載しているため不備があると思われるが指摘していただけると幸いです。
また違う実装方法の提案や助言など嬉しく思いますのでコメントに記載していただけると幸いです。



## 背景
rails : 6.1.6
ruby : 3.1.1p18

フォロー機能の追加をする際に出現した
課題をしている際にrubocop上に下記のような警告が出現
`Rails/InverseOf: Specify an :inverse_of option.`

全く検討がつかなかったのでドキュメントを確認したところrailsの公式ドキュメント（[3.5 双方向関連付け](https://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B)）でこのような記載がある
`Active Recordは、:throughや:foreign_keyオプションを使う双方向関連付けを自動認識しません。関連付けの反対側でカスタムスコープが使われていると、同様に自動認識しなくなります。 また、関連付け自身でカスタムスコープが使われている場合も、config.active_record.automatic_scope_inversingをtrueに設定しない限り自動認識しません`
`Active Recordが提供している:inverse_ofオプションを使うと、双方向の関連付けを明示的に宣言できます。`
今回の機能追加で双方向の関連付けをしたがActive Record側では関連付けが認識されていないとのこと。
認識して欲しければオプションを記載しなさいというrubocopの警告でした。
解決方法は上記のドキュメントに記載されていたのでそちらを見るように

##　まとめ
Active Record側で関連付けが認識されていないから認識させるためのオプションを追記してとのこと
PowerShellのImportExcelモジュールで生成したExcelでエラーが出る意外な理由

以前、下記の記事でExcelライセンスなしでPowerShellからExcel形式ファイルを自動生成するImportExcelというモジュールをご紹介した。

https://qiita.com/todkm/items/5b58709f3b2775cb56d8

https://www.powershellgallery.com/packages/ImportExcel/7.8.0

ところが、自動生成した複数のExcelファイルの一部を開くと、「'(xlsxファイル名)'の一部の内容に問題が見つかりました。可能な限り内容を回復しますか? ブックの発行元が信頼できる場合は、[はい]をクリックしてください。」というエラーが出る問題に突き当たった。

その理由がやっとわかった。

「=」で始まるデータだ。

今回は業務上の仕様で「=」を全角の「＝」に置換することが許されたので、そうしてエラーを回避した。

以上、それだけの記事でした。誰かのお役に立てば幸いです(おそらくいない)。
Windows Server 2019でDocker動かしたメモ

# 発端
→ PostgreSQLの検証環境欲しいなぁ
→ 複数バージョン分欲しいなぁ
→ いくつもVM立てるのリソースもったいないなぁ
→ コンテナやってみるか
→ Linuxあんまり得意じゃないんよなぁ
→ Windows ServerでDocker立ててみよう
→ リソース効率重視でHyper-Vコンテナ使わずにやってみよう

参考サイトはまとめて後述

# インストール＆再起動
```powershell
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
Install-Package -Name docker -ProviderName DockerMsftProvider

```

しかしイキナリここで「パッケージソースが見つかりません」…
プロキシ環境で通信ができない状態でコマンド叩くとPSGalleryが壊れるらしい…
プロキシ設定とか通信通るようにして
```powershell
Register-PSRepository -Default 
```
で復旧。(結局この復旧に一番時間かかkった)

# コンテナイメージ取得
[dockerHub](https://hub.docker.com/)からじゃなくて[Microsoft Artifact Registry](https://mcr.microsoft.com/en-us/)から取った方がいいぽい？
```powershell
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 
```

# コンテナ起動
```powershell
docker run -d -p 80:80 mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
```

# コンテナ停止
```powershell
docker ps
CONTAINER ID           IMAGE
【動いてるコンテナのID】 mcr.microsoft.com/windows/se (以下略)

docker kill 【動いてるコンテナのID】
```

# コンテナへのファイルコピー
```powershell
docker cp 【コピーするホストのファイル】 【動いてるコンテナのID】:【コンテナ内のコピー先】
#例 / コンテナID=123456789abc
docker cp .\index.html 123456789abc:"C:\inetpub\wwwroot\"
```

# コンテナのPowerShell起動
```powershell
docker container exec -it 【動いてるコンテナのID】 powershell
```

とりあえずPostgreSQLのインストーラーダウンロードしてコンテナにコピーして実行してみたけどちゃんと入るかなぁ？
Dockerファイルとか自動化はまた今度気が向いたらやろう。

# 参考サイト
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/set-up-environment?tabs=Windows-Server

https://qiita.com/rk05231977/items/2cbe9d8d6deac52a7e65

https://it-bibouroku.hateblo.jp/entry/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93

https://qiita.com/tsukamoto/items/eb74bf6ef887b01eaa01

https://www.kabegiwablog.com/entry/2019/10/06/164320

https://qiita.com/fukamiAO/items/57b7f425d24a6c91b04f

[How-to's - コンテナでPowerShellを実行する方法](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1000540)

https://qiita.com/Yamatombo_3333/items/f3f1dad68fd93fc2913e
忘備録：ローカルで立ち上げてるページをスマホの実機で確認する方法

## ブラウザの開発ツールやsimulatorじゃ事足りない！
実機じゃないとぶち当たらないバグに遭遇してしまった〜〜という時、
わざわざ検証環境に修正中のものあげて確認したり、
バグ確認用のメッセージを仕込んで検証環境に上げるのは良くないですよね？？🤔

そんな時！ローカルで立ち上げてるものを実機で確認できる方法、あります！！

## 環境は以下
 - MacBook Pro (macOS Monterey 12.5)
 - iPhone SE 2GE (IOS 15.6)

## 確認方法
※1 ~ 5まではPCで作業、6,7はスマホで作業です！
1. まず、ローカルのサーバ立ち上げます。
1. terminalを開いて、プライベートIPアドレスを取得します(以下コマンド実行で表示されます)
(`ifconfig`で探すでも良いのですが、いっぱい出てきて探すの大変なので、以下で....えいや！)
    ```shell
    networksetup -getinfo Wi-Fi | grep "^IP address:"
    ```
    以下のように返ってきたら、それがプラインベートIPアドレスですmm
    ```shell
    IP address: 192.168.1.111
    ```
3. 先程取得したプライベートIPアドレスの最後に、今ローカルで立ち上げてるサーバーのポートをくっつけます
(著者は3000で立ち上げてるので3000と入れてます)
    ```shell
    192.168.1.111:3000
    ```
4. これをブラウザに貼り付けて、`Cannot GET /`と帰ってきたらOK
![スクリーンショット 2022-09-06 13.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2319623/12ae0586-2981-258c-6e10-f1feee8ec6d9.png)
5. そしたら以下のような感じで、手順の3で記載したアドレスの後ろに、表示したいページのパスをくっつける
    ```shell
    192.168.1.111:3000/hoge/hogefuga/index.html
    ```
6. 確認に使いたいスマホ端末をPCと同じWIFIにつなぎます
7. 手順5のURLをスマホのブラウザで貼り付ける

これで完了です！きっとこれで見れてるはず！
教えてくださった先輩に本当に感謝🙇‍♀️

## 参考
[macOS で自分のプライベート IP アドレスを見つける方法](https://yu8mada.com/2018/07/14/how-to-find-my-private-ip-address-in-macos/)
データが存在しているセルにテーブルの範囲を調整する_VBAで


データが存在しているセルにテーブルの範囲を調整するコード。
不要な部分が多くあると、データの更新時にムダに遅くなったりするため。

~~~vb
'データが存在しているセルにテーブルの範囲を調整する
With ws.一覧.ListObjects("一覧t")
    tableRow = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
    .Resize .Range.Resize(tableRow)
End With
~~~
scikit-learn 教師なし学習の覚え書き

# この記事の内容
scikit-learnに含まれている基本的な機械学習法の覚え書きです。簡易的な使用法の羅列ですので、ご容赦ください。
- 教師なし学習　(この記事)
    - 主成分分析（PCA）
    - k-means
    - t-SNE
- 教師あり学習 (以下のURLにて)
    - 単回帰分析
    - 重回帰分析
    - ロジスティック回帰 (二値分類)
    - ロジスティック回帰 (多値分類)
    - ランダムフォレスト法 (分類)
    - ランダムフォレスト法 (回帰)
    - サポートベクタマシン（SVM）
    - K近傍法 (K-NearestNeighbor)(分類)
    - K近傍法 (K-NearestNeighbor)(回帰)

https://qiita.com/t_hirao/items/e0b4c7aaf34e5951d8fd

# データセットのインポート

```python
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df_iris = pd.DataFrame(data=iris.data,columns=iris.feature_names)
```

# 主成分分析 (PCA : Principal Component Analysis)
主成分分析とは、データの特徴量を相互に統計的に関連しないように座標軸を回転する時限削減の手法です。それぞれのデータの分散が最大になるような軸を作成します。

|PCA()|引数|説明|
|:--|:-:|:-:|
|n_components||圧縮後の次元数|
|copy|デフォルトはTrue|Falseの場合、変換するデータを上書きする|
|whiten|デフォルトはFalse|Trueの場合、変数間の相関をなくす処理を行う|
|svd_solver|'auto','full','arpack','randomized'|特異値分解のソルバ|
|random_state||乱数|
~~~python
from sklearn.decomposition import PCA

X = iris.data
y = iris.target

pca = PCA(n_components=3)
pca.fit(X)
X_aft = pca.transform(X)
~~~
固有値や寄与率などの算出は下記のリンクをご参考ください。

# k-means法
K-means法は、非階層クラスター分析の一つで、複数回サイクルで最適なクラスターを探索します。まず、学習データを空間上にプロットし、各要素を任意のクラスター分だけランダムに振り分けます。クラスター内の重心を求め、その重心周りでクラスターを再定義します。重心の定義とクラスターのメンバーが変わらなくなるまでサイクルを回しクラスターを作成します。
|KMeans()|引数|説明|
|:--|:-:|:-:|
|n_clusters|デフォルトは8|クラスタ数|
|max_iter|デフォルトは300|繰り返し回数の最大|
|n_init|デフォルトは10|初期の重心を選ぶ処理の実行回数|
|init|'k-means++','random'(デフォルトは'k-means++')|初期化の方法|
|tol|デフォルトは0.0001|収束判定に用いる許容可能誤差|
|random_state||乱数|
|copy_x|デフォルトはTrue|メモリ内でデータを複製してから実行するか|
|n_jobs|デフォルトは1|並列処理する場合の多重度|

~~~python
from sklearn.cluster import KMeans

X = iris.data
y = iris.target

kms = KMeans(n_clusters=3)
print(kms.fit_predict(X))
~~~

# t-SNE
非線形次元削減法の一つで、特に可視化することに重きをおいた教師なし学習です。データの局所的な構造を捉え、広域なデータ構造も保ったまま解析が可能となっている。

|TSNE()|引数|説明|
|:--|:-:|:-:|
|n_components|デフォルトは2|削減次元数|
|perplexity|デフォルトは30|最近傍の数|
|early_exaggeration|デフォルトは12.0|密集度合の設定|
|learning_rate|デフォルトは200.0|t-SNEの学習率|
|n_iter|デフォルトは1000|最適化の最大反復回数|
|random_state||乱数|
|n_jobs|デフォルトは1|並列処理する場合の多重度|

~~~python
from sklearn.manifold import TSNE

X=iris.data

tsne = TSNE(n_components=2,random_state=0)
print(tsne.fit_transform(X).shape)
~~~

# 最後に
今回はscikit-learnに含まれている教師なし学習の使い方についてまとめました。

# 参考
Andreas C. Muller、Sarah Guido 「Pythonではじめる機械学習」（2017年 株式会社オライリー・ジャパン）

https://qiita.com/maskot1977/items/082557fcda78c4cdb41f

https://qiita.com/g-k/items/0d5d22a12a4507ecbf11

https://qiita.com/sakami/items/bb466161489771f7d2e9

https://qiita.com/cheerfularge/items/27a55ebde4a671880666
iRICの格子生成アルゴリズム 2次元円弧形水路格子生成ツール（複断面対応版）"2d arc grid generator （Compound Channel）" のバグ修正・機能追加について

# はじめに
本記事は先日投稿した「[iRICの格子生成アルゴリズム 2次元円弧形水路格子生成ツール（複断面対応版）"2d arc grid generator （Compound Channel）" について](https://qiita.com/starfieldKt/items/0f17a023094511a22a98)」の記事の中でも触れていた複断面を設定する際のバグについて修正および機能の追加をしたのでその紹介記事になります。

# 変更点

変更点は主に以下の3つです。
なお、これらの変更で以前まで作れていた格子が作成できなくなる等はないはずです。

* [バグの修正](#バグの修正)
* [入力するパラメータの変更](#入力するパラメータの変更)
* [左右岸で異なる高水敷高を設定可能に](#左右岸で異なる高水敷高を設定可能に)


## バグの修正

2次元円弧形水路格子生成ツール（複断面対応版）*"2d arc grid generator （Compound Channel）"* のver 1.0.0では、格子生成条件で`断面形状`グループの`複断面`の項目を`なし`に設定していても、GUI上ではグレーアウトされ編集出来ない`右岸高水敷幅`と`高水敷の高さ`というパラメータの数値が使用されてしまい以下のようなバグがありました。

* `断面形状`で`平坦`を選択した場合、右岸側に高水敷が作成され、左岸端の格子点にも高水敷の高さが設定されてしまう。
* `断面形状`で`平坦`以外を選択した場合、水路の左右岸両端の格子点の標高に `高水敷の高さ`に入力されている値が加算される。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/6d0251b2-9826-55b4-9090-0d3c6403f636.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c3b4545d-612e-f537-0071-999e6247a421.png)


ver 1.0.22090201では、`複断面`の項目を`なし`に設定した場合はそれらの数値が反映されないように修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/01d6bd43-400a-5d71-a6a3-3be26be30b62.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/cf5ca76c-42f8-bb6d-1440-039e607f4789.png)


## 入力するパラメータの変更

ver 1.0.0の時は左右岸の高水敷幅、および低水路幅を設定する際に入力するパラメータは`右岸高水敷幅`と`低水路幅`の2つになっており、左岸側高水敷幅は`水路形状`グループの`水路幅`-(`右岸高水敷幅`+`低水路幅`)で算出されていました。（詳しくは[こちら](https://qiita.com/starfieldKt/items/0f17a023094511a22a98#%E6%96%AD%E9%9D%A2%E5%BD%A2%E7%8A%B6)）
ver 1.0.22090201では、入力するパラメータを`右岸高水敷幅`と`左岸高水敷幅`に変更し、より感覚的に高水敷幅を設定できるように変更しました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/59c0abc0-47ae-924c-b8ae-bee02a0be795.png)

## 左右岸で異なる高水敷高を設定可能に
ver 1.0.0の時は左右岸の高水敷の高さについて、左右岸に同じ値を与えていました。
ver 1.0.22090201では、左右岸にそれぞれ別の高さを設定できるように変更しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/ee844e47-7a8b-a8ed-9cb7-fb8bd0e1c9cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5aaedb1f-c4cf-2cd3-92ce-907b5c96936b.png)
初学者がPaiza CloudとAWS Cloud9を使ってみた感想

めちゃくちゃ初学者が二つのサービスを有料で利用してみました。
普段はVSCODEでnode.jsをよく書いています。

■経緯

僕は今職業訓練に通っているのですが、学校のPCが再起動時、
インストールしたデータが消えてしまう設定になっています。

結構自習時間があるので、サーバーサイド言語の学習を行いたいのですが、
Go言語やnode.jsをインストールしても消えてしまって、環境設定がめちゃくちゃめんどくさい。

そのため、何かいいサービスないかな？と思い調べてみると掲題の２つのサービスが導入しやすそうだった。

■よく使うもの
・Go言語
・node.js
・express
・mongodb
・mysql

■初めに結論
・Paizaが停止せず、サクサク動くなら初学者にやさしいPaiza！
なのだが、自分の環境だと、サクサク動くのはCloud9だけだったのでCloud9一択でした。
Paiza不具合なのかな？
しかし、Cloud9の請求内容によってはどっちも使いません・・・

■共通のメリット
・どこでもコーディング。どこでも保存できる。
・linuxを学べる。

□共通の不満点
・Go(gin)がない
・辞書が賢くない。VSCODEと比べるとどうしても・・・
・拡張機能とかないんすか？

■Paiza Cloudについて
※AWSがうまく登録できずこちらを先に試しました。

◇メリット
・日本語でわかりやすい
〇Cloud9より変換が賢い？
◎初期からある開発環境が豊富
個人的にGo、Git、mongodb、express、herokuが嬉しかった！
・登録が簡単
〇明朗会計
◎無料もあり
・操作がわかりやすい
◎アプリを移植してテストしたが、問題なく動作した！

◆デメリット
×自分の環境だけかもしれないがよく停止し、固まる
悲しいが使い物にならなかった・・・
・上位プランにすれば治るかもしれないが、ちょっと高額すぎる

■AWS Cloud9について

◇メリット
・英語が苦手で極端に疲れる
・未知だがAWSの一部EC2に触れられる（本当に初学者ですいません）
◎サクサク動く。クラウドなのか疑うくらい。
ネットブックとかでもこれだけ動くと思うと、PC代を相当ケチれると思う。
〇Paizaほどではないが、開発環境が豊富（node.js、GoがあるのでOK）
・意味が分かってないがLambdaとか夢が広がる！

◆デメリット
×癖があり、アプリをテストで移植したが簡単には動かなかった。
・mongodbが初期環境にない。
×EC2が従量課金制なためいくらになるかわからず恐ろしい
（１年無料だったはずだが・・・）
・辞書機能がないに等しい。
×デビットカードが使えず意味不明なエラーが出る。
=>ロシアとベラルーシ在住の方は使えません！！！

ものすごく稚拙な文章になりましたが、読んでいただきありがとうございます！
ソリューションアーキテクト対策_AWS Organizations篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## 公式
とはいえこの記事に迷いこんでしまった方もゼロではないと思うので公式のご紹介です。

- Black Belt
https://www.slideshare.net/AmazonWebServicesJapan/20180214-aws-blackbeltorganizations

- 公式
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_getting-started_concepts.html#allowlist

## AWS Organizations
### 実現できること
・複数のAWSアカウントを一元管理する
AWSアカウントをグループ化してポリシーを適用。利用サービスを制限する

・AWSアカウントの新規作成の自動化
コンソール、SDK、CLIでAWSアカウントを新規作成

・請求の簡素化
複数AWSアカウントの請求を一括で行う

### AWS Organizationsの構成要素(用語)
#### AWSアカウント or アカウント
・AWS契約の単位でメールアドレスや12桁のIDで識別される
・AWSアカウント内ではIAMユーザ単位のアクセス制御などが行える
・AWS Organizationsで管理する最小単位

#### 組織(Organization)
・AWS Organizationsで一元管理する対象の全体
・複数AWSアカウントのセット

#### マスターアカウント
AWS Organizations組織の全体を管理する権限を持つAWSアカウント

#### メンバーアカウント
組織内にあるマスターアカウント以外のAWSアカウント

#### 組織単位(OU)
組織内にある複数AWSアカウントのグループ

#### 管理用ルート(root)
組織単位(OU)階層の開始点

#### 組織ポリシー
組織内で適用してAWSアカウントを管理する仕組み

#### サービス管理ポリシー(SCP)
・現在サポートされている唯一の組織ポリシーのタイプ
・利用できるAWSサービスとアクションを制御

### AWS Organizationsの構成図
Black Beltから拝借です。超わかりやすい。

![スクリーンショット 2022-09-04 17.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/c84972b0-f37c-ea35-f26e-112e93e39c79.png)

公式より。

![スクリーンショット 2022-09-04 18.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/e35711e0-5650-daa7-8ea1-f0c3a724fbc4.png)


### 機能セットの選択
利用開始する際に、機能セットを選択する。

#### Consolidated Billing Only(一括請求のみ)
・マスターアカウントへの一括請求が可能
・アカウントの新規作成、招待、削除が可能
・サービスコントロールポリシーによる一元管理が不可能

また、ボリュームディスカウントを統合できるため、コストメリットが発生する。
(各アカウントの総利用料をまとめてボリュームディスカウントに反映することができる)

リザーブドインスタンスによる割引がデフォルトで共有される。

#### All Feature(全ての機能)
・マスターアカウントへの一括請求が可能
・アカウントの新規作成、招待、削除が可能
・サービスコントロールポリシーによる一元管理が可能

支払い一括代行も含めて、企業内の複数アカウントを統制したい場合に選択する。

## 模擬試験で出たこと
・AWS OrganizationのSCP
有効化すると、デフォルトではFullAccessが付与される。
なので所属するメンバーアカウントのOUに対してFullAccess権限が付与される。

## リザーブドインスタンスの共有
アカウントでリザーブドインスタンスの共有がONになっている場合、AWS Organizationsのメンバーアカウント間で共有できる。
一括請求でリザーブドインスタンスが共有される。

## おわりに
EC2とかS3のリソースを集約できるのは模擬試験で初めてしりました。
また追記すると思います！

以上です。
eachでハッシュの値をグループ化して合計する方法

## 環境
Ruby 2.6
Ubuntu20.4


## はじめに
ハッシュの特定のキーに対して、同一値のグループで、値を合計する処理を行います。この表現だけでは、何のことかよく分からないかと思います。自分も上手く表現することができません。

エンジニア向けに、SQL文を使って、１言で表現すると次のようになります。
```sql
Select Sum(金額) From HASH Group by コード
```

ハッシュに対してGroup byのSQL文を発行して、結果を取得するようなことを行います。

## 条件
下記のハッシュを利用します。ハッシュは、キー（cd）で昇順にソートされていることが前提になります。
```ary.rb
ary = [{:id=>1, :cd=>1, :kei=>100},
       {:id=>2, :cd=>1, :kei=>110},
       {:id=>3, :cd=>2, :kei=>120},
       {:id=>4, :cd=>2, :kei=>130},
       {:id=>5, :cd=>3, :kei=>140},
       {:id=>6, :cd=>3, :kei=>150}]
```

## やり方（その１）
まず最初は、eachメソッドを使う方法です。このやり方が、一番シンプルだと個人的に思います。ただし、eachメソッドを使うと、ハッシュの先頭１行と、最終１行がeachのブロック内で取得できないため、eachブロックの外で取得することになります。
```sample.rb
#  初期値
kei  = 0; wcd  = 0

# 先頭の１行目だけを取得
ary.each { |val| wcd = val[:cd]; break }

ary.each do |val|

    if (wcd == val[:cd])
    else
        puts "cd= #{wcd}  kei= #{kei}"
        kei = 0
    end

    kei += val[:kei].to_i
    wcd = val[:cd]
end

# 最終行の処理
puts "cd= #{wcd}  kei= #{kei}"
```

処理結果です。
```
cd= 1  kei= 210
cd= 2  kei= 250
cd= 3  kei= 290
```

## やり方（その２）
２つ目は、each_consメソッドを使う方法です。each_consメソッドは、ハッシュの中身を、２行連続で取得することができるメソッドです。書き始める前は、eachメソッドを使うよりも、シンプルに記述できそうな印象を持ちましたが、書いてみると、それ程でもありませんでした。パッと見では、eachメソッドを使った方が、まだ、可読性は上だと思います。
```sample.rb
#  初期値
kei = 0; wcd = 0

# 先頭の１行目だけを取得
ary.each { |val| kei = val[:kei].to_i; break }

ary.each_cons(2) do |prv, val|
    
    if (prv[:cd] == val[:cd])
    else
        puts "cd= #{prv[:cd]}  kei= #{kei}"
        kei = 0
    end
    kei += val[:kei].to_i
    wcd = val[:cd]              # 最終行だけで利用
end

# 最終行の処理
puts "cd= #{wcd}  kei= #{kei}"
```

処理結果です。
```
cd= 1  kei= 210
cd= 2  kei= 250
cd= 3  kei= 290
```

## やり方（その３）
３つ目は、each_with_indexメソッドを使う方法です。each_with_indexメソッドを使うと、eachブロックの中でインデックスを取得することができます。インデックスが取得できると、先頭１行と最終１行のデータを、ブロックの中で拾うことができるようになります。

コードを見ると分かりますが、先頭１行を取得する処理を省略することができました。また、最終１行を取得する処理を、ブロックの中に収めることができました。これで、少しはスッキリしたのではないでしょうか。
```sample.rb
#  初期値
kei  = 0; wcd  = 0

ary.each_with_index do |val, idx|
        
    if (idx > 0)
        if (wcd == val[:cd])
        else
            puts "cd= #{wcd}  kei= #{kei}"
            kei = 0
        end
    end

    kei += val[:kei].to_i
    wcd = val[:cd]
    
    # 最終行の処理
    if (idx == ary.size - 1 )
        puts "cd= #{wcd}  kei= #{kei}"
    end
end
```

処理結果です。
```
cd= 1  kei= 210
cd= 2  kei= 250
cd= 3  kei= 290
```
M1Macでモノクロ画像をカラー化するAIを動かしてみた

参考記事
[モノクロ画像をAIでカラー化してくれるPythonツールを試してみた](https://qiita.com/minorun365/items/217395d517671a5c27b4?fbclid=IwAR0si3u4sz85D2OmhWOQy3B7gOWo5IlGQu50Zr3S3OaBCCGcRTsVUwayjTI)

Mac上でモノクロ画像をカラー化するAIを動かしてみたいと思います。
[colorization](https://github.com/richzhang/colorization)

# Colorizationをgit cloneする
Colorizationというモデルを使います。
たくさんのソースが展開されていてほんと助かりますね。

```
git clone https://github.com/richzhang/colorization.git
```

cloneできたらcolorizationフォルダへ移動します。

```
cd colorization
```

# ライブラリのインストール
requirements.txtに書いてあるライブラリが古いので書き換えます。
skimage → scikit-image
PIL → pillow

```
pip install -r requirements.txt
```

pytorchを使っているみたいですね。

# カラー化に挑戦

お試しでサンプルの画像をカラー化してみます。

![ansel_adams.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565773/6d51b5ab-56e0-3dc5-9342-0914a87f261e.jpeg)

```
python demo_release.py -i ./imgs/ansel_adams.jpg
```

結構時間がかかってますねー。

```
Downloading: "https://colorizers.s3.us-east-2.amazonaws.com/colorization_release_v2-9b330a0b.pth" to /Users/***/.cache/torch/hub/checkpoints/colorization_release_v2-9b330a0b.pth
100%|███████████████████████████████████████████████████████████████████████████████| 123M/123M [01:40<00:00, 1.28MB/s]
Downloading: "https://colorizers.s3.us-east-2.amazonaws.com/siggraph17-df00044c.pth" to /Users/***/.cache/torch/hub/checkpoints/siggraph17-df00044c.pth
100%|███████████████████████████████████████████████████████████████████████████████| 130M/130M [01:45<00:00, 1.29MB/s]
```
モデルのダウンロードに時間がかかっただけみたい。

出力された画像がこちら
![color001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565773/f036b043-953a-30fb-c264-bbc8005d76ad.jpeg)

すごい！！
別のサンプルでやると瞬時にでるのでものすごく速いですね。
けどこれだと元々どのような画像だったのかわからないのでそれらしい色がついただけのように見えます。

# オリジナルの画像でためす
つぎにオリジナル画像をやってみます。

![IMG_8175_org.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565773/1e0a6c3b-6b82-3fb0-47b2-fee8a19490d9.jpeg)

こちらの呼子の写真を、モノクロ化します。
Macの写真アプリで簡単にできます。

![IMG_8175_mono.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565773/b677959b-86ea-43fa-f4a7-1723266f4bd6.jpeg)

できました。これをcolorizationしてみます。

![color002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565773/29e76384-fc76-e8fc-a063-6e3a4cd2d348.jpeg)

空の色はいけてますが、イカさんのピンクはこの看板オリジナルなので、再現はできていませんね。
おもしろいですねー。

簡単にためせるのでぜひやってみてください！
古い写真とかやってみるとおもしろいかも！
Pytorchで実行速度(inference speed)を上げる方法(GPU)

# 概要
PytorchでInfenrece速度を上げるためのテクニック。NVIDIAのGPUを使う仮定です。思いつき次第、随時追加していきます。抜けているのがあればコメントして頂けると助かります。


# メモリー系
* [GPUのSynchronizationを避ける](https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#avoid-unnecessary-cpu-gpu-synchronization)
```
print(cuda_tensor)
cuda_tensor.item()
memory copies: tensor.cuda(), cuda_tensor.cpu() and equivalent tensor.to(device) calls
cuda_tensor.nonzero()
python control flow which depends on results of operations performed on cuda tensors e.g. if (cuda_tensor != 0).all()
```
* 非同期のデータ転送 -> data.to(device,non_blocking=True)
* [TensorをGPU上に直接作る](https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#create-tensors-directly-on-the-target-device) -> torch.rand(size,device="cuda")


# 量子化(Quantization)
* FP16を使う -> ほぼ全てのモデルが、ほとんど精度を落とさず高速化できる
* INT8を使う -> GPUでのINT8はTensorRTのみ。

# モデルの設定と設計
* NormalizationはBatchNormを使う -> Inference時に平均と分散を計算しなくて良い。
* [Normalizationの前のConvolutionのbiasをFalseにする](https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-bias-for-convolutions-directly-followed-by-a-batch-norm) -> Sequential(Conv2d(bias=False),BatchNorm2d())
* Layer Fusionをする -> Conv BatchNormは実行時に一つのカーネルに出来る。
* Reparametrizationをする -> 並列するConvolution層を実行時に一つのカーネルに出来る。
* channelのサイズは8の倍数(FP32,FP16)または32の倍数(INT8)にする -> Nvidiaのデータformatが8または32channelを1ブロックとしている為。端数が出ると空いたメモリをpaddingするらしい。
* [MAC(Memory Access Cost)を減らす](https://arxiv.org/pdf/1904.09730v1.pdf) -> レイヤーやChannelが増えるとメモリーにアクセスする時間が割とかかるらしい。
* separable convolutionを使わない -> separable convolutionはパラメーターが少なくなるが、計算スピードは早くならないことが多い(レイヤーが増えるとMACが上がる+channelサイズが8の倍数ではない)。 


# 変換またはコンパイルする
* TorchScriptに変換する([torch.jit.script](https://pytorch.org/docs/stable/generated/torch.jit.script.html)) -> C++のようにコードをコンパイルする事で高速化。Pytorch1.12から[NVFuser](https://pytorch.org/blog/introducing-nvfuser-a-deep-learning-compiler-for-pytorch/)によりDynamic Shapeがサポートされた。
* モデルをFreezeさせる([torch.jit.freeze](https://pytorch.org/docs/stable/generated/torch.jit.freeze.html)) -> 学習時に必要な機能を無くすことで、高速化。
* torch.compile -> コードを変えずにモデルを簡単にcompile出来る。
* TensorRTを使う -> Torch-TensorRTというPytorchのラッパーを使うと簡単。

# Inference時の設定
* eval modeにする -> model.eval()
* [gradientの計算をoffにする](https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-gradient-calculation-for-validation-or-inference) -> with toch.no_grad()を呼ぶ
* torch.inference_mode()を使う -> torch.no_grad()はgradientを計算しないのに対して、gradientをset出来なくなる。余計なメモリやoverheadを削減出来る。

# cuDNN
* [cudnn Auto-Tunerを使う](https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#enable-cudnn-auto-tuner) -> torch.backends.cudnn.benchmark = True
* cudaのversionを最新にする。versionによってperformanceが結構違ったりする。

# メモリーレイアウト
* torch.channels_lastを使う -> channel方向に畳込みをするので、channelが連続して配置されている方がメモリアクセス効率が高い。


# Reference
https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html
GitHubのPRやissue検索スニペット

githubの検索機能を色々と使うときに便利なスニペットをメモ代わり


昔書いた記事
https://engineer.blog.lancers.jp/devops/github_search_query_hack/

## 一覧

xxx以降にクローズしたbugラベル付きのissue
`is:issue label:bug is:closed closed:>=2022-09-06T00:09:00+09:00 `
pyplot

検索するのつかれたんで、自分で学んだものを整理しておきます。
【目次】
~matplotlibで軸が見切れるときの対処法~
◯Matplotlibでx軸のラベルが見切れるときの対処
◯Matplotlibでx軸見切れなくする
◯subplot間の間隔調整

◯Matplotlibでx軸のラベルが見切れるときの対処
引用：https://qiita.com/78910jqk/items/e8bce993081c384afdba

◯見切れなくする
グラフの描写範囲の設定を変えることでx軸のラベルを見切れないようにできる。
グラフの描写範囲の下端の設定は`matplotlib.pyolot.rcParams['figure.subplot.bottom']`に格納されている。デフォルトだと0.11になっていて、下から11%の領域までグラフが書かれるため、x軸のラベルが入りきらない。これを15%(0.15)くらいに変更すればいい。
~~~python:qiita.rb
plt.rcParams['font.size'] = 13
#この2行を書いておく
############################
plt.rcParams['figure.subplot.bottom'] = 0.15
plt.rcParams['figure.subplot.left'] = 0.15
############################
plt.rcParams['lines.linewidth'] = 3
~~~
◯subplot間の間隔調整
Figure内のsubplotの位置や相互の間隔を調整するには、subplot_adjust()メソッドを用いる。pyplot.subplot_adjust()でもよいが、figureのメソッドとしてもよい。
| 引数 | 説明 |初期値※| 
|:-:|:-:|:-:|
|left| 左端|0.125|
|right|右端|0.9|
|bottom|下端|0.1|
|top|上端|0.9|
|wspace|subplot間の幅の間隔|0.2|
|hspace|subplot間の高さの間隔|0.2|

※(キャンバスの左上を(0,0),右下を(1,1))としたときの比率)
rcParamsの意味はよくわからん。
今後調べておく。

◯サブプロットの作りかた
~~~python:qiita.rb
plot = plt.figure()
ax = plot.add_subplot(
    xlabel='Number of principal components',
    ylabel='Contribution ratio(blue),\nCumulative contribution ratio(red)',
    )
x_axis = range(1, contribution_ratios.shape[0] + 1)
ax.bar(x_axis, contribution_ratios.iloc[:, 0], align='center')  # 寄与率の棒グラフ
ax.plot(x_axis, cumulative_contribution_ratios.iloc[:, 0], 'r.-')  # 累積寄与率の線を入れたプロット図
plot.savefig('img_contribution_ratio_{0}.png'.format(y_name))
ax.show
~~~
plotの中にaxes(付箋)があり、axを呼び出すことで描画することができる。
このaxを呼び出すためには、plt.figure()を呼び出してaxの情報を引き出す必要がある。
92.プロパティとディスクリプター

# プロパティとディスクリプター
## プロパティとディスクリプターについて
プロパティにはオブジェクトが保持している変数を介した値というイメージが強いと思います.
humanオブジェクトのプロパティであれば
human.name = "tanaka" その人の名前は田中
dog.name = "pochi" その犬の名前はポチ

オブジェクト＝値というイメージを持っていましたが
オブジェクトの中には
ディスクリプターというものがあり
＊value　値そのもの
＊configurable　設定変更可能性 trueかfalse
＊enumerable　　列挙可能性 trueかfalse
＊writable　　　値の変更可能性 trueかfalse
上記を設定することができます

## 実装方法
#### 確認方法
1.オブジェクトを作成
2.Object.getOwnPropertyDescriptor(オブジェクト名,'キー名')
3.console.logで確認
```javascript
    const obj = {prop: 0};
    const descriptor = Object.getOwnPropertyDescriptor(obj,'prop')
    console.log(descriptor)
```
#### ディスクリプターメソッドによる値の変更
→注意！
＊configurable　false
＊enumerable　　false
＊writable　　　false
以上が全部faiseになる

```javascript
    const obj = {prop: 0};
    const definedescriptor = Object.defineProperty(obj,'prop',{value:10})
    console.log(definedescriptor)
```
#### ディスクリプター変更
```javascript
    const obj = {prop: 0};
    const descriptor = Object.getOwnPropertyDescriptor(obj,'prop')
    descriptor.writable = false
    console.log(descriptor)
```
![スクリーンショット 2022-09-06 12.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/a073dfad-a62d-137e-446b-f6156f35f82f.png)
writable = falseになりました。。
#### 試しに値を変更してみる、、
```javascript
    descriptor.prop = 100;
    descriptor.writable = false
    console.log(descriptor)　//０から100へ
```
変更されずにすみました
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その015

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

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

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
オブジェクトマネージャと Lightning アプリケーションビルダーの確認
　にある練習問題3問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/practice-user-setup

なお、こちらの内容はYouTubeでも公開しております

https://www.youtube.com/watch?v=g1Fw9F0t3CA

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

オブジェクトマネージャと Lightning アプリケーションビルダーの確認
練習問題3問目はこちらです

![オブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f8bc6d24-dadc-7b6c-9e7c-73de3dd3a626.png)


みなさんいかがでしょうか

オブジェクトの関連が問われる問題ですね

正解はAとBとDです


それでは解説に進みます

オブジェクトのリレーションを見ていきましょう

オブジェクトのリレーションを確認するにはスキーマビルダーがおすすめです


スキーマビルダーではオブジェクトのリレーションを容易に確認することが可能です
スキーマビルダーではリレーションのあるオブジェクトは線でつながって見えます。
![スキーマ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/adbff2f6-cee0-9713-4599-8e273d08cd51.png)

Dの商談とキャンペーンはリレーションがあるので線でつながってますね

Aのリード　Bの取引先責任者とキャンペーンは、キャンペーンメンバーを通じてつながっているので正解です

なお、Accountとは取引先のことです
日本語では「取引先」ですが英語ではAccountですね
取引先はキャンペーンとリレーションが無いので間違いです


スキーマビルダーでもキャンペーンと取引先の間には腺が無いことが分かりますね

なお、今回の解説は私のブログからも確認できます

興味がある方は概要欄のリンクから確認してください


今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
社会人としてやってはいけないミスをしてしまった。

## 注意点
この記事は個人開発(ポートフォリオ作り)の中であった大きなミスについて取り上げています。
タイトル詐欺みたいになってしまったら申し訳ありません。

## どのような問題を起こしてしまったのか？
先に結論から伝えてしまうと
**「プロジェクト(作成中のポートフォリオ)を１個つぶした」**

## 何があったのか？
現在、私はIt企業に転職をするためにポートフォリオ作りを行っています。
8月下旬ごろから2つ目のポートフォリオづくりを始めていました。


作成しようとしていたポートフォリオはかなり外部APIに依存したシステムとなっていました。
アプリケーション案の作成及び、調査の段階でAPIについて簡単に調べ、仕様に組み込んでいました。
※この時の簡単に調べるとは1～2のようなことです。
1. APIから得られる情報を記事やサイトから調べる
2. 実際にAPIを使用して、ポートフォリオ作りをされた方の記事を読む
<br>
<br>

そして下記のような流れでアプリケーションを作成していきました。
```:開発の流れ
アプリケーション案をまとめる。
           ↓
アプリケーションに必要な物の調査
           ↓
アプリケーションの機能一覧、画面遷移などの作成
           ↓
アプリケーションデザインの作成------------------>※今回の問題が発覚した場所
           ↓
アプリケーションの仕様作成
           ↓
アプリケーションの実装
```


デザインを作成している時にデータフローを作成していなかったことに気が付き、
データフローとデザインを同時並行で作成しながら開発を行っていました。
そこでデータフローを考えるうえでAPIから取得できる値を
詳しく知る必要が出てきたので、実際にAPIを実行して値を取得しようとしました。


**しかし、APIが動いておらず、ポートフォリオ作りが止まってしまいました。**



## どのように対応したのか？
ポートフォリオ作りは止まってしまったので、すぐに以下の対応を取りました。

+ 代わりとなるAPIを探す
　　→似たようなAPIがあることは調査していたので、再調査を行い、代替案になるものがないか探してみました。
+ アプリケーションの仕様を変更の可能性を探る
　　　アプリケーションの仕様を変更して、外部APIに頼らないような設計を考えてみました。

## その結果どうなったのか？
代わりになりそうなAPIは見つからず、仕様も一番大切な機能だったので、仕様変更することができませんでした。

結果として、**今回のポートフォリオ作成は中止となってしまいました。**


#### もしこれが会社だったら？
ポートフォリオが白紙になってしまった時、 **「これが会社でのプロジェクトだったら？」** と考えてみました。
その時、見も毛もよだつ思いがしました。
自社開発の場合
「自分の調査不足で会社のプロジェクトを1個つぶしてしまう」
受託開発の場合
「自分の調査不足で受託取引が1つなくなり、取引先の信頼を損ね、債務不履行を起こしてしまう」

**この二つが頭の中を大きくよぎり、この失敗2度と起こしてはいけないと思いました。**

## 今回のような問題を未然に防ぐためには？

+ 調査のゴールをしっかりと決めておくべきだった。
　調査をするうえで、どこまで調査したら、調査終了なのかを決めておけばよかった
```:例
APIを調査する上でのゴール
　 使用するAPIから必要になりそうな情報を収集することができるのかを確認すること
　 APIが正常に稼働しているのかを確認すること
　 実際にAPIを実行して、ステータスコード200と必要な情報が取得できるのかを確認すること
```

+ 調査の段階で代替案を考えておくべきだった。
　もし止まりそうなものサービスや外部APIを使用する際、別のサービスまたは外部APIから
　同じようなデータが取得できるかを調査の段階で明確にしておくべきだったと思っております。

## もし会社で同じような問題に直面してしまったときはどうすればいいのか？
+ 問題が発覚した時点で相談する。
+ 代替案がないか調査を行う。

基本的には上記の2点かなと思います。
アプリケーションの開発が動き始めているので、
プロジェクト全体を巻き込んだ仕様変更などは難しいと思われます。

まずは報告し、問題の共有を行う。
次に代替案がないかを調査していくのが基本的な流れかなと思いました。

しかしながら、一番は
**このようなミスが発生しない様に事前の対策はしっかりと行い、問題が発生しない様にすることが最優先と思います。**


## おまけ:外部APIに大きく依存していることでどのようなデメリット
外部APIに大きく依存した設計を行ってみて、感じたことも簡単にですが書いておきます。


+ 外部APIが停止してしまうとアプリケーションも実質停止してしまう。
　外部APIに大きく依存している場合、アプリケーションの機能停止などが起こってくる。
　APIが停止した際にはそのアプリケーションをどうするのかを考えておく必要が出てくる。
　
　
+ 外部APIの変更などによりアプリケーションの修正が必要になってくる。
　外部APIの変更により、データ構造の変化などにより機能が停止してしまうことがある。
　その時に、アプリケーション側のソースコードを修正して、apiの変更に対応しなければならない。


## 終わりに
正直なことをいうと自分が実際に直面した問題や実際に体験したことを解決したいと思い、今回のポートフォリオを作成していました。
ですのでポートフォリオをつぶしたときかなりは落ち込んでしまいました。

一方で本当に幸いだったのはこの問題がポートフォリオ作りで発生してくれたことは本当にラッキーだったなと思いました。
今回の失敗から調査要件のことや外部APIに依存することのデメリットなどがかなり鮮明に見えてきたのはかなりの収穫だったなと思っています。


この経験を糧に次のポートフォリオ作りも行っていきたいと思います。

案が白紙になってしまったので、前回のポートフォリオを作成したときに時間の関係でアウトプットできなかったものなどを
アウトプットしていきたいと思います。

誤字脱字などがありましたら、コメントしていただけると助かります。

最後まで読んでいただき、ありがとうございました。
Python,Ruby,PHP,Java,JavaScript,Perlの標準関数の比較


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

Python,Ruby,PHP,Java,JavaScript,Perlの標準関数の比較

# Python

https://qiita.com/hiroyuki_mrp/items/8bbd9ab6c16601e87a9c

# Ruby

https://qiita.com/sugamaan/items/d7871da28c0160b69609

# PHP

https://qiita.com/SRAUFactory/items/96ecd6d677c26a20b77a

# Java

https://qiita.com/p_shiki37/items/3902f4e3adc3aeb382f1

# JavaScript

https://qiita.com/uhyo/items/acd645744fa61c805097

# Perl

https://perlzemi.com/blog/20161004147558.html