OmniAICreator/Qiita-1.07M huggingface dataset:
EMLファイルPDF変換 - EMLファイルをPDFにバッチ変換するための最良のツール

<p><b>概要：</b>このブログでは、EMLファイルPDF変換のベストアプローチに焦点を当てています。これで、EMLを添付ファイル付きのPDFに簡単に変換できます。</p>

<p>PDFは、データを保存するための信頼できるファイル形式です。 PDFファイルの優れている点は、ソフトウェア、ハードウェア、またはオペレーティングシステムに依存しません。 PDFファイルはどのプラットフォームでも開くことができます。また、誰でも、どこでも共有できます。 PDFファイルにデータを保存することが最善であると信じている人はたくさんいます。また、PDFファイルにデータを保存しようとしている人もたくさんいます。それらを使用している場合、検索はここで終了します。</p>

<p>複数のEMLメッセージをPDFファイルに変換する方法を知ってください。方法は即座にそして迅速です。それでは、始めましょう。</p>

<p><b>参考文献</b></p>
<p>EMLファイルを添付ファイル付きのPDFに変換する方法は？</p>
<p>EMLをPDFに変換するのに最適なアプリケーション。</p>
<p>EMLメッセージをPDFファイルに変更する方法は？</p>

<p><b>一般的なユーザークエリ：</b>デスクトップには何千ものEMLファイルがあります。それらのEMLメッセージをPDFに変換したいと思います。主な懸念事項は、EMLメッセージ用に単一のPDFファイルが必要なことです。これどうやってするの？</p>

<p><b>専門家のヒント：</b>EMLメッセージをPDFに変換するのは、数回クリックするプロセスです。 <a href="https://www.mailsware.com/jp/eml-converter.html"><b>Mailsware EMLコンバーター</b></a>を利用して、作業を自動的に行ってください。</p>

<h2>EMLファイルPDF変換のステップバイステップガイドを参照してください</h2>
<p>1.Windowsマシンにソフトウェアをインストールして起動します。</p>
<p>2. [フォルダの選択]タブをクリックして、ソフトウェアパネルに.emlファイルをロードします。</p>
<p>3.ツールはすべてのフォルダを自動的にロードします。必要なフォルダを確認してプレビューを取得してください。</p>
<p>4. [変換]タブに移動します。保存オプションとしてPDFを選択します。</p>
<p>5.宛先パスとファイル命名オプションを入力します。</p>
<p>6.すべての情報が提供されたら、[変換]ボタンをクリックします。</p>

<p>デモ版を使用してプロセスを完了したことに注意してください。無料トライアルでは、ユーザーは25の.emlメッセージをPDFファイルに変換できます。すべての.emlメッセージをPDFに変換するためのライセンスキーをアクティブにします。</p>

<h2>あなたが正確に探しているソリューション</h2>
<p>EMLファイルPDF変換は信頼できるプラットフォームです。これにより、ユーザーは必要な複数のEMLメッセージをPDFに変換できます。これは、EMLファイルを添付ファイル付きのPDFに変換する高度なアルゴリズムを使用して設計されています。 EMLファイルPDF変換ツールは、MSOutlookのすべてのエディションをサポートします。ツールは、タスク全体でフォーマットとプロパティを維持します。変換前にメールをチェックするプレビューオプションを提供します。インターフェースは直感的でシンプルです。すべてのタイプのユーザーが、EMLメッセージをPDFに変換するためのユーティリティにアクセスできます。</p>

<h3>自分で試してみてください</h3>
<p>EMLファイルPDF変換ツールの無料デモ版は、すべてのWindowsプラットフォームで利用できます。ユーザーはそれをダウンロードして、25のEMLメッセージをPDFファイルに変換できます。すべてのEMLファイルをPDF形式に変換するには、ライセンス版を購入してください。</p>

<h3>結論</h3>
<p>EMLメッセージのPDFファイルへの変換は簡単なプロセスです。数回クリックするだけで、EMLファイルをPDFとして保存できます。上記のブログでは、EMLをPDFに一括で変換する最良の方法を説明しました。すべてのタイプのユーザーは、正確な結果を得るためにこの方法に従うことができます。 EML to PDF Converterをダウンロードして、手間のかからないタスクを楽しんでください。</p>
ウェブサイト作成用備忘録・２２号：ローディングアニメーションの疑問点について

今回も他のwebサイトのソースコードを読み取っている時に感じた疑問点について備忘録として記録しておこうと思います。

webページを開いた時、画像や動画を読み込んでからwebページの表示を行う為に、ローディングアニメーションを実装しているサイトが多いのですが、自分が見つけたソースコードはこのような内容でした。

```html

<script>

const loaded = () => {
//ローディングアニメーションを終了させる処理
}

// 全てのコンテンツを読み込んだらloadedを発火させる
window.addEventListener("DOMContentLoaded", loaded, false);

// 10秒経過したらloadedを発火させる
settimeout(loaded, 10000);

</script>

```

当時の自分はローディングアニメーションの事を

**ページ内のコンテンツが全て読み込まれた状態でないと閲覧者にサイト内のコンテンツをしっかりアピールできない大掛かりなサイトに実装するもの**

だと思っていました。

なので、
**10秒経過したら読み込みが終わっていなくてもコンテンツを表示するなら、初めからローディングアニメーションは必要ないのでは？**
という疑問が浮かびました。

そこで、ローディングアニメーションが実装される背景から調べてみる事で以下の事が分かってきました。

+ ページの読み込みに時間がかかり、真っ白なページがずっと表示されていると直帰率が高まる（閲覧者が不安になる）
+ **具体的にはページの読み込み時間が3秒を超えたあたりで閲覧者の直帰率が大幅に上昇する**
+ ページの読み込みの間にローディングアニメーションを表示することで現在のページの状態を閲覧者に伝える事で直帰を防ぐ効果がある（閲覧者の不安を解消する）

更に、「待ち時間」そのものについての資料も調べてみる事にしました。
調べた中でwebサイトとローディングアニメーションに関係する内容は下記6つです

+ **何もしないで過ごす待ち時間は長く感じる**
    + スマホやPCのディスプレイでwebサイトを開くときは、ディスプレイがwebサイトに占有されている為、読み込み時間の間は閲覧者は何もすることが無い状態になっている
+ **本来のサービスの前後に付随する待ち時間は長く感じる**
    + webサイトのコンテンツが本来のサービスだとすると、ウェブサイトの読み込み時間は本来のサービスの前に付随している待ち時間になる
+ **不安があると待ち時間は長く感じる**
    + webサイトを開いた時に画面が真っ白のまま待たされると、閲覧者はwebサイトがこのまま表示されなかったらどうしようと不安になる
+ **不確定な待ち時間は長く感じる**
    + 仮にローディングアニメーションを設定していたとしても、現在の読み込みの状況が分からないままずっと待たされる様な場合は余計に待ち時間が長く感じられる
+ **理由が分からない待ち時間は長く感じる**
    + webサイトを開いた時に画面が真っ白のまま待たされると、今ページを読み込んでいるから表示されないのか、自分の端末や電波の調子が悪いのから表示されないのか等の原因が分からない
+ **独りで待つときは待ち時間が長く感じる**
    + スマホやPCでwebサイトを開く時は高確率で一人の時だと考えられる

↓参考記事

https://news.mynavi.jp/techplus/article/20180122-573640/

https://www.tsukubabank.co.jp/corporate/info/monthlyreport/pdf/2017/04/201704_09.pdf

上記の内容を調べた事でローディングアニメーションの役割は


+ **ページの読み込み時間が3秒を超える前に、ローディングアニメーションを挟むことで閲覧者の直帰率にブレーキをかける**
+ **ページの読み込みを行っているという事をわかりやすく閲覧者に伝える事で、閲覧者の待ち時間の理由を明確にする**
+ **ページ内のコンテンツが全て読み込んでから表示する事で閲覧者にサイト内のコンテンツをしっかりアピールする**

という事なんだと思うようになりました。

（※更に、ローディングアニメーション中に閲覧者がミニゲームで遊べるようにしたり、今の読み込み状況を表示する機能を付ければ更に心理的に効果的なローディングアニメーションになるとは思いますが、そこまでやるならページの読み込み時間を短縮する方に力を入れた方が良いような気もします）

（※ちなみに、自分が実際にローディングアニメーションを実装しようとした時、予めローディングアニメーションを表示している状態から始まるwebサイトで、ローディングが終了したらローディングアニメーションを終了させる処理を実行させたい時、コンテンツの読み込みを始めてからローディングの終了用関数を発火させるまでの読み込み中にエラーが発生した場合、コンテンツの読み込みが終わらずにローディング画面から進まない不具合が発生した事があったので、万が一不具合が発生した時の為に、一定のタイミングで強制的にローディングを切り上げる機能はあった方が安全なのかもしれません）
【Vue.js】ディレクティブ（v-if、v-for）について

# ディレクティブとは
**ディレクティブ**とは、**Vue.js**における独自の属性（```v-○○```）のことで、これを使うことでDOM操作ができる。
これによりDOM操作の記述を減らすことができ、開発スピードが向上する。
**v-if**と**v-for**について紹介する。

## v-if
真偽値に基づいて要素の表示・非表示を切り替える。

```html:html
<div id="app">
    <p v-if="displayFlag">Hello!!</p>
</div>
```
```javascript:Vue
const sample = {
	data() {
		return {
			displayFlag: true,
		};
	},
};
Vue.createApp(sample).mount("#app");
```
上記のサンプルでは```displayFlag=true```の場合に「Hello!!」が表示され、```false```の場合は非表示になる。

## v-for
Vue.jsでのfor文。配列などのデータを表示させるために使う。```v-for = <変数> in <配列名>```のような形で書くことができる。

```html:html
<div id="app">
    <ul>
        <li v-for="image in images">
            <img :src="image.src">
        </li>
    </ul>
</div>
```

```javascript:Vue
const sample = {
	data() {
		return {
			images: [
				{ src: "image1.png" },
				{ src: "image2.png" },
			],
		};
	},
};
Vue.createApp(sample).mount("#app");
```
mybaits-spring-boot-starter-testの使い方

# はじめに
MyBatis-Spring-Boot-Starter-Testを使ってMapperクラスのテストコードを書いてみたので備忘録を残します。

# 概要
Spring BootでMyBatisを使用しており、MyBatisにより自動生成されたMapperクラスのテストを行う場合は、SpringのDIコンテナを使ってテストを行う必要があります。しかし、単に`@SpringBootTest`アノテーション等でSpring Bootの機能を有効にするだけでは、Mapperクラスのテストに不要なAutoConfigureクラスが有効になったり、不要なBeanが生成されたりしてしまいます。
MyBatis-Spring-Boot-Starter-Testを使用することで、このような問題を回避できます。

# 環境
- Java
- Junit5
- SpringBoot
- MyBatis
- Testcontainers
- Maven
- Windows10

# 依存関係
MyBatis-Spring-Boot-Starter-Testを使用するためには、以下の依存関係を`<dependencies>`に追加してください。

```xml
<dependencies>
	...
	<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter-test</artifactId>
		<version>2.2.0</version>
		<scope>test</scope>
	</dependency>
	...
</dependencies>
```

その他、Spring BootやMyBatisを利用するための依存関係も適宜追加してください。

# テストコードの記述方法

MyBatis-Spring-Boot-Starter-Testを有効にするための`@MybatisTest`アノテーションをテストクラスに付与することで、MyBatis関連のAutoConfigureクラスのみが有効になり、MapperクラスのみがDIコンテナにBean登録されるようになります。

```java
@MybatisTest // MyBatis-Spring-Boot-Starter-Testの有効化
class UserMapperTest {

	@Autowired
	private UserMapper mapper; // Mapper実装クラスがインジェクション可能になる

	@Test
	void testUserMapper () {
		/* ... */
	}
}
```

また、`@MybatisTest`アノテーションの`includeFilters`パラメータや`excludeFilters`パラメータを指定することで、DIコンテナに登録されるBeanを追加したり減らしたりすることも可能です。

```java
@MybatisTest(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
		classes = { UserService.class, AppConfig.class }))
		// Mapperクラス以外にも、指定したBeanやJavaConfigもDIコンテナに登録されるよう指定
class UserDaoTest {

	@Autowired
	private UserDao dao;

	@Autowired
	private UserService dao; // 指定したBeanもインジェクション可能になる

	@Autowired
	private PasswordEncoder encoder; // 指定したJavaConfigで定義されているBeanもインジェクション可能になる

	/* ... */
	}
}
```

Beanのフィルタリングについては、[このページ](https://www.baeldung.com/spring-componentscan-filter-type)等を参照してください。
クラスによるフィルタリング以外に、アノテーションの有無によるフィルタリングや正規表現によるフィルタリングも存在します。

# 参考
- http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/index.html
- https://qiita.com/kazuki43zoo/items/ea79e206d7c2e990e478#mybatistestmybatis-spring-boot-starter-test%E3%81%AE%E5%88%A9%E7%94%A8

ご意見・ご指摘等あればコメントいただけると幸いです。
Spring + lombokでコンストラクタインジェクションする際にBean名を指定する方法

# はじめに
Lombokの`@AllArgsConstructor`アノテーションや`@RequiredArgsConstructor`アノテーションを使用してコンストラクタインジェクションを行う際に、Springの`@Qualifier`アノテーションでインジェクトするBean名を明示する方法について解説します。
すでに同様の内容を解説しているページがいくつかありますが、設定ファイルの配置位置や設定内容自体についての解説はあまり無く、追加で調べる必要があったので備忘録として残しておきます。

# 概要
コンストラクタインジェクションでインジェクトするBean名を明示したい場合は、以下のようにコンストラクタの引数に`@Qualifier`アノテーションを付与する必要があります。

```java:MyController.java
@Controller
public class MyController {
	private final MyService service;
	public MyController(@Qualifier("myServiceImpl")MyService service) {
		this.service = service;
	}
}
```

しかし、Lombokの`@AllArgsConstructor`アノテーションや`@RequiredArgsConstructor`アノテーションを使用してコンストラクタを自動生成する場合、そのままでは引数に`@Qualifier`アノテーションは付与されません。
このような場合、`lombok.config`ファイルを作成することで、自動生成されるコンストラクタに`@Qualifier`アノテーションが付与されるよう設定することができます。

# lombok.configファイルの作成・配置
`lombok.config`ファイルは、Lombokの挙動をデフォルトから変更したい場合に作成する設定ファイルです。通常は、プロジェクトルートやソースフォルダのルートに`lombok.config`ファイルを作成します。
`lombok.config`ファイルによる設定内容は、`lombok.config`ファイルを配置したディレクトリ内と、そのサブディレクトリ内に存在するソースコードに適用されます。また、サブディレクトリ内に別の`lombok.config`ファイルを配置することで、そのディレクトリとそのサブディレクトリに対して適用される設定を変更することも可能です。

# lombok.configファイルの記述
今回は、設定項目のひとつである`lombok.copyableAnnotations`プロパティに設定を行います。

```:lombok.config
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
```

このプロパティは、フィールドに付与されるアノテーションのうち、そのフィールドに対するセッターやコンストラクタの引数にも付与しておきたいアノテーションを指定するための項目です。このプロパティには複数のアノテーションを追加できるよう、`=`ではなく`+=`でアノテーションを指定します。
このプロパティに`@Qualifier`アノテーションのFQCNである`org.springframework.beans.factory.annotation.Qualifier`を追加しておくと、インジェクト対象のフィールドに`@Qualifier`アノテーションを付与しておけば、Lombokにより生成されるコンストラクタの引数にも同じ内容の`@Qualifier`アノテーションが付与されます。

```java:MyController.java（delombok前）
@RequiredArgsConstructor
@Controller
public class MyController {
	/* インジェクト対象フィールドに@Qualifierアノテーションを付与しておく */
	@Qualifier("myServiceImpl")
	private final MyService service;
}
```
```java:MyController.java（delombok後）
@Controller
public class MyController {
	@Qualifier("myServiceImpl")
	private final MyService service;

	/* 生成されたコンストラクタの引数にも@Qualifierアノテーションが付与された */
	@java.lang.SuppressWarnings("all")
	public MyController(@Qualifier("myServiceImpl") final MyService service) {
		this.service = service;
	}
}
```

# 参考
- https://projectlombok.org/features/configuration
- https://qiita.com/hrkt/items/e7c67c4d4de53bcb613b
- https://stackoverflow.com/questions/38549657/is-it-possible-to-add-qualifiers-in-requiredargsconstructoronconstructor

ご意見・ご指摘等あればコメントいただけると幸いです。
【Linux】logrotateを使ってログローテションの管理

### 経緯
検証環境でアプリケーションログのログローテーションが設定されていなくてログファイルが肥大化していたので設定を確認

以下のコマンドでサイズの大きいファイルを確認

```
sudo du -x -h / | sort -r -h |
```

### 関連記事
[任意のログをlogrotateを使って管理する](https://qiita.com/Esfahan/items/a8058f1eb593170855a1)


### 設定ファイルの確認

```
/etc/
├── logrotate.conf # メインの設定ファイル
├── logrotate.d # 各サービスごとの設定ファイル
│   ├── dracut
│   ├── iscsiuiolog
│   ├── mcollective
│   ├── mysql
│   ├── syslog
│   ├── yum

```


### 設定例

```
/var/log/sample-service/sample.log { # 対象のログファイル
    compress           # 圧縮する
    delaycompress      # ログの圧縮作業を次回のローテーション時まで遅らせる。compressと共に指定
    daily              # 毎日ローテートする
    rotate 7           # 7世代分古いログを残す
    size 0             # ログファイルが指定したファイルサイズ以上になったらローテーションする
    ifempty            # ログファイルが空でもローテーションする
    missingok          # ログファイルがなくてもエラーを出さない
    create             # ローテーション後に空のログファイルを新規作成。
}

```

### まとめ
環境をたち上げた後など、容量不足などが発生した場合などはログローテションの設定がされているかなどを確認してみましょう。
【Doctrine】QueryBuilderでデータを取得したい

QueryBuilderでの生成に苦戦したときのメモ書きです。
それでもよければ参考程度に。。。

##Doctrine
ORM（Object Relational Mapping）ライブラリの1つで、
SQLを書かずオブジェクト指向でデータベースの操作ができる優れものです！

##データを取得してみる
#### シンプルにやるとこんなの
```sql:customer.sql
SELECT *
FROM dtb_customer
WHERE age = 20;
```
```php:CustomerRepository.php
$query = $this->createQueryBuilder('c')
            ->where('c.age = :adult')
            ->setParameter('adult', 20)
            ->getQuery();
$customer = $query->getResult();
```

#### 抽出条件を追加
```sql:customer.sql
SELECT *
FROM dtb_customer
WHERE age = 20
AND id >= 10;
```
```php:CustomerRepository.php
$query = $this->createQueryBuilder('c')
            ->where('c.age = :adult')
            ->andWhere('c.id >= :userid')
            ->setParameter('adult', 20)
            ->setParameter('userid', 10)
            ->getQuery();
$customer = $query->getResult();
```

#### IN句
```sql:customer.sql
SELECT *
FROM dtb_customer
WHERE id IN(2, 5);
```
```php:CustomerRepository.php
$query = $this->createQueryBuilder('c')
            ->where('c.age IN(:adult1, :adult2'))
            ->setParameter('adult1', 2)
            ->setParameter('adult2', 5)
            ->getQuery();
$customer = $query->getResult();
```

#### 変数にパラメータを格納したいとき
```sql:customer.sql
SELECT *
FROM dtb_customer
WHERE age = 20;
```
```php:CustomerRepository.php
$adult_age = 20;
$query = $this->createQueryBuilder('c')
            ->where('c.age = :adult')
            ->setParameter('adult', $adult_age)
            ->setParameter('email_mobile', $username)
            ->getQuery();
$customer = $query->getResult();
```

#### ORDER BY
```sql:customer.sql
SELECT *
FROM dtb_customer
ORDER BY age ASC;
```
```php:CustomerRepository.php
$adult_age = 20;
$query = $this->createQueryBuilder('c')
            ->orderBy('c.age', 'ASC');
            ->getQuery();
$customer = $query->getResult();
```

#### JOIN part1
```sql:customer.sql
SELECT *
FROM dtb_customer AS c
INNER JOIN dtb_order AS o
ON c.id = o.customer_id;
```
```php:CustomerRepository.php
$query = $this->createQueryBuilder('c')
            ->leftJoin('c.dtb_order o');
            ->getQuery();
$customer = $query->getResult();
```
Doctrineくんはdtb_customerとdtb_orderが関連していることを知っているため、
JOINの条件を自動的に追加してくれます。
同様の使い方でrightJoin()やinnerJoin()なんかもできます。

#### JOIN part2
```sql:customer.sql
SELECT *
FROM dtb_customer
INNER JOIN dtb_order
ON c.id = 10;
```
```php:CustomerRepository.php
$query = $this->createQueryBuilder('c')
            ->leftJoin('c.dtb_order o ON c.id = 10');
            ->getQuery();
$customer = $query->getResult();
```
独自の結合条件を使いたいならこう。

#### LIMIT
```sql:customer.sql
SELECT *
FROM dtb_customer
ORDER BY age ASC
LIMIT 5;
```
```php:CustomerRepository.php
$adult_age = 20;
$query = $this->createQueryBuilder('c')
            ->orderBy('c.age', 'ASC')
            ->limit(5);
            ->getQuery();
$customer = $query->getResult();
```
情報処理安全確保支援士に合格するためのアウトプット（3/n）

#IPS（Intrusion Prevention System：侵入防御システム）
IDSの上位版のような形として使われることも多い。
従来のNIDSをインライン接続することで、NIDSの検知およびより強力な防御を備えている。

##IPSの接続方法
- プロミスキャストモード
    - 通信自体は垂れ流し（NIDSと同等）
- インラインモード
    - NWの間に入って、一旦通信をキャッチする
    - その分防御できるけど、NWへの影響はでかい

##主な機能
- 検知
- 遮断
- 方向問わずのポリシー設定
    - IN、OUT問わずに設定可能
- VLANでの仮想IPS
    - IPS１台でカバーできるよっていう

##構成例
- DMZに配置
    - NIDSと同様の設置。
    - インラインで接続できるので防御機能は高いが、全部チェックすると影響も大きい
- 各拠点間の接続ポイントに設置
    - WANとLANの間にIPSをインラインで接続
    - 双方向で防御できるが、拠点ごとに必要なので高価にはなる
- 特定システムへの経路上でIPSを利用
    - 重要なシステムに関してはレベルを高くしたい時とか
    - １台で防御したいけど全部のNWを見てると負荷が高いから、せめてそのセグメントだけでも・・とか

##IPSならIDSの問題を解決できるの？
- そんなことはなく、IDSと同じような問題は起こり得る
    - 誤検知、アプリケーションの脆弱性をついた攻撃、暗号化パケット
    - 防御機能と可用性のバランスが大事
        - 守ってばっかじゃ点は取れないが、点を取りに行けばカウンターで点を取られることもある

##設置における考慮事項
- NW量
    - 既に分かってるならいいが、不明であれば測定するか、機器スペックだけで導入するか
    - スペックだけの場合、実量との乖離があると影響が大きいのでそこは要注意
    - 既に測定済みの場合でも、ピーク時とオフ時で全然値が違うだろうから要注意
        - 例えば月末月初やイベントごとで動画配信がある場合（今だとビデオ会議も）
        - ツールを変えた途端ものすごい量に跳ね上がることもあるので、ソフトウェアにも要注意
- 性能、構成
    - 十分な処理能力を有したものを使おう
        - けど、オーバースペックは勿体ない（１人で1,000人規模の超高級品を使うとか）
    - 冗長化、負荷分散、設備、障害対策を考えよう
        - 結局、機器なので故障などにより動かないこともある
        - 電源などの障害もあり得る
        - [SNMP](https://e-words.jp/w/SNMP.html)での監視なども余裕があれば

##結局どんなんがいいのさ
実務のことも考えると、IDSだIPSだと、結局どれ使えばいいんじゃっていうのがある。
一概にコレ、ということにもいかないので、機能・価格・性能・相性など色々あると思うが、
代表的な所でピックアップされているのはこちらですかね。

- [【IDS・IPS】おすすめ製品15選！無料・有料を徹底比較](https://cybersecurity-jp.com/column/10714])
    - Mcfee、Symantec、Fortigate、L2Blockerなどなど・・・
AWS CLIのプロファイル一覧を出力したい

aws cliで設定したprofileの一覧を出力するコマンドをいつも忘れてしまうので自分用の覚書です。

```shell
$ aws configure list-profiles
default
profile1
profile2
profile3
```

※この機能は、AWS CLI バージョン 2 でのみ使用できます。

## 参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html
Shifterについて(ワードプレスをMovableTypeみたいに使う)

MovableTypeとワードプレスの中で、何が良いかはどんな目的が最優先なのかにより、変わると思っています。
しかし、ワードプレスで構築した後に、MovableTypeのように、セキュリティーや性能面で固定ページとして提供したくなる場合もあります。
その場合には、Shifterを利用して良いかと思いました。
SSH、SFTPなどは使えないし、会員利用が中心になる場合は、よろしくないものではありますが、
検索されやすいと言う面やメディアページとしてのサービス提供のみであれば、良いかと思いました。

||MovableType|MovableType Host|Shifter|
|:-----------|:-----------|------------:|:------------:|
|年間| 99000円       | 27,500円        | 33,151円         |

金額の参照は大まかにすると上記のものにはなりますが、Shifterは簡易Basic認証がある最低金額を選びました。
Basic認証が無い場合はもっと安くなります。

時期により、サービス料金も変わると思うので、リンクを記載します。

MovableTypeサービス料金
https://www.sixapart.jp/movabletype/license/
MovableType Hostサービス料金
https://movabletype.net/price/
Shifterサービス料金
https://www.getshifter.io/ja/pricing/
勾配降下法を可視化したい件2（z=x^2+y^2の場合）

#背景：損失関数をコードを通して理解したい
先日は「$y=x^2$」を使って簡単な勾配降下法の可視化を行いました（[勾配降下法を可視化したい件](https://qiita.com/tan0ry0shiny/items/112a28aef0d5913337f0)）。1変数の勾配降下法についての可視化は出来たので、2変数や多変数についての勾配降下法についても同じように実装したいと思います。

#目的：勾配降下法を一般化していきながら理解したい
2変数や多変数についての勾配降下法の実装を通して、誤差逆伝播の流れを実感します。

#方法：2変数関数で勾配降下法を行う
$z=x^2+y^2$ を使って可視化します。前回は微分した時の傾きが0の所で勾配降下法を終えましたが、今回は任意の回数行う事にします。

#結果：3次元空間の勾配降下法の変化を描写
前回アニメーションが出来たので今回も作ろうと思いましたが、エラーが出て出来ませんでした。結局、出力の変位をプロットするだけで終わってしまいました。というか、参考にしたコードそのままです。これはこれで初めの方が学習による変化の大きさが見れました。それが以下の図になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/7609abe7-e99d-fa1e-77e8-6f617bc94c44.png)

コードはこちらです。
勾配降下法.ipynb
リンク先の目次「勾配降下法（$z=x^2+y^2$）」にあります。

https://colab.research.google.com/drive/1C66slaXeigWwYqH0LnaN58jKrYC6JrSU?usp=sharing

#課題：一般化した勾配降下法の実装
1. 損失関数や評価関数、重みの更新についての理解をコードを通して深めたい。
1. 3次元のアニメーションを動画に残す方法が分かりませんでした。先日、やった方法は視点を変える動画で保存できましたが、今回は、点が動くものです。位置情報はリストに入れているのですが、3次元でプロットする際にイテレーション出来ないと怒られた気がします。出来る方がいらっしゃったらアドバイスして頂ければ嬉しいです！

#あとがき：改めて気付いた事やこれからしたい事などを書きます。非難はやめて頂けると幸いです。建設的な意見は大歓迎です。
1. 　損失関数を使う意味を改めて考えました。簡単には正解が有って、予測との差を明確にするためにあると考えました。では、今回やっているのはどんな意味があるのか考えます。今回は損失関数を使いません。基になる関数があって、初期値が決められています。初期値での傾きと学習率を掛けて重みを更新しています。どのように更新するかというと傾きが０になるように更新します。傾きが０ということは微小の変化率が０ということです。<br>　ここからは僕の考えです。つまりこの微小の変化率０という状態は安定という事になるんじゃないかと思います。モデルもこの状態を目指して学習します。つまり、学習とはモデルの出力を安定させるための処理を言うと考えます。そして、これは正解を出すのとは別の話です。たしかに正解を教師データとして学習するのですが、それが学習したことのないデータに対して有効かは分からないんじゃないかと考えます。それは学習したことのない未知のデータがそれまでに学習したデータとどの程度似ているのかに拠るんだと考えます。その辺は前処理なんかの領域かなと思います。例えば、正規化や対数変換なんかがその良い例の様な気がします。<br>　脱線しました。つまり、誤差逆伝播法はモデルが学習するための過程で、学習はモデルの出力が安定するための処理で具体的には勾配降下法を使っているんだと考えます。一般的には学習の過程に、活性化関数、損失関数、最適化アルゴリズムなどが使われますが、今後、実装していきながら理解していければと考えています。もちろん、社会実装に応用出来れば更に良しです。

#関連
[勾配降下法を可視化したい件](https://qiita.com/tan0ry0shiny/items/112a28aef0d5913337f0)

#試したいこと
[確率的勾配降下法のメリットについて考えてみた@koshian2](https://qiita.com/koshian2/items/028c457880c0ec576e27)
確率的勾配降下法を図示して実装してくださっています。
BigQueryでシャーディングされたテーブルの一覧が欲しい

BigQueryにおいて日付などでシャーディングされたテーブル群に対して、具体的にどの日付のテーブルがその中にあるのか知りたいときがあります。
この時は以下のクエリを実行することでシャーディングの中にあるテーブルを一覧として得ることができます。


```sql
SELECT * 
FROM project_name.dataset_name.__TABLES__
WHERE starts_with(table_id, '<table_prefix>') 
ORDER BY table_id
```
このクエリはもちろんシャーディングのみならず一般のテーブルのprefixに応用できます。

得られるクエリ結果のスキーマは以下のようになります：

|field name        |type   |
|------------------|-------|
|project_id        |STRING |
|dataset_id        |STRING |
|table_id          |STRING |
|creation_time     |INTEGER|
|last_modified_time|INTEGER|
|row_count         |INTEGER|
|size_bytes        |INTEGER|
|type              |INTEGER|

## 参考文献
- [How do I list tables in Google BigQuery that match a certain name?](https://stackoverflow.com/questions/41027005/how-do-i-list-tables-in-google-bigquery-that-match-a-certain-name)
Wordpress カスタマイズに当たって確認して良いこと

#１．マイナーリリース更新を自動化する。
Wordpress カスタマイズや運営時にセキュリティーのため、最低限マイナーリリースは自動更新するように設定した方が良いと思います。
その方法としては、wp-config.phpにて次のように必要に応じて、変数を設定して頂ければよいかと思います。

```
# マイナーリリースのコア更新を有効化(おすすめ)
define('WP_AUTO_UPDATE_CORE','minor');

# マイナーリリース、メジャーリリースを含むすべてのコア更新を有効化
define('WP_AUTO_UPDATE_CORE',true);

# すべてのコア更新を無効化
define('WP_AUTO_UPDATE_CORE',false);
```

#２．プラグインの使用前に確認すること。
同じく、wp-config.phpにてデバックを有効化して、プラグインのインストール後のバグ内容を確認して見てください。

```
define(WP_DEBUG", true);
```

その後、プラグインをチェックしてくれるPlugin-Check プラグインを利用して確認を行ってください。

[Plugin-Check プラグイン](https://wordpress.org/plugins/plugincheck/)

#３．テーマ作成を標準で合わせて行う。
テーマ作成に当たって、正しく作る方法を確認してから、作成をやりましょう。
- Theme Revies Handbook
https://make.wordpress.org/themes/handbook/review/

作られたテーマに関してのチェックをしてくれるプラグインもあるので、活用してみてください。
- Theme check plugin
https://wordpress.org/plugins/theme-check/
カメラロールの写真をUIImageで上書き保存するミニマムなサンプル

ライブラリの写真をPHAssetで取得して、UIImageで更新保存するサンプルです。
ググっても意外と出てこない模様なので。

## ちゃんと読もう
https://developer.apple.com/documentation/photokit/phasset/1624061-requestcontenteditinginput

## Apple 公式のサンプル
https://developer.apple.com/documentation/photokit/browsing_and_modifying_photo_albums/

## 環境
Xcode 13.0

## ミニマムなサンプルコード
```swift
import UIKit
import Photos

private lazy var formatIdentifier = Bundle.main.bundleIdentifier!
private let formatVersion = "1.0"

private func update(asset: PHAsset, toPhoto: UIImage, completionHandler: @escaping ((Bool, Error?) -> Void)) {
    let options = PHContentEditingInputRequestOptions()
    options.canHandleAdjustmentData = { _ in
        return true
    }
    asset.requestContentEditingInput(with: options) { input, info in
        guard let input = input else { fatalError("Can't get the content-editing input: \(info)") }
        
        DispatchQueue.global(qos: .userInitiated).async {
            let output = PHContentEditingOutput(contentEditingInput: input)
            let adjustmentData = PHAdjustmentData(formatIdentifier:formatIdentifier, formatVersion:formatVersion, data: "my app".data(using: .utf8)!)
            output.adjustmentData = adjustmentData
            
            let jpg = toPhoto.jpegData(compressionQuality: 0.9)
            
            do {
                try jpg?.write(to: output.renderedContentURL)
            } catch let error {
                fatalError("Can't save image to PHContentEditingOutput.renderedContentURL : \(error).")
            }
            
            PHPhotoLibrary.shared().performChanges {
                let request = PHAssetChangeRequest(for: asset)
                request.contentEditingOutput = output
                
            } completionHandler: { success, error in
                completionHandler(success, error)
            }
        }
    }
}

```

## なんとかしたい
- renderedContentURLに吐き出せるのがなぜかjpg一択？
GitHubActionsでプルリクエストのReviewersとAssigneesを自動で設定させる


## はじめに

過去、以下の記事で調べたことを応用して、使えそうな汎用GitHubActionsを実際に作ってみるというのをやってみました。

https://qiita.com/yusuke-sasaki/items/74de0928b9f311ebe3e7

## 今回作ったもの

プルリクエストを作成後にReviewersとAssigneeを逐次設定するのですが、わたしのプロジェクトにおいて毎回同じ設定なので自動化できないかなというところで、以下の2つのActionを組み合わせました。

https://github.com/marketplace/actions/auto-assign-action

https://github.com/technote-space/assign-author

## 動作

以下の図のようにプルリクエストをAさんが作成すると、Assigneesに自動で作成者のAさん本人と
事前に設定していた yus-sasaki(私) というメンバーがReviewersとAssigneesの両方に設定されます。
※設定はReviewersとAssigneesに対して個別にできます。以下の例は両方に私を設定した感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/17e50698-9549-1a0b-8906-ebd144691f37.png)

## 作成したymlファイル

設定ファイルとAction本体とで2つファイルがあります。今回は以下のように配置してます。
.githubフォルダ
・workflowsフォルダ - autoassignees.yml
・auto_assign_myteams.yml

アクション本体ですが、2つのActionを呼んでいるのみです。

```yml:autoassignees.yml
name: 'Auto Assign'
on:
  pull_request:
    types: [opened, ready_for_review]
jobs:
  add-reviews:
    runs-on: ubuntu-latest
    steps:
      - name: Assignees and Reviewers to PR
        uses: kentaro-m/auto-assign-action@v1.2.1
        with:
          repo-token: "${{ secrets.GITHUB_TOKEN }}"
          configuration-path: ".github/auto_assign_myteams.yml"
      - name: Assign author to PR
        uses: technote-space/assign-author@v1
```

以下が Reviewers と Assignee の設定になります。
`reviewers:`と`assignees:`にGithubのメンバを追加すれば、そのメンバが設定されるようになります。
他の項目は基本いじらなくていいと思います。 

```yml:auto_assign_myteams.yml
# プルリクエスト作成者は別途Assigneesに追加されるようになっています。

# プルリクエストにReviewersを追加するには true に設定します。
addReviewers: true

# プルリクエストにAssigneesを追加する場合は true に設定します。
addAssignees: true

# Reviewerに設定するメンバを追加します。
reviewers:
  - yus-sasaki

# Reviewersに追加するメンバ数を指定できます。
# 追加メンバより設定数が少ない場合、ランダムで追加されます。
# 0に設定すると全てのReviewersのメンバが追加されます。
numberOfReviewers: 0

# Assigneesrに設定するメンバを追加します。
assignees:
  - yus-sasaki

# Assigneessに追加するメンバ数を指定できます。
# 追加メンバより設定数が少ない場合、ランダムで追加されます。
# 0に設定すると全てのAssigneesのメンバが追加されます。
numberOfAssignees: 0
```

## おわり

結構いろんな方が便利なGithubActionsを作成してくれてますので、さらにそれらをプロジェクトのかたちに応用していけば小さな手間をどんどん自動化でき、より効率化できそうですね。
Qlik Sense Desktopの無料トライアル利用開始手順

Qlik Sense Desktopは、個人ユーザーのローカルPCに導入して利用する製品となっています。(Windowsのみ対応）Qlik Sense Desktopは上記のQlik Sense Businessの無料トライアルを登録後、Qlik Sense Business上のサイトからダウンロード・利用の開始を行えます。以下、その手順をご説明します。

# Qlik Sense Businessの無料トライアル開始
Qlik Sense Desktopは、Qlik Sense Businessの無料トライアルの利用に含まれています。まずは、以下の記事を参考にQlik Sense Businessの無料トライアルを開始します。

https://qiita.com/masaki_hamano/items/2d12863a31928fbff840

# Qlik Sense Desktopのダウンロード
1. Qlik Sense Businessのトップ画面のハブ上で、画面右上のユーザープロファイルのアイコンをクリックし、[プロファイル設定]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/682758fa-6007-81d8-dc7c-07ca46486ae0.png)

1. [ツール]タブ上で、Qlik Sense Desktopの[ダウンロード]ボタンをクリックすると、Qlik Sense Desktopのインストールファイルをダウンロードすることができます。当ファイルを実行してインストールを完了してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/37936f62-39d7-a049-73d0-45c2c987ad4b.png)

# Qlik Sense Desktopのインストール
1. ダウンロードしたファイルを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/4a693ffd-b9c6-774b-f254-737cdd9a82e5.png)

1. [Install]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/9a06a541-cdc7-d096-7a88-fe6adc3561a6.png)

1. [I accept the license agreement]のチェックボックスをオンにし、[Next]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/67a6ef7c-1778-2d13-a673-e3ae9b34e70d.png)

1. [Next]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/05c5e777-d1bd-c61c-dfb8-80f31f6461e6.png)

1. [I accept the license agreement]のチェックボックスをオンにし、[INSTALL]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/92fc42ae-5f37-28b3-1417-d3bffcab41a8.png)

1. インストールが開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/d15f3d1d-ccfb-dc9a-7a1b-3382564d342a.png)

1. インストールが完了したことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/71aeb26d-242a-f375-beef-83c4169ed601.png)

# Qlik Sense Desktopの認証
Qlik Sense Desktopの利用を開始するには、登録が完了しているQlik Sense Businessに対して認証を行う必要があります。

1. インストール完了後、Qlik Sense Businessの画面に戻り、[認証]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/9c712008-4941-9ffb-1d14-cfa481a48e75.png)

1. [開く]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/1044bd40-efb1-11b2-3a21-a92e4e120a24.png)

1. テナントのURLが登録されますので、登録されたURLをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/1b185e74-1e65-3109-3e89-6dfc20ca7cd5.png)

1. Qlik Sense Businessの登録時に利用したメールアドレス、パスワードでログオンを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/c3971b80-20cf-5769-5ebb-80cf14a4a8ff.png)

1. Qlik Sense Desktopのトップ画面が開きますので、ここから製品の利用を開始することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/fc2af5e8-290a-155a-6466-bf7045bc9522.png)
デザインを大幅に改善する4つの原則

# デザインを大幅に改善する4つの原則
個人開発でも仕事でも、デザインを決めるときがありますよね。
しかし、この記事を見ている人は、私も含めエンジニアなので、デザイナーほど知識は必要ありません。
そこで、この記事で紹介する4つの原則を覚えておくだけで、デザインを大幅に改善できます。
また、4つの原則を知っておくだけで、デザイナーと少し距離が近くなります。

## 説明で利用する画像
![説明で利用する画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401623/b3136afc-a09c-e5e8-a921-f504f9eff152.png)
### 画像の説明
- 緑の1番大きな文字で店名が書かれている。
- 店名の下に、赤文字でサブタイトルが書かれている。
- 店名とサブタイトルの下に、メニューが載っている。
- 背景色が緑、文字が白なのは、カテゴリー名である。
- カテゴリーの下に、赤文字でメニュー名が載っている。
- 4つのカテゴリーがあり、1つのカテゴリーに4つのメニューがある

## 近接
**近接とは、関係あるもの同士を近づけることです。**
上記の画像で、以下2つの空白を比べてください。
・メニュー名同士の空白
・カテゴリー間の空白
明らかに、メニュー名同士の空白が小さく、カテゴリー間の空白が大きいですよね。
このように関係あるもの同士を近づけて、関係ないもの同士を遠ざけることで、関係性が理解しやすくなり、人が見やすくなります。
実際に、このメニュー表は英語なのに、カテゴリーのかたまりが一目でわかると思います。

## 整列
**整列とは、各要素に一体感を持たせることです。**
整列で大切なポイントは、見えない線で整えることです。
メニュー名と金額を見てください。
メニュー名は左揃えになっており、金額は右揃えになっています。
このように、見えない線で整えることで、一体感を生み出せます。
これはデザインだけではなく、あの有名な日体大の集団行動でも、列が見えない線でピシッと整っていることで、一体感を生み出しています。

## 反復
**反復は、ある特定のかたまりを繰り返して使うことです。**
この画像では、1つのカテゴリーと4つのメニュー名を1つの**かたまり**として見てください。
そうすると、このかたまりが4回繰り返されていることがわかります。
このように、特定のかたまりを反復することで、一貫性を生み出せます。

## コントラスト
**コントラストとは、デザインの強弱をつけることです。**
この画像では、店名の文字が大きくなっています。
このように、デザインに強弱をつけることで、伝えたいことを強調できます。
例えば、「デザインを**大幅に**改善する4つの原則」のように、一部を太文字にすることで、「大幅に」を強調できます。
広告などでは、「無料」「30%割引!」のような文字が強調されていることがよくあります。

## まとめ
これらの4つの原則を意識するだけで、最低限、綺麗なデザインには見えます。
実際、私は画面デザインの草案を作るときに、この4つを意識しただけで、「デザインが綺麗だね」と褒められました。
さらに、これを知っておくと面白いことが、電車で広告を見ていると、最低でもこの4つの原則が必ず意識されていることがわかり、デザイナーの気持ちになれることです。
ぜひ、この4つを意識して、電車の広告や飲食店のメニューなどを見てみてください。

**もし追加情報や間違えていることがあれば、教えてください。**
Hexoでブログを作る

# TEMPLATE BLOG

直接使えるtemplateもgithub上で用意しています。
ご参考になればと思います。

[CODE](https://github.com/z6wdc/hexo-template)
[BLOG URL](https://z6wdc.github.io/hexo-template/)

自分のrepoを使う時に、変更する必要のある場所は
1. [Deploy Setting](#deploy-setting)
2. [Github Pages Setting](#github-pages-setting)
3. [Set Github Page URL](#set-github-page-url)

# Hexo とは

1. `Node.js`製の静的サイトジェネレータ
2. `markdown`形式で書いた記事は、最終的には`HTML`形式に出力される

## node.js

`Node.js`製の静的サイトジェネレータなので、 `Node.js`をインストールする必要がある

### nvm

`nvm`で`Node.js`をインストールする

https://github.com/nvm-sh/nvm

# Install

```zsh
npm install -g hexo-cli
```

https://hexo.io/docs/

# Commands

```
$ hexo init [folder]
$ hexo server
```

https://hexo.io/docs/commands

# Deploy to Github

`hexo-deployer-git`をインストール

```zsh
$ npm install hexo-deployer-git --save
```

## Deploy Setting

`_config.yaml`のdeploy設定を設置

branchを **pages** に設置

```yaml:_config.yaml
deploy:
  type: git
  repo: <repository ssh> # git@github.com:<user>/<repository name>.git
  branch: pages
```

## Deploy Command

```zsh
hexo clean && hexo deploy
```

https://hexo.io/docs/one-command-deployment#Git

## Github Pages Setting

Branchは**pages**を選択

Folderは**root**を選択

![截圖 2022-02-02 15.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078128/9a80fd5e-6ebd-5668-5ee3-3e52eefcef8e.png)

## Set Github Page URL

```yaml:_config.yaml
# URL
## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
url: https://username.github.io/project
```

# Github Actions

**main** branchをpushするたびに、自動的に**page** branchにdeployする

[.github/workflows/pages.yml](https://github.com/z6wdc/hexo-template/blob/main/.github/workflows/pages.yaml)を追加

`deploying branch`は**pages**を設置

```yaml:.github/workflows/pages.yml
publish_branch: pages # deploying branch
```

https://hexo.io/docs/github-pages
【Rails】新規投稿時のリダイレクト先を条件分岐・分類（備忘録）

みなさん、こんにちは！
筆者は大学生限定のプログラミングスクール「GeekSalon」でメンターをしています！
興味のある方や話だけでも聞いてみてい方はぜひのぞいてみてください👍

https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=3Q&utm_content=Fukuoka_B1_3Q

さっそく今回の本題に入っていきます！
今回は投稿の分類に応じて、新規投稿後のリダイレクト先を変更していきます。

私は[この記事](https://qiita.com/kubochiro/items/4d80a91a6133b680cb4b)の「カテゴリー分けその２」の方法を参考に投稿を分類するということをおこなったのですが、新規投稿完了後にリダイレクトするページがどのカテゴリを選んでも同じViewページに飛んでしまうため、カテゴリに応じてリダイレクト先のViewページも変更したいと思いそれを実装しました。今回はその方法残しておきます。


なお、投稿の分類は実装済みという前提で話を進めていくため、投稿の分類を実装していない場合は先ほどの記事を参考に実装したのち、こちらの記事をお読みください！。


##実装環境
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]
Rails 6.1.4.1


##実装①　～該当コントローラーのCreateアクションの記述を変更～

今回は[参考とした記事](https://qiita.com/kubochiro/items/4d80a91a6133b680cb4b)に依拠して、dogとcatとhadakadebanezumiという３つの分類を行うことを想定して実装していきます。

やるべきことは以下の１つです。

```Ruby:Tweets_controller.rb
  def create
    tweet = Tweet.new(tweet_params)
    if tweet.save
＃記述個所↓
      if tweet.category = "dog"
        redirect_to :action => "dog"
      elsif tweet.category = "cat"
        redirect_to :action => "cat"
      elsif tweet.category = "hadakadebanezumi"
        redirect_to :action => "hadakadebanezumi"
      else
      end
＃記述個所↑
    else
      redirect_to :action => "new"
    end
  end
```

これだけです！
しかし、この条件分岐はもっと簡略化して記述することもできます。（以下参照）

```Ruby:Tweets_controller.rb
  def create
    tweet = Tweet.new(tweet_params)
    if tweet.save
＃記述個所↓
      case tweet.category
      when "dog"
        redirect_to :action => "dog"
      when "cat"
        redirect_to :action => "cat"
      when "hadakadebanezumi"
        redirect_to :action => "hadakadebanezumi"
      end
＃記述個所↑
    else
      redirect_to :action => "new"
    end
  end
```

これで終わりです！
モデル名・カラム名・カラムに収納されている値は作成するプロダクトに応じて変更してください！
以上で、新規投稿で選択したカテゴリに応じて、リダイレクト先のViewページを変更することができました。
PowerPointスライドショーを録画しようとするとクラッシュする場合

Mac OS Montereyを12.2にアップデートしたら、PowerPointのスライドショー録画の場面で常にクラッシュするようになってしまい、スライドショーの録画ができなくて作業が進まず困ったことがあります。

LibraryのCachesフォルダを空にしても、Officeを再インストールしても結果は同じでした。

ところが、いったん Office アプリを全て削除し、Officeを全て再インストールしたら、クラッシュしなくなりました。

「現行のOfficeアプリを（すべて）一旦削除してから、再インストール」するのがポイントだったようです。
poetry installを色んな環境でストレスなく行うworkaround

# はじめに
`poetry` は `Python` のパッケージマネージャとしてデファクトになりつつある（個人的な感想）。

`poetry` では、以下の二つのファイルを使って、ライブラリを管理している
* `pyproject.toml` ・・・ 使っている `Python` やライブラリのバージョンを管理
* `poetry.lock` ・・・ 各ライブラリの実際のバージョンや依存関係を管理

`poetry.lock` ではライブラリのハッシュ値も持つことで、 `poetry install` 時のライブラリの探索時間を短くしている。

# 問題点
`poetry.lock` はライブラリごとのハッシュ値を持っているので、インストールする先のOSが異なったりすると、以下のようなエラーになる。

```bash
  • Installing libclang (12.0.0): Failed

  RuntimeError

  Retrieved digest for link libclang-12.0.0-2-py2.py3-none-win_amd64.whl(sha256:46414009fcee8375ba64ea6c2c43c5b80a63e3a8b679f4293e00aa605b7265aa) not in poetry.lock metadata ['sha256:3b0585dbdc3f3b372340f1efe7c28bf4a5b658d2fb8dc0544a7ef0d2bef40618', 'sha256:6df2f8a2cb75181e3c1e99e5dfca2fd44bb7f84ed12d5112541e03c10384f306', 'sha256:b828cb52cf3f02fb0e0a8fddb9dece7e2ed006f8b4d54ee811cef0471d414367', 'sha256:275126823c60ab5c9fae6a433cbb6a47e4d1b5f668a985fbd6065553dbc7efcc', 'sha256:fadad3bf5fbab50c996eb151adc58c3a7cbee45a9135060c416be7b640372112']

  at /usr/local/lib/python3.8/site-packages/poetry/installation/chooser.py:113 in _get_links
      109│
      110│             selected_links.append(link)
      111│
      112│         if links and not selected_links:
    → 113│             raise RuntimeError(
      114│                 "Retrieved digest for link {}({}) not in poetry.lock metadata {}".format(
      115│                     link.filename, h, hashes
      116│                 )
      117│             )

```

`poetry.lock` を削除した状態で `poetry install` を行うと、上記エラーは発生しなくなるが、
その代わりに各ライブラリの依存関係などをそのタイミングで確認するので、すごく時間がかかる。

https://github.com/python-poetry/poetry/issues/4924

# 解決策

https://github.com/python-poetry/poetry/issues/2094#issuecomment-605725577

にあるように、 `poetry export` をして、 `pip install -r`を行えばよい。
ただ、上記のIssueにあるように最後に `poetry install` をすると問題は解決しないので、
`pip install` までで止めておく必要がある。

```bash
poetry export --without-hashes --dev --output poetry-requirements.txt
pip install -r poetry-requirements.txt
```

上記コマンドの補足として、
 
*  `--without-hashes` は、`poetry.lock` で持っているハッシュを出力しないようにするオプション。これをやらないと `poetry install` と同様な問題に陥ってしまう
* `--dev` は、`dev-dependencies` 分も含めるというオプション。通常の `poetry install` では含んでいる部分なので、入れておいた方が良いかも（productionレベルだと不要かも）
*  `--outout` は出力するファイルを指定するオプション。リダイレクトで保存するより、こっちの方がシンプルで良いかなと。

# 最後に
あくまでも workaround なので、他に良い方法はいくらでもあるかなと思います。
「これいいよ」というのがあれば、コメント頂けると幸いです。
Qlik Sense Business(SaaS版)の無料トライアル開始手順


Qlik社はSaaS/クラウドのサービスとしてQlik Sense BusinessとQlik Sense Enterprise SaaSをご提供しており、下位エディションのQlik Sense Businessが無償・即日で利用可能となっています。（クレジットカードの登録などは不要で、30日間の無料トライアルを開始することができます。）以下、その手順をご説明します。
# Qlik Sense Businessの無料トライアル開始
1. Qlik Sense Business の登録サイトにアクセスし、必要な情報を入力して［体験版にアクセス］をクリックします。
https://www.qlik.com/ja-jp/trial/qlik-sense-business
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/45e94f22-d8bd-0687-0ada-a25ddaf87e24.png)

1. 登録したメールアドレスに確認メールが届きます。本登録を行うために、［さあ、はじめましょう。］のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/96a1c61c-0d23-0c60-40a4-a722e371d871.png)

1. パスワードを入力します。［利用規約］をクリックして内容を確認し、承諾のボックスをチェックして［アカウントを作成］をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/93960e67-7bcc-4545-22f4-b9046634a780.png)

1.テナントが配置される地域を選択します。ご自身の所在地に基づき選択してください。日本でご利用の方は「アジア太平洋地域1（シンガポール）」を選択し、［完了］をクリックします。なお、セットアップ完了後は地域を変更できませんのでご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/1ee65811-c60c-7b91-02cd-53ade1362848.png)

1. Qlik Sense Business のアカウントとテナントの作成が完了するとトップのハブ画面が表示されます。登録したメールアドレスにテナントURLなどが含まれた確認メールが送信されますので、それらの情報を控えておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514219/7dc9bd10-252d-db82-4b62-f867677fa422.png)

以上の手順でQlik Sense Businessの利用を開始することができます。
情報処理安全確保支援士に合格するためのアウトプット（2/n）

#IDS（Intrusion Detection System：侵入検知システム）
大きく2種類に分かれる。

##NIDS（Network型IDS）
ネットワーク型なので、ネットワーク上に配置可能なもの。
どこに置くかによって目的・効果も変わるので配置場所は注意。

- 設置方法
    - FWの外に置く（バリアセグメント）
    - FWの中に置く
        - DMZに置く（中に入る前に検知できて良い）
        - 内部ネットワーク上に置く（万が一内部に入ったものに対しても検知できる）

- 検知方法
    - パターンマッチング
        - 事前に決められたパターンのデータかどうかをマッチングし、検知する
    - アノマリ検知
        - RFCなどの正しいプロトコル仕様や振る舞いなどと比較し、逸脱したものを検知する

- 検知後
    - TCP接続であれば、IDSからRSTパケットを送って通信を切断させる
    - FWに異常検知した内容を伝え、FWに通信を遮断してもらう

##HIDS（Host型IDS）
ホスト型なので、ホスト（主にサーバ）に配置可能なもの。
NIDSと主な機能としては変わらない部分も多いが、ホスト上で動作するので以下などに強いものは多い。

- ホスト上のリソースへのアクセス検知
- 不正なプログラムのインストール検知
- コンテンツの改ざん検知

##IDSを設置する上での注意点
- HIDS/NIDSを設置する場合、DMZ・内部セグメントの棲み分けに注意する
- DMZと内部セグメントの間にはFWがあるため、内部セグメントからIDSを管理する場合には、マネジメントコンソールを使用するためにFWのポートを開けておく必要がある
- NIDSは自身が接続されたフレームを全てキャプチャするために、スイッチのミラーポートに接続する必要がある
    - なので、ポートミラーリングできないスイッチではNIDSを使用できない
- NIDSが監視に使用するNICは、プロミスキャストモードに設定する必要がある
    - NIDSのMACアドレス宛てでないものも取り込む必要があるため
    - プロミスキャストモード
        - 自分宛でないものも破棄せず取り込むモード
- NIDSが攻撃を受けないよう、監視に用いるNICには、IPアドレスを割り当てないようにする
    - これに伴い、L2での監視になる

##IDSの設置構成例
- DMZと内部セグメントを監視
- スイッチ接続
- TAP接続
- LB接続
    - SSLアクセラレータ（SSL/TLSパケットの暗号化・複合を高速に行う機器）つきのLBを用いる 
    - 上記にともない、HTTPS通信も監視可能となる

##IDS導入上の留意点
- 共通
    - どう検知するかのポリシ策定
    - 検知時の通知・対応方法
    - ログ管理方法
- NIDS
    - 当然だけどNWに関しての影響を考える
        - 帯域・総利用量・1パケット量・NWの普段の利用状況（ピーク時の値とか）
        - 暗号化パケットの対応方法
    - 構成にも気をつける
        - 冗長時の構成
        - センサへの接続方法・センサの保護対策
        - スイッチとの接続ポート、設定
        - FWとの関連性
- HIDS
    - スペック大事
        - CPU、メモリ、HDD・・・
    - ソフトにも注意
        - OS、ソフトの種類・バージョン

##IDSは完璧ではない
- NIDS
    - 誤検知、取りこぼしは実際ありうる
    - アプリへの攻撃、暗号化パケットは対応できないものが多い
    - 攻撃は検知できても、侵入までは検知できない
    - 不正アクセスを防御できない
        - 防御はIPSやWAFなどでしっかり行う必要あり
    - 内部犯罪はムリ
        - これはもうお手上げ

- HIDS
    - OSの限界を超えるものは無理
    - 1HIDSで1ホスト
    - 導入によるパフォーマンス低下などの影響が有り得る
        - ウィルス対策ソフトも同じ
    - 予兆検知は困難
        - 振る舞い検知などができるものもあるかもしれないが・・・
    - 内部犯罪はムリ
        - NIDSと同じ
Amplitudeの無料環境を開始する方法

# 概要

Amplitudeはデジタル最適化プラットフォームの会社です。分析のAmplitude Analyticsをコア製品とし、A/Bテストを行うAmplitude Experiment、予測・パーソナライゼーションを行うAmplitude Recommendというラインナップで展開しています。
B2B、B2C問わず大手のテック企業でも実施している高度な分析を非ITユーザーでもセルフサービスで分析することができます。

Amplitudeの特徴として、フリーミアムプログラムがあります。Amplitudeに登録さえすれば、無料でコア分析機能を使用することができます。
本記事では、Amplitudeのフリーミアムプログラム（Starter）の開始手順を紹介します。

#目次

1. 前提条件
2. 手順
3. あとがき

#1. 前提条件

AmplitudeはSaaSです。特にサーバー環境などは不要で、ブラウザ経由でサインナップしていただければ、数分で開始することができます。
設定の途中で2段階認証用にメールアドレスが必要となります。メールを確認できる環境から設定をお願いします。

#2. 手順

1. Amplitudeの開始方法

https://analytics.amplitude.com/login/my-demo にアクセス。

各種情報を入力。

- Work email: ビジネス用のEメールアドレス
- Country: Japan
- チェックボックスの上段はニュースレターの配信をするかどうか（任意）
- 下段はプライバシーポリシーに対する同意（必須）

入力が完了したら、『Explore Demo』をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/e512b0fd-1859-d27d-f37a-03c2bfc3dc24.png)

所属している業種を選択（なければOtherを選択しで入力）し、Nextをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/276afc2b-a4aa-3427-c688-3f4d565df479.png)

所属情報を入力。

- Full Name: 名前。アルファベットで名前と名字の間に半角スペースを開ける
- Company: 所属会社名（"個人"でもOK）
- Phone Number: 電話番号（任意）

入力が完了したら『Explore demo now』のボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/bc4d8ce8-8cd5-afb1-c1ad-a5a61f9b5be0.png)


ここまで完了すると、ブラウザ上はAmplitudeのトップ画面に推移をして、メールでパスワード設定用のリンクが送付されます（下図）。
メール内のリンクをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/b4fb54bd-5e2e-a57c-b3b2-fcf8a7bd08e7.png)

パスワードを設定し、チェックボックスにチェックを入れてActivateをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/8c315a32-2139-6626-15e8-69b4ac41b1f0.png)

組織名（以下、org）を定義。

- Name of your organization: 貴社名、部署名、店舗名など、orgの表記名を入力。すでに使用されている表記名を入力した場合、エラーが表示されるため変更。
- Your org URL: org固有のURLを定義。URLとして有効な任意の文字列を利用（マルチバイト不可）。すでに使用されているURLを指定した場合、エラーが表示されるため変更。

入力が完了したら『Create』のボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520182/76996ea9-cccd-b3ef-33d3-a5b0f275f77a.png)

以上で終了です。フリーミアムが開始されました。

#3. あとがき

これで Amplitude の初期セットアップが完了しました。
サンプルのデータでチャートをご体験頂けますし、皆様のデータを取り込むことで分析業務を行うことができます。
データ連携と分析方法については別の記事で紹介します。

Amplitude日本のSlackコミュニティを立ち上げました（2022年1月末）
現在プレオープンということでコンテンツは少ないですが、これから最新情報をどんどん追加していきます。
Amplitudeを使用する上での相談もできますので、お気軽に参加＆投稿をお願いします！
https://join.slack.com/t/amplitude-japan-comm/shared_invite/zt-120b30ns6-5EWzmkg9xWNWgiYa0_82Cw
CodeDeploy(Blue/Green)でinstallが50%から終わらない

# はじめに

CI/CDの勉強をしている中で`CodeDeploy`のBlue/Greenにチャレンジしました。
その中で、デプロイが終わらない事態が発生したのでまとめたいと思います。

ネットやTwitterにも同じ現象で悩んでいる人がいますが、解決策というような解決策の記事がまとめられていなかったので誰かの助けになればと思います。

# 問題

![bandicam 2022-02-01 03-02-02-604.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/bb16cad2-de1a-ed96-95f7-809911b324b1.jpeg)

CodeDeployでBlue/Greenデプロイをすると上の状態で止まる。
本来であれば数分で終わるらしいので何かがおかしいと思い調べました。

ネットの記事には`taskdef.json`が間違っていたというのもありますが、今回はそれに該当しなさそうでした。
また、検証もログが出力されないので難しいです。

# 解決方法

この問題は以下の2つの原因があるかと思われます。

## 1. コンテナに問題がある

コンテナが起動できない場合はそもそもデプロイに成功しないため待ち状態になってしまいます。

そこで、利用するイメージが正しく動くかをFargateのローリングアップなどで実際に起動してアクセスできるか確認してみてください。

また、Blue/Greenデプロイしている状態でもうまく立ち上がっていれば、2つのポート(80、8080)でコンテナが起動しているはずですので、プライベートIPからアクセスして確認することができます。

![bc596418845e-20220201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/76e61e56-b804-3230-880b-b26db07ecec5.png)

もし、ここでアクセスできない状態ならローリングアップなどで起動して`CloudWatch`のログを見ながら修正していく必要があります。

taskdef.jsonで新しいタスクができていると思うので、それをローリングデプロイして確認します。私はそれでECRのURLが違うため起動できていないことに気づきました。

## 2. ロードバランサーが正しくアクセスできていない

以下の記事を見つけました。
[AWS CodePipeline "An AppSpec file is required, but could not be found in the revision"](https://stackoverflow.com/questions/58851354/aws-codepipeline-an-appspec-file-is-required-but-could-not-be-found-in-the-rev)

この記事によるとロードバランサーの`Health Check`が関係しているようでした。

そこでロードバランサーのターゲットグループのヘルスチェックを確認すると

```
Health check path: /
```

となっていました。しかし、私が作成したRailsアプリは`/test`以外は`404`になるように設定されていました。
ヘルスチェックをしたときに`200 OK`が返ってこないのでロードバランサーがヘルスチェックで止まってしまっていたのが原因でした。

また、途中で止まって失敗したときに`ロールバック`を行わなかったことで余計なターゲットが追加されていたのも原因だったかもしれません。ヘルスチェックが正しい場合は、ロードバランサー、ターゲットグループ、ECSサービスのタスクを再度1から作成するのもよいかもしれないです。

## 追加

```
you permission to perform operations in the following aws service: amazon elasticloadbalancingv2. contact your aws administrator if you need help. if you are an aws administrator, you can grant permissions to your users or groups by creating iam policies.
```

というエラーが出て、`allowtesttraffic` で失敗するというのが起きました。CodeDeployのロールに`ElasticLoadBalancingFullAccess`を追加したら成功しました。

# おわりに

[CodeDeployでRails(Docker)をBlue/Greenデプロイする (CI/CDまでの道⑨)](https://zenn.dev/jinwatanabe/articles/34a0dac56a9686bd4223)
こちらの記事でCI/CDの方法については解説していますのであわせて参考にしてください。

やはりできる人が少ない分野になってくるとネットに情報がなくて原因を理解するのに時間がかかりますね。

# 参考
- [AWS CodePipeline "An AppSpec file is required, but could not be found in the revision"](https://stackoverflow.com/questions/58851354/aws-codepipeline-an-appspec-file-is-required-but-could-not-be-found-in-the-rev)
SPSS Modeler ノードリファレンス 2-3 ソート

# 2-3 ソートノード[レコード設定タブ]
<img width="200" alt="107_89ソート" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7a89e979-80ab-a5ee-5451-043b87d6897b.png">


## 1.ノードの目的
データを並び替えます。複数のフィールドを対象に昇順、降順の多重ソートが可能です。

## 2.解説動画（60秒）

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

##3.クイックスタート
[可変長ファイル][ソート][テーブル]の順で接続します。
＊入力データは[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-02-01 11.03.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3801e10a-c86c-efd8-9817-a9e9476490ec.png)

以下のデータの年式で昇順で並び替えます。
![スクリーンショット 2022-02-01 11.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b69d7dbf-26e6-25db-d76c-e8878811ca84.png)

[ソート]は以下のように設定します。赤枠ボタンのボタンを押してフィールドの選択を行い[順序]を[昇順]とします。
![スクリーンショット 2022-02-01 11.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/32cb6dc2-e612-0630-3ad1-9369de5f003d.png)

[年式]で昇順ソートされました。
![スクリーンショット 2022-02-01 11.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/148fbaaf-6d11-4283-5c40-3ca806c3a766.png)

[年式]で昇順のまま[馬力]を降順に並び替えます。
![スクリーンショット 2022-02-01 11.05.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/42f7adb9-9469-21bb-cf93-8cadafc0c2fb.png)

多重ソートが完了しました。
![スクリーンショット 2022-02-01 11.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bd10bb35-e6dd-a48b-304c-2accf304fe45.png)

### うまくソートできない場合のヒント
以下は都道府県コード番号を昇順した例です。[1北海道]よりも[10群馬県]が文字列の順序では先になるため想定していた並び順になっていません。
![スクリーンショット 2022-02-01 11.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2ebab67c-a172-5df3-f454-b3c7e4fc1b13.png)


[1北海道]を[01北海道]と冒頭にゼロを付与して実行し直すと、以下のように適切に並び替えられます。
![スクリーンショット 2022-02-01 11.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c8e43ded-09b2-1a1a-0724-64730466e848.png)


## 4.Tips

#### 大規模データにSQLプッシュバックさせる際のTips

https://qiita.com/kawada2017/items/58b9c071f99818fcbfb1

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/cars.csv

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-sort-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
Rubyでコンソールにプログレスバーを作ってみた

## :cherries: できたもの

![ezgif-5-7e2ac60638.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788779/3b964b37-bf47-2d96-1aeb-feeeb1aa7c06.gif)

## :book: プログラム


`print "\r"`
で、カーソルをコンソールの行頭に移動させて、一行分上書きできる。

`"\e[32m#{str}\e[0m"`
で、任意の文字 str を緑色で表示させる。


```ruby
sym = [
  '\\',
  '|',
  '/',
  '-'
]

def green(str)
  "\e[32m#{str}\e[0m"
end

1.upto(100) do |i|
  print "\r"
  print " (#{sym[i % sym.length]}) ["
  print ('/' * (i / 10)).ljust(10, ' ') << ']'
  sleep 0.03
end

8.times do |i|
  print "\r"
  print ' (o) [ '
  print green('ALL DONE'[0, i + 1].ljust(8, '.'))
  print ' ]'
  sleep 0.1
end


```



### :mag: 参考
[https://stackoverflow.com/questions/1489183/how-can-i-use-ruby-to-colorize-the-text-output-to-a-terminal]()
[https://stackoverflow.com/questions/31090782/how-to-overwrite-the-current-console-line-after-gets-in-ruby]()
[https://ezgif.com/video-to-gif]()
【Unity】PlayFab で Curl error 61 が出ていたときの話


##はじめに
初投稿です。
タイトルの件について、既に解決している方も多いと思いますが、こういうケースがあったということで備忘録的に書き記します。
当時もあまり話題にされなかったので、原因がわからなくて詰まっている人の助けになれば幸いです。

##原因
Unity バージョン **2020.3.9 ~ 2020.3.15** または **2021.1.3 ~ 2021.1.16** で `UnityWebRequest` などネットワーク機能を使っていると起こりうる問題で、
バージョンアップされた **libcurl** がサポートされていないデータ圧縮エンコーディングを拒否するようになり、`gzip` 圧縮をリクエストすると失敗を返すようになったことが原因でした。
他にSDK内で `gzip` 圧縮 を使っていた **VRoid** , **Mapbox**でも起きていたみたいですね。

IssueTracker: [UNITYWEBREQUEST FAILS ON WINDOWS IF GZIP COMPRESSION IS USED](https://issuetracker.unity3d.com/issues/unitywebrequest-fails-on-windows-if-gzip-compression-is-used?_ga=2.138598581.769781787.1639378647-1811481383.1588837576 "Issue ID: 1343274")

##解決
自分の環境では当時、リクエストヘッダーで **"Accept-Encoding"** に **"gzip"** を指定している箇所を **"identity"** に変更することで対処しました。

PlayFabでは、
**PlayFabUnityHttp.cs** で **MakeApiCall** 内の
`reqContainer.RequestHeaders["X-Accept-Encoding"] = "GZIP";`
と書かれているところを、
`reqContainer.RequestHeaders["X-Accept-Encoding"] = "identity";`
ですね。

現在は **2019.4.30**, **2020.3.16**, **2021.1.17** それぞれで `UnityWebRequest` が `gzip` 圧縮をサポートするように修正されているので、まだエラーが出ている方は Unity のバージョンを確認してみてください。
しれっと 2019.4 で修正をしたと書きましたが、リリースノートに書いてあるのを見ただけで 2019.4 でいつから同様の問題が出ていたかは、発生報告を見つけられなかったのでわかりません。

参考程度に Unity リリースノートをリンクしておきます。
修正項目は Networking の分類です。

https://unity3d.com/unity/whats-new/2019.4.30

https://unity3d.com/jp/unity/whats-new/2020.3.16

https://unity3d.com/unity/whats-new/2021.1.17

結論として、よほどの理由がない限り Unity のバージョンを上げたほうが良いでしょう。