OmniAICreator/Qiita-1.07M huggingface dataset:
hydra を出来るだけ副作用がないように使う

[Hydra](https://hydra.cc/) というのは設定ファイルをイイ感じに扱えるようにする python 製のフレームワークである。
公式サイトによると、`A framework for elegantly configuring complex applications` ということなのだが、まあその通りという感じ。
複数ファイルで色々と設定を書いてまとめられるので、かなり便利で重宝しているのだが、いくつかうーんという点がある。
1. 勝手にディレクトリを掘って、勝手にワーキングディレクトリを変更する
2. (実行時に色々いじった物を反映した) 設定に対応するファイルを書き出す
3. ログファイルを勝手に作る

という感じで、色々と手を回してくれるのはまあ良いのだが、ちょっと副作用が強いなと思うときもあったりなかったりする。
気持ちとしてはこの辺の副作用をなんとかしたいと思うのは自然だと思うのだが、果たして頑張ってみるとこの辺を誤魔化すことができるようだったのでまとめておく。
調べていく過程で、[stack overflow](https://stackoverflow.com/questions/65104134/disable-file-output-of-hydra) に記事がることを発見したので、ほとんどそれの和訳に近い形になるのだが、ともかく書いておく。

# 1. 勝手にワーキングディレクトリを変更する
hydra 実行時のワーキングディレクトリは、デフォルトだと[こんな感じ](https://hydra.cc/docs/configure_hydra/workdir) に設定されたディレクトリに変更されるようになっている。
例にも書いてあるが、この辺をいじればコンフィグの値によってログを吐き出す先を書き換えることもできる。
ワーキングディレクトリを変更しないようにするには、単に `./` を値として設定すればよい。

# 2. (実行時に色々いじった物を反映した) 設定に対応するファイルを書き出す
実行時に、様々な設定に対応する値をコマンドライン引数の値に応じて書き換えるような機能が入っている。
その書き換え前/後の設定を yaml で書き出してくれるようになっているのだが、これも困るといえば困る。
これを無効にするには、 `hydra.output_subdir` の値を null に設定すればよい。

# 3. ログファイルを勝手に作る
勝手に実行時のログファイルを(当然だが何もロギングしてなくとも)書き出すようになっている。
stack overflow では hydra.hydra_logging=disabled と設定することで無効にすることができると書いてある。
それはそれで事実なのだが、[このへん](https://hydra.cc/docs/configure_hydra/logging/) を参考にするとイイ感じに logging の設定ができて便利である。 handlers の値としてファイルへの物を渡さなければ、ファイルを勝手に生成することはなくなる。

***

上記を踏まえた上で、パースする`yaml`には例えば次のように書く。

```yaml

hydra:
  run:
    dir: ./
  output_subdir: null
  job_logging:
    version: 1
    handlers:
      console:
        class: logging.StreamHandler
        stream: ext://sys.stdout
    root:
      handlers: [console]
    disable_existing_loggers: false
```
【Swift】起動時の画面を作成したSwiftUIファイルにしたい


# どういうことか

プロジェクト作成時の "Interface:" をSwiftUIではなくStoryboardで作成したが、起動時の画面はあとから作成したSwiftUIファイルにしたいとき。

先日も[似たような記事を書いたが、あちらの方法はやや横着な方法](https://qiita.com/antk/items/c2db7e74cc92bd37af44)なので、こちらの記事の方法を推奨します。

## SceneDelegateで設定する

この記事では **FirstView.swift** というSwiftUIファイルを表示させることを想定する。

```swift:SceneDalegate.swift
import UIKit
// 追記
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, 

        guard let windowScene = (scene as? UIWindowScene) else { return }

        // ここから追記
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: FirstView())
            self.window = window
            window.makeKeyAndVisible()
        }
        // ここまで
    }

// 以下略
```

"Interface:" をSwiftUIで作成した際の **SceneDelegate.swift** に書かれている記述と同じものを書いている。
当然だが、追記した部分を消せば **Main.storyboard** が初期画面になる（特に何も設定してない場合）。

以上です。
なんだか意外と単純なハナシでした。
HTMLの主な要素〜初心者だった自分に向けて〜　その①メタデータ系

# HTML・メタデータ系
###はじめに
改めて知識を定着させるため、勉強してきたことを過去の自分が読んでもわかりやすいように可能な限り噛み砕いた表現で書いてみる。
まずは表題の通り、HTMLの主な要素について。
## html要素 `<html>`
HTML文書は、１つの`<html>`要素からなり、`<html>`要素は、ページ全体を囲んでいます。この要素が全ての要素の先祖（親要素）になるので、「ルート要素」とも呼ばれています。

この要素に直接入れることができるのは、`<head>`と`<body>`を各１つずつのみです。
##head要素 `<head>`
この要素には、html文書に関するメタデータ（機械可読な情報）が入ります。
例えば、題名(title)、スクリプト(JavaScript)、スタイルシート(CSS)、文字コード(charset)などです。
この要素に入れた内容は、ブラウザでWEBページの内容として表示されることはありません。
`<html>`を直接の親要素とします。
##body要素`<body>`
`<head>`とは逆に、ブラウザで表示されるWEBページの内容（コンテンツ）を入れる要素です。
`<html>`を直接の親要素とします。
##link要素 `<link>`
`<head>`内に配置する、外部のリソースとの関係を指定する要素です。
主にCSSスタイルシートへのリンク、アイコンを外部サイトから持ってくる時、JavaScriptのファイルURLを指定する時に使います。
　`<head>`内で何度でも使用できるため、複数のCSSファイルを読み込ませることも可能です。
####`<link>`要素に指定できる主な属性
- `rel = "ファイルの種類"`（必須）
- `href = "ファイルのURL"`（必須）
- `media = "適用対象"`
CSSやアイコンを適用する対象の出力媒体（パソコン、プリンタ、テレビなど）を指定したい時に使用する。
- `type = "MIMEタイプ"`
関連するファイルのMIMEタイプを指定する。`rel = "stylesheet"`が指定されている場合は自動的に`type = "text/css"`が指定されている状態になります。MIMEタイプに関しては別の記事で参照。

##meta要素 `<meta>`
他のメタ関連要素(link,title など)で表すことのできないさまざまな情報(メタデータ)を示す要素。
#### `<meta>`要素に指定できる主な属性
- `charset = "文字コード"` ページで使用している文字エンコーディングの宣言。HTML5では"UFT-8"を指定することを推奨されている。
- `name = "情報の種類"` content属性で指定する情報の種類を名前で示します。
- `http-equiv = "情報の種類"` 役割は前述の`name`と同じで、含む情報の種類によって使い分けます。
- `content = "情報"` 前述の`name`や`http-equiv`で指定された種類の、具体的な情報を指定。<br> _記述例_ `<meta name ="viewport" content ="width-device-width>"`<br>（このWEBページを小さい画面でみた時に初期状態で縮小された状態にならないようにするための記述）

## style要素 `<style>`
`<head>`内に配置する、CSSスタイル指定を直接書き込むことができる要素です。<br>使用するとほかのHTMLファイルやCSSファイルのスタイル指定を共有できなくなってしまうので、この方法で指定する何らかの理由がない限り使用しない方が良いでしょう。
#### `<style>`要素に使用できる属性
- `media = "適用対象"`
- `type = "MIMEタイプ"`

#### 属性としても使用できる
また、任意の要素（記述例では`<div>`や、`<p>`）に属性として指定することもできます。しかし、この方法はHTMLのあちこちにスタイル指定を埋め込むことになりメンテナンス性が低下するため、ちょっとしたテストのために使用すべきものと考えた方が良いでしょう。

_記述例_

```html:HTML
<head>
  <style>
  body {background: orange;}
  </style>
</head>
<body>
  <div style="background: #ffe7e8; border: 2px solid #e66465;">
      <p style="margin: 15px; line-height: 1.5; text-align: center;">
         Well, I am the slime from your video
      </p>
 </div>
</body>
~~~

## title要素 `<title>`
そのWEBページの目的（タイトル）をテキストで入れる要素です。テキスト以外の要素を入れることはできません。<br>この要素の内容はブラウザウィンドウのタイトルバーやタブに表示され、SEO（GoogleのWebページ検索の、ヒットや表示順）に大きく影響します。<br>一般的なWebページであれば`<head>`内に必ず１つだけ配置します。

_記述例_

```html:HTML
<head>
  <title>このページのタイトル</title>
</head>
~~~

##script要素 `<script>`
実行できるコード（スクリプト）やデータを埋め込むために使用します。一般的にJavaScriptのコード埋め込みや参照に使われています。<br>タグ内にコードを書き込むことも、属性`src`を使って外部ファイルを読み込むこともできます。
#### `<script>`要素に使用できる主な属性
- `src = "ファイルのURL"` 外部のファイルからスクリプトを読み込みます。<br>この属性を指定した場合、要素内容は空にしておかなければなりません。
- `type = "MIMEタイプ"` スクリプト言語のタイプを指定できます。<br>この属性を省略（記述しない）した場合、デフォルトで「text/javascript」が指定されています。（JavaScriptを使ってるよ〜ということ）

_記述例（外部ファイル読み込み）_

```html:HTML
<script src="javascript.js"></script>
~~~
<br>
_記述例（コード書き込み）_

```html:HTML
<script>
  alert("Hello World!");
</script>
~~~
WSL2でspleeterを使えるようにするまで

# なぜWSL2上なのか
centos8上ではspleeterが使用しているtensorflowがcore dumpを起こす
[Bug] Illegal instruction (core dumped) · Issue #145 · deezer/spleeter https://github.com/deezer/spleeter/issues/145
のでWIndows10上のWSL2で適当なlinuxを稼働してなんとかならんかなぁと試行錯誤しました。

# 下準備
WSL2の初歩メモ - Qiita https://qiita.com/rubytomato@github/items/a290ecef2ea86ea8350f
のとおりWSL2とubuntu20.04をインストールしておく

# spleeterのインストール
```
sudo apt update && sudo apt upgrade -y
sudo apt-get install python3-pip
pip3 install -U pip
source ~/.profile
pip install spleeter
```

# 変換処理の例
```
ln -s /mnt/c/Users/fizz .
spleeter separate -p spleeter:4stems fizz/Music/hoge.mp3 -o .
sudo apt-get install ffmpeg
ffmpeg -i fizz/Music/hoge.mp3 fizz/Music/master.wav
```
これで

```
master.wav
drum.wav
bass.wav
vocal.wav
other.wav
```
が作成されるので
Stemクリエーター http://stemsmusic.wpengine.com/ja/stem-creator-tool-jp/
をインストールしてstemsを作成すると

![stems.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369323/c82e78e8-4eb6-b01d-af89-a6c779e4ff24.jpeg)

はい、Traktorで読めました。

# あと
stemsクリエーターを使う箇所もffmpegでshell一発にしたいなぁ。
出来たら書きます
Railsのgem 'active_hash'で都道府県データを作成


# Railsのgem 'active_hash'で都道府県データを作成

Railsでデータベースに都道府県データを持たせずに、
active_hashでデータを持たせる方法を備忘録として記事にします。

特に都道府県を一から記載するのが面倒という人は以下に記載のコードをコピーしていただければと思います。

## ActiveHashとは
Active_Hashとは、都道府県名などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemのこと。

## 環境
Rails 6.0.3
Ruby 2.6.5
macOS Catalina


## 事前準備


## active_hashを導入します

Gemfile

```
gem 'active_hash'
```
bundle installをします。

```
$ bundle install
```

次にモデルを作成します。

```ruby

rails g model area
```

rails db:migrateします。

```
$ rails db:create
$ rails db:migrate
```

## ActiveHash::Baseを継承したPrefectureモデルの作成

Prefectureモデルを作成します。
rails g modelを行わずActiveHash::Baseを継承したPrefectureモデルを自分で作成します。

## 実装します

app/models/prefecture.rb

```ruby
class Prefecture < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' },
    { id: 4, name: '岩手県' }, { id: 5, name: '宮城県' }, { id: 6, name: '秋田県' }, 
    { id: 7, name: '山形県' }, { id: 8, name: '福島県' }, { id: 9, name: '茨城県' },
    { id: 10, name: '栃木県' }, { id: 11, name: '群馬県' }, { id: 12, name: '埼玉県' },
    { id: 13, name: '千葉県' }, { id: 14, name: '東京都' }, { id: 15, name: '神奈川県' },
    { id: 16, name: '新潟県' }, { id: 17, name: '富山県' }, { id: 18, name: '石川県' },
    { id: 19, name: '福井県' }, { id: 20, name: '山梨県' }, { id: 21, name: '長野県' },
    { id: 22, name: '岐阜県' }, { id: 23, name: '静岡県' }, { id: 24, name: '愛知県' }, 
    { id: 25, name: '三重県' }, { id: 26, name: '滋賀県' }, { id: 27, name: '京都府' }, 
    { id: 28, name: '大阪府' }, { id: 29, name: '兵庫県' }, { id: 30, name: '奈良県' }, 
    { id: 31, name: '和歌山県' }, { id: 32, name: '鳥取県' }, { id: 33, name: '島根県' }, 
    { id: 34, name: '岡山県' }, { id: 35, name: '広島県' }, { id: 36, name: '山口県' }, 
    { id: 37, name: '徳島県' }, { id: 38, name: '香川県' }, { id: 39, name: '愛媛県' }, 
    { id: 40, name: '高知県' }, { id: 41, name: '福岡県' }, { id: 42, name: '佐賀県' }, 
    { id: 43, name: '長崎県' }, { id: 44, name: '熊本県' }, { id: 45, name: '大分県' }, 
    { id: 46, name: '宮崎県' }, { id: 47, name: '鹿児島県' }, { id: 48, name: '沖縄県' }
]

include ActiveHash::Associations
has_many :area

end

```
(ハイフン付き、かつRubcopでスペースをチェックを考慮してます)


なお、araeモデルに対してアソシエーションを設定しています。

```ruby

include ActiveHash::Associations
has_many :area
```


Areaモデルにも同様にアソシエーションを設定します。

```ruby
class Area < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture
end
```

以上です。
Accessで満年齢を求める関数を作る

#意外と難しい年齢計算
　ある日を基準日として満年齢を計算することは事務を行う中で意外と多くあります。
　会社などでは、社員や顧客の生年月日をデータベース化しているので、一見年齢を求めるのは簡単そうですが、日本で法令に沿った満年齢を求めることは意外と難しいのです。
　日本国内で年齢計算の根拠になっているのは[「年齢計算ニ関スル法律」](https://ja.wikipedia.org/wiki/%E5%B9%B4%E9%BD%A2%E8%A8%88%E7%AE%97%E3%83%8B%E9%96%A2%E3%82%B9%E3%83%AB%E6%B3%95%E5%BE%8B)という法律です。
　これによると生まれた日から年齢を計算しはじめることになつているので、誕生日の前日に満一歳、年をとることになります。
　事務作業でデータベース処理を行う際、Accessを利用することが一般的ですが、これらには経過年数を求めるDatediff関数があり、Datediff("yyyy",誕生日,基準日)とすると、満年齢が求められそうです。
　しかし、この関数では期間を計算する際、特定の基準を何回、経過しているかを求めるだけです。先の事例では誕生日から基準日までの間の１月１日を何回経過したかを求めているだけなので、基準日が誕生日を過ぎていない場合、年齢を一歳多くカウントしてしまいます。
　このため、ある日の満年齢を求める関数をVBAで作成します。
　
#資料集めとテストケースの設定
　さきの根拠法の解説だけでは、具体的なブログラムを組むには参考となる適切な事例があげられていない。
　そこでネットを調べてみると参議院法制局のサイトの「法律の窓」というコラムに[「４月１日生まれの子どもは早生まれ？」](https://houseikyoku.sangiin.go.jp/column/column011.htm)という記事を発見。この記事では４月１日生まれが早生まれになることを事例に年齢計算の法的根拠を解説しています。
　この記事を元にテストケースを設定すると、2020年4月1日生まれの人が満六歳になる2026年3月31日の前後で正しく満年齢が計算されているか確認すれば良さそうです。

テストケース
　年月日	　　　　年齢
　2026/3/30　　　5才
　2026/3/31　　　6才
　2026/4/1　　　 6才

#満年齢を求める手順
　満年齢を求める手順は
　　基準日の年から生年を引いて経過年数を求める
　　基準日が誕生日の前日を過ぎているかを確認
　　　もし、誕生日の前なら経過年数から1年引いたものを満年齢とする
　　　そうでなければ、経過年数を満年齢とする。
　となります。

##実際のコード
　以上の検討を行い作成したAccessで満年齢を計算する関数はつぎのとおり。
　使い方　getAge(誕生日,基準日)
　戻り値　long
 test_getAgeがテストのためのコードです。

```VBA:getAge.vba

Option Compare Database
Option Explicit
 
Function getAge(BirthDay As Date, tmpDay As Date) As Long
'参議院法制局のコラム「４月１日生まれの子供は早生まれ？」を参考とした。
'「年齢計算に関する法律」によると出生日を一日目として含める。→満年齢がカウントアップされるのは誕生日の前日。
'tmpdayは基準日
 
    Dim retAge As Variant   'エラーが返ることを想定しvariantとする。
    
    'BirthdayからtmpDayまでに経過した1月1日の数を返す。
    retAge = DateDiff("yyyy", BirthDay, tmpDay)
    
    '基準日が誕生日を過ぎているか確認する。
    '基準日と誕生日の前後関係を簡単に比較するため日付型の変数同士の比較にする。
    If tmpDay < DateSerial(Year(tmpDay), Month(BirthDay), Day(BirthDay) - 1) Then
    '基準日が誕生日を過ぎていない→満年齢を-1する。
        retAge = retAge - 1
    End If
    
    getAge = CLng(retAge)
    
End Function
 
Sub test_getAge()
'2020/4/1生まれの人を想定
'2026/3/30まで5歳
'2026/3/31以降6歳
'テストケースは2026/3/30,3/31,4/1
 
    Dim curDate As Date
    Dim tmpCnt As Long
    
    curDate = #3/30/2026#
    
    For tmpCnt = 0 To 2
        Debug.Print tmpCnt, "birthday:2020/4/1-> 今日は", curDate + tmpCnt, getAge(#4/1/2020#, curDate + tmpCnt) & "才"
    Next
    
    Debug.Print "2026年1/1の満年齢", getAge(#4/1/2020#, #1/1/2026#) & "才"
    Debug.Print "2026年5/3の満年齢", getAge(#4/1/2020#, #3/3/2026#) & "才"
    Debug.Print "2026年11/3の満年齢", getAge(#4/1/2020#, #11/3/2026#) & "才"
 
End Sub


```

#EUCなどの問題、お願い
　EUCなどといって、事務現場にデータ加工を担当させることが一般的になってきていますが、このような法令に基づく計算については、組織として計算方法を職員に示しておく必要があると思いますが、皆さんの会社ではどうでしょうか。
　村上陽一郎東大名誉教授が[『科学の現在を問う』（講談社新書現代新書）](https://bookclub.kodansha.co.jp/product?item=0000146961)で東海村臨界事故を題材に現場任せの「カイゼン」の危険性を指摘されていますが、適切な社員教育を行ってプログラムの基礎的なスキルの向上と関連する知識の普及をはからないEUCもRPAも同じような問題をはらんでいると思います。
　最後に、プログラムに誤りなどがありましたら教えてくださると大変助かります。
Express と TypeORM で MariaDB に接続

次にあるサンプルを実行してみました。
[ typeorm /
typescript-express-example ](https://github.com/typeorm/typescript-express-example)

MariaDB の用意

>User: scott
>Password: tiger123
>Database: my_database

プログラムのクローン

```bash
git clone https://github.com/typeorm/typescript-express-example
```

プログラムの準備

```bash
cd typescript-express-example
npm install
```

データベースの接続情報の設定

```json:ormconfig.json
{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "scott",
  "password": "tiger123",
  "database": "my_database",
  "synchronize": true,
  "entities": [
    "src/entity/*.js"
  ],
  "subscribers": [
    "src/subscriber/*.js"
  ],
  "migrations": [
    "src/migration/*.js"
  ],
  "cli": {
    "entitiesDir": "src/entity",
    "migrationsDir": "src/migration",
    "subscribersDir": "src/subscriber"
  }
}
```

サーバーの起動

```bash
npm start
```

クライアントでアクセス

```text
$ curl http://localhost:3000/posts
[]
```

MySQL にデータを入れる

```sql:insert.sql
insert into post set title='test_aa', text='Hello';
insert into post set title='test_cc', text='Good Morning';
insert into post set title='test_dd', text='Good Afternoon';
quit
```

SQL の実行

```bash
mysql -uscott -ptiger123 my_database < insert.sql
```

クライアントからアクセス

```text
$ curl http://localhost:3000/posts | jq .
[
  {
    "id": 9,
    "title": "test_aa",
    "text": "Hello"
  },
  {
    "id": 10,
    "title": "test_cc",
    "text": "Good Morning"
  },
  {
    "id": 11,
    "title": "test_dd",
    "text": "Good Afternoon"
  }
]
```

IDを指定してアクセス

```text
$ curl http://localhost:3000/posts/10 | jq .
{
  "id": 10,
  "title": "test_cc",
  "text": "Good Morning"
}
```

データの挿入

```bash
curl -X POST -H "Content-Type: application/json" \
    -d '{"title": "test_ee","text": "Good Evening"}' \
    http://localhost:3000/posts
```

関連ページ
[Nest.js と TypeORM で MariaDB に接続](https://qiita.com/ekzemplaro/items/91ce87d281a3387f33c6)
Rspec の Request Spec で Stripe-Signature ヘッダを含めたテストをする

Stripe を利用していてwebhookを使ったStripe 上で発生したイベントに対して処理を行うというのはよくあると思います。

Stripe ではイベントが第三者ではなく Stripe によって送信されたリクエストであることを確認するために Signature の検証ができるようになっています。
[Check the webhook signatures](https://stripe.com/docs/webhooks/signatures)

基本的にはwebhook でイベントを受け取るエンドポイントで Signature の確認処理を実行すると思いますが、テストでは自前で Signature を作成する必要があります。

ここでは公式のStripe API の Ruby Gems の stripe-ruby と Rspec でテストする前提での例を説明します。

- [stripe/stripe-ruby: Ruby library for the Stripe API.](https://github.com/stripe/stripe-ruby)


## Stripe-Signature の作成
stripe-ruby では Signature の計算とStripe-Signature ヘッダの文字列を作成するメソッドが提供されています。
これらを使ってStripe-Signature ヘッダを含む POST リクエストをするメソッドを用意します。

- [Method: Stripe::Webhook::Signature.compute_signature — Documentation for stripe/stripe-ruby (master)](https://rubydoc.info/github/stripe/stripe-ruby/Stripe%2FWebhook%2FSignature.compute_signature)
- [Method: Stripe::Webhook::Signature.generate_header — Documentation for stripe/stripe-ruby (master)](https://rubydoc.info/github/stripe/stripe-ruby/Stripe%2FWebhook%2FSignature.generate_header)

```ruby:spec/support/stripe_webhook_helpers.rb
# frozen_string_literal: true

module StripeEventHelpers
  def post_with_stripe_signature(path, **options)
    post(
      path,
      headers: {
        'Stripe-Signature': generate_stripe_event_signature(options[:params])
      },
      **options
    )
  end

  private

  def generate_stripe_event_signature(payload)
    time = Time.now
    secret = ENV['STRIPE_WEBHOOK_SECRET']
    signature = Stripe::Webhook::Signature.compute_signature(time, payload, secret)
    Stripe::Webhook::Signature.generate_header(
      time,
      signature
    )
  end
end
```

Stripe の イベントを受け取るエンドポイントのテスト内での `post` は基本的に `Stripe-Signature` ヘッダを含めることになるので `post` をオーバーライドするのもありだと思います。

```diff_ruby:spec/support/stripe_webhook_helpers.rb
-  def post_with_stripe_signature(path, **options)
+  def post(path, **options)
-    post(
+    super(
      path,
      headers: {
        'Stripe-Signature': generate_stripe_event_signature(options[:params])
      },
      **options
    )
  end
``` 

## ヘルパーをインポートしてヘッダーを含むリクエストをする

テスト用の Stripe::Event オブジェクトを作成するのに stripe-ruby-mock を使います。
Ref: [stripe-ruby-mock/stripe-ruby-mock: A mocking library for testing stripe ruby](https://github.com/stripe-ruby-mock/stripe-ruby-mock#mocking-webhooks)

```ruby:spec/requests/stripe_events_spec.rb
describe StripeEventsController do
  include StripeEventHelpers

  before { StripeMock.start }
  after { StripeMock.stop }

  let(:event) { StripeMock.mock_webhook_event('customer.created') }

  it 'returns ok' do 
    post_with_stripe_signature stripe_events_path, params: event.to_json
    expect(response).to have_http_status(200)
  end
end
```

:v: 

## Refs
- [Including Stripe Signature header when testing with Rspec? · Issue #467 · stripe-ruby-mock/stripe-ruby-mock](https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues/467)
Cloud9 の Git visual source control integration を試してみた

# はじめに
Cloud9 はお手軽に統合開発環境を用意できて素晴らしい。
でもやっぱり、ローカルで VS Code 立ち上げたりした方がプラグインが充実していて良い感じだったりする。
とは言え、Cloud9 で開発せざるを得ない状況というのも発生するわけで、使い方をちゃんと知っておくと強力な武器になることは間違いない。

そんな中、2021/2/10 に [Git visual source control integration というのがローンチされた](https://aws.amazon.com/about-aws/whats-new/2021/02/aws-cloud9-launches-visual-source-control-integration-for-git/)らしいので、これは試してみなければなるまい！

# Git visual source control integration って何だ？
要は、VS Code の Source Control と同じだ。
Cloud9 の以下のボタンで参照できる、リポジトリの状態確認ができる機能だ。

![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/56bcbe00-1e18-6121-2fe6-0bd64f02c11e.png)

# いろいろな状態を確認してみる
```git pull``` したり ```git push``` した直後は、以下の状態になっている。

![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/72a429f6-f3e9-31fa-4ec4-1d4ff3b0abe8.png)

この状態で、ファイルを編集して保存してみよう。

![キャプチャ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/8e0c8ea4-091f-8dae-f59d-8f91bf8e13bf.png)

Changes の状態に変わった。
ここで、01_main.tf を右クリックして、```Open Changes``` を選択すると、変更前後の差分を確認することも可能だ。

![キャプチャ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/d60fd245-781a-dd15-3e50-81045a259fad.png)
![キャプチャ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/5ca4b0ea-caee-fec3-60dd-c849d522dcec.png)

さて、この状態で、```git add``` するか、ファイル名の右に出ている「＋」をクリックしてみよう。

![キャプチャ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/80ee207a-6797-4616-3bd5-c07b46b477c3.png)

すると、

![キャプチャ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/7043dcab-4499-c221-5b95-dd7b364299cd.png)

```Staged Changes``` に状態遷移する。
なお、ここで、ファイル名の右の方に表示される「－」をクリックすると、```Changes``` の状態に戻る。

![キャプチャ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/e2a387e1-8aef-43fc-0d41-5b4074c4db41.png)

では、次は、```Message``` のテキストボックスに適当なコメントを入れて Ctrl+Enter をしてみよう。```git commit``` でも良い。
すると、最初の ```No Changes detected.``` の状態になる。
残念ながら、Commit してまだ Push していない状態をビジュアルで確認することはできないようだ。
※もちろん、コンソールから ```git log --graph``` すれば確認は可能。

ここから、右クリックをして、```Push``` なり ```Undo Last Commit``` をすれば良い。

![キャプチャ9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/f576a644-eff6-f733-8322-521d381c955c.png)

これ、何気にあまり注目されていないように見えてけっこう便利なアップデートだと思う。
Cloud9 のこれからに期待だ！
Railsでページ遷移時にJavaScriptが実行されない場合の対処法

##発生した問題
Railsにてページ遷移時にJavaScriptが実行されない。
ページを更新すると実行される。

##原因
Railsに標準で導入されているturbolinksというGemが原因でした。
turbolinksはページ内の全ての情報を読み込まず、HTML要素だけを読み込むことで画面遷移を高速化してくれるのですが、その結果JavaScriptファイルが読み込まれない為実行されませんでした。

##対処法
```javascript

window.addEventListener('load', function(){
```
該当jsファイル内の上記の'load'の部分を'turbolinks:load'に変更する。

```javascript

window.addEventListener('turbolinks:load', function(){
```

無事にJavaScriptが実行されました。
【Python】Worksheet.〇〇_dimensionsで非表示を解除

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、非表示設定の解除に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/cffa4322-84a4-fe2c-5e64-d8946c61bf88.png)

上記のような非表示状態にしている列を一括解除することが目標です。

# Worksheet.〇〇_dimensions

```python
# 行の非表示解除
ws.row_dimensions[行番号].hidden = False

# 列の非表示解除
ws.column_dimensions[列名].hidden = False
```

こちらで行と列それぞれ非表示を解除できます。
ちなみに、非表示にしたい場合は「False」を「True」に変更します。

次に立ちはだかってくる問題が「列名」です・・・。

# Cell.column_letter属性

```python
cell.column_letter
```

セルの列名ってアルファベットなのですよね。
しかも、「Ｚ」の次は「ＡＡ」、「ＡＢ」・・・と続きます。
なのでこちらでアルファベット名を取得します。

# Worksheet.max_column属性
最後にデータが入力されている最大の列まで非表示解除の処理を行いたいので

```python
ws.max_column
```

こちらで取得します。
今回は、列だけだったのですが他にも

- ws.max_row:データが入力されている最大の行
- ws.min_row:データが入力されている最小の行
- ws.max_column:データが入力されている最大の列
- ws.min_column:データが入力されている最小の列

こちらがありました。どちらも、使用頻度高そうです！

こちらをふまえて、こうなりました！

```python:column_hidden.py
from openpyxl import load_workbook

wb = load_workbook('〇〇地区時給計算.xlsx')
ws = wb.active

# 行の非表示を解除
# for row_no in range(2, ws.max_row + 1):
#     ws.row_dimensions[rouw_no].hidden = False

# 列の非表示を解除
for col_no in range(2, ws.max_column + 1):
    # セルの列名を取得
    col_alphabet = ws.cell(row=1, column=col_no).column_letter
    ws.column_dimensions[col_alphabet].hidden = False

wb.save('〇〇地区時給計算_変更後.xlsx')
```

# 余談：非表示とグループ化
念のため列「Ｄ～Ｅ」は非表示、列「Ｇ～Ｊ」はグループ化として隠している状態でしたが
どちらも解除されていました。

一部の行や列を隠したい時には
「非表示」か「グループ化」のどちらかを使用すると思うのですが
個人的には「グループ化」をおすすめします。

一番の理由は隠しているところが解りやすいから。

非表示だと目立たなくて気づかなかったり、再度隠したい時に隠す場所を忘れていたりするので。
いずれにしても、今回の機能はほぼ出番はないかなといった感じですね。
[rails]requireメソッドとpermitメソッドとは

#requireメソッドとは
paramsからとってくるデータのオブジェクト名を指定すること

#permitメソッドとは
paramsから取ってくるデータのキーを指定すること

#使用例

```
def tweet_params
    params.require(:tweet).permit(:image, :text)
end
```
.requireメソッドがデータのオブジェクト名を定めて
.permitメソッドで変更を加えられる（保存の処理ができる）キーを指定します

このコードですとtweetオブジェクトを指定して、さらにtweetオブジェクトの中に定義された：imageと：textのキーを指定しています
Gitコマンドのエイリアス作成してみた

## はじめに
普段Gitでソースコードを管理しているのだが、毎度コマンドを打つのが面倒になってきたので時短できるようにエイリアスを作成してみました。

### この記事で説明しないこと
- `git` のコマンドの解説

## エイリアス(alias)とは
かなりザックリ言うと、コマンドに対して別名をつけることができます。
長いコマンドやオプションを毎回全部入力しなくても、あらかじめ設定しておくことができます。

例えば `ls -l`のようにオプションを毎回付けるものに対して、`ll`で同じ結果が得られるようになります。

## エイリアスの作成方法

`.bashrc`というファイルにエイリアスを記述する事ができます。
ターミナルから以下のコマンドを実行すると、`vim`のエディターが起動するのでそこに、追加する事ができます。

```terminal
vi ~/.bashrc
```

```bash
alias ll="ls -l"
```

`alias 短縮コマンド="コマンド名 オプション"`
エイリアスを追加するには上記のような書き方でできます。

 以下が自分がエイリアスで定義しているgitのコマンドになります。


```vim

alias gb='git branch'

alias ga='git add'

alias gc='git commit -m'
 
alias gs='git status'

alias gco='git checkout'

alias gcob='git checkout -b'

alias gcod='git checkout develop'

alias gd='git diff'

alias gpush='git push origin HEAD'

alias gpull='git pull origin master'

alias gsu='git stash -u'

alias gsp='git stash pop'
```

他にもっといい短縮系あるよ！！とか、このコマンドはこんなエイリアス付けている等あれば、是非教えていただけると嬉しいです。
docker-compose上で起動しているredis-clusterにローカルからアクセスしようとしたらハマってしまった件


#背景
springで作成したアプリのセッションをredis-clusterで管理しようとしたらハマってしまいました。
springを起動しようとすると
以下のようなエラーが発生していて、内容的には「redisの情報が取れませんでしたよ」と言うことみたいで、
なぜ情報が取れていないのかがわかりませんでした。

```
org.springframework.data.redis.ClusterStateFailureException: Could not retrieve cluster information. CLUSTER NODES returned with error.
```
なので、忘れないようにこちらに残しておきます。

※　あくまでredis-clusterでハマった話なので、今回はspringとどうやって接続したかなどは書きません。ご了承ください。

#環境
redis 6.0.10


``` redis.conf
#クラスターモードに設定し、接続できるIPを開放
cluster-enabled      yes
cluster-node-timeout 8000
bind 0.0.0.0
```

#原因

dockerのbridgeネットワーク上にあるredisに外部からアクセスした時に、「ここにリダイレクトしろ」とdockerネットワーク内のIPアドレスとポートがクライアントに返ってくるのだけど、返ってきたIPとポートは外部アクセスするときのIPではなく、dockerネットワーク内のIPなので接続ができずエラーが返ってきていました。

>![https---get-reddie.com-assets-img-blog-redis4-redis3_nat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/b8e19a1e-ff86-1541-c075-d7699d3e280f.png)

引用サイト: A Redis Cluster of any size using Docker Compose and Redis 4.0 port-forwarding 
          https://get-reddie.com/blog/redis4-cluster-docker-compose/

詳しい内容は上記イメージを引用したサイトをお読みください。

#解決策
簡潔に言うと
redis4.0以降では
下記の設定をredisのconfigファイルに追加すれば良いと言うことに気付きました。

- ```cluster-announce-ip: 制御するredis-cluster のipアドレス```

``` redis.conf
#クラスターモードに設定し、接続できるIPを開放
cluster-enabled      yes
cluster-node-timeout 8000
bind 0.0.0.0

#redisクラスターのノードのリダイレクトさせるときのIPアドレス
#今回はローカルとの接続がしたいので127.0.0.1に設定
cluster-announce-ip  127.0.0.1
```

cluster-announce-ipをconfigに追加することで、返ってくる「ここにリダイレクトしろ」のIPアドレスがcluster-announce-ipの中身に変換されて返ってきます。これで正常にredisの情報の取得」ができました。




#参考、引用情報
以下の記事が参考になりました。

A Redis Cluster of any size using Docker Compose and Redis 4.0 port-forwarding
https://get-reddie.com/blog/redis4-cluster-docker-compose/
日本語訳版
https://qiita.com/Reddie_Japan/items/75d26bfc0dfaeab6a5c3
VBAで様々な文字コードのテキストを読込めるクラスを作った(Win限定?)

※ADODB.Stremを使って読み込みます。使えない環境での使用は出来ないと思います
#概要
･VBA組み込み関数だとShift_JISしか読み込めない
･たまにUTF-8などの読み込みが必要になったときに調べるのが面倒くさい

ということで、そもそもそんなに困ったことがないけど取り敢えず作ってみたので忘却録として公開します。
以下のコードをコピーして、TextFileReaderという名前でクラスを追加してください。(クラス名は任意でもOK)

```vb:TextFileReader.cls

Private adoDBStream As Object ' ADODB.Stream

Property Get CharCode_ASCII() As String: CharCode_ASCII = "ascii": End Property
Property Get CharCode_UTF_7() As String: CharCode_UTF_7 = "UTF-7": End Property
Property Get CharCode_UTF_8() As String: CharCode_UTF_8 = "UTF-8": End Property
Property Get CharCode_Shift_Jis() As String: CharCode_Shift_Jis = "Shift_JIS": End Property
Property Get CharCode_Unicode() As String: CharCode_Unicode = "Unicode": End Property
Property Get CharCode_ISO_2022_JP() As String: CharCode_ISO_2022_JP = "iso-2022-jp": End Property
Property Get CharCode_EUC_JP() As String: CharCode_EUC_JP = "euc-jp": End Property
Property Get CharCode_BigEndianUnicode() As String: CharCode_BigEndianUnicode = "unicodeFFFE": End Property


Private Sub Class_Initialize()

    Set adoDBStream = CreateObject("ADODB.Stream")   'New ADODB.Stream
    
End Sub

Public Function Read(filePath As String, fileFormat As String)

    adoDBStream.Open
    adoDBStream.Type = 2 'adTypeText
    adoDBStream.Charset = fileFormat
    adoDBStream.LoadFromFile filePath
    Read = adoDBStream.ReadText()
    adoDBStream.Close
    
End Function

Private Sub Class_Terminate()

    Set adoDBStream = Nothing
     
End Sub
```

#使用例

```vb:TextFileReaderTest.bas
    Dim reader As New TextFileReader
    dim filePath as string : filePath = "C:\hogehoge.txt"
    Dim text as string

    'クラス内の定数?を使って文字コードを指定できます
    text = reader.Read(filePath, reader.CharCode_Shift_Jis) 'Shift_JIS
    text = reader.Read(filePath, reader.CharCode_UTF_8) 'UTF-8
    text = reader.Read(filePath, reader.CharCode_Unicode) 'Unicode
    text = reader.Read(filePath, reader.CharCode_BigEndianUnicode) 'BigEndian Unicode 
    text = reader.Read(filePath, reader.CharCode_ASCII) 'ASCII
    text = reader.Read(filePath, reader.CharCode_EUC_JP) 'EUC_JP
    text = reader.Read(filePath, reader.CharCode_ISO_2022_JP) 'ISO_2022_JP

    set reader = nothing

```

#備考
HKEY_CLASSES_ROOT\MIME\Database\Charset
に登録されている文字コードが使えるようです。

###所感など
あまりちゃんと確かめてないので動かなかった場合はごめんなさい。
追加機能としてWriterぐらいはつけても良さそうだけど使わないからなぁ･･･
vs2010でmfc その6

#概要

vs2010でmfcやってみた。
デジタル時計やってみた。

#手順

- mfcアプリケーション、ダイアログベースでプロジェクト名は、mfc0で作る。
- IDD_MFC0_DIALOGを開く
- プロパティを開く。メッセージを開く。
- WM_TIMERをクリック。
- OKボタンをクリック。
- コードを書く。
- 実行。


#サンプルコード

```

void Cmfc0Dlg::OnBnClickedOk()
{
	SetTimer(1, 1000, NULL);
	SetDlgItemText(IDC_STATIC, _T("start"));
}

void Cmfc0Dlg::OnBnClickedCancel()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
	CDialogEx::OnCancel();
}

void Cmfc0Dlg::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == 1)
	{
		CTime cTime = CTime::GetCurrentTime();
		CString stime = cTime.Format("%Y/%m/%d %H:%M:%S");
		SetDlgItemText(IDC_STATIC, stime);
	}
	CDialogEx::OnTimer(nIDEvent);
}


```

以上。
【Python】チートシート（標準機能外含む）〜数学的統計的な特徴を添えて〜

逐次追加していきます.
当面の予定：数値処理,文字列処理,型システム

#### 数値処理
##### 算術平均
数値列の代表値の１つ. 分散と組み合わせて使うことで, 数値列の分析に利用できる. 代表値ととして単独で使うには中央値,最頻値の方が適切なため文脈に沿った使い分けが必要.数値列の各値の確率が同様に確からしい場合に限り期待値と同値になる.

$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i $$ 

#####  分散
数値列の値の散らばり具合を表す。分散が大きいほど、散らばっている数値列となり、統計的には回帰と呼ばれる手法での分析、予測が困難になる。

$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2 $$ 

```python
import numpy as np

sai = np.array([1,2,3,4,5,6])
print(np.mean(sai))    # 算術平均
print(np.var(sai))     # 分散
```
本番環境で、外部APIを用いたログインがエラーになった話(Facebook API、Google API)

# 開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

# 前提

- 外部APIを用いたログインは、omniauthとomniauth-rails_csrf_protectionを用いて実装しました。
- 記事投稿方のアプリに外部API(Facebook、Google)を用いたログイン機能を実装(ローカルの挙動は問題なし)
- EC2にデプロイ済み
- Route53で名前解決済み(ドメインはお名前ドットコムで取得しました)

# ことの発端

本番環境にデプロイが成功した後、アプリの挙動を試していると外部APIを用いたログイン機能が使えない事態が発生しました。

Facebookのエラー画面![スクリーンショット 2021-02-11 17.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/ffbcb6bd-2fc0-96b7-8bd0-a3c3e8ac7595.png)


Googleのエラー画面![スクリーンショット 2021-02-11 17.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/97e69356-bd69-1af7-9e74-18eb5132fbd2.png)


# 解決策

結論から書くと、リダイレクトURIを正しく設定できていないことが原因でした。
そのため、解決策としては以下の通りです。

### Facebookの場合


Facebook for Developersにアクセスして、 「Facebookログイン」>「設定」  の中にある
「有効なOAuthリダイレクトURI」というフォームに
```自身のアプリのURL/users/auth/facebook/callback
```を追加する。

### Googleの場合

Google Cloud Platformにアクセスして、　「APIとサービス」>「認証情報」 の中にある、「承認済みのリダイレクト URI」に
```自身のアプリのURL/users/auth/google_oauth2/callback
```を追加する。

以上です。参考になれば幸いです。
Homebrew(brewコマンド)で覚えておきたいこと

Homebrewインストールして必要な設定したら何もしないでも良いのだろうけど、
たまには最新の状態にしておきたいなぁーって思った時によくやること。

## 環境の確認

`brew doctor`で`Your system is ready to brew.`が出れば大丈夫。（たまになのでほぼ出ない）
`brew --config`では`CLT`と`Xcode`のバージョンが揃ってれば安心。

```sh
$ brew doctor
Your system is ready to brew.

$ brew --config
HOMEBREW_VERSION: 3.0.0
ORIGIN: https://github.com/Homebrew/brew
...
CLT: 12.4.0.0.1.1610135815
Xcode: 12.4
```

## 環境の更新

`brew update`で最新版を取ってくる。
`brew outdated`で更新があるかを確認する。
`brew upgrade`で更新する。

```sh
$ brew update
$ brew outdated
$ brew upgrade
```
【Heroku&Git】Herokuアプリをリモートリポジトリとして登録・変更・削除する方法

#プログラミング勉強日記
2021年2月11日
最初に初めてHerokuでデプロイしようとしたときに、以下のようなエラーが出た。これは、リモートリポジトリにHerokuが追加されていなかったため、リモートリポジトリを登録することで解決できた。

```
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.
```

#登録されているリポジトリの確認

```
$ git remote -v
```


#登録する方法

```
$ git remote add heroku https://git.heroku.com/アプリ名.git
```

#変更する方法

```
$ git remote set-url heroku https://git.heroku.com/アプリ名.git
```


#削除する方法

```
$ git remote rm heroku
```

#参考文献
[herokuでデプロイ初](https://teratail.com/questions/231902)
[STEP2-10.Herokuで公開してみよう](https://team-lab.github.io/skillup/step2/10-heroku.html)
cabal v3でdoctestを使うならwrite-ghc-environment-filesを有効にするといい

# 要約

Haskellのcabal-install v3でNix-style build(v3ではこれがデフォルトのモード)をする場合、doctestを使うパッケージがあるなら以下の設定をcabal.projectや$HOME/.cabal/configに書いておくといい。

```
write-ghc-environment-files: ghc8.4.4+
```

# 参考

- [HaskellやっていくGHC8.8.1令和元年白露の候 - syocy’s diary](http://syocy.hatenablog.com/entry/init-ghc-8-8-1)
- [Cabal-3: doctest-discover fails for non-boot libraries · Issue #6087 · haskell/cabal](https://github.com/haskell/cabal/issues/6087)
- [8. cabal.project Reference — Cabal 3.4.0.0 User's Guide](https://cabal.readthedocs.io/en/3.4/cabal-project.html#cfg-field-write-ghc-environment-files)

# 何が問題なのか

上記の設定を入れないと、doctestが外部パッケージのDBを参照できなくなり、ghcのコアパッケージ以外のパッケージを参照できなくなる。

例えばdoctestが処理するソースファイルに

```haskell
import Data.Aeson (FromJSON)
```

などと書いてあるとdoctestが`Data.Aeson`を見つけられずにエラーになる。(.cabalの`build-depends`にaesonを書いてもダメ。doctestは.cabalファイルを参照しないらしい)

これ以外にも、例えばCPPを使って外部パッケージのバージョンを参照しようとするとエラーになる。例えば、

```haskell
{-# LANGUAGE CPP -}

...

#if MIN_VERSION_aeson(1,5,0)
...
#else
...
#endif
```

などと書くと、`MIN_VERSION_aeson`を処理できずにエラーになる。

# どう解決するか

`write-ghc-environment-files`設定を有効にすると、ビルド時にプロジェクトディレクトリに`.ghc.environment.{architecture}`といった名前のファイルが作られる。この中に参照すべきパッケージDBの場所が記録される。これがあればdoctestも外部パッケージを見つけられるようだ。
[AWS]boto3でEIPを変更する(取得→関連付け→開放まで)

boto3を使用してEIPを変更する(取得→関連付け→開放まで)方法です。

[公式ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-elastic-ip-addresses.html)

## インスタンスIDで指定
```python
import boto3
from botocore.exceptions import ClientError

ec2 = boto3.client('ec2')
try:
    filters = [
    {'Name': 'instance-id', 'Values': ['i-xxxxxxxxxxxxxx']}
    ] #EC2のインスタンスIDでフィルターする
    addresses = ec2.describe_addresses(Filters=filters)
    address_list = addresses["Addresses"]
    address = address_list[0] if len(address_list) else ''
    old_allocationid = address["AllocationId"]
    allocation = ec2.allocate_address(Domain='vpc') #EIP取得
    associate = ec2.associate_address(AllocationId=allocation['AllocationId'],InstanceId='i-xxxxxxxxxxxxxx') #EIP関連付け
    release = ec2.release_address(AllocationId=old_allocationid) #古いEIPを開放
    print('Address released')
except ClientError as e:
    print(e)
```

## ENIで指定
```python
import boto3
from botocore.exceptions import ClientError

ec2 = boto3.client('ec2')
try:
    filters = [
    {'Name': 'network-interface-id', 'Values': ['eni-xxxxxxxxxxxxxx']}
    ]#ネットワークインターフェースIDでフィルターする
    addresses = ec2.describe_addresses(Filters=filters)
    address_list = addresses["Addresses"]
    address = address_list[0] if len(address_list) else ''
    old_allocationid = address["AllocationId"]
    allocation = ec2.allocate_address(Domain='vpc') #EIP取得
    associate = ec2.associate_address(AllocationId=allocation['AllocationId'],NetworkInterfaceId='eni-xxxxxxxxxxxxxx') #EIP関連付け
    release = ec2.release_address(AllocationId=old_allocationid) #古いEIPを開放
    print('Address released')
except ClientError as e:
    print(e)
```

他にも、特定のプライベートIPを持つENIに関連づいているEIPを変更するなどもできます。
【Rails6】Docker環境でWebpackerのコンパイルが遅い【対策】

# はじめに

こちらの記事の続きとなります。

[【Rails6】Docker + Rails + MariaDB のローカル環境でアプリ開発を始めよう【おとなもこどもも、おねーさんも】](https://qiita.com/masarashi/items/61c5d9c63e9588b948f0)

CSSファイルを編集してページの更新をするたびに、表示がめちゃくちゃ遅い問題にぶつかりました。

具体的な事象としては、数十秒ほどブラウザの読み込みが発生します。その際にログを確認すると、"webpack: Compiling..." という出力のまま止まり、しばらくすると "webpack: Compiled successfully." となってページが表示されます。

こんな状態ではおちおちCSSの編集ができないので、対策を施しました。


# 参考にさせていただいた記事

[dockerでwebpackerが遅い問題を改善する](https://qiita.com/MoguraStore/items/ca80c99c5542898ec3b5)


# 設定方法

解決のため、webpackerを別のコンテナで稼働させます。

`docker-compose.yml`に追記します。（追記部分のみ記載）

```yml:docker-compose.yml

  app: のセクション

    environment:
      - WEBPACKER_DEV_SERVER_HOST=webpacker

  webpacker:
    build: .
    environment:
      - NODE_ENV=development
      - RAILS_ENV=development
      - WEBPACKER_DEV_SERVER_HOST=0.0.0.0
    command: ./bin/webpack-dev-server
    volumes:
      - .:/sample_app
      - gem-data:/usr/local/bundle
    ports:
      - '127.0.0.1:3035:3035'
```

webpackerコンテナでも Gemの永続化を行っています。


# コンテナの停止

```terminal
docker-compose down
```

稼働中のコンテナがないことを確認します。

```terminal
docker-compose ps

Name   Command   State   Ports
------------------------------
```

# イメージのビルドとコンテナの起動（同時に）

```terminal
docker-compose up —build
```

# 解消

これ以降、同じ事象は発生していません。
また、`command: ./bin/webpack-dev-server` という記述のおかげで、CSSを編集すると自動でブラウザのリロードがかかってくれるので、ちょっと便利になりました。
エクスプローラーを右クリックしたときに表示されるコンテキストメニューの編集

レジストリエディタがある程度使える人のみ参考にしてください。
レジストリエディタを使ったことがない方は、先に全てのファイルに対してのコンテキストメニュー編集のやり方を調べてください。（こちらは検索ですぐに出ます。）

#できること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547414/c802db7b-eb36-79dc-0ecc-9f90723e561c.png)
好きな拡張子やクリックする場所に応じて任意のソフトで実行できるコンテキストメニューを追加する。1つのファイルを2種以上のソフトで使うときに便利。
　→　batスクリプトを勉強すればもっと色々できるっぽい？

#共通部分
`~~~\shell` 以下に次のキーを作成する。
自分のわかりやすいキー名
└`(既定)`の値をコンテキストメニューに表示する文字列に設定（無くても良い）
└さらに文字列`Icon`を追加し値をexeのパスにすることで任意のアイコンを設定可能
└`command`というキー
　└`(既定)`の値を「"開きたいソフトのパス" "%1"」に設定。

#異なる部分
この記事では`HKEY_CURRENT_USER\Software\Classes`を省略して`...`と書く。

###ファイル
すべてのファイル右クリック
`...\*\shell`以下を編集

特定の拡張子のファイルを右クリック
`...\SystemFileAssociations\.<拡張子>\shell`以下を編集

ショートカットを右クリック
`...\lnkfile\shell`以下を編集

特定の種類のファイルを右クリック
`...\SystemFileAssociations\audio\shell`以下を編集
`...\SystemFileAssociations\video\shell`以下を編集
`...\SystemFileAssociations\image\shell`以下を編集
`...\SystemFileAssociations\document\shell`以下を編集
`...\SystemFileAssociations\text\shell`以下を編集

###フォルダ
フォルダを右クリック（特殊フォルダは含まない）
`...\Directory\shell`以下を編集

ドライブを右クリック
`...\Drive\shell`以下を編集

すべてのフォルダを右クリック（特殊フォルダ・ドライブを含む）
`...\Folder\shell`以下を編集

最適化されたフォルダを右クリック
`...\SystemFileAssociations\Directory.Audio\shell`以下を編集
`...\SystemFileAssociations\Directory.Video\shell`以下を編集
`...\SystemFileAssociations\Directory.Image\shell`以下を編集
`...\SystemFileAssociations\Directory.Document\shell`以下を編集

###背景
デスクトップの背景を右クリック
`...\DesktopBackground\shell`以下を編集

開いているフォルダの背景を右クリック
`...\Directory\Background\shell`以下を編集

#お願い
コンテキストメニューの階層表示についてなにか知ってる人がいたら教えてほしいです。
AWS CLIで出力したJSONをソートして順序のゆらぎを吸収したメモ

AWSの環境構築内容を履歴管理したくて、AWS CLIで出力したJSONをバージョン管理ツールにコミットして差分確認することにしたのですが、AWS CLIで出力されるJSONの配列などの順序が毎回必ずしも同じではなく、変更が無いのにDiffが出ることがありました。
そこで、JSONをソート出来ればと思ったのですが、いろいろ検索してもJSONを良い感じにソートできるLinuxコマンドが見つからなく、JSONをソートするRubyをチャカっと書いて、その場しのぎをしたのでメモ。
JSONの要素のキーと値の両方を文字列として接続して、その文字列でソートして、同じ内容のJSONであれば表記の順序がまちまちでも同じ出力結果になるように出来たと思います。
もっと良い方法など気づいた事がありましたらコメント頂けると幸いです。

```ruby:sort_json.rb
#!＜パス＞/ruby
# -*- coding: utf-8 -*-

require 'json'

def sortHash(h)
  str = ''
  new_hash = Hash.new
  h.sort.to_h.each do |k, v|
    new_v, s = sortObject(v)
    new_hash[k] = new_v
    str += k.to_s + s
  end
  return new_hash, str
end

def sortArray(a)
  tmp_hash = Hash.new
  a.each do |v|
    new_v, s = sortObject(v)
    tmp_hash[s] = new_v
  end
  str = ''
  new_array = []
  tmp_hash.sort.to_h.each do |k, v|
    str += k
    new_array << v
  end
  return new_array, str
end

def sortObject(o)
  if o.class == Hash
    return sortHash(o)
  elsif o.class == Array
    return sortArray(o)
  else
    return o, o.to_s
  end
end

begin
  hash = JSON.load(STDIN.read)
  hash, str = sortObject(hash)
  json_str = JSON.pretty_generate(hash)
  puts json_str
end

```

＜実行例＞

```
$ echo '{"c":1, "b":2, "a":3}' | ./sort_json.rb
{
  "a": 3,
  "b": 2,
  "c": 1
}
↑ keyを優先してソート

$ echo '[{"a":3}, {"a":2}, {"a":1}]' | ./sort_json.rb
[
  {
    "a": 1
  },
  {
    "a": 2
  },
  {
    "a": 3
  }
]
↑ keyが同じなら値でソート

$ echo '[{"a":1, "c":1}, {"b":[{"x":"z"},{"x":9}], "a":1}, {"a":1}]' | ./sort_json.rb
[
  {
    "a": 1
  },
  {
    "a": 1,
    "b": [
      {
        "x": 9
      },
      {
        "x": "z"
      }
    ]
  },
  {
    "a": 1,
    "c": 1
  }
]
↑ keyが有ったり無かったりの複合
```

＜AWS CLIでの例＞

```
$ aws ec2 describe-security-groups --output json | <パス>/sort_json.rb > security-groups.json
```

＜参考にした記事＞
[RubyでJSONを扱うときに便利な関数まとめ](https://uxmilk.jp/13387)
RailsでAPIモードとviewを共存させた時にform_withでPUTができずにハマった

### 概要
APIモードのRailsアプリケーションでviewを使って簡単なCRUD操作をしようとしていました。
すると、`form_with`でデータ更新（PUT）をしようとするとなぜかPOSTになってしまいルーティングエラーが出てハマってしまったので、そちらの解決方法のメモ。


### ミドルウェアの追加
以下の三つを`application.rb`に追記します。

- `config.middleware.use Rack::MethodOverride`
- `config.middleware.use ActionDispatch::Cookies`
- `config.middleware.use ActionDispatch::Session::CookieStore`

### コントローラーでのインクルード
`ActionController::Base`を継承しているコントローラーで以下をインクルードさせる

- `include ActionController::Cookies`


### 参考URL
- https://www.nightswinger.dev/2020/04/rails-api-with-session-and-cookie/
- https://webapps-for-beginners.rubymonstas.org/resources/fake_methods.html
PowerCMSX+Ubuntu20.04+nginx環境におけるPHP7→8移行

# はじめに
## 対象読者
* [PowerCMS X](https://powercmsx.jp/) ユーザーで、
* Ubuntu 20.04 で、
* PHP 7.x で、
* nginx 環境の人

### 補足
* PowerCMS X ユーザーでなかったとしても PHP 7.x → PHP 8.0 移行手順については参考になるかとは思います

## この記事でやること
* PHP 8.0 を nginx で動作させて PowerCMS X における実行まで見届ける


# 手順
## パッケージリポジトリの準備
* `apt upgrade` で PHP 8.0 がインストールされない場合には、以下の手続きをとる
* もしまだ以前に `ppa:ondrej/php` を追加していなければ、以下のように追加する

```sh
apt install software-properties-common
add-apt-repository ppa:ondrej/php
```

## インストール
### PHP8.0 本体
* `apt upgrade` でインストールされていれば不要

```sh
apt install php8.0
```

### 関連する他のもの

```sh
apt install php8.0-gd php8.0-fpm php8.0-mbstring php8.0-mysql php8.0-xml php8.0-zip
```

## path 確認
* 以下の path にファイルが存在していることを確認

```sh
/run/php/php8.0-fpm.sock
```

## owner, group の設定
* もし nginx ユーザーを `www-data` 以外のもの ( たとえば `nginx` など ) にしている場合は、上記 `php8.0-fmp.sock` の `owner`, `group` をそれに準じて `chown` してください。例えば以下のように

```sh
chown nginx:nginx /run/php/php8.0-fpm.sock
```

* また、以下の設定を書き換えてください

```ini:/etc/php/8.0/fpm/pool.d/www.conf
; 前略

user = nginx
group = nginx

; 中略

listen.owner = nginx
listen.group = nginx

; 後略
```

## max_input_vars の設定
* PowerCMS X 公式によると `'max_input_vars'の推奨値は2000以上` とのことなので、それに合わせて書き換えます。サーバスペック等に応じて必要な値を。

```ini:/etc/php/8.0/fpm/php.ini
; 前略

max_input_vars = 2000

; 後略
```

## PHP-FPM 再起動
```
systemctl restart php8.0-fpm.service
```

## apache2 無効化
```
systemctl disable --now apache2
```

## nginx
### 設定書き換え
* 以下のように 8.0 へ書き換える

```nginx
    # 前略

    fastcgi_pass unix:/run/php/php8.0-fpm.sock;

    # 後略
```

### 再読込
* さいごに nginx の再読込をおこなうと、ダッシュボードが表示されるようになるはずです

```sh
nginx -s reload
```

## 確認
* 以下の php を実行したときにインストール ver. が確認できます
  * いくつかのモジュール等は必須でないのでアラートが表示されていますが、必須のものだけ動いていればヨシです

```sh
https://xxxxxx.xxx/pt-check.php
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/eb903e84-7274-e0d2-5afb-bba30df8a4a0.png)


# おわりに
## 感想
* PHP 8.0 で PowerCMS X を稼働させてみましたが……管理画面内のページ遷移速度が高速すぎて笑ってしまった。これ SPA だっけ……？？　となった。
* 速いは正義。

## 関連記事
* [PowerCMSX稼働サーバをUbuntu18.04→20.04へ更新する際の注意とPHP7.4インストール手順](https://qiita.com/Hi_Noguchi/items/861fda70afb593562ab4)

## 参考記事
* [Linuxize - How to Install PHP 8 on Ubuntu 20.04](https://linuxize.com/post/how-to-install-php-8-on-ubuntu-20-04/)
[Python] 他言語からきたひとのためのPythonチートシート その1

今までPython以外の言語を使ってきたひとが、「アレってPythonでどう書くんだろう？」と悩んだときに、そっと参照するチートシートを作ろうと思いました。普段まめに勉強してこなかったひとが、テスト前に一夜漬けで作るやつ第一弾です。続きがあるかはわかりません。


環境はPython 3.9です。

自分はPythonをほとんど使ったことがないので、大ポカ書いていたらそっとマサカリください。

# ファイル名

全部小文字にします。

```
myclass.py
```

ハイフンやアンダースコアは使わない……?

# クラス名

大文字始まりのキャメルケースで書きます。

```python
class MyClass:
    pass
```

# メソッド名

スネークケースで書きます。

```python
class MyClass:
    def my_method(self):
        pass
```

# クラスコメント/メソッドコメント

クラス/メソッド定義の**後に**、`"""`で囲んで書きます。
複数行も書けます。

```python
class MyClass:
    """ 私のかわいいクラス """
    def my_method(self):
        """
        私のメソッド
        俺のメソッド
        """
```

# 継承

クラス宣言の後ろにかっこでくくって書きます。
多重継承もできます。

```python
class MyClass(MyBase1, MyBase2):
    pass
```


# ~~コンストラクタ~~ 初期化メソッド

`__init__`メソッドを定義します。

```python
class MyClass:
    def __init__(self):
        """ コンストラクタではなく、初期化メソッド selfを忘れない """
        pass
```

インスタンスを生成する真のコンストラクタは`__new__`メソッドでした。
https://docs.python.org/ja/3/reference/datamodel.html#basic-customization
@shiracamus さんありがとうございます。

# 抽象メソッド/インターフェース

`ABC`を継承します。
ABCは、Abstract Base Classの略です。

`@abstractmethod`デコレータを付けます。

```python
from abc import ABC


class MyAbstractClass(ABC):
    @abstractmethod
    def must_implement(self):
        pass
```

# アクセス修飾子

privateとかpublicみたいな、そのものずばりのものはありません。

privateなメンバーは、先頭に`__`を付けます。派生クラスで上書きできなくなります。

```python
class MyClass:
    def __my_private_method(self):
        pass
```

普通には見えなくなるだけで、このようにするとアクセスできるそうです。

```python
instance = MyClass()
instance._MyClass__my_private_method()
```



# setter/getter あるいは書き込み専用プロパティ/読み取り専用プロパティ

getterは`@property`デコレータをつけます。setterは`@プロパティ名.setter`デコレータをつけます。

```python
class MyClass:
    def __init__(self):
        self.__x = 1

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, value):
        self.__x = value
```


# void

`None` になります。

```python
def my_func() -> None:
    pass
```


# 三項演算子

1行のifで書きます。

```python
s = '偶数' if x % 2 == 0 else '奇数'
```

# 参考リンク

* [三項演算子(Python)](https://qiita.com/howmuch515/items/bf6d21f603d9736fb4a5)
Javascriptの関数定義

#WHY
javascriptのカリキュラムは終えたが、いまいちピンとこないためにアウトプットの一環として書いていきます。

-----
javascriptの関数定義を初心者なりにまとめてみます。

#function
functionを用いることで関数を定義することができる。functionに続けて<b>「関数名、（）{ }」</b>と記述していき、{}のなかに処理を書いていく。

```javascript
function 関数名( ) {
  // 処理
}

//(例)
function sayHello(){
  console.log("こんにちは")
}

sayHello()
```
コンソールでの出力
<img width="400px" alt="js1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076167/f0aa0c76-fe85-1afb-d0ea-43eea36190c4.png">

#関数宣言
このように関数名を定義し、処理を書いていく定義を<b>関数宣言</b>という。

#関数式
関数宣言は関数名を記述するのに対し、関数式の場合は、function(){}という無名の関数を<b>変数に定義または代入</b>して関数を定義する。

```javascript
変数 = function( 引数 ){
  // 処理
}
```
<br>
##無名関数
関数名なしで定義する。より簡潔なコードが記述できるというメリットがある。

```javascript
// 関数宣言
function hello(){
  console.log('こんにちは')
}

// 関数式（無名関数）
const hello = function(){
  console.log('こんにちは')
}
```

##即時関数
関数を定義すると同時に実行される。関数を定義してから呼び出すという作業を短縮することができる。

```javascript
// 無名関数
const hello = function(text) {
  console.log(text)
}
  hello("こんにちは")

// 即時関数
(function hello(text) {
  console.log(text)
})("こんにちは")
```

##アロー関数
functionの代わりに<b>「（）=>」</b>という記述によって関数を定義する。より短い記述で関数定義をできる。

```javascript
// 無名関数
const hello = function(text){
  console.log(text)
}

// アロー関数
const hello = (text) => {
  console.log(text)
}
```
-------
javascriptはrubyと違い、関数名を定義する場所に関数名だけではなく、そのまま処理を記述することが多々あります。

```javascript
//(例)
pullDownButton.addEventListener('mouseover', function(){
    console.log("mouseover OK")
  })
```

似ているようできちんと紐解いて学んでいこうとおもいます。
Visual Studio Codeでファイルを開いたらインデントを自動判定する機能を無効にする

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ Visual Studio Codeでファイルを開いたらインデントを自動判定する機能を無効にする方法

## 例

index.htmlを新規作成して、！を押しemmetでコードを表示させて保存するとふと違和感を感じます。

```html:index.html
<!DOCTYPE html>
<html lang="ja">

<head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
</head>

<body>

</body>

</html>
```

headタグの中身が5行改行されています。2行で十分だから！

下の画像が少し見ずらいかもしれませんが、右下の『スペース：5』というのが犯人です。
赤丸の部分をクリックして値を変更することもできますが、ファイルを開いた時にインデント設定を
自動判定しているようで、値を変更しても再度ファイルを開いたら値が元の数値に戻ってしまいます。

![スクリーンショット 2021-02-11 16.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/3ccbdc62-47c8-8383-06f1-59b27011305d.png)

## 対応

エディタ左下の歯車マークをクリックし『設定』を開きます。

![スクリーンショット 2021-02-11 16.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/ab65340b-3c8d-24d4-b3e7-6ff8c059ad38.png)

設定の検索に『editor.detectIndentation』と入力し、チェックを外します。

![スクリーンショット 2021-02-11 16.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/47637d8a-986a-4ce1-0f19-5809037695c3.png)

これで、スペースの所をクリックして値を変えてもエディタがインデント設定を自動判定せず
ユーザーが設定した値を保存できるようになります。
みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎：作業メモ①

本日[みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎](https://www.udemy.com/course/ios-apps/)のUdemyで学びになったことのメモ。


#iOSアプリの概要
- UIの構築、コードの記述
    - StoryboardでUIを構築
    - SwiftもしくはObjective-Cでコードを記述

Storyboard（Viewをいじる）とView Controller（Viewの制御）という概念がおもしろいと思った。
なんとなく、実装していくときのイメージが湧いた。


#Swiftの概要
- 短所
    - Optional型の記述が特に煩雑

よくわかっていないので、引き続き学ぶ（今後の講座で説明してくれるらしい）。


#XcodeのUIの名称について
![2021-02-11 14.16のイメージ 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242656/83073427-28a6-0493-4a67-f0bbc13a4a7c.jpeg)

- ナビゲーター
    - ファイル一覧
    - ファイル検索
    - エラー表示
- エディター
    - コード入力
    - 画面作成
- インスペクター
    - 各ファイルの設定
    - 画面を構成するパーツの設定
- デバックエリア（画像中にない、したからニョキッと出てくるやつ）
    - アプリの状態を監視する

![2021-02-11 15.08のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242656/95a1e5d6-a94b-4341-ba1e-6f48cba24d6b.jpeg)

- ドキュメントアウトライン
    - Viewの階層や関係性がみれる

- View
    - Viewは重ねることができ、親子関係を持つ
    - Safe Areaはステータスバーなどのアプリに使われない部分
    - これらのViewをまとめて制御するのがView Controller
    

#Autoresizingによる画面レイアウト
親のViewのサイズの変化に対応する、Viewの位置やサイズの対応を設定することができる。

![スクリーンショット 2021-02-11 15.32.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242656/95696423-6af4-1384-3284-7694ed27d789.jpeg)



#AutoLayoutによる画面レイアウト

デバイスの画面サイズの変化による、Viewの位置やサイズの変化を細かく設定することができる。


#メモ

AutoresizingとAutoLayoutの違いがまだあまりよくわかっていない。
どちらも親のViewや画面サイズの変化にともなう各Viewの位置やサイズ変更の設定ができるイメージ。

参考：
[AutoLayoutに虐げられているIOSエンジニア向け、AutoResize再考](https://qiita.com/appwatcher/items/4e08fd88bba1da41871b)
[AutoLayoutとうまく付き合うコツ](http://nsblogger.hatenablog.com/entry/2015/03/14/autolayout_tutorial)
.env

<h1>.envの使い方</h1>

apikeyなどgit-hubで公開すべきでないものは、**.envファイル**を使う。


**.envファイルを作成**
↓
**.envに隠しておきたいコードをを記載。**
※Reactで環境変数を使用する場合、環境変数名の先頭にREACT_APP_を付ける必要がある。
 参照したい場合は、「process.env.〜」で参照できる。
↓
**.git push時に、.envファイルが公開されないように、.gitignoreに.envを追加。**
↓
**push**
Macでカラーコードを調べる方法

#こんな感じ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Macでcolor codeを調べる方法<br>標準アプリで簡単にできた。。。 <a href="https://t.co/i8cBvvYTY5">pic.twitter.com/i8cBvvYTY5</a></p>&mdash; 高卒プログラマーげんと (@gento34165638) <a href="https://twitter.com/gento34165638/status/1359763671027568642?ref_src=twsrc%5Etfw">February 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#今見てる画面のカラーコードが知りたい！！

**この画像で使われてる色を再現したい！**
**でもCSSで使うカラーコード（`#ff3333`みたいなの）がわからない！**

と言うような状況って、たまーにありますよね。。。

#Mac標準アプリでできます
![スクリーンショット 2021-02-11 16.37.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/af6dcc9f-0575-1e8c-d892-be3bd6681884.jpeg)
**「Digital Color Meter」**と言うアプリで、簡単にMacの画面に表示されている色のカラーコードを調べることができます。

##カラーコードの表示方法である16進数にする
![スクリーンショット 2021-02-11 16.41.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/be9ca52a-26bc-f07d-01fa-a6c7e514d7a3.jpeg)
これで`#ff3333`みたいなカラーコードの形式になりました。

#カラーコードをコピー
カラーコードを知りたい部分にカーソルを当てた状態で`command + shift + C`を押します。

あとは貼り付けるだけでカラーコードをコピーできました！:heart_eyes: