OmniAICreator/Qiita-1.07M huggingface dataset:
40 代おっさん GASのJSONオブジェクトについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## JSONとは

JSONはデータをを表現するための記法の一種
アプリケーション間のデータのやり取りを行うために使用される文字列データのこと

＊JSONのほかにCSV,XMLなどがあるが組み込みオブジェクトでは提供されていない。
GASではUtilities Service, XML Serviceで提供されている。

JSON形式は
JavaScriptのオブジェクトリテラル、配列リテラルを組み合わせた表現がベースになっている文字列データ
以下2点のルールを確認しておく

・プロパティ名はダブルクォーテーションで囲む
・文字列はダブルクォーテーションで囲む

## JSONオブジェクトとは

JSON形式のデータは文字列なので、スクリプト内で個々の値を取り出すためには、オブジェクトに変換する必要がある。
JSONオブジェクトは、JSON形式の文字列とJavaScriptのオブジェクトを相互に変換する2つの静的メソッドを提供する。

＊JSONオブジェクトはnew演算子でインスタンスを生成することはできない。

JSONオブジェクトのメンバー

|分類|メンバー|戻り値|説明|
|----|--------|------|----|
|静的メソッド|JSON.parse(str)|Object|JSON形式の文字列strをオブジェクトに変換したものを返す|
|静的メソッド|JSON.stringify(obj)|String|オブジェクトobjをJSON形式の文字列に変換したものを返す|

お試し(JSON.stringify)

```javascript
function toshiki4() {
  const obj = [
    {name: '利樹', favorite: ["みかん", "仮面ライダー", "YouTude"]},
    {name: 'パパ', favorite: ["肉", "ガンダム", "ゲーム"]},
    {name: 'ママ', favorite: ["野菜", "ワンピース", "映画"]}
  ];

  console.log(JSON.stringify(obj));
}
```

コンソールログを見るとすべてダブルクォーテーションになっています。

お試し(JSON.parse)

```javascript
function toshiki4() {
  let str = '[';
  str += '{"name": "利樹", "favorite": ["みかん", "仮面ライダー", "YouTude"]},';
  str += '{"name": "パパ", "favorite": ["肉", "ガンダム", "ゲーム"]},';
  str += '{"name": "ママ", "favorite": ["野菜", "ワンピース", "映画"]}';
  str += ']';

  const persons = JSON.parse(str);

  console.log(persons[0].name);
  console.log(persons[1].favorite[2]);

  const {name, favorite} = persons[2];
  console.log(name, favorite);
}
```

このように外部からJSON形式の文字列を受け取ったらオブジェクト化をしてデータを取り出すのが基本の流れになる。

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
Laravelを使ってAWS「 S3」へ画像アップロード

今回はLaravelからAws S3へ画像アップロードを説明します。実際によく使われる部分なので
少しでも役に立てたなら嬉しいです！:girl_tone1:

前提条件：
　AWS S3でユーザ登録とバケットの作成ができていること！

「flysystem-aws-s3-v3」パッケージを使用しますので、以下のコマンドを実行してインストールします。

```
composer require league/flysystem-aws-s3-v3
```

ファイルシステムの設定を編集しますが、Laravel8 では不要のこと！
● config/filesystems.php

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        //以下を追加
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
            'endpoint' => env('AWS_ENDPOINT'),
            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
        ],

    ],
次は環境変数の設定を編集します。プロジェクト直下にある「.env」ファイルを以下のように編集します。

```

  AWS_ACCESS_KEY_ID=　{AWSで作成したACCESS_KEY_I}
  AWS_SECRET_ACCESS_KEY=　{AWSで作成したSECRET_ACCESS_KEY}
  AWS_DEFAULT_REGION=ap-northeast-1
  AWS_BUCKET={作成したバケット名}

```
これで必要な設定が終わりです。Laravel側の実装を進みましょう。。。。。
S3アップロードを中心しますので、DB登録までは行かないです。


アップロード処理

```
<?php

use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;

class UploadController extends Controller
{
　　　/**
     * S3に画像アップロード
     *　@param $img
     */
    public function imageUpload(Request $request)
    {
        //リクエストから画像の取得
        $image = $request->file('main_img');
　　　　　
　　　　　//オリジナル名で画像の保存
        $name = $image->getClientOriginalName();
　　　　　
        //S3へアップロード
        $image->storeAs('/public/main_img', $name);
        $main_path = Storage::disk('s3')->putFileAs('/image/upload/main_img', $image, $name, 'public');
　　　　　
　　　　　// アップロードした画像のパスを取得　「S3パスをDB登録の場合これを使用」
        $path = Storage::disk('s3')->url($main_path);

        //画像パスをログ出してみましょう
　　　　　Log::debug("Image link from s3 : ".$path);
    }
}
```

![Screen Shot 2022-02-20 at 21.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384626/dbe89159-b654-9be8-92a4-247400d9faae.png)


これでS3へ画像アップロードが完成です。実際にアップロードしてみてS3へ画像がアップロードできていることを確認してください:clap:
思ったより簡単にできたよね！最後まで読んでくれてありがとう！！！！
Teams版Power Virtual Agents のチャットボットにSVG形式の画像が表示できるのか？

#はじめに

@h-nagao さんが、Power AppsでSVGを利用した日本地図の都道府県を塗るアプリを作られました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> でSVGを利用して日本地図を塗ってみる！<br>ついでに簡単な情報も表示！ <a href="https://t.co/fR91UyuwH2">pic.twitter.com/fR91UyuwH2</a></p>&mdash; Hiro (@mofumofu_dance) <a href="https://twitter.com/mofumofu_dance/status/1493951297858732033?ref_src=twsrc%5Etfw">February 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これをTeams版Power Virtual Agetnsで実装しました。SVGを作成するのはPower Automateです。

が、結論から言いますと、

####TeamsチャットボットでのSVG表示は不可能です

よって、代替案を考えてみましたので記載いたします。

#注意

本記事を実装するにあたり、プレミアムコネクタを利用するためPower Automateの有償ライセンスが必要となります。

#SVGがダメなら表示できる形式に変換すればいい

表題の通り、Power AutomateでSVGをPNGに変換してチャットボットへ返します。

全体像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b3b9e109-1a7e-5cb5-e24d-58c17ec528f6.png)

#各アクションの説明

###SVG画像データを定義

svgタグから始まるSVGデータを用意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/8794db08-6660-c7ed-2e2c-ae2284ec5400.png)


###Cloudmersive API で扱えるJSON形式に変換

入力には下記を記載してください
```
{
  "$content-type": "image/svg+xml",
  "$content": "@{base64(outputs('作成'))}"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/62610a10-b0a8-cd66-eb6b-277554dd0a53.png)


###Cloudmersive API でSVG→PNGに変換

画像の形式変換にはCloudmersiveコネクタを利用します。
［Cloudmersive](https://account.cloudmersive.com/)

Signupし、API Keyをコピー取得します。
個人利用であれば「Free Tier」を選択し、追加料金なしで利用可能です。

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a1a8c154-8a41-9f23-b5d9-c6b254fe29ae.png)

Cloudmersive Image Processingを選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/2730bd07-cfa8-e8ac-a63c-953395001df7.png)

接続名は任意、APIキーには上記で取得したKeyを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a83777bf-a6a4-b455-1193-b93dc94bd2b0.png)

対象画像ファイルは上記の「Cloudmersive API で扱えるJSON形式に変換」で作成したアクションのOutputを、出力には[任意の名前].pngを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/63343014-d793-f611-3fed-223fcc360c01.png)


###チャットボットで表示できるようにHTMLタグを付与

Temas上のチャットボットでは<img>タグが解釈可能です。
このアクションの出力をトピックに返し、メッセージに埋め込めばチャットボットで画像が表示されます。

```
<img src="data:image/png;base64,@{body('入力画像を_PNG_形式に変換する')?['$content']}"> 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/23db7b22-390c-9bb1-1820-8c4eabe32ce7.png)

#まとめ

SVGはレスポンシブに表示可能で汎用性が高く便利な画像形式です。
が、残念ながらTeamsでの表示は不可のため、今回のような工夫が必要です。活用ください。
[Django / python3] ZoneInfoNotFoundErrorの対策

# 概要

Djangoの管理画面を開こうとしたら、以下のエラーが発生した。

```bash
backports.zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Asia/Tokyo'
```

むむむ、今までは発生してなかったんだが～( ˘·ω·˘ ).。oஇ

# 環境

||type / version|
|:-|-:|
|OS|wsl2 (Ubuntu)|
|Python|3.8.9|
|Django|4.0.2|
|backports.zoneinfo|0.2.1|

# 対策

pip moduleの`tzdata`をインストールした上で、Djangoアプリケーションを再起動してあげれば大丈夫でした。

# 原因について

エラーの発生原因になっている[zoneinfoの公式ドキュメント](https://docs.python.org/3/library/zoneinfo.html#data-sources)によると、zoneinfoは、データベースかもしくは`tzdata`からtimezone情報を取得してくれる作りになっている模様。

ただし、windowsなどは、必要なtimezone情報がデータベースに入っていないため、代替策として`tzdata`を使うことが推奨されていました。

う～ん。。。
ちょっと前まではこんなエラーは発生しなかったので、Djangoやzoneinfoのバージョンを上げた（上がった）ためにこのエラーが発生したのかもしれない。
要注意ですo(｡＞∆＜)o

# 参考記事

今回は以下の2つ見とけばだいじょぶだよ(^ワ^*)
英語だけど。

## 公式document

https://docs.python.org/3/library/zoneinfo.html#data-sources

## stackoverflow

https://stackoverflow.com/questions/71058888/zoneinfonotfounderror-no-time-zone-found-with-key-utc
MacでRaspberry Pi OS (Raspbian)を高速にmicroSDに書き込む

久々に焼こうと思ったらf○ckな記事しかなくてイライラしたので自分用メモ
焼くところ以外は他の記事見てください

```bash
sudo dd bs=1M if=/Users/UserName/Downloads/2022-01-28-raspios-bullseye-arm64-lite.img of=/dev/rdisk2 status=progress conv=fsync
```

キモは```of=/dev/rdisk```を指定している所
これで自分の環境では15MB/sの速度がでたので、２GBのイメージを2min程度で書き込みできた

```
% sudo dd bs=1M if=/Users/UserName/Downloads/2022-01-28-raspios-bullseye-arm64-lite.img of=/dev/rdisk2 status=progress conv=fsync
1995440128 bytes (2.0 GB, 1.9 GiB) copied, 136 s, 14.7 MB/s
1904+0 records in
1904+0 records out
1996488704 bytes (2.0 GB, 1.9 GiB) copied, 136.102 s, 14.7 MB/s
```

多分大丈夫だろうけどsyncコマンド打っておく
【EC2】EC2を作成しターミナルログイン時のメモ

秘密鍵をローカルの~/.ssh/配下に配置。

その後、ターミナルからEC2に接続するためのコマンドを叩く。

```sh
ssh -i ~/.ssh/XXXXX.pem ec2-user@${IPADRESS}
# 例：
# ssh -i ~/.ssh/aws-infra-ssh-key.pem ec2-user@00.00.000.000
```

しかし、初回ログインの際にパーミッションで怒られることがあります。
下記のコマンドで権限を変更
`$sudo chmod 0600 sample.pem`

その後、再度上記のsshコマンド実行で解決しました。

## 参考リンク
https://qiita.com/shimajiri/items/5716068da4d3a042b97c
Null合体演算子(?:とか??)を使うときは優先順位に気をつけろ

早速ですがこのコードをご覧ください。

```kotlin
fun main() {
    val tmp1: Int? = 0
    val tmp2: Int = 1
    println(tmp1 ?: 0 + tmp2)
}
```
`1`が表示されると思った方はお気をつけください。実際に出力されるのは`0`です。
`0`だと思った方はもうすでにNull合体演算子と優先順位をマスターしているので、このままそっとブラウザバックしてください。
## なぜ 0 と表示されるのか
至極単純な理由で`?:`は`+`より優先順位が低いため`tmp1 ?: 0 + tmp2`は`tmp1 ?: (0 + tmp2)`と解釈され最終的に`0 ?: 1`というふうになるため`0`が出力されるのです。
ちなみにKotlinだけでなくC#やJavaScript（というかほとんどの言語？）でも同じで

```C#
int? tmp1 = 0;
int tmp2 = 1;
System.Console.WriteLine(tmp1 ?? 0 + tmp2);
```
```javascript
const tmp1 = 0;
const tmp2 = 1;
console.log(tmp1 ?? 0 + tmp2);
```
上のコードは`1`ではなく`0`と表示されます。

## あとがき
あまりにも初歩的なミスですが、だからこそミスに気づきにくいと思います。
私のような犠牲者が再び出ないように戒めの意を込めて書きました。
オンラインでペアプロできるエディタを作った話 

おはようございます、Tlapesiumです。

今回の記事では自身が制作した

- オンラインで共同編集可能
- 環境構築無しで即座に実行可能
- チャット機能付き

なテキストエディタについて紹介したいと思います。

もしよろしければ、この記事を LGTM 、[GitHubリポジトリ](https://github.com/Tlapesium/CodingChat) の Star よろしくお願いします！

# 制作物
以下のリンクからアクセス可能です！
[CodingChat](http://www.codingchat.net/)

![Screenshot 2022-02-20 at 20-51-52 CodingChat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532997/d7fc6f56-2a04-0bfd-4805-7165a37a7c95.png)
![Screenshot 2022-02-20 at 21-09-38 CodingChat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532997/262fecf1-f954-fa03-cefe-70dbdddb4919.png)


# 制作の背景

Web版のVSCodeを使えばオンラインで共同編集可能です。が、誰かがサーバーを立てたり、サーバーを立てる人が環境構築する必要があり、少々手間がかかります。

そこで、手軽に使えるオンラインで共同編集可能なコードエディタとして [CodingChat](http://www.codingchat.net/) を制作しました。

# 機能

- オンラインで共同編集可能

言わずもがなです。一つのコードを複数人で同時に編集することができます。[^1]
他のユーザーのカーソルが表示されるので、誰がどこを編集しているかが一目瞭然です。

- 環境構築無しで実行可能

オンラインでコードが実行可能です。もちろん、与える入力を変更したり、出力を見ることもできます。
現在は C++ と Python のみに対応していますが、今後、対応する言語を増やしていきたいと考えています。

- チャット機能付き

文字によるチャットが可能です。ボイスチャットができないときや、見知らぬ相手とペアプロするときに便利かもしれません。

- 部屋の非公開機能

公開設定の部屋はトップ画面に表示されますが、非公開設定にするとトップ画面に表示されなくなります。
チャットルームのURLを共有することで非公開設定の部屋を仲間内で共有可能です。

# 技術的なお話

CodingChatのバックエンドは FastAPI 、フロントエンドは React を使用しています。
共同編集やチャットについては WebSocket を利用し、リアルタイム通信を可能としています。

# 終わりに

いかがでしたでしょうか。
初めて個人で制作したWebアプリですが、たくさんの人に使ってもらえたら幸いです。
個人的にはチーム参加可能な競技プログラミングのコンテストや、プログラミングを教える際に便利かなと思っています。

また、このエディタは [GitHubリポジトリ](https://github.com/Tlapesium/CodingChat) にてすべてのコードを公開しています。
改善点があれば Issue を立ててもらったり、プルリクエストを送ってもらえると大変ありがたいです。


もしよろしければ、この記事を LGTM 、[GitHubリポジトリ](https://github.com/Tlapesium/CodingChat) の Star よろしくお願いします！

[^1]: サーバーの状況によっては壊れることがありますが、リロードで直ります。
Ubuntu Server 20.04.3 LTS 構築#16 セキュリティ設定8(ファイヤーウォール設定)

実施日:2022/02/20

<<今回の内容>>
･ファイヤーウォール設定
#ファイヤーウォール設定

･ubuntuサーバーの構築の作業をしていましたが、ファイヤーウォールの設定を今回は行います。


```
まずは現在の状態を確認します。
sudo ufw status
#非アクティブ

無効化されているので、有効化します。
sudo ufw enable
#アクティブ

この状態だとincomingがallowになっていますので、denyに変更します。
sudo ufw default deny
#デフォルトのincomingポリシーは'deny'に変更しました
(適用したい内容に基づいて必ずルール変更をしてください)
```

取り敢えず、ファイヤーウォールの最低限の設定？は完了しました。
必要なポートは順次開放していき、追記するという形にさせて頂きます。

#2022/02/22追記
SSH接続をするためにポート(22番)を開放します。

```
sudo ufw allow 22/tcp

#状態を確認します。
sudo ufw status
#状態の結果
To          Action     From
22/tcp      ALLOW      Anywhere
22/tcp(v6)  ALLOW      Anywhere
```
S3互換ストレージ wasabi 使ってみました

wasabiというS3互換ストレージがあります。S3に比べて格安というのが売りです。激アツストレージということでHot。Hotと言えばwasabiということでwasabiみたいです。

ちなみに2022/02/20現在、wasabiの日本語ページもありますが
https://wasabi.com/ja/
まだ製作中のようで、リンク先が機能しません。

https://wasabi.com/

の英語ページからサインアップします。
クレジットカードなしで30日間の無料トライアルがあります。

S3と同様にバケットを作るところからスタートです。

Buckets> CreateBukectからバケットを作成。いろいろオプションはありますが、ージョンはap-northeast-1（tokyo）を設定。

リージョンの一覧はこちら（既に大阪もある）
https://wasabi.com/locations/

次にユーザを作ります。ユーザに割り当てるポリシーは「AmazonS3FullAccess」を与えておけばOK。APIアクセスできるオプションもあるのでそれも設定。

Access Keyのメニューからアクセスキーを取得。

S3互換なので、aws cli がそのまま使えます。

wasabi用にaws cliの設定を作ります。

```
aws configure --profile wasabi
```

アクセスキーとシークレットキーとデフォルトリージョンを聞かれるので、それで答えておく。

あとは普通にaws cliが使えるのですが、コマンドライン引数に必ずendpoint-urlを設定しないといけません。そうしないとawsコマンドはawsを見に行っちゃいます。

endpoint-urlは、東京リージョンの場合は以下になります。

```
https://s3.ap-northeast-1.wasabisys.com
```

まずはlsしてバケットが見れたら成功。

```
aws --profile wasabi s3 ls  --endpoint-url https://s3.ap-northeast-1.wasabisys.com
```

試しにファイルをアップロード

```
aws s3 --profile wasabi --endpoint-url https://s3.ap-northeast-1.wasabisys.com cp /mnt/c/Users/yugoy/Downloads/無題.png s3://***/
upload: ../mnt/c/Users/yugoy/Downloads/無題.png to s3://***/無題.png
```

日本語もそのままアップロードできました。

```
aws s3 --profile wasabi --endpoint-url https://s3.ap-northeast-1.wasabisys.com ls s3://***/
2022-02-20 11:51:37    1203708 無題.png
```

無事アップロードできています。


ダウンロードもできるかな。

```
aws s3 --profile wasabi --endpoint-url https://s3.ap-northeast-1.wasabisys.com cp s3://***/無題.png .
download: s3://***/無題.png to ./無題.png
```

できました。

次にpresignのURLが発行できるかどうかをためします。

```
$ aws s3 --profile wasabi --endpoint-url https://s3.ap-northeast-1.wasabisys.com presign s3://***/無題.png
https://s3.ap-northeast-1.wasabisys.com/***/%E7%84%A1%E9%A1%8C.png?AWSAccessKeyId=AQO34B4CCTI9M1SQ2M2N&Signature=AbwYjrBcIIQ8TMnWvQlonAAfgQk%3D&Expires=1645329357
```

presignのURLも発行されました。Expiresのデフォルトは1時間のようです。日本語ファイル名もURLエンコードされた形でURLに変換されています。

ファイルのアップロード、ダウンロード、期間限定公開の3つくらいができれば、ほぼS3と同じように使えるので一旦はS3と同様に使えるといっていいでしょう。

S3とのパフォーマンスに関してはwasabiが公開しています。
https://wasabi.com/wp-content/uploads/2019/12/Performance-Benchmark-Report-Nov-2019.pdf
当然速いからこそ公開しています。

速くて安いので全部これでいいじゃないかと思うのですがもっとちやほやされていてもいいと思います。
Synology　DS218J　Redmine立ち上げ(DOCKER)

SynologyのNASのバージョンＵＰすると、パッケージマネージャからRedmineが消えてしまいました。

# DOCKER-COMPOSEの立ち上げ


```docker-compose.yml

version: '3.8'
services:
  redmine:
    image: redmine
    container_name: redmine
    ports:
      - 8080:3000
    volumes:
      - ./data/plugins:/usr/src/redmine/plugins
      - ./data/themes:/usr/src/redmine/public/themes
    environment:
      REDMINE_DB_MYSQL: redmine-db
      REDMINE_DB_PASSWORD: redmine
    depends_on:
      - redmine-db
    restart: always
    
  redmine-db:
    image: mariadb
    container_name: redmine-db
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: redmine
      MYSQL_DATABASE: redmine
    volumes:
      - ./data/db:/var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    restart: always
```
Ubuntu Server 20.04.3 LTS 構築#15 セキュリティ設定7-2(マルウェア対策)

実施日:2022/02/14～2022/02/20

<<今回の内容>>
･maldetの自動化
･maldet実行時のエラー

#･maldetの自動化
maldetはcron.daily内でcronで自動でマルウェアの検知をしてくれるように設定がされていますが
freshclamとclamscanをシェルスクリプトで自動で実行するように設定しています。
maldetもそのタイミングで行われるように設定しました。

①conf.maldet内のcron動作を停止

```
cron_daily_scan="1"をcron_daily_scan="0"
```

②シェルスクリプト内にmaldetコマンドを追記しました。

```
#アップデートの確認
maldet -u \
#最新バージョンの確認
maldet -d \
#スキャン開始
maldet -a / \
```

#･maldet実行時のエラー
上記を実行しました。どの部分も正常に動作していましたので、メールを確認しました。
mailコマンドで対象のメール番号を入力。
clamscanの検知部分が表示されていません。
ls -lコマンドでログファイルの在処を検索しても表示されません。
隔離ディレクトリを確認すると、ログファイルが隔離されていました。
誤検知されてしまいました。何故、隔離されてしまったかは不明です。
対象のログファイルは前日にファイルの内容量が多すぎて、メールにて表示が出来なくなってしまったため、
元ログファイルからコピーして作成したものになります。元ログファイルの中を空にしてリネームして再度スクリプトを
実行したところ元ログファイルは隔離されませんでした。このままの状態にし、次回のスクリプト実行時の結果を確認します。
~~万が一、隔離されてしまった場合はconf.maldet内の除外項目に追記してみます。~~
GCEインスタンスからZOOMに参加できる構成を確認

興味本位でGoogle Compute EngineでZOOMに参加できる構成を確認しました。

# 動作確認した構成

マシンタイプ: e2-standard-4 (4vCPU, 16GBメモリ)
CPU プラットフォーム: Intel Broadwell
OS: Windows Server 2022 Datacenter

- リージョンは住んでいる大阪にしました。遠いとミーティングのレイテンシが気になりそうです。
- OSをWindowsにしたのはRDP経由でChromeの拡張機能からサクッと接続できるからです。
- 2022 Datacenterにしたのは、2012を使ったら重すぎて使い物にならなかったためです。
    - 2012に搭載のIEはセキュリティの設定から、初めはネットに繋がらないので面倒です。
    - 2022ではEdge(ほぼChrome）が搭載されていて、ZOOMもブラウザから使えました。
- メモリは4GBでやった時にフリーズして使い物にならなかったので、奮発して16GBにしておきました。


# セットアップ等


こちらの方法を参考にしましょう

https://qiita.com/taai/items/bea1eeea5cebf3a46f73

## プリエンティブの設定方法
ただし、上記の記事での”プリエンティブ”という箇所は現時点では探すことができませんでした。

（*管理*→*可用性ポリシー*を”スポット”にしたら自動的に”プリエンティブ”が適用されているのを確認できました。）


![スクリーンショット 2022-02-20 20.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/770be7e7-c9df-ee0d-8e38-2874bd88b344.png)


これでも1時間19円程度です。安いものですね。

# Edge/ZOOM Windowsクライアント経由の動作確認

EdgeでZOOMミーティングに参加できることが確認できました。
そして、RDPクライアントを切断しても、ZOOMミーティングにも残り続けることが確認できました。
また、ZOOM Windowsクライアント経由でも動作確認しました。

なお、ChromeのRDPクライアントを使っている場合、ミーティングID等はCtrl+Vでマックからペーストできます。



# ユースケース


- ZOOMミーティングのホストを自動化する

現在、多くのズーム会議のホストは人間がやっていますが、GCEインスタンス上から操作ができることは何か有用なことに使えるのではないかと思います。
もしホストの役割や、書き起こしなどを自動化できれば、同じことを人間に時給払ってやってもらうよりも、19円/hの利用料を考えればペイできると思われます。

ここは今後何かしら考えてみますが、面白いことができそうです。


- インスタンスの画面を一括でZOOMで共有する

The more the merrier (みんなでやればもっと楽しい)ので、みんなでグラフィカルな何かを見ながらアイデアを出し合うとか、便利なんじゃないでしょうか？
（今の所具体例が思いつきませんが）





# Future Work

WindowsでなくLinuxで同様のことができたら便利なので、次回はLinuxでできるかどうか検証してみようと思います。
CloudWatchアラームごとにSNS通知メッセージをカスタマイズする。

#はじめに
こんにちは、山田です。
今回は、CloudWatchアラームごとにSNSの通知メッセージを変更する方法を記載していきます。

#構成図
全体構成図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/030f8604-8938-dde1-8f1d-4e2114e065bb.png)
CloudWatchアラームは2つ作成します。
SNSトピックに関しては、LamndaのトリガーになるものとLambdaの送信先になるものの2つ作成します。

#SNSトピックの作成
SNSトピックを2つ作成します。
1つはLambdaのトリガーになるもので、1つはLambdaの送信先になるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/bb2aa222-7685-ec76-386f-d210cc8c479a.png)

#CloudWatchアラームの作成
CloudWatchアラームを2つ作成します。
作成したアラームごとに、通知メッセージをカスタマイズしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/8b9b0676-586d-49ed-cf62-a2013f04f843.png)

SNSトピックは2つとも、`to_lamnbda`を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/20f00341-6180-f5c9-6c05-98fd9c237f77.png)

#Lambda関数の作成
Lambda関数を、`Python 3.9`で作成します。

```python
import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('sns')

    TOPIC_ARN = 'arn:aws:sns:ap-northeast-1:804052945400:send_message'  //送信先SNSトピック指定
    
    msg = json.dumps(event['Records'][0]['Sns']['Subject'])  //SNSのイベント取得
    
    if "test1" in msg:  //SNSのイベントにtest1の文字が含まれている場合の処理
        subject = 'test1です'
        message = 'test1です'
    elif "test2" in msg:  //SNSのイベントにtest2の文字が含まれている場合の処理
        subject = 'test2です'
        message = 'test2です'
    
    response = client.publish(
        TopicArn = TOPIC_ARN,  //SNSトピック
        Message = message,  //本文
        Subject = subject  //件名
    )
    return response
```

先ほど作成したSNSトピックをLambdaのトリガー、送信先として設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/cae4be55-8096-ad88-8c7b-14016aa34be3.png)

#動作確認
CloudWatchアラームをそれぞれ、アラーム状態にして通知されるメッセージが異なることを確認します。

test1をアラーム状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/e22f6896-a99e-14d0-648b-c3cb2060277c.png)

通知メッセージを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/d977ffab-745e-b1e8-b57b-5085e34697da.png)

test2をアラーム状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/1ef79d65-f054-a141-0bc7-f4fa2450abe6.png)

通知メッセージを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/8c8551cf-9d04-5c60-ce02-2193b55af124.png)

通知メッセージの内容が異なっていれば完了です！
novoc studio 面白そう

https://edu.watch.impress.co.jp/docs/news/1389352.html
ということで、面白そうだったのでサインアップしてみました。

>novoc studioでは、Web上のプログラミング環境上で、マルチプレイのゲームをプレイするPythonプログラムを作って、実行できる。Pythonの基本を理解していれば、プログラミング初学者でもチュートリアルに沿ってすぐにプログラミングゲームに参加できる。また、スキルの高いユーザーは、コンテストのような感覚で手軽にプログラミングスキルを競い合うことができる。

https://blockly.games/

や

https://codemonkey.jp/

のような、プログラミング初学者向けかと思ってましたが、結構骨太。

チュートリアルに従って

- 止まらずに1,000ステップ走り続けましょう
- 障害物にぶつからずに1,000ステップ走り続けましょう
- ハンターに捕まらないように5,000ステップ逃げ続けましょう

は運よくクリアできましたが、実戦を考えるとなかなか難しい。

- フィールド外に出ないこと、
- 障害物があった時の処理、
- そのうえでハンターとの位置関係の処理

を、どうするかを考えないと。
応用情報受験レポ


## 令和３年度秋試験を受けてきました

###　試験の体感
- 午前問題が思ってる以上に難しかった
- 午後問題は例年より簡単に感じるかもしれないです
- 午後問題は２、６、７、９ を選択しました


## 午前問題

これは王道中の王道で過去問道場が最強だと思います。
アカウントを登録すると過去の正答率が確認できるようになります。
各問題に <font color="Green">緑</font>、<font color="Gold">黄</font>、<font color="Red">赤</font>のチェックがつけられる。
　　　　　・　絶対間違えない　：　<font color="Green">緑</font>
　　　　　・　若干不安　：　<font color="Gold">黄</font>
　　　　　・　苦手　：　<font color="Red">赤</font>
　　　　　みたいに管理してました。

※ 直前2回分の試験からは出題されないので注意
　令和3年秋を受験した私の場合だと
　令和3年春と令和2年秋からは出題されないことになります。

今回の試験で感じたのですが、
過去問を覚えきっていれば大丈夫！なわけではなく
クロック周波数の計算方法、リーダーシップSL理論などの
選択問題で出てくる用語の意味もできる限り覚えておく方がいいですね。

当たり前と言えばそうかもしれませんが
午後は選択問題で分野が絞られている反面、午前は全範囲から出ますからね…



## 午後問題

まず何が得意かわからないと思うので、
3回分くらいを目安に全問題解いてみてください。
1のセキュリティは必修なので2〜11まで。

そしてそれぞれの得点率からなんとなく得意そうな問題を探します。
配点割合は非公開なので　正解数/問題数 みたいな計算でOKです。

点数高かった順で上から4つ以上選択して、次以降の過去問で解く問題をそれにします。
もし可能であれば、当日解ける問題の候補を6つくらい作っておくのをオススメします。
午後問ガチャでハズレを引く確率を下げるためと、
勉強する過程であまりに点数が伸びない場合の乗り換え対象にするためです。

過去問を繰り返す上で覚えないといけないことは
- 回答傾向
- 頻出テーマ
です。

## 選択問題のオススメは？

② 経営情報/事業戦略
　　個人的に投資信託を触り始めて、企業分析の過程でキャッシュフローとかSWOT分析の観点で銘柄を見たりしてたので好みで選択しました。
　　　ブランド戦略とかマーケティング問題がよく出るイメージ。

④ システムアーキテクチャ
　　いわゆる国語の問題。
　年度によってはハズレ年の可能性あり。
　　計算式さえ覚えておけば8割解けてしまう年度も過去にあった

⑥ データベース
　　後述しますが、解き始めるための前提知識が丸2日で手に入るのでコスパがいい。
　出る問題が決まっているのでなるべく早い段階で習得しておいて、実務や日々の練習で確度を上げておくのがなお良し。
　ER図とSQL分が書けるとそれだけで10点弱取れます。

⑦ 組込みシステム
　　これも国語の問題
　当日確認して簡単であれば解く。
　問題がアルゴリズム寄りな年と計算寄りな年がある。

⑨ プロジェクトマネジメント
　　現場でPM業務をしていなくても解ける。
　アジャイルに関する問題や、EVMが頻出されるイメージ
　　今年も出てましたがスクラムの問題がよく出ます。
 EVMだとラッキー問題。計算だけで半分取れます。


※ 得意な人、余裕がある人向け
⑤ ネットワーク
　　ネットワーク自体は範囲が広く、点数がすぐ出る科目ではないんですが
　　他の選択問題で必要な知識が身につくので、年度によっては必修の①を含む３つが回答の選択肢になることがあり得ます。

## 参考書籍、サイト等
#### 書籍

IPAだと問題と回答のみですが、
平成２２年度から最新問題までの解説が全てついてます。
[令和03年【秋期】応用情報技術者 パーフェクトラーニング過去問題集](www.amazon.co.jp/dp/4297121778)

28年度より前になるにつれ問題が難しくなっていきます。
選択問題が６問(必修　+ 選択5問）であることを含め、試験制度が違うので
回答速度アップや、解答傾向を掴むためのサンプルが多めに欲しい人はぜひ。

#### 参考サイト
・SQLZOO
・SQLBOLT
　　これを踏破し切ると、DBの午後問題を解くための最低限必要な知識が身に付きます。
 SELECT文とサブクエリの使い方がわかれば解ける年度が出てきます。

午後の問題ですが、各種選択問題のまとめをされているサイトです。
ここが個人的に物凄く助かりました。
[IT資格の歩き方](https://www.seplus.jp/it-exam-guide/guide/prep_4_ap_pm_thema_sc/)


午後問題解いた後とかは特にそうですが、
気分転換にyoutubeの解説チャンネルとかを見るとモチベは比較的維持しやすかったですね。
疲れる → 動画見る → 気になる → 調べる　みたいになってたので。

## あとがき
午前65 午後47で落ちてました...w
次回以降またチャレンジします
blenderで頬染めと影をつくる

### 参照先

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

### やりかた

#### 頂点ペイント

1. col2を作る
 
2. col2をすべて白にする
 
3. col2に影を作る
 
#### shader 

こんな感じ

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/cbe75bf2-f077-233a-f125-0477cf9d9f2e.png)

### driver

ローカルzで影と頬染めの強さの調節

- var / (-0.01)

- var / (-0.03)

ローカルxで影と頬染めの切り替え

- ceil(var)

### デモ!

![Blender_-_C__Users_Atsuya_Documents_Rem.blend_-2022-02-20-20-23-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/aa156037-970f-9e41-07ff-748966b72c27.gif)
tenable.io Web Application Scanningを使ってみました。

前回はtenable.ioを使ったAgent診断を実施してみましたので、今回はWeb Application Scanningを利用してみました。OWASPトップ10のリスクから脆弱なWebアプリのコンポーネントまで、Web AppScanningは包括的で正確な脆弱性スキャンを提供してもらえるようなので、早速試してみました。前回の記事はこちらか。

https://qiita.com/nw-engineer/items/482b7a1765e4b2a16fb9


## 1. 環境

- 診断対象：以前ご紹介したGuacamoleサーバ（1.4.0）
- OS：Centos7.9
- Kernel: 3.10.0-1160.53.1.el7.x86_64

## 2. 事前準備

tenable.io管理画面左上メニューからWeb App Scanning - Scanをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/3fa251da-d051-26d5-4717-9b72a0cfa8b7.png)

画面右上のCreate Scanをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/aa9d37fe-7448-c176-0301-0ee0f81bc0e1.png)

画面中央下左よりにある「Scan」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/3aedfbe2-6cb4-4157-5599-76f329e8f8a2.png)

Scan名の入力と、TATERGETSに対象のURLを入れて、Addボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/a9df8c22-4356-d5e8-adad-10ab34b3eeb2.png)

画面左にある「CREDENTIALS」をクリックし、画面中にある「Add Credensials」の＋
+マークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/1317b651-ee49-1cea-438e-4b5aa30e2430.png)

画面右側に下記のような画面が出てきますので、「Web Application Authentication」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/9e0b28a4-13c5-1439-9c0b-35fd74499d54.png)

画面が遷移新那須。名前とログインページ、パターンなど下記のように設定して「Save」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/2a3e7295-76b1-e2b5-c376-a7e53cb36f5e.png)

「Save＆Launch」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/b811662f-8c3c-15a7-e5bf-9e5949362d18.png)


## 2. Scan開始

しばらくするとScanが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/94cc230d-cfd7-3956-047e-21c81d1ed475.png)

ログを見てみると確かにスキャンされている事が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/38e0295f-7032-fe2a-df2f-3f379d1d913f.png)


## 3. 結果の確認

Agent診断同様に結果を確認する事が出来ます。それぞれの項目から状況を確認することが出来ますので、是正処置をしなければ施さなければならない事が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/495edf1d-e24b-935a-0390-020525df9962.png)
Laravel6の自作バリデータをプロバイダーに登録すると、:attributeが効かなくなる

#イントロダクション
最近、掌田津耶乃さんの本で勉強し始めましたが、青い方の本のとおりに、
１．バリデータを作成
２．プロバイダーに登録
すると、今まで使えていた「:attribute」が使えなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532969/91196a87-29cd-4299-e167-3ba5be1983cc.png)


これが問題のコード。

```
<?php

namespace App\Providers\Http\Validators;

use Illuminate\Support\ServiceProvider;

use App\Http\Validators\CustomValidators;

class CustomValidatorsProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        $validator = $this->app['validator'];
        $validator->resolver(function($translator, $data, $rules, $messages){
            return new CustomValidators($translator, $data, $rules, $messages);
        });
    }
}

```

このうち、

```
$validator->resolver(function($translator, $data, $rules, $messages){
            return new CustomValidators($translator, $data, $rules, $messages);
        });
```

の、第5引数に「$attributes」を設定すると、うまく表示されるようになりました。

```
$validator = $this->app['validator'];
        $validator->resolver(function($translator, $data, $rules, $messages, $attributes){
            return new CustomValidators($translator, $data, $rules, $messages, $attributes);
        });
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532969/7f254b73-aa7d-74b4-d477-dae8d4a3525a.png)


めでたし、めでたし。
Laravel6をインストールした時に出たエラーを解決しました。

Laravel8が出ていますが、サポート期間が長く、情報も多い為、Laravel6で開発を進めようとしました。

そしたらこんなエラーが

```
During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Illuminate\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in/Applications/MAMP/htdocs/blog/vendor/laravel/framework/src/Illuminate/Support/Collection.php:1277

```

1単語ずつ翻訳していくと **Illuminate\Support\Collection::offsetExists($key)** のキーワードが引っかかったので、このキーワードで検索
エラーの原因はPHPのバージョンの違いによるエラー
私のパソコンではPHPのバージョンを確認したら **PHP8.1** でした。

:::note
PHPのバージョンの確認方法
:::
```bash:Terminal
php -v
```

PHPのバージョンを **PHP7.4** にバージョンを下げたらLaravel6をインストールできました！

#バージョン変更手順
ついでにPHPのバージョンの変更(Mac)のやり方を書かせていただきます。

zshなら

```zsh:zsh
vim ~/.zshrc
```

bashなら

```bash:bash
vim ~/.bash_profile
```

vimエディターが開かれる

```vim:vim
export PATH="/usr/local/opt/php@8.1/sbin:$PATH"
export PATH="/usr/local/opt/php@8.1/bin:$PATH"
```

記述があったので@8.1を@7.4に変更

```vim:vim
export PATH="/usr/local/opt/php@7.4/sbin:$PATH"
export PATH="/usr/local/opt/php@7.4/bin:$PATH"
```

最後にPHPのバージョン確認

```bash:Terminal
php -v
```

これで **php7.4** に変更されていればバージョンの変更完了
Python3: GraphQL サーバーにアクセスする方法

こちらで作成した Graph QL サーバーにアクセスする方法です。
[Apollo Server の使い方](https://qiita.com/ekzemplaro/items/98aa688d329e526db516)

## プログラム

```py:graphql_client.py
#! /usr/bin/python
#
#	graphql_client.py
#
#					  Apr/15/2023
#
# ------------------------------------------------------------------
import  sys
import  requests
# ------------------------------------------------------------------
def file_to_str_proc(file_in):
	str_out = ""
	try:
		fp_in = open(file_in,encoding='utf-8')
		str_out = fp_in.read()
		fp_in.close()
	except Exception as ee:
		sys.stderr.write("*** error *** file_to_str_proc ***\n")
		sys.stderr.write(str (ee))
#
	return  str_out
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

file_json = sys.argv[1]
json_str = file_to_str_proc(file_json)
url="http://localhost:4000"
headers = {"Content-Type": "application/json"}
#
response = requests.post(url, headers=headers, data=json_str)
#
print(response.text)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

```js:query.json
{
 "query": "query { books { title author }}"
}
```

## 実行結果

```text
$ ./graphql_client.py query.json | jq
*** 開始 ***
*** 終了 ***
{
  "data": {
    "books": [
      {
        "title": "心",
        "author": "夏目漱石"
      },
      {
        "title": "舞姫",
        "author": "森鴎外"
      },
      {
        "title": "春",
        "author": "島崎藤村"
      }
    ]
  }
}
```

## 確認したバージョン

```text
$ python --version
Python 3.10.10
```
【iOS × SPM】Swift Package Manager で RxSwift インストールしてみた！

# 目的
Swift Package Manager でライブラリをインストールする手順を知ること
筆者の備忘録


# 流れ
①: XCode の Package Dependencies へ移動
②: ライブラリ(RxSwift)の GithubURL を入力する

# ①: XCode の Package Dependencies へ移動

「app → PROJECT → Package Dependencies → +」

<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/554c9f65-1187-8620-b3eb-998d569a55e4.png">



# ②: ライブラリ(RxSwift)の GithubURL を入力する

RxSwift の Githubページ にアクセスする
<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/5881d2ab-252a-4620-b587-f1f43f985f3a.png">

URL をコピー
(https://github.com/ReactiveX/RxSwift)
<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/343f5477-44aa-b3cd-de82-23119268a546.png">

貼り付け → 「Add Package」
<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/f8806ef4-89a6-f82a-6491-4e08311163d5.png">

必要な項目を選ぶ (筆者は RxCocoa, RxRelay, RxSwift を選択) → 「Add Package」
<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/82128ca1-a1c1-0910-7855-514e8ce69199.png">


# 結果
RxSwift のインストールを正常に行えた。👍
<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/7d915a6c-6692-37c6-2150-15765e696a7f.png">
Laravel9 に Voyager をインストール

Laravel9でいろいろ試し中。

Windows10
wsl2
Docker
Laravel 9.1.0

## 環境作成
https://www.inqsite.net/weblog/5006/

## Voyager インストール
参考

https://qiita.com/ryoooooo/items/dcf39d9fb45c29481d66

コンテナ内rootでBashを起動
プロジェクトディレクトリで

```
sail root-shell
```
こんてなにはいってから
```
composer require tcg/voyager

php artisan voyager:install --with-dummy
```
## 管理画面にログイン
[管理画面](http://localhost/admin/login)を開く。


email : admin@admin.com
password: password

でログイン。

## 日本語化
Laravelの設定ファイルを変更。
```config/app.php
'locale' => 'ja',
```

管理画面の右上メニューから
Profile →Edit My Profile→Locale を ja にセット

## インストールしてみて
画像が表示されていませんでした。
voyager.test下のファイルなので、ドメインに問題があるのでしょうか。

--with-dummy付きでインストールしたので、いくつかダミーデータが入っていました。
```config/app.php
'faker_locale' => 'ja_JP',
```
に変更してからインストールしたら、ダミーデータも日本語にるのかな。

とりあえずインストールはできたので、いろいろ試してみたいところです。
DBのchar型,varchar型,nchar型,nvarchar型について最低限まとめ

##■char型
・固定長の半角文字列
・指定された文字数よりも小さい文字列を格納した場合は、末尾に空白埋めされ指定された文字数で格納される
・例）システムで定義された固定長のコード値、郵便番号、etc、、

##■varchar型
・可変長の半角文字列
・指定された文字数よりも小さい文字列を格納した場合は、そのまま格納される
・例）個数、値段、etc、、

##■nchar型
・固定長の全角文字列
・指定された文字数よりも小さい文字列を格納した場合は、末尾に空白埋めされ指定された文字数で格納される

##■nvarchar型
・可変長の全角文字列
・指定された文字数よりも小さい文字列を格納した場合は、そのまま格納される
・例）日本人氏名、備考欄やメモに入力された内容、etc、、

##■文字格納時の容量について
・charはchar(100)で100文字確保したところに1文字しか入れない場合でも100文字分の容量を消費する
・varcharは可変的にスペースを変動させるため、varchar(100)に1文字しか入れない場合は1文字分の容量しか消費しない
SPDIFの受信

ネットで探すと以下のような参考になるページがあります。

https://bokunimo.net/bokunimowakaru/std-spdif.html

https://probe.hamazo.tv/e1742381.html

受信のロジックは以下のような方法が考えられます。

* データはBMCで1ビットを2パルスで送ってくる
* 1サンプルを32ビットのサブフレームでLRで64ビットの1フレームにしてる
* データは2パルス以上のH/L信号はなくフレームの先頭だけがHかLの長い3パルスの信号なので、そこを見つける
* 1秒間の先頭の数を数えるとサンプリング周波数が確認できる
* 先頭から32ビットのBMCのデータをデコードする
* 32ビットのサブフレームにはV,U,Cのそれぞれ1ビットの属性情報があり192フレームの1ブロックで一塊の24バイト(32bit x 6)のデータになる
* 属性情報のCデータにもサンプリング周波数が入っている

FPGAやCPLDで論理実装するときはなんか良い方法があるのかもしれません。売り物のIPもあるようです。

githubを探したらverilogのコードがありました。

https://github.com/hajime725/verilogSPDIFdecorder

ピンが足りなかったので減らして、MAX IIに焼いて試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3f22d0f8-5979-276f-ceda-d56962af8f24.png)

再生するとparityOKが1になるので、ちゃんと動いてそうです。

エラーは以下のようなケースが考えられる

* パリティが不正
* 1フレームが64bitじゃない
* ヘッダーが見つからない
* などなど
windowsでiverilog その129

# 概要
　
windowsでiverilogやってみた。
neosvrのlogixで作ったcpuをverilogで書いてみた。

# 参考にしたページ

https://qiita.com/ohisama@github/items/f3aeda815c031a431d5a

https://qiita.com/ohisama@github/items/1fc82e1babb470206541

# サンプルコード

```

module neos(input clk, input rst, output [7:0] outport);
	reg [7:0] a,
		b,
		c,
		pc;
	reg [11:0] mem[7:0];
	wire [11:0] code;
	wire [3:0] op;
	wire [7:0] opland;
	assign code = mem[pc];
	assign op = code[11:8];
	assign opland = code[7:0];
	assign outport = b;
	task init_ram;
	begin
		mem[0] <= 12'h2_00; //b = 0
		mem[1] <= 12'h3_64; //c = 100
		mem[2] <= 12'h4_00; //b++
		mem[3] <= 12'h6_00; //out
		mem[4] <= 12'h5_00; //c--
		mem[5] <= 12'h1_02; //if (c > 0) pc = 2
		mem[6] <= 12'h0_00; //
	end
	endtask
	task init_reg;
	begin
		a <= 8'h0;
		b <= 8'h0;
		c <= 8'h0;
		pc <= 8'h0;
	end
	endtask
	always @(posedge clk, negedge rst)
	begin
		if (!rst)
		begin
			init_ram;
			init_reg;
		end
		else
		begin
			case (op)
			4'h0://nop
			begin
			end
			4'h1://if (c > 0) pc = adr
			begin
				if (c > 0)
					pc = opland - 1;
			end
			4'h2://b = i
			begin
				b <= opland;
			end
			4'h3://c = i
			begin
				c <= opland;
			end
			4'h4://b = b + 1
			begin
				b <= b + 1;
			end
			4'h5://c = c - 1
			begin
				c <= c - 1;
			end
			4'h6://out
			begin
			end
			endcase
			pc = pc + 1;
		end
	end
	initial
	begin
		//$monitor("%d %d %d %d", a, b, c, pc);
	end
endmodule

module test;
	reg clk,
		rst;
	wire [7:0] outport;
	neos u(.clk(clk), .rst(rst), .outport(outport));
	initial
	begin
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#900
			$finish;
	end
	always
		#1
			clk = ~clk;
	initial
	begin
		$monitor("%d", outport);
	end
endmodule





```


以上。
ShapeableImageViewを使用して簡単に円形表示を行う方法

# はじめに
歴史のあるプロジェクトでは特に、円形のViewを表示したい時にDrawableを作って再現しているところも結構多いですよね。
確かにDrawableを作って適用しても綺麗に円形表示が可能ですが、気がついたら同じようなDrawableばかりが増えている、、、こんなことありませんか？
最近ではかなり浸透してきているマテリアルなUIを使用する事で、無駄なDrawableを作成する必要がなくなり、リソースも必要最低限となりすっきりして良いので、簡単にご紹介します。

# ShapeableImageView
円形表示にはShapeableImageViewを使用します。
まず、ShapeableImageViewをxmlに追加します。

```
<com.google.android.material.imageview.ShapeableImageView
   android:layout_width="50dp"
   android:layout_height="50dp"
   app:shapeAppearanceOverlay="@style/CircleShapeAppearance" />
```

次に、shapeAppearanceOverlayに設定されている、styleをstyles.xmlに定義します。

```
<style name="CircleShapeAppearance">
   <item name="cornerFamily">rounded</item>
   <item name="cornerSize">50%</item>
</style>
```

設定は以上になります、これだけで丸いViewを生成可能です。
基本的にDrawableを設定する場合と同じですが、ShapeableImageViewのサイズは全て同じサイズを設定する必要があります。
また、このShapeableImageViewを使用する為にはマテリアル系の設定が必要です、その点はご注意ください。
親のstyleにマテリアルを設定できない場合は[こちら](https://qiita.com/YuukiYoshida/items/97a71a36403b89e114dc)が参考になります。

# さいごに
ShapeableImageViewを使用する事で、無駄なDrawableを生成する必要がなく、設定も使い回す事が可能なので、実装コストも抑えることができます。
長い間運用しているプロジェクトで且つ、担当者がころころ変わっていたりすると、リソースはかなりゴミだらけになっていたりするので、後の負債にならないようこの辺りは手を抜かず対応していきたいところですね。
Python リスト内包表記

今年の目標でPythonを学び、案件獲得を挙げているので、そのための学習をおこなっているので、コードベースになるが経過を残していこうと思う。

## リスト内包表記
今回は、リスト内包表記を載せようと思います。

以下のように計算式とfor句を用いて記述します。

```python
variable = [計算式 for 要素 in イテレータ if 条件式]
```

使用例

```python
list_a = (1, 2, 3, 'a', 4, 'b')
list_b = [x*2 for x in list_a if type(x) == int]
list_c = [x for x in range(100) if x % 7 == 0]
```

また関数を用いて記述していくことも可能です。

```python
def demo_func(n):
    for x in range(2, n):
        if n % x == 0:
            return True
    return False

list_a = [demo_func(x) for x in range(100) if demo_func(x) == False]
```

## まとめ

for句や条件式が絡むと結構見辛くなることもしばしばありますが、こういった記述を行うことで、見ずらさを解消することができるので便利に思いました。
ブランチ、ファイルの最新のコミットのSHA-1を取得する

# 本記事について

差分ビルド、コンパイルするときに、
ブランチの最新のハッシュはビルドバージョンとして、
ファイルの最新のハッシュは更新されたかどうかの判別のために
利用することができる。

また、コミットのSHA-1を使えば同時に更新されたファイルのグループ化もできる(必要になるケースは思いついてない)

## 対象ブランチのコミットのSHA-1の取得

```
$ git rev-parse main
e8415612eaef02bb3db904c6174e39e41ed85188

$ git rev-parse --short main
e841561
```

https://git-scm.com/docs/git-rev-parse

現在のブランチのハッシュ取る時は HEAD。

```
$ git rev-parse HEAD
b17a0cb305a0d7b02464cca0661db6fd50e70632
```

## 対象ファイルの最新のコミットのSHA-1の取得

```
$ git log --pretty=format:"%H" -1 views/items/index.ejs
f7d8c91ba5f316b770c561b1d4138bde890442b8
$ git log --pretty=format:"%h" -1 views/items/index.ejs
f7d8c91
```

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7

|オプション|役割|
|:--|:--|
|--pertty=format:"%H"|SHA-1だけ表示|
|-1|1つまで。最新のみ取得|
|views/items/index.ejs|対象ファイルのパス書くとこ|

# まとめ


ファイルのSHA256を計算するのとどっちがよいかとかはケースバイケースだと思う。
骨までしゃぶりつくす「ぷよぷよプログラミング」(4/4） 

# この記事の目的
　この記事ではソースコードを読んで冗長そうであったり、間違いがあるのではないか、と感じた点を記述していきます。初回に述べた目的の内容からは外れた番外編的な内容となります。

初回

https://qiita.com/KennyKTA/items/360aa62aa7f7ba084a2f


## おそらく不要なコード

```pyuyoimage.js
this.batankyuImage.style.top = -this.batankyuImage.height + 'px';
```
目的はthis.batankyuImage.style.topの初期化に見えるのですが、this.batankyuImage.heightがundefinedです。実行時はundefinedが適当な数値となって動作はするようです。

ちなみに後のコードで

```puyoimage.js
this.batankyuImage.style.top = y + 'px';
```

とあり、ここで正常な値が上書きされる形でプログラムの動作が担保されているように見えます。

## おそらく間違えているコメント

```player.js
x: 2, // 中心ぷよの位置: 左から2列目
```

実際に動作させてみると、左から３列目から中心ぷよは登場します。配列上のインデックス（もしくは当該中心ぷよのleft）が2なのでコメントとしては少し不適切かなと思いました。（もしくは、若干ミスリーディングなコメントを記述して実際の動作を学習者に確認させるための策かもしれませんね。）
Windows10でPowershell 2を利用する方法【バージョン確認方法】

# 0. はじめに

PowerShellスクリプトは非常に便利なため、業務で利用されている方もいるかと思います。
ただ、開発環境で利用しているPCはwindows 10などだが、実際に実装する環境はWindows Serverで、PowerShell 2が実装されているということもあるかと思います。
今回は開発環境のPowerShellバージョンを2に変更する方法を説明します。

# 1. バージョン確認方法

最初にバージョン確認方法を紹介します。
以下のコマンドで参照できます。

> $PSVersionTable

私の開発環境(Windows 10)で実行すると以下のようになります。

```
PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.1320
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1320
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```
また、バージョン情報だけ表示する場合は以下のようにします。

```
PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  1320
```

# 2. バージョン変更方法

PowerShell 2に変更するには、以下のコマンドを実行します。

> powershell -v 2

実行し、$PSVersionTableで確認すると変更されていることがわかります。

```
PS C:\> powershell -v 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\> $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.9151
BuildVersion                   6.1.7600.16385
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
```

# Compress-Archiveコマンドレットで確認

例えばPowershell 5(4からかもしれません)からはCompress-Archiveというファイルをzip圧縮するコマンドレットが追加されました。これをpowershel実行しようとすると、以下のようにエラーとなります。
開発環境からでも、実際に実装する環境で動かせるか確認するのに便利ですね。

```
PS C:\> powershell -v 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\> Compress-Archive
Compress-Archive : 用語 'Compress-Archive' は、コマンドレット、関数、スクリプト ファイル、または操作可
能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場
合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:17
+ Compress-Archive <<<<
    + CategoryInfo          : ObjectNotFound: (Compress-Archive:String) []、CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```
Web3.0学習日記 #1

# 前置き
僕は社会人1年目のWebエンジニアです。ブロックチェーン関係の会社に就職したため、徐々にブロックチェーンへの興味が強くなり、半年前くらいから本格的に学習を始めました。

この記事の目的は、**良かった教材を皆さんにシェアすること**と、**学習仲間を増やすこと**です。DApp開発者はかなり希少で情報も少ないので、コミュニティ内でお互い情報共有し、良かった情報を公開したら役に立つのではないかなと思います。

# コミュニティの紹介
CryptoCocoAというコミュニティで主に活動しているので、まだ立ち上げたばかりですが、もし良かったらご参加ください！
https://discord.gg/NVHsJdbdCc

コンセプトは、「恐れるな！」です。新領域はまだまだ未開拓で、皆知らないことばかりです。なんでも質問して、誰でも答えて、間違いがあれば気づいた人が教えてあげ、一緒にこの領域を楽しみましょう:)

### コミュニティの活動内容
- 情報共有
- 質疑応答
- 勉強会・もくもく会
- 勉強&研究開発: コミュニティメンバーで開発し、そこで得た知見を外部に発信したり、サービス自体を外部に公開します。まだ開発チームはありませんが、何か勉強のために開発してみたいのがあれば、一緒に開発してみてはどうでしょうか。ウォレット開発とか!?

宣伝はこのくらいにして、僕が初期に勉強してよかったものをご紹介していきます。

# ブロックチェーンの基礎を学習

### マスタリング・ビットコイン（コンサイス版）
マスタリング・ビットコインの要点がまとめられている書籍です。元となる[マスタリング・ビットコイン](https://bitcoinbook.info/wp-content/translations/ja/book.pdf)はPDFで無料で読めます。マスタリングビットコインは分厚いので、他の学習をしていて、気になったら該当の章をきちんと読んでいます。
https://www.amazon.co.jp/dp/4757103751/ref=cm_sw_r_tw_dp_032WP3G7N6ZHS67S86Y1?_encoding=UTF8&psc=1

### マスタリング・イーサリアム
この書籍は第5章のウォレットまで読み進めています。この章を読んで、ウォレットの実装に興味を持ったので、現在勉強しながらウォレットを自作中です（[Github - blockchain-wallet](https://github.com/show-coco/blockchain-wallet)）
https://www.amazon.co.jp/dp/4873118964/ref=cm_sw_r_tw_dp_E9ZRB3Z43YZ6WF00GCVH

# DApp開発を学習
ブロックチェーンの基礎を学んだら、DApp開発の学習に入りました。使ったのは以下の教材です。

### NFT開発
Solidityの基礎をNFT開発とともに学習できます。
https://cryptozombies.io/jp/course/

### Truffle Tutorial
Truffle + web3.js + Ganacheを使用したDApp開発のチュートリアルです。
http://trufflesuite.com/tutorial/

### Hardhat Tutorial
Hardhat + ethers.js + Waffleを使用したDApp開発のチュートリアルです。
https://rahulsethuram.medium.com/the-new-solidity-dev-stack-buidler-ethers-waffle-typescript-tutorial-f07917de48ae

### NFTマーケットプレイス開発
実際はこのチュートリアルではなく、実務でオークション形式のNFTマーケットプレースを開発しましたが、基本は同じような内容です。
https://dev.to/dabit3/the-complete-guide-to-full-stack-ethereum-development-3j13?signin=true

### NFTチケット開発（有料）
イベントへの入場チケットなどに使用されるNFTチケットを開発します。
https://egghead.io/courses/build-an-nft-based-ticketing-system-1a2f387c

# コミュニティに参加

### 和組
開発者からビジネスサイドまで、合計4000人程のメンバーが参加していて、活発に質疑応答などが行われています。
https://twitter.com/wagumiDAO?s=20

### CryptoCocoA
自分で作ったコミュニティで、主に開発者が集まっています。勉強会の開催や情報共有などを行なっています。
https://discord.gg/NVHsJdbdCc

# DeFi・DAO・NFTのキャッチアップ
いろんな記事を読んだり、YoutubeをみたりでDeFi, DAO, NFT周りについて勉強しました。参考になった記事などは以下のリンクの「Blockchain Input」というテーブルにまとめてあるので、気になるものがあったら読んでみてください。
https://encouraging-cut-b5c.notion.site/Input-4552c9e4a77842e5875a8b24a4186f98

# 色々開発

### DEXを開発
動機は忘れましたが、DEXを開発しました。AMMを実装しようと思っていますが、興味がいろんなところに移るため、いまだに開発は進んでいません。
https://github.com/show-coco/ropi-swap

### NFT所有によるDiscordチャンネル制限を実装
特定のNFTを持っていたら、Discordでロールが付与されて、プライベートチャンネルに入室できるという機能です。詳細は以下の記事で書いています。
https://zenn.dev/ropitaru/articles/997b04d486830c

### ブロックチェーンウォレットを開発
今はビットコインアドレスの生成までは実装できました。現在はHDウォレットを実装しようと奮闘中です。実装レイヤーとしては、楕円曲線暗号やハッシュ関数はライブラリを使用して、それより上のレイヤーを実装しています。
https://github.com/show-coco/blockchain-wallet

# 終わりに
現在の学習状況はこのような感じでした。僕の感覚としては、DApp開発の全体像がわかってきたという感じです。

次のステップとしてはこんな感じだと思います。
- Solidityをしっかり学習
- ブロックチェーンの細かい仕組みを理解する
- 勉強&研究開発を進めてどんどんアウトプットする
- TwitterでWeb3界隈の観察

また良い学習教材や面白い情報があれば日記にまとめていきます！Twitterではその都度参考になったものなど投稿しているので、もしよかったらフォロー宜しくお願いします🙏
Twitter: [@show_clements](https://twitter.com/show_clements)
Vue.jsでグローバルなCSSを読み込む

Vue.jsでグローバルなCSSを読み込む方法です。
Vue.jsのバージョンは `3.2.31` で確認しています。

# main.tsファイルから読み込む
まずはグローバルに読み込みたいCSSファイルを用意します。

```css:src/assets/style/common.css
/* 下記は例です */
.hoge {
  background-color: red;
}
```

`main.ts` ファイルでインポートします。

```ts:src/main.ts
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './assets/style/common.css'; // ここを追加

createApp(App).use(store).use(router).mount('#app');
```

これでコンポーネント内で `.hoge` クラスが使用可能になります。

# sass-loaderから読み込む
sass-loaderでSCSSを使用する場合は、`additionalData` を設定することでグローバルなSCSSを読み込むことができます。

sass-loaderのv11.0.0以降はwebpackのバージョン5以上しか対応していないようです。
まずはwebpackのバージョンを確認して、バージョン5以下の場合はsass-loaderのv10をインストールしましょう。

```sh
# webpackのバージョンを確認
npm list webpack
```

```sh
# sass-loaderのv10をインストール
npm install --save-dev sass sass-loader@10
```

グローバルに読み込みたいSCSSファイルを用意します。

```scss:src/assets/scss/common.scss
/* 下記は例です */
.hoge {
  background-color: red;
}
```

プロジェクト直下の `vue.config.js` ファイルに下記設定を追加します。
ファイルがない場合は作成します。

```js:vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      scss: {
        additionalData:
          `@import "@/assets/scss/common.scss";`
      }
    },
  },
};
```

これでコンポーネント内で `.hoge` クラスが使用可能になります。

ちなみに、複数ファイルを読み込みたい場合は下記のようにします。

```js:vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      scss: {
        additionalData:
          `@import "@/assets/scss/common.scss"; \
          @import "@/assets/scss/variables.scss"; \
          @import "@/assets/scss/mixin.scss";`
      }
    },
  },
};
```
【JavaScript】Promiseと非同期処理について

こんばんは。今回はJavaScriptの非同期処理について書いていきます。


##非同期処理とは？
非同期処理とは、ある処理を実行をしている際に、他のタスクが別の処理を実行できる方式をいいます。
DBから値をとってくるなど、他の処理と比べて時間がかかる処理があった場合、この非同期処理の仕組みがないと、DBから値をとってくる処理が終わるまで待っていなければなりません。
非同期処理の場合、DBから値をとってくる処理を行ってるとき、別のイベントが発生すると、一旦DB処理を中断してそのイベントを処理します。そしてまたDB処理を再開します。

しかし非同期処理にも不便な点があります。例えばDBから値を取得し、そのデータをreturnする関数があったとします。普通にこの関数を実行すると、DBから値を取得する処理が行われている間にreturnが実行され、正常に値が返されなくなってしまいます。
そのような問題を解決するための方法はいくつかありますが、今回はPromiseを使った方法をご紹介します。


##非同期処理を順番に実行する
非同期処理を順番に実行する場合、Promiseを使うと便利です。
特に順番に行いたい処理がたくさんある場合便利です。次のように書きます。　
![スクリーンショット 2022-02-20 174449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677365/c1786e20-fe78-2b80-dba7-a5d4490f51d3.png)

関数の中にPromiseをreturnするプログラムを書きます。この関数自体はPromiseオブジェクトを返します。Promiseオブジェクトには以下の3つの状態があります。
・pending：処理が実行中である
・fulfilled：処理が正常に終了した
・rejected：処理の実行に失敗した

処理が成功した場合、resolveメソッドが呼ばれ、次の処理(asyncfunc("wwwww"))に移ります。この時、呼び出す次の関数の直前にreturnをつけます。引数resには直前に呼び出した関数の戻り値が入ります。
処理が失敗した場合、rejectメソッドが呼ばれ、.catch()部分に処理が移ります。
このようにPromiseを用いて直列的に処理を実行することができます。


##Promiseのその他の機能
Promiseの発展的な機能をいくつかご紹介します。

・Promise.allメソッド
引数で渡された関数がすべて成功した場合に次のthen()に移ります。一つでも失敗すると失敗コールバックが呼び出されます。引数resには実行結果の配列が入っています。
![スクリーンショット 2022-02-20 180857.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677365/35ba01b7-9499-c8b6-61dd-b21fe8cabf97.png)
・Promise.allSettledメソッド
Promise.allとは違い、いずれかの処理が失敗(reject)しても、then()に移ります。

・Promise.raceメソッド
引数で渡された関数のどれか一つが終了した時点で次のthen()に移ります。処理が終了する時間により結果が異なる可能性があります。　　　　　　　　　

以上です。