OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel で CRUD をコマンド一つで出力するライブラリ

とにかく、マスター管理機能や、CRUDを書くのがめんどくさいと感じていたので、artisan コマンドを拡張して一発で必要なファイルを出力するライブラリを書きました。

使い方などは readme にも書いているのですが、github では英語で書いているので、日本語原文をここに公開しておきます。

# laravel-crud-command

前もって作成されたデータベースから情報を取得し、artisan コマンドで CRUD に必要なファイルを一括で出力します。

## 特徴

1. MySQLのテーブルコメント、およびカラムコメントから翻訳用のファイルを生成します。
    - resourcees/lang/{locale}/tables.php
    - resourcees/lang/{locale}/columns.php
2. MySQLのテーブル定義からバリデーションルール作成します。
    - rules/{model}.php
3. モデル作成
    - テーブルのカラムからプロパティを自動生成します。
    - 外部キー制約から **belongsTo と hasMany、belongsToMany メソッド** を出力します。
4. コントローラー作成
    - CRUDに必要なメソッドを全て出力します。
5. グローバルスコープ作成
    - 各モデルに対して一つのグローバルスコープクラスを作成します。
6. フォームリクエスト・クラス作成
    - テーブル定義から自動的にルールを出力します。
7. ビュー・コンポーザー作成
    - 外部キーの定義からフォーム部品をビューに渡すロジックを自動的に生成します。
8. ビュー作成
    - 一覧、詳細、新規作成、更新 を自動で生成します。
9. パンくずリスト作成
    - CRUDで生成したファイルには自動的にパンくずリストを出力します。
10. テンプレートのカスタマイズ
    - プロジェクトによっては、出力するテンプレートをカスタマイズする必要があると思います。その場合は、stub をお好みの形で編集しておくことが可能です。

## インストール

```bash
composer require shibuyakosuke/laravel-crud-command
```

## セットアップ

##### 1. 何よりも先に、マイグレーションファイルを作成することから始めます。例示のように、コメントと外部キーの設定を必ず行ってください。

- モデルを生成するテーブルには必ず、テーブルコメントをつけてください。
- 多対多の中間テーブルにはコメントをつけてはいけません。

テーブルコメント機能については、[diplodocker/comments-loader](https://github.com/diplodocker/comments-loader) を利用しています。

```php
use Illuminate\Database\Schema\Blueprint;

Schema::create('users', function (Blueprint $table) {
    $table->id()->comment('ID');
    $table->unsignedBigInteger('role_id')->nullable()->comment('ロールID');
    $table->unsignedBigInteger('company_id')->nullable()->comment('会社ID');
    $table->string('name')->comment('氏名');
    $table->string('email')->unique()->comment('メールアドレス');
    $table->timestamp('email_verified_at')->nullable()->comment('メール認証日時');
    $table->string('password')->comment('パスワード');
    $table->rememberToken()->comment('リメンバートークン');
    $table->timestamp('created_at')->nullable()->comment('作成日時');
    $table->timestamp('updated_at')->nullable()->comment('更新日時');
    $table->softDeletes()->comment('削除日時');

    $table->tableComment('ユーザー'); // Table comment helps you to make language files.

    // Foreign key helps you to make belongsTo methods, hasMany methods and views .
    $table->foreign('role_id')->references('id')->on('roles');
    $table->foreign('company_id')->references('id')->on('companies');
});
```

##### 2. マイグレーションを実行する

```bash
php artisan migrate
```

##### 3. config/app.php を編集して言語を設定する

```
'locale' => 'ja',
```

##### 4. リソースを出力します

```bash
php artisan crud:setup
```

##### 5. CRUDファイルを全て出力します

```bash
php artisan make:crud users
```

###### オプション

- `--force` <br>
ファイルが存在しても、上書きして出力します。
- `--api` <br>
通常のコントローラを出力せず、REST用のコントローラのみを出力します。
- `--with-api` <br>
通常のコントローラとREST用のコントローラを出力します。`--api`と同時に指定はできません。
- `--sortable` <br>
テーブルのソート機能を合わせて出力します。
- `--with-export` <br>
テーブルのエクスポート機能を合わせて出力します。
- `--with-filter` <br>
テーブルのフィルタ機能を合わせて出力します。
- `--with-trashed` <br>
テーブルのエクスポート機能を合わせて出力します。

## その他コマンド

出力するファイルをカスタマイズする場合、以下のコマンドを実行すると、/stubs ディレクトリに .stub を拡張子に物ファイルが複数出力されます。
出力したファイルをカスタマイズしてください。

```bash
php artisan stub:publish
```
コード削減―Pipeline化とFunctionTransformer―

#きっかけ
[メルカリコンペ1位のコード](https://www.kaggle.com/lopuhin/mercari-golf-0-3875-cv-in-75-loc-1900-s "Qiita")に出てきたmake_pipelineとFunctionTransformerが良く分からなかったから。


#まとめ
make_pipeline→[前処理+学習+推定]などのコードを1つの推定器に変換する。コード削減が可能。

FunctionTransformer→任意の関数をtransformer(変換器)に変換する。Pipelineの引数はtransformerである必要があるため。任意の関数の最低要件はfitとtransformが存在すること。


#使用例
###使用例①
下記例ではPCA()が行われた後に、SVCが実行されている。
前処理と分類を一連の動作で実行することができている。

[下記例の参考サイト](https://qiita.com/shota-imazeki/items/4a69e4ef2f12e0313495 "Qiita")

```ruby:qiita.rb
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn import datasets

# サンプルデータの用意
iris = datasets.load_iris()
X, y = iris.data, iris.target

# pipelineの作成
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
pipe = Pipeline(steps=estimators)

# 学習
pipe.fit(X, y)

# 予測
pipe.predict(X)
```
###利用例②　メルカリコンペコードの使用例

[メルカリコンペ1位のコード](https://www.kaggle.com/lopuhin/mercari-golf-0-3875-cv-in-75-loc-1900-s "Qiita")の一部抜粋


```ruby:qiita.rb
from sklearn.pipeline import make_pipeline, make_union, Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer as Tfidf

def on_field(f: str, *vec) -> Pipeline:
    return make_pipeline(FunctionTransformer(itemgetter(f), validate=False), *vec)

 vectorizer = make_union(
        on_field('name', Tfidf(max_features=100000, token_pattern='\w+')),
        on_field('text', Tfidf(max_features=100000, token_pattern='\w+', ngram_range=(1, 2))),
        on_field(['shipping', 'item_condition_id'],
                 FunctionTransformer(to_records, validate=False), DictVectorizer()),
        n_jobs=4)

```

make_pipelineでitemgetterとTfidfのインスタンスをパイプライン化している。
FunctionTransformerでitemgetterをtransformerに変換して自前の変換器を作成している。
これにより、itemgetter（文字列の抽出）の重要な文字列の特定を一連の流れでこの後行えるようになっている。
[itemgetterはこちら](https://qiita.com/asparagasu/items/07afc6898d8b7f44aca3 "Qiita")
[メモ]ColabでDataFrameの中身をインタラクティブに見たい時

ちょっと調べたらわかることだが、一応メモ

 DataFrameの中身をページ送りしながら確認したい場合は、Colabのセルの頭に下のマジックコマンドをいれる

```python
%unload_ext google.colab.data_table
```

もしくはライブラリを呼び出す（細かな設定をしたい場合）

```python
from google.colab import data_table

data_table.DataTable(data, include_index=False, num_rows_per_page=10)
```

おしまい

[参考としたColab notebook](https://colab.research.google.com/notebooks/data_table.ipynb#scrollTo=oEQUmjXkHZz-)
OBS(Open Broadcaster Software)を使ったWebinerの準備 #基本編

# はじめに
世間でWebinerが流行っているが、
ググってみると意外と簡単にできそうなのでやってみた。
***※あくまで個人的な備忘録になります***

【動作環境】
PC：Macbook Air（13-inch, 2013年モデル）
メモリ：4GB(DDR3)
CPU:1.3GHz Intel Core i5
OS：macOS Mojave（10.14.6）

【目標】
1. OBSをMacにインストールする
2. OBSの各種設定をやってみる
3. 仮想カメラを導入する
4. Zoomと繋いでWebiner映像を配信

## 1. OBSをMACにインストール

◆公式サイトからインストール
https://obsproject.com/

◆ポイント

- 正しいOSを選択する

Macの場合はpkgをインストールするのみで終了

##2. OBSの各種設定

◆概ね参考にしたWebサイト
https://ppc-master.jp/labo/2020/06/obs_zoom_online.html

非常に参考になります。
ほぼ、これにそって設定しました。

### [追加1]OBSでパワーポイントを表示する
実現したい画面は、

***最背面→背面画像→パワポ画面(Webinerの説明資料)→ロゴ→顔画面***

の順でシーンを設定したかったのですが、
パワポがうまくMacで表示できなかった。

◆参考サイト
https://note.com/haishin/n/n29b9536fadc1

### [追加2]OBSの画面にテキストを追加する

ソースにテキスト追加したけれど、色変えれないなーと思って調べた。

結論：普通にテキストの設定画面...スクロールができたわw

◆参考サイト
https://shifa-channel.com/obs-moji/

でも、テキストの背景の挿入方法は参考になりました。
　→色ソースから背景を入れる方法

### [追加3]カメラのクロマキー

今後のために、クロマキーの設定をしてみる

  ***映像キャプチャデバイス→右クリック→フィルタ→エフェクトフィルタ→クロマキー***

で映像のクロマキー設定ができる。

## 3. 仮想カメラの導入

もともとはMacに導入するにはビルドしなければならないらしい。
https://github.com/CatxFish/obs-virtual-cam


ですが、ありがたい人もいることで、MAC用のpkgを作成してくれていた

◆参考サイト
https://applech2.com/archives/20200520-obs-studio-for-mac-virtual-camera-plugin.html

ダウンロードサイトはこちら
https://github.com/johnboiles/obs-mac-virtualcam/releases

ここからpkgをダウンロードすれば、
OBSのツールの中に、「Smart Visual Camera」が追加される。

## 4. Zoomへの繋ぎ方

はじめの記事を参考にする
https://ppc-master.jp/labo/2020/06/obs_zoom_online.html

Zoomの設定→ビデオ→OBS Virtual Cameraを選択できるようになる。

## 終わりに

以上で設定終了しました。
無事にZoomで配信できることを確認。

◆次回
　https://www.r3it.com/blog/how-to-make-our-webinar

この記事の環境を作ってみよう。
JavaScriptの配列を学ぶ演習・課題

# 配列を学ぶ意味は？
配列は複数のデータを扱うための仕組み。
SpreadSheetからデータを取得するとき等に複数データを扱う必要がでてくる。

# 本記事のゴール
配列から任意の値を取り出せるようになること。

# 演習1 配列の作成

とりあえず配列で動くコードを実装

```.js
const helloArray = () => {
    const values = [1, 2, 3, 4, 5]; // 配列の作成
    console.log(values[0]); // 配列の中の値の一つを取得
}

helloArray();
```

![スクリーンショット 2020-09-05 17.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/d21577b5-a1a5-eef7-1df1-16961fe0d321.png)

## ポイント
配列の作成

```.js
const 配列の変数名 = [配列の要素1, 配列の要素2, 配列の要素3]; 
```

`[]`でくくって、`,`で区切る。


配列の要素の取得

```.js
配列[何番目かを示す数]
```

今回のコードでは

```.js
values[0]
```

0番目を指定している。
プログラミング初心者の方は0番目って何？と思うかもしれない。

多くのプログラミング言語では配列の要素を取得するときには0番目から数える。
つまりこういうこと

![スクリーンショット 2020-09-05 18.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/09ca6274-f38c-ebd7-1a99-edc1fc81b8a1.png)

# 演習2 for文
とりあえず動くコードを書く。
まずは配列は使わない。

```.js
const helloFor = () => {
    for (let i = 0; i < 3; i++) {
        console.log("HelloFor " + i);
    }
}

helloFor();
```

![スクリーンショット 2020-09-06 12.07.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/28f514e9-58cd-a701-c430-12b28ae8933e.png)

上記のような結果になる。


なぜこんな結果になるのか処理順序順に見ていく。
まずfor文の構文

```for.js
for (最初に実行される処理;　ループ続行条件; ループごとに実行される処理){
    繰り返す処理
}
```

日本語が多くて見づらい。多くの場合は形が決まってるので以下のような形で覚えると良い。

```for.js
for(let i = 0; i < ループ数; i++){
    繰り返す処理
}
```

ここで変数iはindexの頭文字。iっていう変数名でなくても問題ない。

これを踏まえて演習2のコードを見ていく。
演習2のfor文を分解すると以下のようになる

```.js
let i = 0; // 最初に実行する処理
// --- ポイント1
if (i < 3){ // ループ続行条件
    console.log("HelloFor" + i);
    i++; // iに1足す. ループごとに実行される処理
    // ポイント1に戻る
}
```

最初i=0から始まり、ループごとに1足されていく。
iが3になったらループ続行条件を満たさなくなる。

つまり、iが0, 1, 2のときに中の処理が実行される。
したがって3回処理が呼ばれる。

# 課題1
0 ~ 10までの数字を出力してみよう

# 課題2
0 ~ 10までの数字の和を出力してみよう。
ヒント: for文の前に`let sum = 0;`を定義する。

# 演習3 配列の中身を全て出力する。
演習2のforを配列と組み合わせることによって、配列の中身を全部出力することができる。

```.js
const logAll = () => {
    const values = ["一郎", "二郎", "三郎"];
    for (let i = 0; i < values.length; i++) {
        console.log(values[i]);
    }
}

logAll();
```

![スクリーンショット 2020-09-06 12.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/41b3b397-ccb2-af84-ddee-a281da36670a.png)

## ポイント
`配列.length`で配列の要素の数を返す。
この例題では3
10分で自分のGitHubプロフィールをカッコ良くする

# 自分の username/README.md を作る

何はともあれ、自分の README.md を作りましょう。

![スクリーンショット 2020-09-06 12.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38580/8a471461-c877-62d1-6a24-0181fdd2540d.png)

自分と同じ名前のリポジトリを作成しようとすると、かわいい注意書きが出ます。
「Public にして README を作成すると、 GitHub プロフィールを作れるよ〜」と書いてあります。

画像のように `Public` と `Add a README file` にチェックを入れて作成します。

# GitHub Profile Summary Cards を使う

続きは[こちら](https://zenn.dev/hassan/books/9893fd8dc190a8)に移動しました。
Ruby injectメソッドの使い方

# injectメソッドとは
ブロックを使用して繰り返し処理を行うメソッド
具体的には以下のように記述する  

```
配列.inject {|初期値, 要素| 処理内容 }
```
# 使用例
* injectメソッドの引数にsumの初期値を入れる

#### サンプルコード  

```
[1,2,3].inject (0){ |sum, array_num| 
   p "array_num=#{array_num}"
   p sum+=array_num
}
```

#### 実行結果
```
"array_num=1"
1
"array_num=2"
3
"array_num=3"
6
```
MarkDown 書き方 その２


#はじめに
前回の記事 [Markdown 書き方 その1](https://qiita.com/t_t238/items/4590203d4f71798420a6) に引き続き、今回も`MarkDown`についてまとめます。

#目次

1. リンクの挿入
3. マークダウンのエスケープ
4. テーブル
5. QiitaをMarkDownで確認

#1.リンクの挿入
■書き方
**`[リンクのタイトル](URL)`**のように記述する。

```
[Markdown 書き方 その1](https://qiita.com/t_t238/items/4590203d4f71798420a6)
```
■結果

>[Markdown 書き方 その1](https://qiita.com/t_t238/items/4590203d4f71798420a6)

#2. マークダウンのエスケープ
■書き方
**`\`をMarkdownの前につける**ことでMarkdownのエスケープが可能。

```
\#2. マークダウンのエスケープ
```


■結果

>\#2. マークダウンのエスケープ


#3テーブル
■書き方
**`列数 × 行数`**を記述することでテーブルが自動生成される。
今回は3×1で生成。

左寄せは`:--`
中央寄せは`:-:`
右寄せは`--:`で記述する。

```
| 左寄せ| 中央寄せ | 右寄せ |
|:--|:-:|--:|
|Qiita|Qiita|Qiita|
```


■結果

| 左寄せ| 中央寄せ | 右寄せ |
|:--|:-:|--:|
|Qiita|Qiita|Qiita|

#4.QiitaをMarkDownで確認
Qiitaで良い記事を書くためには、他の方の記事を参考にすることが大切です。
そのような場合には**URLの後ろに`.md`をつける**事でMarkDown形式で閲覧が可能。

![Screen Shot 2020-09-06 at 11.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512863/4d2dd84d-0950-27cf-f78f-bd2c5cb5a503.png)

![Screen Shot 2020-09-06 at 12.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512863/ec622f2f-0dd9-8ab6-4ca4-bf9b77925f18.png)

#終わりに
前回と今回の2回に分けて`MarkDown`についてまとめました。
今後の記事投稿を通してこれらの知識を定着させていきたいと思います。

#参照
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
scikit-learn の使い方 (その4)

[House Prices: Advanced Regression Techniques](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)  で 試してみました。

1) ライブラリーの読み込み
2) csv の　読み込み
3) model の作成　と　予測
4) csv の出力
の４ステップです。

1) ライブラリーの読み込み

```py:[1]
import numpy as np
import pandas as pd

from sklearn.ensemble import RandomForestRegressor
```

2) csv の　読み込み

```py:[2]
train_df=pd.read_csv('../input/house-prices-advanced-regression-techniques/train.csv')

test_df=pd.read_csv('../input/house-prices-advanced-regression-techniques/test.csv')
submission=pd.read_csv('../input/house-prices-advanced-regression-techniques/sample_submission.csv')

print(train_df.shape)
print(test_df.shape)
print(submission.shape)

```

3) model の作成　と　予測

```py:[3]
predictor_cols = ['LotArea', 'OverallQual', 'YearBuilt', 'TotRmsAbvGrd']

train_x = train_df[predictor_cols]
train_y = train_df.SalePrice


model = RandomForestRegressor()
model.fit(train_x, train_y)

test_x = test_df[predictor_cols]

pred = model.predict(test_x)

print(pred[:20])
```

4) csv の出力

```py:[4]
submission.SalePrice = pred
print(submission.head(20))
file_submit = "house_prices_submit.csv"
#
submission.to_csv(file_submit,index=False)
```
UE4ぷちコン「夏休み」振り返り

# 作ったもの
映像編含め今回で8回目のぷちコンです。
テーマが「夏休み」ということで、べたですが「虫取り合戦」をつくりました。
親子で遊べるようなものがいいなと思い、メインの遊びは「鬼ごっこ」と「あっち向いてほい」にしました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">提出しました！<a href="https://t.co/QLROrZLgCW">https://t.co/QLROrZLgCW</a><a href="https://twitter.com/hashtag/UE4%E3%81%B7%E3%81%A1%E3%82%B3%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#UE4ぷちコン</a> <a href="https://t.co/Jly5euAiSU">pic.twitter.com/Jly5euAiSU</a></p>&mdash; altalt (@altalt_jp) <a href="https://twitter.com/altalt_jp/status/1300502433550856200?ref_src=twsrc%5Etfw">August 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# モデル制作
1週間ちょっとでさくっと作れるように、モデルはカブトムシしか作らず、キャラクターは「Frank climax's Katana」を加工したものです。
最初はもっと作り込んだカブトムシにしていたのですが、それが集団で動くとかなり気持ち悪く、ローポリで足もないモデルにしました。
![BugsBattle_q1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/903ff502-6a22-1f38-ed40-4916202d8fcf.jpeg)

# シーケンサー
「あっち向いてほい」のところはシーケンサーで制御しています。

プレイヤーの位置でシーケンサーを再生したいので、下のような処理を書いています。
これはわかりやすくした簡易版で、実際は関数化してほかのアクションでも使えるようにしています。
![BugsBattle_q4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/6ca73ab2-9997-d15f-a1e2-65bbcf7d7954.jpeg)

また、右クリックメニューのAdd Markでマーカーを追加して、捕まえたときとダメだった時のシーケンスをひとつにまとめて分岐させています。
![BugsBattle_q2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/0544799d-6dcb-7164-4d6d-bd7453acfc20.jpeg)
![BugsBattle_q3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/776be361-278c-656f-3b33-3d4c322e5630.jpeg)

# UI
フォントは「源暎ゴシックH-KL」を使っています。
フリーフォントですが見た目がよく、SIL Open Font Licenseで商用でも使えるので、気に入って使っています。
https://okoneya.jp/font/genei-gothic-kl.html

「夏休み終了」の波は、みつまめ杏仁さんのツイートを参考にUVアニメーションで作っています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">テクスチャのUVアニメーションを使ったフォーカス演出例を作ってみた<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/ue4UMG?src=hash&amp;ref_src=twsrc%5Etfw">#ue4UMG</a> <a href="https://t.co/OFHLEel9Y0">pic.twitter.com/OFHLEel9Y0</a></p>&mdash; みつまめ杏仁 (@MMAn_nin) <a href="https://twitter.com/MMAn_nin/status/1290278048902680581?ref_src=twsrc%5Etfw">August 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

下のようなテクスチャをつくり、マテリアルでアニメーションさせています。
![T_Wave.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/16c9256d-c13d-87c7-3d88-bac26e1259d1.jpeg)
![BugsBattle_q5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/0c325483-3da0-d48f-9be9-5d9711d602e0.jpeg)
![2rliq-bcrmm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/12cbc42d-21de-3dfb-8672-4af0909a5fc8.gif)

# ボイス
音が物足りなかったので、「はじめ」「しゅうりょう」「くやしい」「やったー」などのボイスを2歳の娘にお願いしました。
ノリノリで何度も叫んでくれて楽しい収録でした。
kubernetesでpodに環境変数を渡す

## ファイル

```sample-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-env
  labels:
    app: sammple-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.16
      env:
        - name: MAX_CONNECTION
          value: "100"
```

## 動作確認

```
kubectl apply -f sample-env.yaml 
```

```
yuta:~ $ kubectl exec -it sample-env -- env | grep MAX_CONNECTION
MAX_CONNECTION=100
```
よくわかるPHPの教科書でリンク先のページが真っ白になる【500 (Internal Server Error)】の解決法

よくわかるPHPの教科書で学習中にリンク先のページが真っ白になるというエラーを解決する方法をサクッとまとめます。
（初学者のエラー解決方の一例です。低レベルですがご了承ください）


今回は「削除機能をつける」の段階でのエラーでしたが全般的に起こりうるエラーだと思います（？）

【エラー詳細】
![スクリーンショット 2020-09-06 10.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650911/84366b2c-910e-8855-33ea-eda1a7ffa98b.png)
削除する為のコードを書いて削除ボタンに設定したリンクにアクセスすると、真っ白になりました。
リンク先を見てみると

delete.php=?id=18

となっているので、削除したい投稿にはアクセスできているみたいです。

【解決手順】
なにが起こっているのかわからなかったので、デベロッパーツールにて確認します
![スクリーンショット 2020-09-06 10.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650911/045321e0-9ad7-412d-2a93-7ba9188d248a.png)

この「console」の部分を見てみると...

![スクリーンショット 2020-09-06 10.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650911/2c914cd3-5e36-8b62-c12f-4a63037d22d8.png)

なにやらエラーが出ています。

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

調べてみると...
webサーバー上のエラー？っていうのが多く出てきましたが...(よくわかrん)

【500 (Internal Server Error)】

というのはかなりザックリしたエラーのようで、原因が色々あって特定が難しいらしい...

さらに調べると、もっと詳細のエラーを画面に出す為のコードがあるみたいで、下記コードをdelete.phpの先頭に記述しました。

```
ini_set("display_errors", 1);
error_reporting(E_ALL);      
```
これを記載すると


```
<?php

ini_set("display_errors", 1);
error_reporting(E_ALL);      

session_start();
require('dbconnect.php');

if(isset($_SESSION['id'])){
    $id = $_REQUEST['id'];

    $messages = $db->prepare('SELECT * FROM posts WHERE id=?');
    $messages->execute(array($id));
    $message = $messeges->fetch();

    if($message['member_id'] == $_SESSION['id']){
        $del = $db->prepare('DELETE FROM posts WHERE id=?');
        $del->execute(array($id));
    }
}

header('Location: index.php');
exit();
?>
```


こんな感じ。

上書き保存してもう一度、削除リンクにアクセスしてみると...

![スクリーンショット 2020-09-06 11.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650911/c44a734f-7368-a9e9-0adf-143ce3db5073.png)

なにやら画面にエラーが表示されました。（ワクワク）

google翻訳さんに通訳してもらうと、
Fatal error 　・・・致命的だそうです。

そして

「delete.phpの14行目がダメだぞ！」
って言われてるみたいです。

そこでdelete.phpの14行目を確認してみると..

![スクリーンショット 2020-09-06 11.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650911/f35587ba-26f7-b4cd-0ac8-7a692396b89c.png)

messagesの一部が

a　　→　　e

になっておりました。（貴様が原因か...！）

以上
スペルを直すと、正常に動作しました。



エラーの8〜9割はスペルミスだな〜と勉強していて感じます。
正確に打つこともそうですが、今回のようにエラー箇所が分かるようになると探す手間も省けるので、使いこなせるようになりたいです。
あと、エラーは間違いを教えてくれる優しい奴なんだな〜と感じました。


おしまい
laravel Class ‘Form’ not found の対処法

調べてみると、composer.jsonでlaravelcollective/htmlを追記してcomposer updateするって書いてあるけど、やってみるとエラーでうまくインストールできなかったので以下をやってみたらすんなりFormファサードを読み込めた

・composer.jsonは編集せずそのまま
・ターミナルから composer require laravelcollective/html ←version指定しない
...これだけ。
すると、composerが自動でlaravelのバージョンに合わせたlaravelcollectiveをインストールしてくれる

``` rb
$ composer require laravelcollective/html #version指定しない
Using version ^6.1 for laravelcollective/html
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravelcollective/html (v6.1.2): Downloading (100%)
Package jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.
Package jakub-onderka/php-console-highlighter is abandoned, you should avoid using it. Use php-parallel-lint/php-console-highlighter instead.
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
```
Amplifyアプリのリダイレクト設定をaws-cliで行う

create-react-appとamplify-cliでアプリを作成していたところ、[ここ](https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html#redirects-for-single-page-web-apps-spa)をみてリダイレクトの設定をしようと思ったのですが、AWS Consoleからしかできなくて調べました。
amplify-cliの設定でうまくやる方法が無いようでした[^1]が、aws-cliではできました。

### 方法

まずリダイレクトのルールを書いたJSONファイルを作成します。

~~~json:custom-rules.json
[{"source": "</^[^.]+$|\\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>", "status": "200", "target": "index.html"}]
~~~

以下のようにappIdを指定してコマンドを実行します。

~~~bash
aws amplify update-app --app-id <appid> --custom-rules file://custom-rules.json
~~~

appIdは、以下のコマンドで確認できます。

~~~bash
aws amplify list-apps
~~~


----
[^1]: [amplify-cliのソースでAWS.Amplify.createAppしているところ](https://github.com/aws-amplify/amplify-cli/blob/master/packages/amplify-provider-awscloudformation/lib/amplify-service-manager.js#L109)で、CustomRulesのパラメタは渡していないので、今のところは無理っぽいと判断。
bundle execが必要な理由

#なぜbundle execが必要なのか
```
$bundle exec rails g controller user
```
のようにすると、Gemfile.lockに記載されているものがrequireされる。

簡単に言うと、bundle exec をつけないで開発を行い、アップデートを行うという場合、動かなくなることがある。だから、bundle execを付けて開発を行うのが安牌なのかなという理解で、とりあえずは良いのかなと思いました。

参照
https://qiita.com/dawn_628/items/1821d4eef22b9f45eea8
この記事とかとても詳しく書かれていました。
Rails Tutorial 第13章 パーシャルのパスはカレントでも省略するとエラーになる

##リスト13.43は演習で変更していたようで、テキストと違った

new.html.erbには修正すべきerror_messagesの行がありませんでした。


```ruby:views/users/new.html.erb
    <%= render 'form' %>
```

formに移してあったので、修正しました。

```ruby:views/users/_form.html.erb
 <%= form_for(@user, url: yield(:url_path) ) do |f|%>
    <%#= render 'shared/error_messages', object: @user %>
    <%= render 'shared/error_messages', object: f.object %>
    
    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>   
```

おそらく過去に演習で変更していたと思われます。ネットで同じ方がいたため。

##パーシャルのパスに、カレントを想定して省略するとエラーになった

パーシャルが見つからないとエラーになりました。
同じフォルダにあるので、フォルダ名を省略してファイル名を書いていました。

```bash
ActionView::Template::Error (Missing partial microposts/_userandmicropost, application/_userandmicropost with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
  * "/home/ubuntu/environment/sample_app/app/views"
):
    1: 
    2: <% if logged_in? %>
    3:     <%= render 'userandmicropost' %>

```
パーシャルのパスに、static_pages/xxxと省略せずに書いたところ直りました。
1回目の呼び出しではエラーにならず、Postボタンを押したときにエラーになります。
理由は分かりませんが、ネットの他の方もstatic_pages/xxxxと書いていました。

```ruby:views/static_pages/home.html.erb
<% if logged_in? %>
    <%= render 'static_pages/userandmicropost' %>
```

##演習13.3.3.2でエラー、再実行したら正常終了
1回目はfalseでエラーです。


```bash
>> Micropost.where("user_id =  ?", user.id) == user.microposts
  Micropost Load (1.6ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC  [["user_id", 1]]
  Micropost Load (0.2ms)  SELECT "microposts".* FROM "microposts" WHERE (user_id =  1) ORDER BY "microposts"."created_at" DESC
=> true
>> Micropost.where("user_id =  ?", user.id) == user.feed
=> false
```

consoleをいったん終了してやり直してみると、2回目はtrueで正常終了に変わりました。原因不明です。


```bash
>> Micropost.where("user_id = ?", user.id) == user.feed
=> true
```
AWS認定ソリューションアーキテクトプロフェッショナルに合格するまで〜アソシエイト編〜

## はじめに
AWS認定試験の勉強を始めて1ヶ月でソリューションアーキテクトアソシエイト(以下SAA)を取得し、その後4ヶ月でソリューションアーキテクトプロフェッショナル(以下SAP)を取得したので、勉強方法や利用した教材、勉強方法などについて書こうと思います。これから受験を考えている方の役に立てば幸いです。

### 勉強を始めた時点での知識・スキル・経験など
- 入社2年目終わりの2月。ITエンジニア(Android)歴4ヶ月
- AWSの業務経験はほぼ0。プロジェクトではAWSを利用してインフラ構築しているため、不具合の切り分けなどでたまにcloudwatchでログを見る程度
- ネットワークの知識は基礎レベル(CCNAは持っていない)
- サーバー関連知識はLPIC LEVEL1程度

## AWS認定とは
最も基礎的なレベルのクラウドプラクティショナー、アーキテクト、運用、開発者に分類されたアソシエイトレベル、そしてアーキテクト、DevOpsのプロフェッショナルレベルのAWSについて幅広い知識が問われる6試験と、専門知識の6試験が用意されています。
>![スクリーンショット 2020-09-06 9.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/20579042-c312-05cb-0b77-c9ba8f1e99b2.png)[AWS 認定](https://aws.amazon.com/jp/certification/)より抜粋



## SAAについて
[AWS 認定 ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
に詳しい情報が記載されています。
>- 実施形式  
  テストセンターまたはオンラインプロクター試験
- 時間  
  130分間
- 受験料金  
  15,000 円（税別）/ 模擬試験 2,000円（税別）
- 言語  
  英語、日本語、韓国語、中国語 (簡体字)

あるあるかもしれないですが、日本語は怪しいところが結構あります。試験問題は英語で作成されて、日本語問題はそれをエキサイトな感じで翻訳しているだけなんでしょうか、わかりません。日本語受験を選んでも英語と切り替えながら試験を受けることができるので、相当英語に自信があるとかでなければ日本語での受験をお勧めします。

## 利用した教材など
勉強を始めるにあたって、「AWS SAA 勉強法」とかでググって合格してる人の勉強方法を参考にしました。結果的に、いくつかブログやqiitaなどの合格体験記で名前が挙がっていた以下の2つの講座をUdemyで購入して勉強しました。

- [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
- [AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-knan/)

`これだけでOK`の方は主要なサービスの解説とハンズオンが中心ですが、最後に模擬試験3回分(内1つは一問一答の小テスト形式ですが)もついていて、AWS入門用としても試験対策としてもちょうどよかったと思います。

また、`これだけでOK`のみだと演習が足りないと感じたため、同じ講師の方が出している演習問題中心の`アソシエイト模擬試験問題集`も利用しました。業務で既にAWSを利用していて、ある程度主要サービスの知識や構築経験がある人はこちらの講座の方がおすすめです。Udemyは頻繁にセールをやってるので必ずセール時に買うようにしましょう。


## 勉強の流れ

全体の流れは以下の通りです。

- `これだけでOK`を3週間(座学&ハンズオンパート2週間、付録の模擬試験1週間)
- `アソシエイト模擬試験問題集`を1週間

計4週間やってから本番に臨みました。公式の模擬試験はお金がかかるので受けませんでした。本番に合わせて購入した講座はきっちりやり切りました。期限を決めた方が短期集中できて効率が良いかと思います。

`これだけでOK`のハンズオンではよくあるアーキテクチャパターンをコンソール上でぽちぽちやって構築していくのですが、「こんなに簡単にできるんだ」って驚きがあって楽しかったです。AWSってどういうものなのかを理解するのに役立ちました。
ハンズオンで一通りサービスに関する知識と手を動かす経験を身に付けたら、付録の模擬試験をやってみました。1回目は確か60%くらいしか取れなかったと思います。資格取得のためには演習を繰り返すことが大事だと痛感したので、`これだけでOK`の模擬試験と`アソシエイト模擬試験問題集`で演習を繰り返しました。全て9割くらいは取れるまで繰り返してたと思います。
演習問題は時間を計って解く、間違えた部分を公式のドキュメントを読む、などして試験で問われる部分を強化しました。[よくある質問](https://aws.amazon.com/jp/faqs/)はかなり参考になりましたね。

試験本番では結構落ち着いて問題を解くことができ、微妙な問題は最後に見直しをして無事合格できました。と言ってもやはり模擬試験やってる時よりは本番の方が時間はかかりましたし、見直しマークのつく問題も多かった気がします。


## おわりに

- 資格取得のためには演習を効率よく繰り返すべし
- 知識の補強は[よくある質問](https://aws.amazon.com/jp/faqs/)が役に立つ
- SAAはほぼ0から始めても1か月で取得できる
PHPでのオブジェクト型データへのアクセス

型の種類で`object`というものがあります。配列のような使い方をするようですが、その要素へのアクセスの仕方です。

```example.php
$a = $object->property;
```
変数`$a`に`$object`の`property`プロパティの値を格納するという意味になります。
IBM Cloud IaaS SSL VPN が接続できない時に試してみてほしい事

## この記事の目的

* IBMCloudのVSIサーバなどのデバイスへ、個人端末からアクセスをするためにはSSLVPNによるセキュア接続をした上で、ログインする必要があります。 [こちらの記事(IBM Cloud (IaaS)にSSL VPN接続する場合)](https://qiita.com/osonoi/items/456d102edf9151c792c5) が非常にわかりやすくまとめていただいているので、ご参照いただくと手順を確認いただけます。

* 私はアカウントに複数メンバーを作成する管理者としてアカウント管理を行なっているのですが、たまに新規アクセス権限を付与したメンバーから<font color="DeepPink">ツールをインストールしたにも関わらず、アクセスできない</font>という相談を受けることがチョコチョコとあります。

* その際に試してみて有効だった確認方法を共有します。SSLVPNツール(Array)をインストールしたにも関わらず、IBMCloudのIaaSサーバやVRAなどにアクセスできないという方がいらっしゃれば、試していただけると幸いです。

### 確認手順１

* こちらが一番多いケースですが、「SSL VPNアクセスを有効にする」にチェックが入っていないためにアクセスできないケースです。チェックを入れてみて、再度アクセスを試してみてください。

[IBMCloudポータル] -> [管理(右上)] -> [アクセス(IAM)] -> [ユーザー] -> [自分のアカウント名をクリック]
-> [クラシック・インフラストラクチャー] -> [VPNサブネット] からアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/4503a1b0-f05a-d446-8804-7bcda23890d0.png)

### 確認手順2

* 確認手順1でチェックが入っているにも関わらずアクセスできない場合、「SSL VPNアクセスを有効にする」のチェックのOFF/ONを試してみてください。一度OFFにして保存、再度ONにしてから保存してみた後に、SSLVPNツール(Array)を再起動の上で再度アクセスを試してみてください。

### 確認手順3

* 確認手順2を試してもアクセスできない、という場合は自動割り当てOFFにし、手動でアクセスしたいサブネット（IPアドレスレンジ）を選択してみてください。
* 本来、自動割り当てONでアクセスできることがほとんどなのですが、手動にすることで回避されることが数回ありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/89ba3c27-128c-dff2-3eec-6159cbb2c188.png)


### それでもつながらない場合

* VPNエンドポイントを接続先を切り替えてみてください。
(TOK02などは、日中帯はアクセスが集中して繋がらないことがたまにあります）
[使用可能な VPN エンドポイント](https://cloud.ibm.com/docs/iaas-vpn?topic=iaas-vpn-available-vpn-endpoints)


* パスワードリセットを試していないようであれば、入力間違いの可能性も考え、必要に応じて試してみてください。

[IBMCloudポータル] -> [管理(右上)] -> [アクセス(IAM)] -> [ユーザー] -> [自分のアカウント名をクリック] -> [ユーザーの詳細] -> [VPNパスワード]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/131575d4-65dd-05e8-7a3f-b2e99ab9bf4f.png)

* 複数のアカウントをお持ちの方は、念のため正しいVPNアカウントユーザ名でログインをしているかご確認ください。
（通常、"アカウント番号_メールアドレス"という形式でVPNユーザ名は払い出しされるので、アカウント番号がログインしたいアカウントかどうか、を見てください）
過去の電力使用量取得 沖縄電力編

# はじめに

電力使用量予測のセミナーをしていて、各電力会社の公表されている過去の使用電力量の形式がまちまちなので取得するのが難しいというご意見を聞いていました。
そこで、それぞれの電力会社別にデータの取得方法をまとめてみます。

ちなみに、対象とする電力会社は、北海道電力、東北電力、東京電力、北陸電力、中部電力、関西電力、中国電力、四国電力、九州電力、沖縄電力で、今回は沖縄電力さんを扱ってみます。

注：大量のダウンロードを繰り返すとサーバに負担がかかるので、ダウンロードは一回だけにするか、対象期間を限定して行うよう心がけて下さい。

# 動作環境

GoogleさんのCoraboratoryという環境で動作させます。

[Colaboratory](https://colab.research.google.com/)

# Webサイト

以下のWebサイトからデータをダウンロードできそうです。

[沖縄電力 でんき予報](https://www.okiden.co.jp/denki2/)

# ダウンロード

```py:
for y in range(2016, 2020):
  for m in range(1,13):
    
    # 2016年4月以前のデータはないので省略
    if y == 2016 and m < 4:
      continue
      
    for d in range(1, 32):
      url = "https://www.okiden.co.jp/denki2/juyo_10_{:04}{:02}{:02}.csv".format(y, m, d)
      !wget $url
```

# 読込と可視化


```py:
from glob import glob
import pandas as pd

# ダウンロードしたファイルの一覧を取得
files = glob("*.csv")
files.sort()

df_juyo = pd.DataFrame()

for f in files:
  print("\r", f, end="")
  try:
    df = pd.read_csv(f, encoding="Shift_JIS", skiprows=7, nrows=24)
  except:
    df = pd.read_csv(f, encoding="Shift_JIS", skiprows=13, nrows=24)
  df_juyo = pd.concat([df_juyo, df])

# 日時をインデックスに設定
df_juyo.index = pd.to_datetime(df_juyo["DATE"] + " " + df_juyo["TIME"])
df_juyo = df_juyo.sort_index()

# グラフ描画
df_juyo["当日実績(万kW)"].plot(figsize=(15,5))
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/bdaf4c20-19e9-40cd-fb17-be66db2379d3.png)

できた！

# 補足

可視化してみると、2018年後半になにか普段と違う傾向が見られます。
データのエラーかなとも思ったので、少し確認してみると以下のようなグラフになっていました。
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/5f059a84-4db9-b696-7011-2c3d92fee702.png)

2018年9月の災害を調べると、以下のような記事が見つかりました。
[平成30年台風24号（2018年）](https://typhoon.yahoo.co.jp/weather/calendar/392/)

甚大な被害があったようです。

電気使用量を見ると、色々な気付きがありますね。
以上、現場からきむらがお伝えしました。
SAML 概要

SAMLの概要。学習兼備忘録目的の記事。各種フローについては、別途まとめる。

## SAMLとは

* Security Assertion Markup Languageの略称
* 異なるセキュリティドメイン(アプリケーションがアクセスできる領域)間で認証情報を連携するための標準仕様
* XMLベースのデータを用いて認証情報をやりとりする


### SAMLでできること

* シングルサインオン(SSO)
* ID連携・統合



## SAML構成要素

### アクター

* Service Provider(SP):認証情報を利用する主体
* Identity Provider(idP):認証情報を提供・管理する主体

### SAMLデータ構成

![SAMLconcept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/c72ae8e5-8aae-8785-c6bf-6b24d1c7442e.png)

## SAML概シーケンス
![SAMLシーケンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/fbbddc85-25b2-07bc-c8d5-cbbc5942fb35.png)

## 参考情報

* [(ちょっと噛み砕いた)SAML入門](https://qiita.com/taxin/items/bc66fc8d26f804202d7d)
* [SAML認証ができるまで](https://blog.cybozu.io/entry/4224)
* [Security Assertion Markup Language (SAML) V2.0 Technical Overview](https://www.oasis-open.org/committees/download.php/27819/sstc-saml-tech-overview-2.0-cd-02.pdf)
react-beautiful-dndがわかりにくすぎたので最小サンプル

React でドラッグアンドドロップ(DnD)を実現するライブラリがいくつかあります。
今回は react-beautiful-dnd を使います。

https://github.com/atlassian/react-beautiful-dnd

ですがドキュメントに、動作する最小サンプルが用意されてません。

代わりに用意しました。
Typescriptのものですが。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/669552b1-2d28-50ec-b8dc-f5c19e46a9d7.gif)


```Screen.tsx
import React, { FC, useState } from 'react'
import {
  DraggableProvided,
  DroppableProvided,
  DropResult,
  Draggable,
  Droppable,
  DragDropContext,
} from 'react-beautiful-dnd'

const droppableId = 'id-1'
const list = ['Hello', 'World', 'nishisuke'] // List for dnd. Each item must be identified.

const sort = <T,>(list: T[], before: number, after: number): T[] => {
  const copy = [...list]
  const [moving] = copy.splice(before, 1)
  copy.splice(after, 0, moving)

  return copy
}

export const Screen: FC = () => {
  const [uniqTexts, setUniqTexts] = useState(list)

  const dndHandler = (result: DropResult) => {
    if (
      !result.destination ||
      result.destination.index === result.source.index
    ) {
      return
    }

    const sorted = sort(
      uniqTexts,
      result.source.index,
      result.destination.index
    )
    setUniqTexts(sorted)
  }
  return (
    <DragDropContext onDragEnd={dndHandler}>
      <Droppable droppableId={droppableId}>
        {(provided: DroppableProvided) => (
          <div ref={provided.innerRef} {...provided.droppableProps}>
            {uniqTexts.map((t, i) => (
              <Draggable key={t} draggableId={t} index={i}>
                {(provided: DraggableProvided) => (
                  <div
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    {t}
                  </div>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </div>
        )}
      </Droppable>
    </DragDropContext>
  )
}
```

## 注意点
並び替えるアイテムは `id` を持つ必要があります。
今回はユニークな string を並び替えたので、それ自身が id です。

placeholder はアイテム達の後ろに置く必要があります。
APIを使った購入機能（JS）




#重大な報告
本日をもちまして、最終課題が終了しました　パチパチ:stars:
１５日もかかってしまいましたが、最終課題のおかげでrailsの知識が身についたように思います


ちょっとみんなも難しいなと思っていたであろうAPIを用いた購入機能ついて
載せておこうと思います

まずは、
#APIをgemfile導入

```gemfileに記入して導入
  
  gem 'pay.jp
```

 記入後、bundle installを忘れずに。


#payjp.jsを読み込むための記述
 これでpay.jsを呼び出すことができます

```application.html.erb
<script type="text/javascript" src="https://js.pay.jp/v1/"></script>
    <%= stylesheet_link_tag 'application', media: 'all' %>
    <%= javascript_pack_tag 'application' %>
```

#JavaScriptを呼び出す記述
実装内容によるみたいですが、今回はturbolinksをコメントアウトします
これをコメントアウトしないと、購入がうまくいきません


```app/javascript/packs/application.js

require("@rails/ujs").start()
// require("turbolinks").start()  //コメントアウトする
require("@rails/activestorage").start()
require("channels")
require("../card")    //追加
```


#トークンの生成処理をするためのJavascriptを記入

```app/javascript/card.js
const pay = () => {
  Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY); // （1）PAY.JPテスト公開鍵
  const form = document.getElementById("charge-form"); 
 
  form.addEventListener("submit", (e) => {
    e.preventDefault();
 
    const formResult = document.getElementById("charge-form");
    const formData = new FormData(formResult);
 
    const card = {
      number: formData.get("number"),      //(2)この引数はnameの値です
      cvc: formData.get("cvc"),
      exp_month: formData.get("exp_month"),
      exp_year: `20${formData.get("exp_year")}`,
    };
    console.log(card)
    Payjp.createToken(card, (status, response) => {
      if (status == 200) {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} type="hidden" name='token'>`;
        renderDom.insertAdjacentHTML("beforeend", tokenObj);
      }
      document.getElementById("card-number").removeAttribute("name"); //（3）
      document.getElementById("card-cvc").removeAttribute("name");
      document.getElementById("card-exp-month").removeAttribute("name");
      document.getElementById("card-exp-year").removeAttribute("name");
 
      document.getElementById("charge-form").submit();
      document.getElementById("charge-form").reset();
    });
  });
 };
 
 window.addEventListener("load", pay);

```

わかりにく買ったところを（）でまとめました

（１）　こちらは環境変数で設定してください。
　　　　　詳しくはお調べください

（２）nameの値は記述されてないのであれば検証ツールで
　　　自動生成されている値をみて確認できます
　　　場合によっては自ら命名する場合もあります。

（３）こちらのIDも検証ツールで確認できました　
　　　　removeではnameの値を入力された各カード情報が
　　　　パラメーターとして送られないように、値を削除しています。



#コントローラーでストロングパラメータを設定
上の方は省略しております。createアクションで定義したメゾッド内で私の場合であればdelivery_paramsを引数にしてます。
そしてプライベート内でストロングパラメータを設定。




```app/controllers/orders_controller.rb

#省略

 private
   def delivery_params
     params.permit(:token,:prefecture_id,:postal_code,:city,:address1,:telephone).merge(user_id: current_user.id,item_id:params[:item_id])
   end


  def pay_item
    Payjp.api_key = ENV["PAYJP_SECRET_KEY"]　"秘密鍵
    Payjp::Charge.create(
      amount: @item.price,  　　＃価格
      card: delivery_params[:token],　　＃ストロングパラメーター内のtokenを指定
      currency:'jpy'
    )
  end
 end

```


まだ伝えなければいけないことはあるのですが、とりあえず大事な点だけまとめました
あとは自身のアプリと相談してお考えください。

ちなみに　これを使ってくださいね

カード番号	4242424242424242（16桁）
CVC	123
有効期限	登録時より未来
PaizaからBacklog登録（Python3）

# tl;dr
Paizaを使ってとりあえずプログラムでBacklogの課題を登録したい人向けだよ

# 環境とか
言語はPython3系

### 環境構築は抜きにしてとりあえずBacklogに課題を登録しよう
[Paiza](https://paiza.io/ja)はオンラインエディタで、環境を構築しなくてもプログラミングができるサービスです。

下記プログラムの、「#####」のところを書き換えれば、Backlogの課題が登録できます。

1. 「api_key」は、Backlogのメニューから「個人設定」→「API」→「新しいAPIキーを発行」で発行できます
2. 「space_key」は、利用しているBacklogのURL「https://#####.backlog.jp/」の「#####」の部分のことです。ドメインが「backlog.com」のときもあるので、その部分は適宜書き換えてください。
3. 「project_id」は、プロジェクトのID（数字）です。当該プロジェクトの「課題」→画面右の「…」→「CSV」でダウンロードしたCSVの「プロジェクト」列（B列）を見ると早いです。
4. 「issue_type_id」は、上の手順でダウンロードしたCSVの「種別ID」列（F列）を見ると早いです。
5. 「api_key」は重要な情報なので、他の人には見せないでね 😼

```Python3
# coding: utf-8

import requests

# 「backlog.jp」の場合もあるから確認してね
BASE_URL = 'https://{space_key}.backlog.com/api/v2/{api}'

def add_issue(_project_key, _issue_type_id, _priority_id, _summary, _description):
    api = 'issues'
    url = BASE_URL.format(space_key=space_key, api=api)
    payload={
        'projectId': _project_key,
        'issueTypeId': _issue_type_id,
        'priorityId': _priority_id,
        'summary': _summary,
        'description': _description
    }

    params = {
        'apiKey': api_key,
    }

    r = requests.post(url, params=params, data=payload)
    r.raise_for_status()
    return r

api_key       = '#####'
space_key     = '#####' # スペースの名前
project_id    = '#####' # 課題を登録するプロジェクトのID
issue_type_id = '#####' # 課題の種別ID

priority_id   = '3'          # 優先度のID(3は中)

# 課題内容（自由）
summary       = 'test'
description = '''
test
テスト
|てすと|テスト|h
|1|2|
|3|4|
'''

r = add_issue(project_id, issue_type_id, priority_id, summary, description)
```


# 参考
[Backlog APIを使ってBacklogに課題を登録する](https://dev.classmethod.jp/articles/add_issue_using_backlog_api/)
【わが家IoT】庭先の気温、湿度、気圧をグラフ表示(ESP-WROOM-02,BME280,Ambient)　おまけに太陽光パネルの発電電圧も測定

庭先の気温、湿度、気圧を計測しWiFi経由でAmbientのサービスを利用しグラフ化表示。
センサはBME280、マイコンはESP-WROOM-02を使用しArduino IDEにて書き込み。
ESP-WROOM-02はWiFi搭載です。
AmbientはIoTデータを可視化するサービスを提供しています。
基本的な使用方法であれば無料の登録で使用可能です。
https://ambidata.io

サイトにアクセスしてグラフを確認するのでPC、スマホを問いません。
下の例はスマホの画面です。（気圧、電圧も表示されているが割愛）
![Screenshot_20200905-215215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310332/2050e438-a86a-0a3f-f1ca-4ba59ab4f51f.png)


プログラムは以下のものを利用し電圧測定の部分については追加しました。
Ambientの使い方も記載されています。
http://pages.switch-science.com/letsiot/temphumidpress/

ESP-WROOM-02とBME280の配線および電圧測定のための
アナログポート接続は以下のよう。
（結線図を描く手間を惜しんで写真…）
枠外に伸びる赤黒の線が電圧測定のためのものです。
マイコンの電源は5VなのでUSB充電器を利用。

![DSC_2288_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310332/42df2038-de09-65f4-5555-b6929ae8fb5a.jpeg)

アナログポートでの電圧測定には抵抗分圧回路が必要です。
といっても抵抗をふたつ追加するだけです。
今回は以下のもので試してみました。
R1:0.33k
R2:10.21k
抵抗分圧についてはあちこちサイトを調べると記載があります。
アナログポートは0-1Vまでのようです。ご注意！


太陽光のパネルは庭にポンと置いただけ。
台風のときなど、いつでも撤去できます。
ソーラーパネル（中古）から車のバッテリー（12V、中古）にコントローラを介して接続。
12Vは便利で玄関まわりでLEDつけたり、シガーソケットを利用してマイコンの電源にもなります。

![aDSC_2287.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310332/67aa8019-dcfb-3f7d-61ae-0c43ea5bf520.jpeg)


環境等について
・Windows8.1（もちろん10でも大丈夫でしょう）
・Arduino IDE 1.8.10（ESPへの書き込みには設定必要ですが検索プリーズ）
・Ambientアカウント
・Ambientライブラリ（前述リンク参照。BME280接続ライブラリ含）
・マイコン（ESP-WROOM-02）
・センサ（BME280）
・抵抗2個（330Ω、10kΩ）
・ブレッドボード、配線等

ソースは以下参照下さい。

```cpp:main_program.ino
/*
 * BME280で5分毎に温度、湿度、気圧を測定し、Ambientに送信する
 * TOUTアナログポートを利用して電圧測定も追加
 */
 
#include <ESP8266WiFi.h>
#include <SPI.h>
#include "BME280_SPI.h"
#include "Ambient.h"

#define BME_CS 15

#define PERIOD 300 // 300秒毎
//#define PERIOD 15 // 15秒毎（テスト用）

BME280 bme280;
WiFiClient client;
Ambient ambient;

double value; // 電圧測定用

const char* ssid = "your_id";
const char* password = "your_pass";

unsigned int channelId = *****; // AmbientのチャネルID
const char* writeKey = "your_key"; // ライトキー

void setup()
{
    Serial.begin(115200);
    delay(10);

    Serial.println("Start");

    WiFi.begin(ssid, password);  //  Wi-Fi APに接続
    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
        delay(100);
    }

    Serial.print("WiFi connected\r\nIP address: ");
    Serial.println(WiFi.localIP());

    bme280.begin(BME_CS);

    ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}

void loop()
{
    double temp, humid, pressure;
    double value2; // 電圧計算用
    
    value2 = analogRead(A0); // 電圧測定用
    value = (value2/1023)*30; // 電圧計算
    
    temp = bme280.readTemperature();
    humid = bme280.readHumidity();
    pressure = bme280.readPressure();

    Serial.print("temp: ");
    Serial.print(temp);
    Serial.print(", humid: ");
    Serial.print(humid);
    Serial.print(", pressure: ");
    Serial.println(pressure);
    Serial.print(", value: "); // 電圧測定用
    Serial.println(value); // 電圧測定用

    ambient.set(1, temp); // 温度をデータ1にセット
    ambient.set(2, humid); // 湿度をデータ2にセット
    ambient.set(3, pressure); // 気圧をデータ3にセット
    ambient.set(4, value); // 電圧をデータ4にセット

    ambient.send(); // データをAmbientに送信

    delay(PERIOD * 1000);
}
```


以上
背景に動画を流す方法

#背景に動画を置く方法

画面の背景に動画をリピートで再生させ続けたい場合

```ruby:viewController.swift

import UIKit
import AVFoundation

class PopupDetailViewController: UIViewController {

    var player = AVPlayer()
    let path = Bundle.main.path(forResource: "Sample", ofType: "mov")

    override func viewDidLoad() {
        super.viewDidLoad()
        player = AVPlayer(url: URL(fileURLWithPath: path!))
        player.play()
        
        let playerLayer = AVPlayerLayer(player: player)
//        フレームの大きさを決める
        playerLayer.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)
        playerLayer.videoGravity = .resizeAspectFill
       
        playerLayer.repeatCount = 0
        playerLayer.zPosition = -1
        view.layer.insertSublayer(playerLayer, at: 0)
        
//        リピートさせる
        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { (notification) in
            self.player.seek(to: .zero)
            self.player.play()
        }
    }

```

##動画の保存場所

![スクリーンショット 2020-09-06 9.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/4370e5ea-579d-d76a-4565-7012cf91e92f.png)

ここにファイルを移せば再生される
Windows10スクリーンショットの撮り方

# はじめに
スクリーンショットの撮り方が沢山あるので、使うたびに撮り方を調べ直していて効率が悪かった。個人的に便利な順番を決めておいて、以降はそれに従いたかった。たまに使う場合は、1の撮り方で良いと思う。

# Windows10スクリーンショットの撮り方
1. [Windows]+[Alt]+S → 画面上部から、四角形・フリーフォーム・ウィンドウ・全画面表示の領域の切り取りを選択
 - ![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/f496597a-d1d7-f344-d850-2ca225bd1bea.png)
 - 「切り取り＆スケッチ」が起動
2. Snipping Toolを起動
 - 以下のウィンドウが表示される
 - ![コメント 2020-09-06 092400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/1a6e12d5-1ee6-80e2-e83a-10635a8ec436.png)
3. [Windows]+[Prt Sc]
 - 全画面のスクリーンショットを撮影
 - 画面が一瞬暗くなりC:\Users\[UserName]\Pictures\ScreenshotsにPNG形式の画像が保存される
4. [Alt]+[Prt Sc]
 - 選択中のウィンドウがクリップボードに保存される（らしいがうまくいかない）
5. [Prt Sc]
 - 全画面のスクリーンショットがクリップボードに保存される
6. [Windows]+[Prt Sc]
 - 全画面のスクリーンショットがC:\Users\[UserName]\Pictures\ScreenshotsにPNG形式の画像が保存される
ドメインなしでHyper-V Serverを使う

#はじめに
Hyper-V Serverをドメインがない環境で使おうとした時にHyper-Vマネージャから接続できなくてハマったのでメモ。

#Hyper-V Server側設定
まず、起動時に表示されるメニューでリモート管理有効（多分最初から有効になっているはず）にし、管理用のアカウントを作成しておく。
次にwinrmを有効化。以下のコマンドを管理者権限で開いたcmdから実行。

>winrm quickconfig -force

さらにCredSSP認証を有効化、先ほどのcmdでpowershellと入力してPowerShellに入っておく。（補完が効くので楽）
PowerShellで以下のコマンドを実行。

>Enable-WSManCredSSP -Role Server -Force

これでサーバ側は準備完了。

#Hyper-V マネージャ側設定
サーバ側と同じく winrm を有効化。
>winrm quickconfig -force

管理者権限のPowerShellでCredSSP認証有効化。
>Enable-WSManCredSSP -Role Client -DelegateComputer <サーバ名または *>

サーバ名はIPアドレスではなく名前でないといけないので注意、名前解決できない場合はhostファイルに書けば良い。
次にgpedit.mscを起動、以下のグループポリシーを変更する。
>「コンピューターの構成」→「システム」→「資格情報の委任」→「新しい資格情報の委任を許可する」「NTLMのみのサーバー認証で新しい資格情報の委任を許可する」

この２つを有効にし、サーバーを一覧に追加の「表示」ボタンで WSMAN/* を追加。Hyper-V マネージャを動かしているPCを再起動すれば接続できるようになる。
Vim環境でSvelte.jsのシンタックスハイライトをつける

# はじめに
普段開発時に私が使用しているテキストエディタはVim(正確にはNeovim)なのですが、
Svelte.jsの`.svelte`ファイルを開くと全てのコードが真っ白で開発しずらかったので、何かシンタックスハイライトをつけるいい方法がないか探した。

# vim-svelte
一番手取り早いのはVimのプラグインを見つけることだったので、Svelteのプラグイン情報が載っている[Svelte Community](https://svelte-community.netlify.app/)で探すことに、、
正直ないだろうなーって思っていたのですが、探したらなんと[vim-svelte](https://github.com/evanleck/vim-svelte)というものがありました。早速インストールしました。

私のプラグイン管理は`dein.toml`で行っていたので、以下のようにプラグインを追加してインストール

```
[[plugins]] # Svelte.js
repo = 'evanleck/vim-svelte'
```

再度Vimを開き直して、Sapperのtemplateを確認したところシンタックスハイライトがつきました！！

![vim-svelte1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325401/52ad598b-f9a2-9119-195f-f4c4cb7d06e6.png)

見やすい！！

if文にもしっかりついていていい感じです。
![vim-svelte2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325401/a2d3b590-50a3-ec15-4ff0-41b34320ecce.png)

これでVimでも快適にSvelte.jsが使えそうです。

ちなみに初期状態だと`<script>`タグと`<style>`タグにインデント挿入されるようになっていますが、以下の設定を追加することで無効化することが可能みたいです。

```
let  g： svelte_indent_script  =  0 
let  g： svelte_indent_style  =  0
```
超いまどき、Raspberry Pi  で VPNを構築１０分クッキング(SoftEther VPN Server)

前回の続き「[Raspberry Pi 初期設定まとめ](https://qiita.com/murachi1208/items/79706fce06a201231216)」 まだ画面はOFFってない(苦笑

# 面倒なことしなくてもルータでL2TP/IPsecできる
最近テレワークで注目されているVPNですが、昔からL2TP/IPsecだったらルータ機能として実装されていることが多い。VPNサーバっていう設定項目あったらそれ。

[【2020年版】各メーカーのWi-FiルーターでVPNを使う方法/対応有無](https://24wireless.info/how-to-use-vpn-on-wifi-router)

# SoftEther VPN Serverいれたら
我が家で昔から運用しているサーバに SoftEther VPN Server を入れたのだけど、VPN側の速度が 1Mbpsも出ない原因がわかったのでメモ。

結論からするとKVMホストにいれちゃいけなかったようでした。

![vpn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/a2f0e757-41a0-7a79-3010-bdcd5deaf739.png)

上記の注意事項をちゃんと読むことが必要でした。

# 仕方ないのでRaspberry PiにSoftEther VPN Serverを入れる

とりあえずインストールするソフト
設定方法は、本家にも詳しく書かれているのでみるといい。

- Raspberry Pi側  
[softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-arm_eabi-32bit.tar.gz (6.80 MB)](https://www.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-arm_eabi-32bit.tar.gz)"
- Windows側  
SoftEther VPN Server Manager for Windows(Mac OS X)

個人的には、"仮想ブリッジの設定"した方法が簡単だった。ここをみて設定する "[Raspberry PiでVPNサーバ構築](https://memo.kuraba.com/2019/12/raspberry-pi%E3%81%A7vpn%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/)" のが簡単でよい。

# ユーザの設定
L2TP/IPsecで接続するユーザを作成する。

ここみるとユーザの作成からクライアントの接続まで記載されているのでよい。
[VPNサーバー構築(SoftEther VPN Server)](https://centossrv.com/softethervpnserver.shtml)

# ルータの穴あけ
以下を穴あけしてマッピングする。
500/UDP
4500/UDP


# SoftEther VPN Serverの制限事項
SoftEther VPN Serverは無料だが[制限事項](https://ja.softether.org/3-spec/cureent_limitations)もある。個人的には RSA 証明書認証 を使いたかったのだけど、、残念（解除する方法もあるらしい）

有償版「PacketiX VPN」は、機能制限がないので導入するといいらしい。

[製品エディション](https://www.softether.jp/1-product/11-vpn/51-price/1-edition)をみると個人的につかうレベルであれば、家庭用向けを買うのがいいのだろうか、、こんど購入してみる。
 
# 参考サイト
・[Raspberry PiでVPNサーバ構築](https://memo.kuraba.com/2019/12/raspberry-pi%E3%81%A7vpn%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/)
・[ラズパイ4とsoftetherで自宅にVPNサーバを構築する](https://shikasen-engineer.com/raspberrypi-vpn-server/)
・[VPNサーバー構築(SoftEther VPN Server)](https://centossrv.com/softethervpnserver.shtml)
Dockerfile、docker-compose.ymlを更新した後にやること

#はじめに
Dockerfileやdocker-compose.ymlを編集して更新した後、イメージやコンテナに反映させるためのコマンドのメモです。
案外シンプルでした。
なお、当記事でご紹介するのはdocker-composeで複数コンテナを管理している場合のものになります。

#Dockerfileの更新を反映させる

```
$ docker-compose up -d --build
```
<small>※-dオプションは、バックグラウンドで起動するオプション</small>

docker-compose upコマンドに`--build`オプションを追加しています。

通常docker-compose upを実行すると、

①Dockerイメージをbuildして、
②runが実行される

という処理が実行されますが、もし既にDockerイメージがbuildされている場合は、
②のrunだけが実行されるようになっています。
そのため、Dockerfileを更新した後に`docker-compose up -d`コマンドを実行しても、
新しいDockerイメージがbuildされず、古いイメージを元にrunが実行されてしまいます。
そこで、`--build`オプションを追加することで、buildとrunを一緒に実行することができるようになるのです。


#docker-compose.ymlの更新を反映させる

```
$ docker-compose up -d
```

<small>※-dオプションは、バックグラウンドで起動するオプション</small>

こちらは、普段docker-composeでコンテナを起動するコマンドと変わらないですね。
更新後のdocker-compose.ymlを元に、コンテナの再構築が行われます。
【GCP】サーバー接続エラーが出た時

#「ポート22に接続できません」などのエラーメッセージがでたとき
以下のような原因が考えられます。

・ポートでSSH アクセスを許可するファイアウォール規則はありません。ポート22でのSSHアクセスは、すべてのGoogle Compute Engine インスタンスでデフォルトで有効になっています。アクセスを無効にした場合、ブラウザからのSSHは機能しません。22以外のポートでsshdを実行する場合は、カスタムファイアウォール規則でそのポートへのアクセスを有効にする必要があります。

・SSH アクセスを許可するファイアウォール規則は有効になっていますが、GCP コンソールサービスからの接続を許可するように設定されていません。ブラウザーベースのSSHセッションのソースIPアドレスは、GCP コンソールによって動的に割り当てられ、セッションごとに異なる場合があります。

#「接続できませんでした。再試行しています…」の場合
シリアルコンソールの出力ページに移動して、accounts-from-metadata で始まる出力行を探すことで、デーモンが実行されていることを確認できるそうです。

# 対処法
以下のような対処ができそうです。
・ディスクのスナップショットを取得。
・受信FWルールを確認。
・トラブルシューティングでインスタンスのシリアルコンソール出力、インタラクティブコンソールをアクティブにして調査。

# リファレンス
https://cloud.google.com/compute/docs/ssh-in-browser
SSH接続についても、エラーの対処が書いてあるので、参考になります。
【GCP】権限付与の考え方




# リファレンス
https://cloud.google.com/kms/docs/separation-of-duties

# memo
最小限の権限と職務分離の原則は意味的には異なりますが、セキュリティの観点から本質的に関連する概念です。両方の背後にある意図は、人々が実際に必要とするよりも高い特権レベルを持つことを防ぐことです。

最小権限の原則：ユーザーは、ジョブの実行に必要な最小限の権限のみを保持し、それ以上は保持しないでください。これにより、認可されていないターゲット、ジョブ、監視テンプレートなどのリソースへのアクセスが制限され、認可の活用が減少します。
職務の分離：ユーザー権限レベルを制限するだけでなく、ユーザーの職務、またはユーザーが実行できる特定のジョブも制限します。ユーザーには、複数の関連機能に対する責任を与えないでください。これにより、ユーザーが悪意のある操作を実行し、その操作を隠蔽する能力が制限されます。

# 例
・最小限の権限にする場合、単一のG Suiteアカウントで、開発環境用の1つのプロジェクトと本番環境用の1つのプロジェクトでユーザーを管理する・

・やろうとしたけど、権限が足りずできないことが多い。

権限付与についてはここのページをみる
https://cloud.google.com/iam/docs/understanding-roles?hl=ja

なければ考えらえるのはworkspace側での付与か定義されていないロール
そういう権限は以下のページに書いてある
https://cloud.google.com/iam/docs/custom-roles-permissions-support?hl=ja