OmniAICreator/Qiita-1.07M huggingface dataset:
NoMethodErrorを解決した話　（Railsチュートリアル ）

Qiita初投稿です。宜しくお願いします。
今回は、NoMethodErrorの解決にかなりの時間を費やしてしまったので、紹介していこうと思います。

**エラー文**
=
```
NoMethodError (undefined method `log_in' for ~~~~~)
```

**原因**
=
ApplicationコントローラにSessionヘルパーモジュールを読み込む際に、
helloメソッドに書き込んでしまっていたので、正常に動作していなかった。

正）

```application_controller.rb

class ApplicationController < ActionController::Base
  include SessionsHelper
end
```

誤）

```application_controller.rb

class ApplicationController < ActionController::Base

  def hello
    include SessionsHelper
  end
end
```

**解決するまでの過程**
=
エラーを見る限り、メソッドがないということなのでlog_inメソッドが定義されているかを確認した。

```sessions_helper.rb
module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end
end

```

log_inメソッドは定義されていることを確認してから、よく分からなくなってしまい、詰まってしまった。その後は、そもそもメソッドとは何か？を**Ruby on Rails ガイド**で調べることに。

> Railsのコントローラは、ApplicationControllerを継承したRubyのクラスであり、他の>クラスと同様のメソッドが使えます。アプリケーションがブラウザからのリクエストを受け取ると、ル>ーティングによってコントローラとアクションが指名され、Railsはそれに応じてコントローラのイ>ンスタンスを生成し、アクション名と同じ名前のメソッドを実行します。

振り返りつつ、チュートリアルに沿ってもう一度確認していると、何故かSessionヘルパーモジュールがhelloメソッドの中にあるのに気がついた。

**感想**
=
エラーを出すと、どうしても視野が狭くなってしまい、普段気付けることに気付きにくくなってしまう。今回のことを生かして、次からは、少し離れたところから見るつもりで、冷静に対処していきたい。
MRTKをiOSで動かす方法

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">iOSでMRTK動いた！<a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://twitter.com/hashtag/iOS?src=hash&amp;ref_src=twsrc%5Etfw">#iOS</a> <a href="https://t.co/micHL1zp6y">pic.twitter.com/micHL1zp6y</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1407622319749558272?ref_src=twsrc%5Etfw">June 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考
https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/CrossPlatform/UsingARFoundation.html#install-required-packages

## 開発環境
+ Unity 2019.4.11f1
+ iPhone 12 Pro
+ MacBook Air
+ Windows 10 
+ Mixed Reality ToolKit v2.5.3
+ Xcode

## やり方

### プロジェクトの作成
[GitHub](https://github.com/microsoft/MixedRealityToolkit-Unity/releases)からMRTKのUnityPackageをダウンロード
UnityHubから新しいプロジェクトを作成
Window > Package Manager から下記パッケージをインポート

+ AR Foundation v2.1.8
+ ARKit XR Plugin v2.1.9

File > Build Settings プラットフォームをiOSに切り替え
Edit > Project Settings > TextMeshProをインポート

### カメラ設定の変更
HandInteraction Examples シーンを開く
Hierarchy > MixedRealityToolkit のインスペクターからProfileを変更

+ DefaultHoloLens2ConfigurationProfileをClone
+ CameraタブからDefaultHoloLens2CameraProfileをClone
+ Camera Settings providers > Add Camera Settings provider をクリック
+ New data provider1 > Type を UnityAR > UnityARCameraSettingsに変更

### プロジェクト設定を変更
Mixed Reality Toolkit > Utilities > UnityAR > Update Scripting Defines をクリック
Mixed Reality Toolkit > Utilities > Configle Unity Project > Applyをクリック
Edit > Project Settings > Player > iOS > Other Settings > Strip Engine Code のチェックを外す
### ビルド＆デプロイ
#### Unity
File > BuildSettings > iOSでビルド

#### Xcode
ビルドしたフォルダ内のUnity-iPhone.xcodeprojをXcodeで開く
Unity-iPhoneを選択しプロジェクトの設定を表示
General > Deployment Info で iOS11.0を選択
Signing & Capabilities > Signing Teamを選択
デバイスを選択
![スクリーンショット 2021-06-22 20.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/29919678-63de-195e-5e8f-94a68736f8f6.png)
▶をクリックしてデプロイ

※ MapFilePerser.sh: Permission deniedが発生した時の対処法
ターミナルを開く
下記コマンドを実行

```
chmod 777 MapFilePerser.sh
```
Ruby 問題14 特定の文字列を検知する include?メソッド

#問題

以下の要件を満たすcheck_nameメソッドを実装して下さい。

* 名前を入力すると「登録が完了！」という文字列を出力すること
* 名前の中にピリオド(.)がある場合は、「 "記号は登録できません"」という文字列を出力すること 
* 名前の中に空白（全角のみ）がある場合は、「 "全角空白は登録できません"」という文字列を出力すること

```.rb
def check_name(str) 
  # 処理
end

puts "登録したい名前を入力してください(例)SuzukiTaro"
str = gets
check_name(str) 
```

#ヒント

**include?メソッド**
include?メソッドは、指定した値が配列や文字列内に含まれているかを判定するメソッドです。指定した値が含まれている場合はtrueを、含まれていない場合はfalseを返り値として返します。

[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/include=3f.html)

#解答

```.rb
def check_name(str) 
  if str.include?(".")
    puts "記号は登録できません"
  elsif str.include?(" ")
    puts "全角空白は登録できません"
  else
    puts "登録が完了しました"
  end
end

puts "登録したい名前を入力してください(例)SuzukiTaro"
str = gets
check_name(str) 

```

check_name(str) の引数に自身が入力した名前が渡されます。

ピリオド(.)や全角スペースがあった場合はエラー文を出し、正しく記入されていれば登録できましたと出るような記述をしたいので**ifで条件分岐**を記述します。

```.rb
def check_name(str) 
  if #条件式
    puts "記号は登録できません"
  elsif #条件式
    puts "全角空白は登録できません"
  else #条件式
    puts "登録が完了しました"
  end
end
```

条件が当てはまった時点で処理が終了するので先にエラーが出る場合の条件式を記述します。

* ピリオド(.)がある場合

```.rb
 if str.include?(".")
    puts "記号は登録できません"
```

言葉で表すとピリオドがあった文章はtrueなので**記号は登録できません**と返ってきます。
ピリオドがなかったら*elseif*の条件式へ移ります.

* 空白（全角のみ）がある場合

```.rb
elsif str.include?(" ")
    puts "全角空白は登録できません"
```

全角空白があった文章はtrueなので**全角空白は登録できません**と出力されます。
ピリオドも空白全角もなかったら全てを通り抜けて**登録が完了しました**返ってきます。

ちなみに半角であれば登録はできます。
[Ruby]paizaのスキルチェックD　文字の一致


https://paiza.jp/works/mondai/skillcheck_sample/diff_str


文字の一致 (paizaランク D 相当)に挑戦しました。
今回は簡単だと思ったのですが、問題文を見落としていたため、少し苦戦しました。

”入力値最終行の末尾に改行が１つ入ります。”これを見落としており、
chompの記載が抜けておりました。

正解したコードは以下の通りです。


```
a = gets.chomp
b = gets.chomp

if a==b
    puts"OK"
else 
    puts"NG"
end

```

模範解答コードでは、if文ではなく、下記のようにコンパクトに記述していました。

```
puts a == b ? 'OK' : 'NG'

```


練習問題は終わりなので、実際にスキルチェック問題に挑戦したいと思います。
nginx 1.19 から nginx 1.21 にupdate

# はじめに

nginx1.21が出ていたのでupdate
[nginx\.org/en/CHANGES](http://nginx.org/en/CHANGES)

## LOG

### Update

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=0

# nginx -v
nginx version: nginx/1.19.10

# yum update --enablerepo=nginx nginx
... 略

依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ nginx.x86_64 1:1.19.10-1.el7.ngx を 更新
---> パッケージ nginx.x86_64 1:1.21.0-1.el7.ngx を アップデート
--> 依存性解決を終了しました。

依存性を解決しました

==============================================================================================================
 Package               アーキテクチャー       バージョン                          リポジトリー           容量
==============================================================================================================
更新します:
 nginx                 x86_64                 1:1.21.0-1.el7.ngx                  nginx                 790 k

トランザクションの要約
==============================================================================================================
更新  1 パッケージ
... 略

# nginx -v
nginx version: nginx/1.21.0
```
WindowにおけるMecabのコマンドプロンプトについて。

##問題点

コマンドプロンプトでMeCabを実行すると...。

![SS_2021-6-23_17-48-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/95d1db8b-e9a2-795f-440f-5af99745bd6d.png)

まあ、文字化けします。

対策としてはコマンドプロンプトの文字コードを変更するとかありますが、いちいちやるのがめんどくさい。

#対応策

以下の mecab_cmd.py と mecab_cmd.bat を作成します。

```python:mecab_cmd.py
import MeCab
tagger = MeCab.Tagger()

def CMD():
    while True:
        sentence = input("> ")
        parsed_items = tagger.parse(sentence).split("\n")[:-2]
        for parse_item in parsed_items:
            token, positions = parse_item.split("\t")
            print(token + "\t" + "".join(positions))

if __name__=="__main__":
    CMD()
```

```bat:mecab_cmd.py
python mecab_cmd.py
```

あとは、このBatchファイルのショートカットを作るだけ。

実行すると、

![SS_2021-6-23_17-55-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/9f408c11-65ee-925d-e267-c1c231e914c0.png)


以上！
Fontawesomeを導入したら文字化けしていた

Fontawesomeの導入は多分これが一番わかりやすい。

https://qiita.com/koki_73/items/fa6d31a3b54a84d19dcf

ローカルサーバーを立ち上げて、確認したら文字化けしていたので、なんでだろうと思ったら、読み込みの順番が悪かったみたい。

```app/assets/stylesheets/application.scss
*= require_tree .
 *= require_self
 */
@import "bootstrap";
@import "font-awesome";
@import "font-awesome-sprockets";
```

こうしてたんですけど、正しくは

```app/assets/stylesheets/application.scss
*= require_tree .
 *= require_self
 */
@import "bootstrap";
@import "font-awesome-sprockets";
@import "font-awesome";
```

こっちじゃないといけない。
Swift でシステムサウンド再生モジュールを作る

## はじめに

カメラアプリを作っていると、システムサウンドを鳴らしたいときが来ます

録画開始終了時のピコンとポロンを鳴らしたいのです

先駆者様のおかげで実装できたので、モジュール化したものを記載しておきます

先駆者様

https://qiita.com/hideji2/items/e7ed482ccffef2c0f66c

https://qiita.com/_mkt_/items/a4359b9f13ba7e7c9c50

## SystemSound を enum にしておく

`1117` とかいう数字を使用時に丸出しにしたくないので、使う SystemSoundID を Enum にしておく

```swift
import AVFoundation

enum SystemSound: UInt32 {
    case beginVideoRecording = 1117
    case endVideoRecording = 1118

    var systemSoundID: SystemSoundID {
        self.rawValue as SystemSoundID
    }
}
```

システムサウンドの一覧はこちら

https://iphonedev.wiki/index.php/AudioServices

どんな音か聞いて確かめたいときは、こちらのアプリが非常に便利です

https://apps.apple.com/jp/app/play-system-sounds/id1498349041

## SystemSoundPlayer を作る

あちこちで使えるように `.play` で再生できる Player を作っておきます

```swift
import AVFoundation
import Foundation

public class SystemSoundPlayer {
    func play(systemSoundID: UInt32) {
        var soundIdRing: SystemSoundID = systemSoundID
        if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil) {
            AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)
            AudioServicesPlaySystemSound(soundIdRing)
        }
    }

    func play(systemSound: SystemSound) {
        self.play(systemSoundID: systemSound.systemSoundID)
    }
}
```

## SystemSoundPlayer を使う

SystemSound を enum にしておいたおかけで、使用時には XCode が補完してくれる

```swift
let systemSoundPlayer = SystemSoundPlayer()
systemSoundPlayer.play(systemSound: .beginVideoRecording)
```

## まとめ

これで簡単に、それっぽくシステムサウンドが再生できます
UnrealEngine用に作ったのツール類まとめ

## UE_LOGの挙動をプロジェクトごとに変えづらいので作ったロガープラグイン

https://github.com/yKimisaki/DILoggerPlugin

## 毎度お作法に応じたUCLASS書くの面倒なので一発で吐いてくれる.exe

https://github.com/yKimisaki/UE4SourceGenerator

## ガベコレ対策.exe

https://qiita.com/yKimisaki/items/c2bc36b91434c7d46765
「too much work for irq4」カーネルメッセージについて

「*kernel: serial8250: too much work for irq4*」というカーネルのエラーDは、情報メッセージで対処の必要はありません。

**Microsoft Azure**と他のクラウドプラットフォームのVMで発生することがありますが、実際にシリアルコンソールポート（*ttyS0*）に問題があるとのことではありません。

RHEL7の場合、このメッセージは**kernel-3.10.0-1160.el7**以降ではもう表示されていません。

詳細は次のコミットをご参照ください。

- [serial: 8250: drop the printk from serial8250_interrupt](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.8.y&id=9d7c249a1ef9bf0d5696df14e6bc067004f16979)

以上です。
Windows Docker Desktopでkubectlコマンドが動かない

以前chocolateryでminikubeを入れていたのが原因っぽい。

PowerShellから以下コマンドを実行するとエラーが返ってくる。

```
> kubectl get pod
Unable to connect to the server: dial tcp 127.0.0.1:62912: connectex: No connection could be made because the target machine actively refused it.
```


以下コマンドで設定を見てみると、minikubeがデフォルトになっていたので

```
> kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop   docker-desktop   docker-desktop
*         minikube         minikube         minikube         default
```

以下を実行して問題解決。

```
> kubectl config use-context docker-desktop
Switched to context "docker-desktop".
> kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop   docker-desktop   docker-desktop
          minikube         minikube         minikube         default
> kubectl get pod
No resources found in default namespace.
```
Git Cheat Sheet

それほど頻繁には使わないから覚えていないことが多いけどいちいち検索するのが面倒なgit操作の個人用まとめ。思いつき次第随時追加していきます。

## Merge Dry Run
Conflictの確認をする時に便利。

```sh
$ git merge --no-commit --no-ff <branch>
$ git merge --abort
```

## Rename Branch
`<old>` を省略すると現在のブランチがリネームされる。

```sh
$ git branch -m [<old>] <new>
```

## Unset Upstream Branch
Upstreamを解除する。

```sh
$ git branch --unset-upstream
```
WPF ComboBox

WPF ComboBoxのSelectionChangedイベントってSelectedIndexプロパティを指定してるとロード時にも選択が変更されたって表示されやがる（よく考えたら当然ではありますが）仕様みたいでWindowがロードされた時にも発火しちゃうのよね。
ユーザが明示的にコンボボックスを変更した時だけ発火させたかったのでいろいろ調べたらDropDownClosedイベントってのがあって、これだとマウス操作で意図的に項目変更しないと発火しないのでロード時の無駄発火が無くなったのは良いんだけど、キーボード操作でタブ移動して上下キーで選択項目切り替えても発火しないのが玉に瑕。まあこれは諦めることにしました（´・ω・｀）
【React-Native】アプリ内にメッセージを表示する

> 私は日本就職を目指して、勉強している韓国人大学生です。
> もし、内容の中で間違った表現や言葉などがあれば、書き込みをしてください。

## 【React-Native】の目次
1. [RNのインストール](https://qiita.com/JeongJaeSoon/items/dcc15830015a22cb1e1e)
2. [プロジェクトを作成](https://qiita.com/JeongJaeSoon/items/9c470cb6068126844a3c)
3. [アプリ内メッセージを表示する](https://qiita.com/JeongJaeSoon/items/64d94d4ed8f7c5183125)
4. [タッチイベント、ボタン、スクロール](https://qiita.com/JeongJaeSoon/items/032ef2afe5e3ce6cda0b)

## 基本設定
1. プロジェクトを作成

    ```bash
    $ react-native init react_native_basic
    $ cd react_native_basic
    $ npm start
    $ react-native run-ios
    ```

2. `App.js`を簡単に修正して、Class形で基本コンポーネントを作る

    ```JSX
    import React, {Component} from 'react';

    class App extends Component {
        render() {
            return ();
        }
    }

    export default App;
    ```

## `<View>`, `<Text>`で、画面を作る

1. アプリ内にメッセージを表示するため必要な`<View>`と`<Text>`を`react-native`からインポート

    ```JSX
    import React, {Component} from 'react';
    import {View, Text} from 'react-native';
    ```

2. コンポーネントの始めと終わりは`<View>`が必要、文字は`<Text>`の中に → **Hello World!**を表示

    ```JSX
    class App extends Component {
        render() {
            return (
                <View>
                    <Text>Hello World!</Text>
                </View>
            );
        }
    }
    ```

## `<StyleSheet>`で、スタイルを追加

- インラインスタイルで、スタイル追加可能
 
    ```JSX
    class App extends Component {
        render() {
            return (
                <View
                    style={{
                        backgroundColor: 'green',
                        height: '100%',
                        paddingTop: 50,
                    }}
                >
                    <Text>Hello World!</Text>
                </View>
            );
        }
    }
    ```

- `<StyleSheet>`を活用すると、簡単にスタイルを適用できる
    1. `<StyleSheet>`を`react-native`からインポート

        ```JSX
        import {View, Text, StyleSheet} from 'react-native';
        ```
    2. 変数にスタイルを作成

        ```JSX
        const styles = StyleSheet.create({
            mainView: {
                flex: 1,
                backgroundColor: 'green',
                paddingTop: 50,
                alignItems: 'center',
                justifyContent: 'center',
            },
        }
        ```
    3. 作成したスタイルを`<View>`に適用
 
        ```JSX
        class App extends Component {
            render() {
                return (
                    <View style={styles.mainView}>
                        <Text>Hello World!</Text>
                    </View>
                );
            }
        }
        ```
GitHubランキング

GitHub勉強するのに参考にした記事

#第1位
https://qiita.com/b150005/items/508009234bf9813b230f

#第2位
https://qiita.com/Kai_82/items/c9eb45fa8f40fbd2f149

#第3位
https://qiita.com/nenohi/items/9afbc15033580d10d6d7

いつもわかりやすい記事ありがとうございます。
初心者向けExcel関数と便利技


Excel初心者向けにExcel関数や便利技を書き留める

# 1.Excel関数
## 1-1.文字列操作
### 1-1-1.VLOOKUP


### 1-1-2.HLOOKUP


## 1-2.検索
### 1-2-1.VLOOKUP関数


### 1-2-2.HLOOKUP関数


## 1-3.論理
### 1-3-1.単純比較「=」
セルに入力されている値が同じかを単純比較したい場合、IF関数ではなく、「=」を使用する。
```= 比較元セル = 比較先セル```
結果はTRUE（一致） / FALSE（不一致） で表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680265/9441aebe-6546-4bc4-1b63-c392a5731c28.png)


# 2.便利技
## 2-1.PHONETIC関数でふりがなが表示されないとき
PHONETIC関数を使用すると、以下のように、ふりがなが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680265/c267096c-c006-4b82-5ac1-84bb5e6e3ae3.png)

しかし、直接Excelに入力した文字以外（例えば、テキストエディタからコピーした文字など）は以下のように正しく表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680265/a573709c-fb46-36df-ea78-b58049bb9d7e.png)

そんなときは、[ホーム]→[<font color="Red">ふりがながの編集</font>]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680265/3c4cb601-49b6-c6fb-e2c2-2d6824261e7f.png)

いままでふりがなが表示されていなかった文字が表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680265/91459b30-93ef-3e0f-c659-3e8f3a8db840.png)
DockerでビルドしたPJをECS上にデプロイするまで【導入】

既存のPJをdocker化の上、ECSとCodepipelineを使ってビルド、デプロイまで自動化しました。
その作業の備忘録として何個か記事に分けてまとめます。

1. 導入 <=ｲﾏｺｺ
2. [PJのDocker化](https://qiita.com/Ohtak/items/d05b864c1bd8f10df3bb)
3. [イメージをECS上で動かす](https://qiita.com/Ohtak/items/ad9218214890a779156b)
4. [CodePipelineを使った自動デプロイ](https://qiita.com/Ohtak/items/ab78dc4431ae2e8d1b6b)

#全体の作業の概要
ゴールは下記二点

- docker化したPJをCodepipelineを通じて本番にデプロイできること
- さらにそこにアクセスできること

大きく分けて下記のフローで行いました。

1. ローカルで既存PJをdockerビルドできるようにする
    1. dockerをインストール
    1. PJをクローン
    1. dockerファイルを作成
    1. 動作確認
2. そのPJをECS上で動かす
    2. ECRを作成してローカルで作ったイメージをプッシュ
    2. ECS作成
    2. アクセス確認
3. CodePipelineを使ったデプロイ自動化構築
    3. Codepipeline作成
    3. ビルドプロジェクト作成
4. 動作確認

#Dockerとは
一応今回の主役みたいなものなので概要を紹介
正確な情報は[公式ドキュメント](https://docs.docker.com/)まで
[日本語版](http://docs.docker.jp/index.html)もあります。

>Docker とは開発者やシステム管理者が、コンテナでアプリケーションを **構築（build）、実行（run）、共有（share）**するためのプラットフォームです。

（日本語版ドキュメントより引用）

要するに、クソ面倒くさい環境構築を簡単に行うための仕組み。
これを実現するために、「コンテナ」と「イメージ」を使用する。

- イメージ：ビルドしたソースコードをまとめたもの。
- コンテナ：プロセスが走るサーバーのようなもの。この中にイメージを置いている。

で、これらを作るために下記のステップが必要。

1. dockerをインストール
1. ソースコードを用意
1. dockerファイルを作成

それぞれの詳しいやり方はまた別の記事にまとめます。

##メリットとデメリット
あくまで所感ですが。

###メリット

- 環境構築にかかる作業コストが限りなく少なくなる。
    - 一度dockerファイルを作ってしまえば、あとはそれを誰かに渡すだけで環境構築が終了する。
    - 基本的にローカルで動作するので、作業者が増えた時の個人環境の作成も簡単。
- 仮想マシン（VM）に比べ軽い

###デメリット

- だいぶ複雑なことをしてるため、理解と初めの構築に時間がかかる。
- EC2とは違いsshアクセスなどは基本できないため、ログの収集などをするには専用の設定が必要
    - ローカルに限ってはログインコマンドがあるためこのデメリットはないが、普通のPJであればどこかのサーバー上にあげるので結局大変にはなる。

##dockerを採用した経緯
とあるPJのOSが古くなってきたので、丸ごと置き換えることになったとこからスタート。

- 元々AWSで運用していたので、CodePipelineとかを挟めばデプロイまで自動化できる
- 更新頻度がそれなりに多いため、初期構築コストよりその後の運用面でのメリットがでかい。
- 単純にdockerに関するドキュメントや記事が多い。

ということでdocker化することになりました。
社内に経験者も多くいたので不明点を聞けるっていうのも大きかったです。
メジャーな技術はこういうのがいいですよね。

#デプロイの仕組み
ローカルから変更をプッシュすると、それが本番環境に自動反映される形で組みます。
下記大まかな流れ

1. あらかじめECSにアクセスできるようにしておく
1. 変更をプッシュするとCodePipelineが実行され、イメージがECRにプッシュされる。
1. ECRにプッシュされた最新版のイメージでビルドが実行される
1. ビルド完了後、ECSで動いているコードが更新される
1. これで反映完了

##ECRとは
https://aws.amazon.com/jp/ecr/

AWSのサービスで、dockerイメージを置くリポジトリのようなもの。

##ECSとは
https://aws.amazon.com/jp/ecs/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc&ecs-blogs.sort-by=item.additionalFields.createdDate&ecs-blogs.sort-order=desc

dockerコンテナを動かすための環境。

##CodePipelineとは
https://aws.amazon.com/jp/codepipeline/

PJをビルド、リリースまでの挙動をカスタマイズできる
正規表現 基本まとめシート

正規表現を使う際、調べながら取り組みますが、毎回複数ページを行き来してしまうため、今後すぐ取り出せるようリストアップしました。

#### 環境
- Ruby
    - scanメソッドの引数に正規表現を使用して検索が可能
    - gsubメソッドの第一引数に変換前、第二引数に変換後の文字列または正規表現を用いることで置換が可能
- [Rubular](https://rubular.com/)

### メタ文字

- `\d` : 1個の半角数字
    - = [0-9]
- `\w` : 1個の半角英数字とアンダースコア
    - = [a-zA-Z0-9_]
- `\t` : タブ文字
- `\n` : 改行文字
- `\s` : 空白文字全般
    - 言語・環境によって含まれる文字が異なるので注意
        - Ruby : [ \t\r\n\f]（半角スペース、タブ文字、復帰文字、改行文字、改ページ）
- `\ ` : エスケープ文字
    - `\\t` : タブ文字ではなく、「\t」という文字列を意味する

- `{n,m}` : 直前の文字がn個以上、m個以下
- `{n}` : 直前の文字がちょうどn文字

- `[ABC..]` : AまたはBまたはCまたは...のいずれか1文字
    - ハイフンを対象にする際は、下の例のように文字の範囲の記号と扱われないよう、[]内の始めか終わりに記述
- `[a-z]` : aまたはb...yまたはz
- `[a-zA-Z0-9]` : aまたはb...z、AまたはB...Z、0または1...9
    - = 半角英数字1文字

- `?` : 直前の文字が1文字、または無し
- `.` : 任意の1文字
- `*` : 直前の文字が0文字以上
- `+` : 直前の文字が1文字以上
    - `*`, `+`が**貪欲なマッチ**と呼ばれ、条件に当てはまる限り、その全てを対象にする。
    - `*?`, `+?`は**控えめなマッチ**と呼ばれ、最初にマッチした段階で、止まるようになる。
- `()` : ()の中がキャプチャされる
    - キャプチャする必要なしの場合は、`(?: )`のように、先頭に**?:**をつける
    - `(?:文字列)?` : 文字列があり、またはなし
- `[^A]` : **A以外**の任意の1文字
    - `[^AB]` : AでもなくBでもない任意の1文字
    - `[AB^]` : AまたはBまたは^のいずれかの1文字となるので注意
- `^~~` : **行頭**
    - `^ +` : 行頭からスペースが1文字以上続く
- `~~is $` : 行末
    - `^ +$` : 行頭から行末までスペースが1文字以上続く
- `(AB|CD)` : 文字列AB、またはCD
    - 範囲を明確にするため**( )**、キャプチャが必要なければ**(?: )**

#### 参考
- [初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
- [99.99%正確な正規表現](http://emailregex.com/)
- [初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」](https://qiita.com/jnchito/items/64c3fdc53766ac6f2008)
- [初心者歓迎！手と目で覚える正規表現入門・その３「空白文字を自由自在に操ろう」](https://qiita.com/jnchito/items/6f0c885c1c4929092578)

現時点では、以前からお世話になっていた記事を元にまとめましたが、随時出会った正規表現を追加で更新していく予定です。
Prophetのインストールで「No module named 'pystan'」

2021年6月23日時点でProphetは`pystan>=3.0`はサポートしてない．

https://github.com/facebook/prophet/issues/401#issuecomment-865193633

そのため，以下でインストールできる．

```
pip install pystan==2.19.1.1
pip install fbprophet
```
HTTPS通信でアクセス可能にする

# 内容
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
前回の記事「独自ドメインを設定する/障害時はSORRYページへ通信を流す」の続きです。
##### 前回の記事
https://qiita.com/zakinicof/items/6c973c1aed9ebdeeb845
前回までの構成はブログサービスにアクセスするのにHTTPで通信をしていました。
このままではセキュリティに問題があるため、よりセキュアなHTTPSで通信できるように設定を変更していきます。
HTTPS通信をするために必要な証明書を`AWS Certificate Manager`というAWSで証明書を管理できるサービスを利用します。
AWS Certificate Managerで証明書を発行してELBにアタッチすることでHTTPS通信を可能にしていきます。
その他、ELBのセキュリティグループでHTTPS通信を許可する設定の追加なども行なっていきます。
![スクリーンショット 2021-06-23 15.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790886/f2a656ae-e19d-0cef-5086-485ce5c49258.png)

# 実施手順

##### 前回の記事の構成がされていることを前提で進めていきます。

## 準備

1. EC2インスタンスが2台立ち上がっていることを確認
1. RDSを削除した場合は、スナップショットから復元しておく。
1. 復元したデータベースのステータスが`利用可能`になるまで待つ。
1. 前回取得したドメインでブログが閲覧できることを確認しておく。

## ロードバランサーでHTTPS通信を受け付ける

1. EC2の画面に移動し、左のメニューから`ロードバランサー`を選択
1. `リスナー`タブを選択し、`リスナーの追加`を選択
1. プロトコル：`HTTPS`を選択
1. `アクションの追加`→`転送先`と進み、ターゲットグループを選択し、チェックボタンを選択
1. `新しいACM証明書をリクエスト`を選択
1. 証明書のリクエスト画面で`ドメイン名`を入力して次へ進む。
1. 検証方法の選択：`DNS の検証`を選択して次へ
1. `確認とリクエスト`を選択
1. `Route53でのレコードの作成`を選択
1. `作成`を選択
1. `続行`を選択
1. Route53の画面に移り、更新ボタンを選択、検証用のDNSレコードが追加されていることを確認する。
1. リスナーの追加画面に戻り、`デフォルトのSSL証明書`の項目で更新ボタンを選択し、先ほど作成した証明書を選択
1. 右上の`リスナーの追加`を選択

## セキュリティグループの設定

1. ロードバランサーの画面の`詳細`タブを選択し、セキュリティグループを選択
1. ロードバランサー用に作成したセキュリティグループを選択し、`インバウンドルールを編集`を選択
1. `ルールの追加`を選択
1. タイプ：`HTTPS`を選択
1. ソース：`0.0.0.0/0`を選択
1. `ルールを保存`を選択

##### 現在の状態でURLをhttpからhttpsに変更してアクセスすると、WordPressの仕様で表示が崩れてしまうため、EC2にコードを追加することで対応します。

## WordPressの対応

1. ターミナルを開き、SSH接続でEC2にログインする。接続したら権限をルート権限に変更しておく。
1. `cd /var/www/html/`でディレクトリを移動
1. `ll`で`wp-config.php`のファイルがあることを確認
1. `vi wp-config.php`でファイルを開く。
1. `編集が必要なのはここまでです!`という記述が出てくるまで下にスクロールする。
1. 上記の記述と`define( 'WP_DEBUG', false );`の間に下記のコードを記述する。記述したら保存する。


```
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $_SERVER['HTTPS'] = 'on';
  $_ENV['HTTPS'] = 'on';
}
```
同様の手順をもう1台のインスタンスでも実行します。
この後、再度httpsでアクセスすると通常通り表示されるはずですが、この段階でまだ表示が崩れている場合は下記の手順を行います。

1. ターミナルを開き、SSH接続でEC2にログインする。
1. `mysql -h RDSのエンドポイント名 -u ユーザー名 -p`でMySQLにログイン
1. `USE データベース名`
1. `SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');`コマンドを実行すると、ELBのDNS名になっていることが確認できます。これを、`https://[独自ドメイン名]`に変更します。
1. `UPDATE wp_options SET option_value = 'https://[独自ドメイン名]' WHERE 
option_name IN ('siteurl', 'home');` を実行
6. 再度、`SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');`コマンドを実行し、URLが更新されていることを確認
6. ブログに`https://[独自ドメイン名]`でアクセスし、正常にブログが表示されていることを確認する。
【Flutter】Android Studioで起動するXcodeを切り替えるコマンド

# 別のXcodeで起動したい
Android StudioでiPhoneシュミレーターを起動するとき、Xcode13ベータ版で動かしたいタイミングがありました。

その際開発しているディレクトリでこちらのコマンドを打つことで使うXcodeを切り替えることができました。

```shell
sudo xcode-select -—switch /Applications/Xcode-beta.app/Contents/Developer
```

戻すときはbetaの部分を消せばいいですね。
Visual Studio Code でシーケンス図を書く

- Visual Studio Code 1.57

Visual Studio Code の Markdown エディタを使って、シーケンス図を書く方法のメモとなります。

## プラグインのインストール

1. Markdown でシーケンスを書くプラグインのインストール
1. Markdown を PDF, HTML に変換するプラグインのインストール

この2つのプラグインを、Visual Studio Codeの拡張機能タブで検索してインストールします。

### 1. Markdown でシーケンスを書くプラグインのインストール

いくつか選択肢があるようですが、今回は **mermaid** というライブラリを使いたく、このライブラリを Visual Stuido Code で利用するためのプラグインをインストールします。

Markdown Preview Mermaid Support
https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid


### 2. Markdown を PDF, HTML に変換するプラグインのインストール

Markdown PDF
https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf


## Markdown のプレビューの表示

- Markdown のファイルを開きます。
- 右上のプレビューボタンを押します。
![button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638071/9b4b4fd7-af00-768e-36a9-b4cc8e765ad2.png)

## Markdown の記述

````
```mermaid 
sequenceDiagram
participant A as 認証サーバー
participant B as ウェブサーバー
participant C as アプリ
Note over A, C: ログイン
C->>A: ログインリクエストAPI
A-->>C: ログインレスポンス (Token: json)
Note left of C: Tokenはアプリ内に保存

Note over A, C: WebView アクセス
C->>B: HTTPリクエスト (Token: HTTP Header)
B->>A: ログイン確認 (Token: json)
A-->>B: ユーザーデータ
B-->>C: HTTPレスポンス
``
````

![preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638071/5a691a93-1727-240b-4588-0de673b6a410.png)

※上下に変な余白があります。消し方はわかりませんでした。

詳細は公式のドキュメントを参照
シーケンス図以外にも、フローチャートやガントチャートなど書けるようです。

https://mermaid-js.github.io/mermaid/#/sequenceDiagram


## PDF, HTML に変換

- Markdown エディタの上で右クリックすると変換のメニューが出ます。

![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638071/aa422781-3968-cabb-fae4-aafde12a637e.png)


PDFへ変換した場合は、上下に余計な余白が着く場合がありますが、HTMLへ変換した場合は問題ありませんでした。

![pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638071/a155fcd0-f777-e41d-6a0e-1ff37b4d82bd.png)


HTMLへの変換は、1ファイルで開ける形で生成されました。
PowerAutomateでAdaptiveCardsのレスポンスを受け取る時にハマったこと

# あらすじ
先日、PowerAutomateで「アダプティブカードをTeamsユーザーに投稿して応答を待機」アクションを使用した際、
アダプティブカードのレスポンスが動的なコンテンツ一覧から選択できないという現象が発生した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/3bfa47bf-8435-0c84-6a08-1c7c1b3009a3.png)
# 原因
アダプティブカードのメッセージの中に、動的なコンテンツを使用していたため。

↓こんな感じで動的なコンテンツを使用すると、これ以降のアクションで動的なコンテンツを一覧から選択することができなくなってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/a19aaf7c-55c0-161d-ef21-78ca9613c14d.png)
ちなみに一覧から選択できないだけで、以下のように手書きすることはできる
```@{outputs('アダプティブ_カードを_Teams_ユーザーに投稿して応答を待機')?['body/data/input1']}```
# 比較画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/1c1e9be5-6f77-4370-339c-9744a9f1b3eb.png)
# まとめ
アダプティブカードのレスポンスを使用する場合は、極力アダプティブカードのJSONは静的文字列で指定しよう！
バリデーションでリファラー(URL)とパラメーターが適切であるときにサイトを表示させる処理

#要件
ここで満たしたい要件は以下の3つ。
・特定のサイトから遷移してきた人限定でサイトを表示する。
　（直接URLを叩いたら404が返される）
・リファラーについているパラメーターの値と本サイトのパラメーターが同じ値ならサイトを表示する
・①の条件を一度でも満たした人がURLを直接叩いたらサイトが表示されるようにする
*Middleweaerの作成が必要なので作成方法がわからない方はこちら
（Laravel素人の俺が書いたから間違ってる可能性有りなので他のサイトを参考にした方がいい気はする）
https://qiita.com/yoshiakidayo/items/06c90a995c4761e648e3

リファラーとは、アクセスログに記載されている情報のひとつで、当該ファイルを取得する（ブラウザで表示する）直前に閲覧していたページのURLを内容とする情報らしい。
参考サイト
https://www.mitsue.co.jp/case/glossary/l_011.html


まずリファラーを取得する

```
   //url()->previous()でリファラーのURLが取得できる。
   $previousUrl = url()->previous();
```
参考サイト
https://blog.capilano-fw.com/?p=2537

次に適切であるかを判断したいので三項演算子を使用する。

``` 
   // リファラー(直前のサイト)のURLが適切であればtrue
   $getUrl = $previousUrl  == 'リファラーのURL' ? true : false;
```

次にパラメーターを取得する

```
//パラメーターが?parameter=testの場合
$params = $request->parameter;
```

一度訪れたユーザーは閲覧できるようにしたいためセッションを保持させるのでセッションを取得するコードを書く

```
    // sessionに保存せされている値を取得
    $flag = session()->get('flag'); 
```


条件分を書いていく。

```
       if($getUrl == true){
            // リファラー(直前のサイト)のURLが正しければifを実行
            if($params  == config('app.get_params')){
                // 取得したパラメーターが適切であればsessionにflag_truを保存
                session()->put('flag', 'flag_true'); 
            }else{
                abort(404);
            }
        }elseif(!$flag) {
            // $flagの値が入っていなければ404を返す
            abort(404);
        }
```

###完成形
###Middlewere

```
 public function handle($request, Closure $next)
    {

        // リファラー(直前のサイト)のURL
        $previousUrl = url()->previous();

        // リファラー(直前のサイト)のURLが適切であればtrue
        $getUrl = $previousUrl  == 'リファラーのURL' ? true : false;

        // パラメーターを受け取る
        $params = $request->parameter;

        // sessionに保存せされている値を取得
        $flag = session()->get('flag'); 


        if($getUrl == true){
            // リファラー(直前のサイト)のURLが正しければifを実行
            if($params  == config('app.get_params')){
                // 取得したパラメーターが適切であればsessionにflag_truを保存
                session()->put('flag', 'flag_true'); 
            }else{
                abort(404);
            }
        }elseif(!$flag) {
            // $flagの値が入っていなければ404を返す
            abort(404);
        }

        return $next($request);
    }
```
あとはMiddlieweareに登録して上記の処理をTOPページのみに適用させる

###web.php

```
Route::get('/', 'TopController@index')->middleware('VerifyUrl');
```


##その他のページには新しくMiddleweaerを作成し下記の処理を適用

```
 public function handle($request, Closure $next)
    {
        // $getUrl = url()->previous();
        // dd($getUrl);
        
        $flag = session()->get('flag');
        
        if(!$flag){
            abort(404);
        }
        
        return $next($request);
    }
```

###web.php
```
  Route::get('shops', 'ShopController@index')->middleware('VerifySession');
  Route::view('/faq', 'static/faq')->middleware('VerifySession');
//などなど
```
Windowsのコマンドでシャットダウン、再起動、スリープ、休止状態、ログオフ、ロック、ユーザーの切り替えをする方法

コマンドでWindowsをシャットダウン、再起動、スリープ、休止状態、ログオフ、ロック、ユーザーの切り替えをする方法をまとめてみました。

# シャットダウン
`shutdown /s /t 0`

# 再起動
`shutdown /r /t 0`

# スリープ
`(psshutdown.exeのパス) /d /t 0 /accepteula`

psshutdown.exeはここからダウンロードできます。
https://docs.microsoft.com/ja-jp/sysinternals/downloads/psshutdown

参考：[Windows 10 シャットダウンや再起動などのショートカット](https://www.tipsfound.com/windows10/03011)

# 休止状態
`shutdown /h`

# ログオフ
`shutdown /l`

# ロック
`rundll32 user32.dll,LockWorkStation`

# ユーザーの切り替え
`(SwitchUser.exeのパス)`

SwitchUser.exeはここからダウンロードできます。
[Release SwitchUser · toracatman/SwitchUser](https://github.com/toracatman/SwitchUser/releases/tag/v1.0)
32ビットのWindowsではSwitchUser.zip、64ビットのWindowsではSwitchUserX64.zipをダウンロードしてください。

SwitchUser.exeが実行できない場合はこちらをインストールしてください。
[Download Visual Studio 2015 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=48145)

## SwitchUser.exeのソースコード
```c:SwitchUser.c
#include <Windows.h>
#include <WtsApi32.h>

#pragma comment(lib, "wtsapi32.lib")

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
	HKEY hKey;
	DWORD dwDisposition;
	int data = 1;
	RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\UserSwitch", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition);
	RegSetValueEx(hKey, L"Enabled", 0, REG_DWORD, (const BYTE*)&data, (DWORD)sizeof(data));
	RegCloseKey(hKey);
	WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, FALSE);

	return 0;
}
```
簡単に説明すると、レジストリの
`HKEY_LOCAL_MACHINE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\UserSwitch`に
Enabledという値を作って1にし、`WTSDisconnectSession`関数を呼べばユーザーの切り替えになるそうです。

このソースコードはClassic Shellのソースコードの一部（ユーザーの切り替えの部分）をお借りしました。
[GitHub - coddec/Classic-Shell: Original code of Classic Shell (v4.3.1), original author Ivo Beltchev](https://github.com/coddec/Classic-Shell)
Middleweaer作成方法 Laravel

#Middlewareの作成方法

ターミナル

```
php artisan make:middleware hoge
```
Http/Middlewareファイルに作成される

###Middleweareの登録
####Kernel.php

```
protected $routeMiddleware = [
  ~
  'Hoge' => \App\Http\Middleware\hoge::class,
];
```


###web.php

```
 Route::get('/', 'TopController@index')->middleware('Hoge');
```

これで使えた。
間違ってたらメンゴ
Google Analytics(GA)クロスドメイン設定で、メインのサイトのドメインは設定前同様に省略して表示したい

通常、Google Analytics(GA)でクロスドメイン設定を行う際には、以下の設定をしないと、分析対象のサイトのドメインを除いた部分のみが表示されるため、どのサイトへのアクセスなのかの見分けがつきにくい。そこで、GAで「管理」⇒「ビュー」の「フィルタ」⇒「フィルタの追加」で以下の設定をすることで、各レポートのURL表記にドメインを含めた表示がされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680122/46d2b522-104e-8284-9216-ac5273caae73.png)

##設定前後でのURL表示例
上記設定でGA内のページ表記が以下のように変更になります
###設定前の例
以下のようにドメインは表示されません。
/
/about/
/recruit/
/inq/
/news/

###設定後例(各ドメインが表示される)
ドメインを含めた表示になります。
example.com/
example.com/about/
sample.co.jp/
sample.co.jp/recruit/
sample.co.jp/inq/
sample.co.jp/news/

##この設定のデメリット
このGAを設定しているサイトのドメインがexample.comだった場合に、これまではトップページは「/」でログが残っていましたが、本フィルタ設定後は「example.com/」となってしまうため、過去のデータとの比較としては見にくくなります。そこで、メインのサイトではこれまで通りドメインを除いてログを残し、クロスドメイン先だけドメインを含めたログにしたくなると思います。

##解決例
「フィールド A -> 引用 A」の欄に以下のように、クロスドメイン先のドメインを正規表現で記載することで、この正規表現にマッチしたドメインのみを、GAの各レポートで利用されるようにすることができます。
以下例は、「sample.co.jp」と「test.ne.jp」へのアクセス時はドメインを含めてログを残しますが、それ以外の「example.com」などではドメインを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680122/8ce891ae-6f24-0ca3-5746-9bbdc28a893b.png)
こうすることで、以前からログを分析している場合に、クロスドメイン設定前後でURLが変わることが無くなります。
Lambda関数のCloudwatchEventsトリガー一覧を取得する

# はじめに
最近、Lambda関数のトリガー画面が少し変わりました。
以前まではCloudwatch Eventsをトリガーに設定していた場合は、そのトリガーが有効なのか、無効なのかが表示されていました。
現在はその有効・無効が表示されなくなったので、元々設定されていたトリガーの状態がひと目でわからなくなりました。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296479/318c1c75-30a7-96aa-1729-0d4ece5f3211.png)


# AWSCLIからCloudwatchEventsトリガーの一覧を取得する
現在、どのトリガーが有効かをマネジメントコンソール上から判断できるのはできますが、Cloudwatch Eventsのルール数や元々設定していたトリガーが多いとかなり面倒です。[^1] [^2]
AWSCLIで有効なCloudwatchEventsトリガーの一覧は下記で取得できます。

```bash
aws events list-rule-names-by-target --target-arn 関数のARN

# 例 
# 末尾latestはエイリアス名
aws events list-rule-names-by-target --target-arn arn:aws:lambda:ap-northeast-1:123456789012:function:MYFUNCTION:latest

```

# おわりに
Lambdaのトリガーなので`aws lambda xx`で情報が取れると思ってましたが、違いました。
DynamoDB Streamsだと`aws lambda list-event-source-mappings`で取れるんですが。。
今後は元々設定していた無効トリガーを削除して、有効なトリガーだけ表示されている、という状態を作らないと困惑しそうです。

[^1]: トリガー画面から判断する場合、トリガーを一つ選択したとき、有効化ボタンが活性になれば無効、非活性であれば有効
[^2]: CloudwatchEventsのルールを選択し、ターゲットに対象Lambdaがあれば有効
Goの構造体に埋め込んで、フィールドやメソッドを明示的に指定しなくてもアクセスできる

# はじめに
Goの構造体で明示的に指定しなくてもメソッドもしくはフィールドにアクセスできる方法を記しています。
ようするに埋め込みです。
Embedding言葉を知らない人でもHitするようなタイトルにしてます。

フィールド名もしくはメソッド名は同じでない場合は明示的に指定しなくてよい
逆に同じ名前があるなら明示的にしてければならない

```go:main.go
type Hoge struct {
  Aaa string
  Bbb string
  Ccc string
}

func(h *Hoge) Get() string {
  return "fuga"
}

func(h *Hoge) GetHoge() string {
  return "get hoge"
}

type Fuga struct {
  Aaa string
  Bbb string
  Ddd string
}

func(f *Fuga) Get() string {
  return "fuga"
}

func(f *Fuga) GetFuga() string {
  return "get fuga"
}

type HogeFuga struct {
  Hoge
  Fuga
}

func main() {
  hoge := Hoge{
    Aaa: "hoge",
    Bbb: "hogehoge",
    Ccc: "hogehogehoge",
  }

  fuga := Fuga{
    Aaa: "fuga",
    Bbb: "fugafuga",
    Ddd: "fugafugafuga",
  }

  hogefuga := HogeFuga{
    Hoge: hoge,
    Fuga: fuga,
  }

  //- フィールド名
  fmt.Println(hogefuga.Aaa) //- エラーが発生 フィールド名が一緒なので
  fmt.Println(hogefuga.Bbb) //- エラーが発生 フィールド名が一緒なので
  fmt.Println(hogefuga.Ccc) //- hogehogehoge
  fmt.Println(hogefuga.Ddd) //- fugafugafuga
  fmt.Println(hogefuga.Hoge.Aaa) //- hoge
  fmt.Println(hogefuga.Hoge.Bbb) //- hogehoge
  fmt.Println(hogefuga.Hoge.Ccc) //- hogehogehoge
  fmt.Println(hogefuga.Fuga.Aaa) //- fuga
  fmt.Println(hogefuga.Fuga.Bbb) //- fugafuga
  fmt.Println(hogefuga.Fuga.Ddd) //- fugafugafuga

  //- メソッド名
  fmt.Println(hogefuga.Get()) //- エラーが発生 メソッド名が一緒なので
  fmt.Println(hogefuga.GetHoge()) //- get hoge
  fmt.Println(hogefuga.GetFuga()) //- get fuga
  fmt.Println(hogefuga.Hoge.Get()) //- hoge
  fmt.Println(hogefuga.Fuga.Get()) //- fuga
  fmt.Println(hogefuga.Hoge.GetHoge()) //- get hoge
  fmt.Println(hogefuga.Fuga.GetFuga()) //- get fuga
}
```

# まとめ
埋め込みをする場合はフィールド名とメソッド名が同じでも問題ないが
呼び出すときに同じ命名は明示的に指定して呼び出すこと
NginxのアクセスログからELBのヘルスチェックを除外する方法

# 方法

/etc/nginx/nginx.confのhttpモジュールを以下のように編集。

```conf

http {
    /* 省略 */

    map $http_user_agent $log_ua {
        ~ELB-HealthChecker 0;
        default 1;
    }
    access_log  /var/log/nginx/access.log  main if=$log_ua;

    /* 省略 */
}
```
ポケモンのタイプの強さの数値化

# やりたいこと
久しぶりの投稿です。
クラクラは少し休憩です。

今回はポケモンのタイプの強さの数値的評価方法について考えてみました。この投稿で紹介しているコードは以下のノートブックにもまとめてあります。
https://colab.research.google.com/drive/1t0q9Fj6MNTY-itminHmxhe04_7S8GUoP?usp=sharing

# はじめに
ポケモンのタイプは18タイプがあり、タイプ相性の関係が複雑であり、そのため、数値評価が難しい。そこでページランク手法を用いてタイプの強さを評価することを考える。ポケモンの強さを攻撃面と耐性面に分け、それぞれページランクを用いてそれぞれ数値化する。その後、タイプの強さを求めた攻撃面、耐久面の演算で評価するものとする。

# ページランクとは
ページランクは、Webページの重要度を決定するためのアルゴリズムである．検索エンジンのGoogleにおいては，検索語に対する適切な結果を得るために用いられている中心的な技術である．Webページにおいては多くのページからリンクされている，良質なページからリンクされているとそのページの重要度が高くなる．

ページランクは $MP=P$ の解を要素の和が 1 になるように正規化することで求めることができる．ここで$M$は遷移確率行列，$P$は重要度のベクトルを表している．式の意味としては「注目したタイプの重要度＝$\sum$（注目している度合  $\times$ 注目したタイプの重要度）」と考えることができる．

# ポケモンの強さの数値化の説明
ここでは簡単のため、水、草、炎、氷の4タイプのみを用いてページランク手法について説明する。図で表すと以下のようになる。ピンク色の矢印が２倍、黒色が等倍、灰色が0.５倍の倍率を表している。
![相性表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949600/dece98f5-0281-9f30-e53d-c81ef305d88e.png)
この相性関係を有効グラフとみなすと、隣接行列は以下のように表すことができる。

```math
\begin{matrix}
炎 &水 &草  &氷
\end{matrix}
\\
\begin{pmatrix}
0.5 & 0.5 & 2 & 2 \\
2 & 0.5 & 0.5 & 1 \\
0.5 & 2 & 0.5 & 1 \\
0.5 & 0.5 & 2 & 0.5 
\end{pmatrix}
\begin{matrix}
炎 \\
水\\
草\\
氷\\
\end{matrix}
```

## 耐久面の評価方法
まず、ページランク手法を用いるために先程の隣接行列の転置し、列ごとの総和が1になるように正規化する。そして、ページランクを用いてそれぞれのノードの大きさを求める。この値の意味について考えると、列が攻撃する側のタイプ、行が攻撃される側のタイプであるため，行の要素の和が大きいとそのタイプが受けるダメージが大きいことを意味している。つまり、$MP=P$において、

(ノードの重要度) ＝ $\sum$ {(ノードnの重要度) $\times$(nからの攻撃の重み}

と考えることができる。そのため、弱点を疲れやすいタイプや等倍以上で入るタイプが多いほど大きな値となり、値が大きいと耐久面が低いと見なすことができる。4タイプでのの計算結果は炎0.21、水0.23、草0.29、氷0.25となった。

## 攻撃面の評価方法
有効グラフの矢印の向きを逆にしたものを用いることとする。耐久面の計算と同様に求めると$MP=P$は

(ノードの重要度) ＝ $\sum$ {(ノードnの重要度) $\times$(nへの攻撃の重み}

とみなすことができ、今度は弱点をつきやすい、半減以下で受けられにくい（一貫性が高い）タイプほど大きな値となる。4タイプでの計算結果は炎0.27、水0.26、草0.26、氷0.20となった。

## タイプの強さの評価
タイプの強さを（タイプの強さ）＝（攻撃面）/（耐久面）でそれぞれ計算し、わかりやすいように全体の和が100になるように変換し、その値をタイプの強さと考える。4タイプでの計算結果は炎31.3、水27.5、草21.6、氷19.6となった。

#18タイプでのタイプの強さの数値化
結果は以下の通りである。
概ね合っているように感じられる。
ノーマルとドラゴンが低いようにも感じるが…

![タイプの数値化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949600/8733a4b1-e0d5-a5d2-561d-3fd544021063.png)

#今後したいこと
今回の評価方法では「耐久面で弱いタイプに耐久面で弱ければ弱い」「攻撃面で強いタイプに攻撃面で強ければ強い」という考え方の計算方法であるため、「耐久面で強いタイプに攻撃面で強ければ強い」のような計算方法ができればなおいいと感じた。

また、今回は単タイプに絞ってタイプの強さを評価したが、今後は複合タイプを考慮した相性関係について考えてみたいと思う。

2022/2/17 追記
複合タイプにて考察してた方がいたので、リンクを置いときます。
>https://qiita.com/masaka_programming/items/503eaa2c1fa776dfdb19
Laravel Mix で video.js

Laravelで動画ストリーミング。
忘れないための落書き。

## 作業手順

### video.js をインストール
```bash
npm install --save video.js
```

package.json は以下のような感じになる（抜粋）

```json:package.json
    "dependencies": {
        "video.js": "^7.12.3"
    }
```

### webpack.mix.js で node_modules 配下のファイルを public 配下にコピー

```js:webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
  .sass('resources/sass/style.scss', 'public/css')
  .copy('node_modules/video.js/dist/video.min.js', 'public/js') // videojs用
  .copy('node_modules/video.js/dist/video-js.min.css', 'public/css'); // videojs用
```

### 画面にプレイヤーを表示
```php:video.php
<html>
  <head>
    <link href="{{ asset('css/video-js.min.css') }}" rel="stylesheet">
    <script src="/js/video.min.js"></script>
  </head>
  <body>
    <video-js id=video with=600 height=300 class="vjs-default-skin" controls>
      <source src="/path/to/video.m3u8" type="application/x-mpegURL">
    </video-js>
    <script>
      var player = videojs('video')
    </script>
  </body>
</html>
```

## 動画の保存場所が S3 で CloudFront から読み込む場合
CORS問題を解決しないとローカル環境等の別ドメインで動画を再生できない。

### S3のアクセス許可の Cross-Origin Resource Sharing (CORS) を定義する。

```json
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "MaxAgeSeconds": 3000
    }
]
```

### CORS関連に必要なヘッダーが CloudFront を経由してS3に届くようにする。
`CloudFront` の `Behavior` の `Origin Request Policy` に `Managed-CORS-S3Origin` を追加する。
【Google Cloud Day'21】「変化に強いデータ分析基盤を内製化！BigQuery に多様なデータを「集めてつなぐ」」を視聴して

変化に強いデータ分析基盤を内製化！BigQuery に多様なデータを「集めてつなぐ」
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-sl-18
概要
データドリブン。最近よく聞く言葉ですがデータに基づく経営を考えたとき、必須となるのは分析用データ基盤です。しかしながら、その必要性はわかっていても何をするか（したいか）が決まらず基盤構築が後回しになってはいないでしょうか？本セッションでは、現場に即したデータ活用を進めることができ、変化に対しても柔軟に対応できる分析基盤を内製で構築する際のポイントをご紹介します。


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>Googleの優位性、データ基盤の必要性</th>
		<td></td>
	</tr>
	<tr>
		<th>セゾンの製品</th>
		<td></td>
	</tr>
	<tr>
		<th>連携方法の比較</th>
		<td></td>
	</tr>
	<tr>
		<th>ユースケース</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/745f390f-da33-f291-c407-141a22db8dcd.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/16569739-ceb1-9278-8b1f-7855a4b8a0a1.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a7dde206-709c-e4d8-a1cd-2cc76228d85e.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/283a61eb-db00-667a-a219-fe187c908c1e.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/673ab7e4-7268-0639-6abf-825ced21aeae.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/163fbf7b-2139-d8dc-047e-b229c8f5121e.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/425e1083-256c-96ad-e602-316948b94769.png)
【Google Cloud Day'21】「ハイブリッド クラウド セキュリティとゼロトラスト戦略への対応」を視聴して

https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-sl-17

利便性の高いパブリック クラウドが一般的となり、益々進むクラウドシフト !  とはいえ現実はオンプレミスの環境もあり、世間ではそれぞれを適切に利用するハイブリッド クラウドが一般的ではないでしょうか。本セッションでは、ハイブリッド クラウド環境のデータ侵害を防ぐため、SASE / CSPM を始めとしたパロアルト ネットワークスのセキュリティ ソリューションを活用したゼロトラスト戦略についてご紹介いたします。

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>ゼロトラストの立ち位置</th>
		<td></td>
	</tr>
	<tr>
		<th>製品</th>
		<td>トラフィックを個別に制限したりもできる</td>
	</tr>
	<tr>
		<th>ユースケース</th>
		<td>Anthosを中心に動かしている事例。xsoarを使うとホストの変更も自動化できる。</td>
	</tr>
	<tr>
		<th>最適なアプローチ</th>
		<td>可視化が一番のポイントになるが、これができれば実現可能</td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/260d002b-122c-817a-fd0c-c26e7b31489a.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/76ba087d-f500-5e83-1b4f-eb5654abe10c.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0312eeae-e160-b358-b851-15c4e08ff963.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/fbd7546f-ae77-2e0c-7158-49e607f95204.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/77c54a80-1124-79a5-4d76-e287862c33c3.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/812d8236-89cf-15ea-0f3a-452e21572a52.png)
Certbotのcron実行されずに期限切れになった時の対処法

# はじめに
ポートフォリオを公開し、CertbotでSSL化にしたのですがその際にcronを設定したのが（毎月1日の1時に期限を更新し、nginxを再起動する処理）が起動せずに、証明書期限切れになりポートフォリオが閲覧できない事案がありました。

# 結論から
Certbotの更新で解決しました。
以下の対応で正常に表示されるようになりました。

```
$ sudo certbot renew            #更新
または
$ sudo certbot --force-renew    #強制更新
```

上記の対応でCongratulations(更新成功)とログが出力されるかと思います。

表示されなかったら、よくあるパターンとしてCertbotのバージョンが古い場合にエラーが出たりします。その場合はCertbotを最新にアップデートしてから叩くと上手くいったりします。
あとは、Certbotのログを元に原因を探ってみるといいかも知れません。

うまくいっても、そのままでは502 bad gatewayの表示画面になるので以下のコマンドで再起動。

```
$ sudo systemctl restart nginx      #nginx再起動
$ rails s -e production             #アプリケーションサーバー起動(Puma)
```

以上の対応で無事に表示されるようになりました。
ですが、cronが自動更新しなかった原因まではわからなかったのでもう少し調べてみようと思います。
JavaScriptのコールバック関数

今ProgateでJavaScriptやってるんですけど、コールバック関数の
直接定義みたいなので、左の事前に定義した関数は理解できるんですけど、右の直接引数の中で定義してる方がいまいち理解に苦しみます

![PXL_20210623_070933961.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1679065/7953cfb4-9367-6701-c9f4-110bdac27dbf.jpeg)

左のやつはこんな感じのイメージで理解してるんですけど
![PXL_20210623_070245559.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1679065/05cb9d52-d32e-0b70-4d25-579de5129c75.jpeg)

右のやつは引数としてcallbackにconsole.logが代入されても、
ちゃんと呼び出されない感覚があるのであります。

どんなイメージなら理解出来そうですか？
git push時のエラー

ようこそ、```git add```して```git commit```して
```git push```して以下のようなエラーが出たそこのあなた！

```terminal
$ git push origin master
error: src refspec master does not match any
```

2020/10以降、新規にレポジトリを作成すると、
以前の「master」ブランチとは違って「main」ブランチが作成されるようになりました。

よって、今まで通り```git push origin master```でpushしようとするとエラーになってしまうわけです。



詳細は[ここ](https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/)に書いてあります。
初めてのEclipse + Source Tree + Bitbucket + Git

<h2>前提</h2>
Eclipseを用いてローカル環境でプロジェクトファイルを作り開発している。
Gitでのソース管理を実践したい。

<h2>必要な登録</h2>
Source Tree,　Bitbucket。共にアトラシアンのサービス。
アトラシアンにユーザー登録が必要。両方無料で使える。
ツールとサービスについての関係性として一番わかりやすかったのが下記の例え。

メール・・・・・・・・・・・・・・・・・・・・・・・・・Git、CVS、Mercurial、Subversion
メールサービス（gmail, Hotmailなど）・・・・・・・・・・・Bitbucket、GitHub、Gitlab
メールアプリ（iOSのメールアプリやgmailのアプリなど）・・・Source Tree

Bitbucketはブラウザで利用できた。Source Treeはインストールが必要。
Source Treeの設定の際にBitbucketとの連携を求められる。
（BitbucketではなくGitHubでも良い）

<h2>導入手順</h2>
1.　Bitbucketでワークスペースを作る
2.　Source Treeのローカルリポジトリタブをクリックし、Eclipseで開発しているプロジェクトのファイルを丸ごとドラッグ&ドロップする
3.　ローカルリポジトリ内を見てみたりする（ドラッグ&ドロップしたファイルをコミットしてみたり）
4.　Eclipseでファイルを修正する
5.　Source Treeのローカルリポジトリを見にいくと、コミットしてないファイルがリストとして表示される
6.　コミットしてみたり
7.　Source Treeのローカルリポジトリをもとにリモートリポジトリを作成

<h2>認識（間違ってるかも）</h2>
リモートリポジトリにpushするとブランチ名が「origin/xxx」になる。
リモートリポジトリにpushされていない、ローカルにしかないブランチ名には「origin」がつかない。
一番の主軸が「master」ブランチ。初めにテストブランチ（developなど）を分岐させ、基本的にそこでソース管理。
テストが終わったら完成品を最後にmasterブランチにマージして開発終了。

　　　クラウド内　　　　　　　　　　　　　　自分のPC内
「リモートリポジトリ」 ⇄ 「ローカルリポジトリ ⇄ 自分のPCのディレクトリ」
ローカル ← 自分のディレクトリ = commit
リモート ← ローカル 　　　　　= push
リモート → ローカル　　　　　 = pull

軸から分岐させるのが「ブランチ branch」
分岐したブランチを軸に戻すのが「マージ merge」
phpフォームのページ遷移で$_SESSIONが消えないように気を付けたこと

##はじめに
php（今回フレームワークは使用していない）でフォームを作成したときに、CSRF対策(セキュリティ対策)でセッションを使用した。フォームは「ユーザ入力ページ」「入力内容確認ページ」「送信完了ページの３つ」。フォームの送信が入るたびにページ遷移が入るようにしたが、ページ遷移と同時に設定したセッションの値が切れてしまったので、対策したことを備忘録として残します。

作成したトークンと、そのトークンをセッション変数に代入してページ遷移後に同じ値であれば、ページを表示するというよくあるやり方。

##結論
セッションに設定した変数は <?php の直後に書く。
##対策したこと
####ディレクトリ構成

```
root/
   ├index.php
   ├form-user-input.php
   ├form-confirm.php
   ├form-compleate.php
   └parts
      └header.php
```

index.phpにそれぞれ入力、確認、送信完了ページをincludeして表示させるような構成です。

まず下記は、form-user-input.phpでフォームを入力してpost送信した時に、ページ遷移後、セッションが切れてしまったコードです。ヘッダーは共通のものを使用していたので、一番上に読み込んでいました。

```index.php
<?php
include('./parts/header.php'); //共通のヘッダー読み込み
session_start(); //セッションスタート
$token = 'random_char'; //トークン生成、本番ではランダムな文字列を入れてます
$_SESSION['token'] = $token; //$_SESSIONにトークンを代入

include('form-user-input.php'); 
//この下にフォームが送られた時の処理や、ファイル読み込みの処理を続けて書く

```
form-user-input.phpからform-confirm.phpに遷移すると、$_SESSIONがNULLになっていました。原因がわからず悩んだ、、、ファイルを読み込む際には、session_start()やセッション変数を書いた後に書くとうまくいきました。

```index.php
<?php
session_start(); //セッションスタート
$token = 'random_char'; //トークン生成、本番ではランダムな文字列を入れてます
$_SESSION['token'] = $csrf_token; //$_SESSIONにトークンを代入

include('./parts/header.php'); //共通のヘッダー読み込み
include('form-user-input.php'); 
//この下にフォームが送られた時の処理や、ファイル読み込みの処理を続けて書く
```

これでページ遷移後にも$_SESSIONの値はNULLではなく、生成したトークンと同じ値が入っていました。

##おわりに
今回はページ遷移後にセッションが切れてしまう問題の解決方法を書きました。
セッションを用いたCSRF対策のコードの書き方を近いうちに記事にしようと思います。
また、本記事はあくまで僕が試してうまくいった一例なので、もっと他に効率いい方法があるかも、、
セッションについて詳しい方、ぜひコメント等で教えてくださいmm


p.s
フォーム作成はLaravel使うとセキュリティ対策の面でも多少書きやすくなるので、フレームワークおすすめです。
[Sass] mixinとは

##はじめに
前回Sassに関する概要と一部の機能を紹介しました。
今回はSassの機能の中でも、とても便利な「mixin」という機能について紹介したいと思います。
よろしくお願いします。

##mixinとは
mixinという機能はいくつかのコードをまとめて、簡単に呼び出すようにする機能です。
同じコードを書く手間が省けるので、読みやすいコードになります。


##mixinの使い方

まずはmixinを下記のように定義します。

```SCSS
@mixin hoge {
  width: 100px;
  padding: 20px;
}
```

上記のmixinを使うためには、**＠include mixin名**を記述することで使用することができます。
下記の例を見てみましょう。

```SCSS
@mixin hoge {
  width: 100px;
  padding: 20px;
}

.hoge-1 {
  @include hoge;
}

.hoge-2 {
  @include hoge;
}
```

mixinに引数を渡して、柔軟にコードに幅を持たすこともできます。
下記の例を見てください。

```SCSS
@mixin hoge-text($color) {
  font-size: 14;
  color: $color;
}

.hoge-text1 {
  @include hoge-text(#ff0000);
}
```

引数に任意の色を設定してあげると、$colorに代入されます。

##終わりに
mixinは同じ記述を何度も書く必要がなくなり手間を省けるだけでなく、記述量が減るのでコード自体がすっきりしますね。
引数を設けることにより、柔軟に対応ができますし、ぜひ活用していきたいです。
さくらサーバーGZIP圧縮を有効にすると「PageSpeed Insights」が100点になった！

さくらレンタルサーバーのHTMLサイトのレスポンスが遅い！
原因はサーバーのGZIP圧縮が効いていないことです。

mod_deflateを使って圧縮します。

```html:.htaccess
<IfModule mod_deflate.c>
 SetOutputFilter DEFLATE
 AddOutputFilterByType DEFLATE text/html
 AddOutputFilterByType DEFLATE text/css
 AddOutputFilterByType DEFLATE application/x-javascript
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>
```

<q>引用元：<a href="https://rental-saba.com/trouble/gzip.html" target="_blank">GZIP圧縮が効かない「さくらのサーバー」</a></q>

対策を施して「PageSpeed Insights」にて確認したところ、スコアが満点になっていました。
![gzip3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1679841/c5a5c8f6-f944-7cf7-9bb9-723f51d80755.jpeg)
ワードプレスではインストール時にGZIP圧縮が有効になるため、この作業は不要です。
ルーティングを書く順番

新規投稿ページの作成のため、ルーティングの設定で私は最初

get "posts/:id" => "posts#show"   #showは投稿内容の詳細ページへのアクション
get "posts/new" => "posts#new"    #newは新規投稿ページへのアクション

と設定していた。
しかしリンクから新規投稿ページにアクセスしたところ下図のようなエラーが生じた。

![スクリーンショット 2021-06-23 15.16.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/16444dcb-9de8-461c-f3d8-4e6398890e33.png)


エラー内容を見ていると、どうやらPostコントローラーのshowアクションに関してエラーが生じているように見える。(NoMethodError in Posts#showより)

しかしアクセスしたリンクは新規投稿ページへのリンクだったはずである。どうしてこのようなエラーが生じてしまったのだろうか。

その理由はルーティングの順番にある。
:idという変数は何に対してもマッチしてしまう。例えば以下のようなルーティングを設定しているとしよう。

get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"
get "posts/new" => "posts#new"

新規投稿ページへアクセスしようとする際、ルーティングに対して上から順番にnewのファイルに関するルーティングを探す。変数:idは先ほど述べたように何に対してもマッチしてしまうため
get "posts/:id" 部分は get "posts/new"としてしまう。
ゆえにget "posts/new" => "posts#show"として処理されてしまうためアクセス時にエラーが生じてしまった。

ではエラーが起こらないようにするにはどうすれば良いか。
何に対しても:idはマッチしてしまうので、解決策としては:idと書かれているルーティングは最後に書けば良い。