OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase Authenticationのユーザーデータを全部消す

池の水を全部抜くように、Firebase Authenticationのユーザーデータを全部消したい場面が時はやってくるでしょう。
例えばアプリをリリースする前にゴミデータを一掃するとか。

Firebaseコンソールでは複数のユーザーデータを削除することはできないので`firebase-admin`を使ってサーバーから消すことができます。

これは[公式ドキュメント](https://firebase.google.com/docs/auth/admin/manage-users#delete_multiple_users)にも書いてあるので、[こんな](https://qiita.com/laughingman/items/9089e61816d01c58eb85)やり方よりも確実に消せます。

## 前提
- 今回はNodeでやります
- Nodeがインストールされている(npmが実行できる)

## 手順

1 . `npm i firebase-admin`
2 . 次のコードをコピペする

> 対象のFirebaseプロジェクトの`serviceAccountKey.json`(サービスアカウントファイル)を同ディレクトリに配置
> `databaseUrl`は指定しなくても動作はしますが一応指定しておきます

```javascript:index.js
const admin = require("firebase-admin");
const serviceAccount = require("./serviceAccountKey.json");
const databaseURL = "https://project-name.firebaseio.com"

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: databaseURL
});

const deleteAllUsers = (nextPageToken) => {
  let uids = []
  admin
    .auth()
    .listUsers(100, nextPageToken)
    .then((listUsersResult) => {
      uids = uids.concat(listUsersResult.users.map((userRecord) => userRecord.uid))
      console.log(uids)
      if (listUsersResult.pageToken) {
        deleteAllUsers(listUsersResult.pageToken);
      }
    })
    .catch((error) => {
      console.log('Error listing users:', error);
    }).finally(() => {
      admin.auth().deleteUsers(uids)
    })
};

deleteAllUsers();
```

3 .`node index.js`で実行

コンソールに削除したUserのUIDが出力されればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/f1e63886-62e8-f9c8-feff-8289fece8333.png)

きれいさっぱりしました〜👏
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/59a7ac59-1c05-7f88-9c34-e6081beb0706.png)


## 参考

https://dev.to/pratik14/deleting-all-firebase-users-l4d
初めて HBase を使ってみただけの記録

hadoopと組み合わせて使われれる HBase がなんなのか試してみた

あんまいいtutorialがなかった

ref
https://blog.newnius.com/setup-apache-hbase-in-docker.html
https://github.com/big-data-europe/docker-hbase/blob/master/docker-compose-standalone.yml


# setup
```rb
git clone git@github.com:big-data-europe/docker-hbase.git
cd docker-hbase

docker-compose -f docker-compose-standalone.yml up -d
```

# Dashboard

http://localhost:16010/ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/eb26e8da-c4fd-2729-087b-4e934bd7fdbe.png)

この後作ったtest tableの概要だけ見れた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/f263fc75-61e7-219a-f31d-86b8c3f9d45b.png)


ZooKeeperが動いてるらしい。いまだになんなのかわかってない。


# demo

```rb
docker exec -it hbase /bin/bash

hbase shell


create 'test', 'cf'

desc 'test'

list 'test'

put 'test', 'row1', 'cf:a', 'value1'

put 'test', 'row2', 'cf:b', 'value2'

put 'test', 'row3', 'cf:c', 'value3'

scan 'test'

get 'test', 'row1'

```

HDFSを利用した NoSQL っぽかった。ただのkey valueではないのかな。
このqueryはいまいち意味がわからなかった

まあ、そのうち。


# やっぱり遅い

HDFSなので、やっぱり遅かった。 get するだけで5秒かかる. 全部localにあるのに。

```rb
root@7cc78d760534:/# time echo "get 'test', 'row1'" | hbase shell -n
2022-09-12 03:42:34,531 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
COLUMN                                      CELL
 cf:a                                       timestamp=1662953978258, value=value1
1 row(s) in 0.2850 seconds

nil

real	0m4.226s
user	0m11.911s
sys	0m0.674s
```
Amazon WorkSpaces 小ネタ

# 接続元のIPアドレスの記録
- [WorkSpaces Access Event](https://docs.aws.amazon.com/workspaces/latest/adminguide/cloudwatch-events.html#workspaces-event-types.title)で記録することが可能
- 概要
    - WorkSpacesへアクセスしたときにAmazon EventBridgeによりCloudWatch Logsへ"WorkSpaces Access Event"を記録
- 作成手順
    1. AWS MCから[Amazon EventBridge]-[イベント]-[ルール]の順にアクセス
    1. [ルールを作成]をクリック
    1. "ルールの詳細を定義"にて下記を入力し[次へ]をクリック
        - 名前: 任意のルール名
        - イベントバス: default等
        - ルールタイプ: イベントパターンを持つルール
    1. "イベントパターンを構築"にて下記を入力し[次へ]をクリック
        - イベントソース: AWSイベントまたはEventBridgeパートナーイベント
        - サンプルイベント: デフォルト値のまま
        - イベントパターン
            - イベントソース: AWSのサービス
            - AWSのサービス: WorkSpaces
            - イベントタイプ: WorkSpaces Access
    1. "ターゲットを選択"にて下記を入力し[次へ]をクリック
        - ターゲットタイプ: AWSのサービス
        - ターゲットを選択: CloudWatchロググループ
            - ロググループ: 新規にグループ名を入力 若しくは既存グループを選択
    1. "タグを設定"にて、任意設定し[次へ]をクリック
    1. "レビューと作成"にて[ルールの作成]をクリック
- WorkSpaceへアクセスすると、CloudWatchログの指定したロググループへ下記(サンプル)内容のログが記録
```
{
    "version": "0",
    "id": "64ca0eda-9751-dc55-c41a-1bd50b4fc9b7",
    "detail-type": "WorkSpaces Access",
    "source": "aws.workspaces",
    "account": "123456789012",
    "time": "2018-07-01T17:53:06Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "clientIpAddress": "192.0.2.3",　→　接続元IPアドレス
        "actionType": "successfulLogin",
        "workspacesClientProductName": "WorkSpaces Desktop client",
        "loginTime": "2018-07-01T17:52:51.595Z",
        "clientPlatform": "Windows",
        "directoryId": "domain/d-123456789",
        "workspaceId": "ws-xyskdga"
    }
}
```
- 補足
    - ストリーミングに使用するポート4172および4195(UDP/TCP)の接続に成功した場合に記録
        - WorkSpacesの[IPアクセスコントロール]設定を適用している場合、許可された接続のみ記録(拒否は記録しない)
        - クライアントアプリケーションの更新/登録/認証に使用するポート443(TCP)の接続は記録しない

# WorkSpacesプロキシ対応
- 完全には対応していない
- WorkSpacesは複数のポートを扱うが、一部ポートはプロキシに非対応。
非対応のポートは、直接AWSへの接続を必要とする。
   - クライアントアプリケーションの更新/登録/認証に使用するポート443(TCP)は対応
   - ストリーミングに使用するポート4172および4195(UDP/TCP)は非対応
参考:[WorkSpaces の IP アドレスとポートの要件](https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/workspaces-port-requirements.html)

以上、
PyTorch on WindowsでDataLoaderの開始が遅い原因と対策

### DataLoaderの挙動
Windows環境下でPyTorchを用いた機械学習を実行していると  
`num_workers > 0`のケースにおいて iteration 自体は速度が出ていても  
DataLoader の **epoch開始** が非常に遅いことがある.  
  
この原因としては主に Windows のプロセスの生成が遅いことにあると考えられ、  
PyTorch の GitHub をみると同様の問題の Issue も挙げられているようである.  
しかしながら **WindowsでDeep Learning** をやるというマイナー勢力のために  
貴重な労力を割かれるということもなく、根本的な対策をとることは考えられていない様子.  
  
ボトルネックは子プロセスのインスタンスを破棄・再生成することにあるとすると
インスタンスを使いまわすようにすれば  生成のオーバーヘッドを回避できると考えられる.  
この挙動を制御するために`persistent_workers`というオプションが存在している.  
  
> persistent_workers (bool, optional) – If True, the data loader will not shutdown the worker processes after a dataset has been consumed once. This allows to maintain the workers Dataset instances alive. (default: False)

デフォルトでは`False`
これを`True`指定することで生成したインスタンスを破棄せずに使いまわすようになる.  
  
欠点としては子プロセスを生かしているため使用したメモリも保持したままとなる.    
ただ、通常の学習中においては元々消費する想定で動かしているので  
学習の際に特殊な処理がない限りはあまり影響もないようにも思える.  

※推論サーバーなどとして長時間起動して利用するケースには注意が必要かもしれない

### Code Sample
変更点は以下のとおりオプションを追加するにするだけである.  
```diff_python
import torch

# train_df は用いる学習データとする.
train_loader = torch.utils.data.DataLoader(
    CustomDataset(train_df),
    batch_size=32,
    shuffle=True,
    drop_last=True,
    num_workers=4,
+   persistent_workers=True,
)
```

Ubuntu環境などでは本指定が不要とすると  
下記のようにしておくと今後のコード変更が少なく済むと思う.
```python
import os
import torch

train_loader = torch.utils.data.DataLoader(
    CustomDataset(train_df),
    batch_size=32,
    shuffle=True,
    drop_last=True,
    num_workers=4,
    persistent_workers=(os.name == 'nt'),
)
```

WindowsでPyTorchを使っている方はどれほど居られるかわかりませんが...
なんらかのコードの助けになれば幸いです。

#### 参考文献
* https://pytorch.org/docs/stable/data.html
* https://github.com/pytorch/pytorch/issues/12831
Salesforce B2C Commerce SFRA でのページデザイナーの初め方

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。


今回の記事ではSFRAでのページデザイナーの初め方を紹介したいと思います。
実はSFRAのデフォルトのホームページをページデザイナーのページに変えることは非常に簡単です。
今回はその方法を紹介して、ページデザイナーを使い始めるきっかけになればと思っています。


:::note warn
下記の操作が正しく動作するには SFRA のバージョンが v6.0.0 以降である必要があります。
:::

## SFRAでのページデザイナーの初め方

SFRAを入れたてほやほやの状態から説明していきたいと思います。
![スクリーンショット 2022-09-12 11.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/2a2086bb-53ae-f5d0-6e04-2088da9ca244.png)





まずは初期のホームページの見た目を確認しておきます。
![スクリーンショット 2022-09-12 11.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/09cbd171-072b-0bfe-85c2-f095419ee64c.png)



マーチャントツールメニューから「Page Designer」へ遷移します。
![スクリーンショット 2022-09-12 11.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/ee555842-3327-b7b3-832f-eeaa163dc718.png)



「homepage-example」ページへ遷移します。
![スクリーンショット 2022-09-12 11.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/bb844594-8ff4-68d2-20f4-139716628bf3.png)



「ページ設定」をクリックし、ポップアップを表示します
![スクリーンショット 2022-09-12 11.42.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/ab8be332-5a5e-5132-b9b7-d44100d0b65d.png)




IDの「-example」を削除し、「homepage」というIDにします。
![スクリーンショット 2022-09-12 11.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c7fa25ab-ec78-af51-fca1-4e7c11f4d573.png)





「保存」ボタンをクリックします。
![スクリーンショット 2022-09-12 11.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/3c590b38-c697-ba81-f470-1f71e9f8ebd9.png)





「公開」ボタンをクリックします。
![スクリーンショット 2022-09-12 11.43.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/1ce19202-da2f-0f2e-afb4-25ed4359f3ce.png)




ホームページへ遷移すると、変更されていることが確認できます。
![スクリーンショット 2022-09-12 11.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/7397e8ae-778d-66c6-1713-2f382f9247d2.png)






## どのように機能しているか？

デフォルトのSFRAでは、ホームページを表示するためのコントローラである `Default.js` と `Home.js` に下記のようなロジックが入っています。
そのため、「homepage」というIDでかつ公開できる状態のページが表示されているようになっています。

```js
==OMIT==
server.get('Start', consentTracking.consent, cache.applyDefaultCache, function (req, res, next) {
    var Site = require('dw/system/Site');
    var PageMgr = require('dw/experience/PageMgr');
    var pageMetaHelper = require('*/cartridge/scripts/helpers/pageMetaHelper');

    pageMetaHelper.setPageMetaTags(req.pageMetaData, Site.current);

    var page = PageMgr.getPage('homepage');

    if (page && page.isVisible()) {
        res.page('homepage');
    } else {
        res.render('home/homePage');
    }
    next();
}, pageMetaData.computedPageMetaData);
==OMIT==
```




## ページデザイナーのカスタム

作り方については以前紹介したQiita記事「[Salesforce B2C Commerce Page Designerを触ってみる](https://qiita.com/syunyama/items/0a2685f6388cb2e8fa68)」をご覧ください。
また、下記のリポジトリのようなオープンソースであらかじめ作成されたコンポーネントが公開されていますので、再利用することで、動画の埋め込みやガイデッドセリングといったよりリッチなページを簡単に作成することが可能です。

* [sfdc-pd-custom](https://github.com/roy-tan/sfcc-pd-custom/wiki)
* [plugin_more_pd](https://github.com/SalesforceCommerceCloud/plugin_more_pd) (Account Manager必要)
【UiPath】ジョブを取得 (Get Jobs) アクティビティは既定のロールの権限では使えない

:::note info
**v2020.10**時点での情報です。
:::

### ジョブを取得 (Get Jobs) アクティビティ
このアクティビティを使うには、
**ジョブ (Jobs) ・プロセス (Processes) ・ロボットグループ (Environments) の表示 (View) 権限**が必要ですが、
既定のロールではこれらの権限が付与されていないため、まずOC側でロールの権限を変更する必要があります。

>Studio でこのアクティビティを実行するためには、ロボットが Orchestrator と接続し、Robot ロールに、ジョブ、プロセス、およびロボット グループの表示権限が必要です。

https://docs.uipath.com/activities/lang-ja/docs/get-jobs

### 既定のロール
既定のロールは以下のドキュメントの通りです。
JobsとEnvironmentsはView権限がないため、これらを付与する必要があります。
（Processesは既定で付与されています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c6d5741a-4b13-c3c5-7048-344d9195caeb.png)

https://docs.uipath.com/orchestrator/lang-ja/v2020.10/docs/default-roles


### ロールの編集
ロールの編集方法等については以下のドキュメントを参照してください。

https://docs.uipath.com/orchestrator/lang-ja/v2020.10/docs/managing-roles
【初心者向け】chmodコマンドの数字モードで権限を指定する値の仕組みを解説

## この記事について
chmodコマンドとは、ファイルやディレクトリの権限を変更するUNIXおよびUNIX系オペレーティングシステムのシェルコマンドのことです。

例えば、下記のコマンドを実行すると、sample.txtの権限を「オーナー以外は読み取り専用」に変更することができます。

    chmod 644 sample.txt

今回はこの「644」とはなんぞや！？
どうしてこれで「オーナー以外は読み取り専用」に指定できるの！？

という内容になります。

chmodコマンドには他にもオプションがあったり、数字ではない指定方法もあったりするのですが、
詳しい使い方は他にもたくさんわかりやすい記事があるので、今回は「数字モードで指定する値」にフォーカスを当てて解説していきたいと思います！

## なぜ書こうと思ったか
権限の指定はある程度よく使うパターンというのが限られているので、
この指定のときはこの数字（「オーナー以外は読み取り専用」の時は「644」など）、というのを覚えてしまえば理解していなくても使えてしまうのですが、
仕組みを理解しておくと、あまり使わない権限を指定したい時や、これなんだっけ？という時に調べなくても考えることができます！

意外とこの仕組みの部分を説明してくれる記事があまり見つからなかったので、今回書いてみることにしました。
少しでも私のような駆け出しエンジニアの方の参考になれば幸いです！

## 目次
- そもそもファイルの権限ってどういうもの？
- 権限設定を数字モードで指定する値に変換する
- 2進数から10進数の変換について
- まとめ

## そもそもファイルの権限ってどういうもの？
ディレクトリ上でls -laコマンドを叩くとファイルの一覧が表示されると思います。
一番左に表示されている謎の文字列がそのファイルの権限を表しています。

    例：　drwxr-xrx-

まずはこの謎の文字列について解説していきます。
この文字列は4つの塊に分けることができます。

    d rwx r-x r--

1つ目の塊はファイル種別を表しており、
2〜4つ目の塊は誰に対する権限かを表しています。

1つ目の塊（d）：ファイル種別
2つ目の塊（rwx）：自分に対する権限
3つ目の塊（r-x）：グループに対する権限
4つ目の塊（r--）：他人に対する権限

1つ目の塊のファイル種別の解説は権限設定に直接関係ないので今回は割愛します。
2〜4つ目の塊についてはさらに3つの値に分割することができます。

    rwx
    ↓
    r　w　x

これはそれぞれ読み（ｒ）、書き（ｗ）、実行（ｘ）の許可を表しており、
    許可があればそれぞれのローマ字、なければハイフン（ - ）を表示しています。

つまり、下記の権限はこう読み解くことができます。

    rwxr-xr--

rwx：自分に対して読み、書き、実行を許可
r-x：グループに対して読み、実行を許可
r--：他人に対して読みのみを許可

謎の文字列が表す権限はわかるようになりましたね。
次はこれをchmodの数字モードを用いて3桁の数字で指定したいと思います。

## 権限設定を数字モードで指定する値に変換する

例に挙げた文字列をchmodの数字モード指定する値に表現するとこうなります。

    rwxr-xr--
    ↓
    754

意味がわからないですね。ここからが本題です。

まず謎の文字列を2進数で表現してみます。
許可があれば（ローマ字であれば）1を、許可がなければ（ハイフンであれば）0を立てます。

    rwxr-xr--
    ↓
    111101100

これをグループごとに3桁区切りに分けて考えます。
```
111　101　100
```

さらにそれぞれグループごとに2進数から10進数に変換します。

    111　101　100
    ↓
    7　5　4

あら不思議、3桁の数字ができあがりました！

この値を使って下記のようにコマンドを叩くことでsample.txtの権限を「rwxr-xr--」に変更することができます。

    chmod 754 sample.txt
ls -laコマンドでsample.txtの権限が「rwxr-xr--」になっていることを確認できると思います。

## 2進数から10進数の変換について
ここの部分に関してはまた長くなりますので馴染みのない方は調べてみてください。
二進指数え法というのがとても便利なので併せて覚えると変換が楽にできます。

参考：https://qiita.com/ysda/items/0054584dcd1a9ccb41a2

## まとめ
権限の設定を数字モードへ変換する仕組みをまとめると下記になります。
1. 先頭1桁を除いた9桁の文字列を2進数に変換する
2. 2進数を3桁区切りで3つの塊に分ける
3. それぞれの塊を2進数から10進数に変換する

これでいつでもchmodの数字モードで権限が変更できますね。
最後までお読みいただき、ありがとうございました！
VSCode TS Playground機能（alpha版）触ってみた

TS PlaygroundをWeb版VSCodeで使える機能（alpha版）を見つけたので触ってみました。

# 起動方法
TS PlaygroundでExportメニューから「Open in VSCode TS Playground(alpha)」をクリックします。
<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/3b2c4750-14b9-b60d-f50e-00d854a9bc49.png" />

画面が遷移して見慣れたあの画面が表示されます。

# 画面

## 起動時

完全に表示が終わるまで少し時間がかかりますが、左側にTS Playgroundでは画面右に出てくる結果表示部分（ていうの？）が表示されますね。
その他もデフォルトのVSCodeの機能がありそうです。

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/9eae4d27-51c6-6b74-2fa1-38e6d93e5a30.png" />


## 拡張機能

拡張機能もインストールできそうです。
Pythonだらけじゃん、って思ったけどPrettierが出てきましたね。

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/60e91f77-4307-7e17-2a34-78669003acf3.png" />

## 実行しようとしたけど…

実行とデバッグを開くと、デバッグ拡張機能が無効になっていると言われました。
はて、コードは書けるけど実行はできないのかな？となりました。

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/5ddac1ed-e8fa-f22b-0f64-405873388aa9.png" />

# 結局何ができるの？

メニューから辿ってヘルプを見てみました。
参照資料をクリックします。

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/47e5334e-a0ab-1239-8f2f-146aafa050c0.png" />

で、出てきたのが[Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web)のページでした。
これにTS Playgroundのインターフェイスが載ってる感じなんですね。
何ができるのか調べてみると、[窓の杜の記事](https://forest.watch.impress.co.jp/docs/news/1360147.html)が出てきました。
今の所？コードの編集とかはできるけど実行とかはできないんですね。
alpha版だからこれから色々機能追加されるのかな。
Cでsplit関数

 メモです
使いたいときに毎度考えて書くのが面倒なので

つくりは割と粗めかもです

## コード
```C:split.c

#include <string.h>

int split(char* str, char regex, char** buf, size_t buflen){
    int strlength = strlen(str);
    int length = 1;
    buf[0] = str;
    for(int i = 1; i < strlength; i++){
        if(str[i] == regex){
            str[i] = '\0';
            buf[length] = &str[i + 1];
            length++;
            if(buflen <= length)break;
        }
    }
    return length;
}

 /*テスト用
#include <stdio.h>
int main(int argc, char const *argv[])
{
    
    //私の趣味だ、いいだろう
    char str[] ="フラファル リキタル ウンスキン キタスイ";
    char* buf[100];
    printf("%s\n", str);
    int test = split(str, ' ', buf, 100);
    for(int i = 0; i < test; i++){
        printf("%s\n",buf[i]);
    }
    return 0;
}
 */

```

引数strが引用する文字列
引数regexが分割するための文字の引数
引数bufはその分割した配列を入れるためのバッファ
引数buflenは　そのバッファのサイズ

戻り値は、その配列の個数が返ってきます

strの中身をそのまま書き換えている関係上
この関数に入れたstrは正常な動きをしなくなるので
そこのところだけ注意

## 実行してみる

とりあえずテスト用のメインを実行してみます

```:実行結果
$gcc split.c
$./a.out
フラファル リキタル ウンスキン キタスイ
フラファル
リキタル
ウンスキン
キタスイ
```

うん、いい感じ
Androidのセキュリティ的な雑談(FRP)

初投稿です、よろしくお願いします。

-Factory Reset Protection-
Googleのシステムが入っているならほとんどの端末で有効になるセキュリティ機能
ヤ〇オクなどではアカウント残りなどとも呼ばれている。

Googleアカウントを残したまま初期化すると、残したアカウントにログインしないと初期設定が進まない設計になっている。

ただ、
・(一定バージョンまでは)あくまでパスロックがかかっていない初期化後のため、
所定の方法を踏めば回避可能

・仕組み自体を悪用されやすい
(別ルートでGアカウントを設定したりAndroid 9から採用されたPINロックで解除を悪用するなど)

とかなり緩く作られている。(各社ベンダー任せ?)

対してAppleのIOS搭載端末では、知る限り本体のみでプログラムやUIの抜け穴を用いて解除されたということは聞かない。

Android端末のメーカーもO〇poやXi〇omi、H〇aweiなどは独自のリカバリなどを用いて
パスコードが不明な場合の初期化を封じたり、初期設定時に独自IDにログインしろとする場合がある。

気になるであろう国内メーカーは前から不正な初期化に対する対策をしており、国外の端末に比べ回避されにくい。
(そもそもリカバリーに入らない、Fastbootやadbコマンドを受け付けない、初期設定がガチガチに固められているなど)


このセキュリティが気になる方は、一度自身の端末で一度試していただけるとわかりやすいかと思います。
144.ダイナミックインポート

ブラウザが対応しているかどうかは必ず確認しておく
ちなみに
*chrome
*Edge
*Safari
以上3つは使えるとのこと
#### dinamic importの目的
ページの初期表示時の処理負荷をへらす
（必要な時に必要なだけ使う）
→コンテンツが展開する度に必要なモジュールを遅延ロードする方法

### 比較
#### 今までの静的メソッド
→ページがインポートされた時点で、モジュールもインポートされる
```javascript
import{ publicVal,publicFn} from './moduleA.js';

publicFn();
```
#### 動的メソッド
→モジュールは必要な時だけ、非同期によって呼ばれる
```javascript
//書き方1. 
import('./moduleA.js').then(function(modules){
	console.log(modules);
  modules.publicFn();
})
//書き方2.
async function fn(){
    const modules = await import('./moduleA.js');
    modules.publlicFn();
}) 
```
1.モジュール自体をインポートする関数を作成する
2.インスタンスに落とし込み、関数を実行する
Elastic Beanstalkのlogrotateについて

## ログローテーションについて
Elastic Beanstalkのログローテーションについて調査をしたので、内容をまとめておきます。


### ローテーションの設定
※以降はPumaのログについて記載していきます

デフォルトの設定で、1時間に1度、該当ログのファイルサイズが10MBを超えていたらローテーションするようになっていました。
1時間に1度の契機は、下記cronジョブによって呼びだされます。
```terminal
/etc/cron.hourly/cron.logrotate.elasticbeanstalk.puma.conf
```

ローテーションの設定ファイルについては下記コマンドで確認できます。
```terminal
$ less /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.puma.conf
```

```conf:logrotate.elasticbeanstalk.puma.conf
/var/log/puma/* {
 su root root          # ルート権限でやる
 size 10M              # 10MB以上だったらローテーションする
 rotate 5              # 5世代分古いログを残す 
 missingok             # ログファイルがなくてもエラーを出さない
 compress              # ローテーションしたログをgzipで圧縮する
 notifempty            # ログファイルが空ならローテーションしない
 copytruncate          # ログファイルをコピーし、内容を削除する
 dateext               # ローテションしたログに日付文字列をつけたい場合
 dateformat %s         # UNIX時刻(秒)の文字列を付与する
 olddir /var/log/puma/rotated # /var/log/puma/rotated 内にローテーションしたログファイルを格納
}
```

このデフォルト設定は`.ebextentions`によって書き換え可能です。


### ローテーション前後のファイルの見比べ

1. ローテーション直前9:59の`/var/log/puma/`配下のスクショ
[![Image from Gyazo](https://i.gyazo.com/023f8316cbfdef90d399eb6a69d87777.jpg)](https://gyazo.com/023f8316cbfdef90d399eb6a69d87777)

2. ローテーション直後10:00の`/var/log/puma/`配下のスクショ
[![Image from Gyazo](https://i.gyazo.com/208a90e8e718fa7b192530a34e8bbdf8.jpg)](https://gyazo.com/208a90e8e718fa7b192530a34e8bbdf8)

### ローテーションされたログの保管場所

ElasticBeanstalkの設定で下記を有効にしていると、S3にローテーションされたログファイルが格納されます。

#### 設定
ElasticBeanstalk -> 環境 -> {該当環境} -> 設定 -> ソフトウェアの変更
[![Image from Gyazo](https://i.gyazo.com/dc5603551d2847e52def45a9e4b75145.png)](https://gyazo.com/dc5603551d2847e52def45a9e4b75145)

#### ログの格納場所
S3 -> elasticbeanstalk-{リージョン}-{アカウントID} -> resources -> environments -> publish -> {EB環境ID} -> {EC2インスタンスID}
[![Image from Gyazo](https://i.gyazo.com/57ad2f548af4b5b37734ce668def1390.png)](https://gyazo.com/57ad2f548af4b5b37734ce668def1390)


※参照
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.logging.html
https://qiita.com/Esfahan/items/a8058f1eb593170855a1
Web to Caseで添付ファイルを使う方法

どうような質問があるのですが、標準機能ではできないようです。

[web to case attachments](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A965wSAB)


代替案が紹介されていました。

+ [Salesforce Web-to-Case: Alternatives For File Attachment Support](https://www.j2interactive.com/blog/salesforce-web-to-case-attachment-alternatives/)
+ [36,000 Point Slamdown From Ryan Mercer: You can now create “Web-to-Case” that supports Case Attachments](https://unofficialsf.com/36000-point-slamdown-from-ryan-mercer-you-can-now-create-web-to-case-that-supports-case-attachments/)
+ [Attachment in Web-to-case using API](https://salesforce.stackexchange.com/questions/176180/attachment-in-web-to-case-using-api)
+ [Email-to-Case Attachments as Salesforce Files](https://www.mstsolutions.com/technical/email-to-case-attachments-as-salesforce-files/)
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その021

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

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

今回はTrailhead
アドミニストレーター認定の準備: アプリケーションと活動
セールスアプリケーションとマーケティングアプリケーションの確認

　にある練習問題1問目をご紹介します。

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-applications-activities-and-mobile/review-sales-and-marketing-applications?trail_id=administrator-certification-prep

今回の内容は動画でも公開されております

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





問題はこちらです

![問題01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/136d84f2-bd17-62cb-f9c2-c704834fb91d.png)


質問の内容としては


・ソーラーパネル部門という営業チーム用に新しい商談の流れを作成したい
どうすればいいでしょうか

という話ですね


新しい商談フェーズを見せるのであれば、
１フェーズの表示を設定するセールスプロセスを作成する
２レコードタイプを作成しセールスプロセスを設定する

ということで可能です


それぞれの設定は動画をご覧ください

今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
集合と論理演算

# 問題４
論理和のことを知っていなければ解けなかった。
論理和はどれかが真であれば真になる。
これを覚えていれば解けた。
しかし問題に慣れていなければ焦って解けなくってしまう。
問題のように
```notP```or```Q```が真でであるためにはどちらかが真でなければならない。
これを考えることができれば解けた問題だ。

# 全体の問題を通して
やはり論理式の公式に助けられた。
論理式の公式は絶対に覚えている必要がある。
論理式の公式は覚えることもいいかもしれないが、理解した方がいいのだろうか？
先の問題を解いていきたい。

https://gihyo.jp/book/2022/978-4-297-12375-8
poetry + python 複数バージョン + pytorch の環境構築

# この記事は？
[motivation] poetry で python3.7系＋python3.8系を許容しつつ、pytorch も入れたい
[conclusion] 技術的には可能だが実用的には無理

# 背景
- pytorch を使ったライブラリを作成している
    - `pip install` でインストールされて利用されることを想定している 
- ライブラリは python3.7 と python3.8 をサポートする必要がある

# メイン
## poetry 単体でもできることはできるが実行時間が異様に長く UX が悪い
[poetry の issue に上がっている pytorch のインストール方法](https://github.com/python-poetry/poetry/issues/6409) を参考に書くとこうなります。

```pyproject.toml
[tool.poetry.dependencies]
python = ">=3.7,<3.9"  # python3.7 & 3.8 を許容
torch = { version = "1.9.1", source = "torch"}
torchvision = { version = "0.10.1", source = "torch"}

[[tool.poetry.source]]
name = "torch"
url = "https://download.pytorch.org/whl/cu111"  # cuda version に合わせてリンクは適当に変える
secondary = true
```

確かにこれでもできるっちゃできるんですがこの方法で `poetry lock` を実行すると cu111 の wheel ファイルをマシンのアーキテクチャや指定した python version にかかわらず全てダウンロードします。上記の pyproject.toml を lock すると以下の画像のハイライト部分の wheel ファイルを全てダウンロードしてから依存を解決しにいくため、めちゃくちゃ時間がかかり[^time] UX が異常に悪く、頻繁に `poetry lock` を実行する場合現実的ではないです。
![スクリーンショット 2022-09-12 9.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238125/c3896375-1336-b4c1-64aa-f8eea6c0b91a.png)

## 代替手段は？
cpu 版 pytorch を poetry で管理することで依存を解消し、gpu 版の pytorch を後から入れ直すと速いです。

```pyproject.toml
[tool.poetry.dependencies]
python = ">=3.7,<3.9"
torch = "==1.9.1"
torchvision = "==0.10.1"
```

```bash
poetry install
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
```

# 結論
- `poetry lock` がめちゃくちゃかかってもいい場合は `source` を指定して依存を全て解かせると安心。コードも綺麗。ただし本当に時間がかかる
- `poetry lock` に時間をかけたくない場合は pip を併用していい感じにやる

# 備考
- 扱う python version が3つ以上でも多分同じことができます
- wheel を全部落とすのをやめてください

[^time]: 自分は比較的高速な回線でやっていますがそれでも `6分/wheel` 程度かかります。[github の issue](https://github.com/python-poetry/poetry/issues/6409) では 250Mbps で `15-20分/wheel` かかったと報告されています。
承認のレコード画面の表示をカスタマイズする方法

【概要】
-
承認のレコードを選択すると、デフォルトでは以下のようになっています。
画面キャプチャー赤枠のように不要な「価格・数量・合計」を非表示にしたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/dcb07edc-60f4-cc64-2dee-9d80f1828e71.png)
該当箇所についてフォームレイアウトを確認すると、以下が対象となっていました。
__「Approval Summarizer」__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/9a7379f3-94b5-3792-5b65-32fe6195c0e3.png)

【手順】
-
1.UI マクロから「approval_summarizer_sc_req_item」で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/1274a152-6a1f-cf41-a132-71db92143cc2.png)
<br>
2.「価格・数量・合計」の表示は以下をコメントアウトする事で非表示にします。
```
${gs.getMessage('Price')}
${gs.getMessage('Quantity')}
${gs.getMessage('Total')}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/10b3fe1c-4dae-e89e-58f3-cd80c6e71d5a.png)
<br>
3.「価格・数量・合計」の値の表示は以下をコメントアウトする事で非表示にします。
```
<g:currency_format value="${task.price.getDisplayValue()}" />
<td valign="top"> ${task.quantity}</td>
<g:currency_format double="${jvar_item_price}" />
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/132698d5-92cb-9dc6-4a3c-9291045a7d1c.png)
<br>
4.「更新」を選択します。
<br>
5.最初の承認のレコードを選択すると、「価格・数量・合計」が非表示になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/e455d99c-6393-8b6e-1d3b-3b717d701e65.png)
<br>
[※コミュニティ参考情報はこちら](https://community.servicenow.com/community?id=community_article&sys_id=5639da9f1b59f050c17111751a4bcbd4&feedbackAction=helpful)
<br>
以上
AWS JumpStart for NewGrads 2022に参加してきました！


## はじめに

先日、AWS JumpStart for NewGrads 2022（オンライン開催）に参加してきました！

今回は３日間にわたるイベントの内容を振り返りながら、成果物の紹介をしていきます！

**※インターン内容公開の許可をいただいております。**

## AWS Jumpstart for NewGradsとは？
:::note info

新人エンジニアの方々を対象とした、3日間の実践的な研修プログラムです。 将来的にAWS活用をリードする人材になるための第一歩をスムーズに踏み出せるようなコンテンツをというコンセプトで企画されているため、単なるAWSサービスの学習だけでなく、チームに分かれて要件に合った適切なアーキテクチャを検討・設計する経験を積む部分にフォーカスした内容となっています。

出典：「新卒エンジニア向け研修プログラム AWS JumpStart for NewGrads のご紹介」
:::

本イベントの参加者は**約220名！**
ソフトウェア、情報処理サービス（SI）、Web、ゲームなど様々な業界の新卒エンジニアが一堂に会し、ハンズオンやグループワークでのアーキテクチャ検討を通してAWSについて学んでいく研修です。
 
## 実施期間

- 9/7(水)~9/9(金) の３日間

## プログラム内容

3日間の主な内容は以下の3点になります：
- **3-4人の少人数グループでアーキテクチャ検討(グループワーク)**
- **AWS EC2・ALB・RDSを用いたスケーラブルなWebアプリの構築(ハンズオン)**
- **AWS Lambda・API Gateway・DynamoDBを用いたサーバーレスなAPIの作成(ハンズオン)**

今回は、その中でもメインイベントである「アーキテクチャ検討」について書いていこうと思います🐬


## スケジュール

![schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842935/1ccb21d0-4756-607f-c200-2298c709ff51.png)
✅お菓子・飲み物など持ち込み自由！




## アーキテクチャ検討（グループ課題）

![スクリーンショット 2022-09-12 11.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842935/972020dd-e392-6e8d-76c3-891383dc0b09.png)

このプログラムの流れとしては、**「3日間でとあるWebサービス（お題）に沿った適切なアーキテクチャの構成をチームで考えて発表しよう」** というものでした。

サービスの概要としては**大規模なチャットAPI**で、様々な要望や仕様の要求（上記例）をクリアする構成を必死に考えることが求められました。
各日程に1~2回、AWSのソリューションアーキテクトの方にアーキテクチャ構成について質問する時間が設けられており、いかにその機会を上手く活用するかという部分が肝になっていました。


## 成果

![スクリーンショット 2022-09-12 11.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842935/e2ab7b70-f24c-3e1a-751e-fed19ba58710.png)
- 費用と工数を抑えるため、Lambdaを用いたサーバーレス構成
- チャットのメッセージはリアルタイム性を持った送受信が必要なためDynamoDBへ

### **サービスの前提**

**アプリ概要：**
1. 自社-会社間のみで使用するチャットサービス
2. iOS / Android対応
3. 朝 / 昼間にアクセス数ピークの時間帯あり


**５つのコア機能：**
1. アカウント管理（招待/会員登録/ログイン/Profile/削除）
2. メッセージ機能（送受信/編集/削除・DM/グループトーク）
3. 検索機能（メッセージ・ユーザー）
4. グループ機能（作成/検索/退会/削除）
5. 通知機能（→デバイス）


#### 検討した５つの観点

##### ①信頼性
リージョンサービスが中心⇒ AZレベルの耐障害性が高いアーキテクチャ


##### ②パフォーマンス
1. Auto Scaling/Provisioned ConcurrencyでLambdaの同時実行数制限を緩和
2. OpenSearchでDynamoDBの検索性を改善

##### ③コスト
1. アクセス頻度の低い画像を安いストレージクラスに移す
2. Lambda でアクセス過疎時間帯のコスパを高める

##### ④運用
1. 開発_ CloudFormation, Github Actions による自動デプロイ
2. ヘルスチェック_ CloudWatch によるLambda監視
3. ユーザ管理_ Cognito の利用

##### ⑤セキュリティ
1. Cognito + Key Managment Serviceでユーザレベルの暗号化
2.  S3 のパスレベルでのアクセス制御


##  感想・学び

3日間のハンズオンとグループワークを通じて、数多くのAWSサービスを組み合わせながら取捨選択する機会が多くありました。研修が始まる段階では、AWSの基礎概念（リージョン、AZ、個々のマネージドサービス）をなんとなく理解しているようなレベルでしたが、運用面やパフォーマンス面を意識しながら研修に取り組むことで、以前には持っていなかった観点でサービスの選定が出来るようになったと思います。
AWS(S3) Pre-signed URLで期限切れ(403 Request has expired)にハマった話

# 期限内にアクセスしているが、データのアップロード中に期限切れになってしまって困った話です。
手順
１.Pre-signed URL生成 
２.データのアップロード開始 ※クライアント側
３.データの送信中...
４.データのアップロード完了
５.期限切れ(403 Request has expired)発生

データ送信に時間が掛かって期限が切れてしまって、エラーになったという話です。
データのアップロード開始は期限内に行っているので、リクエストタイムアウトでない限り成功して欲しい。

# 結論
HTTPリクエストヘッダに**Expect: 100-continue**を入れれば良い。
これにより通信が2度行われ、最初のタイムスタンプで期限切れの認証が行われるので問題が無くなる。

改善後の手順
１.Pre-signed URL生成 
２.データのアップロード開始準備(Expect: 100-continue) ※クライアント側
３.サーバーから100 Continue応答 **ここの時間がPre-signed URLの期限判定に使われる**
４.データのアップロード開始 ※クライアント側
５.データの送信中...
６.データのアップロード完了
７.通信成功

# 感想
知ってれば当たり前の話かもしれないですが、明示的にこういう情報が書いてないと
私の様にハマる人はハマると思います。同じことで困ってる方がいらっしゃいましたらお試しください。

HTTPはリクエスト(クライアントからデータ送信)完了まで、サーバーのプログラムは動かないと思っていたので
思っていた通りの動きでした。別の通信を挟むことで、この問題を解決しているのは私の中でスッキリです。
Expect: 100-continueの仕様だけ見ると何の意味があるねんって内容だったので目から鱗でした。
batch のleqの不思議

下記バッチの実施結果
if 03 leq 2 echo ２より小さい
if 07 leq 2 echo ２より小さい
if 08 leq 2 echo ２より小さい
if 09 leq 2 echo ２より小さい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189035/d39d88ac-7dea-88c2-0008-fa733b03a20a.png)

なぜだ？！！
#4 未経験32歳エンジニアがGithubと出会った日〜初期から利用した方が良いツール〜

こんにちは。

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

毎日書くと意気込んでいたのに3日坊主。

力んで内容をちゃんとしなきゃっ!!と思っていたのですが、ゆる〜くアウトプットしたいなと思う日に書くようにします。

とはいえ、

**ポートフォリオ＝就活＞アウトプット**

で毎日を積み重ねています！

# ご覧いただく対象者
- エンジニアを目指している方
- エンジニアとして就活をされている方

# 伝えたいこと

**毎日Githubでコミット！！！**

開発エンジニアを目指している方は特に、面接官はGithubを見てくださっています。

自分自身が「毎日コミット宣言」することを含め、もしGithubを利用されていない方は利用してコミットした方がいいということをお伝えしたいです。

# Githubについて提言してくださった面接官

忘れもしないGithubと出会った今年2022年8月中旬。(登録は2022年2月)

面接の際に「Githubを確認しましたが、全く更新されていないようで・・・」

開発も請け負っている２次面接官のお言葉。

その後、

**「もし開発をされたい場合はWEBサービスを作った方がいいですよ」**

と提言して下さいました。

ご縁がなかった企業ですが、それ以前も以降もそんな風に提言してくださった企業様はありませんでした。

（開発以外の企業も応募していた背景はありますが・・・。）

今なら改めてその発言の重要さを感じます。

いつか「ありがとうございます」とお伝えしたいです。

# 学校で必須で学ぶわけではない

IT業界で働いている友人は１年間プログラミングスクールに行っていたことから「Gitは必須だった」とのことでした。

しかし、私が通っていた学校はWEBデザイナーであったことから「Gitは必須ではありません」でした。

そもそも、エンジニアの学校に行くべきだったかも知れません。

ただ、WEBデザイナーの学校に行ってコードを書くことを含めAdobeなどのツールを色々扱ったからこそ、コードを書く楽しさに気づけたからそこは振り返りません！！

そのため、コードを書く楽しさに気づけたので、学校に通う中で、独学でJavaScriptやC言語、Pythonを勉強しました。（学校ではHTML/CSS/jQuery/wordpress用のPHP）

コードを書くので、通い始めた初期にGithubのアカウントを作成しましたが、ライブラリでREADMEを確認し使い方を見るくらいしか使ったことありませんでした。

正直今年の2月からずっとほぼ毎日作業し、
- Unity
- dotinstall
- youtube

で動画を見ながら簡単なコードを書いてパーツを作っていたのと、ポートフォリオも作成したのですが全部ローカルで作業していました。

むしろ作成途中のコードを見せる文化を知らなかった・・・。

# ポートフォリオの方向性を一緒に考えてくれた友人

就活を進めていく中でキャリアを改めて考えた際に、**開発エンジニアを目指したい！**とものすごく感じています。

ただ、就活で応募している企業様は、IT業界のいろいろな職種。

くすぶっていた、そんな今年2022年9月10日土曜日。

開発エンジニアを目指すならと
- Gitの重要性
- 勉強した方がいいこと（ロードマップの作成）
- ポートフォリオの方向性(何でこの機能をつけたか、つけた背景は何の技術をアピールしたいのか)
- 挑戦してみるべき企業

を一緒に1日中カフェで相談に乗ってくれた友人。（就職してボーナスもらったら奢らせていただきます）

現在、ポートフォリオはありますが「制作会社向け」のポートフォリオ。

できれば、開発エンジニアとしてキャリアを形成していきたいので新たに１からポートフォリオを作成していきます。

8月は焦ってIT業界のいろいろな職種に応募したのですが、開発に絞っていきたい。

そのため
- 自分の現在地
- 自分の目標地

をすり合わせすることができました。

もちろん、ずっと無職ではいけないので期限を決めました。

就活がうまく行くかは自分のインプットとアウトプット次第。

引き続き、毎日を積み重ねていきたいと思います。

# 大事なことなので2回言います

エンジニアを目指している方はGithubに記録していきましょう！

本当にどの目線で言っているのという感じですが、私はGithubに毎日コミットしていきますのでその宣言のために改めてもう一回言いました。

では、宣言にお付き合いいただきありがとうございました！
VisualStudioのSpy++インストール方法とインストール場所

# インストール方法

VisualStudioInstaller起動。

『個別のコンポーネント』。
『コア』で検索。
『C++コア機能』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2ca36a71-35d2-c4ef-ec8a-4e63d57324cc.png)


# インストール場所

```
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\
spyxx.exe
```

```:コピペして起動しやすい用文字列
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\spyxx.exe
```

# 蛇足

たーーーーまにしか使わないから場所忘れる。
たーーーーまにしか使わないからショートカットも作らないし…。

# 参考サイトさん

https://windev.just4fun.biz/?VS/Visual+Studio+2022%E3%81%AB+Spy%2B%2B%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.3.0
【Git初心者に一部のコミット取り消しは恐ろしい】けど戻しが効くようで安心

上司「この変更やっぱり戻しで！」
と言われると今までは、pushしたコミットをコピペするなど地道に進めてきました。

ですが今回は、
```削除したファイルの復元 + 以前のコミット内容```
ということで私はコミット内容を一部戻すための方法を探しました。

## $ git revert [コミット番号] でコミット戻し
現在の私の状況
```
$ git log

commit 12345c (HEAD -> fix_login, origin/fix_login)
Author: 
Date:   Thu Sep 2 12:47:41 2022

    ヘッダーの文言変更

commit 12345b
Author: 
Date:   Thu Sep 2 14:06:46 2022

    login時に権限を分ける

commit 12345a
Author: 
Date:   Thu Sep 2 15:13:03 2022

    ログイン対象者の遷移先ページの改修

```
この中の```commit[12345a]```の変更を戻したいので、
```
$ git revert 12345a
```
これでOK！

と思いきや...
上司「やっぱりさっきの戻し"なし"で！」

## $ git revert [revertしたコミット番号] でコミット"再"戻し

```
$ git log

commit 12345d (HEAD -> fix_login)
Author: 
Date:   Fri Sep 2 16:51:58 2022

    Revert "ログイン対象者の遷移先ページの改修"
    
    This reverts commit 12345a.


commit 12345c (HEAD -> fix_login, origin/fix_login)
Author: 
Date:   Thu Sep 2 15:47:41 2022

    ヘッダーの文言変更

commit 12345b
Author: 
Date:   Thu Sep 2 14:06:46 2022

    login時に権限を分ける

commit 12345a (origin/master, origin/HEAD, master)
Author: 
Date:   Thu Sep 2 10:13:03 2022

    ログイン対象者の遷移先ページの改修

```

この中の[revertしたコミット番号]は```commit[12345d]```なので、
```
$ git revert 12345d
```
これで本当にOK！

```source tree```でも
ブランチ内のコミット履歴の戻したい箇所を右クリック
「コミット適用前に戻す」を押下して戻すことも可能らしい。こっちの方が便利ですね！
【wordpressプラグイン作成】unsingedを付けたらSQL文が通った

wordpressでテーブルを生成するプラグインを作成する際、
既存のwp-usersテーブルの主キーカラム（ID）を参照する外部キーを設定しようとしたところ、以下のエラーが排出されました。

 Can't create table `wp-01`.`hoge` (errno: 150 "Foreign key constraint is incorrectly formed") for query 

wp-userテーブルのIDカラムに合わせて、参照元のカラムの型をbigint型にし、unsignedの記述を追記したらSQL文が通るようになりました。

以下、修正前と修正後です。

```before_modify.php
$sql = CREATE TABLE hoge (
            hoge_id    int not null PRIMARY KEY AUTO_INCREMENT,
            user_id    int not null,   
            CONSTRAINT ga FOREIGN KEY (user_id) REFERENCES wp_users(ID)
        );
```
```modyfied.php
$sql = CREATE TABLE hoge (
            hoge_id    int not null PRIMARY KEY AUTO_INCREMENT,
            user_id    bigint unsigned not null,   
            CONSTRAINT ga FOREIGN KEY (user_id) REFERENCES wp_users(ID)
        );
```
Einstein ダッシュボード フィルタとして  ケース所有者を追加したい



最初に Dataset を探索し、 CaseId を一意にして Case Owner ごとにグループ化し、所有者を確認し、所有しているケースの数を確認してから、ダッシュボードに移動して同じ所有者を確認します。ダッシュボードにデータが表示されない場合は、ビジュアルを探索します。フィルターを確認し、レンズに同じフィルターを適用してみてください。

[Einstein Dashboard filter - Case Owner reporting](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdEBS)
マイナンバーカードアプリケーション

## はじめに
マイナンバーカード、みなさんもう作りましたか？
あのカード、実はCPUやROMやRAMが搭載されている小さいパソコンなんです。NFC Type-B対応のカードリーダを使って指示を出すと、カードに実装されたアプリケーションを実行することができます。
NFC Type-Bは近年のスマホであればAndroid/iOS問わずほぼ対応しており、AndroidだとFeliCa(Suica等)非対応の端末も多いですが、Type-Bはだいたい対応しています。
つまり、みなさんのお手元のスマホをマイナンバーカードにかざすと、マイナンバーカードの中のアプリを使えるというわけです。これが結構色々なことができて面白いので、どんなことができるのか簡単に紹介したいと思います。色々なビジネスに応用できる可能性を秘めてるので、気になった方は積極的にマイナンバーカードの採用を検討してみてください。日本政府も喜びます。

## アプリケーションの種類

マイナンバーカードの中には、以下の4つのアプリが入っています。

* 公的個人認証アプリケーション(JPKI-AP)
* 券面事項確認アプリケーション(券面AP)
* 券面事項入力補助アプリケーション(券面入力補助AP)
* 住基アプリケーション(住基AP)

それぞれどのようなアプリケーションか、順番に説明します。

### JPKI-AP

まず、JPKI-APの説明をする前に公的個人認証サービスの説明をする必要があります。

#### 公的個人認証サービス

Wikipediaには下記のように書かれています。
> 公的個人認証サービス（こうてきこじんにんしょうサービス、英語: JPKI, Japanese Public Key Infrastructure）とは、インターネット上での本人確認に必要な電子証明書を住民基本台帳に記載されている希望者（日本国内に住民票のある日本国民および在留カード所持住民）に対して、無料で提供するためのサービスである。
[公的個人認証サービス - Wikipedia](https://ja.m.wikipedia.org/wiki/%E5%85%AC%E7%9A%84%E5%80%8B%E4%BA%BA%E8%AA%8D%E8%A8%BC%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)

インターネット上で本人確認する手段に使える電子証明書を提供してくれるサービス、とのこと。
インターネット上での本人確認はeKYCと呼ばれていて、方法もいくつかあります。方法によってセキュリティの高さも異なります。クレジットカードを発行する際なんかに免許証の写真を要求されたりしたことはありませんか？あれもeKYCの一種です。
ちなみにマイナンバーカードを用いたeKYCは、eKYCの中でも最強のセキュリティを誇るらしいです。かっこいいですね。
興味がある方は「eKYC 種類」あたりで調べてみてください。

参考：[公的個人認証サービスポータルサイト](https://www.jpki.go.jp/index.html)

#### JPKI-APの使い方

先述の通り、公的個人認証サービスは電子証明書を発行しています。
証明書にはニ種類あり、
* 利用者証明用電子証明書
* 署名用電子証明書

があります。
マイナンバーカード内にはこれら2つの電子証明書と、それぞれ対応する秘密鍵が格納されているのですが、JPKI-APを使うことでこれらにアクセスすることができます。
2つの証明書の違いですが、主に用途が違います。

##### 利用者証明用電子証明書

「利用者本人であること」の確認に使用します。
例：マイナポータルへのログイン、コンビニの住民票発行サービス利用時の認証 等
マイナンバーカード発行時に設定した4桁のパスワードを使うことで利用できるようになります。
まだ試せていませんが、民間利用の場合は自分で作ったサービスのログインに使用できるのはもちろんのこと、SSH接続なんかにも使えそうですよね。

##### 署名用電子証明書

署名用電子証明書は「作成・送信した電子文書(ファイル)が、間違いなく利用者が作成・送信したこと」の確認に使用します。e-Taxの際の本人確認等で使用します。先述したeKYCで使用するのはこちらの証明書です。
この証明書を用いて本人確認を実現するiOSアプリを開発することになったことがマイナンバーカードに触れるきっかけでした。

どちらの証明書も、対応する秘密鍵はマイナンバーカードから取り出すことができないので、電子署名はJPKI-AP上でしか行えません。また、電子署名を行えるのはカード発行時に設定したパスワードを知っている人のみです。
マイナンバーカードが手元にある(所持情報)+パスワードを知っている(知識情報)で認証3要素のうち2つを満たしているため、本人確認に使える。というロジックです。

### 券面AP

カードの画像データを保持するカードAPで、基本4情報、顔写真、マイナンバーの画像を格納していて、券面が偽造されていないか確認することができます。正直、民間のアプリでの活用方法が思いつきません。
ファイル形式がJPEG2000という聞いたこともない形式で格納されており、非常に扱い辛いです。ただ、iOSのUIImageViewは標準で対応しているため、特に何もしないでもData型に格納してぶち込んであげればiPhone上で表示できます。なお、Androidでは外部ライブラリを用いないと扱えないようです。
券面APへのアクセスコントロールは他のAPと少し異なり、12桁の個人番号か、生年月日(6桁)+マイナンバーカードの有効期限(4桁)+表面に書かれているセキュリティコード(4桁)でアクセスできます。要は手元にカードがあればパスワードを用いずに利用できるわけです。

### 券面入力補助AP

個人番号や基本4情報をテキストデータとして保持しており、APへアクセスすることで取得することができるカードAPです。これらの情報をユーザーに入力させる手間を省くために使用する、と理解しています。
カード発行時に設定した4桁のパスワードを入力させてカードをかざしてもらうだけで、基本4情報が入力できるのでユーザビリティの向上に繋がりますよね。
ただし、個人番号は法令で認められる場合のみ利用できるようです。

### 住基AP

住民票コードを保持するカードAPです。自治体のみが利用できるようなので、私は試せていないです。アクセスコントロールとして、カード発行時に設定した4桁のパスワードが必要です。

## 最後に
以上、JPKI APの説明を中心にマイナンバーカードAPの概要を紹介させていただきました。
iPhoneからの実行のみではありますが住基AP以外は一通り試せているので、具体的なマイナンバーカードへのアクセス方法やAPDUコマンドによる通信方法を別途記事にしたいなと思っています。
【技術書まとめ】1冊ですべて身につくHTML ＆ CSSとWebデザイン入門講座

改めてCSSをやり直して、全体像をきちんと把握してみようと本書を手にとってみた。


# CHAPTER1 Webサイトの基本

- デザインの目的は相手に伝えること
    - （デザインは相手に対する「思いやり」）
    - センスは知識。誰でも学べば身につけられる



# CHAPTER 2 HTMLの基本

- `<!doctype html>`
    - とくに指定がなければHTML5のこと


# CHAPTER 3 CSSの基本

- 複数のセレクタを指定する
    - カンマ区切り
        - `h1, p { color: red; }`
- 要素の中の要素に指定する
    - 半角空ける
        - `div p { color: red; }`
- 背景画像表示
    - `background-size: cover;`
        - 表示領域をうめつくすように表示
        - 下部分が切れたりする
    - `background-size: contain;`
        - 縦横比を保持して画像が全て表示される
        - 右側に余白ができたりする
- グループ化
    - デザインが違うだけで「きれいな 生ゴミ」と読める
    - ![スクリーンショット 2022-08-31 9.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282504/67504b20-dbc8-608c-d516-2631c5cd4048.png)
- 余白
    - 文字サイズの1〜1.5倍


# CHAPTER 4 フルスクリーンのWebサイトを制作する

navbarや背景設定など


# CHAPTER 5 2カラムのWebサイトを制作する

- `<a>`タグを`display: block;`にするとテキストだけでなく幅いっぱいクリックできるようになる
    - テキストをリンクとして使うときに親切
- レスポンシブ対応
    - カラム数を減らす
    - ナビゲーションメニューをハンバーガーメニューなどにする


# CHAPTER 6 タイル型のWebサイトを制作する

- タイルはCSSグリッドでやると楽

```css
.grid {
  display: grid;
  gap: 26px;
  /* repeatで並べて, 最小240px, auto-fitで画面の幅に合わせて折り返す */
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); 
  margin-top: 6%;
  margin-bottom: 50px;
}
```

- 1つ目を大きくする
```css
.big-box {
  /* 始まりのグリッドライン / 終わりのグリッドライン を決める */
  grid-column: 1 / 3;
  grid-row: 1 / 3;
}
.big-box img {
  height: 94%;
  width: 100%;
  object-fit: cover;
}

@media (max-width: 600px) {
   /* レスポンシブではガタガタになるのでautoに戻す */
   .big-box {
    grid-column: auto;
    grid-row: auto;
   }
   .big-box img {
    height: auto;
   }
}
```


# CHAPTER 7 外部メディアを利用する　

- Facebookなどを3カラムにする
- ogpの設定方法
【Tableau Data Saber挑戦記】これからはじめる人に向けて伝えたいこと〜初学者、経験者それぞれのメリット〜

今回はData Saberプログラムをこれからはじめようとしている方に向けて、tableau初学者、経験者各々の切り口からお伝えできたらと考えています。初学者と経験者と切り分けて書いていますが共通して言える部分もあると思うので皆様通して読んでいただけたら幸いです。

# tableau初学者に向けて伝えたいこと
## レベルの高い問題でスキルを向上させられる
問題は普通に難しいですw
課題が進むにつれて、経験者でも悩むような問題も結構出てきます。
HandsOnですが、難しいですが解説動画を見たり、師匠の解説を受けたりするなかでできるようになっていきます。同じようなことを反復して経験していくなかでできなかったことができるようになっていくという感覚を得ることができます。

出てくるテクニックも「LOD表現」とか、tableauを習ったら知っておきたいというようなことも学べるのでとても有意義だと思います。

# データ分析に携わるきっかけになる
実際に私もこのプログラムを始めるまでは、社内ではtableauでレポートを作ったりすることはなく、viewerとして見るだけでした。
個人的に少しudemyの教材などで学んだくらいでした。

まだ挑戦のさなかではありますが、今回のプログラム参加をきっかけにしてデータ分析に携わっていくということもありえると思いますし、またそのための自身の意志や意欲の表明にもなりうると思います。


# tableau経験者に向けて伝えたいこと
## 魅力的なイベントに参加できる
これは初学者にも共通するメリットだと思いますが、師匠の繋がりから様々な魅力的なイベントが企画され、それに参加することができます。

社内でデータ分析をするだけでなく、こういう機会を通じて外部との関わりを持ったり、得られる情報もあると思いますので、その意味ではtableau経験者でも普段得られない体験をできるのではないかと思います。

## データドリブン・カルチャーを広めることで自分の業務負荷の軽減にもなる
個人的にはこれがこのプログラムの一番の醍醐味であり、メリットであり、自身が強く伝えたいと思っていることです。

私はOrd4がとても印象に残っています。
いくつかその内容を抜粋させていただきます。

・レポートファクトリーについて
「レポートファクトリー」というのはデータ分析をする人（部門）のことで、ここに他部門からのデータ分析依頼が集中して全体的にスピードが落ちたりすることの問題を示唆しています。多くの職場でも往々にして見受けられる状況かと思います。
それゆえ普段からデータ分析に携わる人にこそ見ていただきたい内容です。

・なぜセルフサービスで分析ができなければならないか
セルフサービスとは自分自身でデータ分析することです。先のレポートファクトリーの問題のようにデータ分析部門に依頼しないと分析できないといったことをなくしていき、自分自身でデータ分析をしていけることの重要性を説いています。この「セルフサービス」が普及していくことにより、誰でもデータ分析ができるように「脱レポートファクトリー」が進むわけです。それはつまりデータ分析に忙殺されていた人たちの負荷を軽減し、さらなる有益な分析に時間を回せるということになるわけです。だからこそ、普段からデータ分析に携わる人には見てほしいわけです。

こちらはその講義動画です

https://www.youtube.com/watch?v=4Yx8GwUi_ik&list=PLR1ulf4cyh2lTnNKO1m3_VGgKRLczHOgO&index=11

https://www.youtube.com/watch?v=S-Titt1xLGw&list=PLR1ulf4cyh2lTnNKO1m3_VGgKRLczHOgO&index=12


テクニックを学ぶのであればUdemyの教材や他のYoutube動画、ブログ記事、tableau公式のリファレンスでも学べるとは思います。
しかし、「データドリブン・カルチャーを広める」という内容については、このプログラムの特長であり、他の教材や記事などでは得られない情報だと思います。
そういう意味では、全くの初心者というよりは、ある程度tableauを使い、tableauを広めていく立場の人にこそ取り組んでほしいプログラムだと思いました。

テクニックを学ぶということにおいては、経験者の方にとってはそこまでの関心事ではないかもしれません。しかし、普段からデータ分析の依頼に追われている人にとってここで語られていることは自身の業務負荷を軽減する上でも非常に有益だと思います。
一極集中していたレポート業務を負荷軽減する。そういう意味でも役立つ情報はたくさんあると思います。初学者だけでなく、ぜひ、経験者の方こそ自身の業務負荷を軽減するためにもこのData Saberプログラムを通して自身や周りの人達をアップデートしていっていただけたらと思っています。


以上、お粗末さまでした。

# 【Tableau Data Saber挑戦記】の最初の記事はこちら
こちらもぜひ

[【Tableau Data Saber挑戦記】1. はじめます](https://qiita.com/hetare/items/d55a7dda34f3b0e9073b)

https://qiita.com/hetare/items/d55a7dda34f3b0e9073b
KnativeのActivatorはどの様に動作しているのか

この記事ではKnativeがどのようにネットワークを構成しているか説明する。Knativeには多数のコンポーネントがあり、一見しただけではKnativeのコンポーネントがどうやって通信を行っているか理解しにくい。

しかし、あまりにも詳しい説明を書くと話がややこしくなり理解しにくくなるためこの説明ではなるべく簡単に概念を理解できるようにする。もっと詳しい実装の話を聞きたい場合はコメントやTwitterなどで気軽に連絡してほしい。

まずknativeには[Scale to zero](https://knative.dev/docs/serving/autoscaling/scale-to-zero/)という機能がある。これはPodsが使われていない場合は起動しているPodsの数を0個にするという機能だ。待機中で使われていないサービスのPods個数を0にすればKubernetesクラスタのリソースを無駄にすることなくサービスが維持できる。

しかしどうやってPodsが0の状態で通信しているのだろうか? 

## Activator

Knativeのコンポーネントのひとつに`Activator`というものがある。このコンポーネントはPodsが起動していなければ起動するという機能を担っている。

Knativeの通信はまずContourやIstioなどのネットワークコンポーネントが受けとる。この記事ではContourを例にとって説明する。 ContourやIstioはどちらもEnvoyを基礎コンポーネントとして使用している。

```mermaid
graph LR
	ext --> env
	env[Envoy] --> act((Activator))
    act --> po(Pods)
```

Activatorも実際のPodsとしてKnativeが起動している。Activatorはいったんトラフィックを受け取り、対象サービスの[Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)のReplica数を変更する。Podsが正常に起動したら実際にPodsにトラフィックを送信する。

この時、常にトラフィックがActivatorを経由してしまうとActivatorがボトルネックになってしまう。 この問題を回避するためにActivatorはKubernetesの[Endpoints](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/endpoints-v1/)を変更し、対象サービスのIPを登録する。

```mermaid
graph LR
	ext --> env
	env[Envoy] --> act((Activator))
	env[Envoy] -- reads via XDS --> c
    act -- changes --> e[Endpoints]
    act -- changes --> d[Deployments]
	c[Contour] -- reads --> e
```

`Endpoints`に該当サービスのIPが登録されたら、ContourやIstioがEndpointsの情報を読み取り、Envoyの[xDS](https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol) というプロトコルを用いて対象サービスのIPを取得し、EnvoyのClusterを更新する。Envoyの[Cluster](##EnvoyClusterの定義)とは簡単に言うと送信先(Destination)のことである。

EnvoyのClusterが更新されると、EnvoyはActivatorを経由せずに直接Podsにトラフィックを送信するようになり、Activatorがボトルネッックになることを避けることができる。

# Appendix

## EnvoyClusterの定義

> **Cluster**: A cluster is a group of logically similar upstream hosts that Envoy connects to. Envoy discovers the members of a cluster via [service discovery](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/service_discovery#arch-overview-service-discovery). It optionally determines the health of cluster members via [active health checking](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/health_checking#arch-overview-health-checking). The cluster member that Envoy routes a request to is determined by the [load balancing policy](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/overview#arch-overview-load-balancing).

from: [Terminology — envoy documentation](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/intro/terminology)


## Kubernetes Endpoints
- [あなたの知らないKubernetesのServiceの仕組み | IIJ Engineers Blog](https://eng-blog.iij.ad.jp/archives/9998)
- [[Kubernetes] EndpointsがよくわかってないのでEndpointsControllerを読んでみた - Qiita](https://qiita.com/nakamasato/items/13698c24af0a60f71bcd)
cakectf2022参加記

# 初めに

2022年9月3日(土)から2022年9月4日(日)まで開催されたcakectfに「kanon」で参加しまして、順位は154でした。(cryptoしか解いてないからあれなんですけども...)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/f4677f19-9d39-8788-da37-a04150e389c1.png)

といいつつ去年は、全く何も解けなかったことを考えると成長してるなーという気分でした。

# 競技中

ぶっちゃけタイムスタンプ取ってないのでうる覚えで書いてます(fileの保存時間見て書いてます)...余りあてに出来ません

## 競技開始(14:00)

とりあえず、家にあったチーズケーキ食べながら1 wavの問題(frozen cake,brand new crypto)を確認。

## frozen cake (14:20??)

frozen cakeをみてとりあえず、フェルマーの小定理で書き出してみるかで、式を書き出したらなんかうまくいってflagをget...!
serverに提出したら、エラー?吐いたのでdiscordで確認すると修正するので待っててねとのことなので、brand new crypto を取り組むことに...

## brand new crypto (14:50??)

初見ぽい暗号方式?だったので、一度式に書き出して考えてみる。
最初は、何かうまく消えるのかなと思っていたけど、乱数$r$でうまくいかない...
と思っていたら、式変形して $m$ のべき乗が表せることができたので 1 文字ずつ復号して flag を get 出来ました。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/f4ebe118-1161-187a-2cd1-93538468ae0b.jpeg)


四番目に解けたので「うおー」ってテンション爆上がり
(3位に入れたこと一度もないんですけど、みんな早過ぎませんか...)

ここから16時までyoutubeで時間つぶし...(他のジャンルは基礎知識がなさ過ぎてちらっと見ただけで全く分かってません...)

## rock door (16:00)

lunaticの問題が解放され、 rock door を見ると、DSA・hashの組み合わせで一瞬戸惑いましたが、とりあえずコードとにらめっこしながら実行して内容の把握すると s しか返さないdsaで初めて見ましたが、とりあえず立式するとhash取ってるのでbitが小さいなーと思いつつ LLL を行うのなら $s = k^{-1}*(z + xr) mod q$ を $sk = z + xr + Aq $ $s,q$ は既知と考えて$x r$の処理をどうすればいいのかわからず撃沈しました。

敗因は $x r$ を分離してしまったことで2変数になってしまい＼(^o^)／ｵﾜﾀ

この問題に約2時間30分かけて解けなかったのと、この後に用事があったのでここでcakectfは断念しました。


# まとめ

多分、実力的に rock door は解いておきたかった問題でしたね...
あと、write up は他の方を参照された方がいいと思います。(時間もたってるし、クオリティが低いしで...)
なんだかんだ、自分の成長と上には上がいることを改めて実感しましたので、とても楽しめましたし、悔しい思いをしました。
そんなこんなもありながら、cakectf 2022 を開催してくださった皆様本当にありがとうございました。
Laravelによるページネーションの書き方

# ページネーション（pagination）とは

- 検索結果やデータベースの一覧画面などを適度な長さで分割して表示する仕組み
- 次の画像のように各ページへのリンクを並べることでアクセスしやすくなります
- 10件ずつ表示する、50件ずつ表示するなど、表示数をカスタマイズできます

見本：Google検索結果より
![スクリーンショット 2022-09-12 7.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/07b5f2c5-eea9-ced2-7897-4fed90bb0680.png)


## 環境について
データベース内に`user`というテーブルが存在する仮定で以下の手順は進みます

## 作成方法

### データベースのテーブル情報を取得するモデルを作成します

```php3
namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
    {
  
    }
```
```php3
namespace App;

use Illuminate\Database\Eloquent\Model;

class 任意のモデル名 extends Model
    {
  
    }
```
### コントローラーでビューにモデルの情報を送ります

```php5
    class HomeController extends Controller
{
  
    public function index()
    {
        $users = Users::paginate(5);
        return view('layout.index',['users' => $users]);
        /*もしくは*/
        /* return view('layout.index')->with('users',$users); */
    }
}

```

```php5
    class HomeController extends Controller
{
  
    public function index()
    {
        $任意の変数名 = 存在するモデル名::paginate(何個でページを分割するか);
        return view('ビューが存在するディレクトリ名.ビューのファイル名',['＄を抜いた変数名' => $を付けた変数名]);
        
    }
}

```

### ビューに情報を表示します(例）

```php5
<!--テーブル-->
    <div class="table-responsive">
        <table class="table" style="width: 1000px; max-width: 0 auto;">
              <tr class="table-info">
              <th scope="col" >id</th>
                <th scope="col" >商品画像</th>
                <th scope="col" >商品名</th>
                <th scope="col" >価格</th>
                <th scope="col" >在庫数</th>
                <th scope="col" >メーカー名</th>
                <th scope="col" >詳細表示</th>
                <th scope="col" >削除</th>
              </tr>
              @foreach($users as $user)
              <tr>
                <td>{{$user->id}}</td>
                <td>{{$user->img_path}}</td>
                <td>{{$user->product_name}}</td>
                <td>{{$user->price}}</td>
                <td>{{$user->stock}}</td>
                <td>{{$user->company_name}}</td>
                <td><button type="button" class="btn btn-success">詳細</button></td>
                <td><button type="button" class="btn btn-danger">削除</button></td>
              </tr>
              @endforeach
          </table>
     </div>
     {!! $users->render() !!}
```

```php
 /* テーブルのdevタグなどの外側へ
{!! $users->render() !!}
を追記します */

{!! $コントローラーから受け取った$変数名->render() !!}

```