OmniAICreator/Qiita-1.07M huggingface dataset:
rspec に css を反映するにはプリコンパイルが必要

テストを書いていて謎のエラー
エラー内容は

```
  1) User 認証機能 ユーザー登録したときに ホームに遷移すること
     Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"

     ActionController::RoutingError:
       No route matches [GET] "/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3.png"
```

こんな感じ
`UTF-8` でデコードして要約すると
`名称未設定のデザイン.png` っていうルーティングがありません
っていう意味。謎

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
rspec でテストを書いている

## 本題

おそらく前回の日記に書いたんだけど

https://qiita.com/TatsuyaIsamu/items/59d91ecb3653ac5384c5

`img` タグがうまくいってないと謎のリクエストが流れるから
`img` タグに不備があるんだろうなって思った。

しかし一通り見直しても不備はない。
そもそも `名称未設定のデザイン.png` なんて名前の画像はない

困った
___

`head` タグの中の

```
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
```

っていうタグをコメントアウトするとエラーが解消されることを発見する。

やはりおかしいのは `css` 

そこで上記のタグのコメントアウトを解除して
`css` を全てコメントアウトしたけれどもエラーは解消されなかった。

ただここで `css` を全てコメントアウトしているのにきちんと css があたっていることに気づく

つまり、`css` が反映されていないことがわかった。

___


```
 rails assets:precompile
```

上記のコードでプリコンパイルしてみる

すると `css` が反映された。


要するに `rspec` で `css` の変化を反映するにはプリコンパイルが必要

今回のエラーは前回 heroku に上げた時点のプリコンパイルの内容と
現在の `css` の内容が違うから起こっていた。

前回の `css` でも問題ないなら問題にならないけど
今回のケースでは背景の画像を前回と変えていて、
img のパスでは現実には画像がないからこのエラーが起こった

しんどかった
img タグの src のパスの頭に / を忘れるとHTTPリクエストが飛ぶ

エラーは起きないんだけどターミナル上で謎のルーティングエラーが出る

[![Image from Gyazo](https://i.gyazo.com/4e0faf910c1d0cb9689115aa2f2ade67.png)](https://gyazo.com/4e0faf910c1d0cb9689115aa2f2ade67)

こんなふうにちゃんとしたリクエストは流れてて
画面遷移した後に謎のリクエストが発生していた


## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`


## なにが悪かったか

これの何が悪かったのかというと

```
img src="signin.png" class="topimg"
```
これ

これは

[![Image from Gyazo](https://i.gyazo.com/7af18686c0d97863694595baab3cd1ab.png)](
://gyazo.com/7af18686c0d97863694595baab3cd1ab)

上の画像の `img` なんだけど
`src` の中のパスの頭に / を忘れていた

/ を忘れてもきちんと画像は表示される

ただその `src` のパスの `HTTP` リクエストが飛ぶという謎の仕様があるみたい
だからルーティングエラーがおこっていた
画面フローでリンクを踏めるようにしてみた

##ご挨拶

皆さんこんにちは！
突然ですが皆さんはフロー活用してますか？
私はフロー大好き人間ですのでSalsforceで何か解決したいことがあると大体フローで作ってしまいます。
しかし、フローを使い倒しているとこの機能があればもっと便利なのになーと思ったことはないでしょうか？
今回は私自身が使っていてそれがあれば、、、！と思った機能を実装してみたのでご紹介させていただきます。

#画面フローでリンクを踏ませたい
画面フローはコーディングの知識がなくてもユーザに対して入力を誘導したり、画面開発ができる便利なツールです。
ユーザに対する誘導をしたいときに結構な割合で発生する要望が、外部リンクへの誘導や作成したレコードへの誘導をしたいというケースです。
しかし、画面フローには表示テキストや数式など様々なリソースがあるにも関わらず、いずれもリンクには対応していません。これはSalesforceの仕様でハイパーリンクが削除されてしまうからです。（https://help.salesforce.com/s/articleView?id=000314433&type=1）
もちろんフローURLをカスタマイズしてフロー完了時に任意の組織内のページに飛ばすことは可能ですが、今回やりたいのはそういうことじゃない。
入力中に外部のヘルプページのリンクを置いておいたり、Calltoタグで電話番号入力せずにソフトフォンで電話かけたいとかそういうことです。
一応上記のSalesforceのHELPにもあるように、Salesforceとしては非推奨の動作のようなので以下自己責任でお願い致します。

##ファイルの中身
前置きはこの辺にしておいて早速実現したい機能の解説をしていきます。
今回はLigtning webコンポーネントで作成してみました。

用意したのは以下のファイルです。

```flowLink.html
<template>
    <div>
    <a href={linkURL} target="_blank" >
        <lightning-button label={linkText} ></lightning-button>
    </a>
    </div>
</template>
```

```flowLink.js
import { LightningElement, api } from "lwc";

export default class FlowLink extends LightningElement {

    @api linkURL;
    @api linkText;

}
```

```flowLink.js-mata.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>48.0</apiVersion>
    <isExposed>true</isExposed>
    <masterLabel>フローでリンク</masterLabel>
    <description>Lightning フローで利用できるリンクコンポーネントです。</description>
    <targets>
        <target>lightning__FlowScreen</target>
    </targets>
    <targetConfigs>
        <targetConfig targets="lightning__FlowScreen">
            <property name="linkURL" label="URL" type="String" role="inputOnly" required="true" default="https://"/>
            <property name="linkText" label="表示テキスト" type="String" role="inputOnly" required="true" default="リンク"/>
        </targetConfig>
    </targetConfigs>
</LightningComponentBundle>
```

私はコーディングできませんので、自社のエンジニアに頼んで作って貰いました笑
格好よく解説などできたらいいのですが、作成したエンジニアに聞いても解説するほどの内容がないと言われたので割愛させていただきます、、、
今はファイルさえ用意してもらえたらデプロイはできるようになりましたが、一昔前の私みたいにデプロイって何ぞやっていう方も居られると思うのでパッケージでも用意させていただきました。
https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5h0000005RqL


これをインストールするとフローの編集画面にフローでリンクコンポーネントが出現すると思います。
![flowlink1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2278110/ef16cdb3-720d-973d-7841-5c39ac093eef.png)

##使ってみる
では早速使ってみたいと思います。
今回は冒頭に例として挙げた以下のケースを解決してみました。

**ケース：外部のヘルプサイトのリンクを表示させる**
取引先の作成を行う画面フローに外部のヘルプサイトを表示して、困ったときに飛んでもらおうと思います。（その場にヘルプテキスト用意しろという意見はブラックホールに吸い込まれました）
![flowlink4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2278110/55676de5-423d-91ea-0dbd-9ea55a6309ff.png)
コンポーネントを配置したら**URL**の項目に外部リンクを入力します（今回は自社のHPのURLとしました）
**表示テキスト**の項目にユーザ側に見せたいテキストを入力したら完了です。
ユーザ側から見たらこんな感じ
![flowlink5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2278110/bfb7b16a-769c-81b3-b4f3-12bb68968ea9.png)

というわけで今回はここまで。
次回はこのコンポーネントを利用したもう少し高度なフローを解説してみようと思います。（次回⇒[画面フローを使ってソフトフォン発信してみた](https://qiita.com/Kataoka_Satoya/items/7641d633ea7a23b87d36)）
弊社では、このようなフローやプロセスビルダーを中心としたローコードでお客様の課題を解決することを目指しています。
既にSalesforceを利用しているが使い切れていない、解決したい課題ある方が居られましたらお気軽にお問合せ下さい。
【XML DOM】XMLファイルのDocumentオブジェクトを取得する関数

# 最初に

当該関数自体はプラットフォームを問わないが、下記の環境を前提に話を進めて行く。

- OS: Windows
- Webサーバ: **[Apache HTTP Server (XAMPP)](https://www.apachefriends.org/jp/)**
- エディタ: **[Visual Studio Code for the Web](https://vscode.dev/)**

# ファイルを作成

1. **[Visual Studio Code for the Web](https://vscode.dev/)**を開く
1. Ctrl+Shift+E で左サイドバーを展開
1. 「Open Folder」ボタンをクリックし、「xampp」フォルダを選択（標準ではCドライブ直下）
1. 「htdocs」フォルダを右クリックし、「New File」をクリックする手順で、次の4つのファイルを作成
  - dict.xml
  - function.js
  - sample.js
  - testing.html

4つのファイルの中身は、次の通り。

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

<!DOCTYPE dict [
    <!ELEMENT dict (item)* >
    <!ELEMENT item (#PCDATA) >
    <!ATTLIST item key ID #REQUIRED >
]>

<dict>
    <item key="項目-01">項目-01の値</item>
    <item key="項目-02">項目-02の値</item>
    <item key="項目-03">項目-03の値</item>
    <item key="項目-04">項目-04の値</item>
    <item key="項目-05">項目-05の値</item>
</dict>

```

```javascript:function.js
// -*- coding: UTF-8; -*-

/*
 * 指定したXMLファイルのDocumentオブジェクトを取得する関数
 */
function getXMLDocument(url) {
    const xmlhttp = (
        window.XMLHttpRequest
        ? new XMLHttpRequest()
        : new ActiveXObject('Microsoft.XMLHTTP')
    );
    xmlhttp.open('GET', url, false);
    xmlhttp.overrideMimeType('text/xml');
    xmlhttp.send();

    return xmlhttp.responseXML;
}

```

```javascript:sample.js
// -*- coding: UTF-8; -*-

// XMLファイル'dict.xml'のDocumentオブジェクトを取得
const xmlDocument = getXMLDocument('dict.xml');

document.write("<h2>項目一覧</h2>");
document.write("<dl>");
const items = Array.from(xmlDocument.getElementsByTagName('item'));
items.forEach(function(item) {
    document.write("<dt>" + item.attributes['key'].nodeValue + "</dt>");
    document.write("<dd>" + item.childNodes[0].nodeValue + "</dd>");
});
document.write("</dl>");

```

```html:testing.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>XMLファイルからデータを取得</title>
    </head>
    <body>
        <!-- getXMLDocument関数を定義したスクリプト -->
        <script type="text/javascript" src="function.js" charset="UTF-8"></script>
        
        <!-- getXMLDocument関数を用いたサンプルスクリプト -->
        <script type="text/javascript" src="sample.js" charset="UTF-8"></script>
    </body>
</html>

```

# Webサーバを起動

1. 「XAMPP Control Panel (XAMPPコントロールパネル)」を開く
1. Apache を「Start」
1. ブラウザを起動し、`http://localhost/testing.html`を開く
square869120-G Revenge of Traveling Salesman Problem 

以下に書く、巡回セールスマン問題の亜種の実装。
[algo-logic の bit DP のページ](https://algo-logic.info/bit-dp/)に再帰の実装があるので、それのループ版をここに書き留める。

##問題概要
各辺に利用期限が課された重み付き無向グラフが与えられたとき、そのグラフ上の巡回セールスマン問題の最短経路長と最短経路数を求めよ。
https://atcoder.jp/contests/s8pc-1/tasks/s8pc_1_g

##実装
```cpp
#define rp(i, n) for (int i = 0; i < n; ++i)
typedef long long ll;
typedef unsigned long long ull;

template <class S, class T>
inline bool chmin(S &a, const T &b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

struct edge {
    ull to;
    ull dist;
    ull time;
    edge() {}
    edge(const ull &to, const ull &d, const ull &time)
        : to(to), dist(d), time(time) {}
};

int main() {
    //--- input
    int n,m;
    cin >> n >> m;
    using graph = vector<vector<edge>>;
    graph g(n);
    rp(i, m) {
        ull u, v, d, t;
        cin >> u >> v >> d >> t;
        // 0-indexed
        --u, --v;
        g[u].emplace_back(v, d, t);
        g[v].emplace_back(u, d, t);
    }
    //--- init bit dp
    const ll setbit = 1 << n;
    // value of dp: {dist, #path}
    using pll = pair<ll, ll>;
    vector<vector<pll>> dp(setbit, vector<pll>(n, {INF, 0}));
    dp[0][0] = {0, 1};
    // --- run bitdp
    for (ll bit = 0; bit < setbit; ++bit) rp(v, n) for (auto e : g.at(v)) {
            // consider traveling v -> u
            // skip if current set does not contain v
            if (bit != 0 && !((1 << v) & bit)) continue;
            const auto cost = e.dist + dp[bit][v].first;
            const auto u    = e.to;
            // first visit of u in time ?
            if (!(bit & (1 << u)) && cost <= e.time) {
                auto &dest = dp[bit | (1 << u)][u];
                if (dest.first == cost) {
                    // add #(new route) to current #path if you find another equally best route
                    dest.second += dp[bit][v].second;
                } else {
                    // set #path = #(new route) if best route updated
                    if (chmin(dest.first, cost))
                        dest.second = dp[bit][v].second;
                }
            }
        }

    //--- show result
    const string fail = "IMPOSSIBLE";
    const auto &res   = dp[setbit - 1][0];
    if (res.second != 0)
        cout << res.first << " " << res.second << endl;
    else
        cout << fail << endl;
}

```
一定の文字数以上を ... にするメソッド

良いメソッドを見つけた

[![Image from Gyazo](https://i.gyazo.com/48790baf519c482f486bc797f4b682b5.png)](https://gyazo.com/48790baf519c482f486bc797f4b682b5)

こんな風にユーザーから受け取った文字数によってはUI が崩れてしまう箇所で

https://qiita.com/ishidamakot/items/2e74d980b3a338e4c784

これを使えば

[![Image from Gyazo](https://i.gyazo.com/6ea818f187f21f68b74969dbfae37334.png)](https://gyazo.com/6ea818f187f21f68b74969dbfae37334)

こうなる
画像のプレビュー機能とドラッグアンドドロップ

[![Image from Gyazo](https://i.gyazo.com/e273a1e767e73bc02153365a55fc2875.png)](https://gyazo.com/e273a1e767e73bc02153365a55fc2875)

こんなかんじの UI の画像フォームをつくった

ドラッグアンドドロップで画像を認識もする

で画像をいれると

[![Image from Gyazo](https://i.gyazo.com/99746e8f31bf17afd2f7e11f36412373.png)](https://gyazo.com/99746e8f31bf17afd2f7e11f36412373)

非同期で変化する

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`jQuery` を導入している
`bootstrap` を導入している
`noimage.png` というファイルが最初の画像

## ドラッグアンドドロップ

以下を参考にした

https://blog1.mammb.com/entry/2019/12/11/090000

CDNサーバーつかえるのでサクッと作れる

## プレビュー機能

以下を参考にした

https://angrooo.hatenablog.com/entry/2020/04/21/144507

コピペ基本的には実装できるんだけど
削除ボタンを押したとき画像が消えちゃうのが気に入らなくてちょっといじった

以下コード

```:view
      = image_tag @user_introduction.image.url, id: 'preview', class: "picture_size" 
      .input-group 
        .custom-file 
          = f.label :image, class: "custom-file-label", value: "Drug & Drop Here"
          = f.file_field :image, class: "custom-file-input", onchange: 'previewImage(preview)', id: "inputFile"
        .input-group-append 
          button.btn.btn-outline-secondary.input-group-text type="button" id="inputFileReset"
            |取消
```


```:js
プレビュー機能

function previewImage(id) {
  const target = this.event.target;     
  const file = target.files[0];      
  const reader = new FileReader();    
  reader.onloadend = function() {      
    preview.src = reaer.result;      
  };
  if (file) {
    reader.readAsDataURL(file);       
  } else {
    preview.src = "";
  }
}

削除機能
document.addEventListener("turbolinks:load", function(){
  document.getElementById('inputFileReset').addEventListener('click', function() {
    var elem = document.getElementById('inputFile');
    elem.value = '';
    elem.dispatchEvent(new Event('change'));
    document.getElementById("preview").src = "/noimage.png"　
  })
})
```
MySQLのコマンド記録

#MySQLコマンド記録

| 　　　　　　　　　　コマンド　　　　     |    　　　 　 動作　　　　　　　　　　　  | 
|:-----------------|------------------:|
|pwd               | 今いるディレクトリを表示する |
| date             | 現在日時を表示する|
| cat [ファイル名]     |指定したファイルの中身を表示する|
| diff  [A] [B]    |ファイルAとファイルBの中身を比較する |
| mkdir[ディレクトリ名] |今いるディレクトリの中で、新しいディレクトリ(フォルダ)を新規作成する |
| touch [ファイル名]  |今いる ディレクトリの中で 、新しいファイルを新規作成する|
| rm　[ファイル名]      |指定したファイルを削除する|
| cp　[A] [B]   | 今いる ディレクトリの中で 、既存のファイルをコピーして新しいファイルを作成する。|
| vim [ファイル名]      |指定したファイルを開く|
| i キー     |インサートモードに切り替え|
| esc キー     |インサートモードから抜ける|
| :q キー     |ファイルを閉じる|
| :q! キー     |保存せず、強制終了|
| :w キー     |ファイルを保存|
| :wq キー     |ファイルを保存し、閉じる|



他にも覚えた方が良いコマンドあったらご教授お願いします。
form.submit と form.button の違いを１つ発見した

## 前提

`rails` でビューを書いている
`bootstrap` を導入している


[![Image from Gyazo](https://i.gyazo.com/d2644224e7c7cbf37fcd2fffdbe87c83.png)](https://gyazo.com/d2644224e7c7cbf37fcd2fffdbe87c83)

こんな感じのフォームがある

これは

```
  .actions
    = form.button "送信する", class: "btn btn-primary"
```

こういうコード

`remote: true` だから `ajax` で更新する形にしてるんだけど

これを


```
  .actions
    = form.submit value: "送信する", class: "btn btn-primary"
```

ってすると更新のタイミングで一瞬登録するっていうボタンに変わる
`ajax` の場合は `button` のほうがいいかもって思った
jQuery DOM に対して forEach は使えない

`jQuery` を使っていて所得した `DOM` に対して繰り返し処理をしたかった

で、以下みたいなコードを書いてみる

```
　 let item_id = $(".edit_worship_stars")
    item_id.forEach((item) => {
```

しかしなぜか動かない
 `debugger` で止めてコンソールで見てみる

ここで `item_id[0]`とか打つとちゃんと出力される


しかし `item.id.forEach` をうつと `undefined` 

なぜ
___

`DOM` に対して `forEach` は使えないらしい
なので `jQuery` 特有のメソッドとして `DOM` に対しては `each()` メソッドを使うらしい

https://api.jquery.com/each/

上を参考にして

```
    let stars = $(".edit_worship_stars")
    stars.each(function(index, item) {
```

としてみる。

すると無事発火
Pega備忘 Logファイル　

#環境
 Pega8.4.0 Personal Edition

#Logファイルの確認方法
　下記の操作からLogが確認できる
　Configure >  System > Operations > logs

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130008/ec7ce1f0-371b-ec08-c151-a89ac9e5ba0d.png)
　[Log files]を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130008/7dac4a96-6581-78fa-1a04-d58383bad95e.png)

#Logファイルの種類
　Pegaは多くのLogがある。
　prlog4j2.xmlに定義したイベント種類に基づいてLogを出力する。
　また。prlog4j2.xmlを編集することでカスタムLogを出力することもできる。
　１．PegaRULES.log
　２．PegaRULES-ALERT.log
　３．PegaRULES-ALERTSECURITY.log
　４．PegaBIX.log
　５．PegaCLUSTER.log

##１．PegaRULES.log
Error,Warning,Infomation,Debgレベルのメッセージが出力される。
Debug時によく参照するLogファイル。

##２．PegaRULES-ALERT.log
パフォーマンス関連の情報が出力されるLogファイル。
「*」を区切り文字にして、Excel形式で表示させると見やすい。
※直接開いても、内容を確認しにくい。

フォーマットは下記リンク記載
https://docs.pega.com/application-development/86/alert-format

##３．PegaRULES-ALERTSECURITY.log
URL改ざんなどのセキュリティに関する問題を検知した際に出力される。
権限不足によるエラーもここに出力されていそう。

##４．PegaBIX.log
Business Intelligence Exchange(BIX)に関するLog。BIXはETLのようなもの。

##５．PegaCLUSTER.log
クラスターの動作に関する情報が記載される。

##参考リンク
https://academy.pega.com/topic/log-files/v2/in/24646
https://pegaks.com/how-to-debugging-and-performance/
https://myknowpega.com/2021/09/17/understand-log4j2-and-create-custom-appender/
https://www.eaglwing.com/post/logs-for-audit-security-in-pega
bootstrap ちょこっと隙間をあけたいときの css 

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
bootstrap を導入している


## 本題

[![Image from Gyazo](https://i.gyazo.com/b074a0b62e7b3c828f13e3bbdb4e7f04.png)](https://gyazo.com/b074a0b62e7b3c828f13e3bbdb4e7f04)

こんかんじのを

[![Image from Gyazo](https://i.gyazo.com/42cee93ded5cad3d572150b8a67c4530.png)](https://gyazo.com/42cee93ded5cad3d572150b8a67c4530)

こんなかんじでちょこっと隙間をあけるためには

```
 .card-header.mb-2.mt-2
```

こうやってそのブロック要素にクラスをつけてやるだけでいい
`mt` が上のマージン `mb` が下のマージン

いままで律儀にセレクターで指定していた自分を殴りたい


https://qiita.com/nakanishi03/items/c80a16b9b9796c25f890

他にもいろいろあるみたいだから積極的につかっていく
geochart 日本地図に色分けしながらマッピング

[![Image from Gyazo](https://i.gyazo.com/af18b42b21b09f01f1364033b3cecab8.png)](https://gyazo.com/af18b42b21b09f01f1364033b3cecab8)

こんなかんじで `DB` と連携して
特定の要素が多いほど日本地図に色濃くマッピングする機能をつくった。

また `gem` の `chartkick` だと世界地図しかフォローしてないので
今回はオリジナルの `js` で書く

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`DB` 内に住所のカラムを持つモデルがある
上記のモデルに `CRUD` 機能があり、その数を集計できるようにしたい


## 手順

① `geochart` を読み込むスクリプトを書く
② `DB` からの情報を加工するロジックを書く
③ `ruby` の変数を `js` にわたす
④ 地図を描画する

基本的に日本語の詳しい記事はないので
ドキュメントですすめる形になる


## 具体的なフロー

①
https://developers.google.com/chart/interactive/docs/gallery/geochart

上記のURLを参考にして読み込むスクリプトを書く

②

以下みたいなロジックを作った


```
    mapping_worship = []
    @user_introduction.user.worship_shintos.map do |shinto|
      a = shinto.address.match(/東京都|北海道|(?:京都|大阪)府|.{3}県/).to_s
      unless a == "北海道"
        a.chop!
      end
      if a[0] == "）"
        a.slice!(0, 1)
      end
      mapping_worship << a
    end

    mapping_count = mapping_worship.group_by(&:itself).map{|key,value| [key,value.count]}
    mapping_count.unshift(["都道府県","回数"])
```
もともと`@user_introduction.user.worship_shintos` ってしたら

```
（〒102-0071）北海道千代田区富士見2-4-1
```

のように、住所の情報が配列で入るんだけど
これだと `geochart` は認識しない

なので上記のロジックを通す

すると

```
 [["都道府県","回数"], ["京都", 8], ["東京", 161], ["広島", 16], ["島根", 5], ["茨城", 4], ["千葉", 1], ["北海道", 2], ["山梨", 4]]
```
てなる。


["都道府県","回数"] は地図を作るのに必要。

それ以外はマッピングするのに使う

あとは県とか都とか府が入ると認識されない。
北海道の道は必要。


③
`gon` っていう `gem` を使う。

https://github.com/gazay/gon

https://qiita.com/kohei_wd/items/dde9fec251351f935fd0

これをいれて

`gon.usermapping = mapping_count`

ってすると `js` のファイルで `gon.usermapping` っていうプロパティが使えるようになる

④

これも公式を参考にして

```
document.addEventListener("turbolinks:load", function(){

  google.charts.load('current', {
      'packages':['geochart']
  });
  google.charts.setOnLoadCallback(drawMap);
  
})

document.addEventListener("turbolinks:load", function(){
  
})


function drawMap() {
  //都道府県単位のデータ
  let map = gon.usermapping
  var data = map;
  var dt = google.visualization.arrayToDataTable(data);
  var options = {
    region: 'JP',  //地域
    displayMode: 'regions', // regions=塗りつぶし, markers=マーカー 
    backgroundColor: '#ebf7fe', //背景色
    resolution: 'provinces',
    colorAxis: {colors: ["#CBDDC3", "#99E6B2", "#7AD2A8", "#5CBE9D", "#3DAA93", "#1F9688", "#00827E"], maxSize: 60 },
    colors:['white','green'], //階層の色
  };
  //出力するDivを指定して chart を生成
  var chart = new google.visualization.GeoChart(document.getElementById('region-div'));
  //描画
  chart.draw(dt, options);
}


google.charts.load('current', {
  'packages':['geochart']
});
google.charts.setOnLoadCallback(drawMap);
```

とした

自分の環境は `document.addEventListener("turbolinks:load", function(){`　で
ラッピングしないと `turbolink` が邪魔して `jQuery` が動かないのでこうしている

`gon.mapping` で変数をセットしてそれをデータとして渡している。

細かい色とかスケールの色とかは調整した
form_with を使いながら bootstrap のボタンの中に fontawesome と文字を入れる

[![Image from Gyazo](https://i.gyazo.com/91c3b22f02459928ba55dfe6d5bc6a3a.png)](https://gyazo.com/91c3b22f02459928ba55dfe6d5bc6a3a)

上の画像の右のボタンの中に

[![Image from Gyazo](https://i.gyazo.com/696fa7fc7db66720fdc32d8361bdfa61.png)](https://gyazo.com/696fa7fc7db66720fdc32d8361bdfa61)

こうやってアイコンを入れる試み


左のメッセージは `link_to` のタグを使っているので簡単にアイコンを入れられるんだけど
右のフォローするのボタンは `form_with`  をつかっているのでどうしても入れられなかった


## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
fontawesome を導入している



ちなみに左のボタンのコードは以下

```
  = link_to conversations_path(sender_id: current_user.id, recipient_id: user.id), method: :post, class: "btn btn-outline-primary" do 
    i.fab.fa-facebook-messenger
    | メッセージ
```
これは上記のコードで簡単にアイコンをいれられる

___

https://teratail.com/questions/7942

これを参考にした

そもそもなんで今回のケースでメッセージにアイコンをいれられるのかというと
メッセージのボタンは `do` で囲ってブロックの中に入れちゃってるから

対して `form_with` の `submit` でコンパイルされるフォームは `input` タグになる
だから `do` でブロックを取れない

なので `submit` ではなく `button_p にコンパイルするといける

これがどういうことかというと具体的なコードは以下

```
span id = "follow_form_#{user.id}"
  - unless current_user.following?(user)
    = form_with(model: current_user.active_relationships.build(followed_id: user.id), class: "follow_form") do |f|
      = f.hidden_field :followed_id
      = f.button class: "btn btn-outline-primary" do 
        i.far.fa-handshake
        |フォローをする
  - else 
    = form_with(model: current_user.active_relationships.find_by(followed_id: user.id), method: :delete, class: "follow_form") do |f|
      = f.button class: "btn btn-outline-primary" do 
        i.fas.fa-handshake-slash
        |フォローを解除
```

こうやって `f.button` ってするとブロックをとることができるみたい
バリデーションで Fontawesome が巨大化

[![Image from Gyazo](https://i.gyazo.com/36a185541b98e476e1db33f33078de7b.png)](https://gyazo.com/36a185541b98e476e1db33f33078de7b)

こんなふうににカレンダーの `Fontawesome` をフォームタグにいれる

これがバリデーションにひっかかると

[![Image from Gyazo](https://i.gyazo.com/98c7c46601fc898a1057f53aa1f1e01a.png)](https://gyazo.com/98c7c46601fc898a1057f53aa1f1e01a)

でっか

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`
`font-awesome-sass` 
## 本題


エラー時を検証ツールでみてみると
[![Image from Gyazo](https://i.gyazo.com/90bc3f0496df3f74c1a297115f576b05.png)](https://gyazo.com/90bc3f0496df3f74c1a297115f576b05)

`Form` タグのクラスが `fields_with_errors` になっている

https://yukimasablog.com/rails-field-with-errors


 `rails` がデフォルトでよくわからんことやってくれてるみたい
なので上の記事のように

```
.field_with_errors {
  display: contents;
}
```

っていうのを指定してやるとうまくいった
正規表現　後方参照をするメソッド

[![Image from Gyazo](https://i.gyazo.com/49b2a2288c7a33a01ed7a373d432fead.png)](https://gyazo.com/49b2a2288c7a33a01ed7a373d432fead)

こんなかんじで住所の部分に郵便番号が入るんだけど
[![Image from Gyazo](https://i.gyazo.com/31ee10b9782996acd66c9c6155208e6f.png)](https://gyazo.com/31ee10b9782996acd66c9c6155208e6f)

こんなかんじにしたかった。

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 本題


正規表現の後方参照をするメソッドが使える

https://rubytips86.hatenablog.com/entry/2014/03/28/132953

これを参考にして

```
li.list-group-item = worship.shinto.address.match(/）/).post_match
```

こんなふうに `post_match`　メソッドを使うと
）の後の文字が切り取れる
算用数字を漢数字にするメソッド

英数字を漢数字に変換するメソッドの自作

例えば `2021年9月11日` にこのメソッドを使うと
`ニ〇ニ一年九月一一日` になる

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 本題

ヘルパーメソッド内に

```
  def convert_kansuji(text)
    text.tr('0123456789', '〇一二三四五六七八九')
  end
```

こんなふうに定義してやる

`View` の中で

```
convert_kansuji(@worship.worship_day.strftime("%Y年%m月%d日"))
```

こんなふうにしてやると変換される
【AWSセキュリティ基礎】AWS Config

# AWS Configとは
AWSリソースやオンプレミスサーバの設定変更管理、変更履歴のモニタリングを行うためのサービス。
以下のようなことが実現できる。

   - Configルールと呼ばれる、事前に定義した「あるべき設定」と実際の設定との乖離を評価すること
   - 変更の発生時にCloudWatch Eventsをトリガしたり、SNSを用いてメール通知すること
   - 変更履歴の記録をコンプライアンス監査やセキュリティ分析用の資料として利用すること

## Configルール
AWSアカウント内の各設定がルールに準拠しているかどうかチェックするために定義するもの。
以下のようなルールが設定できる。

- EBSが暗号化されているか
- CloudTrailが有効化されているか
- S3バケットのポリシーが”パブリック読み書き可能”になっていないか
- セキュリティグループで22番ポート（SSH）がパブリック公開されていないか
- 指定したタグがリソースに設定されているか
- 指定されたAMIが使用されているか

など（上記は一例）

### マネージドルールとカスタムルール
Configルールには以下の2種類がある。

- **マネージドルール**：AWS側で予め用意されており、すぐに実装可能なルール。
- **カスタムルール**：Lambda関数を使用して自由にカスタムできるルール。

マネージドルールは現時点でも100個以上あり、基本的なセキュリティチェックを行いたい場合は、まずマネージドルールから検討すると良い。
カスタムルールは自由度が高い反面、Lambda関数内でチェックロジックを作成する必要があるため、実装するには手間がかかってしまう。

## 実際のユースケース
### Configを使用した非準拠リソースの自動修復

例えば、"CloudTrailを有効化する"というルールを定義しているにもかかわらず、オペレーションミスによりCloudTrailが無効化されてしまった場合、以下の手順で自動修復が可能。

1.Configの管理画面にアクセス
2.自動修復を行いたいConfigルールをクリック
3.「修復の管理」から「AWS-EnableCloudTrail」を選択
4.自動修復「はい」のラジオボタンを選択
5.「保存」をクリック
6.アクションステータスが「アクションが正常に実行されました」となったことを確認

![キャプチャ_1112.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494752/870623df-97fb-28b3-8d6d-ae34857c62d8.png)

※詳しい手順は以下に記載
[AWS Config Rules による非準拠 AWS リソースの修復](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/remediation.html)

### 高度なクエリ
AWSアカウント内の設定情報に対してSQLを実行し、情報を確認することが可能。
例えば以下のクエリを「Configの高度なクエリ」から実行すると、インスタンスタイプ別のEC2の数を確認することができる。

```
SELECT configuration.instanceType, COUNT(*)
WHERE resourceType='AWS::EC2::Instance'
GROUP BY configuration.instanceType
```

※使用できるクエリの例は以下にも記載あり
[クエリ例](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/example-query.html)

# 参考文献

https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4839970947#
VSCodeでFortran拡張機能を使うときに警告を無視する設定を追加する方法

# 概要
最近Visual Studio Codeをエディタとして使ってFortranを書いています。[この記事][1]などを参考に設定を済ませ、概ね快適に書けるようになりました。記事の内容通りModern FortranとFORTRAN IntelliSenseの拡張機能を使用しています。
ところが、

```fortran
i = 21/2
```

などと書いた際、

```
Integer division truncated to constant '10' at (1) [-Winteger-division]
```

のように警告が出ます。要するに整数除算の警告ですが、C言語などでもおなじみの仕様であり、このとき書いていたパラメータ設定に使うという明確な用途の上でいちいち警告として残ると煩わしいと感じました。
というわけで、この警告に限り拡張機能の上で無視してもらう設定を行います。

# 環境
* macOS Big Sur 11.6
* GNU Fortran (Homebrew GCC 11.2.0) 11.2.0
* VSCode：1.62.2
* Modern Fortran v2.3.0

# 結論
`settings.json`に

```json
"fortran.linterExtraArgs": [
    "-Wall",
    "-Wno-integer-division"
]
```

を追加します。

# 仕組み
Modern Fortranは、Featuresに

> Code linting based on gfortran to show errors wiggles in your code

とあるように、gfortranの機能でLintingを行います。これにユーザー設定を加えられるようにするため、`fortran.linterExtraArgs`という設定項目があります。

> If you want to pass extra options to the gfortran executable or override the default one, you can use the setting fortran.linterExtraArgs. By default -Wall is the only option.

とあるように、引数をリスト形式で与えれば実行時にそれが追加されます。
デフォルトで指定されている`-Wall`はWarning allで、すべてのあり得る項目に警告を出します。つまりこれによってLintingを実行できています。
これに対し、`-Wno-[warning-name]`を指定すると、`warning-name`の警告は出なくなります（[参考][2]）。先程の整数除算の警告は

```
Integer division truncated to constant '10' at (1) [-Winteger-division]
```

だったので、`-Wno-integer-division`を引数に指定し、警告を無視しているというわけです。

応用すれば好きな警告を無視できますが、むやみに設定すると警告の意味がないので程々にすべきだと思われます。

# 参考文献
* [How to avoid integer division warning? - Stack Overflow][2]

[1]:https://qiita.com/implicit_none/items/d49c9fdf51c307d22819
[2]:https://stackoverflow.com/questions/45895020/how-to-avoid-integer-division-warning
お寿司の(データ)セットを作ってみた話

##はじめに

筆者はふと思った。
「お寿司が食べたい🍣！」

別の日、こうも思った。
「何かpythonでやれたらいいな～:grinning:　何かいいネタないかな」

…よし、この2つをくっつけてお寿司のデータセットを作ったらいいじゃないか？と思ったのがきっかけ。

**~~お寿司だしちょうどネタ被りでいいんじゃね？って感じで~~**
**そんな短絡的なことではなく、ちゃんと分かりやすくて勉強になると思ってもちろんやってますよ。…はい。**

##画像集め
ペイント機能を使ってひたすら書いていきました。
沢山作るのはしんどいので、「鮪・鯛・蛸・鯵・鮭」の5種類で実施(計500枚)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/59fc3b1f-076d-60e2-793f-954acfcf0e59.png)
ペイントでひたすら書き書き。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/9847020e-fa8e-309b-350e-f560fe384880.png)
これをずっと見ていると頭が混乱してきそう。
何とか500枚作成したので、次はデータセットの作成に移る。

##データセットの作成
```python
#zipファイルの解凍(colab上のため)
!unzip 500.zip

#モジュールインポート
from natsort import natsorted
import matplotlib.pyplot as plt
import cv2
import glob
import numpy as np

train_set = []

#画像を読み込んでリスト化
files = glob.glob('/content/*.png') 
for i in natsorted(files):
    img_array = cv2.imread(i,cv2.IMREAD_GRAYSCALE)
    img_array = cv2.resize(img_array, (28,28)) 
    train_set.append(img_array)

# numpy配列に変換
train = np.array(train_set)

#バイナリファイルで保存
np.save('/content/oshusi_xtrain', train)

```
多次元配列になるためcsvでは保存できない。そのためバイナリ形式(.npy)で保存することにした。
作成したファイルを読み込んで、正しく画像が保管されているか確認する。

```python
#npyファイルの読み込み
img = np.load('/content/oshusi_xtrain.npy')

#画像を表示
from PIL import Image
pil_img = Image.fromarray(img[0]) #最初のだけ確認
plt.imshow(pil_img,cmap='gray') #グレースケールで表示
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/7b4e2d62-59a6-32db-3791-de9ee80700e4.png)

ちゃんと画像を呼び出せたので、データセットはできていそう。

##まとめ
やりきったので何かすがすがしい気分。
実際に作ったデータセットで何かできたらいいなあ。
どこかでGitにもアップできればと思う。

(2021年11月15日)
下記にデータセット(画像とラベル)をアップしました。
ファイル作ってから気づいたけど「oshusi」になってた。違っていたけど何かかわいいからこのままにしておく。
https://github.com/dem-kk/File/tree/main/oshusi


##参考
https://intellectual-curiosity.tokyo/2019/07/02/%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9/
https://office54.net/python/module/sort-file-natsorted
https://numpy.org/doc/stable/reference/generated/numpy.load.html
【HTML】<label>や<span>の幅固定【CSS】

よーしspanの幅固定するぞー
確かwidth使えば幅は固定できたはず...

```html
<span style="width: 100px">こんにちは</span>
```

簡単簡単、さあ表示するぞ！

![スクリーンショット 2021-11-11 23.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406868/19c573ff-46d3-ed80-cf69-210d73892344.png)

横幅80しか無い？？？？？？？？？？？
ちゃんとelement.styleにも100pxって書いてあるのに？？？
もう私CSSなんて嫌い！！！

#というわけで
\<span\>や\<label\>にwidth・hight効かないよねって話です。

#なんで効かないの？
それはCSSのプロパティの1つである**display**が関わってきます。
displayについて詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/display)をどうぞ。
以下に今回関係するものを3つ簡単に説明します。

| 値 | 説明 |
|:-|:-|
| block  | 要素前後で改行(p,divなど) |
| inline  | 改行しない・**<font color="Red">幅と高さが指定できない</font>**(span,labelなど) |
| inline-block  | 改行しない・**<font color="Red">幅と高さが指定できる</font>** |

もちろん注目すべきは**<font color="Red">赤文字</font>**の部分です。
spanやlabelは初期設定がinlineのためwidthが効かなくて当然なのです。
かといってdivと同じようにblockにすれば改行が行われてしまいます。
そこで**inline-block**さんの出番です。
なんとinlineの改行しないという特性を持ちつつ、幅と高さが指定できるようになります。
これぞ求めていたものですね。

#書いてみよう
一番最初に使ったhtmlを変更します。

```html
<span style="width: 100px; display: inline-block">こんにちは</span>
```

これでspanがinline-blockになってくれます。
早速表示させて見ましょう。

![スクリーンショット 2021-11-12 0.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406868/81ea4460-d1fc-d630-fab4-f5d62a435f11.png)

ちゃんと幅が100pxになって右に余白ができています。
これで無事\<label\>や\<span\>の幅固定をする事ができました。

#最後に
display:inline-blockにしてあげるだけで解決できる実は簡単な問題でした。
他にもblockにしてから無理やり移動させたりなど色々方法はあります。

最後まで読んでくださった方ありがとうございました。
駄文失礼いたしました。

間違っている箇所などあればガンガンご指摘いただけると幸いです。

---------------------------------
**twitter始めてみました！**
よければフォローお願いします！！！
https://twitter.com/pagos380402
ダウンロードフォルダのショートカットをタスクバーにピン止めする。[作用効率UP]

#ダウンロードフォルダをタスクバーにピン止めできるようにする。

- 右クリックで新規作成からショートカットを作成
- ダウンロードフォルダのパスを参照する。
- 先頭にexplorerを追記する。（下図）
- 任意の名前をしてする。
- アイコンを適当に変更する
- タスクバーにドラッグ&ドロップできるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527627/880181b4-7af7-4b82-601f-c8a717352fae.png)

以上
土日だけゲーム起動できるようにするスクリプト作った

# はじめに
「このままじゃ俺の人生駄目になる」
2021年11月初旬。私はそう感じた。

在宅勤務のエンジニアであるはずの私は、いつの間にかSkyrimの世界を救う伝説のDragonbornになっていた。
皆まで言うまい・・・。私は意志の弱い人間なのだ。

## vbsでゲームを起動できるようにする
まずは、vbsでゲームを起動できるようにする。

次のようなvbsファイルを作成して実行してみよう。

```Vb:game.vbs
    Option Explicit

    Dim objWshShell
    Dim dayName
    'シェルオブジェクトの作成
    Set objWshShell = WScript.CreateObject("WScript.Shell")
    objWshShell.Run "ゲームの実行ファイルのパス"
    'シェルオブジェクトの解放
    Set objWshShell = Nothing
```

パスの指定が間違っていなければゲームが起動したはずである。

## 曜日による制限を実装する
次に曜日による制限を実装する。
こちらはCase文で実現する。具体的には次のコードである。

```Vb:game.vbs
Option Explicit

Dim objWshShell
Dim dayName
'シェルオブジェクトの作成
Set objWshShell = WScript.CreateObject("WScript.Shell")

    '曜日名を取得する
    dayName = Weekday(Now)
    '曜日によって処理を変える
    Select Case dayName
    ' 1: 日, 2: 月, 3: 火, 4: 水, 5: 木, 6: 金, 7: 土
        ' 土日だけ
        Case 7, 1
            objWshShell.Run "ゲームの実行ファイルのパス"
        Case Else
            MsgBox "Do your work!!!"
    End Select

'シェルオブジェクトの解放
Set objWshShell = Nothing
```

月曜日が1ではないので注意。カレンダーを思い浮かべると納得できる。
土日以外実行すると、「Do your work!!!」と怒られるようになっている。

## ゲームとスクリプトを結びつける
スタートメニューからゲームを起動する際に参照されるショートカットの参照先を変更していく。

そもそも、スタートメニューは通常下記のフォルダに格納されているショートカットが表示されているに過ぎない。
`C:\Users\{ユーザ名}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs`

例えば、Steamに関しては下記のフォルダにまとめられている
`C:\Users\{ユーザ名}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Steam`
ここに登録されているショートカットがゲームの実行ファイルに紐付いている。

対象のショートカットを右クリック > プロパティ とすすみ、
「リンク先」の項目を作成したスクリプトをのパスに変更する。

試しに、スタートメニューからゲームを起動しようとすると「仕事しろ！」と怒られる。

# むすび
これで、平日の日中は仕事に集中できる。
深夜に半泣きで実装しなくて済むのだ。

余談ですが、Skyrim発売から10年だそうです。
20歳のときからやってること変わってないんだな。成長しない男だ。
SSL認証とは何でしょうか？

閲覧ありがとうございます
調べたことを書いてまとめています。
誤り等がございましたら、ご指摘いただければ大変助かります。
この記事の結論
https://www.ntt-bp.net/column/blog/2021/04/post-27.html

１，SSL認証って？
２，SSL認証って何のために取るの？
３，SSL認証って無料のやつじゃダメ？
・その他　疑問など。

#１，SSL認証って？
　ざっくりいうと暗号化して通信しますよっていう証明。
　安全である証明ではない。
　HTTPSのSの所
　
#２，SSL認証って何のためにとるの？
　通信を暗号化して第三者から情報を保護する為
　ホームページを見るためには
　スマホ⇒wifiの機器など⇒サーバー（ホームページを提供している場所）という形でアクセスする。
　Wi-Fiは通信情報を監視できるのでそこからログイン情報を抜くこともできる。それを出来ないように文字化けさせるのがSSL認証
　でもhttpsは必ずしも安全ではないとか。

#３，SSL認証って無料のやつじゃダメ？
　暴論ですが、使う側からしたらSSL認証出来ていれば関係ない。
　無料だとちょい手間、有料だと手間が減るという差はあるが、安全性は変わらない。

#安全に使いたいんだけど。
今回調べて以下の３つのことが言えるとわかりました。
・VPNだろうが何だろうがフィッシングサイトにアクセスしたら終わり。
　メールやショートメッセージなど、「URLリンクは信用しない、ログインしない。」
　（フィッシング用の偽urlからログイン⇒そのまま公式にログイン）
・VPNを使えば野良wifiでも安全な場合があるけどえっちなホームページ見てたらバレちゃう。
・ログインや個人情報を通信するときはURLの「SSL認証した人が誰か」を確認する。
こういったことに気を付けるしかないと思いました。

#残る疑問
　スマホ側で暗号化した情報をサーバー側で解除する。
　スマホとサーバーの間で共有している（？）認証キーが割れることってないの？
　どうやって共有しているの？

#参考にさせていただいたHP（一部）
https://isabou.net/knowhow/colum-it/colum11.asp
https://www.hitachi-solutions-create.co.jp/column/security/vpn-safety.html
https://www.itmanage.co.jp/column/about-vpn/

筆者の知識：
・インターネットは7階建てのビルを一階から7階までスタンプラリーしているらしい。中身は知らない。
・httpsで検証押すとリクエストのレスポンスのナントカが文字化けした気がする。
・パケットが変なところに飛ぶことがあるらしい。
・ギガが足りない
【やってみた】VPCエンドポイント

## VPCエンドポイント -ゲートウェイエンドポイント-
インターネットを介さずにVPC内のリソースとS3,DynamoDB間をセキュアに接続できる。
これにより、NATゲートウェイを配置しなくてもプライベートサブネットからS3,DynamoDBへ接続ができる。

参考：[VPCエンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints.html)

## この記事でやること
プライベートサブネットからVPCエンドポイントを介してS3に接続します。
![スクリーンショット 2021-11-12 20.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/0aaa2f96-f45f-99ca-ad67-bd648de38bf0.png)

## 前提条件
以下環境を作成済みとします。
![スクリーンショット 2021-11-12 20.42.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/86ff710d-d415-f952-64cc-a4adb97ab8f1.png)

S3バケットの中には【folder-a】というフォルダを作成しておきます。
![1ばけっとの中のフォルダ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/af23a81f-c45f-0fdf-0588-0acd8518f63d.png)


## 大まかな手順
1.EC2に権限付与
2.VPCエンドポイント作成

## やってみた

###1.EC2に権限付与
**IAMポリシー作成**
EC2(Server-B)がS3にアクセスするため、IAMポリシーを作成します。
今回はリスト(一覧表示)アクションと対象となるS３バケットを指定します。
![2iampolicy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/73734ec1-7a12-087c-2e93-43d44c42c687.png)

**IAMロール作成**
IAMロール作成し、先ほど作成したポリシーをアタッチします。
次にEC2コンソールから、EC2(Server-B)にアタッチします。

### 2.VPCエンドポイント作成
VPCコンソールで、【エンドポイントの作成】をクリックします。
![4エンドポイント作成①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/4a15c0b0-7ab1-29e9-9553-ff0dc4947be3.png)

エンドポイント作成画面が表示されるので上から順に、
①検索バーに【S3】を入力
②タイプがゲートウェイのエンドポイントを選択
③使用するVPCを選択
④S3に接続するEC2が配置されたサブネット(Subnet-B)を選択
最後にエンドポイントの作成ボタンをクリックします。
![5エンドポイント作成画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/bfc56539-94a2-4112-d6ae-fa9432287c90.png)

作成したVPCエンドポイントのステータスがアクティブになっていることを確認します。
![6スクリーンショット 2021-11-12 21.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/f6f8bd20-df0e-1ea8-c7db-b88f91c06edf.png)

Server-Bが配置されているサブネット(Subnet-B)のルートテーブルに、VPCエンドポイントへのルートが追加されていることを確認します。
エンドポイント作成時にサブネットを選択することで自動的に追加されます。
![7ServerB rt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/c9534af7-95d0-15c2-3db7-a45241528f27.png)

## 疎通確認
接続元のEC2(Server-B)にssh接続します。
疎通確認前に、aws configureコマンドを実行し、リージョンを指定します。
リージョンのみ指定し、他はENTERでOKです。
![8aws configure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/27fc5494-20fd-1204-4f55-30d5b1213a25.png)

次に疎通確認を行います。
![9aws s3 ls 成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500026/3313e22f-b27e-d54b-3840-8fd29c628ff4.png)

S3バケットの中身が確認できましたので、接続できています。
NATゲートウェイを使用しなくても　プライベートサブネットからS3へ接続できることが確認できました！

## 感想
AWSのドキュメントや試験の参考書を見ても、うーん。。という感じですが実際に作成すると簡単でした。
セキュリティ、コスト最適化の観点からも便利な機能だと思いました。
【新人の子から学ぶエラーメッセージ】pythonネタ(001)

## はじめに

みなさま。こんにちは。
会社で新入社員の子に技術教育を行っているのだけど、時々おやっ？と思うことがあります。
決してバカにするものではなく、こんな仕様知らなかった！と教えていて初めて教わることがあるので、そんな記事を投稿していきたいと思います。


## エラーコード

一行ネタ。

```python:bs4.py
from bs4 import BeautifulSoup
```

```
Traceback (most recent call last):
  File "bs4.py", line 1, in <module>
    from bs4 import BeautifulSoup
  File "C:\test\bs4.py", line 1, in <module>
    from bs4 import BeautifulSoup
ImportError: cannot import name 'BeautifulSoup' from partially initialized module 'bs4' (most likely due to a circular import) (C:\test\bs4.py)
```

## pipでbs4をインストールして！インストール済みです！

pipは初めてpython触ったとき、python2から3への過渡期だったり、XPから7への乗り換え時期だったりしたので、苦労したので、warningが出ていても無視していたパターンだと思って、とにかく「beautiful soup」が上手くインストールされていないみたいだから、pip listコマンドを送ってみて！と指示。

ん？確かにインストールされている。

## 原因はファイル名

よくよく見ると、「bs4.py」というファイル名ではないですか・・・
当人いわく、bs4の勉強をしているから、それをファイル名に付けたとのこと。

ふむ。私も実機を見るまで原因に気づかなかった。

確かにfrom bs4 import BeautifulSoupと自分自信からBeautifulSoupを読み込もうとしているからエラーが出ますよね・・・

このエラーは所見だったので、新たな発見ですね。

## さいごに

pythonを勉強したばかりの頃は、pythonファイルをSJISで保存し、日本語文字を扱えない！と騒いでいた時期が私にもあったので、こういう経験はどんどん積んでほしいものですね。

参考書のコードの通り打ったのに実行するとエラーが出る！というのは、やっぱり経験しないと得られないものですし
GitHub Packagesを作ってGitHub Actionsでワークフロー管理してみた（GitHub Packages編）

# はじめに
CI・CDでいい感じに開発するためにGitHub Packagesを導入してみました！

## 参考文献
[GitHub Packagesのクイックスタート](https://docs.github.com/ja/packages/quickstart)

## package.jsonを作成する

```json:package.json
{
  "name": "@xxx/test",
  "version": "1.0.0",
  "repository": {
    "type": "git",
    "url": "https://github.com/xxx/test.git",
    "directory": "GitHub-Packages-sample"
  }
}
```

## npm installを実行する

```bash
npm install
```

## 簡単な処理を書いたjsファイルを用意する
```js:index.js
console.log("hello world!!!!!!!!!");
console.log("hello world!!!!!!!!!");
console.log("hello world!!!!!!!!!");
```

## 個人アクセストークンでの認証用の.npmrcファイルを作成する
https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-npm-registry

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

```text:.npmrc
//npm.pkg.github.com/:_authToken=GitHubの認証トークン作成方法で作成したトークン]
registry=https://npm.pkg.github.com/リポジトリ名
```

## 差分のファイル一式をコミット・プッシュする
```bash
git add .
git commit -m "feat:initialCommit"
```

## GitHub Packagesで公開する

```bash
npm publish
```

## 完成
![スクリーンショット 2021-11-12 21.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/20e86bac-f273-7985-6df9-ccbbbf0c148d.png)

## 最後に
超簡単な機能でしたけど、パッケージにすることで「バックエンド・フロントエンドの型をパッケージで共有する」みたいなことができます（実際にお仕事でやってて使い勝手が良すぎたので書いてみました）
次回はGitHub Actionsで色々自動化してみます!
【Vue.js】セレクトボックス　単体・複数の選択

#はじめに
こんにちは！
今回は【Vue.js】セレクトボックス　単体・複数の選択についてアウトプットしていきます！


#書き方・解説
今回はセレクトボックス内に様々な色を入れ単体・複数表示させるやり方を解説していきます。

##単体の場合

```HTML:HTML
  <select v-model="selected">
<!--⏫セレクトボックス-->
    <option disabled value="">Please select one</option>
　　　　<!--⏫初期状態に表示される選択肢-->
    <option>Red</option>
    <option>Green</option>
    <option>Blue</option>
   <!--⏫選択肢-->
  </select>
  <p>
  {{ selected }}
  </p>
```
```Vue.js
   data: {
     selected: ''
   }
```

選択中の値を管理するプロパティ`selected`を用意し、初期値は`''`にする。

<テンプレート側>
まずセレクトボックスを用意します。セレクトボックスと`selected`を双方向データバインディングします。
次に選択肢を用意します。（`option`）それぞれ表示させたい色`Red`、`Green`、`Blue`を`option`内に記述します。`{{ selected }}`も記述しておき選択されたものが表座されるようにしておきます。

![スクリーンショット 2021-10-29 5.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/61a41e1a-309f-f1e5-7f7a-2ae830b8924b.png)



以上のようにプログラムし、テキストボックスから`Red`を選択すると、
![スクリーンショット 2021-10-29 5.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/3188f655-1ef8-5657-45fe-067b95b48735.png)

`Red`が表示されます。

##複数の場合

```HTML:HTML
                           <!--⏬複数選択を可能にさせる-->
  <select v-model="selected" multiple>
                          <!--⏫shiftキー＋クリックで複数選択可能--><!--クリック長押しでも複数選択可能-->
    <option disabled value="">Please select one</option>
    <option>Red</option>
    <option>Green</option>
    <option>Blue</option>
  </select>
  <p>
  {{ selected }}
  </p>
```
```Vue.js
   data: {
     selected: []
            　//⏫空の配列
   }
```
基本単体と記述法は一緒になります。
違う点は以下のようになります。
[Vue.js側]
・`selected:''`だったところが、複数の選択をさせるようになるので`selected:[]`になります。

[テンプレート側]
・複数選択を可能にさせるために、`select`タグの中に属性`multiple`を記述する。
これにより、
　・shiftキー＋クリックで複数選択可能
　・クリック長押しでも複数選択可能
になりました。

初期状態が以下のようになり、
![スクリーンショット 2021-10-29 6.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/797132fc-c134-5dca-0a9e-805231c1e83f.png)

選択状態が以下のようになります。
![スクリーンショット 2021-10-29 6.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/7004faef-89b9-8aa0-f0ca-ef9d35538f4f.png)


#まとめ
・記述法はほぼ一緒。
・違う点は、
　①プロパティが`''`ではなく`[]`
　②`select`タグ内に属性`multiple`を追加


#最後に
今回はセレクトボックス　単体・複数の選択についてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
【AI】ノーコードで機械学習ができるツールを使ってみた

## 概要
Neural Network Console(NNC)とはGUIを使って`ノーコード`での機械学習を可能にしたツールです。
元々機械学習はプログラミング的な要素が薄いので、いいものが出てきたなーという感じ。
中身でPythonが動いてるみたいですね。
誰でも簡単に試せるように、ここに使い方を残しておきます。

## 事前準備

以下の３点を用意する必要があります。

- 学習データ
- 検証データ
- 学習データと検証データの保管場所

ここで言う学習データと検証データとは、**入力データ**と**正解データ**のペアの塊のことです。
正解データは**教師データ**や**正解ラベル**とも言われますね。
手書き数字画像データであるMNISTを例にすると、以下を指します。

- 入力データ：手書き数字が書かれた画像
- 正解データ：正解の数字（厳密には0~9を示す要素10の配列のうち、正解の要素を１、他を０にした配列）
 
また、保管場所については、各データのパス、または正解を以下のような形式でCSVファイルに保存します。
保管場所は学習データと検証データのそれぞれに必要です。
MNISTのサンプルCSVファイルはこのような形になっていました。

```terminal
x:image,y:9
./validation/4/4.png,0
./validation/4/6.png,0
./validation/9/7.png,1
./validation/9/9.png,1
...
```

事前準備データは、サンプルを見ながらどうなってるかを理解すると早いと思います。


## 実装

### 1. モデル作成

ここがノーコードユーザが最も苦労するところになります。
左上の「**編集**」タブから作成可能です。
モデルの作成方法については、今回は割愛します。
ドラッグアンドドロップで構造を指定できて使いやすいです。


### 2. データ登録

右上の「**データセット**」タブから編集可能です。
事前準備で作成した学習データと検証データのCSVファイルを登録します。
正常に登録できたら、以下のように画像やラベルが表示されます。



### 3. 設定確認

右上の「**コンフィグ**」タブから編集可能です。
色々ありますが、基本的に確認すべきところは、「**Global Config**」にある**学習反復世代数**と**バッチサイズ**だと思います。
学習反復世代数はエポック数にあたるものです。
最適化などもコンフィグから変更可能です。

### 4. 学習

「**編集**」タブ→右上の「**実行**」ボタンから、学習データを使って実際に学習していきます。
モデル形状やGPU/CPUで処理時間が変わってきます。
グラフに損失などの結果が徐々に出力されていくので、じっと待ってあげてください。
学習が終了したら、グラフが完成します。


### 5. 検証（評価）

学習が終了したら、「**学習**」タブ→右上の「**実行**」ボタンから、検証データを使って評価していきます。
「**評価**」タブから出力結果を確認できます。
[こちら](https://qiita.com/atchicken/items/b5c29e17d9b6f9228a1f)のデータを使って実行した結果が以下の図になります。
モデルが大したことないので精度はイマイチですが、ちゃんとできてますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/d2a0d5a6-3206-442e-a049-3c13415be4be.png)



## まとめ

ノーコードで機械学習ができる**NNC**の使い方を紹介しました。
学習以降は簡単にできるのですごく良いと思いました。
ただ、学習データを作ったりをノーコードでできるのかが少し疑問。
Asciidoctor + pandoc で asciidoc を PDF に変換する

asciidoc を最近始めたのですが、asciidoctor-pdf の PDF 出力がかっこ悪いので、 pandoc で対応している lualatex で PDF にすることにしました。
pandoc は asciidoc 入力に対応していないので、

1. asciidoctor で asciidoc から docbook に変換する
2. pandoc (lualatex) で docbook から pdf に変換する

という流れです。

## インストール
当方 Windows 10 です。

### asciidoctor
Ruby はインストールされているとします。

```sh
$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]
$ gem -v
3.1.6
```

gem でインストールします。

```sh
$ gem install asciidoctor
Successfully installed asciidoctor-2.0.16
Parsing documentation for asciidoctor-2.0.16
Done installing documentation for asciidoctor after 2 seconds
1 gem installed
```

### pandoc
chocolatey でインストールします。

```powershell
> cinst /y pandoc
```

### TeX Live
chocolatey でインストールしたあと、パッケージをインストールします。

```powershell
> cinst /y texlive
```

TeX Live Manager を起動し、`scheme-medium` と `collection-langjapanese` をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1188794/003b9eb4-b4e6-f9b9-3d97-3a3024998916.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1188794/91426ffb-dc80-e463-a41d-375ed070d71a.png)

## コンパイル
Makefile を作ります。

```make:Makefile
all: test.pdf
.SUFFIXES: .adoc .pdf

.adoc.pdf:
	asciidoctor -b docbook5 -o - $^ | pandoc -s -f docbook --pdf-engine=lualatex -V documentclass=ltjsarticle -o $@
```

Asciidoc ファイルの例です。

```test.adoc
= Asciidoc のテスト
:author: みたゆうき

== はじめに
これはテスト文書です。
```

```sh
$ make
asciidoctor -b docbook5 -o - test.adoc | pandoc -s -f docbook --pdf-engine=lualatex -V documentclass=ltjsarticle -o test.pdf
```

出力結果です。如何にも TeX っぽい PDF になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1188794/2b320ff7-db32-62d5-6554-777c8fee5944.png)
ブックマークレット設定

検証用

```
javascript: (function () {
  var array = [
  
    /* ①URL設定 */
    ['自分のbacklog URL', '自分のIPアドレス:MAMPポート番号'],
    ['自分のbacklog URL', '自分のIPアドレス:MAMPポート番号'],
    // ここから下は自由

    /* ②URL設定 */
    ['[自分のbacklog URL]', '自分のIPアドレス:ポート番号'],
    ['自分のbacklog URL', '自分のIPアドレス:ポート番号'],
    // ここから下は
  ];
  var url = document.location.href;
  for (var i = 0; i < array.length; i++) {
    if (url.match(array[i][0])) {
      window.open(url.replace(array[i][0], array[i][1]), '_self');
      break;
    } else if (url.match(array[i][1])) {
      window.open(url.replace(array[i][1], array[i][0]), '_self');
      break;
    }
  }
})();
```
「Qiitaのユーザー名に3桁数字を使うときの注意」とその後

##（追記）Qiita側での修正リリース完了
こんにちは。元 @500 です。

Qiitaのご担当者様から、当該ユーザー名を取得出来ないようにする修正リリースを11月19日に行ったと連絡を頂きました。
同時に、ユーザー名の変更依頼を受けましたので、 別のユーザー名に変更し今に至ります。

この記事をご覧になった方からいろいろな意見が来ていましたので、11月12日時点の記事内容に加筆をして以下に残します。
<hr>![qiita.com_500_items_e9afcdd7374c9eaeb472.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275142/9a8da8e8-2aef-11d4-c0b4-857f10f65e2e.png)

##その出会いは偶然に……
###なぜか空いていた「短いユーザー名」
これまで備忘録はiCloudのメモに書いて同期していたのですが、今さらQiitaに記事を書こうと先ほどアカウントを作成しました。

私は特に共通のハンドルネームみたいなのもなく、各種サービス登録時には超適当にユーザーIDやユーザー名を決めるタイプです。

Qiitaでは3文字以上とあったので、適当にユーザー名`500`と打ってみたら、意外にも一発でアカウント登録完了。

が、簡単な3文字ユーザー名が空いていた理由はきっと……

###マイページ 「申し訳ありません、ただ今障害が発生しております。」
![申し訳ありません、ただ今障害が発生しております (500)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275142/d1d5a7b6-0687-6b14-55b5-6f4234c7fb28.png)
あー。

そうきたか。はじめ、マイページのリンクを踏んでもなぜかサーバーエラーになるなと不思議に思っていたのですが、これはそういうことですよね。

##一部のHTTPステータスコードと重複する3桁はやめといた方が無難

400　https://qiita.com/400

https://qiita.com/400

403　https://qiita.com/403

https://qiita.com/403

404　https://qiita.com/404

https://qiita.com/404

500　https://qiita.com/500

https://qiita.com/500

502　https://qiita.com/502

https://qiita.com/502

503　https://qiita.com/503

https://qiita.com/503

　※ `500`以外は試してないので、登録時に弾かれるのかは不明
　※ 上記の名前のユーザーが既にいるのかどうかも不明
　※ 数字以外もありそうだけど試してないので不明
<hr>私の書いた他の記事、見つけられないね！

:::note info
自分のマイページなんてなくていいよ！という人以外はやめときましょう
:::

<br><br>そして、みなさんもシステム作るときには気を付けましょう。
<hr>
##この記事リリース後の反応

Qiitaでのコメントだけでなく、はてなブックマーク（90件あまり）やTwitter（300件あまり）でもいろいろな意見が投稿されていました。

https://b.hatena.ne.jp/entry/s/qiita.com/500/items/e9afcdd7374c9eaeb472

コメントで来ていた考え方としては概ね以下の3パターンに分けられました。

1. 特定の語はユーザー名として取得できないようにすべき
+ qiita.com/user/{username}やqiita.com/@{username}のようにすべき
+ このままで問題ない

Qiitaの考えとしては1だったのでしょうが、何かの拍子にリストから抜け落ちてしまったのでしょう。今回の修正リリースでもこの方式で修正されたとみられます。
一方で1に対しては、将来的なサービス拡張の妨げとなる事があるので、拡張性を考えると賢いとは言えない、または網羅すべき語を慎重に決定してからサービスをリリースしなければならない、という意見もありました。

安全を考慮すると2の考え方になるため、コメントは2を支持する方も多く見られました。一方で、Qiitaはユーザー投稿がメインなので、無駄なオーバーヘッドになることや美しさが損なわれることを考慮し、2を避けたいという意見もありました。

そして3は致命的なバグではないので設計段階から検討はされていたがあえて対応をしなかったという説。Twitterの http://twitter.com/home さんのように、他サービスでは同じような考え方があるようです。（https://twitter.com/home/with_replies もご覧になってみてください）

皆さんがURL設計する場合はどうするでしょう。
そのドメインで将来的に何がしたいか、というところ次第かもしれませんね。

##おまけ
https://twitter.com/aventador_770_4/status/1460850186897567756
docker-compose で  laravel の "could not find driver" に対処する

#経緯
Docker-compose　で php nginx db それぞれのコンテナを立ち上げている状態で laravel を clone したが、アクセスすると "could not find driver" のエラーが出た。
ちなみに php のコンテナに使っている image は php:8.0.8-fpm である。

#原因
php に pdo_mysql がインストールされていなかった。
ただ、単純にアプリケーションサーバーにインストールしようとしても、パッケージをインストールできないため、 Dockerfile に下記の記述を追加する必要がある。

```
FROM php:8.0.8-fpm
RUN docker-php-ext-install pdo_mysql
```

また、併せて　docker-compose.yml も編集。

```
image: php:8.0.8-fpm
```

と記述されていた部分を

```
build: .
```

全て変更し終えたらエラーは出なくなるはずだ。
私の場合次に mysql refused のエラーが出てしまったが、またそれは別の記事にでも書くとする。
基本的なリダイレクトの設定

複数のケースを想定してリダイレクトを書く場合があったので、メモです。

* 下記はよくみるリダイレクト処理です。
* PHPに例えると、`RewriteEngine` は処理の開始宣言、`RewriteCond` は条件文、`RewriteRule` はそこで実行する処理になります。
* `^`はURL正規化の開始フラグです。

```
RewriteEngine On
RewriteCond %{http_host} ^www.example.com
RewriteRule ^(.*) https://www.yahoo.co.jp/$1 [R,L]
```

* 上記のままだと `www` が付いた場合しか考慮できない可能性があるため、 `RewriteCond` を複数行にします。
* RewriteCondに `[OR]` をつけることでいずれか1つに一致した場合は、 `RewriteRule` にある処理を実行することになります。
* 表示には出ませんが、複数ある `RewriteCond` に何も書かない場合は `[AND]` として処理され、すべてのRewriteCondが一致した場合にRewriteRule の行にある処理が実行されます

```
RewriteEngine On
RewriteCond %{http_host} ^www.example.com [OR]
RewriteCond %{http_host} ^example.com
RewriteRule ^(.*) https://www.yahoo.co.jp/$1 [R,L]
```

* さらに `R=301` とすると恒久的なリダイレクトになります。用途は、サイト移転時などに使います。
* `R=302` とすると、一時的なリダイレクトになり、 用途は同一ドメインのPCやSPサイト間でのリダイレクトやメンテナンス時などに使います。
* 301と302の大きな違いは、Webサイトのインデックス（検索結果に表示される情報）がリダイレクト前のサイトかリダイレクト先のサイトかです
* 301がリダイレクト先、302はリダイレクト元のページ情報(インデックス)を検索エンジンのクローラに渡します。

|  ステータスコード  |意味|  インデックス&nbsp;&nbsp; | ページランク |用途|
| ------ | ------ | ------ | -------- | ------ |
|  301  | 恒久的 |リダイレクト元   |引き継がれる *1| メンテナンス、同一ドメインで各サイトに振り分けたい時など |
|  302  | 一時的 |リダイレクト先   |引き継がれる *1| サイト移転時など|

```
RewriteEngine On
RewriteCond %{http_host} ^www.example.com [OR]
RewriteCond %{http_host} ^example.com
RewriteRule ^(.*) https://www.yahoo.co.jp/$1 [R=301,L]

↓
RewriteRule ^(.*) https://www.yahoo.co.jp/$1 [R=302,L]
```

### 備考
*1  [URL の変更を伴うサイト移転に関するよくある質問](https://developers.google.com/search/docs/advanced/crawling/site-move-with-url-changes?hl=ja%EF%BC%89&visit_id=637723156423817859-3268900011&rd=1#faqs-all-moves)