OmniAICreator/Qiita-1.07M huggingface dataset:
【小ネタ】Windowsでsqlplusを使う際に文字化けしてしまうときの対処法

#はじめに
Windowsコマンドプロンプトからsqlplusを利用する場合、DB側の設定で文字化けが起こってしまう場合があるので、クライアントサイドで試せる解決法を自分用メモとして記載

#現象(文字化け)
コマンドプロンプトから、Oracleにログインした場合に以下ように、メッセージが文字化けしてしまうケースがある。

```sh:文字化け
sqlplus MYACCOUNT/passwd@ORADB
SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 28 11:25:11 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

??????????: ?  5?   28 2021 11:22:23 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
?????????
>SQL
```

これはサーバーから送信されるUNICODEのメッセージを、コマンドプロンプト上に表示しようとしてエラーになっているので、以下の方法で直る場合がある。

1. 文字コードを932から65001に変更する
2. 環境変数NLS_LANGをJapanese_Japan.AL32UTF8に設定する

```sh:文字コード変更
chcp 65001
```

```sh:環境変数設定
SET NLS_LANG=Japanese_Japan.AL32UTF8
```

この設定を行うことで、先ほどの文字化けは以下のように表示される。

```sh:正常表示
sqlplus MYACCOUNT/passwd@ORADB
SQL*Plus: Release 19.0.0.0.0 - Production on 金 5月 28 11:56:26 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

最終正常ログイン時間: 金 5月  28 2021 11:41:25 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```

ただし、サーバーサイドの文字コード設定によってはこれでも化ける可能性はあるので、ダメだった場合には別の方法を考える必要がある。
postgresqlのレプリの方法について調査

## レプリケーションとは？

Replication と書き、レプリカを作成するの意味で
リアルタイムにデータをコピーする技術のこと。

## postgresqlのレプリの種類

以下がデフォルトのconfigで、 `synchronous_commit` でレプリの種類を決めています。

```
# cat postgresql.conf | grep -A 1 synchronous_commit
==========
#synchronous_commit = on                # synchronization level;
                                        # off, local, remote_write, remote_apply, or on
==========
```

コメントアウトの箇所にも書かれている通り、以下5種類あります。

- remote_apply : 完全同期
- on : 同期
- remote_write : 準同期
- local : 非同期
- off : 完全非同期

と、その前に 先に出てくる `WAL` という言葉をお話します。
`WAL` とは Write Ahead Logging の略で、DBのデータを変更する前に更新内容をログに記録します。
もしDBが壊れてしまっても、WALがあればデータを復旧することが出来ます。
WALに書き込まれてから、DBにデータの変更が行われます
それを踏まえて以下を進みます。

### remote_apply : 完全同期

完全同期 で、slaveのWALがpostgresqlに書き込まれるまで保証します。

![2021-05-26 remote_apply # postgresqlのレプリの方法について調査 - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4c11dbe8-5e62-907d-e63f-f1066735549b.png)


### on : 同期

同期で、 slaveのWALのディスク書き込みまで保証されます。

![2021-05-26 on # postgresqlのレプリの方法について調査 - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4415a7f2-6553-192d-3f5f-29d709ad77da.png)



### remote_write : 準同期

準同期で、slaveのWALのメモリに書き込まれるまで保証されます。

![2021-05-26 remote_write # postgresqlのレプリの方法について調査 - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/77f166a0-9430-6214-c5e1-0840876dfb97.png)



### local : 非同期

slaveには転送を保証しません。
ローカルのWALに書き込まれるまで保証します。

![2021-05-26 local # postgresqlのレプリの方法について調査 - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f29f4abc-0731-107a-7400-8b43019d38ec.png)


### off : 完全非同期

非同期同様、slaveには転送を保証しません。
ローカルのWALへ書き込みすることすら保証しません。
一番パフォーマンスが良いです。

![2021-05-26 off # postgresqlのレプリの方法について調査 - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/54a1c257-88b5-f4fd-e2e1-c30ae6d061a3.png)


## 参考

- [PostgreSQL WALログの仕組みとタイミングを理解したい](https://www.kimullaa.com/entry/2019/10/28/000000)
- [2017年度WG3活動報告書 レプリケーション調査編](https://pgecons-sec-tech.github.io/tech-report/html_wg3_replication/wg3_replica.html)
Content security policyはレスポンスヘッダの記述が優先される

# 概要

- htmlのmetaタグにCSPを記述してもレスポンスヘッダー側のCSPが優先される。
- CSPで問題が発生したらまずブラウザのレスポンスヘッダーを確認しましょう。
- 人様のミドルウェアを使うときはきちんとドキュメントを読もう。


# 発生した問題
GCP上(GAE/CloudFirestore/CloudStorage)で動くExpress.js+Vue.jsなWebアプリを趣味で製作していたときのこと、HTML上でCSPを記述しているのにGoogle アナリティクスが読み込めないという不具合が発生。ローカルで動かしていた分には発生しなかったが、GAE上にデプロイすると読み込めなくなる

# とりあえずmetaタグに書く
そもそもCSPとは
[コンテンツセキュリティポリシー (CSP) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/CSP)

HTML上からアクセスできるリソース、通信先を明示してセキュリティを保つ仕組みらしい。
記述方法は2種類あり(ここ大事)

- httpレスポンスヘッダ
- html上のmetaタグ

に書けばいいらしい。とりあえず楽に対応できそうなmetaタグでの対応を試みた。

```html:index.html
<head>
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https:; script-src-elem https://www.googletagmanager.com">
</head>
```

しかし変化がない。というかエラーメッセージ上では記述した内容が反映されていない。コンソール曰く

```
because it violates the following Content Security Policy directive: "script-src 'self'".
Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
```

# レスポンスヘッダーを見る
空白の入れ方を変えたり、GAEの静的ファイルにレスポンスヘッダをつけたり色々やったが改善せず、悶々としていたところでふとレスポンスヘッダの中身を確認したことがないという事に気づく。
見てみるとかなり厳しい内容になっててワロタ。

```
// helmetの公式ドキュメントから抜粋。だいたいこんな感じだった。
default-src 'self';
base-uri 'self';
block-all-mixed-content;
font-src 'self' https: data:;
frame-ancestors 'self';
img-src 'self' data:;
object-src 'none';
script-src 'self';
script-src-attr 'none';
style-src 'self' https: 'unsafe-inline';
upgrade-insecure-requests
```

# helmetの設定変更
原因はExpress.jsに導入していたhelmetというミドルウェア。Express.jsの公式Webサイトでも紹介されているミドルウェアで、セキュリティを色々強化してくれる。
[紹介ページ](https://expressjs.com/ja/advanced/best-practice-security.html#use-helmet)にはこのような記述

> Helmet は、実際には、セキュリティー関連の HTTP ヘッダーを設定する 9 個の小さなミドルウェア関数の単なる集合です。
> - csp は、クロスサイト・スクリプティング攻撃やその他のクロスサイト・インジェクションを防止するために Content-Security-Policy ヘ> ッダーを設定します。

これです。対処方法としてはcspを無効化して、metaタグ側のcspを読み込ませるか、自分で記述すればいい。

``` typescript:app.ts

// これだと全部有効になるので
app.use(helmet())

// cspミドルウェアだけを無効にする
app.use(
  helmet({
    contentSecurityPolicy: false,
  })
);

```

# 作っているWebアプリ

https://wargamerts-tool.com

なんか他のリプレイアップローダーが全滅してしまったので作ってます。(タイトルの文字化けは面白いのでしばらく放置)
[Webを支える技術] 読み取り専用のWebサービス設計

# Webサービスの設計
リソース設計の指針としてある、リソース指向アーキテクチャを使用して、自分の名前を外部へ提供するWeb APIを考えながら学びます。
リソース指向アーキテクチャでは次のようなことを行います。

1. Webサービスで提供するデータを特定する
1. データをリソースに分ける
1. リソースにURIで名前を付ける
1. クライアントに提供するリソースの表現を設計する
1. リンクとフォームを利用してリソース同士を結びつける
1. イベントの標準的なコースを検討する
1. エラーについて検討する

# Webサービスで提供するデータを特定する
リソース設計の最初の仕事はデータを特定することです。
今回は私の名前`Micchili`というデータを提供するWebAPIを考えていきます。。

Micchiliは2つのデータがあると考えます。
`Micchili`,`みっちぃ`

# データをリソースに分ける

- Micchili: データ名
- みっちぃ: データ型

# リソースにURIで名前を付ける
このリソースに対して名前を付けます。
この場合であれば…

```
https://name.public.jp/Micchili
```

と名付けます。
URIでは大文字を使用しないほうが良い設計なので、気をつけましょう。
今回の場合、3つのリソースがあり、その中で個人を特定出来るのは`Micchili`のみなので、こちらを使用します。

> 大文字小文字が混在していないURI
単純に大文字と小文字が混じっていると読みにくいのでやめようね、という話です。
もし大文字、小文字が違うだけのURIがあった場合、それは違うものとみなして404エラーを返すサービスが多いようです。
基本的にエンドポイントは統一のあるものにしましょう。

https://qiita.com/soyanchu/items/5ca902a7353bb08b7f12

# クライアントに提供するリソース表現を設計する
このリソースをどう提供するかを設計します。
今回は単純な文字列なので、軽量フォーマット表現であるjsonを使用します。

```json:Micchili.json
{
  "name": "Micchili",
  "yomi": "みっちぃ"
}
```

# エラーについて検討する
このAPIは読み込み専用です。なので、GETとHEAD以外受け付けません。
(HEADが必要な理由は、WEBサーバーにおいて必須の要件だからです。)

> All general-purpose servers MUST support the methods GET and HEAD.
All other methods are OPTIONAL.

https://datatracker.ietf.org/doc/html/rfc7231#section-4

また、今回はMicchiliというリソースしかありませんので、これ以外のURIでGETされた場合には404を返します。
GitHub ActionsでLintをかける時は1ツールずつ実行しよう

最近のGitHub ActionsはPR時にLint系が指摘を出すのを拾ってコメントしてくれる機能があります。
![Screen Shot 2021-05-28 at 11.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/b7676a73-1252-077d-0ea0-7e91dfbcffb4.png)
はじめのうちは表示されていたのですがあるタイミングで表示されなくなり、Betaだから消えたのかな？と思っていました。
結論、こういった指摘を拾ってくれそうなツールをまとめて実行せずに1つずつ実行するようにすれば再び表示されるようになりました。

🙅‍♀️ NGパターン

```yml
- name: Lint Check
  run: npx tsc && npx eslint --ext .ts,.tsx .
```

🙆‍♀️ OKパターン

```yml
- name: TypeScript Type Check
  run: npx tsc
- name: ESLint Check
  run: npx eslint --ext .ts,.tsx .
```
さくっとdeviseをつかってみる

# 前回の続き
では前回でdeviseの導入までは終わっていると思いますので、実際にdeviseをつかっていきましょう！

まだdeviseの導入が終わってない方はこちらから
[deviseのかんたん導入手順](https://qiita.com/nakachan1994/items/302bde68cfa453533be7)

# ルーティングの設定
マイグレーションできたら`config/routes.rb`にルーティングが追加されているはずです。

rootパスも追加しましょう。

```config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'homes#index'
end
```

# deviseのストロングパラメータを設定
追加したnameカラムがデフォルトでは設定されていないので、`before_action`を使ってdeviseの機能が使われる前に実行されるようにします。

deviseのコントローラーは、直接修正できないので、`application_controller.rb`に書きます

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  endend
```

# deviseのビューをカスタマイズする
deviseではデフォルトでビューが用意されていますが、そのままだとEmailとpasswordのみでの新規登録画面になるので、カスタマイズしていきます。

ターミナルで下記実行

```
$ rails g devise:views
```

するとdevise機能に関連付けられたさまざまな、ビューが作られました。

新規登録画面は`app/views/devise/registrationsのnew.html.erb`にあります。
nameでもログインしたいので、フォームを追加します。

```erb:app/views/devise/registrations/new.html.erb
<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true %>
  </div>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
:
:
```

/users/sign_upへアクセスしてもらうと、nameとemailで新規登録できる画面ができていると思います。

# ログアウト機能
新規登録後はログイン状態になります。
このままだとずっとログイン状態のままなので、ログアウト機能をつけます。

`app/views/layouts/application.html.erb`のbody内にheaderタグをつくり、その中に書いていきます。

```erb:app/views/layouts/application.html.erb
<body>
    <header>
      <% if user_signed_in? %>
      <li>
        <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
      </li>
    <% else %>
      <li>
        <%= link_to "新規登録", new_user_registration_path %>
      </li>
      <li>
        <%= link_to "ログイン", new_user_session_path %>
      </li>
    <% end %>
    </header>
    <main>
      <p class="notice"><%= notice %></p>
      <p class="alert"><%= alert %></p>
      <%= yield %>
    </main>
  </body>
```

`<% if user_signed_in? %>`はdeviseで用意されているヘルパーです。

ログインしてるときに、表示したいものを`<% if user_signed_in? %>`から`<% else %>`に、
ログインしていないときに、表示したいものを`<% else %>`から`<% end %>`に書きます。

mainタグの中の`<p class="notice"><%= notice %></p>`と`<p class="alert"><%= alert %></p>`は、ログインに成功したとき、失敗したときに、フラッシュメッセージを表示できます。

デフォルトでは、新規登録、ログイン、ログアウト後は、rootパスに遷移します。

# まとめ
これでdeviseの基本的は実装は完成です。
とても簡単だったと思います。

deviseを使うことでここまで簡単に、ユーザー認証機能がつくれます。
コントローラーやモデルの設計も特になにもせず、動作する状態になるのでとても便利だったと思います。

ただdeviseの中はブラックボックスになっていて、真の理解をするためには、まだまだ使いこなしていかなければなりません。

railsでdeviseを使う機会は多いと思いますので、徐々に慣れていきましょう！
espeak の使い方

espeak のサンプルです。

英語

```bash
espeak -v english 'Hello'
```

ドイツ語

```bash
espeak -v german 'Guten Tag'
```

フランス語

```bash
espeak -v french 'Bonjour'
```

イタリア語

```bash
espeak -v italian 'Buon giorno'
```

フィンランド語

```bash
espeak -v finnish 'Terve'
```

エスペラント語

```bash
espeak -v esperanto 'Saluton'
```

ブラジル・ポルトガル語

```bash
espeak -v brazil 'Boa targe'
```

スペイン語

```bash
espeak -v spanish 'Buenas targes'
```
個人Macにインストールしているコマンドラインツール紹介

# はじめに

日頃ターミナル（正確にはiTerm2）ばっかり開いているので他のツールに移動するのが少し面倒なことがあります。
なのでできる限りコマンドラインで済ませられるように個人的に使用しているコマンドラインツールを紹介します。

※ 過去にメモしておいたものがありますのでbashで記載されていますが、現在Macはzshになったのでzshに読み替えていただければと思います。

# enhancd
cdコマンドを幸せにする
もうこれがないと辛い

インストール、使い方周りはここから確認：
https://github.com/b4b4r07/enhancd

.bashrcから.bash_profile以下を書き換えいる（書き替えたほうが動きが安定した）

```
$ vi ~/.bash_profile
source ~/.enhancd/enhancd.sh

インタラクティブに検索するツールも必要なのでpecoを入れた
$ brew install peco
```

解説サイト：
https://qiita.com/b4b4r07/items/2cf90da00a4c2c7b7e60

# jq
コンソール画面でjson形式のデータをいい感じに確認できるようにするツール
API見る時すごい便利

```
インストール
$ brew insall jq
```

使い方まとめサイト
http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af
http://qiita.com/Nakau/items/272bfd00b7a83d162e3a
# htop
topコマンドの拡張ツール
topコマンドが見やすくなるのでおすすめ
単純にかっこいい

```
インストール
$ brew install htop
起動
$ htop
```

# nmap
対象ホストの開いてるportを確認

```
インストール
$ brew insall nmap
使い方例
$ nmap localhost
```

# colordiff
その名の通りdiffコマンドに色を付ける

```
インストール
$ brew install colordiff
使い方例
$ colordiff -u a.txt b.txt 
```

colordiffにaliasを貼っておくとより良い

```
$ vi ~/.bash_profile
export LESS='-R'
if [[ -x `which colordiff` ]]; then
  alias diff='colordiff -u'
else
  alias diff='diff -u'
fi
```

# gnu sed
macのsedコマンドは面倒くさいようすなのでgsedを使う

```
インストール 
$ brew install gnu-sed --with-default-names
```

使い方
例）先頭行にhogeを挿入
※バックアップファイルを作成する場合は-iオプションの後にスペースを付けてはいけない

```
$ gsed -i '.bak' "1s/^/hoge\n/“ test.txt
```

# tree
windowsにはある例のtreeコマンド

```
インストール
$ brew install tree

ヘルプ確認
$ tree —help

階層指定
例）2階層まで表示
$ tree -L 2
```

# bashmarks
ディレクトリのブックマーク
設定ファイルのディレクトリとかlogディレクトリとかどこだっけ？を考えたくないので重宝
インストール、使い方周りはここから確認：
https://github.com/huyng/bashmarks

必要な設定

```
$ vi ~/.bash_profile
source ~/.local/bin/bashmarks.sh
```

# 最後に

今回は以上です。
また何か良いツールを見つけたら更新します。
RDSのMySQL8.0でロールをユーザーにGRANTしたら1227エラーが発生した。

RDSのMySQL8.0において、
マスターユーザーで操作を行い、ロールを別のユーザーに以下のクエリでGRANTしようとしたら次のようなエラーが発生した。

```
Error Code: 1227. Access denied; you need (at least one of) the WITH ADMIN, ROLE_ADMIN, SUPER privilege(s) for this operation
```

GRANTのSQLは以下。

```
GRANT ROLE_ADMIN on *.* to root
```

# 結論

`ROLE_ADMIN`という権限を操作ユーザー（マスターユーザー）につける。

```
GRANT ROLE_ADMIN on *.* to root
```

AWSサポートで教えていただきました。

# 補足情報

作業しているユーザーは、`root`というマスターユーザー（AWSコンソールで作った）
マスターユーザーの権限は以下。

```
SHOW GRANTS for current_user;

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON *.* TO `developer`@`%` WITH GRANT OPTION
GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,INNODB_REDO_LOG_ARCHIVE,SHOW_ROUTINE ON *.* TO `developer`@`%` WITH GRANT OPTION
```

いっぱいあるけどROLE_ADMINはついてないんですね〜。不思議。

以上、参考になりましたら幸いです。
DXを企画・実行する為の基礎知識

###- INDEX -
**[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)**
**[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)**
**§３　ケース・スタディ**
**　　[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)**
**　　[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)**
**　　3) 医療**
**　　4) 建設・土木**
**　　5) 農業**
**　　6) 社内ネットワーク**

============================================================
#[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)
ガートナー ハイプサイクルは、様々なICT技術を同じグラフ上で一目で比較する事ができる便利なツールですが、あくまでもICT用語の流行を分析したものなので、サービス・製品の事業性の分析に使うには更なる分析が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/323a3915-b75b-24d7-cf45-8aa00b3fe93c.png)
#####詳しくは　https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526


#[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)
インターネット型ビジネスは、No1企業（GAFA、BAT等）が圧倒的に強いが、５G型ビジネスは複数の企業が役割分担・連携してサービス提供するビジネスモデルなので、日本型のビジネスに相性の良いビジネスモデルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/7559865b-8c14-2cf8-627f-21de82ccb55a.png)
#####詳しくは　https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa
#§３　ケース・スタディ (今、何に取り組むべきか？)

####[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)
■“公共交通”“流通分野”の技術課題は、国主導の実証実験等でほぼクリア
■ビジネスモデルの確立が課題
-「貨客混載」で、“収益モデルを完成”させ、かつ“地域ビジネスに貢献”するビジネスモデルに -
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/8eecd2cd-acf4-71cf-7d8c-c6a78b81d5de.png)
#####詳しくは　https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7

####[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)
■“ラストマイルのビジネスモデルの確立がポイント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/6314c682-d36b-8007-bcd4-04dd43ad0b31.png)
#####詳しくは　https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831
XMLサイトマップについての基礎知識



先日、サイトリニューアルによるドメイン変更にあたって、サイトマップを新設する必要がありました。
新設にあたり、あれサイトマップってそもそもなんのためにあるのだろうかと疑問に思ったのでメモです。


###そもそもサイトマップとは

サイトのSEO対策を行うとき、検索エンジンに自分のサイトを効率良くインデックス[^1]してもらうことが必要です。
[^1]: クローラーがページを認識し、データベース化すること

基本的に、検索エンジンのクローラーはXMLサイトマップを設置していなくても、他サイトのリンクを辿ることでサイトを見つけ出せますが、新規公開ページや階層が深いページなど、クローラーがそのサイトを発見できずにインデックスされない場合があります。
そういったときにXMLサイトマップがあれば、検索エンジンにクロールを促すことができ、そのような状況を避けることができます。


要するにクローラーに自社サイトをお知らせする道標のようなものだなと理解しました。
ちなみに混同されやすいのですが、ページにきたユーザーにサイトの構造を伝えるHTMLサイトマップとは別物です。


###どんな時にサイトマップが必要か

ではどんなときにサイトマップを作る必要があるんでしょうか。
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694053/fed5022e-3ffb-f61a-9181-9601eec89fee.png)
[*出典：サイトマップについて – Search Console ヘルプ*](https://developers.google.com/search/docs/advanced/sitemaps/overview?hl=ja&ref_topic=4581190&visit_id=637577781235830161-742814723&rd=1)




Googleサーチコンソールには上記のように書いてありました。

まとめると、サイトのサイズがそこまで大きくないシンプルなサイトを運営するときは必要ないみたいです。
逆に、大規模なサイトでかつ、クローラが見つけられないようなリンクがたくさんある場合は必要だということですね。


###サイトマップのかきかた

では実際にサイトマップの作り方を見ていきましょう。

```
<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <url>

      <loc>http://www.example.com/</loc>    //アクセスするURL

      <lastmod>2021-01-01</lastmod>　　　//最終更新日

      <changefreq>monthly</changefreq>　//更新頻度

      <priority>0.8</priority>　　//優先度

   </url>

</urlset> 
```


URLが少なければ問題ないのですが、巨大なサイトになってくると膨大なURLを記載する必要があります。
その場合の注意事項として
**・5万URL以下であること**
**・10MBを超えてはいけない**
超えてしまう場合は、ファイルを分けてURLを指定する　もしくはgzipに圧縮するなどして対応の必要があります。


今回はファイルを分けてURLを指定しました。
URLを分けるときは<sitemap>タグを使う必要があります。

```
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
    <loc>https://www.example.com/sitemap_0.xml</loc>　//分ける
</sitemap>
<sitemap>
    <loc>https://www.example.com/sitemap_1.xml</loc>　//分ける
</sitemap>
</sitemapindex>
```


###サイトマップができたら

XMLサイトマップができました！
が、これでおわりではありません。Googleにサイトマップの存在をお知らせをしましょう。
以下２つの方法でクローラに存在を伝えることができます。

**①サーチコンソールを活用する**
**②robots.txtを活用する**


####①サーチコンソールを活用する方法
1. Google Search Consoleにアクセス
2. サイトマップ→サイトマップを追加をクリック
3. 作成したサイトマップのURLまたはファイル名を入力する
4. テストをクリックし、エラーがないかチェックする
5. エラーがないことを確認して、サイトマップを送信をクリック


####②robots.txtを使う方法

```
User-agent: *
Disallow: /column/wp-admin/
Allow: /column/wp-admin/admin-ajax.php

Sitemap: https://www.example.com/sitemap.xml
```

| 項目 | 必須 | 意味 |
| :--- | :--- | :--- |
| User-agent: | ○ | 命令を与えるユーザーエージェントの名称を記入します。 |
| Disallow: | × | クロールを許可しないディレクトリ・ページを記入します。 |
| Allow: | × | クロールを許可するディレクトリ・ページを記入します。 |
| Sitemap: | × | sitemap.xmlのURLを記入します。※複数ある場合は複数記入可能です。 |




###まとめ
クローラーはrobots.txt→sitemap.xmlの順で回っていきます。
自社サイトのSEO対策にXMLサイトマップは役立つ。



###参考文献
https://promonista.com/glossary-sitemapxml/
https://www.sitemaps.org/protocol.html
【Excel】Webページ内の表をExcelに落とし込む方法 for MacOS

# この記事でできること

タイトルの通り，webページにあるこのような表
![スクリーンショット 2021-05-28 10.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/6d2c6d5e-6f2e-9725-9d4e-ca56d7dd1477.png)

を，Excelに落とし込む方法を忘備録として記録します．(上記画像のサイト→https://www.pref.ibaraki.jp/1saigai/2019-ncov/ichiran_kako.html)

よく紹介されている方法がWindowsのみでMacOSでは対応していなかった(?)ため，誰かの役に立てれば嬉しいです．

![スクリーンショット 2021-05-28 10.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/9f64122e-5df1-bbcd-d9e1-eed30a53e2e5.png)

それでは工程を見ていきましょう！


# 準備

## Excelファイルの準備

データを保存するExcelファイルを準備しましょう．誰でもできます．

##iqyファイルの準備

MacOSでは，WebのデータをExcelで開くためにはiqyファイル経由でやるみたいでした．(私調べ)
テキストエディタなどで，.iqyファイルを用意して，中身には取得したいデータがあるページのリンクを書いて保存します．

![スクリーンショット 2021-05-28 11.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/7a2c3cca-c95d-1d52-c52e-e3dc464c293a.png)


今回は，茨城県が発表した2020年10月31日までの新型コロナウイルス感染者情報を公開しているサイトを使用したいと思います．(https://www.pref.ibaraki.jp/1saigai/2019-ncov/ichiran_kako.html)
雑談ですが，地方自治体が公開しているデータをこのような形(個人使用，非営利目的)で使用することは法に触れるんですかね？

．．．さて，準備はおしまいです．


#Excelへの書き込み

ヘッダータブから以下のように選択していきます．(他にもたどり着く方法があるかもしれませんが)

![スクリーンショット 2021-05-28 11.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/cb205331-8f8a-5430-51f0-16acf8a1e67c.png)

これを選択するとFinderウインドウが出てくるので，先ほど作成したiqyファイルを選択して，データの取り出しを開始します．

![スクリーンショット 2021-05-28 11.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/51890827-fa48-2f61-610a-9afe00d2e281.png)


すると，以下のようにデータを取り込むことができます！

![スクリーンショット 2021-05-28 11.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/b68778b7-c907-bb74-1172-d5d5df1744f3.png)


#最後に

昨今は，各国はじめ地方自治体が新型コロナウイルス感染者数を公表しています．データ分析の練習をするには絶好のデータです．Excelでやるもよし，Pythonでデータを綺麗にして各種処理をするもよし．
NDK at ~/Android/Sdk/ndk-bundle did not have asource.properties file と出た時

# 起こったこと
Androidアプリをビルドしようとしたところ、
``` NDK at ~/Android/Sdk/ndk-bundle dit not have a source.properties file ```

と表示された。

# 解決策
``` ~/Android/Sdk ```にてndk-bundleディレクトリを削除するとエラーが解消した。
vim-bootstrapでVimを使う方法


# はじめに

日頃Vimを使用している方は `.vimrc` で色々カスタマイズして使用しているか方も多いかと思います。
ただ、Vimをそこまで使用したことのない方々には少し敷居が高いこともあるかと思います。
そんな方々のためにvim-bootstrapを使用したVimの設定方法をご紹介します。

# 個人的にVimを使う理由

そもそもVSCodeなどが広まっている中でわざわざVim使う必要があるのか？
ということもあるかと思いますが、VimはVimで以下のようなメリットがあるかと思います。

 - ローカル/サーバーなど基本どこでも使える
 - 起動が早い
 - ターミナルツール1つで環境が完結できる
 - 設定ファイル(.vimrc)があればすぐに同じ設定のエディターが使える

# 今回ご紹介するサイト

https://vim-bootstrap.com/

vim-bootstrapは利用頻度の多々そうなプラグインやキーバインドを `.vimrc` で生成してくれるジェネレーターです。
サイト自体の使い方はそこまで難しくないかと思います。
プラグインをインストールしたいプログラム言語を選択して Generate! ボタンをクリックで `.vimrc` をダンロードしてくれます。

# 設定方法

ダウンロードされたものを配置するだけなので難しくはありません。
ダウンロードされたファイルを以下へ配置しVimを開ければ利用可能です。
Vimの場合、 `~/.vimrc`
NeoVimの場合、 `~/.config/nvim/init.vim`

配置後、Vimを開くとプラグインのダウンロードが始まり以下のような少しイケてるVimになります。

![スクリーンショット 2021-05-28 10.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106060/a216a44e-7964-f3c7-41ab-990160a9c8cb.png)

カスタマイズしたい場合は記述もできます。（サンプルはNeoVimです）

```
# 個別の設定
~/.config/nvim/local_init.vim
# 個別のbundleの設定
~/.config/nvim/local_bundles.vim
```

なおこれは個人的な問題ですが、クリップボードへのコピーが上手くできなかったので以下の設定はコメントアウトしています。

```~/.config/nvim/init.vim
""" Copy/Paste/Cut
"if has('unnamedplus')
"  set clipboard=unnamed,unnamedplus
"endif
```

# 使い方例

vim-bootstrapの独自のキーバインドがいくつか設定されているので少し紹介します

### F3キー

- 左側にディレクトリツリーが開きます(Nerdtreeです)
- ディレクトリツリーへの移動はctrl+w、エディター側へはctrl+l

=> マウスを使わずにディレクトリツリーへ移動できるのはすごい便利です。

### カンマ+eキー（,+e）

- 現在開いているディレクトリからファイル名をインタラクティブに検索(ctrlpです)

※ ctrlpとは、Vimのプラグイン名です。 https://github.com/kien/ctrlp.vim

# 最後に

Vimは古臭く感じる方もいるかも知れませんが、非常に使い勝手のいいエディターです。
Vimに憧れがある方の参考になればと思います。
以上です。
Githubのissueで使用されるreactionsアイコンを読み解く

エンジニアが新たな技術の学習やバグなどに直面した際、真っ先にWEB検索を行うことでしょうがQiita、Zenn、Teratail、Stack Overflow、DEV COMMUNITYなどと並んで、特にお世話になっている、実用的価値が高いページがあります。

それが**Github**の**issue**（議論スペース）で、お世話になったことも多いのではないかと思います。

そして、こんなアイコンを見たことがあるでしょう。

![icon_reactions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/e1f892c6-1cea-0b2e-0106-81121df5be04.jpeg)

元になったissueというよりはテストスペース

https://github.com/octocat/Hello-World/issues/349

そして、うまく英語が読めなくてもこのアイコンを頼りにするだけで有効な情報を発見することができます（自分もissueの英語は流し読み程度で、ほぼこのアイコンしか見ていません）。

# アイコンの種類
それぞれ左側から順番にこういうニュアンスを持っているようです。

- 👍**thumbs up** 
 thumbとは親指のことで、いわゆるグッドサインのことです。つまり、**Qiitaの「いいね！」のような意思表示**です。この数が多いほど有益な情報です。
- 👎**thumbs down**
 いわゆるブーイングのサインで、Qiitaにはないですが、TeratailやStack Overflowなどにあるマイナス評価です。このマイナス評価が下されるということは有益ではない情報だということはすぐわかるでしょうが、ときどきこの**グッドサインとブーイングの双方が下されている**場合もあります。その場合は、環境の差違など**ケースバイケースで使えるかも知れない情報**だと認識するといいでしょう。
- 😄**laugh** 
 笑いのアイコンです。本当の意味での「いいね！」という意味ですが、技術者が実際に直面して解決できた情報というよりは「いいんじゃない？」という**けっこう客観的な視点も多く入る**ことが多いので、これが多いアイコンはどちらかというとそこまで有益じゃないものが多いですし、使う人も少ないです。また、人によっては「何言ってんのコイツ？」というような嘲笑う表現もある（アメリカでは、議題に対して笑うのは失礼な行為に当たる）ので、やはり有効な情報を探すアイコンとしては適していません。
- 🎉**hooray** 
 直訳すると「やったぜ！」という意味で、アイコンはクラッカーです。クラッカーはアメリカではパーティーの象徴、つまりはお祝いムードを意味します。つまり、自分もこの情報のおかげで解決できたとか、そういう**主観的に感動を伝えることが多い**アイコンです。当然、これが多い情報は有益なものが多いです。
- 😕**confused** 
 ある意味、thumbs downより問題ありの情報で、日本語で直訳すると「混乱」、つまり「よくわからんぞ」という意思表示です。このアイコンが置かれた情報は単に議論の流れの上で質問を返しているだけか、あるいは無益どころか損となる情報を与えている場合が多いので、英語が読めない場合は無視で構いません。ただ、ときどき他のthumbs up、hoorayやheart、rocketと合わさっている場合もあるので、その場合は**分かる人にはわかる上級者向けの難解な情報**、または**根本的な解決になっていないその場しのぎの方法**であることが多く、初心者ならやはり相手にしない方がいいかも知れません。
- **heart** (環境の関係で正しく表示できませんでした)
 そのままハートのアイコンで、「ありがとう」という感謝の気持ちを表すアイコンです。これは実際技術者が難題に直面して解決できたときに「おかげで解決できたよ！」という**情報提供者に感謝の意思表示をしていることが多い**ので、極めて有益な情報が多いです。thumbs up、hooray、あとは下に挙げるrocketと並んで重視すべきアイコンです。
- 🚀**rocket**
 新たに追加されたアイコンの一つですが、アメリカで、ロケットは未知の発見、言葉にならない感動を暗喩しているので、「こいつはすごい！」「大発見だ！」「あなたが神か！」といった特別な感嘆を示しています。なので、hooray、heartと比較すると**今まであまり知られていなかった妙案**や**間違いなく解決につながる決定的な情報**であることが多いです。自分が最も重要視しているアイコンの一つで、実際このアイコンが付いた情報に何度も助けられています。
- 👀**eyes** 
 斜め向いた目のアイコンで、これも新たに追加された一つですが、この情報は正直言ってあまり有益ではありません。どちらかというと議論の最中で「なになに？」とか「え？」というようなconfusedほどじゃない**軽い疑問や関心を示していることが多い**からです。

# 結論
見ていくべきアイコンはthumbs up(グッドサイン)、hooray（クラッカー）、heart（ハートマーク）、rocket（ロケット）のこの4つです。また、質問者に対してもこれらのアイコンが用いられることが多いですが、**質問者にも賛辞が与えられるということは、この議題によって解決できた人が多い、つまり有益な情報が書かれている議題であることが多い**ので、ここも見逃さないようにしましょう。

## おまけ
最低覚えておくとヒントを見つけやすい、よく説明部分で使用される表現をいくつか紹介しておきます。けっこうネイティブじゃないエンジニアも多いので、記述内容もそこまで複雑でないことが多いです。

### 回答側に多い表現
- from A to B
よく使われる表現でAの代わりにBということなので、今使っているAの記述ではなくて、Bのように書き換えれば問題を解消できるって助言です。前置詞fromはその外部のエリアから、対するtoは、その目的の所へという意味なのでイメージも掴みやすいと思います。その直前にはよくchange（変更する）などの動詞が使用され、変数の書き換えなど、次と比較して軽い修正を促している場合が多いです。

- B instead of A
これも似たような表現で、Aの代わりにBの方法を使えってことでinsteadは「～の代わりに」という接続詞です。傾向としては、from toと比較すると根本の方法から書き換えるようなものが多いです。

- argument
ずばり、引数のことです。なので、この単語が出てくる場合は、だいたい関数内の引数を確認したら良いという助言を送っており、事前にset（設定する）などの動詞が合わさってる場合が多いです。

※随時追加

### 質問側に多い表現
質問側に多い表現は、検索するときに便利です。

- not working
機能しないという意味なので、うまく動かないときにその関数やプロパティ、ライブラリと併せて検索ワードに加えると、答えが見つかることが多いです。

- multiple
複数という意味なので、たとえば、プリミティブな値の場合の処理はわかったが、では複数の値を同時処理したい場合はどうすればいい？といった質問などで使えます。
UE5を触ってみた！

# 初めに
　今回は、2021年5月26日にUE5のアーリーアクセス版が公開されたので、触ってみた感想になっています。

# 手順
　幸い、導入手順は複雑ではなく簡単に出来るのでありがたいです。

1. Epic Games Launcherをアップデート
1. ランチャー内の「Unreal Engine ＞ UE5 ＞ 専用アクセスのダウンロード」をクリック
1. ライブラリ内に「5.0.0 早期アクセス」が追加されるので、ダウンロードする。
1. 約11GBになるので、数十分待機。
1. これで、起動は可能です。ただ、初回起動はかなり長いので注意。

サンプルプロジェクトを起動するまで

1. ランチャー内の「Unreal Engine ＞ UE5 ＞ UE5新機能のサンプルプロジェクト ＞ サンプルを入手」
1. プロジェクト名と保存場所を選択
1. ダウンロードが開始されるので40~90分間放置。100GBはワロエナイ。
1. ダウンロード先の「古代の谷.uproject（デフォルトの場合）」をクリックして起動。
1. 画像にも書いてあるが、AncientContent/Maps/AncientWorld.umapを開けばOK

# 画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/3be2cbf0-a4ec-a424-e129-e1edc712e1d1.png)
　起動する際の小ウィンドウが最高にカッコいいことになっています。

![デモ　スペック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/9344968a-6936-b720-65b9-f5ea5bbe1be2.png)
　かなりのスペックを要求されます。もし、足りない場合は、左上にある「三本の横線」をクリックし、スクリーン比率を調整すればいいらしい。…ですが、あまり変わらない気がするのは気のせいでしょうか？

![image](https://user-images.githubusercontent.com/52647796/119829619-62b37780-bf36-11eb-8bea-f51ce95f683f.png)
　UIはUE4と比べかなり変更が加えられており、グラフィックには驚愕させられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/151c0831-0cd2-2f38-167f-4db177f3e63e.png)

　近付くと、人・岩・火が更に綺麗に見えます。いいですねぇ～。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/0051ba2d-6f2f-6b8a-00de-16e4a79f9347.png)

　もはや、焚火は現実のものと変わらないです。火の動き・光加減・影・反射などなど、これは惚れてしまいすね～。

![image](https://user-images.githubusercontent.com/52647796/119829954-c047c400-bf36-11eb-9f79-e2c54ea538bd.png)

　この主人公？を見て下さい。服が「これぞ、フォトリアル！」といった感じで、特に腕の部分がリアルだと思います。（ただし、あまりキャラが可愛くな（ry

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/0bc6ba40-8260-bfd2-3606-76cf0b075a9a.png)
　ワイヤーフレームだとキモくなる現象は変わらないですね（笑）

以降はGIFになります

![一日](https://user-images.githubusercontent.com/52647796/119838903-be81fe80-bf3e-11eb-937d-8862f5b6a1af.gif)
![record_000002](https://user-images.githubusercontent.com/52647796/119842692-dc9d2e00-bf41-11eb-9948-b4f9f35cc1b0.gif)

　後は、裏世界に行ってボス（弱小）を倒す事になりますが、それは自分で確かめてみて下さい。主人公？が魔法弾的なモノを撃てるようになったり、逆にボスが極太レーザービームを撃ってきたりします。
　といっても、あくまでサンプルなので、主人公？は死にませんし、ボスは弱々だし、ボリュームは無いし、という感じになっています。ですが、そこはせっかくの汎用エンジンなのでプログラムしてみて、ゲーム性を出してみたりすると面白いかもしれません。

# 結論&感想
## 結論
　このような感じで軽く紹介しました。ですが、UE5の内容は上記だけでは無いので、色々試しながら触っていくのも楽しいかと思います。そして、私はあくまでサンプルを紹介しただけで詳しくないので、UE5使われている詳細な技術やUE4の違いなどは専門家の人に頼みます。m(_ _)m
　そして、必要スペックが高くないと無理と感じた人もいるかもしれませんが、エンジンだけを使って触るだけなら普通に使えるはずです。サンプルプロジェクトがおかしいだけなので(笑)

## 感想
　正直言いますと、「グラフィックで感動する事はもうないな」と思っていましたが、UE5を触ってみるとその考えを改めざる負えなくなりました。今後、このサンプルプロジェクトは次世代のフォトグラフィックの基準になっていくはずです。
　でも、流石にこれ以上のグラフィックの強化はもう無理そうなので、次はVRのグラフィックなどによる没入感を強化しかなさそうですね（フラグ）。目指せSAO！目指せフルダイブ！
Play Frameworkのテストの書き方

Play Frameworkでテストを書いてみたので、それの備忘録として残します。

## 表示のテスト

```java:表示のテスト
@Test
public void 表示出来るかどうか() {
   Http.RequestBuilder request = Helpers.fakeRequest()
       .method(GET)
       .uri("/");

   Result result = route(app, request);
   assertEquals(OK, result.status());
}
```

## statusテスト
```java:formのテスト
@Test
public void Formにnullがあったら400番が返るかどうか() {
  Http.RequestBuilder textNullRequest = Helpers.fakeRequest()
      .method(POST)
      .bodyForm(ImmutableMap.of("name","テキストがnull", "text", ""))
      .uri("/board/create");

  textNullRequest = CSRFTokenHelper.addCSRFToken(textNullRequest);
  Result textNullResult = route(app, textNullRequest);
  assertEquals(BAD_REQUEST, textNullResult.status());
}
```

## エラーメッセージのテスト
```java:エラーメッセージのテスト
@Test
public void Formにnullがあったらエラーメッセージが返るかどうか() {
  String errorText = "必須入力です";

  try {
    Http.RequestBuilder textNullRequest = Helpers.fakeRequest()
        .method(POST)
        .bodyForm(ImmutableMap.of("name","テキストがnull", "text", ""))
        .uri("/create");

        textNullRequest = CSRFTokenHelper.addCSRFToken(textNullRequest);
        Result textNullResult = route(app, textNullRequest);
  } catch (IllegalStateException e) {
        assertThat(e.getMessage(),containsString(errorText));
  }
}
```

### formを飛ばす時の注意
Play FrameworkでFormを作成した際に`@helper.CSRF.formField`を使用した場合、テストでもCSRFトークンを付与しなければなりません。
なので、作ったRequestを`CSRFTokenHelper.addCSRFToken`で囲みましょう。

参考

https://www.playframework.com/documentation/2.8.x/JavaCsrf#Testing-CSRF

### Formのエラーメッセージの注意
PlayでFormのエラーメッセージを取得するにはtry-catchを使用します。
Playでは、バリデーションに`@Required`を付けると入力必須に出来ますが、それはPlay内部では例外を投げています(IllegalStateException)。それを捕まえて`e.getMassage()`と行うと自分が設定したエラーメッセージが取得出来ますので、それを`assertThat`でテストします。
llvmのPassのコンパイル実行

<p>
『きつねさんでもわかるLLVMコンパイラを自作するためのガイドブック』の本にはPassのコンパイルを行うときに
<code>g++ -g ./src/easypass.cpp -I./inc `llvm-config --cflags --ldflags --libs` -c -o easypass.o</code>
でeasypass.oを作成し、
<code>g++ -g -sahred -o ./bin/easypass.so easypass.o</code>
で共有ライブラリを作成し、
<code>opt -load ./bin/easypass.so -easypass ./sample/test.ll -S > /dev/null</code>
で共有ライブラリをロードしているが、
エラー文：undefined symbol: _ZTIN4llvm12FunctionPassE
が出力されたので、
<code>g++ -g (easypass.cppを指定) `llvm-config --cxxflags --ldflags --libs` -c -o (easypass.oを作成する場所)</code>
で--cxxflagsでc++を指定したらエラーが直った。

--?の機能は今後気が向いたら調べていこうと思う（多分やらない）
「Local」でSSLのTRUSTボタンをクリックしたら警告が出て有効化できないとき

WordPressのローカル開発環境「Local」でサイトを作成し、SSLを有効化しようとして「TRUST」ボタンをクリックしたらオレンジ色のバーが出て、
**Heads-up! We ran into an issue trusting the Local SSL certificate**
の表示が出て、SSLが有効化できない。
![スクリーンショット 2021-05-28 10.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30249/00f35dbf-0255-db00-2e88-8aa21537ae9e.png)

![スクリーンショット 2021-05-28 10.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30249/63efa219-cf36-e8ab-6db8-9ca6107852fd.png)


先のメッセージのLearn moreに飛んで読んだところ、 **現行macOS（11.x.x BigSur）の仕様による制限** のようす。

##以下の方法で解決##

1. まず、Localで作成したサイトのOVERVIEW > SSL > 「TRUST」ボタンで証明書を発行する。
1. 「キーチェーンアクセス」アプリを開く
1. 作成したサイトのドメインで検索（画像の例だとwordpress.local）、証明書が見つかるのでダブルクリックでひらく
![スクリーンショット 2021-05-28 10.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30249/c2ea4826-5b4a-cb5e-e49f-e305d08fbc73.png)

1. 「信頼」をクリックして展開し、「この証明書を使用するとき」のドロップダウンから「常に信頼」を選択
![スクリーンショット 2021-05-28 10.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30249/c2a8724f-f858-5d83-13d2-59d4f038653e.png)

1. 閉じると管理者パスワードを求められるので入力

以上でSSLが有効化される。されないときはLocalを一旦終了して再起動する。

![スクリーンショット 2021-05-28 10.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30249/183aa616-9bff-e574-49ca-471947b010df.png)


参考：
https://localwp.com/help-docs/ssl/managing-local-sites-ssl-certificate-in-macos/
１章　python基礎文法まとめ

#まえがき
pythonの基本的な文法をまとめました。
今まで使っていた言語とかなり形が違うので、備忘録として載せておきます。
特にリストやfor文が「あれ？」ってなってしまいがち

#目次
1. まえがき
1. 目次
1. pythonとは
1. 基礎文法
    1. 算術計算
    1. データ型
    1. リスト
    1. ディクショナリ
    1. ブーリアン
    1. if文
    1. for文
    1. 関数
    1. クラス
1. あとがき


#1. pythonとは
特徴
・シンプルで覚えやすい
・コンパイルが単純
・可読性が高い
・処理速度が高い
・機械学習やデータサイエンスで用いられることが多い

インタプリタ <-> Pythonスクリプトファイル

#2. 基礎文法
###算術計算

```python
>>> 1 - 2
-1
>>> 4 * 5
20
# 3の2乗
>>> 3 ** 2
9
```


###データ型

```python
>>> type(10)
<class 'int'>
```

###リスト

```python
>>> a = [1, 2, 3, 4, 5]
>>> print(a)
[1, 2, 3, 4, 5]
>>> len(a)
5
>>> a[2]
3
# ０～２（手前）番目まで取得
>>> a[0:2]
[1, 2]
# 0 to (n-1)
>>> a[:-1]
[1, 2, 3, 4]
```

###ディクショナリ

```python
>>> me = {'height'}
>>> me['height']
180
>>> me['weight'] = 70
>>> print(me)
{'height': 180, 'weight': 70}
```


###ブーリアン

```python
>>> hungry = True
>>> sleepy = False
>>> hungry and sleepy
False
```

###if文

```python
>>> hungry = True
>>> if hungry:
		print("hungry!")
	else:
		print("not hungry!")
hungry!
```

###for文

```python
>>> for i in [1, 2, 3]:
		print(i)
```

###関数

```python
>>> def hello(name):
		print("hello! " + name)
>>> hello(Taro)
hello! Taro
```

###クラス

```python
class Man:
	__init__(self, name):
	self.name = Name
	print("Initialized!")

	def hello(self):
		print("Hello" + self.name + "!")


m = Man("Taro")
m.hello()
```

#5. 参考文献
DeepLearning/O'REILLY
リモートホストのログイン中ユーザー名を取得する

# カレントユーザー名を取得したい
WindowsPCでリモートホストに現在ログオンしているユーザー名、が必要になることがある。（カレントユーザーって呼び方でいいんだろうか？）　ユーザーのデスクトップになんか置いたり消したり、プロファイル内の特殊フォルダにフルパスでアクセスしたり。
`query user /server:Hostname`ですぐ出せるから調べること自体に困難はないのだけれど、何度も何度も同じ操作して書き写していると微ストレスが溜まり原体力ポイントが下がっていく気がする。自動化しよう。


# query user
## 古いコマンドだが、代替はあるか？
昔ながらの`query`コマンド。PowerShellで使うにふさわしい代替はないのかな？って探したが、これ使えば一発という代替は無いらしい。世界中どこでも同じような質問があって、こんな方法でどう？があれこれ紹介されているものの、どれもケースに合わせた工夫があって真似るのがめんどくさい。ただユーザー名があればいいだけなのだが…あれば後で好きに加工して使うんで…
しかたがないので、`query user /server:Hostname`の結果を切り貼りしてユーザー名だけ取り出すことにする。

## query user の出力

```cmd:
#query user /server:Hostname の結果
                                                      アイドル

 ユーザー名            セッション名       ID  状態    時間       ログオン時刻

 mogura                rdp-tcp#1           1  Active          .  2021/05/27 13:00
```

## 目的の箇所を切り出す

PowerShellで`query user`を使うと、結果は文字列で返ってきて一行ずつ配列に入る。ユーザー名が入っている5行目を取り出せばいい。ホストは普通のWindowsPCなのでユーザーは1人しかおらず、行ズレの心配はない。
文字列は半角空白（の連続）で区切られているので、`-split`演算子で分割してやる。

```powershell:
$HostName = "Hostname"
$Query = "query user /server:${HostName}"
$Array = Invoke-Expression $Query

$Array[4]
# mogura                rdp-tcp#1           1  Active          .  2021/05/27 13:00

$Username = ($Array[4] -split " ")[1]
#mogura
```

## 応答がない場合の対処

`query`コマンド投げてリモートホストの応答がないと20秒くらい待たされて気分が悪い。待ち時間を短く設定するオプションはないようだ。
実行前に`ping`投げて応答なければ中断するようにする。安定したイントラ内なので1回届くか届かないかで構わない。
`Test-Connection`は応答が無い場合4秒でfalseになる。この時間を変更するオプションは無いようだ。残念。

```powershell:
#応答無い場合4秒でタイムアウト 変更不可
$isPingResp = Test-Connection -Quiet -ComputerName $HostName -Count 1
if($isPingResp -eq $False){
    Write-Host "Ping応答無し"
    Read-Host "[ENTER]で閉じる"
    exit
}
```


# できあがり

```powershell:対象Hostnameにログイン中のユーザー名を取得.ps1
$HostName = Read-Host "Hostname"

#応答チェック
$isPingResp = Test-Connection -Quiet -ComputerName $HostName -Count 1
if($isPingResp -eq $False){
    Write-Host "Ping応答無し"
    Read-Host "[ENTER]で閉じる"
    exit
}

$Query = "query user /server:${Hostname}"
$Array = Invoke-Expression $Query
$UserName = ($Array[4] -split " ")[1]

#後は$HostNameと$UserNameでお好きに
```
nextcloud が用意する公式 Docker イメージで memory_limit, upload_max_filesize, post_max_size を設定し起動する


## これはなに

- Docker 版 nextcloud を構築していた際に nextcloud 側で設定されている `PHP_UPLOAD_LIMIT` の上限に引っかかってしまい、設定を上書きをするために簡単に調査したのでまとめました

## デフォルトの設定

`memory_limit` `upload_max_filesize` `post_max_size` ともにデフォルト値は 512M です

## 設定方法

以前は php.ini を作成し公式イメージをベースに Dockerfile を記述していましたが、 ENV を渡せば php.ini が条件に沿って自動生成されるように変更されていました。

`memory_limit` の設定を行いたい場合は `PHP_MEMORY_LIMIT` に `1024M` 等の値を渡します。

`upload_max_filesize` `post_max_size` の設定を行いたい場合は `PHP_UPLOAD_LIMIT` に同様に `1024M` 等の値を設定します。

Dockerfile に直接記述する場合は以下のように

```dockerfile
FROM nextcloud:apache

ENV PHP_MEMORY_LIMIT=1024M
ENV PHP_UPLOAD_LIMIT=1024M

```

`docker-compose` 等に以下のように記述しても 🆗 です。
※ 不要な `db` の記述は削除しています

```yml
version: '2'

volumes:
  nextcloud:

services:
  app:
  image: nextcloud
  restart: always
  ports:
    - 8080:80
  links:
    - db
  volumes:
    - nextcloud:/var/www/html
  environment:
    - MYSQL_PASSWORD=
    - MYSQL_DATABASE=nextcloud
    - MYSQL_USER=nextcloud
    - MYSQL_HOST=db
    - PHP_MEMORY_LIMIT=1024M
    - PHP_UPLOAD_LIMIT=1024M
```

## Reference

https://github.com/nextcloud/docker/pull/1379
§３　DXのケース・スタディ　/ ロジスティクス

#2. ロジスティックス
**【今、何に取り組むべきか？】**
■ラストマイルのビジネスモデルの確立がポイント
##1) ビジネスモデルのセイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/6ea1b55b-6436-c358-2c0f-6c667afba723.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/99662e51-c96d-e542-bb0b-2ae4219ad6b3.png)
##2) フルフィルメントのビジネスモデル
**レッドオーシャン市場のモデル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/c42dfb47-3749-f0a6-3356-fb9cb02c6b91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/6b0127da-7c33-6814-73a7-1aa91adcb1f9.png)

##3) ラストマイルのビジネスモデル
**ブルーオーシャン市場のモデル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/99e589ff-4c04-4128-04c3-086b2fbeb84d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/e90c0d1f-7b7a-5ed2-e7a7-4cd71e350c82.png)



＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
（関連するコンテンツ）
【DXを企画・実行する為の基礎知識】
[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)
[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)
§３　ケース・スタディ
[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)
[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)
3) 医療
4) 建設・土木
5) 農業
6) 社内ネットワーク
【Android / Kotlin】USB Debuggingモードでアプリ起動を拒否する

セキュリティのため、USB Debuggingモードの場合に起動を拒否する必要があり実装しました。
最初に起動するActivity内に記載します。

![Screen Shot 2021-05-28 at 9.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/1902a36e-c9f9-3bba-477b-3bbd2f39d3f1.png)

```kotlin
@AndroidEntryPoint
class SomeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        if (isDebuggingMode()) {
            restrictOperation()
        }
    }
    private fun isDebuggingMode (): Boolean = false
       Settings.Secure.getInt(
           contentResolver,
           Settings.Secure.ADB_ENABLED, 0) != 0

    private fun restrictOperation () {
        AlertDialog.Builder(this)
            .setTitle("USBデバックをOFFにしてください")
            .setMessage("ご利用の端末はUSBデバックがONになっているため、ご利用いただけません。")
            .setCancelable(false)
            .setPositiveButton("OK") { _, _ ->
                finish()
            }
            .show()
    }
```
§３　DXのケース・スタディ　/ モビリティ

#1. モビリティ
**【今、何に取り組むべきか？】**
■“公共交通”“流通分野”の技術課題は、国主導の実証実験等でほぼクリア
■ビジネスモデルの確立が課題
　「貨客混載」で、収益モデルを完成させ、かつ地域ビジネスに貢献するビジネスモデルに
##1) “CASE”から、日本のモビリティ技術の状況を知る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/fe7bf3bd-30f3-6449-2a5f-631b5e8f954a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/46ed5cb1-095d-1c79-cca2-f587bdc6051c.png)

##2) 日本の“MaaS”の状況を知る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/0261749a-89dc-83a6-1578-7342848b679d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/9b3d11d4-5faa-40db-2db2-badb484b1aca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/04bc9b3c-1e24-6b31-6629-44d97eba24ec.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/6412d4dc-5992-2aa2-3ced-39a7836cca6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/69bd7c6a-9f9e-fd98-30cf-cb070f8b8d33.png)

##3) ビジネスモデルに求められるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/b3f626cb-9e24-28e3-245a-25f70c0ca0fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/d18f463e-35ae-d74d-7b20-edd0dcdddad1.png)


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
（関連するコンテンツ）
【DXを企画・実行する為の基礎知識】
[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)
[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)
§３　ケース・スタディ
[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)
[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)
3) 医療
4) 建設・土木
5) 農業
6) 社内ネットワーク
Makefileで同一ディレクトリ内のLaTeXファイルを一括コンパイル

# ディレクトリ構成
以下のように、同一ディレクトリ内に複数のLaTeXソースコードがあり、それぞれ単独でコンパイルしたい場合を考えます。

```sh
$ tree

.
├── aaa.tex
├── bbb.tex
├── ccc.tex
├── ddd.tex
├── eee.tex
├── fff.tex
└── Makefile
```

# Makefile

```Makefile
all: $(patsubst %.tex,%.pdf,$(wildcard *.tex))

clean:
	$(RM) *.aux *.log *.dvi

%.pdf: %.dvi
	dvipdfmx $<
%.dvi: %.tex
	platex $<

.PHONY: clean
```

## 解説

### `%.dvi: %.tex`
`platex $<`により、`%.tex`から`%.dvi`を生成します。

#### 使用例

```sh
$ make aaa.tex
```

### `%.pdf: %.dvi`
`dvipdfmx $<`により、`%.dvi`から`%.pdf`を生成します。

#### 使用例

```sh
$ make aaa.dvi
```

### `all: $(patsubst %.tex,%.pdf,$(wildcard *.tex))`
`all: *.pdf`と書きたいところですが、初回コンパイル時には`*.pdf`は存在しないためエラーになるのでこう書きます。

#### 使用例

```sh
$ make
```

本来`make all`と書くべきですが、一番上のターゲットは引数を省略できます。

### `clean:`
中間ファイル`*.aux`、`*.log`、`*.dvi`を一括削除します。

`.PHONY: clean`は、ディレクトリ内に`clean`というファイルがあった時に無視することを意味しています。

#### 使用例

```sh
$ make clean
```

## 注意

目次、相互参照等があり複数回コンパイルが必要な場合は、このMakefileでは正しくコンパイルできません。

複数回コンパイルが必要な場合は、`%.dvi: %.tex`を次のように書き換えます。

```Makefile
%.dvi: %.tex
	for i in `seq 1 2`; do platex $<; done
```

2回で足りない場合は`seq 1 2`を`seq 1 3`等にしてみてください。
【LeetCode】就活に向けたコーディングテスト対策 #03

#はじめに
こんばんは．
M1就活生が[LeetCode](https://leetcode.com/)から，easy問題を中心に**Python**を用いて解いていきます．

https://leetcode.com/

↓では，解いた問題のまとめを随時更新しています．
[まとめ記事](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)

https://qiita.com/halpi/items/43761b89a1873dcc9a5c

#問題
今回解いたのは，難易度easyから [問題9のPalindrome Number](https://leetcode.com/problems/palindrome-number/) です．
問題としては，整数`x`が与えられたとき，`x`が回文整数であれば，TrueをそうでなければFalseを返すというもの．

Example 1:

```python
Input: x = 121
Output: true
```

Example 2:

```python
Input: x = -121
Output: false
```

Example 3:

```python
Input: x = 10
Output: false
```

Example 4:

```python
Input: x = -101
Output: false

```

#書いたコード
とりあえず，思いついたままに書いてみました．

```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        reverse_x = int(str(x)[::-1])
        if x == reverse_x:
            return True
        else:
            return False
```

[問題7のReverse Integer](https://leetcode.com/problems/reverse-integer/) 同様，整数`x`をstr型に変換し，反転したものを再びint型とするアイデアを使いました．xと反転した値が等しければTrue,そうでなければFalseを返します．

しかし，このままではエラーが出てしまいました．マイナスの値が入力の場合，反転したあとint型に直せないためですね．

```
ValueError: invalid literal for int() with base 10: '121-'
    reverse_x = int(str(x)[::-1])
Line 3 in isPalindrome (Solution.py)
    ret = Solution().isPalindrome(param_1)
Line 26 in _driver (Solution.py)
    _driver()
Line 37 in <module> (Solution.py)
```

反転する値をstr型として保持し，入力する値`x`をstr型に変換することで，解決しました．今回は，比較を行い，bool型で返すのでこれで良さそうです．

```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        reverse_x = str(x)[::-1]
        if str(x) == reverse_x:
            return True
        else:
            return False
```

####追記（2021/05/28：10:05）
以下のフィードバックを頂き，コードを修正しました．
@shiracamus さん，ありがとうございます．
>`==`などの比較結果は、`True` か `False` かになりますので、そのまま値を返しましょう。

```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]
```

これで，1行での記述ができましたね．

#おわりに
今回の問題は，工夫すれば1行でも記述できるみたいです．

今回書いたコードはGitHubにもあげておきます．

https://github.com/halpi17/LeetCodeStudy/blob/master/003/palindromeNumber.py

[前回](https://qiita.com/halpi/items/09035b5daf6b87bc1a25)　[次回](https://qiita.com/halpi/items/f889b47cace3031dd54c)
[Rust]別のスレッドで構造体のクロージャを動作させる。

空のメモリと交換することでクロージャの所有権を`thread::spawn`へ渡して動作させることが出来るようにする。

元の変数は空の状態になる。

ちなみにクロージャの定義の外で拘束した値は、`'static`である~~必要がある~~`move`をつけることで、所有権を移転出来る。

```rust
use std::thread;
use std::time::Duration;

//
// Option を使った方法
//

mod func {
    use std::thread;

    // 型定義
    // Sendを明示的に指定する。
    pub type FuncType = Option<Box<dyn Fn() -> Result<(), String> + Send>>;

    pub struct Func {
        pub name: String,
        pub funcs: FuncType,
    }

    impl Func {
        pub fn exec(&mut self) {
            println!("func function start.");
            // 空の変数を作る。
            let mut funcs: FuncType = None;
            // ここで後の処理で使えるようにメモリを交換
            std::mem::swap(&mut self.funcs, &mut funcs);
            thread::spawn(|| {
                match funcs {
                    Some(f) => {
                        // Fnなので複数回使える。
                        (f)();
                        (f)();
                        println!("func closure end.");
                    }
                    None => {}
                }
            });
            println!("func function end.");
        }
    }
}


fn func_main() {
    let a: String = "closure out side Variable a".to_string();
    let b: &str = "closure out side Variable b";
    let c: String = "closure out side Variable c".to_string();
    let func: func::FuncType = Some(Box::new(move || { // moveをつけることでaとcの所有権を移転
        println!("func start");
        println!(" --> {}", a);  // 所有権が移転された。
        println!(" --> {}", b);  // 参照のみなので移転しない。
        println!(" --> {}", &c); // 参照を指してもエラー。
        thread::sleep(Duration::from_millis(1000));
        println!("func end");
        Ok(())
    }));
    // println!(" > {}", a); // これはエラーになる。
    println!(" > {}", b); // これは問題ない。
    // println!(" --> {}", &c); // これはエラーになる
    let mut tmp = func::Func { name: "test".to_string(), funcs: func };
    tmp.exec();
}

//
// Vecを使った方法
//

mod funcs {
    use std::thread;

    pub type FuncsType = Vec<Box<dyn Fn() -> Result<(), String> + Send>>;

    pub struct Funcs {
        pub name: String,
        pub funcs: FuncsType,
    }

    impl Funcs {
        pub fn exec(&mut self) {
            println!("funcs function start.");
            // 空のベクトルを作る。
            let mut funcs: FuncsType = vec![];
            // ここでメモリを交換
            std::mem::swap(&mut self.funcs, &mut funcs);
            thread::spawn(|| {
                for f in funcs {
                    (f)();
                    (f)();
                    println!("funcs closure once end.");
                }
                println!("funcs closure end.");
            });
            println!("funcs function end.");
            println!("funcs function length is {}.",self.funcs.len() );
        }
    }
}

fn funcs_main() {
    let func: funcs::FuncsType = vec![Box::new(|| {
        println!("funcs start");
        thread::sleep(Duration::from_millis(1000));
        println!("funcs end");
        Ok(())
    })];
    let mut tmp = funcs::Funcs { name: "test".to_string(), funcs: func };
    tmp.exec();
}

fn main() {
    func_main();
    funcs_main();
    thread::sleep(Duration::from_millis(5000));
}

```
npm install実行時、 ERR! cb() never called!エラー対処

#はじめに
`npm install`時に、以下のエラー文が出たため、エラーとその解決方法を簡潔にまとめました。

```
npm ERR! cb() never called!

npm ERR! This is an error with npm itself. Please report this error at:
npm ERR!     <https://npm.community>

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-05-27T13_35_20_732Z-debug.log

```

#原因
`cb() never called!`を調べてみると、キャッシュの不具合によるものです。
#対処
キャッシュを以下のコマンドで削除すると、インストールできます。
###方法①
```
$ npm cache verify
$ npm install
```

`npm　cache verify`コマンドは、キャッシュを確認し、不要なデータを`ガベージコレクション`し、キャッシュインデックスとすべてのキャッシュデータの整合性を確認する働きがあります。

※「ガベージコレクション」・・・プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能

###方法②

```
$ rm -rf node_modules
$ npm cache clean --force
$ npm cache ls
$ rm -rf ~/.npm
$ npm install

//or
$ npm install --no-bin-links
```

`npmcache verify`がだめだった場合、`npm　cache clean`でうまくいく場合もあります。

また、Windows 環境では、`npm install`に`--no-bin-links`をつけるとよいです。

#参考
[便利なnpmコマンド](https://blog.spacemarket.com/code/npm-command/)
[npm トラブルシューティング]
(https://qiita.com/hatai/items/ba6eadb758a667345b27#error-no71)