OmniAICreator/Qiita-1.07M huggingface dataset:
【対処法・自分用】[Firebase] Cloud Firestore データベースへのクライアント アクセスが〇日後に期限切れになります 

メールでタイトルのような文面が送られてきた。

##対処法
期限を延長する。
プロジェクトのトップページ→Cloud Firestore→ルールに移動。

timestampの値を1年後なり、10年後なり変えると保存ボタンが出てくるので押す。

![スクリーンショット 2020-10-26 11.13.0513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/58e67eba-634e-d81b-b8a8-e7644ecafc5d.png)



firebaseの設定次第ではDatabaseページから設定をするとのこと。
https://qiita.com/sloth19920731/items/5248a62bd969336a0ae1

 http://code-aim.work/firebase-cloud-firestore/
sshとscpコマンドメモ

# いつも忘れるコマンドをメモ

## ssh

ローカルPCでサーバーPCにログイン．

```
$ ssh ssh先のユーザー名@ssh先のIPアドレス
```

## scp

サーバーPCから，指定したファイルやフォルダをローカルPCにコピー．

ファイルなら

```
$ scp ssh先のユーザー名@ssh先のIPアドレス:/絶対パス/to/file path/to/保存したいところ
```

フォルダなら

```
$ scp -r ssh先のユーザー名@ssh先のIPアドレス:/絶対パス/to/file path/to/保存したいところ
```
Docker × Rails × RSpecで開発環境で’Could not find ’＊＊＊＊’ in any of the sources’が出た時の対処方法

#【Rails】Docker × Rails × RSpecの開発環境で’Could not find ’＊＊＊＊’ in any of the sources’が出た時の対処方法

```ruby:Gemfile
group :development, :test do
  ~ 以下追加 ~
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end
```
Gemfileを更新したのでdockerコマンドでbundle install実行

```
$ docker-compose run web bundle exec rails g rspec:install
```

##エラーメッセージ
```
Could not find diff-lcs-1.4.4 in any of the sources
Run `bundle install` to install missing gems.
```

色んな記事を参照させてもらって実行してみるもなかなかうまくいかず・・・

##解決方法
いろいろググっている内にキャッシュで bundle install が実行されないていない場合がある？という記事を見させていただき、早速実行しました

```
$ docker-compose build --no-cache
```

##実行結果
```
$ docker-compose run web bundle exec rails g rspec:install
Creating app_run ... done
Running via Spring preloader in process 64
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```
見事クリエイトに成功

##原因
docker-compose build しても cache が有効になっていて設定変更が反映されてうまく動作しないことがあるので、開発中にGemfileを更新した時は

```
$ docker-compose build --no-cache
```
で実行する方がいいとのことです

##まとめ
spring stop関連の記事が多かったため解決するのに時間がかかってしまった点が反省点。でも初学者だからこそこの積み重ねが大事とも感じました

##参考

以下の記事参考にさせていただきました！ありがとうございました！

[Dockerでコンテナ内にbundle installされない問題の解決法](https://fuqda.hatenablog.com/entry/2019/03/21/204118)
[docker をキャッシュを使わないでビルドする](https://hacknote.jp/archives/47137/)
Ansible実行時にvarsを外部ファイルから注入する方法

```
ansible-playbook playbook.yml --extra-vars '@file.json'
```

jsonか、yamlを指定できます。`@`を付けないとファイルとして認識されないので注意。

## 参考

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#vars-from-a-json-or-yaml-file
Flutter作成時/構成パターンに参考したまとめ(随時更新)

## 概要
こげぱんが作成する時にまとめになります。
どなたかの参考になれば嬉しいです。

## 状態遷移手法
state_notifier + freezed + Provider + dio

###  参考URL
https://itome.team/blog/2020/05/flutter-state-notifier-provider/
https://medium.com/flutter-jp/state-1daa7fd66b94
https://qiita.com/RyoShimizu/items/a625bb96f93b759f67b8

## Flutterの基礎まとめ
https://itome.team/blog/2019/12/flutter-advent-calendar-day7/

## サンプルソースコード
https://github.com/karamage/flutter_state_notifier_freezed_sample/tree/master/lib

こげぱん作成サンプルコード
https://github.com/kogepan159/flutter_base_project

## API通信
dio
https://pub.dev/packages/dio

## 非同期処理
https://qiita.com/yasutaka_ono/items/6d2a0d3b0856598f9788

## ディレクトリ構造
https://qiita.com/tetsukick/items/ff7726c9cabfa90e86e8

## delegate機能？？
https://stackoverflow.com/questions/53625620/how-to-implement-event-listener-or-delegate-on-flutter

## Segment
https://flutteragency.com/cupertinoslidingsegmentedcontrol-widget/

## 立ち上げ時に処理
https://qiita.com/yu124choco/items/b518a2757ce6d7d00134

## アプリ再起動
https://stackoverflow.com/questions/50115311/flutter-how-to-force-an-application-restart-in-production-mode
Ansibleのテンプレート(jinja2)で、{{}}を無視する方法

Jinja2テンプレートの中で`{{}}`をそのまま使いたいときがありますね？そういうときは`{% raw %}{% endraw %}`で無視したい部分を括ります。

## 例

```jinja
    annotations:
      summary: "Endpoint {% raw %}{{ $labels.instance }}{% endraw %} down"
      {% raw %}description: "{{ $labels.instance }} of job !unsafe{{ $labels.job }} has been down for more than 10seconds."{% endraw %}
```
最強のLaravel開発環境(Docker)を日本時間にする

# はじめに（開発環境構築）
https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4

こちらの神リポジトリをcloneし、利用しようとしたときに、
TimeZoneがUTCだったため、日本時間に修正した際の備忘録となります。

下記構成内のDockerfileを修正します。
コンテナを立ち上げたことがあるものに対して実施する際には、
コンテナ停止時にDockerfileを修正し、再ビルドを実施してください。

#ディレクトリ構成

```
├── backend # Laravelプロジェクトのルートディレクトリ
├── infra
│     └── docker
│          ├── mysql
│          │   ├── Dockerfile
│          │   └── my.cnf
│          ├── nginx
│          │   ├── Dockerfile
│          │   └── default.conf
│          └── php
│              ├── Dockerfile
│              ├── php-fpm.d
│              │   └── zzz-www.conf => unixドメインソケットの設定ファイル
│              └── php.ini
├── Makefile
└── docker-compose.yml
```


#mysql

##修正箇所

```Dockerfile:docker-laravel\infra\docker\mysql\Dockerfile
# ENV TZを変更する（4行目付近）
# ENV TZ=UTC \
ENV TZ=Asia/Tokyo \
```


##確認方法
build、コンテナ立ち上げ(up)が完了後、の作業になります。

```shell:shell
$ make db
# $ docker-compose exec db bash (上記makeコマンドの内容)
root@XXXXXXX:# mysql -u root -p -h 127.0.0.1
Enter password: secret
# Dockerfileに記載されている8行目付近のPWを記入してください。
#  MYSQL_ROOT_PASSWORD=secret
#                      ￣￣￣￣
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)
```
system_time_zoneにJSTが表示されれば問題ありません。

#nginx
##修正箇所

```Dockerfile:docker-laravel\infra\docker\nginx\Dockerfile
# ENV TZを変更する（6行目付近）
# ENV TZ=UTC
ENV TZ=Asia/Tokyo
```

##確認方法
build、コンテナ立ち上げ(up)が完了後、の作業になります。

```shell:shell
$ make web
# $ docker-compose exec web ash  (上記makeコマンドの内容)
/work/backend# date
```
現在時間が表示されれば問題ありません。


#php
##修正箇所

```Dockerfile:docker-laravel\infra\docker\php\Dockerfile
# timezone environmentを変更する（5行目付近）
# ENV TZ=UTC \
  # locale
#  LANG=en_US.UTF-8 \
#  LANGUAGE=en_US:en \
#  LC_ALL=en_US.UTF-8 \
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8 \
```

```Dockerfile:docker-laravel\infra\docker\php\Dockerfile
# localの設定を変更（36行目付近）
#  locale-gen en_US.UTF-8 && \
#  localedef -f UTF-8 -i en_US en_US.UTF-8 && \

  locale-gen ja_JP.UTF-8 && \
  localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
```

##確認方法
build、コンテナ立ち上げ(up)が完了後、の作業になります。

```shell:shell
$ make app
# $ docker-compose exec app bash (上記makeコマンドの内容)
root@XXXXXXX:/work/backend# php -r 'echo date("Y/m/d H:i:s"),PHP_EOL;'
```
現在時間が表示されれば問題ありません。

# 最後に
以上で対応完了となります。
誰かの一助になれば幸いです。

誤りやもっと良い改修方法があればコメントにてご教示いただけますと幸いです。
よろしくお願いいたします。
[解決]　RailsでWebpacker::Manifest::MissingEntryError

## はじめに
RailsのWebpacker::Manifest::MissingEntryErrorは、初学者あるあるらしい。
でもすぐ解決できた。

## 発生した場面

Rails6,MySQLをDockerで環境構築した.
↓
"yay, you are on rails!"
↓
早速書き始めて、root ディレクトリを変えたり、viewを書いたりして、ブラウザで確認。
↓
Webpacker::Manifest::MissingEntryError
## 解決方法

```ruby:qiita.rb
bundle exec rails webpacker:install
```



他の方法
https://github.com/rails/webpacker/issues/1730
https://blog.yuhiisk.com/archive/2018/04/24/rails-error-collection.html#Webpacker
thinreportsで中国語（韓国語）のPDFを表示したい

# カスタムフォントが選択できない

![Screen Shot 2020-10-26 at 11.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/cb8a6078-d618-aec5-79a5-4014575ca9e7.png)

現状フォントは固定で、持ち込みのフォントは指定できない様子。
このまま中国語（韓国語でも）を入れようとすると、PDFの状態で文字化けを起こす。

# 解決方法

[韓国語や中国語のテキストをPDFで表示できない][1]

Railsであれば、ここにあるようにinitializerをつくってやる。

```rb:config/initializers/thinreports.rb
Thinreports.configure do |config|
  config.fallback_fonts <<
    Rails.root.join("app/thinreports/NotoSansCJKsc-Regular.ttf").to_s
end
```

ここで重要なのはttfフォントで、`NOTO`フォントを使う必要がある。
（□表示は英語圏ではTOFUと呼ばれ、もう豆腐表示はうんざり - no more tofu - NOTO [らしい][3] 、ついでに[tofulearn.com][2]）

最初は「CJK」なんだからフォントファイル一個でChineseJapaneseKorean全部表示できるんでしょ？って思ってたけど、どうやら違う。適当にダウンロードしてきたNotoCJKファイルは日本語バージョンだったため引き続き中国語の表示ができなかった（□になる部分がPDFでは空白表示だった）。

よくよく調べるとCJKでも[各地域ごとのフォントバージョン][4]があるらしい。

- Simplified Chinese (SC)
- Traditional Chinese (TC)
- Japanese (JP)
- Korean (KR)

最初に使ってたファイルはよくよく見ると`NotoSansCJKjp-Regular.ttf`だった。なので、`NotoSansCJKsc-Regular.ttf`を適当に探してみて、当ててみたらバッチリだった。


[1]: https://groups.google.com/g/thinreports/c/VaBN43gOuq4?pli=1!
[2]: https://www.tofulearn.com/
[3]: https://ja.wikipedia.org/wiki/Noto
[4]: https://www.google.com/get/noto/help/cjk/
ストロングパラメータはtrueなのになぜかテーブルに保存できない。

## うまくいかなかったこと
paramsに値は入っているのに、テーブルに保存ができない。エラーも出ない。

```:ターミナル
     6: def create
     7:   judge = Judge.new(judge_params)
     8:   judge.save
 =>  9:   binding.pry
    10: 
    11:   redirect_to  root_path 
    12: end

[1] pry(#<JudgesController>)> judge
=> #<Judge:0x00007fd58efb37c0
 id: nil,
 judge_correct_id: 2,
 comment: "めお",
 created_at: nil,
 updated_at: nil>
[2] pry(#<JudgesController>)> judge.save
=> false
```

## 結論
アソシエーションを組んで外部キーが存在するはずなのに、それをmigrationファイルに記入していなかったから。

## 検証方法(save!メソッド)
saveメソッドはtrueかfalseしか返しませんが、save!メソッドはfalseの場合、例外が発生するそうなので、ターミナルにエラーの原因となっていることが表示されました。
ターミナル上でインスタンス変数.saveとしてfalseと返されたところをインスタンス変数.save!としたところ、

```
Validation failed: User must exist, Post must exist・・・hogehoge
```
という記述がありました。
確かにアソシエーションを組んでいるのにUserとPostに関係するidを作成していなかったなと思い、追加したところうまく行きました。

以上
SwiftのCodableの使い方　超個人的メモ

SwiftyJsonが便利だけど、Swift表標準機能であるCodableもそこそこ使いやすかったのでメモ


## 実践的ではないけど一番シンプルなCodableでjsonをinstanceに変換する例
structにCodableを継承させて、jsonをデータ変変換した後、JSONDecoder.decodeを使うだけ。
ただ、Codableで定義した型情報と、jsonの形が厳密に同じである必要がある。そのため、jsonのキーが一つでも欠けているとエラーになる。

```swift

var data = """
{
  "name": "Bob",
  "age": 20,
  "sex": "male",
}
""".data(using: .utf8)!

struct User: Codable {
  let name: String
  let age: Int
}

let users: User = try JSONDecoder().decode(User.self, from: data)
users // User(name: 1, age: 20)
```

# 実践的なCodableの使い方（jsonのキーが欠ける場合)
structを以下のようにclass変変更し、init関数内で初期化を行う。
純粋なswiftで書かれているので、分かりやすい。

```
var data = """
{
  "name": "Bob",
  "age": 20,
}
""".data(using: .utf8)!

class User: Codable {
  var name: String
  var age: Int
  var sex: String? // sexがjsonにない！

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.name = try container.decodeIfPresent(String.self, forKey: .name) ?? nil
        self.age = try container.decodeIfPresent(Int.self, forKey: .age) ?? nil
        self.sex = try container.decodeIfPresent(String.self, forKey: .sex) ?? nil
    }
}
let users: User = try JSONDecoder().decode(User.self, from: data)
users // User(name: "Bob", age: 20, sex: nil)
```

## まとめ
SwiftyJsonと比べCodableもそんなに悪くない。
PRML 演習問題 8.2 解答

# 問題
>
有向グラフにおいて, すべてのノードについて自分より小さい番号を持つノードに向かうリンクが存在しないようにノードを順番付けることができるなら有向閉路は存在しないことを示せ.

#方針

問題で与えられている命題は
A: すべてのノードについて自分より小さい番号を持つノードに向かうリンクが存在しないようにノードを順番付けることができる

B: 有向閉路は存在しない

A$\Longrightarrow$Bである. 全てのノードについて考えるのは困難であるため対遇を取ることによって証明を簡単な条件に落とし込んでいく.すなわち

$\bar{A}$: あるノードについて自分より小さい番号を持つノードに向かうリンクが存在しないようにノードを順番付けることができる
$\bar{B}$: 有向閉路は存在する

$\bar{B}\Longrightarrow\bar{A}$を考える.

#解答

有向閉路とは, あるノードから出発して矢印に従って進んだ後, また始めのノードに戻ってくるような閉じた経路のことである.
つまり始めのノードに戻るということは必ず自分より大きい番号に向かうリンクが存在する.したがって$\bar{A}$を満たすような経路が存在することがわかったので, 命題$\bar{B}\Longrightarrow\bar{A}$は正である. したがって対偶が正であるので元の命題も正である. 題意は示された.
[PHP][DatePeriod]一定の期間の中から特定の曜日を取り出す、とかが超便利になるクラス

# 概要
みなさん、DateTime関数は使っていますか？
カレンダーに、ToDoの日付計算に、日付表示部分をいい感じに表示するのに……
システム開発において、DateTime関数は避けることのできないクラスでしょう。
そんなDateTimeクラスと関連のある、超便利なクラスの紹介です。

# ちょっと待って！それforループするの！？
PHPソースコードでカレンダーの出力をする場合、適当に調べるとこのような処理が出てきたりします。

```php

//タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

//表示させる年月を設定　↓これは現在の月
$year = date('Y');
$month = date('m');

//月末日を取得
$end_month = date('t', strtotime($year.$month.'01'));

$aryCalendar = [];

//1日から月末日までループ
for ($i = 1; $i <= $end_month; $i++){
    $aryCalendar[$i]['day'] = $i;
    $aryCalendar[$i]['week'] = date('w', strtotime($year.$month.sprintf('%02d', $i)));
}

```

一ヶ月分だけなら単純な処理ですね。
では、表示を2か月区切りに…3か月……いや、一年区切りで……と伸びたとき、どうしますか？
一か月だけだとしてもそもそも業務上の区切り日は15日終わり、16日開始でありそれに合わせる場合はどうしましょうか？

# なんと、簡単に解決します！そうDatePeriodならね。

詳しいドキュメントは以下。
https://www.php.net/manual/ja/class.dateperiod.php

例えば一か月だけならこんな感じです。

```php
$now = new \DateTime();

$startDate = \DateTime::createFromFormat("Y-m-d", $now->format("Y-m-") . "1")->setTime(0,0,0);
$endDate = \DateTime::createFromFormat("Y-m-d", $now->format("Y-m-t"))->setTime(23,59,59);

$interval = new \DateInterval('P1D');
$datePeriod = new \DatePeriod($startDate, $interval, $endDate);

$aryCalendar = [];
foreach($datePeriod as $datetime) {
	$aryCalendar[$datetime->format("Y-m-d")] = [
		"day" => $datetime->format("d"),
		"week" => $datetime->format("D")
	];
}

```

とりあえずDateTimeクラスで開始日と終了日さえ決めてしまえば、DatePeriodの時点でDateTimeクラスの配列のように利用することのできるクラスを出力することができます。
これで15日締めでも簡単！
さらに、日付同士の間隔はDateIntervalで決定しているため、一週間毎・一か月毎のような案件でも簡単に作成することができます。

**みなさんもDatePeriodを使って簡単な日付管理ライフを！**
blackbox-exporterのprobe_successが成功しない問題を修正する

## 修正方法

blackbox-exporterの設定で、`preferred_ip_protocol` を `ipv4` にする。

```yaml
modules:
  http_2xx:
    prober: http
    timeout: 15s
    http:
      valid_status_codes: []
      method: GET
      preferred_ip_protocol: "ip4"
```

## 原因

IPv6で繋ぎに行って失敗しているご様子。

## refs

https://stackoverflow.com/questions/54773928/probes-returning-zero
タグクラウド、ワードクラウド laravel と vue.js を添えて

タグクラウド作りてぇ。
ということでライブラリと作り方を紹介

海外では タグクラウド ではなく、 ワードクラウドというのだろうか。

# インストール

https://github.com/feifang/vue-wordcloud

```

npm install vue-wordcloud

```

# コピペで動く

```

<style>

    div.tooltip {
        position: absolute;
        width: 210px !important;
        height: 70px !important;
        padding: 16px;
        font: 18px Arial;
        line-height: 24px;
        color: white;
        background: black;
        border: 0px;
        border-radius: 2px;
        pointer-events: none;
    }

</style>

<template>
    <div>

        <div class="cloud">

            <wordcloud
                    :data="defaultWords"
                    nameKey="name"
                    valueKey="value"
                    :showTooltip="true"
                    :wordClick="wordClickHandler">
            </wordcloud>

        </div>


    </div>
</template>

<script>



    import wordcloud from 'vue-wordcloud'

    export default {
        components: {
            wordcloud
        },

        data () {

            return {

                myColors: ['#1f77b4', '#629fc9', '#94bedb', '#c9e0ef'],
                defaultWords: [
                    {
                    "name": "りんご",
                    "value": 26
                },
                    {
                        "name": "みかん",
                        "value": 19
                    },
                    {
                        "name": "おれんじ",
                        "value": 18
                    },
                    {
                        "name": "look",
                        "value": 16
                    },
                    {
                        "name": "two",
                        "value": 15
                    },
                    {
                        "name": "fun",
                        "value": 9
                    },
                    {
                        "name": "know",
                        "value": 9
                    },
                    {
                        "name": "good",
                        "value": 9
                    },
                    {
                        "name": "play",
                        "value": 6
                    }
                ],
            };
        },

        methods: {
            wordClickHandler(name, value, vm) {
                console.log('クリックされたよ', name, value, vm);
            },
        }




    }
</script>


```

以上
引数の総和を求める

[とあるツイート](https://twitter.com/kanimum/status/1320228121891667970?s=21) をうんうん考えて結局題意からそれていたので供養．

もちろんめちゃくちゃ warning が出る．

```c:main.c
main(c, v) char **v; { return --c ? v[c] = atoi(v[c]) + v[c+1], main(c, v) : printf("%i\n", v[c+1]); }
```

```
$ gcc main.c
$ ./a.out 1 2 3 4 5 6 7 8 9 10
55
```
良く使うGitコマンド一覧

##ローカルブランチを削除する

- ローカルブランチの確認

```
$ git branch 
```

- 削除コマンド1

```
$ git branch --delete [ブランチ名]
$ git branch -d [ブランチ名]
```
(どちらも同じ)
マージ済みのブランチのみ削除ができる
マージされていないブランチを削除しようとすると下記のようなエラーがでます
（error: Cannot delete the branch 'ブランチ名' which you are currently on）
マージされていないブランチを削除したいときは削除コマンド2

- 削除コマンド2

```
$ git branch -D [ブランチ名]
```
どんなローカルブランチも削除できる(マージされていないブランチなど)

```git fetch -p```
リモートで削除済のブランチも反映される

```git diff```
変更ファイルを見て何が変わったのかを確認
AWS S3 Macローカルのディレクトリを任意のバケットに同期する

# 目的

- AWSのS3の任意のバケットにMacローカルのディレクトリを同期する方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- S3
    - 下記の方法でバケットを作成した。
        - [AWS S3のバケットの作り方](https://qiita.com/miriwo/items/41e488b79fb58fa7c952)

# 必要なもの

- バケット作成をしたAWSアカウントのアクセスキーとシークレットアクセスキー（AWSのユーザアカウント登録時にダウンロードされたCSVに記載されている、シークレットアクセスキーは再確認方法がなかったはずなのでCSVを紛失したなら新たにアカウント作成したほうが早いかもしれない。）

# 前提情報

- 本説明で実行するコマンドはMacのターミナルで実行するものとする。

# 詳細

1. 下記にアクセスする。
    - [https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html)
1. 「AWS CLIの最新バージョンの場合：」のリンクをクリックする。
1. インストールされた「AWSCLIV2.pkg」をダブルクリックで開く。
1. 「続ける」をクリックする。
1. 内容を確認して「続ける」をクリックする。
1. 使用許諾契約の内容を確認して問題ない場合「続ける」をクリックする。
1. インストール先はお好みのものを選んで「続ける」をクリックする。
1. インストール先が決定したら「インストール」をクリックする。
1. インストールが完了したら「閉じる」をクリックする。
1. 下記コマンドを実行してAWSアカウントの情報を入力する。

    ```terminal
    $ aws configure
    ```
1. 下記のように設定内容を入力してEnterを押下する。

    ```terminal
    > AWS Access Key ID [None]: AWSアカウントのアクセスキーを入力する
    > AWS Secret Access Key [None]: AWSアカウントのシークレットアクセスキーを入力する
    > Default region name [None]: ap-northeast-1と入力する
    > Default output format [None]: 何も入力しない
    ```
1. 下記コマンドを実行してMacの`~/`ディレクトリに`test`ディレクトリを作成する。

    ```terminal
    $ mkdir ~/test
    ```
1. 下記コマンドを実行して`~/test`ディレクトリにtest.txtファイルを作成する。

    ```terminal
    $ touch ~/test/test.txt
    ```
1. 下記コマンドを実行してMacのローカルの`~/test`ディレクトリをS3のバケットに同期する。設定がうまく行っていればtest.txtが指定したバケットの直下にアップロードされる。

    ```terminal
    $ aws s3 sync ~/test s3://同期先のバケット名
    ```
1. 同期先のバケットのtestディレクトリ直下にMacローカルのtest.txtをアップロードしたい場合は下記を実行する。

    ```terminal
    $ aws s3 sync ~/test s3://同期先のバケット名/test
    ```
    
# 参考文献

- [https://aws.amazon.com/jp/premiumsupport/knowledge-center/move-objects-s3-bucket/](https://aws.amazon.com/jp/premiumsupport/knowledge-center/move-objects-s3-bucket/)
- [https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)
- [https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html)
Inosensor ES Devkitを使ってみた！ ②（付属品の取り付け編）

# Inosensor ES Devkit って何？

Inosensor ES Devkit は、Sigfox無線モジュール搭載の小さな基板です。

![img-inosensor-ES-Devkit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40994/e68bbc30-f60e-045b-4baa-ec69bcb479aa.jpeg)

前回の[Inosensor ES Devkitを使ってみた！ ①（購入〜Devkit登録編）](https://qiita.com/tonosamart/items/f3cbc3b8fbdc84c7ce33)では、SigfoxDevkitの登録ができたので、今回は、付属品の取り付け方などを、メモしていきたいとおもいます！

## ゴム足をつけよう！

まずは、裏面にショート防止用のゴム足を付けていきます（ケースを用意している人は不要です）。

**貼る場所はどこでもいい**のですが、丸い穴の下に貼っちゃうと、あとで上からゴミがくっついちゃうので避けたほうが無難かと思います。

## 電池ボックスを取り付けよう！

電池ボックスを取り付けます。電池はまだ入れないでおきましょう。

電池ボックスから出ているケーブルを、CN1に取り付けます（コネクタに刺すだけ）。カチって音がしたら成功です。

## ピンヘッダー（大、小）をハンダ付けしよう！（オプション）

付属のピンヘッダー大小を、CN2,CN5にそれぞれはんだ付けします。記事公開時点では、SDKの公開はまだ（2020年12月以降を予定）なのですが、なくすと悪いのでハンダ付けしておくのもありだと思います！

## 付属品の取り付け完成！

これで、付属品の取り付けは完成です！ あとは電池を入れて、通信を開始してみましょう！

通信を開始するのは、次回、[Inosensor ES Devkitを使ってみた！ ③（はじめてのSigfox通信編）](https://qiita.com/tonosamart/items/b79421a954bc63642f78)で、挑戦したいと思います！

## 参考リンク

### 購入情報

[Inosensor ES Devkit：販売ページ](https://www.robotma.com/webshop/products/detail/1)
[接点入力用ハーネス：販売ページ](https://www.robotma.com/webshop/products/detail/2)
[Inosensor ES Devkit & 接点入力用ハーネスセット：販売ページ](https://www.robotma.com/webshop/products/detail/3)

### 製品マニュアル

[Inosensor ES Devkit 製品マニュアル](https://qiita.com/tonosamart/items/d825fbcccaa153d2e5da)

### チュートリアル

##### 初級編

[Inosensor ES Devkitを使ってみた！ ①（購入〜Devkit登録編）](https://qiita.com/tonosamart/items/f3cbc3b8fbdc84c7ce33)
[Inosensor ES Devkitを使ってみた！ ②（付属品の取り付け編）](https://qiita.com/tonosamart/items/9af3fe28963411edb8e2)
[Inosensor ES Devkitを使ってみた！ ③（はじめてのSigfox通信編）](https://qiita.com/tonosamart/items/b79421a954bc63642f78)
[LPWAって本当にローパワーなの！？ Sigfox端末（Inosensor ES Devkit）が本当に低消費電力か測定してみた！](https://qiita.com/tonosamart/items/8c48f4669fd23bd43d2e)

##### 中級編

[Inosensor ES Devkitを使ってみた！ ④（Sigfox CallBacks入門編）](https://qiita.com/tonosamart/items/b5f20f30c445441522c4)
[Inosensor ES Devkitを使ってみた！ ⑤（接点入力用ハーネスを使ってみよう！）](https://qiita.com/tonosamart/items/342862211f38597f892d)
[Inosensor ES Devkitを使ってみた！ ⑥（位置情報活用編）](https://qiita.com/tonosamart/items/619770390fa8dd5c15b4)
[Inosensor ES Devkit にオムロンの振動センサ（転倒センサ）を接続してみた！](https://qiita.com/tonosamart/items/53a45948a2cc6e18ff38)

##### 上級編

[Inosensor ES Devkit 用SDK（IFS-M01 SDK）に挑戦！①（開発環境編）](https://qiita.com/tonosamart/items/8a7d86626959b959801d)
[Inosensor ES Devkit SDKに挑戦！②（ケーブル編）](https://qiita.com/tonosamart/private/ff1d06107c83d6a3b724)
[Inosensor ES Devkit 用 ファームウェア（IFS-M01-FIRM）の書き込みに挑戦！](https://qiita.com/tonosamart/items/63e143554646fe7f7b40)
[Inosensor ES Devkit 用 ATコマンドファームウェア（IFS-M01-FIRM-AT）を使ってATコマンドに挑戦！](https://qiita.com/tonosamart/items/27debeb1c6d40095cdcb)

### リンク集

[Inosensor ES Devkit 関連リンク集（随時更新）](https://qiita.com/tonosamart/items/64baaa0c666d4539448f)
「ゼロから作るDeep Learning」自習メモ（その１０の２）重みの初期値

「ゼロから作るDeep Learning」(斎藤 康毅　著　オライリー・ジャパン刊)を読んでいる時に、参照したサイト等をメモしていきます。　[その１０](https://qiita.com/slow_learner/items/cfca161fb2fb05216a74) ← →[その１１](https://qiita.com/slow_learner/items/d4c36e3701e16c5a9e77)

##MNIST データセットによる更新手法の比較　で使っているソースコードch06/optimizer_compare_mnist.py　を少し変えて、初期値の設定方法を何通りかためしてみた。

```python
# coding: utf-8
import os
import sys
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.util import smooth_curve
from common.multi_layer_net import MultiLayerNet
from common.optimizer import *

# 0:MNISTデータの読み込み==========
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)

train_size = x_train.shape[0]
batch_size = 128
max_iterations = 2000

# 1:実験の設定==========
optimizers = {}
optimizers['SGD'] = SGD()
optimizers['Momentum'] = Momentum()
optimizers['AdaGrad'] = AdaGrad()
optimizers['Adam'] = Adam()
#optimizers['RMSprop'] = RMSprop()

networks = {}
train_loss = {}
for key in optimizers.keys():
    networks[key] = MultiLayerNet(
        input_size=784, hidden_size_list=[100, 100, 100, 100],
        output_size=10,
        activation='relu',weight_init_std='relu', 
        weight_decay_lambda=0)
    train_loss[key] = []    

# 2:訓練の開始==========
for i in range(max_iterations):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    
    for key in optimizers.keys():
        grads = networks[key].gradient(x_batch, t_batch)
        optimizers[key].update(networks[key].params, grads)
    
        loss = networks[key].loss(x_batch, t_batch)
        train_loss[key].append(loss)

#テストデータで評価
x = x_test
t = t_test

for key in optimizers.keys():
    network = networks[key]

    y = network.predict(x)

    accuracy_cnt = 0
    for i in range(len(x)):
        p= np.argmax(y[i])
        if p == t[i]:
            accuracy_cnt += 1

    print(key + " Accuracy:" + str(float(accuracy_cnt) / len(x))) 

```


####活性化関数に'relu'を指定、「Heの初期値」を設定

```python
activation='relu', weight_init_std='he', 
```
テストデータを処理した結果
>SGD Accuracy:0.9325
Momentum Accuracy:0.966
AdaGrad Accuracy:0.9707
Adam Accuracy:0.972

####活性化関数に'sigmoid'を指定、「Xavierの初期値」を設定

```python
activation='sigmoid', weight_init_std='xavier', 
```
テストデータを処理した結果
>SGD Accuracy:0.1135
Momentum Accuracy:0.1028
AdaGrad Accuracy:0.9326
Adam Accuracy:0.9558

SGDとMomentumが、ひどく認識率が落ちたので、バッチの回数を10000にしてみた。

>SGD Accuracy:0.1135
Momentum Accuracy:0.9262
AdaGrad Accuracy:0.9617
Adam Accuracy:0.9673
![g6-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/83135b0e-d81e-35f5-8204-5c0c34743d28.jpeg)

Momentumの認識率はそこそこまで上がったが、SGDはまったくダメ。


###活性化関数に'relu'を指定、標準偏差が0.01 の正規分布を初期値に設定
```python
activation='relu', weight_init_std=0.01, 
```
テストデータを処理した結果
>SGD Accuracy:0.1135
Momentum Accuracy:0.1135
AdaGrad Accuracy:0.9631
Adam Accuracy:0.9713

SGDとMomentumは、まったく学習できていないようだ。


　[その１０](https://qiita.com/slow_learner/items/cfca161fb2fb05216a74) ← →[その１１](https://qiita.com/slow_learner/items/d4c36e3701e16c5a9e77)
【Android】新しいGooglePlayConsoleでアプリを任意のタイミングで手動公開する方法

#はじめに
現時点でまだ従来のバージョンを使用している方には、以下の注意文が表示されていると思いますが
2020/11/01から、GooglePlayConsoleが新しいバージョンへと変更されます。

![注意.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106030/55a2fdc9-c8bb-8a20-4985-b4573ea0f6ba.png)

タイトルの通り、アプリを手動公開する方法を記載しておきます。
※従来のバージョンでの手動公開方法は[**こちら**](https://support.google.com/googleplay/android-developer/answer/9543912?hl=ja)

##手順
１．対象のアプリを選んでいる状態で、画面の左側の**[公開の概要]**を選択。

２．**[管理対象の公開ステータス]** -> **[管理]**を選択。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106030/c9f6c6f3-4e41-20c6-13a2-d50d38d61c35.png)

３．**[管理対象の公開をオンにしました]**にチェックを入れ、**[保存]**。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106030/851eedc0-2d1e-eacc-e14b-4239c0f8fb58.png)

４．アプリの審査が完了し、承認されると**[確認して公開]**が押せるようになるので、任意のタイミングで公開。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106030/6c14f89c-d243-b472-8ebf-68037cb4b4bf.png)

#終わりに
新しいバージョンに慣れるまでみんなでがんばりましょう！w
EC2のCPU使用率が上がらない件

## 起きたこと

EC2(インスタンスタイプ：t2.micro)で重たい処理を走らせた所、途中までは下図①のようにCPU使用率が100 %まで上がるものの、その先で下図②のように10 %から上がらず処理に時間がかかりました。
プロセスも終了していないし、メモリやネットワーク、RDSなどの使用率も確認したがボトルネックになっているような箇所は見受けられませんでした。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203936/b8a3c764-48fe-706b-2db1-85b5e9e97c13.png" alt="CloudWatch_CPU使用率" width="700px">

## キーワード

- CPUクレジット
- ベースライン使用率
- Unlimitedモード

## t2の挙動

### 公式説明

t2の説明文にはこのように書いてあります。

> ベースラインから必要に応じてバースト可能な汎用インスタンスタイプ

参照：[Amazon EC2 T2 インスタンス](https://aws.amazon.com/jp/ec2/instance-types/t2/)

私はこの一文を「ベースライン = CPU使用率100 %」と解釈したため、通常使用でもCPU使用率100 %を発揮でき、必要に応じてオートスケール可能なのだという思い込みをしていました。

### CPUクレジットとベースライン

t2およびt3インスタンスにはCPUクレジットという概念があります。
CPUクレジット残高が0のとき、各インスタンスごとに決められたベースライン使用率で稼働します。

例としてt2.microではベースライン使用率が10 %なので、
CPUクレジット残高が0のとき[起きたこと](#起きたこと)に掲載した画像の②のように10 %を超えた稼働ができなくなります。

CPUクレジット1つは、1vCPUのCPU使用率を1分間100%まで上げることができます。
例として、

- 1vCPUのCPU使用率50% -> 2分間で1クレジットを消費
- 2vCPUのCPU使用率50% -> 1分間で1クレジットを消費

※ 実際にはCPUクレジットは整数値ではなくミリ秒単位で消費計算がされます。

#### Unlimitedモード

t3ではデフォルトでUnlimitedモードがONにされています。
これはCPUクレジットが枯渇してもベースライン使用率を超えた稼働を可能にするものですが、当然その分は課金が必要になります。

### CPUクレジットの獲得

CPUクレジットは2つの方法で獲得することができます。

1. 起動クレジット (t2のみ)
2. 経時獲得クレジット

**t2インスタンスは停止・再起動によってCPUクレジットの持ち越しができません。**
その代わり、起動時に起動クレジットがもらえます。
t2.microの場合は30クレジットです。

一方で経時獲得クレジットは起動している間、インスタンスタイプによって決められた割合だけ時間経過でもらえるクレジットです。
t2.microの場合は6クレジット/時です。

※ 消費と同様に、実際にはCPUクレジットは整数値ではなくミリ秒単位で獲得計算がされます。

### CPUクレジットの保有と消費

CPUクレジットは経時獲得量が消費量を上回る時、残高が増えていきますが保有できる上限が決まっています。
上限数はインスタンスタイプによって異なりますが、 **24時間で獲得可能なクレジット数** と同値です。

また、t2の起動クレジットと経時獲得クレジットは見た目上区別されていませんが、消費の優先度や獲得上限などでは区別されています。

#### 区別1 保有可能上限は別管理

上記でCPUクレジットの保有可能上限を24時間で獲得可能なクレジット数と述べましたが、これは経時獲得クレジットの上限で起動クレジットは別カウントされます。
そのため、起動してからクレジットを一切消費しなかった場合、保有できる最大値は

**保有できる最大値 = 起動クレジット + 経時獲得クレジットの上限**

になります。

#### 区別2 起動クレジットから消費される

起動クレジットと経時獲得クレジットの両方が存在しているとき、起動クレジットを消費し、起動クレジットが枯渇してから経時獲得クレジットを消費し始めます。

#### おまけ：ベースライン使用率の本質と計算方法

ベースライン使用率は本質的には **「CPUクレジットの獲得数と消費数が釣り合うCPU使用率」** です。

ためしにt2.microとt2.largeを例にベースライン使用率を計算してみましょう。

##### t2.microのベースライン使用率

t2.microは1vCPUで1時間に6クレジットを獲得できます。
そのため1vCPUが1時間で6クレジットを消費するようなCPU使用率を計算すればOKです。

60分あたり6クレジット消費可能
-> 1分あたり0.1クレジット消費可能
-> 0.1 = 10%(ベースライン使用率)

ということで、10%の使用率が算出されました。

##### t2.largeのベースライン使用率

t2.largeは2vCPUで1時間に36クレジットを獲得できます。
t2.microと同様に計算をしますが、複数vCPUなためベースライン使用率の算出のためにはvCPU数で割る必要があります。

60分あたり36クレジット消費可能 / 2vCPU
-> 1分あたり0.6クレジット消費可能 / 2vCPU
-> 0.6 / 2vCPU = 60% / 2vCPU
-> 1vCPUあたり30%(ベースライン使用率)

## 最後に

t2インスタンスは気軽に使えて便利ではありますが、制約も大きく、できることには限りがありますね。
AWSはこのあたりのバランス感覚が非常に優れているな、と改めて痛感しました。

参照：[バーストパフォーマンスインスタンスの CPU クレジットとベースライン使用率](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html)
参照：[スタンダードモードの概念](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-standard-mode-concepts.html#launch-credits)
【MySQL】pid not foundが発生したときの対応集

はじめに

mysqlのバージョンを5.7から5.6にしたかった。
なので以下の記事を見ながらダウングレードしようとしました。(以下の記事が悪い訳では一切ない。)

・[homebrewで入れたmysqlを8系から5系にダウングレードする]
(https://qiita.com/dkjym/items/d2bfca70bc9b0c2ee9dc)

そしたら、myqslをを起動させようとすると
「ERROR! The server quit without updating PID file」
というエラーが、、
これを抜けるために一日費やしました。。
そのため、誰か詰まったときにもっとスムーズに解消できるように、
qiitaに残しておきます。

環境
OS: macOS Catalina 10.15.4

```
$ mysql.server start
ERROR! The server quit without updating PID file (/usr/local/var/mysql/[マシン名].local.pid).
```

## pidファイルを作ってみる

```
$ touch ******-puro.local.pid
```

自分の場合は変わらず、作った瞬間はできるが、すぐに消えてしまう。
何回も作っても自分は駄目だった。

## パス問題

パスが通っているかの確認


```
vim ~/.bash_profile
```

```
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

## my.cnfの設定

```
$ mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```

## 所有者権限

mysql.sockを作る

```
$ mysql.server start
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

```
$ mysql.server start
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

## MySQLアンインストール


mySQLのアンインストールは以下を参考にする。

[どうしよう！困った時のMac上のMySQLのアンインストール＆再インストール、動作確認手順](https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596)


他の記事で、アンインストール何回もやったが、同じくpid not foundがエラーが出てました。

Community Editionを削除したのがデカかったのかもしれない


## おわりに
何か間違っている点があれば、教えて頂けたら幸いです。
よろしくお願い致します。

## 参考にさせて頂いたサイト（いつもありがとうございます）

・[MySQLがどうしても起動できない時に試したこと]
(https://qiita.com/akizora/items/4d63c75548520a70b845)

・[【MySQL】pid not foundもしくはpermission deniedの対応方法]
(https://qiita.com/AK4747471/items/36b73edd9d1e666ae0c0)

・[「ERROR! The server quit without updating PID file」となり、MacOSでmysqlにアクセスできない。](https://qiita.com/furafura_nau/items/7d8f5370899df125d459)

・[mysqlサーバが立ち上がらないとき〜〜](https://www.ketsuago.com/entry/2017/07/23/191501)

・[MacでHomebrewを使ってinstallしたMySQL5.6とMySQL5.7を切り替えて使う](https://qiita.com/t_oginogin/items/76ca2b6ce18d53988dc3)
IQ Bot Preprocessorパッケージによるバーコード読み取り

#IQ Bot Preprocessorパッケージで各種バーコードが読めます

IQ Bot自体ではバーコードの読み取りには非対応なのですが、RPA用のパッケージでIQ Bot PreProcessorというパッケージが出されています。（標準インストールではなく、別途パッケージファイルをダウンロードしてきてインストール）
このパッケージの中に、バーコード読み取り機能がありますので試してみます。

利用するバーコードは、[「バーコードどころ」](https://barcode-place.azurewebsites.net/)をいうサイトを利用させてもらい、下記の様に作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/46cef7fe-713b-abec-bf58-5ffb7d67bbe6.png)


#では、パッケージを使って読んでいきます。
ロボットはこんな感じ。
Get Barcodesアクションは、
入力としては、イメージ以外にPDFもサポートしているようです。
戻りとしては、ディクショナリ型の値が複数含まれるリスト型の値となっているようですので、
一旦リスト型の変数で受けて、その中身をループ処理で取り出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/095dab00-dc54-49b5-9ab4-e3fc06e232ad.png)

実行して上手く読めれば、下記の様に、座標（x/y）とサイズ（width/height）、バーコードの種類、値、そして何ページ目に存在するのかが戻ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/7a84df92-61c8-6797-5aca-ee0ebf0c0d1a.png)

##どのバーコードを読めたのか
では、サンプルを使って読めたバーコードです。
郵便バーコードと、[「バーコードどころ」](https://barcode-place.azurewebsites.net/)の説明では比較的新しい規格と書いてあるGS1データバー限定型というのが読めませんでしたが、良く見られるQRコードや、JANコード、ITFコードの認識が出来ていますので、帳票やドキュメントにあるバーコードの値を取りたいという事であれば、
IQ Bot PreProcessorパッケージを試してみると良いと思います。（もちろん、写りが悪かったり、拉げてげたりするケースでは、難しいかもしれませんが。。。）

| バーコードの種類 | 読めたかどうか | 補足 |
|:-:|:-:|:-:|
| JANコード（標準） | 〇  |   |
| JANコード（短縮） | 〇 |   |
| ITFコード | 〇  |   |
| CODE39 |  〇 |   |
| NW-7  |  〇 |   |
| QRコード  |  〇 |   |
| ISBN  |  〇 | ディクショナリが2つ戻されます  |
| 郵便バーコード  | ×  |   |
| UPC_Aコード  | 〇  |    |
| UPC_Eコード  | 〇  |    |
| GS1-128  | 〇  |    |
| GS1データバー限定型  |  × |    |
Webflowを使ってコーディングしたので、使用感をまとめました

NoCodeツールのWebflowを触って見たので、その使用感をまとめました。
[https://webflow.com/](https://webflow.com)

結論、かなり便利なツールです！

## Webflowを使ってコーディングしたので、使用感まとめ
![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/c295d17a-16a2-e1e1-a590-dfff5890c4be.jpeg)
上記の画像がWebflowのコーディング画面です。
左手にlayoutsのブロックが用意されているので、選択して配置していきます。

![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/91761cfc-6b76-b795-7220-b564f7f09224.jpeg)

横並びのflexboxやgridレイアウトなんかも一切コードを書かないで、レイアウトすることができます。

![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/2a646cd3-55a1-3878-adff-6dc29103ee92.jpeg)
細かいレイアウトやCSSの調節は、右側にパネルが用意されており、そこで選択して調節していきます。

###レスポンシブにも簡単に対応
 ![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/e7fa3822-5d78-48dc-316c-ebf0901ccd50.jpeg)
サイト上部にデバイスの切り替えボタンがあり、デバイスを切り替えることができます。切り替えた状態で、レイアウトやCSSを変えることでレスポンシブ時のスタイルを簡単に当てることができます。

###アニメーションやイベントの設定も容易

![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/fb6a7a93-43c9-6db2-7c6c-a0ad02c5a931.jpeg)  ![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/f909aaa4-2736-544a-418f-3fb418d67cc0.jpeg)

クリックイベントでアニメーションをかけたり、ページのスクロールイベントで要素を出現させるなど、Webサイトで良く見かけるアニメーションの設定も可能です。
JavaScriptを一切書かずに実現できます。

### 部分的にソースコードを書くことも可能

Webflowでは、自分でソースコードを書くこともできます。ノーコードだけでは実現できない部分は、自分でコードを書くことで対応できます。
![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/61211bca-2929-ac36-848f-75d518068645.jpeg)

上記のようにエディターを開くことで、コードを追記することができます。

大枠はNoCodeでサクッと作って、細かいところは自分でデザインするなんてこともできますね。

### サイトの共有URLも発行できる
![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/ecbc6000-edc4-a275-24cb-bdff21e8025d.jpeg)
サイトの共有URLも発行できるので、作ったWebサイトをリアルタイムで共有できます。

### ソースコードの書き出し機能が便利
Webflowには、作ったWebサイトのソースコードを書き出してくれる機能があります。
これがかなり便利です。(※ソースコードの書き出しは有料プランに入る必要あり)
![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/611ea1a7-f6b4-cbcb-b666-efd50bdd5d88.jpeg)
上記の画像のように、作成したWebサイトのコードを確認することができ、Zipファイルでダウンロードできます。
ソースコードの書き出しは他のNoCodeツールには無かったりするので、かなり便利です。

### 無料・優良のテンプレートが豊富
![Webflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/3f664a26-57b9-0ee7-e1ce-a39a3abba6e3.jpeg)
Webflowには、無料・優良のテンプレートが豊富にあります。
これらを使えば、さらにお手軽にWebサイトを構築できます。

## HTML、CSSが分からないと難しいところもあり
他のNoCodeツールはHTML、CSSが全く分からなくてもWebサイトが作れるものがありますが、Webflowはある程度のHTML、CSSの知識が必要になるなと感じました。
部分的にソースコードを書くこともできるので、HTML、CSSが分かる人にとってはカスタマイズもしやすいかなと思います。

## 最後に
今回は、NoCodeツールの[Webflow](https://webflow.com/)の使用感をまとめてみました。
コードを書かずにWebサイトを作れるだけでなく、

- レスポンシブにも簡単に対応
- アニメーションやイベントの設定も容易
- 部分的にソースコードを書くこともできる
- サイトの共有URLも発行可能
- ソースコードの書き出し機能が便利

上記のような機能もたくさんあり、とても便利に感じました。
簡単なLP程度ならもうWebflowで十分かなと思います。
Googleドキュメントとステレオミキサーで文字起こしをやってみた

##概要
会議などで議事録を取る際にICレコーダなどで録音しておいたものから作るのだけど、
自動で音声ファイルや動画から文字起こしができればいいのにな、と思ってやってみた。

##今回使ったもの
・Windows10
・Chrome
・Googleドキュメント
・音声ファイル

##事前設定
・PCで再生している音をPCに認識させる
通常ではPCはマイクなどの入力装置からの音しか認識していません。
なのでステレオミキサーを有効にしてPCが認識するようにします

画面右下のスピーカーマークを右クリックして「サウンドの設定を開く」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91812/8e4b5272-5c8f-f643-89ee-5d8ed22e3239.png)


下にスクロールして「サウンドコントロールパネル」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91812/8ff3e702-5c87-df46-aebf-4cf5e870a6aa.png)

「録音」を開き「ステレオミキサー」を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91812/fa58af86-c907-997f-eda8-aa69a76db967.png)

##Chrome設定
ChromeでGoogleドキュメントを開きます
まず、Chromeの音声入力設定をステレオミキサーにする必要があります。
URL欄の右側にあるビデオカメラマークをクリックしてマイク設定をステレオミキサーにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91812/c00c1ff5-bb7a-6315-d543-8a9d547c6acd.png)

##音声入力機能を立ち上げる
長かったですが、ここからが文字起こし本編です。

上部のバーからツール→音声入力を選びます。
するとマイクのマークが出て、音声入力が可能になります。
その後、音源を再生して、音声入力（マイクマーク）をクリックします。
するとマイクが赤くなり文字起こしが始まります。

##注意点
・Googleドキュメント以外を触れない
音声入力中にブラウザ以外を操作すると音声入力が解除されてしまいます。
なので音声入力をしている間、そのパソコンでは他のことはできません。

・精度は完璧ではない
あとから修正は必要です。

・句読点や改行は手動で入れる必要がある
句読点や改行は入りませんので、あとから手動で入れる必要があります。
ただ自動入力している最中に入力カーソルの場所を変えると、その場所から音声入力が追記されてしまいます。
別PCから同じGoogleドキュメントを開き、修正していくと割と効率良く出来ます。
Azure Front Door + Azure Active Directory B2C を利用したEasy Auth

# はじめに
Azure AD B2Cを利用することが増えてきたので、[App Service](https://azure.microsoft.com/ja-jp/services/app-service/)のEasy Auth「[認証と権限承認](https://docs.microsoft.com/ja-jp/azure/app-service/overview-authentication-authorization)」と絡めて利用できないか。せっかくなのでマルチリージョン対応を見据えて[Azure Front Door](https://azure.microsoft.com/ja-jp/services/frontdoor/)をフロント配置する構成で検証しました。

## App Serviceの作成
App Serviceを作成します。この部分は今回は割愛します。
リソースの名前は「azureadb2ceasyauth」とします。

## Azure AD B2Cの設定
Azure AD B2Cで認証機能を利用するためには、以下、２つの方式があります。

* [ユーザーフロー](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/user-flow-overview)
* [カスタムポリシー](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/custom-policy-overview)

今回は、既に用意されているテンプレートを利用する「ユーザーフロー」を利用します。
※ 基本的にはユーザーフローで事が足りるはずですが、「ユーザーフロー」では実現できないことを「カスタムポリシー」で実現すると捉えて頂ければと。

### Azure AD B2Cの構築
以下の手順に従って、Azure AD B2Cを構築します。

1. [B2C テナントの作成](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-tenant)
1. [アプリケーションの登録](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-register-applications?tabs=app-reg-ga)
1. [ユーザーフローの作成](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-user-flows)

#### 1. B2Cテナントの作成

こちらは「[B2C テナントの作成](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-tenant)」に従ってテナントを作成する。

#### 2. アプリケーションの登録
- 「[アプリケーションの登録](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-register-applications?tabs=app-reg-ga)」に従ってアプリケーションを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/b806dde2-e680-a4a8-b20f-5a92f9aec199.png)

- 登録後、アプリケーションIDをメモしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/55ab709d-c728-d29c-78ee-6792d666dbd2.png)


#### 3. ユーザーフローの作成
- [ユーザーフローの作成](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-user-flows)に従って作成する。ただし、今回はEasy Authを検証したいので、ユーザーフローとしては、「サインアップとサインイン (推奨)」を利用して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/d610729f-1076-fd2b-4a83-cc1fa5048527.png)

この時Web AppsのEasy Authで利用するURLとして、必要になるため、「ユーザーフローを実行します」で表示されるURLをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/fea9e71f-4a84-7582-c604-fc0c882df5c1.png)

- ルール：https://{B2Cテナント名}.b2clogin.com/{B2Cドメイン}/v2.0/.well-known/openid-configuration?p={ユーザーフロー}

## App Serviceの設定
### Easy Authの設定
作成したApp Serviceの「認証/承認」でEasy Authを設定します。

- App Service認証をオンにし、Azure Active Directoryを選択する
- クライアントIDにメモしたアプリケーションIDを入力
- 発行者のURLにメモしたURLを入力
- 許可されるトークン対象ユーザーにAppServiceのURLを入力

### カスタムドメインの設定
ここがポイントで、Front Doorを利用してEasy Authをする場合は、一度App ServiceにFront Doorに利用するカスタムドメインを適用し、その後、Front Doorを向くようにDNSを再度変更する必要がある。

- [チュートリアル:既存のカスタム DNS 名を Azure App Service にマップする](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-custom-domain)

これをしないと、認証情報入力後のリダイレクトURLが合わずにFrontDoor経由ではなく、App Serviceに直接リダイレクトされてしまい、Front Doorの価値がなくなってしまいます。


カスタムドメイン設定後、「認証/承認」の「許可される外部リダイレクト URL」に以下を入力する。

- https://{カスタムドメイン}/.auth/login/aad/callback

ここまで来たら、Front Doorのドメインとバックエンドプール、ルーティングルールを設定することで、無事Easy Authが利用できます。
3分アジャイル アジャイルとXP

- 1990年代
- プログラマが熱狂
- ペアプロの代名詞

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/fbc48112-be42-f507-19ff-bf8702f499c8.png)


---

- 4つの基本的なアクティビティ
- コーディング
- テスト
- 傾聴
- 設計

---

## 価値基準

- コミュニケーション
- シンプルさ
- フィードバック
- 勇気

---

## プラクティス豊富

- テスト駆動
- ペアプログラミング

---

## 連絡事項

14:00 から 計画ミーティング
不都合な人はおしらせください

---

## デイリー
昨日やったこと
今日やること
困っていること
floatの使い方

#float
![スクリーンショット 2020-10-26 9.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/cf998b73-4b6b-117b-6327-6ab43874a45e.png)

```html:index.html
<div class="feature-item">
          <div class="feature-img-wrapper">
            <a href="https://www.yahoo.co.jp" target="_blank">
            <img src="img/feature/feature.jpg" alt="">
            </a>
          </div>
          <div class="feature-body">
            <p><span class="text-bold">サイト名：</span>
              <br>サイト名が入る<br>
              <a href="#" target="_blank">https://●●●.com</a>
            </p>
            <div class="clearfix"></div>
          </div><!-- ./feature-body -->
</div><!-- ./feature-item -->
```

```css:style.css
.feature-item{
  margin-bottom: 80px;
}
.feature-img-wrapper{
  width: 45%;
  margin-right: 40px;
  float: left;
}
.clearfix::after{
  content: "";
  display: block;
  clear: both;
}
```

##参考
[ポートフォリオHTMLテンプレート（ベーシック）](https://webdesigner-go.com/template/portfolio-02/#comment-799)
【読書メモ#1】仮説思考　内田和成

今回が**記念すべき初投稿**となる"ぱたぱた"です！
理系らしくロジカルにまとめられることを心掛けていきますが、まだまだ物書きに慣れていないので、コメントありましたらぜひください。

本日はBCGの内田和成さんが書いた「**仮説思考**」という本をまとめたいと思います。
個人的に重要だと感じた点、皆さんに共有したいと思った点を取りあげます。

#**いきなりですが、まずは結論！**
1.　仮説思考を実施することで、**仕事が早くなり、質も上がる**
2.　**結論（ゴール）**から考える
3.　失敗を恐れるな。経験を積め！
4.　枝葉ではなく、**幹**を描ける人間になろう

以下ではこのポイントや本を読んだ背景、所感などについて記していきたいと思います。

#**この本を読んだ背景**
仕事柄、仮説思考は必要不可欠な考え方であり、1年目の今に身につけたいものであったから。
より砕いていうと、**与えられた問題を解くのではなく、課題を自ら見つけ出し、解決するためには「仮説を立てて検証する」という思考法が必要で、体系的に学びたい**と感じたため。

#**なぜ仮説思考が必要なのか？**
　→　問題解決のスピードが格段に速くなるから。

当書では、**仕事の進め方において大事なことは、答えから発想すること**（仮説思考をすること）であると述べられており、「仮説を構築したうえで具体的な作業を進めるほうがスピーディーで、質の高い答えに到達できる」というような説明がなされています。


#**失敗をしてもいいの？**
最初から仮説思考が完璧にできる人はいない。そのため、「下手な鉄砲も数撃ちゃ当たる」精神で初めの頃は積極的に経験を積むことが大事ということでした。

また、コツとしては、とにかく**少ない情報で考えること**だそうです。
情報が多すぎると意思決定は遅くなるため、**今すでにある選択肢を狭めてくれる情報**だけをピックアップし、他は容赦なく捨てることが大事だと述べられていました。

#**枝葉ではなく、**幹**を描ける人間とは？**
枝葉＝細かい分析ができることやちょっとしたアイデアは出せること
幹＝全体像や問題の本質のこと

与えられた課題の中での解決手法を探る枝葉の人間ではなく、そもそもの課題や本質をつかめる幹の人間になろう！というメッセージが、"言うは易く行うは難し"と思えど重要なことなんだろうと感じました。

#**まとめ**
今回仮説思考という本を読んで、その重要性やチャレンジの仕方など多くのことを学べました。ここに書いたのは本に書いてあったほんの一部のエッセンスなので、少しでも気になった方はぜひ手に取って読んでみてください。
1年目は与えられた課題を適切に解くことはもちろん、先を見越して仮説思考を働かせ、積極的に失敗経験を積める時間が大事になってくると思ったので、本で学んだことは強く心にとどめておこうと思います。以上！！
Alpine Linuxにdockerとdocker-composeをインストール

## proxmox にalpineをインストール

## ハードウェア設定

* Storage
    * VirtIO


## インストーラー

* ISO で起動 [download](https://alpinelinux.org/downloads/)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/1d2bb4b6-a79a-bdc8-41da-3e9b5e38e420.png)

* アカウント : root、パスワードなし

```sh
setup-alpine
```

基本的に `Enter`キーを押下で進む。`?`キーで選択ができる。

* sys
* Asia/Tokyo
* vda
* openssh
* ipアドレス
    * `192.168.0.2/24` みたいな形式
* DNS
    * local
    * 8.8.8.8
* password
    * なにか入れる
    
## インストール終了後

画面

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/be321882-5813-1e76-20fb-905d850377cd.png)


root ユーザーで、さきほど設定した `パスワード` でログイン

### リポジトリの設定

```
vi /etc/apk/repositories
```

以下のように3行目以降をすべてコメントアウト解除

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/5541fc98-2c22-f634-1cfc-485e7643cfaf.png)

```sh
# リポジトリ情報の更新
apk update
```

```sh:dockerパッケージが見つかるか確認
apk search docker

もしくは

apk list | grep ^docker
```

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/080e064d-14bc-38e5-beb1-f66ab598ef0b.png)


## dockerのインストール

```sh
apk add docker docker-compose

service docker start
```

メモリ使用量とDISK使用量は以下のように少ない。

![スクリーンショット_2020-10-26_08-57-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c20739a1-0877-2f54-4848-a98b4abf47f9.png)


```sh:自動起動サービスに追加
rc-update add docker
```
phpモジュールにbrotli入れてbrコンテンツを使う！！

ブラウザーのコンテンツの圧縮でよく聞いているのがgzipだと思います。今回UberEatsで使用しようとしたAPIがJson形式だけど、拡張子が「.json.br」でbrotliで圧縮されてそれをそのままだと利用できなかったので、それを解決する方法をまとめた内容です。

# Brotliとは
簡単に調べると「[https://hackers-high.com/linux/brotli-installation-effect/](https://hackers-high.com/linux/brotli-installation-effect/)」でこんな感じで説明されています。

> brotliは2015年に発表され、その後Googleによってアップデートされたデータ圧縮アルゴリズムです。
>
>httpにおける圧縮アルゴリズムとして使われることを主な目的としています。従来から広く使われているgzipと比較して、圧縮率が向上していながら、圧縮/伸長速度は同程度を維持しています。ただし、SSL/TLSが必須となっています。どの程度圧縮率が向上しているのかは、[Brotilの効果](https://hackers-high.com/linux/brotli-installation-effect/#Brotli-3)を参照。
>
>圧縮に辞書を併用しているのが特徴で、辞書には"&lt;div/&gt;"、"before"、"普通"などの頻繁に使われるHTMLタグや各言語の表現が約1万語入っており、圧縮をより効率的にしています。

ブラウザーの開発ツール等で見える以下のHeader情報brのことです。

```
accept-encoding: gzip, deflate, br
```

# 対応状況
![brotli](https://hackers-high.com/images/brotli-caniuse-800x311.png)

# Fedora / CentOS / RHEL
[Remi's RPM repository](https://rpms.remirepo.net/)を利用して「php-brotli」の名前でインストールが可能です。

```
centosの例
# yum install -y php-brotli
```

# その他
[Remi's RPM repository](https://rpms.remirepo.net/)を利用出来ない場合はbuildしてインストールします。

```
# git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git
# cd php-ext-brotli
# phpize
# ./configure
# make
# make install
```

# 設定
php.ini及モジュールのディレクトリーに設定ファイルを作成します。

```
extension=brotli.so
```

# Dockerイメージのphp-fpm
インストールする際にはインストール前に「apt-get update」が必要があります。

```
FROM php:7.1-fpm
...
RUN apt-get update && apt-get install -y git && \
    git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git && \
    cd php-ext-brotli && \
    phpize && \
    ./configure && \
    make && \
    make install && \
    printf '%s\n' 'extension=brotli.so'  >> /usr/local/etc/php/conf.d/brotli.ini && \
    rm -rf php-ext-brotli
...
```
# 確認
phpのメソードについて：https://github.com/kjdev/php-ext-brotli

```
$compressed = brotli_compress('Compresstest');

$uncompressed = brotli_uncompress($compressed);

echo $uncompressed;
```
【HTML】viewportについて解説してみた

# 前提

アウトプットを目的として学んだことをそのまま記事に起こしています。
間違った内容がありましたらご指摘ください。

# 概要

ほとんどのサイトに記述されている

```html
<meta name="viewport" content="width=device-width">
```

というmetaタグ。

オンライン学習教材などでもこのタグの説明がされている教材がたくさんあると思います。それくらい基本的なことではあります。

しかし、上記のコードさえ書けば特に問題は起きないので詳細まで説明されているものは少ないです。

ということで、構造を理解すればカスタマイズもできるようになるので、以下に詳細の値について1つずつ解説していきます。

# 目次

1. viewportとは？
2. viewportに設定できる値
3. viewportの最適値
4. まとめ

# viewportとは？

viewportは「表示領域」を意味します。
ブラウザの表示の仕方を制御する役割があります。

PCの場合、viewport = ブラウザのウィンドウ
スマホ/タブレットの場合、viewport = デバイスの画面全体

## モバイルのviewportを指定しない場合

デスクトップのPCで表示される横幅 = モバイル端末の横幅
として合わせてしまいます。

iPhone11 Proでの画面⬇︎
![PCで表示したのをそのまま縮小したような表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699659/abe8186f-aed5-6aba-b42e-fcceda64ef9e.jpeg)
こんな感じです。

つまり、PCで見てるサイトをスマホなどで閲覧した時にそのまま縮小された非常に小さいサイズで閲覧することになります。

よって、

```html
<meta name=“viewport” content=“width=device-width>
```

を設定することで、端末やブラウザに合わせた値を返すことができます。

# viewportに設定できる値

## ① width (横幅)

- 初期値：960px
- 単位(px)：記述不要です。
- 指定可能範囲：200px ≦ width ≦ 10000px
- `width=device-width`：様々なサイズのデバイスに応じた表示領域に設定・できる。

## ② height (縦幅)

- 初期値：横幅とのアスペクト比(※)から計算される値
- 単位(px)：記述不要です。
- 指定可能範囲：200px ≦ height ≦ 10000px
- 補足：widthと同様、device-widthを設定できますが、そもそもheightを記述することはほとんどありません。

## ③ initial-scale

- 意味：初期倍率
- 初期値：1
- 非対応：Internet Exproler
- 補足：未指定の場合、自動的に「`initial-scale=1.0`」となります。指定した場合でも、「`initial-scale=1.0`」とすれば、結果は変わりません。`width=divice-width`が基準となるためです。

## ④ minimum-scale (最小倍率) (※)

- 意味：最小縮小倍率
- 初期値：0.25
- 指定可能範囲：0 < minimum-scale < 10
- 補足：「initial-scale」と同時に指定不可

## ⑤ maximum-scale (最大倍率) (※)

- 最大確率倍率
- 初期値：1.6
- 指定可能範囲：0 < maximum-scale < 10

## ⑥ user-scalable

- 意味：ユーザーがズームすることを許可するかどうかを指定できます
- 初期値：yes
- 指定可能な値：yes / no または 1 / 0 (1 = yes / 0 = no)
- 補足：デバイスによって全く効果がない場合がある

## ⑦ target-densitydpi

- 指定：旧版のAndroid端末向け
- 意味：ターゲットとなる画面密度を表します。「`target-densitydpi=device-dpi`」とすると、端末ごとに表示される文字サイズも大きく変わってしまいます。対策として「`target-densitydpi=medium-dpi`」に設定するか、記述しないかでいいと思います。

## ⑧ その他

- viewport-fit
- shrink-to-fit

etc…

他にも指定可能な値があるみたいです。スマホを横向きにした時の対応などですね。しかし指定の必要はあまりないかと…。

### ※アスペクト比とは…

短形における長辺と短編の比率。

アスペクト比にも色々あるので、気になる方は[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E6%AF%94)の記事を参照してください。

他の記事には「アスペスト比」と書かれている記事がいくつかありますが、アスペストで検索しても「アスペクト比」としか出てこなかったのでこの記事では「アスペクト」と記述しています。

### ※④ ⑤ について

自分は正直なところ記述したことがありません。`initial-scale=1.0`も数値を変えたことがありません。ご自身で様々試してみてください。

# viewportの最適値

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```

特別な理由がなければ、基本この記述だけで問題ないです。
設定などを理解していればこのコードをコピペで使いまわしていいと思います。

# まとめ

- viewportは、表示領域のこと
- `<meta name="viewport" content="device-width">`さえ記述すれば基本的に問題ない
Manjaro Linuxでyayとかしたときに、gpg: keyserver receive failed: General error っていわれてパッケージがインストールできないときの解消方法

## 解消方法

```bash
echo "keyserver hkp://pool.sks-keyservers.net" > /home/$USER/.gnupg/gpg.conf 
```

## 発生するエラー周辺のメッセージ

```
:: Importing keys with gpg...
gpg: keyserver receive failed: General error
problem importing keys
```

## 原因

GPGの公開鍵サーバに接続できないご様子。

## refs

https://forum.manjaro.org/t/general-error-problem-importing-keys/10163