OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】SQL自体は正しいのに、クエリビルダのleftJoin使うとカラムが見つからないエラーになってしまう場合

## 状況
joinとか使うSQLになると、select文の中のカラム指定では、
「hoge_table.name」や「hoge_table.age」のようにテーブル名と一緒にくっつけた名前になる場合があります。

laravelでsqlのクエリビルダのメソッドの中で「IFNULL」を使う場合は、普通に一つの文字列でやると失敗するので、バッククォートを使う必要がある。

もしカラム名のところがテーブル名無しの「age」だけとかならそのままバッククォート1つでいいが、テーブル名がくっつくタイプのものならそれぞれに分けてバッククォートつける必要があるのが注意。

```php:anime-suko.php
        $result = モデル名::select([
            'hoge_table.id',
            'hoge_table.name',
            'hoge_table.age',
            DB::raw('IFNULL(`second_table`.`power`, 0)')
        ])
}
```

英語ですが、以下の記事にヒットしてよかった
https://stackoverflow.com/questions/45129228/mysql-join-unknown-column-in-field-list
【競プロからの学び】最も近い値を探す→bsearchが高速

# TL;DR

タイトルの通り。
配列内から最も近い値を探す→bsearchが高速に動作する。
二分探索なので。

競技プログラミン初心者による、自分向け備忘の記事。


## 問題
https://atcoder.jp/contests/typical90/tasks/typical90_g
こちらの問題を解いている際のお話。

やりたいことの１つが以下の操作↓

- 「整数によって構成される配列a」と「定数b」を用意。
- 「aの中からbに最も近い値を探す(絶対値が最も小さい値を探す)」

例）
a = [1,5,19,7]
b = 8
 => answer = 7

#### 自分の考え

```ruby
  a.each do |i|
    b_arr << (a[i] - b).abs
  end
  puts b_arr.min
```
これだと計算が遅い。。。
i個分の差分計算の後にソートをしているので。。。


#### ほかの方の答え

```ruby
  a.sort
  idx = a_arr.bsearch_index {|x| x >= b }

  if idx.nil?
    small = (a_arr[n-1] -b).abs
  elsif idx == 0
    small = (a_arr[0] -b).abs
  else
    small = [(a_arr[idx] - b).abs, (a_arr[idx-1] - b).abs].min
  end
```
これだと計算がはやい！
aをソートさえしてしまえば、
二分探索してindexの値で場合分けして値を出すのみ。


## 理由はたぶんこう？
計算量比較で、

- 線形探索は(n+1)/2
- 二分探索はlog2(n)

なので、確かに早くなりそうな気がする。

細かいところまでは調べ切れていないですが。。。

心優しい方、コメントで教えてください…！
【PHP】配列型の整数キャストは論理キャストの結果が使われている

配列型の整数キャストでハマったので、そもそもキャストがどのように行われるのか調べました。
参考になれば幸いです。
[公式ドキュメント 型の相互変換](https://www.php.net/manual/ja/language.types.type-juggling.php)

# array(array())の整数型は1
``array(array())``を整数へ型キャストした結果は``1``です。

```php
var_dump((int) array(array())); // int(1)
```

# どうして1になるの？
## 整数への型キャストについて
公式ドキュメントでは「booleans」「浮動小数点数」「文字列」「NULL」からの変換について説明された後、下記の警告が記述されています。

[公式ドキュメント 整数への変換](https://www.php.net/manual/ja/language.types.integer.php#language.types.integer.casting)より
>警告
整数への変換の動作は、他の型については定義されません。現在の動作は、その値がまず論理値に変換された場合と同じです。しかし、この動作は予告なく変更されることがありえるので、これを前提にしてはいけません。

その他の型は「その値がまず論理値に変換された場合と同じ」とあります。
つまり、その他の型は``まず論理値に変換され、その結果をもとに整数へ型キャストされる``という事です。

>booleans から
false は、0 (ゼロ) となり、 true は、1 となります。

論理値を整数へ型キャストした結果は`0`もしくは`1`です。
その他の型を整数へ型キャストした場合も同様の結果となります。

## 論理値に変換とは？
``(bool)``または``(boolean)``などによる型キャストのことです。 
[公式ドキュメント booleanへの変換](https://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting)

まず``array(array())``を論理型へ型キャストすると``true``になります。

```php
var_dump((bool) array(array())); // bool(true)
```
>bool に変換する場合、次の値は false とみなされます。
>>boolean の false
integer の 0 (ゼロ)
float の 0.0 および -0.0 (ゼロ)
空の文字列、 および文字列の "0"
要素の数がゼロである 配列
特別な値 NULL (値がセットされていない変数を含む)
属性がない空要素から作成された SimpleXML オブジェクト。つまり、子要素も属性もない要素です。

>その他の値は全て true とみなされます (全ての resource および NAN を含みます)。

要素数がゼロの配列は``false``とみなされますが、空配列や0でも何かしらの要素があれば``true``とみなされます。

```php
var_dump((bool) array());        // bool(false)

// 要素の内容までは考慮されない
var_dump((bool) array(array())); // bool(true)
var_dump((bool) array(0));       // bool(true)
```

## 1になる理由
- 配列型における整数への型キャストは、まず論理型へ型キャストされてから実行される
- ``array(array())``を論理型へ型キャストした結果は``true``
- ``true``を整数へ型キャストした結果は``1``
- よって、``array(array())``を整数へ型キャストした結果は``1``になる

# 気をつけたいこと
関数の戻り値をそのままキャストした場合、戻り値の型が想定外だと意図しない結果になるかもしれません。
関数がネストして最終的な戻り値が``array(array())``になってしまう時など...

- 戻り値の型の種類を把握する
- そもそも関数に戻り値の型を明記する
- 戻り値で想定外の型を受け取った場合の処理も記述する

# 採用PR
弊社で一緒に働く仲間を募集しています。
全てのオタクを幸せにしたい方、是非ご覧ください！

https://hrmos.co/pages/vivion/jobs/0000191
[py2rb] set の差異

# はじめに
移植やってます
# set (Python)
```python
_comments = set('>;')
```
何気ない`set`ですが、

```python
>>> print(_comments)
{'>', ';'}
```
中は既にスプリットされています。
# set (Ruby)
```ruby
require 'set'
_comments = Set.new('>;'.split(''))
```
二つくらいなら最初から分けておいてもいいんですけど。
# intersection (Python)
```python
x = {'is_decoy', 'remove_decoy', 'formula',
                 'ratio', 'correction'}.intersection(kwargs)
```
`intersection`って集合の積なんですけど、この`kwargs`って~~辞書型~~なんですよね。

~~よくよく見るとSet型でした。~~
やはり、辞書型でしたが、`intersection`を呼んだとき、辞書のキーとの積を取得するようです。
# & (Ruby)
```ruby
x = Set.new(['is_decoy', 'remove_decoy', 'formula',
        'ratio', 'correction']) & kwargs.keys
```
`Set`と`Hash`の積は取れませんので、`Hash#keys`を使用します。
この場合、`Set.new(Array & Hash.keys)`でも`Set.new(Array) & Hash.keys`でも同じSetが返るようです。
# メモ
+ Python の set を学習した
+ 道のりは遠そう
簡単なSwiftの型〜初歩編〜

こんにちわ。

Swiftを勉強している初学者です。

今回は備忘録として、変数の型で使われる種類を簡単に紹介していこうと思います。

# 結論リスト
簡単な型の種類をまとめてておきました。

| 型の種類 | 内容 | 例 |
|:-:|:-:|:-:|
| 整数型  | 整数の値 | 1 2 3 |
| 少数型  | 少数の値 | 1.3 2.2 5.0 |
| 文字列型  | 文字列の値 | こんにちわ おはよう |
| Bool型  |  真偽の値 | true false |

このようになりました。

では各型の説明をしていきます。

#型の存在理由
そもそもなぜプログラミングでは型が存在しているのでしょうか？

以下の例をご覧ください。

```swift:example.swift
let number: Int = 1//整数型

let string: String = "1"//文字型

print(number + number) //2

print(string + string) //11
```

変数の中身は「１」で同じはずなのに、整数型と文字型で処理結果が全く異なっています。

また、以下のコードだとタイプが違い、エラーが出てしまいます。

```swift:example.swift
let number: Int = 1

let string: String = "1"

print(number + string)

//note: overloads for '+' exist with these partially matching parameter lists: (Int, Int), (String, String)

```

このように違う型を演算することでエラーを出してくれます。
あらかじめ型を決めておく事で、型が違った計算を防いだり、想定外なケースのデータが入らないようにするためエラーを表示してくれます(エラーが出ずに進めてアプリを完成させたら大変です)。

また、コンピューターメモリを有効活用することができます。
型によってメモリを使う容量は違っています。
そして、型をあらかじめ決めておく事で、その型にあった最小限のメモリをあらかじめ用意できるので、コンピューターのメモリを効率よく使う事ができます。



# 型の種類
では、具体的に各型の特徴を説明していきます。

## 整数型(Int型)
整数型は、整数を入れる型の事です。

```swift:example.swift
let number: Int = 1
```

変数の後に「Int」と記入することで設定することができます。

## 少数型(Double型)
少数型は、少数点を含んだ数字を入れる型の事です。

```swift:example.swift
let number: Double = 1.3
```

## 文字型(Character型)
文字型は、一文字を扱うデータ型の事。ダブルクォーテーション("")で囲みます。

```swift:example.swift
let name: Character = "あ"
```

## 文字列型(String型)
文字列型は、文字列を扱うデータ型の事。ダブルクォーテーション("")で囲みます。

```swift:example.swift
let name: String = "僕の名前は秘密だよ"
```

## Bool型
Bool型は、真の値をtrue、偽をfalseで表す型の事です。条件分岐(if文,switch文)などでよく使われます。

```swift:example.swift
let OneAnswer: Bool = true

let TwoAnswer: Bool = false
```

# まとめ

今回は基本的な型の説明をしました。

このほかにも色々な型があるので、後ほど紹介していこうと思います。

以上です！
【Nuxt】Nuxt.jsでのaxios設定方法

# axiosとは
PromiseベースのHTTPクライアント。
ブラウザ（クライアント）から外部APIに接続し、データの取得や更新を行う

他にもAjaxやFetchなどがあるが、**Vue.jsではaxiosが使われることが多い**

#　インストール方法

基本的にはプロジェクト作成時にaxiosを含めるか選択ができ、
これを選択していれば以降の設定は必要ない

**手順①npmインストール**

```
$ npm install @nuxt/axios
```

**手順②インストール完了後、nuxt.config.jsのmoduleに以下の設定を行う**

```:nuxt.config.js
export default {
  modules: ['@nuxtjs/axios']
}
```


今回使用するのはNuxt.js用のaxiosで、通常のaxiosも利用できるようですが、
こちらの方が設定の手間が省けるなどのメリットがあるそうです


#基本操作(メソッド)
$axiosで参照。

```
getData() {
  this.$axios.get('http://localhost:8080/').then(res => {
    //リクエスト成功時
  }).catch(err => {
    //リクエスト失敗時
  })
}
```
エレキギターで好きな音を奏でたい

<h2>はじめに</h2>
皆さんこんにちは。早速ですが、巣籠需要で拡大してきた楽器ブームを皆さんご存じでしょうか?
その代表格といっても過言ではないギターについて語っていきたいと思います。
私がギターを弾いてきて音作りに悩んだときに調べたことをまとめてみました。

<h2>エレキギターの仕組み</h2>
まずは本体となるエレキギターについてみていきましょう。
本体には<font color="red">ピックアップ</font>と呼ばれる弦の振動を電気信号に変化させるパーツが装備されています。
![ピックアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/ee75514d-1f09-ffee-2662-4b62dc49de90.png)


ピックアップの中にはコイルが各弦にそれぞれ対応しており、**誘導起電力**によって電気が発生します。
誘導起電力というのは簡単に説明すると導線で作られたコイルに磁界の強さを変化させたときに生じる電力のことです。
![コイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/238225a0-8e19-e115-1b74-398f4de1c8b9.png)

※以下に誘導起電力について詳しく説明しているサイトのURLを貼っておきます。
https://juken-mikata.net/how-to/physics/electromotive-force.html

以上のことを踏まえるとピックアップは弦に近ければ近いほど、コイルの巻き数は増えれば増えるほど磁界の変化が大きくなり、アンプに対しては大きな値での入力つまり元の音が大きくなるわけです。(デメリットもある)
ピックアップの高さを自分で変える人はなかなかいません。ぜひ自分のギターのセッティングに役立ててみてください。

しかし、ここで出力される電気の量はとても小さな値です。これを増幅させるためにあるのがアンプなのです。

<h2>アンプを通して大きな音に</h2>
微弱な信号を大きくするためには<font color="red">パワーアンプ</font>が必要です。
![amp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/28376d31-ed50-ffc9-bc0e-0d17b25bddf9.png)

内部の回路は想像以上に簡単で、プリアンプで入力した信号を使いやすい大きさまで増幅させた後、その音の高音部分を削ったり低音部分を削ったりと、いわゆるイコライジングをかけます。その後調整された音を増幅させてパワーアンプへ入ります。

チューブタイプのアンプ(真空管を使用したアンプ)では、一般に大出力を得るために**Bクラス・プッシュプル回路**を使用しています。信号を正負の半サイクルごとに分けて増幅するため、位相反転が必要で、様々な回路方式や、入力トランスによる方法があり、合わせて電圧増幅を行います。
![push.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/a7e434b3-37ed-1218-7190-eba037e3fb66.png)
<div align="write">
(プッシュプル回路　画像・解説：https://ana-dig.com/push_pull/)
</div>
さらに詳しく：https://www.ishibashi.co.jp/academic/super_manual3/guitaramp.htm

<h2>ドライブをかけよう</h2>
エレキギターの醍醐味であるドライブ(歪の音)をかけていきたいと思います。主に音を歪ませることができる場所は先述したアンプ、そのほかにペダルと呼ばれる別付けのエフェクターでその効果を追加することができます。
![overdrive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/9b368c15-74c1-9dc0-d110-dbd0800b96a2.png)


歪というのは、音を増幅装置(アンプなど)で大きくするとき増幅値というものが固定で設けられており、その音の波形が増幅値の閾値を超えた部分が歪の音として聞こえてくるのです。さらに、エフェクターの中にはダイオードというパーツが組み込まれており<font color="red">ダイオード</font>は、一定の電圧以上は通さないようになっているそうです。容量以上の電圧が歪の部分です。
ここで音の増幅に<font color="red">オペアンプ</font>を使った増幅回路を利用します。
![opeamp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301726/47cc67c5-ba2c-b186-f45f-b72fe7999a46.jpeg)

この**オペアンプ次第でも音の個性が違ってくる**そうです。実際YouTubeなどでその検証をしてくださっている方がいるので参考にしてみるといいかもしれません。

<h2>最後に</h2>
今回はエレキギターの音の出る仕組み中心に私自身が調べたことを軽くまとめてみました。
そこそこ弾けるようになった今だからこそ、自分の目指す音作りをするためには何が必要なのだろうかと悩んだ結果、使っている機材の特性を理解しておく必要があるという結論に至りました。
特にギター本体のセッティングとエフェクターのつなぐ順番については今回のような電子的な設計を把握しておくと自分の理想の音を作る際に数値などからもアプローチでき、より納得のいく自分のこだわりのつまった音が作れるような気がします。
私が一番驚いたのは基板にパーツを接続する**ハンダを変える**だけでも音が変わるということです。ぜひ試してみてください。
【Dart Sass】@use使用でBootstrapの変数を上書きする


bootstrapを使用しているプロジェクトで `@import` を `@use` へ書き換えました。
その際、bootstrapの変数を上書きする部分（テーマカラーの変更など）でハマったので、解決方法を残しておきます。

# 前提
Sassでファイルを呼び出す際に使っている `@import` が廃止される予定でして、代わりに `@use` `@fowerd`を使うように推奨されています。

> （※ Google日本語翻訳）
Dart SassとLibSassの両方がモジュールシステムのサポートを開始してから1年後、またはDart Sassがモジュールシステムのサポートを開始してから2年後のいずれか早い方（遅くとも2021年10月1日）に、@importグローバルコアライブラリ関数呼び出しと同様に非推奨になります。それはモジュールを通して作ることができます。
この非推奨が発効してから1年後（ 遅くとも2022年10月1日）、@importほとんどのグローバル機能のサポートを完全に廃止します。これには、すべての実装のメジャーバージョンリリースが含まれます。
https://sass-lang.com/blog/the-module-system-is-launched#future-plans

## バージョン
* sass 1.44.0
* bootstrap 5.1.3

## 構造
```
project/
├── scss/
│   └── custom.scss
└── node_modules/
    └── bootstrap
        ├── js
        └── scss
```

## 移行前
[ドキュメント](https://getbootstrap.jp/docs/5.0/customize/sass/)に従って、変数の初期値を上書きしています。

```custom.scss
/* 変数の上書き */
$primary: #0000ff;
$secondary: #696969;

/* Bootstrap */
@import "../node_modules/bootstrap/scss/bootstrap";
```

## 移行後
`@import` から `@use` へ変更しただけです。
これだと **変数が上書きされません。**

```custom.scss
/* 変数の上書き */
$primary: #0000ff;
$secondary: #696969;

/* Bootstrap */
@use "../node_modules/bootstrap/scss/bootstrap";
```

# 解決方法
`@use` ルールは、メンバー（変数やMixins、関数）をカプセル化するため、変数はグローバルに適用されなくなるようです。
変数を外部から変更する場合は、**with節** を使います。

```custom.scss
@use "../node_modules/bootstrap/scss/bootstrap" with (
    /* 変数の上書き */
    $primary: #0000ff,
    $secondary: #696969,
);
```

# 参考
* [Sassを@importから@useに置き換えるための手引き | Web Design KOJIKA17](https://kojika17.com/2020/05/next-generation-sass-module-system.html)
PythonでS3にアクセスできるか簡単に確かめる


# Python環境上で接続を確かめる方法
主に、バケットに接続できる権限なのかを調べるときに使えるかと

実行はpython cli上にコピペすればOK!!

## 実行コマンド

```python
import boto3
s3 = boto3.resource('s3', aws_access_key_id='ACCESS_KEY', aws_secret_access_key='SECRET_KEY')
bucket = s3.Bucket('BUCKET_NAME')
for obj in bucket.objects.all():
    print(obj.key)

```

これを実行して、バケットに格納されているファイルとディレクトリが表示されたら成功！

## 実行例

### 成功
アクセスキーやバケット名はマスキングしてあります

```python
>>> import boto3
>>> s3 = boto3.resource('s3', aws_access_key_id='*******', aws_secret_access_key='********')
ket = s3.Bucket('********')
for obj in bucket.o>>> bucket = s3.Bucket('********')
>>> for obj in bucket.objects.all():
...     print(obj.key)
... 
a.txt
t/
t/b.txt
```

### 失敗
アクセスキー や シークレットキーが間違えていると、以下の様にエラーが出力される

```python
>>> import boto3
>>> s3 = boto3.resource('s3', aws_access_key_id='ACCESS_KEY', aws_secret_access_key='SECRET_KEY')
n bucket.objects.all():
    print(obj.key)

>>> bucket = s3.Bucket('BUCKET_NAME')
>>> for obj in bucket.objects.all():
...     print(obj.key)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/boto3/resources/collection.py", line 83, in __iter__
    for page in self.pages():
  File "/usr/local/lib/python3.8/site-packages/boto3/resources/collection.py", line 166, in pages
    for page in pages:
  File "/usr/local/lib/python3.8/site-packages/botocore/paginate.py", line 255, in __iter__
    response = self._make_request(current_kwargs)
  File "/usr/local/lib/python3.8/site-packages/botocore/paginate.py", line 332, in _make_request
    return self._method(**current_kwargs)
  File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 276, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 586, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the ListObjects operation: The AWS Access Key Id you provided does not exist in our records.
```
Windows 10でポータブルなBookdown環境を構築する

# はじめに

RStudioをUSBメモリで持ち運べるようになった[^1]ので，頑張ってBookdown環境まで作ってしまいたい．
Windows 10だとOneDriveがらみのトラブルが多いので，人に簡単にインストールを進められないんですが，ポータブル環境ならばそのあたりのトラブルを回避できるので楽なんですよね．

[^1]: [RStudioをUSBメモリで持ち運ぶ](https://qiita.com/yetanothersu/items/e8dece5905c837f1f075)

以下，USBメモリのルートを`F:\`とします．

# R portableのインストール

https://sourceforge.net/projects/rportable/

ダウンロードして`F:\R-Portable`以下に展開します．

# RStudioのインストール

以前書いた記事[^1]そのまんま．
使用しているPCにRStudioがインストールしていないならば，一度はインストールしておく必要がありますので，[ダウンロードページ](https://www.rstudio.com/products/rstudio/download/#download)からダウンロードしてインストールしましょう．

RStudioを起動する必要はないので，OneDriveがらみのトラブルも無関係のはずです．

コピー先は`F:\RStudio`としておきます．

# Git portableのインストール

https://git-scm.com/download/win

`Git`もポータブル版をインストールしておきます．

# 起動バッチファイルの準備

RStudioにパッケージをインストールするために，以下の内容でバッチファイルを作成し，`F:\`に置いておきます．`tlmgr`はまだインストールしていないので，コメントアウトしておきます．

```{RStudio-Portable-Init.bat}
cd /d %~dp0
set current_dir=%~dp0

set R_HOME=%current_dir%R-Portable\App\R-Portable
set R_USER=%current_dir%R-Portable\App\R-Portable
set R_LIBS_USER=%current_dir%R\win-library
if not exist "%R_LIBS_USER%" mkdir "%R_LIBS_USER%"

set "PATH=%PATH%;%current_dir%TinyTeX\bin\win32;%currend_dir%PortableGit\bin"

rem call tlmgr path add

"%current_dir%RStudio\bin\rstudio.exe"
```

# パッケージのインストール

`RStudio-Portable-Init.bat`をダブルクリックしてRStudioを起動します．今までRを起動したことのないPCであれば，Rの場所を指定するように促すウィンドウが出ますので，`F:\R-Portable\App\R-Portable\bin\x64`を指定します．ウインドウが閉じますので，もう一度バッチファイルから起動します．

すでにRを起動したことがあった場合，RStudioが起動してから，[Tools]-[Global Options...]を選択し，[General]から[R Session]の下にある[R version:]に先ほどのポータブル版Rのパスを指定します．

Rがポータブル版になっていることを確認したらパッケージをインストールしていきます．

```{R}
install.packages(c("tidyverse", "remotes", "rmarkdown", "bookdown", "tinytex"), dependencies = TRUE)
```

PDFを作成するために`TinyTeX`をインストールします．`TinyTeX`については[日本語ドキュメント](https://gedevan-aleksizde.github.io/tinytex-doc-ja/index.html#r-%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%B8)を参考にしています．

```{R}
tinytex::install_tinytex(dir = "F:\TinyTeX")
tinytex::tlmgr_install("texlive-msg-translations")
tinytex::tlmgr_install(c("bxjscls", "luatexja", "zxjatype", "zxjafont", "haranoaji", "jlreq"))
```

`TinyTeX`のインストールが終わったら，バッチファイルでコメントアウトしていた行をアンコメントします．

```{RStudio-Portable-Init.bat}
cd /d %~dp0
set current_dir=%~dp0

set R_HOME=%current_dir%R-Portable\App\R-Portable
set R_USER=%current_dir%R-Portable\App\R-Portable
set R_LIBS_USER=%current_dir%R\win-library
if not exist "%R_LIBS_USER%" mkdir "%R_LIBS_USER%"

set "PATH=%PATH%;%current_dir%TinyTeX\bin\win32;%currend_dir%PortableGit\bin"

call tlmgr path add

"%current_dir%RStudio\bin\rstudio.exe"
```

いったんRStudioを終了してから再起動しましょう．

# 終わりに

以上で一応`bookdown`を使って日本語の入ったPDFを作成することができます．本当は`rmdja`パッケージを使いたいのですが，私の環境ではうまく動かないんですよねー．ということで，これを解消するのが次の宿題と言うことにしておきます．
主要なプログラミング言語のひな形まとめ

#はじめに
タイトルそのままの記事です。自分用の備忘録。一部は工事中。
#C
```C:sample
#include <stdio.h>
int main(void){
    //ここにプログラムを書く
    return 0;
}
```
#Java
```java:sample
public class sample{
    public static void main(String[] args){
        //ここにプログラムを書く
    }
}
```
#fortran
```fortran:sample
program sample
    implict none
    !ここにプログラムを書く
end program sample
```
#HTML(CSS,JavaScript)
```html:sample
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
/*ここにCSSを書いてもよい*/
</style>
<title>タイトル</title>
</head>
<body>
<!--ここに記事を書く-->
<script type="text/JavaScript">
//ここにJavaScriptを書いてもよい
</script></body></html>
```
#Rust
```rust:sample
fn main(){
    //ここにプログラムを書く
}
```
#Kotlin
```kotlin:sample
fun main(args: Array<String>){
    //ここにプログラムを書く
}
```
#終わりに
こういうの需要あるのかな？
Nvidia Flex Solverを使ったシンプルな粒子の物理シミュレーション

こんにちは！ [TouchDesigner Advent Calendar 2021](https://qiita.com/advent-calendar/2021/touchdesigner) 8日目の記事です。
サンプルは [こちら](https://velvet-number.com/upload_files/qiita_sample/sample.toe)からダウンロード出来ます。

Nvidia Flex Solverを使ってこちらの動画のようなものを作ります。

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://t.co/c70vdkWpTk">pic.twitter.com/c70vdkWpTk</a></p>&mdash; Kaoru Tanaka (@v_kaoru) <a href="https://twitter.com/v_kaoru/status/1439003564857192448?ref_src=twsrc%5Etfw">September 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

全体のネットワークはこのような感じになります。
![pic06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/9f055d85-360a-6aae-4dd5-339865d4b0fa.jpeg)

#作り方
1.`Actor COMP`の中に発生させる粒子`Sphere SOP`を作ります
2.`Actor COMP`の`Instance`>`Instance`のトグルをONにして、`Translate OP`にパラメータに使うSOPなど(今回は`Sphere SOP`）を設定します
![pic01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/befed25f-8ab9-24f1-4180-f0ef50bb103b.jpeg)
3.`Sphere SOP`のポイント数が粒子の数になります
![pic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/ac70addd-18d5-fb2e-76e2-e2caf012dc98.png)
4.`Nvidia Flex Solver COMP`の`Solver`>`Enable Boundaries`のトグルをONにして、`Solver`>`Boundary Mode`を`Bounding Box`に設定して`Box SOP`を割り当てます
![pic03_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/4cc26b04-e7ea-809f-f48b-b1a2533565b8.jpeg)
5.`Nvidia Flex Solver COMP`で設定しているBoxはシミュレーション用でレンダリングされないため、レンダリングされるBoxを作ります。`Delete SOP`で前面を消して中身が見えるようにします
6.マウスの位置を`Transform SOP`に割り当てます
7.`Nvidia Flex Solver COMP`の`Solver`>`Initialize Sim`の`Init`初期化ボタンを押して`Solver`>`Start Sim`の`Start`スタートボタンを押すと動きます(サンプルファイルを開いた時も同じように押すと始まります）
![pic04_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/fb3424fb-295d-de52-3745-5d0a2f29c244.jpeg)
完成です。
![pic05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68316/d1471326-1b8e-7edb-b678-3d1576b10f82.jpeg)
doxygenをCLIで使いVScodeのショートカットコマンドからビルドする

## doxygenをCLIで使う

### 1.  [公式サイト](https://www.doxygen.nl/download.html#latestsrc)からdoxygenをダウンロード&インストール.
    - Sources and Binariesの項目から利用しているプラットフォームを選択してダウンロード
    - インストール後Applicationディレクトリに移動しておく
    ⚠️mac osのセキュリティ設定, 未許可注意
    ![](https://i.imgur.com/JquJ0q5.png)

### 2.  PATH　を通す
 `~/.zshrc`に以下を追記する

```
export PATH=/Applications/Doxygen.app/Contents/Resources/:$PATH
```

### 3. .zshrcを更新
    `$ source ~/.zshrc`
### 4. PATHが通っているか確認

    ```
    $ doxygen -v
    1.9.2 (caa4e3de211fbbef2c3adf58a6bd4c86d0eb7cb8*)
    ```

### 5. ドキュメント化したいプロジェクトのルートディレクトリに移動してdoxygenの設定ファイルを生成する.
     `$ doxygen -g`
### 6. プロジェクトルートに`Doxyfile`が生成されるので設定を追記
    詳しくはドキュメントや他の[記事](https://maku.blog/p/x79fc82/)を参考にしました.

### 7.　通常はDoxyfileと同じディレクトリで`$ doxygen`を実行することでビルドが走り任意のフォーマットでドキュメントが出力されます.
    
## VScodeのビルドタスクに追記して変更時にで再ビルドされるように設定する


**vscodeは`.vscode/tasks.json`に決められたフォーマットでコマンドを記載することでショートカットキーから任意のコマンドを実行可能です.**
### 1. メニューからデフォルトのファイルを生成する
    - Terminal→Configure Tasks→Otherすると`vscode/tasks.json`が作成されます.
(自分の環境では`.gitignore`に`.vscode/*`でvs　codeの設定ファイルを除外しています)

![](https://i.imgur.com/3I6UCCL.png)

### 2. ファイルの内容を以下に置き換えます.

```
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [       
        {
            "label": "doxygen build",
            "type": "shell",
            "command": "/Applications/Doxygen.app/Contents/Resources/doxygen",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

- JSON形式で"command"ブロックに任意のコマンドを記載することができます。
    - ⚠️vs codeのzsh環境では[このような](https://stackoverflow.com/questions/63502253/vscode-build-error-the-terminal-process-bin-zsh-c-yarn-run-watch-extensi)問題がありうまくコマンドを実行できない為フルパスでコマンドを直接実行しています.


## 参考
https://www.doxygen.nl/download.html
https://code.visualstudio.com/docs/editor/tasks#vscode
https://qiita.com/hakua-doublemoon/items/c328a7bf0bc7a1fbef14
laravel ui/auth マルチログイン対応

##編集するファイルは以下

・routes/web.php （ルート設定）
・Providers/RouteServiceProvider.php（ログイン後の画面遷移設定）
・config/auth.php（ガード設定）
・Middleware/Authenticate.php（未ログインユーザーをリダイレクト）
・Middleware/RedirectIfAuthenticated.php（ログイン済ユーザーがlogin画面に来たときのリダイレクト）
・モデル(adminモデルとか)
・マイグレーションファイル(passwordリセットの分)


```web.php

Auth::routes();

```

ログイン後の画面遷移先を各アカウントごとに設定する。

```Providers/RouteServiceProvider.php

public const HOME = '/';
public const ADMIN_HOME = '/admin';

```

ガードの設定
ガードとは、
認証の際に、Auth::guard-nameと記述するだけで、どちらのアカウントで認証するかを簡単に書き換えられるっていうだけ。

```config/auth.php

    'defaults' => [
        'guard' => 'users',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'users' => [
            'driver' => 'session',
            'provider' => 'users',
        ], 
        // 2021-08-04 19:12:30　 S 
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        // 2021-08-04 19:12:30　 E

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        // 2021-08-04 19:12:30　 S 
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ]
        // 2021-08-04 19:12:30　 E
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],

        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ]
    ],

```

ログインしていないユーザーが認証付きページにアクセスした際の、リダイレクト先の設定。

```Middleware/Authenticate.php

    protected $user_route  = 'login';
    protected $admin_route = 'admin.login';

    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {

            if ($request->is('admin*')) {
                return route($this->admin_route);
            } elseif ($request->is('*')) {
                return route($this->user_route);
            } 

        }
    }
```

ログインしたくせに、またログイン画面に来たユーザーのリダイレクト先の設定。

```Middleware/RedirectIfAuthenticated.php
    private const GUARD_USER = 'users';
    private const GUARD_ADMIN = 'admin';

    public function handle(Request $request, Closure $next, ...$guards)
    {

        if(Auth::guard(self::GUARD_ADMIN)->check() && $request->routeIs('admin.*')){
            return redirect(RouteServiceProvider::ADMIN_HOME);
        }elseif(Auth::guard(self::GUARD_USER)->check() && $request->routeIs('*')){
            return redirect(RouteServiceProvider::HOME);
        }

```
Laravelの@includeを、railsの部分テンプレートみたいに使いたい


##@includeの使い方

Railsのようになんとなく使いたい。

####親側
・子供のbladeファイルを指定（ここでは、child.blade.php）
・子供に渡す変数があれば、値を渡す（ここでは、hogeとしている。）

```parent_blade.php
:
:
   @include('child', [ 'hoge' => $post])
:
:

```


####子供側
・変数さえ貰えば、動くので、特にやることはない。


```child_blade.php

<p> 記事のタイトルは、{{$hoge->title}}です。 </p>

```
Laravelでメンバー招待メール機能を実装

#実装したい内容

ユーザーをメール経由で招待したい。

#Model

メールモデルを作成する。

```.bash
php artisan make:mail InviteMail
```

```InviteMail.php
class InviteMail extends Mailable
{
    use Queueable, SerializesModels;

    //コントローラで定義した変数を引き継ぐ
    public function __construct($invite_url, $companyName)
    {
        $this->invite_url = $invite_url;
        $this->companyName = $companyName;
    }

    public function build()
    {
        return $this->subject('招待メール')
        ->view('emails.test')
        ->with(['invite_url' => $this->invite_url,'companyName' => $this->companyName]);
    }
}
```

#View

メールで招待するので、メールアドレスを打ち込むためのフォームを用意する。

```.blade.php
<form action="/enterprise/add_member" method="post">    
   @csrf        
   <input class="form-control" name="email" type="text">
   <input class="btn btn-primary" type="submit" value="投稿する">
</form>
```

__本文__

```emails/invite_blade.php
<h1>{{ $companyName }}スタッフへの招待</h1>

<p>あなたは、{{ $companyName }}のスタッフとして、招待されました。</p>
<p>以下のURLをクリックして、スタッフになりましょう！！</p>
<a href="{{$invite_url}}">参加する！</a>
```


# Controller



```.php

//メールファサードとメールモデルを宣言する。
use Illuminate\Support\Facades\Mail;
use App\Mail\InviteMail;
:

//メール本文に埋め込む変数を定義する。
$invite_url = "http://127.0.0.1/register";
$companyName = $company->name;

//どのメールモデルを使用するかを選び、引数に定義した変数を入れておく。
Mail::to($request->email)->send(new InviteMail($invite_url, $companyName));

//flashメッセージでも付与してviewを返してあげる。
return redirect()->back()->with('flash_message', '招待メールを送信しました。');

```

#参考：ざっくりメール送信までのフロー図

使用するファイル
__・メールモデル
・コントローラ
・メール本文__


```Controller.php
Mail::to($request->email)->send(new TestMail());
```

```TestMail.php
    public function build()
    {
        return $this
        ->subject('テスト送信完了')->view('emails.test');
    }
```

__メール__
宛先：$request->email
件名：テスト送信完了
本文：(emails/test.blade.php)
WordPressで期限が来たら表示変更（時限爆弾）


LP等で応募が終了した際に、わざわざコードをデプロイし直すが億劫なとき。

まずはじめに
基本的に、時間に関することは、全てUTCで表示される。
日本は、UTC+9なので、現在の時間を取得したら、9時間前の時刻が表示される。

世の中の時差変換サービスでは、夏はサマータイムが適用される
普段：UTC+9 → UTC
夏天：UTC+9 → UTC+1
※暗算で、日本時間−9時間として計算すれば、間違えることはない。

```.php
<?php
	$today = date("Y/m/d H:i:s"); //今日の日付
	$end = "2021/09/12 04:00:00"; //終了日

	if (strtotime($today) < strtotime($end)) {
?>

	<p>終了前に表示したい内容</p>

<?php
	} else if(strtotime($today) >= strtotime($end)) {
?>

	<p>終了後に表示したい内容</p>

<?php
	}
?>
```
スタイルに合ったテレワーク環境構築方法！

コロナ渦が収まるまで在宅勤務！と思い、
テレワーク環境を整えず我慢してきた方も多いのではないでしょうか？

コロナ渦が収束したとしても、テレワークという働き方がスタンダードになるのでは？
そんなことを考えさせるには十分なくらいコロナ渦が長期化してしまっています。

自分も執筆時点で、かれこれ２年間在宅勤務をしています。
最初は我慢して環境を整えていなかったのですが、
上記のような疑問からテレワーク環境を構築しました。

最適なテレワーク環境は人それぞれですが、
皆様の最適なテレワーク環境の実現に向け、個人的な環境構築の指針を記したいと思います！
（最後に購入して良かったものを載せていますので、そちらだけでも参考になればと思います）

#テレワーク環境構築の指針
ポイントは問題を明確にする！の一点になります。
「？？」となった方も多いと思いますので、自分の例で説明したいと思います。

#テレワーク環境の問題と解決方法
まずテレワーク当初の自分の環境についてです。
・PC（会社支給）
・ローテーブル
この二つだけでした。なので、「床に腰掛け、テーブルの上でPCを操作する」そんなテレワークススタイルから始まりました。このスタイルだと、肩こりがすごいんですよね。。。
ってことで、これが最初の問題でした。

調べたところ、PC操作による肩こりの原因は目線の位置と画面の位置の不一致からくる姿勢の悪さ。

これを改善するために、イスと机を購入しました。
机はボタン一つで高さを調整できるものにしました。（イスと机と視線位置のバランスを計算するのが面倒だったためです。）

まぁ、これで割と楽にはなったんですが、、、
ノートPCの画面をみて操作するとどうしても視線位置が下がってしまうことに気づきました。

これを解消するためにディスプレイ２台を購入し、ノートPCの画面は見ないスタイルにして、やっと肩こりがましになりました。（机の広さが気になる場合はモニターアームも一緒に購入するのがおすすめです。）

とまぁこんな感じで、肩こりを問題解決のためには
机、いす、ディスプレイが必要になったわけです。

#テレワーク環境構築で意識すべきこと
この後も、上に書いた状況ではノートPCはもはやただのキーボード（ノートPCの画面は見ないため）になってしまってるので、机を広く使うために、キーボードとマウスと縦置きPCスタンドを買ったり、プライベートのPCも社用PCもディスプレに出力するので、使い分ける際に毎回HDMIの抜き差しが面倒なので切替機を購入したり、広くなった机で本を読んだりもしたかったのでランプを買ったりしました。

この辺は個人の使用目的とそれを実現するにあたって現状のデスクが抱える問題がそれぞれで、それに対応する必要があるんだと思います。
「現状の環境でどんな問題が発生していますか？」
そこを意識し、解決することが個人のスタイルに合ったテレワーク環境の構築への近道だと思います。

#最後に、購入してよかった物と雑な感想
・ヘッドレスト付きチェア：ヘッドレストのおかげで首回りがマジで楽です。
・高さ調整できるデスク：たまに立って作業したりで気分転換してます
・ディスプレイ：２７インチ二枚だと文字も読みやすく、作業が捗った
・キーボード：打鍵感ある方が、、、なんかよくないですか？なんか。
・トラックボールマウス：机がごみだらけでも操作できる！

以上、ご精読ありがとうございました！
bladeでのformタグについてまとめる。

#例えばこんな記述を理解したい。

```.php
<input id="zipCode" type="text" name="zipCode" class="@error('zipCode') is-invalid @enderror" placeholder="※ハイフンなし" value="{{ old('zipCode') }}"  autocomplete="zipCode" autofocus>
```


#formタグの属性

##id属性

```.php
id="zipCode"
```
HTML的な属性。
後出てくるが、inputタグが、打ち込んだ内容を保持する時に、どのフォームかの識別をする時に指定する。

@errors('zipCode')
エラーがあるかどうかの判断も、idの値で行っている。
ここを、@errors('pref')などとした場合は、id=prefタグに対するエラーが表示される。


```.php
value="{{ old('zipCode') }}"
```

##name属性

```.php
name="zipCode"

$request->zipCode=入力した内容
```

PHP的な属性。
Requestファサードに格納される時の連想配列のキー名。

##type属性


__hidden__
画面上は表示されない隠しデータを指定する
__text__
一行テキストボックスを作成する（初期値）
__search__
検索テキストの入力欄を作成するHTML5から追加
__tel__
電話番号の入力欄を作成するHTML5から追加
__url__
URLの入力欄を作成するHTML5から追加
__email__
メールアドレスの入力欄を作成するHTML5から追加
__password__
パスワード入力欄を作成する
__datetime__
UTC（協定世界時）による日時の入力欄を作成するHTML5から追加
__date__
日付の入力欄を作成するHTML5から追加
__month__
月の入力欄を作成するHTML5から追加
__week__
週の入力欄を作成するHTML5から追加
__time__
時間の入力欄を作成するHTML5から追加
__datetime-local__
UTC（協定世界時）によらないローカル日時の入力欄を作成するHTML5から追加
__number__
数値の入力欄を作成するHTML5から追加
__range__
レンジの入力欄を作成するHTML5から追加
__color__
色の入力欄を作成するHTML5から追加
__checkbox__
チェックボックスを作成する
__radio__
ラジオボタンを作成する
__file__
サーバーへファイルを送信する
__submit__
送信ボタンを作成する
__image__
画像ボタンを作成する
__reset__
リセットボタンを作成する
__button__
汎用ボタンを作成する


##autocomplete属性

```.php
autocomplete="zipCode"
```

zip過去に入力した内容が入力候補として表示されるようになる。

![スクリーンショット 2021-09-10 16.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/dd3e319c-dc10-a7ac-9779-b89fccc726ce.png)

#autofocus属性

```.php
autofocus
```

値を持たない属性。
画面が表示した時に、どのフォームに打ち込むように選択されている状態のタグに書き込む。

![スクリーンショット 2021-09-10 16.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/f4c12eff-23b8-1792-2fa3-dce6354558db.png)


##value属性

```.php
value="{{ old('zipCode') }}"
```

リダイレクトバックしたときなどに、一画面前に入力した内容がフォームに残っているようにするもの。
他にも初期値などを設定できる。
この時は、idを指定することで、値を保持できる。

__例えば！__
以下のように記述すれば、同ページ内のid='prefecture'のinputタグのさっき打った値がでてくる。

```.html
<input ~~ value="{{ old('prefecture') }}">
```

##placeholder属性

```.php
placeholder="※ハイフンなし"
```

valueではないが、空のときに、薄い灰色の時で文字を置く。
Laravelでconfigによるステータス定義


#configを作成する。

```config/membership.php
<?php
return [
    'status' => ['representative' => '0', 'member' => '1', 'staff' => '2'],
];
?>
```

#Bashで動きを見てみる。

```.bash
php artisan config:cache

Psy Shell v0.10.8 (PHP 7.4.3 — cli) by Justin Hileman
>>> config('membership.status.staff')
=> "2"
```

#コントローラ内でのコードが美しくなる。

```MemberController.php

 $user->status = config('membership.status.staff');
 
//従来は、、、以下のようなダサい書き方をしていた。

 $user->status = 2; //スタッフの番号

```
デプロイ後エラー、その後localhostもエラー

原因は結局のところよくわからないのですが、




調べたところ




localhostでは動いているがデプロイ後エラーが出ている人がいました。

その場合は




・閲覧履歴データの削除・キャッシュ・Cookieを削除する




と良いみたいです。




キャッシュの消し方↓

Chromeの場合
パソコンで Chrome を開きます。
画面右上のその他アイコン  をクリックします。
[その他のツール]  [閲覧履歴を消去] をクリックします。
上部で期間を選択します。すべて削除するには、[全期間] を選択します。
[Cookie と他のサイトデータ] と [キャッシュされた画像とファイル] の横にあるチェックボックスをオンにします。
[データを消去] をクリックします。




ブラウザなどを利用すると、ウェブサイトの情報がキャッシュやCookieに保存される。

キャッシュやCookieなどを消去すると、サイトの読み込みや表示形式に関する問題の一部が解決することがある。







私の場合は、エラーが読み込まれずにテストなどをクリアし、デプロイ時に再度読み込まれエラーが発覚したのかもしれません。

事例がなかったので一応書いておきます。

しょうもない奇跡を起こしてしまったのかもしれません。。。
Laravelで外部キー以外の中間テーブルのカラムも取得したい。withPivot

**usersとcompaniesを、belongsという中間テーブルを介してつなぐ時
中間テーブル上の外部キー以外のカラムも取り出せるようにしたい。
"member_status"もついでに取り出したい。**


__belongs__

| ID | user_id | company_id | member_status |
|:-:|:-:|:-:|:-:|
| 1  | 12  | 2  | 2  |
|  2 |  4 |  7 | 2  |
|  3 |  4 |  65 | 1  |
|  : |  : |  : | :  |



```Company.php
    public function members()
    {
      return $this->belongsToMany(User::class, 'belongs')
          ->withPivot(['member_status']);
    }
```
以下の記述で、取り出すことが出来る。

```blade.php
  {{ $user->pivot->member_status }}
```
【Next.js】レンダリング手法を手書きで図解してみた(CSR / SSR / SSG / ISR)

おはこんばんちは、ちーずです。
本日のテーマは、Next.jsにおけるレンダリング手法に関してです！！

Next.jsでは、柔軟にレンダリング方法が切り替えることができますが、
一方でそれぞれの特性を理解して適切に使わないといけません。

その特性を理解するために記事にしました！


## CSR(Client Side Rendering)
CSRは、名前の通りクライアントサイドでレンダリングする手法です。

![CSR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/bd21e3c5-a803-15a7-c119-c4c838058435.png)

ブラウザからリクエストがあった時に、

* ほぼ中身のないHTML
* 全ページの情報を持ったJavaScript、CSS

これらがサーバー側から返されます。
そして、クライアント側でデータの取得を行い、レンダリングします。

### メリット
* 遷移がサクサクでよいユーザー体験が提供できる
* ホスティングが容易

### デメリット
* 初期ロード時に他ページの処理も含めてレンダリング送、初期ローディングは時間がかかる
    * SEOサイトには向いていない


## SSR （Server Side Rendering）
SSRも、名前の通りサーバーサイドでレンダリングする手法です。

![SSR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/1fa8a836-9e68-1dfb-91ea-b0d4c0426a5a.png)

SSRでは、ブラウザからリクエストがあった時に、サーバー側でAPIを叩き、レンダリングまでを行います。
レンダリングされたデータをブラウザ側に返します。
(通常のwebのレンダリングの仕組みに一番近いです。)

### メリット
* コンテンツ表示までの時間が早く、SEOに有利

### デメリット
* SSRを実行できる実行環境が必要
    * 開発環境のセッティングが容易ではない
* サーバーサイドの処理肥大化によって、重くなるケースもある
* サーバー側で実行されているか、クライアントで実行されているかちゃんと理解しないと、重複発火などが起きる

## SSG (Static Site Generator)
SSGは「静的サイトジェネレーター」といい、静的なサイトを事前にビルドしておく仕込みのことを指します。
最近では、SG (Static Gneration)と言われています。

![SSG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/c2ed300e-fcec-76a8-6914-fab1bb93e499.png)

ビルド時にあらかじめデータを取得し、データを埋め込んだ状態でHTMLを生成します。
その静的なHTMLを、リクエストがあった時に返してあげるような仕組みになっています。

### メリット
* 静的サイトを配信するため、パフォーマンスが良い
    * SEOにも一番有利！
* ホスティングが容易(静的なHTMLとJSファイルのみであるため)

### デメリット
* ページが増えれば増えるほど、ビルドに時間がかかってしまう
* 更新に向いていない

## ISR (Incremental Static Regeneration)
ISRは「インクリメンタル静的再生成」といい、SSGを決まった間隔で再度レンダリングしつづけるものです。
クチコミのような、頻繁に更新されるサイトに対して使われます。


![ISR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/5ca36120-d7ea-6665-ce3b-c7db6d2815ef.png)


### メリット
* SSGのメリットはそのまま継承し、その上で更新が可能になった

### デメリット
* vercel依存

## 参考

https://qiita.com/thesugar/items/47ec3d243d00ddd0b4ed


https://shimablogs.com/spa-ssr-ssg-difference
ムームーで新しくドメインを設定し、nslookupで確認する。


#ムームーでのサーバー設定

サブドメインを追加したい時に、選択肢は２つ。

①ロリポップでDNS（名前解決）をする。➡設定１
②ロリポップ以外のサービスでDNS（名前解決）をする。➡設定２

ネームサーバー設定変更にあるセットアップボタンを押す。
遷移した画面で、以下のフローで設定を行う。

####①の場合
・ムームーでサブドメインを発行する。
・DNS設定ページで、設定１　ホームーページ欄で、ロリポップを使用するにチェック。

####②の場合
・CNAMEレコードがないので、該当するサーバーのコンソール画面から、IPアドレスを抜いてきて、AとAAAAレコードですべて設定する。
（その代わり、該当するサーバー側でのDNSの設定はない。）


#nslookup
nslookupコマンドを使えば、DNSのサーバーに直接DNS要求を送り、
その結果を表示できる。サーバーに正しくドメインが設定されているかを確認できる。
ムームーなどでドメインを割り当てた際には、必ずこのコマンドでチェックするようにする。

```.bash
# nslookup [URL] 1.1.1.1
nslookup test.daisuki-kanko.jp 1.1.1.1


# ない時
Server:		1.1.1.1
Address:	1.1.1.1#53

**server cant find test.daisuki-kanko.jp: NXDOMAIN

# ある時
Server:		1.1.1.1
Address:	1.1.1.1#53

Non-authoritative answer:
Name:	test.daisuki-kanko.jp
Address: 160.251.122.236

```
サブドメインでメール登録

サブドメインに対して、メールアドレスを割り当てることができる。

###DNS側の設定

サブドメインの場合は、MXレコードではなく、Aレコードで名前解決する。

| サブドメイン | レコード | 宛先 |
|:-:|:-:|:-:|
| sub  | A | メールサーバーのIPアドレス  |

###XREA側の設定

メールを新規作成から、ムームーで設定したドメインを有するメールアドレスを生成する。
サンダーバードで設定する場合は、以下が必要になる。
・メールアドレス
・パスワード
・POP/SMTPサーバー名


![スクリーンショット 2021-10-09 18.53.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/5651ddd8-20aa-513b-4bbe-cb204b352fe8.png)

###Thunderbird側の設定

アカウントを新規追加し、
POP/SMTPサーバー名として、
それぞれ、
m4.xrea.com　、ポート995、ポート465を指定する。
新規作成仕立ての頃は、完了がうまくいかないので、　15分ほどコーヒーでも飲んで待っておく。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/e6a7f5be-eae9-1fdd-8b28-48d3fafaf94a.png">
GraphQLオブジェクトタイプのフィールドは閲覧範囲を揃えて閲覧可否の判定を楽にしよう

GraphQLでオブジェクトタイプを作る際、DBのテーブル定義と一致させることがあると思います。
ただ、テーブルには閲覧範囲が異なるカラムが混在している事があるため、閲覧可否の判定が煩雑になることがあります。

例えばユーザー情報を保持するオブジェクトタイプについて考えてみます。

# users テーブル
ユーザー情報が格納されているテーブル
ニックネームは全体に公開されますが、その他の情報は本人のみ閲覧可能な情報としています。

| Name | Type | Nullable | Comment |
| ---- | ---- | -------- | ------- |
| id | bigint | false ||
| name | varchar(255) | false |名前。本人のみ公開|
| email | varchar(255) | false |メールアドレス。本人のみ公開|
| nickname | varchar(255) | false |ニックネーム。全体に公開|

# 実装するクエリー

usersテーブルに格納されているデータを取得する2種類のクエリーを考えます。

* ログインユーザーが自身のid, name, email, nicknameを取得するクエリー
* 任意のユーザーが指定したユーザーのid, nicknameを取得するクエリー

# Userタイプ

まずはGraphQLのオブジェクトタイプを実装します。
どちらのクエリーでも使えるようにusersテーブルのスキーマと同じフィールドを定義しました。

```graphql
type User {
  id: Int!
  name: String!
  email: String!
  nickname: String!
}
```

# クエリー

次にクエリーを実装します。

## viewer

こちらはログインユーザーの情報を返却するクエリーです。

```graphql
type Query {
  viewer: User!
}
```

クライアントからは下記のクエリーを使います。

```graphql
query Viewer {
  viewer {
    id
    email
    name
    nickname
  }
}
```

## profile

こちらは指定したユーザーの情報を返却するクエリーです。

```graphql
type Query {
  profile(userId: Int!): User!
}
```

クライアントからは下記のクエリーを使います。

```graphql
query Profile($userId: Int!) {
  profile(userId: $userId) {
    id
    nickname
  }
}
```

# ここまでの問題点

ここまでで要件を満たす2つのクエリーを作ることができました。
ただ、1点重大な問題点があります。

GraphQLは取得するフィールドをクライアントから指定できるのが特徴です。
ということはprofileクエリーを下記のように実行することもできます。

```graphql
query Profile($userId: Int!) {
  profile(userId: $userId) {
    id
    email
    name
    nickname
  }
}
```

profileクエリーは誰でも実行できる仕様なので、fieldにnameやemailを加えて実行すると誰でもメールアドレスや名前が取得できてしまいます。

# どうするか？

バックエンドの実装を作り込めばfield単位でアクセス制御をすることが可能です。
例えば、emailやnameはログインユーザーと一致しているユーザーの場合のみ返却するような制御を実装すればOKです。

ただ、今までGraphQLを使ってきた私の感覚では、field単位で閲覧可否の判定をすると実装が煩雑になり、また実装漏れをしてしまう可能性も高いと感じています。

そこで私が実践しているのは、オブジェクトタイプには<b>閲覧範囲が異なるフィールドを持たない</b>です。
オブジェクトタイプ内のfieldの閲覧範囲が一定であれば、クエリーの呼び出し時に閲覧可否の判定をすれば良くなります。

今回の例の場合、本人のみ閲覧可能なfieldを含んだものと誰でも閲覧可能なfieldだけの2つのオブジェクトタイプを作り、viewerとprofileからそれぞれを使うようにします。

```graphql
type CurrentUser {
  id: Int!
  name: String!
  email: String!
  nickname: String!
}

type User {
  id: Int!
  nickname: String!
}

type Query {
  viewer: CurrentUser!
  profile(userId: Int!): User!
}
```

このようにすることで、オブジェクトタイプが多少冗長にはなりますが、閲覧可否の判定はクエリー単位で考えれば良くなり実装をシンプルにすることができます。
Laravelでメンテナンスモードに切り替える


###メンテナンスモードにする。

Laravelではコマンド一つで簡単にメンテナンスモードに切り替えることが可能
以下のコマンドでメンテナンスモードに切り替えられる。
アクセスすると、503画面が表示される。

```.bash
#サーバーで以下のコマンドを入力すると、メンテナンスモードに入る。
php artisan down
```

###メンテナンスモード（パスワード付き）にする。

Basic認証みたいにしたい場合（パスワードを知っている人は入れる）は、--secretオプションを使う。

```.bash
#パスワードを設定して、メンテナンスモードに入る。
php artisan down --secret="A8mrLZ3x"
```

[URL]/A8mrLZ3xでアクセスすれば、認証が完了し、"/"にリダイレクトする。
以降認証情報は保存され、パスワードを入れる必要はなくなる。

###メンテナンスモードを中断する。

```.bash
#メンテナンスモードを中断する。
php artisan up
```

###メンテ画面をカスタマイズしたい場合

resource/errors/503.blade.phpを書き換える。

```.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>@yield('title')</title>

        <!-- Fonts -->
        <link rel="preconnect" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css2?family=Nunito&display=swap" rel="stylesheet">

        <!-- Styles -->
        <style>
            html, body {
                background-color: #fff;
                color: #636b6f;
                font-family: 'Nunito', sans-serif;
                font-weight: 100;
                height: 100vh;
                margin: 0;
            }

            .full-height {
                height: 100vh;
            }

            .flex-center {
                align-items: center;
                display: flex;
                justify-content: center;
            }

            .position-ref {
                position: relative;
            }

            .content {
                text-align: center;
            }

            .title {
                font-size: 36px;
                padding: 20px;
            }
        </style>
    </head>
    <body>
        <div class="flex-center position-ref full-height">
            <div class="content">
                <div class="title">
                    <img src="images/maintenance/maintenance.png">
                    <p>システムメンテナンスのお知らせ</p> 
                </div>
            </div>
        </div>
    </body>
</html>

```
Laravelでメール本人認証機能（Auth/ui）

#auth/uiでメール認証機能を有効化

__仮登録（ユーザー名、メール、パスワード）
⬇
メール認証
⬇
本登録完了__

###修正するファイル
・web.php（ルート）
・Model\User.php（モデル）
・Controller.php(認証ブロックを付けたいコントローラ(ここでは、HomeController))

#web.php

 ```.php
Auth::routes(['verify' => true]);
//------------------------------
// Auth::routes();
```

#User.php

```User.php
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
use Illuminate\Auth\MustVerifyEmail;
// ーーーーーーーーーーーーーーーーーーーーーーーーーーー
// use Illuminate\Contracts\Auth\MustVerifyEmail;
:
:
Class User extends Authenticatable implements MustVerifyEmailContract
// ーーーーーーーーーーーーーーーーーーーーーー
// class User extends Authenticatable
{
```

#Controller.php

```HomeController.php
    public function __construct()
    {
        $this->middleware('verified');
        //----------------------------
        //$this->middleware('auth');
    }
```


#余談

###認証メールの解説

![スクリーンショット 2021-08-23 12.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/58015a76-8650-f236-1eb7-36fdfd86c683.png)

ボタンのリンクは以下のような形

```.bash
/email/verify/(ユーザーID)/hash?expires=（有効期限）$signature=(署名)
```

```.bash
#user->id = 3のユーザー
http://127.0.0.1/email/verify/3/8ea6137184b4298b2f550f5834ee31f80f59b304?expires=1629685982&signature=aeb6ffb3681bd6f3fcb4c0341db5596aea982c59eb0232eb1d30ce398c143044

#user->id = 1のユーザー
http://127.0.0.1/email/verify/1/abd800ce5b346703821c385da2aa4aad5ace231b?expires=1629685921&signature=58d608c85f75beec85c6019343d29a1113ad60b31962fa94aaaebcd9e9d189b3
```


以下はパスワードリセット

```.bash
http://127.0.0.1/password/reset/a115872add0ed417936c99c576a55d0bb4c6f3b19b5b21054ae0ae289044c6f3?email=c%40t
```
Abstract Factory パターンについてまとめてみた【Swiftでデザインパターン攻略 #3】

## Abstract Factory パターン とは
#### 概要
Wikipediaによると、
「関連するインスタンス群を生成するための API を集約することによって、複数のモジュール群の再利用を効率化することを目的とする。」デザインパターンのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/a8b82b81-fc31-466b-a099-a4c9a6218069.png)
[Wikipediaより](https://ja.wikipedia.org/wiki/Abstract_Factory_パターン)

#### SwiftにおけるAbstract Factory パターン
iOSアプリ開発で活用する場合、VCやViewなどが生成したい「モノ」の具象クラスを意識せずに、共通のプロトコルに準拠したインスタンスを取得するために使えます。

オブジェクト生成の責務をView側から切り離すとともに、インスタンス化をカプセル化(秘匿化)することが可能です。

インスタンスの生成に関する修正が発生したときに、View側を触らなくていいというのも良きですね。

## 実装例
今回は、飲料水を製造する工場を例として考えました。
工場に渡した材料によって、異なる飲み物を提供するというサンプルプログラムを書きました。
「ビールクラス」と「りんごジュースクラス」はそれぞれ「飲み物プロトコル」に準拠しています。

#### SampleCode
```swift
// MARK: 工場のインターフェース
protocol DrinkFactoryProtocol {
    func create() -> Drink
}

// MARK: 工場の具象クラス
class BeerFactory: DrinkFactoryProtocol {
    func create() -> Drink {
        return Beer()
    }
}

class AppleJuiceFactory: DrinkFactoryProtocol {
    func create() -> Drink {
        return AppleJuice()
    }
}

// MARK: 飲み物のインターフェース
protocol Drink: AnyObject {
    var name: String { get }
    func served(age: Int) -> String
}

// MARK: 飲み物の具象クラス
class Beer: Drink {
    
    var name: String = "ビール"
    
    func served(age: Int) -> String {
        return age >= 20 ? "美味しいビールができました。" : "20歳に満たないため、提供できません。"
    }
}

class AppleJuice: Drink {
    var name: String = "りんごジュース"
    
    func served(age: Int) -> String {
        return "100％のりんごジュースです。"
    }
}

// MARK: use
// ここでは、注文された飲み物によって生成するインスタンスを決定する工場全体の役割
class DrinkFactory: DrinkFactoryProtocol {
    
    let drink: InStockDrink
    
    enum InStockDrink {
        case beer
        case applejuice
    }
    
    init(ordered: InStockDrink) {
        self.drink = ordered
    }
    
    func create() -> Drink {
        switch drink {
        case .beer:
            return BeerFactory().create()
        case .applejuice:
            return AppleJuiceFactory().create()
        }
    }
}

let factory = DrinkFactory(ordered: .beer)
let drink = factory.create()

print(drink.served(age: 18))    // 20歳に満たないため、提供できません。
```

コードをみればおわかりかと思いますが、インスタンス生成時に、具象クラスを意識しなくても、何かしらの引数を渡せばそれに適したインスタンスが戻ってくるという構造ができあがっています。

以上です！
それFFmpegで出来るよ！2

[それFFmpegで出来るよ！](https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8) の続きです。
久しぶりに記事を更新したら、Googleの検索順位が変動したので、更新分をこちらへ一時的に移動してみることにしました。
ケース8~10はこちらに書きます。

#ケース8:動画を連結したい
動画同士を連結したいときもFFmpegなら比較的簡単!

まずは連結したい動画のリストを作る
`input01.mp4`と`input02.mp4`と`input03.mp4` を連結したいときは以下のように `inputs.txt` に書く

```text:inputs.txt
file './input01.mp4'
file './input02.mp4'
file './input03.mp4'
```
`inputs.txt` を作成して、次のコマンドを実行すると、複数の動画が連結される。

```bash:inputs.txtにリストされた動画を連結してoutput.mp4を作成する
ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mp4
```

`-safe 0`のオプションをつけているので、動画リストのファイルパスは絶対パスでも相対パスでも良い。
連結したい動画のコーディック(h.264やvp9など)がすべて同じなら `-c copy`オプションをつけることで、 **高速・無変換・無劣化** で連結できる。

連結する動画がたくさんあるならこのやり方でも手間はかからないが、 **動画A+動画B=動画C**みたいに、2つの動画をつなげたいときに、**`inputs.txt`を作成するのは手間**
そんなときは以下のコマンド、`-filter_complexs`を使って結合する

```bash:input01.mp4とinput02.mp4をつなげてoutput.mp4を作成する
ffmpeg -i input01.mp4 -i input02.mp4 \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
```
※ `-filter_complex` の詳細は長くなるので、ここでは割愛する

**拡張子・コーディックが違くても大丈夫**

```bash:input01.mp4とinput02.webmをつなげてoutput.movを作成する
ffmpeg -i input01.mp4 -i input02.webm \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mov
```

**ただし、動画を連結する際、気をつけないと行けないのは、異なるサイズの動画は上記の方法では連結できない...**
例えば、 「解像度`640x480` の動画」と「解像度`1920x1080` の動画」を結合することはできない。もし結合したい場合、どちらかの解像度に **ケース6:動画をリサイズする** を参考に、解像度を変換してから結合する。

#ケース9:動画をクロップ(トリミング)したい

画像でよくするトリミングもFFmpegならコマンドだけできる！
基本的なコマンドは次の通り

```bash:動画をクロップする
ffmpeg -i input.mp4 -vf crop={X size}:{Y size}:{X position}:{Y position} output.mp4
```

切り出す基準となる原点と、そこから切り出す動画の解像度を指定する
`X size` : 切り出す横幅ピクセル数
`Y size` : 切り出す横幅ピクセル数
`X position` : 切り出すX座標原点
`Y position` : 切り出すY座標原点

<!-- 図を入れる -->

例を挙げると次のように指定する

```bash:動画を左上からX座標50ピクセル、Y座標75ピクセルの位置から横1280ピクセル、縦720ピクセルのサイズでトリミングする
ffmpeg -i input.mp4 -vf crop=1280:720:50:75 output.mp4
```

難点なのは、絵を見ながら切り抜けないところではあるが、
半分の大きさや1/4の大きさを切り出すといったときには、とても便利

参考: https://w.atwiki.jp/kobapan/pages/173.html

# ケース10:動画の特定の時間範囲を取り出したい
執筆中

# 編集後記
一つの記事に情報量を詰め込むのはあまり良くないんですかね...
【パワポエンジニア必見！】異なるPowerPointテンプレート間でシステム構成図をキレイにコピペする方法【GIF動画付き】

# はじめに

どーも。パワポエンジニアです。
日々、コードを書くこともなく、パワポをキレイに作ることに業務の9割以上を費やしています。

パワポエンジニアとして働いていると、他社からパワポの資料を受領し、自社のパワポのテンプレートにコピペしたいことはないでしょうか？
私はあります。よくあります。
そんなとき、困るのはテンプレートが異なることでうまくコピペができないことです。

私は悩みました。そして、この問題と10年以上格闘してきました。
いままで行ってきた方法は**「図として貼り付ける」**ということです。
これなら、受領した資料をそっくりそのまま自社のパワポに落とし込むことができます。

ただし、これは後々面倒なことが起きます。
ひとたび、上司から**「ここ直しといて」**と言われても、図として保存されているため、ちょっとした修正すらできません。
そんなときは、元ネタのパワポを探すためにメールやらSlackやらRedmineやらを漁りまくるのですが、なかなかお目当てのファイルを見つけることはできません。
しょうがないので無理くりオブジェクトを上に被せて、ツギハギで修正する羽目になります。

そんなとき、やっとよい方法が見つかりました。
多くの人にとって、これから紹介する方法は**「こんなの当然知ってるわ！」**というものかもしれません。
でも私にとって、これは画期的な解決策でした。

ということで、前置きが長くなりましたが、その具体的な方法を紹介します。

# そもそもパワポがうまくコピペできない問題とは？

例えば、AWSのシステム構成図をコピペしたいとします。
以下の[AWSアイコン集](https://aws.amazon.com/jp/architecture/icons/)に載ってる図を例とします。

![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/15faa8c6-6f14-843d-d24e-a96c46e821b0.jpeg)

これのシステム構成図の部分をコピーします。

|![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/5f587ad3-747d-c4c3-a9cd-89ed86deba8f.jpeg)|
|:-:|

そして、自社のパワポのテンプレートにペーストすると

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/f2704c4f-b0dc-fbca-2edd-cdabf43f986c.jpeg)

なんかパワポの領域をはみ出してしまった。。
ここから各オブジェクトのサイズを一気に縮小しようとすると、

![gucha.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/441de97b-e9aa-8307-50a2-34310cf2defd.jpeg)

元の図がクズれてしまい、ひどいことになります。
なので、今までは**「図として貼り付ける」**という方法を行い、サイズを調整していたわけです。

# これで解決！

ここからが具体的な方法の紹介です。
元の構成図をコピーし、自社のフォーマットにペーストした後に、**全オブジェクトをグループ化**します。

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/6a455541-3c7a-e009-e5f4-2ee44222aa2f.jpeg)


グループ化すると1つのオブジェクトとして扱えるので、ここからサイズを縮小します。

|![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/a1cdc79c-a912-901d-6e5b-2a9552325ff3.jpeg)|
|:-:|

パワポの領域に収まり、だいぶマシになりました。
ただ、少し文字が大きいようなので、小さくなるよう**フォントを調整**します。

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/fe06815c-ceee-74bc-7c65-aee8e29f06ef.jpeg)

元の図と遜色なく、だいぶいい感じになりました。
後は**グループ化を解除**すればOKです。

# 動画を作ってみた

文字で読むより実際に見たほうが早いということでGIFアニメーションを作りました。

![完成品パワポコピペ720.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/42ef58d5-f1a2-cc94-a7f9-55f4db404ac9.gif)

ちなみに、画面の録画はWindows10標準機能となる**［Windows］＋［G］**を押せば使えるゲームバー、動画編集（テロップ入力など）は**[Adobe Premiere Pro](https://www.adobe.com/jp/products/premiere.html)**、MP4→GIFへの変換は**[convertio](https://convertio.co/ja/mp4-gif/)**、GIFアニメーションの編集（倍速再生、サイズ圧縮）は**[Online GIF optimizer](https://ezgif.com/optimize)**を使いました。


# おまけ（ペーストする際に色やフォントが変わってしまう場合）

パワポのテンプレのテーマによっては、ペーストする段階で、色やフォントが盛大に変わってしまう場合があります。
これはペーストする際のデフォルトの動作が**「貼り付け先のテーマを使用」**になっているためです。
こんなときはペーストする際に**「元の書式を保持」**を選択しましょう。

![tips.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/be3eb2d0-a252-3716-4810-882dbcd7eff1.jpeg)


# さいごに

ということで、知ってる人にとってはなんてことはない方法の紹介でした。
しかしながら、私が今まで見てきたパワポの資料の中でも、図として貼り付けられていて修正できない資料はよく見てきました。
ということは、この方法を知らない人も結構多いということでしょう。

この記事が多くのパワポエンジニアの業務効率化につながれば幸いです。