OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFormationでVPCを構築する方法

# CloudFromationとは
CloudFormationはプログラミング言語やYAML,JSONを使用してAWSリソースを構築出来るサービスです。
AWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。

今回はYAMLで作成していきますので、JSONに変換したい方は次の記事をご参照下さい。
<a href="https://qiita.com/kazunobu2211/items/49deda949e97ea86bbf4" rel="nofollow noopener" target="_blank">YAMLからJSONに変換する方法</a>

## 構成図
![スクリーンショット 2022-11-22 19.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/680554f1-72f8-de5b-44a0-52b1f2dcd9a0.png)

## 完成したテンプレート
```:テンプレート
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  VPCName:
    Type: String
    Default: 'VPCName' 

  VpcCIDR:
    Type: String
    Default: 10.0.0.0/16

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      Tags:
        -
          Key: Name
          Value: !Ref VPCName
```
## 構築手順
### １ スタックの新規作成 
AWS CloudFormation管理コンソールから、スタックの作成をクリックし、[新しいリソースを使用(標準)]を選択。
![スクリーンショット 2022-11-22 20.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/47bb1ae7-a91c-5f62-c620-850cc285d438.png)


### ２ テンプレートアップロード 
[スタックの作成]で、[テンプレートの準備完了]を選択し、[テンプレートファイルのアップロード]>
[ファイルの選択]で、テンプレートを選択。
![スクリーンショット 2022-11-22 20.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/6334bb44-c5c2-617e-656d-a71daadb9056.png)

### ３ パラメータ入力 
各パラメータを入力します。`スタックの名前は任意の名前を入れる`
![スクリーンショット 2022-11-22 20.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/12282fcd-5e51-a948-9f79-2232e1a85565.png)

### 4 CloudFormation詳細設定 
次へを選択。`CloudFormationの詳しい設定について次の記事をご覧下さい。`
<a href="https://qiita.com/kazunobu2211/items/3fd42d5482a3331332d0#cloudformation%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86" target="_blank rel="nofollow noopener"">CloudFormationの詳しい設定について</a>

### 5 最終確認
最終確認を行い`送信`を選択
![スクリーンショット 2022-11-22 22.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/8ce53f29-daec-d456-5905-fb39a0001fda.png)

### 6 正常終了確認 
ステータスがCREATE_COMPLETEになったらスタック正常終了です。
![スクリーンショット 2022-11-22 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/990585d8-b6a0-5de4-0a15-7ff8cf6329a5.png)

## パラメータの詳細
|パラメータ名|用途|備考|
|-|-|-|
|VPCNAme|VPCの名前|例:CF-VPC|
|CidrBlock|VPCのIPv4ネットワーク範囲|例:10.0.0.0/24|

## 公式ドキュメント
<a href="https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html" target="_blank rel="nofollow noopener"">CloudFormation VPCのAWS公式ドキュメント</a>
kernel の bootargs

kernelに対するbootargsは、petalinux-config(引数なしの基本コンフィグ)からできるのだが、system-user.dtsiからもできる。

 **system-user.dtsiからやる方法をお勧めしたい。**

# なぜ？
以下の理由により、極力petalinux-configを使いたくない。ため。

1. **頻繁に設定したものが巻き戻る。** (v2020.2)
特に petalinux-config -c u-boot 。
system-user.dtsiをいじると、まず間違いなく巻き戻る。
**すごく困る。とてもとても困る。**
デバイスツリーをいじったのだから、u-bootの再構築が必要なのはわかる。
が、だからといって、設定値が巻き戻ってはいけないと思う。
たまにpetalinux-config -c kernel でも起きる。
こちらはどんなときに巻き戻るのか、特定できていない。 **さらに厄介。** 毎回確認する必要がある。
このせいで、費用にして数十万～100万程度は損害があったと思われる。
※
何かうまい回避方法をご存じの方がいらっしゃいましたら、ご教示いただけると、とてもとてもありがたいです。

2. 着目点が限定される。
「なにかいじろうかと思ったら可能な限りsystem-user.dtsi」という決まりにしておけば、ミスが起こりにくい(と、思う。)
何々をしやすいとか、分かりやすいとか、主観だよね。
万人にとっての分かり「やすい」って無いと思うんだ。

# Example
```project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
/include/ "system-conf.dtsi"
/ {

	chosen {
		bootargs = " earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/ram0 rw";
		stdout-path = "serial0:115200n8";
	};

};

```
【Mac】sedコマンドで上書きする方法

## はじめに

Macで以下のように`sed`コマンドを実行するとエラーとなります。  

```terminal
$ cat sample.txt
sample
sample
sample
sample
sample
$ sed -i 's/sample/EXAMPLE/' sample.txt
sed: 1: "sample.txt": unterminated substitute pattern
```

これを回避する方法について記載します。  

## 上書きする方法

以下のように実行することで上書きできます。

```terminal
sed -i '' 's/sample/EXAMPLE/' sample.txt
```

### `GNU sed`をインストール

上記のコマンド以外に`GNU sed`をインストールすることでエラーを回避できます。  

```terminal
brew install gnu-sed
```

インストール後に以下のように実行すると上書きできます。  

```terminal
gsed -i 's/sample/EXAMPLE/' sample.txt
```

`gsed`コマンドを`sed`コマンドとして使用したい場合には`~/.zshrc`に以下を追記します。  

```~/.zshrc
alias sed='gsed'
```
【SQL Server】業務の中でよく使用するクエリ集

私が業務の中で
SSMS(SQL Server Management Studio)上でDBの操作をしており、
そこでよく使うクエリをまとめました。

参考になれば。

##### ■バックアップを取る際
~~~ sql:
SELECT * INTO (バックアップした後のテーブル名)
FROM  (バックアップしたいテーブル名)
~~~

##### ■テーブル名があいまいで思い出せない場合、DBから検索する
~~~ sql:
SELECT
  s.name
  , t.name
FROM sys.tables t
INNER JOIN sys.schemas s
  ON t.schema_id = s.schema_id
where s.name like '(スキーマ名)'
and t.name like '(検索したいテーブル名)'
~~~
※ 上記、(検索したいテーブル名)は自分が思い出した一部分のテーブル名の前後を「%」で囲うと自分が思い出した一部分のテーブル名がついたテーブル名が一覧表示される。
 
##### ■テーブルのカラム名変更・削除時にプロシージャ―で使っているところがないか、検索する
~~~ sql:
SELECT
  sysobjects.type
  , schemas.name
  , sysobjects.name
  , sysobjects.crdate
FROM
  sys.sql modules
LEFT OUTER JOIN sysobjects
  ON sysobjects.id = sys.sql_modules.object_id
LEFT OUTER JOIN sys.objects
  ON objects.object_id = sys.sql_modules.object_id
LEFT OUTER JOIN sys.schemas
  ON objects.schema_id = schemas.schema_id
WHERE
  sys.sql_modules.definition like '検索したいカラム名'
ORDER BY
  sysobjects.name
~~~
※ 上記、(検索したいカラム名)は自分が検索したいカラム名の前後を「%」で囲うと、あいまい検索が可能。
   
##### ■テーブル・プロシージャーが張られた日時の確認
下記クエリ実行後、create_dateカラム：作成日時、modify_dateカラム：更新日時をそれぞれ確認することができる。
~~~ sql:
SELECT * FROM SYS.tables
WHERE name like '（テーブル名）'

SELECT * FROM SYS.procedures
WHERE name like '（プロシージャ―名）'
~~~


##### ■DB容量確認コマンド
~~~ sql:
set nocount on

SELECT
  name
  ,(CAST(size as bigint) * 8 /1024) - (FILEPROPERTY(file_name(fileid),'SpaceUsed')*8192.0/power(1024,2)) AS [freespace]
INTO #dbfreespace 
FROM dbo.sysfiles
where name like '%_Data%'

SELECT CONVERT(VARCHAR, CONVERT(NUMERIC(10,3),SUM(freespace))) + ' MByte' AS 空き容量 FROM #dbfreespace 

DROP TABLE #dbfreespace
~~~
【Rails】DB接続のないログイン画面でバリデーションする

## はじめに
バリデーションは，ActiveRecordの機能として実装できますが，ActiveRecordはORMのフレームワークであるため，DB接続が必要になります．
そのため，DB接続しないモデルにはActiveRecordが使えません．
今回はActiveModelを用いて，DB接続しないモデルへバリデーションを実装する方法を整理しました．

Rails初学者による記事になります．
不足，間違い等ありましたらご指摘いただけますと幸いです．

## 環境
Ruby 3.0.4
Rails 6.1.7

## やりたいこと
DBに接続しないsessionモデルで作成したログイン画面に，バリデーションを実装します．

## 実装方針
1. sessionモデルに，`ActiveModel::Model`をミックスインすることで，バリデーション機能を有効にする．
1. sessionsコントローラで，`valid?`メソッドを用いて，バリデーションをトリガする．
1. sessionsビューのnewファイルで，エラーメッセージを出力する．

## Modelでバリデーション機能を実装する
```ruby:app/models/session.rb
class Session
  include ActiveModel::Model

  attr_accessor :name, :email, :password

  validates :name, presence: true
  validates :email, presence: true
  validates :password, presence: true
end
```
ここでは`name`，`email`，`password`をログイン画面の入力項目としています．
`include ActiveModel::Model`を記述します．これによりバリデーション機能が有効になります．
詳細は[Railsガイド Modelモジュール](https://railsguides.jp/active_model_basics.html#model%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)を参照．
> `ActiveModel::Model`を`include`すると、`ActiveModel::API`のすべての機能を利用できるようになります。

## Controllerでバリデーションをトリガする
```ruby:app/controllers/session_controller.rb
class SessionsController < ApplicationController
  def new
    @session = Session.new
  end

  def create
    @session = Session.new
    @session.valid?
		（略）
	end
（略）
end
```
new, createアクションで`@session`というオブジェクトを生成します．
オブジェクトを生成しないと，後述のviewファイル内の[`errors`メソッド](https://api.rubyonrails.org/v7.0/classes/ActiveModel/Validations.html#method-i-errors)で`NoMethodError`が発生します．
また，ログインボタンが押下されたタイミングで，バリデーションを起動させるため，createアクション内に`@session.valid?`を記述します．
[`valid?`メソッド](https://railsguides.jp/active_record_validations.html#valid-questionmark%E3%81%A8invalid-questionmark)は，バリデーションをトリガするメソッドです．

## Viewでエラーメッセージを出力する
```erb:app/views/sessions/new.html.erb
<% if @session.errors.present? %>
  <% @session.errors.full_messages.each do |error_message| %>
    <ul><li><%= error_message %></li></ul>
  <% end %>
<% end %>
（略）
```
Viewファイルでは，[`errors`メソッド](https://api.rubyonrails.org/v7.0/classes/ActiveModel/Validations.html#method-i-errors)と[`full_messages`メソッド](https://api.rubyonrails.org/v7.0/classes/ActiveModel/Errors.html#method-i-full_messages)を用いて，エラーメッセージを出力します．
[`errors`メソッド](https://api.rubyonrails.org/v7.0/classes/ActiveModel/Validations.html#method-i-errors)は，エラーメッセージに関する情報を持つオブジェクトを返します．
また，[`full_messages`メソッド](https://api.rubyonrails.org/v7.0/classes/ActiveModel/Errors.html#method-i-full_messages)は，エラーメッセージを配列で返します．

## まとめ
DB接続しないモデルのバリデーションは，「モデルに`ActiveModel::Model`をミックスインし，コントローラで`valid?`メソッドを用いてトリガする」ことで実装できます．

以上です．
至らない点あればご指摘いただければと思います．


## 参考記事
[Railsガイド Modelモジュール](https://railsguides.jp/active_model_basics.html#model%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
[Railsガイド Active Record](https://railsguides.jp/active_record_basics.html#active-record%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
[Rails4 DB連携なしモデルでバリデーション機能を使う](https://qiita.com/metheglin/items/1cb602ae8bd18c0ef0f0)
[RailsでDBと連携しないModelを作成する](https://qiita.com/Esfahan/items/4954b0eb474a81b34258)
juliaで出力したcsvファイルをpython numpyで呼び出す

最近研究でjuliaのコードを見ることがあり、juliaで出した結果とpythonの結果を見比べることがありました。
しかし、juliaで出した結果をそのまま読み込むライブラリが無かったので読み出し方をメモっておきます。

# juliaのプログラム
juliaのプログラムで次のようなcomplex配列を作る。
```julia
using CSV, DataFrames
# 出力する配列の作成
test_matrix = zeros(ComplexF64,8,8)

# 要素の代入
test_matrix[3,3] = 1 + 3im

# 配列をデータフレームに変換して出力
ham = DataFrame(test_matrix,:auto)
CSV.write("test.csv",ham,writeheader=false)
```
これを見てみると
```
0 + 0im,0 + 0im,...
0 + 0im,0 + 0im,...
```
こんな感じになっており、numpyで直接は呼び出せない。
# 呼び出しプログラム
そこで、次のようなプログラムを作成して呼び出した。
``` python
import numpy as np

def get_julia_csv(filename):
    with open(filename,"r") as f: # ファイルから読み込んで2次元リストにする
        elems = [line.split(",") for line in f.read()[:-1].split("\n")]
    res = []
    for line in elems:
        lineres = []
        for elem in line:
            real,_,imag = elem.split(" ") # julia の形式 x + yimをsplitする
            lineres.append(float(real)+float(imag[:-2])*(1j if _=="+" else -1j)) # complex型として作成
        res.append(lineres)
    return np.array(res) # numpyの配列にして戻す
```

良かったら使ってあげてください
【Git】rebaseとは

# rebaseとmergeの違い
- rebaseとは
    - コミット履歴をきれいにして、マージすることができる
    - ブランチが一つになる代わりに最終コミットの一意な値が変わってしまう

- mergeとは
    - 単純な統合なので「マージコミット」として１つ追加される
    - コミット自信が一意の値を保持していて、その値は書き換わらない

- rebaseをした際に強制プッシュが必要な理由
    - 一度プッシュしたブランチでrebaseを行うとコミットが改変されるため再度プッシュできなくなる
    - 複数人で同じブランチを共同で開発することで生じるコミットログの複雑さをシンプルにするため。

![マージの図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647183/6d1fe001-839c-5110-b39a-658b7468b8d0.png)
![リベースの図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647183/3ade2731-c762-f2df-0c89-4be9879ca8dd.png)
Linux参考サイト

# 参考動画

https://www.youtube.com/watch?v=BYGwlPCn5nU

https://www.youtube.com/watch?v=_FdOXgLKywk

https://www.youtube.com/watch?v=Y6xbBQaKkug

https://www.youtube.com/watch?v=IcGNJVmRPo0

https://www.youtube.com/watch?v=OMpYROINV8Q

https://www.youtube.com/watch?v=7Z8ibl3MCwQ

https://www.youtube.com/watch?v=kxjrd2faZMM


# 参考サイト

http://www.redout.net/data/command.html


https://www.infraeye.com/study/studyz4.html


https://qiita.com/4EAE_Learner/items/01cd1a63aa7f5022c7d4


https://qiita.com/nico4316/items/531c0adc42916d5c2c9b

https://atmarkit.itmedia.co.jp/ait/articles/1612/01/news177.html

https://infracollege.vamdemicsystem.black/linux/

https://centossrv.com/

https://qiita.com/yasushi-jp/items/01b4829a36272954719f

https://xtech.nikkei.com/it/article/COLUMN/20060224/230579/?rt=nocnt


https://www.sejuku.net/blog/57668


https://oxynotes.com/?p=5987#1


https://www.linuxmaster.jp/linux_skill/2010/02/06linux.html


https://qiita.com/ydah/items/18d242b632e5486fe912


https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff


https://qiita.com/progrunner/items/d2ab0a85b3881a4b7ed8
ブラインドタッチができるようになりたい！！

## ①はじめに
　学生から社会人になってから定時に帰るべく日々の業務効率化を考えたとき、タイピングスピードを上げることが一番の効率化ではないかと考えました。
　その時にブラインドタッチができるようになるまでのまとめサイトがなかったことから情報を纏めてみました。


## ②この記事を読むと分かること
- タイピングスピード向上をするための情報がわかる
- ブラインドタッチができるようになるためのヒントとなる情報がわかる
- 初めてQiita記事を書くため、どのレベルで書けばよいのかが参考としてわかる

## ③本文
- 私が使用したタイピング練習サイト

 1. [**寿司打**](#1寿司打)　
 1. [**e-typying**](#2e-typying)　
 1. [**Popタイピング**](#3popタイピング)
 1. [**KeyTube**](#4keytube)　
 1. [**オマケ**](#5オマケ)

##### 1.**寿司打**　
　難易度：★★
　習熟度：★
　https://sushida.net/

言わずと知れた有名サイトです。
小中学生の時にこのサイトをやらされた記憶があるのではないでしょうか？
タイピングの練習といえばこのサイト。


##### 2.**e-typying**
　難易度：★★
　習熟度：★★★
　https://www.e-typing.ne.jp/

私はこのサイトをよく活用しています。
腕試しレベルチェックや専門用語によるタイピングなど
たくさんの種類にてタイピング練習が行えるため飽きずに練習が行えます。
初心者にはしりとりゲームがおすすめです。


#####  3.**Popタイピング**　
　難易度：★
　習熟度：★
　http://typingx0.net/pop/

1分間でどれだけ多くのポップコーンを召喚できるかに挑戦するゲームです。
手軽にタイピング練習が行える点が良いと思います。


#####  4.**KeyTube**　
　難易度：★★★
　習熟度：★★
　https://keytube.net/

Youtubeにある好きな曲でタイピング練習が行えます。
自身の好きな曲を練習できるためモチベーションを維持できます。
ただし、スピードが速く難易度が高いため初心者にはおすすめできません。
タイピングに慣れてきたらやることをおすすめします。


#####  5.**オマケ**
ブラインドタッチができるようになるために以下のフレーズをひたすら無心に練習することもおすすめです。
 
 **「パーキングエリアじゅうで、ファンはずっと湯花を蒸す」**

このフレーズは全ての母音・子音キーを1回以上入力しないと完成しないため
意味が分からなくても勝手に全ての母音・子音キーを練習することができます。
　※打つのに慣れてきて余裕が生まれてからはキーボードを見ないように意識して練習しましょう

参考：https://atarimae.biz/archives/1673

****
##### [topへ戻る]()
CloudFormationで新規スタックを作成する方法

# CloudFormationとは
CloudFormationはプログラミング言語やYAML,JSONを使用してAWSリソースを構築出来るサービスです。
AWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。

# CloudFormationスタック新規作成手順
### 1 スタック作成 
AWS CloudFormation管理コンソールから、スタックの作成をクリックし、[新しいリソースを使用(標準)]を選択して下さい。
![スクリーンショット 2022-11-22 20.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/47bb1ae7-a91c-5f62-c620-850cc285d438.png)


### ２ テンプレート選択 
[スタックの作成]で、[テンプレートの準備完了]を選択し、[テンプレートファイルのアップロード]>
[ファイルの選択]で、テンプレートを選択します。
![スクリーンショット 2022-11-22 20.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/6334bb44-c5c2-617e-656d-a71daadb9056.png)

### ３ パラメーター値入力 
各パラメータを入力します。`スタックの名前は任意の名前を入れて下さい`
![スクリーンショット 2022-11-22 20.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/12282fcd-5e51-a948-9f79-2232e1a85565.png)

### 4 スタックタグ入力 
スタックにタグを付与したい場合は入力下さい
![スクリーンショット 2022-11-22 20.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/1ba78b6d-bf29-c31f-8c2e-6e25c011e770.png)

### 5 アクセス許可
スタック実行時に必要なロールを自動で付与したい場合は空欄にして下さい。
![スクリーンショット 2022-11-22 21.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/ff19f316-4f8c-dcfe-3511-883572fcd868.png)

### 6 スタックの失敗オプション 
スタックが失敗した場合に、正常に作成さえれたリソースを保持するか削除するかどうか
![スクリーンショット 2022-11-22 21.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/1dbed758-5556-baa0-b645-eb8dd554b909.png)

### 7 スタックポリシー 
スタックの更新を制限したい場合は追加して下さい。
![スクリーンショット 2022-11-22 21.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/6fa80130-3090-7161-5bba-508016fa7eb4.png)

### 8 ロールバック設定
スタックの作成および更新時にCloudWatchアラームを設定して、スタック作成,更新後に特定の時間以内にアラームが発生した場合ロールバックする。
![スクリーンショット 2022-11-22 21.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/85b74928-9339-48c1-7b52-b9b4d12d5cde.png)

### 9 SNS通知 
スタックの作成、更新時にSNS通知が必要な場合は設定して下さい。
![スクリーンショット 2022-11-22 21.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/58038c65-4695-994a-55b8-7efd6d77e491.png)

### 10 スタックの作成オプション
スタックの作成時間に制限が必要な場合は設定して下さい。
![スクリーンショット 2022-11-22 21.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/7d6803d6-50c6-faf8-6680-7916f531a7e3.png)

### 11 確認 
上記の設定が終了しら`次へ`を選択して下さい。
![スクリーンショット 2022-11-22 22.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/f4960a72-75d5-f582-e799-a85c282b658c.png)

### 12 最終確認 
終了したら送信を選択して下さい。
![スクリーンショット 2022-11-22 22.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/bd027601-80c8-070a-08c3-f1ee4ec91083.png)

### 13 スタック正常終了確認 
ステータスが`CREATE_COMPLETE`になったらスタックが正常終了しました。
![スクリーンショット 2022-11-22 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/81d20c09-e5bb-db59-0654-24c78ab1a73d.png)
【解決】EC2にてアセットファイルをコンパイルしたときにエラーが出た。


アセットファイルをコンパイルしたときにエラーが出ました。
手こずりましたが、いろいろ調べて解決することができたので、記録したいと思います。



```rails:ターミナル
$ rails assets:precompile RAILS_ENV=production
```

```rails:ターミナル
yarn install v1.22.19
[1/5] Validating package.json...
error furima_38288@0.1.0: The engine "node" is incompatible with this module. Expected version "14.20.0". Got "14.21.1"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

上記のようにエラーが表示されました。
# エラーの原因
調べた結果、Node.jsのバージョンが非互換であることが原因だと仮説を立てました。

```
Expected version "14.20.0". Got "14.21.1"
```

この文章から、
現バージョンが、"14.21.1"であることがわかります。

念のため確認
```rails:ターミナル
$ node -v
```
```rails:ターミナル
v14.21.1
```

これを"14.20.0"に変更すると解決するのでは？と考えました。

AWSのEC2上でNode.jsのバージョンをアップデートしたいとき
→nvmを使用する。

# nvmの説明
nodeのバージョン管理ソフトウェアのこと。
Node Version Managerの略。

npm(node package manager)も包括していて、バージョンを切り替えるとそれに合ったnpmが適用されます。

# 手順① nvmをインストールする
curlコマンドでインストールします。

https://github.com/nvm-sh/nvm/blob/master/README.md#installing-and-updating
こちらを参考に、ターミナルでコマンドを実行しました。

```rails:ターミナル
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
```


# 手順② nvmを使えるように設定をする
```rails:ターミナル
. ~/.nvm/nvm.sh
```

# 手順③ Node.jsをインストールする
```rails:ターミナル
$ nvm install 14.20.0
```
今回私は、バージョン"14.20.0"をインストールしたいのでこのように記述しています。

```rails:ターミナル
Checksums matched!
Now using node v14.20.0 (npm v6.14.17)
```
このように返ってきました。



# 手順④ 現在のバージョンを確認する
```rails:ターミナル
$ node -v
```
```rails:ターミナル
v14.20.0
```
無事に指定したバージョンに変更することができました。


このあと、実行したかった
$ rails assets:precompile RAILS_ENV=production　コマンドを実行し、無事にアセットファイルをコンパイルすることに成功しました。


調べ方が下手くそだったのか、結構時間がかかってしまいました。
誰かの参考になれば嬉しいです。




参考文献
https://qiita.com/shinjimjim/items/905885f797465db09504
ありがとうございました。
PlayFabにおけるAPI呼び出し制限について

PlayFabのAPIを使用する際、呼び出し制限が存在します。
この記事では、ドキュメントなどで言及されていない制限を含めて雑にまとめています。
※間違ったことを書いてしまっているのを発見した場合、お伝えください！

# 前情報
じつはPlayFabのAPI呼び出し制限について触れられている、素晴らしい記事があります。
こちらの記事にも情報が記載されているので、気になる方は見てみてください～

https://qiita.com/nikaera/items/a7d65e9fcae20a42123a

# 管理画面に表示される制限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/2b61488d-048a-0b71-c765-225c4a0fde2d.png)

PlayFabのタイトルを選択、左上の歯車マークから`タイトルの設定`→`制限`を選ぶと各種制限の現在の状態が確認できます。
この中の二つがAPI呼び出し制限に関わるものです。
- Cloud Script execution time (API call)
    - 1回のCloudScript呼び出しにかかる時間が10秒を超えていないかどうか
- Cloud Script execution API requests issued
    - 1回のCloudScriptの`ExecuteCloudScript`呼び出し内で呼ばれる(Server)API呼び出しの回数が25回を超えているかどうか


# ドキュメントや管理画面から読み取れないAPI呼び出し制限
こちらは、主にフォーラムにPlayFab公式スタッフの方が回答しているものをまとめたものです。

## Server APIは10秒間に1000コールまで
こちらは前出の記事でも触れられていました。
ソースのフォーラム投稿はこちら。

https://community.playfab.com/questions/30828/server-api-limitations.html

- プレイヤーごとのAPI呼び出しは1分間に数回までであるべき
- もし10秒間に1000回より高い制限にしたい場合は、エンタープライズ契約をしてから制限について相談できるかもしれない
- 厳密に1000コールではなく、より多く呼ぶことができる場合もある

## Client APIは2分間に1000コールまで

https://community.playfab.com/questions/64951/api-request-limits.html

## 考察
Server APIとClient APIで対応が分けられているようなので、Client APIが使用できる場合はそちらを使用、それ以外はServer APIを使うと分散出来て良いかもしれません。
AWS認定クラウドプラクティショナー合格に向けて Day0

# はじめに
長期インターンシップで掲げた目標にAWS認定クラウドプラクティショナー合格があります。
合格に向けてどのように勉強したのかTIL(Today I Learn)としてQiitaを活用して残したいと思います。
クラウドプラクティショナーだけに止まらずソリューションアーキテクトなどAWSの知識を増やして証明していきたいです。

# 使用経験
**ほぼ0**
- 去年のサマーインターン(5days)で少し触れた(Lamda,IAM,dynamoDBなど使ったが全く覚えていない)
- 現在の長期インターンシップで少し使用(S3を利用している程度)

0から頑張ります！
# 受験日
2022/12/15(木)
現在(2022/11/22)ですが間に合うのか...間に合わせます！
[AWS認定再受験無料キャンペーン](https://pages.awscloud.com/TrainCert-Japan-PearsonVUE-Retake-Terms-and-Conditions-2022.html)を利用して申込をしました。
逃げるわけではないですが保険があるに越したことはないですからね。
# 使用予定の教材
- [Udemy](https://www.udemy.com/course/ok-aws-e/)
    - AWSの理論知識
    - ハンズオン
    - ミニテストと模擬試験
- [公式のサンプル問題](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)

足りなければ適宜調べたり購入しながら勉強を進めていく

# Advent Calendar 2022への意気込み
完走賞を目指してまずはこの[1人アドベントカレンダー](https://qiita.com/advent-calendar/2022/ayako)を完成させられるようコツコツと頑張ります。

他にも
- [KDDI Engineer&Designer Advent Calendar 2022](https://qiita.com/advent-calendar/2022/engineer-designer)
- [Figmaを使ったコラボレーションUPの方法（社内・チーム内等）by Figma Advent Calendar 2022](https://qiita.com/advent-calendar/2022/figma)

に参加しているのでクリスマスにかけてアウトプット集中していきます！！

次の記事は➡️[AWS認定クラウドプラクティショナー合格に向けて Day1](https://qiita.com/Ayako_0224/items/b99d552fa100aca8ec4a)
HTMLとCSSとJavascriptで右クリックメニューを作成する

# 右クリックメニューをHTMLとCSSとJavascriptで作る
【ソースコード】
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>右クリックメニュー</title>
</head>
</body>
<div class="contextmenu">
        <div>コピー</div>
        <hr>
        <div>戻る</div>
        <div>進む</div>
        <div>再読み込み</div>
</div>
<!-- 本文 -->
<div class="wrapper">
    <h1>Hello World!</h1>
    <ul>
        <li>リスト1</li>
        <li>リスト2</li>
        <li>リスト3</li>
        <li>リスト4</li>
    </ul>
</div>
</body>
```
```css:style.css
* {
    margin: 0;
    padding: 0;
}

.contextmenu {
    position: fixed;
    z-index: 99;
    background: #fff;
    color: #555;
    font-size: 11px;
    user-select: none;
    box-shadow: 2px 2px 2px 0 #8f9091;
    border: 1px solid #c6c6c6;
    padding: 0;
    padding-top: 4px;
    padding-bottom: 4px;
    margin: 0;
    outline: 0;
    display: none;
}

.contextmenu div {
    box-sizing: border-box;
    display: block;
    padding: 8px 8px 8px 28px;
    width: 250px;
    position: relative;
    cursor: default;
    font-size: 11px;
    font-family: sans-serif;
}

.contextmenu div:hover {
    background: #ebebeb;
}

.contextmenu hr {
    border: 1px solid #e9e9e9;
    border-bottom: 0;
    margin-top: 5px;
    margin-bottom: 5px;
}
```
```js
const contextmenu = document.querySelector('.contextmenu');
const wrapper = document.querySelector('.wrapper');

wrapper.addEventListener('contextmenu', (e) => {
    contextmenu.style.left = e.pageX + 'px';
    contextmenu.style.top = e.pageY - scrollY + 'px';
    contextmenu.style.display = 'block';
});

wrapper.addEventListener('click', () => {
    contextmenu.style.display = 'none';
});
```
コピペ使用OKです！多少のバグは自分で直してください
(参考: <https://www.sejuku.net/blog/92015>)

## プレビュー
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="qBKxYLb" data-user="sandoitti" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sandoitti/pen/qBKxYLb">
  Untitled</a> by sandoitti (<a href="https://codepen.io/sandoitti">@sandoitti</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
DriveAppオブジェクトでの getFolderById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。がでた

手動でファイルを指定してGoogledriveの共有リンクを取得して
スプレッドシートに記載し
GASでファイルIDを取得するために
https://drive.google.com/file/d/〇〇〇〇〇/view?usp=sharing
の部分の/view?usp=sharingを見つけて削除するものを書いていたのですが
突如動かず、、、
![kink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624933/a19e7512-c019-66b9-3701-219239c5e2bd.png)


共有リンクを取得してみてみると
https://drive.google.com/file/d/〇〇〇〇〇/view?usp=share_link
となっておりました。

その部分を変更してなおりました。

リンク変更のドキュメントなどご存じの方いらっしゃいましたらご教示いただけると幸いです。

追記：2022/11/22 22:43
共有からリンクを取得した場合は、
https://drive.google.com/file/d/〇〇〇〇〇/view?usp=sharing
でした。。。
![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624933/bceb0cd7-7298-272e-be3b-ef82785ef0bf.png)
リンクをコピーする動作により変わるようです。
Visual Studio Code入門

# 参考動画

https://www.youtube.com/watch?v=PdcJJo06AiQ

https://www.youtube.com/watch?v=e3DmHK2PDGA&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n


https://www.youtube.com/watch?v=N9lr0BPXqlA&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=3

https://www.youtube.com/watch?v=t7LvE06cyIY&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=4&


https://www.youtube.com/watch?v=bJJVl4x9kz4&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=5


https://www.youtube.com/watch?v=6PmS5zM1TwA&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=6

https://www.youtube.com/watch?v=_Cmd3o8UtWM&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=8


https://www.youtube.com/watch?v=vMZ0C06soxA&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=8

https://www.youtube.com/watch?v=pTMWpGjLux8&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=9


https://www.youtube.com/watch?v=xu5AfIDyey8&list=PLh6V6_7fbbo8GHGIT2YUN56OcwEpz5I5n&index=10


https://www.youtube.com/watch?v=cNyvefTJOcM




https://www.youtube.com/watch?v=csOaPNMDEwg


# 参考サイト

https://togetter.com/li/1357983


https://dev.classmethod.jp/articles/vscode-awesome-things/



https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be


https://qiita.com/Yuta_Yamamoto/items/fbeb7b31173b3e787fc2


https://forest.watch.impress.co.jp/docs/review/1193/268/index.html


https://coliss.com/articles/build-websites/operation/work/vscode-shortcuts-to-make-coding-faster.html


https://qiita.com/C3REVE/itms/273646ad028e98758e70

https://ascii.jp/elem/000/004/117/4117082/
[Day1] JavaScriptの導入

本記事は一人アドベントカレンダー企画の一つです。
[30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー](https://qiita.com/advent-calendar/2022)

[JAVASCRIPT.INFO](https://ja.javascript.info/)を元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
２５日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。


## 1.1 JavaScript入門
### 知らない単語
- スクリプトとは
    - 機械語への変換を専用のソフトウェアが自動で行ってくれる、プログラムを即座に実行できるもの
- プレーンテキストとは
    - 文字だけで、他の情報は含まないデータ。例えば「メモ」など
- コンパイルとは
    - 人間が書いたソースコードを機械語に変換する
- エンジンとは
    - 特定の処理を行うための機能を提供する、処理装置
- NSAとは
    - National Security Agencyの略、アメリカ国防総省の情報機関
- Same Origin Policyとは
    - セキュリティの仕組みで、異なるオリジンのリソースへのアクセスを制限する
- オリジンとは
    - URLの「スキーム」「ホスト」「ポート」の3つが組み合わさったものが「オリジン」である
- インターフェイスとは
    - 異なる機器やシステム間でやり取りする場合、その間をつなぐ規格や機能のこと
- シンタックスシュガーとは
    - プログラミングにおいて、処理や意味を変えずに、本来よりも簡単な書き方で表すこと

### 学んだこと
- JavaScriptとは「Webページを活かすため」に作られた

- JavaScriptでできる事
    - ページにHTMLを追加したり、コンテンツやスタイルを変更する
    - マウスやポインターの動きに反応する
    - サーバーへリクエストを送り、ファイルのアップロードやダウンロードをする
    - クッキーの取得や設定、アラートの表示などをする
    - データを記憶する

- JavaScriptでできない事
    - OSのシステムに直接アクセスできない
    - 他サイトからデータを受信することは制限されている

- JavaScriptの特に良い点
    - HTML/CSSとの連携
    - ほぼ全てのメジャーブラウザでサポートされている

### 感想
- jqueryを勉強したので、JavaScriptとできる事、できない事が似ていると思った。

## 1.2 マニュアルと仕様
### 知らない単語
- parseInt関数とは
    - グローバル関数のひとつ、返り値は文字列を整数に変換した値

### 学んだこと
- JavaScriptは開発中の言語なので、定期的に新しい機能が追加される

### 感想
- マニュアルの種類が多い。また、昔からある言語が、未だに開発中で定期的に新機能が出るからこそ、様々なプログラミング言語のベースになっているのだと思った

## 1.3 コードエディタ
### 知らない単語
-  IDEとは
    - Integrated Development Environmentの略。ソフトウェア開発に必要な機能を一つに組み合わせ、生産性を向上させる

### 学んだこと
- コードエディタはプログラマが最も時間を費やすもの
エディタには無料や有料、用途に応じた様々な種類のものがあるので、自分に合ったものを使用する

### 感想
- 私はいつも、Visual Studio Codeを使っていてとても使いやすいと思っているが、せっかく色々な種類のエディタがあるのだから、他のエディタも触ってみて自分に合うエディタを探そうと思う。

## 1.4 開発者とコンソール
### 知らない単語
-  デバッグとは
    - プログラム内のバグを見つけて修正する作業の事

### 学んだこと
- ブラウザにはエラーを確認したりスクリプトに関する情報を得るために、「開発者ツール」が組み込まれている
大抵の人はChromeかFirefoxを利用する。「開発者ツール」には、エラーを発見する以外にも様々な機能がある

### 感想
- 実際にコードを書いている時に、開発者ツールを使用してエラーを発見できるのはとても便利だと思う、
今後使用していきたいと思う。

# 最後に
- JavaScriptは様々な言語のベースになっているので、今後他の言語を学んでいく為にも、今回のアドベントカレンダーを機にしっかり理解していきたい。
no followタグに対抗するSEO対策

SNS(主にtwitter)からのサイト流入はno followタグによってSEOには基本的には影響がないですが、それをSNSを使い別の方法でSEO順位の上昇を試みた検証結果です。

SNSにそのまま自分のサイトhttps://torunecoin.com/sign-up-bonus

を載せると当然no followになってしまうので、今回はSNS上で自分の狙っているキーワード＋自分のサイト名で検索して下さいというプレゼント企画をして検証をしました。

検証ツイート
https://twitter.com/torunecoin/status/1594464895948718081

これの企画を連続で開催→一旦やめるを繰り返した結果、SEO順位は確実にあがる事がわかり、かつサジェストに狙っているワード＋自分のサイト名が表示される事がわかりました！

しかしながら、イベントを終了すると効果はなくなるので常に一定間隔でイベントを開催する必要があります。

期間としては、2日に1回開催がコスト的に良く私は月に30万円以上コストがかかっています。

また、ビックワードでは検索数で勝てない可能性がありその場合は効果は薄いと推測しています。
boot.scrの「ロード先」アドレス設定

ここで述べるのは、boot.scrの **「ロード先」** の話題である。
 **「ロード元」** ではない。

# 結論
参考となる基本的なアイデア：
[AR# 75730: 2020.x ～ 2021.x PetaLinux: U-Boot distro boot で platform-top.h が機能しない](https://support.xilinx.com/s/article/75730?language=ja "")

上記サイトではCONFIG_EXTRA_ENV_SETTINGSをオーバーライドしているが、同様の仕組みを利用してENV_MEM_LAYOUT_SETTINGSをオーバーライドし、scriptaddrを変更する。

# Example
scriptaddr= *0x09000000* の、 *0x09000000* を要件に合わせる。
```<plnx-proj-root>/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h
#include <configs/xilinx_zynqmp.h>
/* >>>
 * with reference to :
 * <https://support.xilinx.com/s/article/75730?language=en_US>
 */
/*#include <configs/platform-auto.h>*/

#ifdef ENV_MEM_LAYOUT_SETTINGS
#undef ENV_MEM_LAYOUT_SETTINGS
#endif
#define ENV_MEM_LAYOUT_SETTINGS \
	"fdt_high=10000000\0" \
	"fdt_addr_r=0x40000000\0" \
	"fdt_size_r=0x400000\0" \
	"pxefile_addr_r=0x10000000\0" \
	"kernel_addr_r=0x18000000\0" \
	"kernel_size_r=0x10000000\0" \
	"scriptaddr=0x09000000\0" \
	"ramdisk_addr_r=0x02100000\0" \
	"script_size_f=0x80000\0" \

```
【備忘録】pythonプログラミングメモ

# pythonプログラミングメモ

### List 型の変数へのアクセス


```python
list_neta = ["maguro","ika","ebi",'tako','suzuki','hirame','tai','ikura','uni',"aji"]
```

listのインデックスは「0」から始まることに注意。


```python
list_neta[1:3]
```




    ['ika', 'ebi']




```python
list_neta[:8]    # 最初から8列目まで
```




    ['maguro', 'ika', 'ebi', 'tako', 'suzuki', 'hirame', 'tai', 'ikura']




```python
list_neta[3:]   # 4列目から最後まで 
```




    ['ika', 'ebi', 'tako', 'suzuki', 'hirame', 'tai', 'ikura', 'uni', 'aji']




```python
list_neta[::-1]   # 最後の列から逆再生
```




    ['aji',
     'uni',
     'ikura',
     'tai',
     'hirame',
     'suzuki',
     'tako',
     'ebi',
     'ika',
     'maguro']




```python
list_neta[2:8][::-1]   # 3列目から７列目まで抽出して逆再生
```




    ['ikura', 'tai', 'hirame', 'suzuki', 'tako', 'ebi']



### appendとextendの違い


```python
a = list(range(1,4))
```


```python
a.append([1, 2])
```




    [1, 2, 3, [1, 2]]




```python
a.extend([1, 2])
```




    [1, 2, 3, 1, 2]



### 制御構文

##### if文


```python
# 基本形
a = 2
if a == 2:
    print('a is 2')
elif a <= 0:
    print('a is less than and equal to 0')
else:
    print('a is something else')
```

    a is 2
    


```python
# 1行で書くことも可能
print('a is 2') if a == 2 else print('a is NOT 2')
```

    a is 2
    

##### for文


```python
# 基本形
colors = ['red', 'blue', 'green', 'yellow', 'white']
colors_png = []
for color in colors:
    color_png = color + '.png'
    colors_png.append(color_png)
colors_png
```




    ['red.png', 'blue.png', 'green.png', 'yellow.png', 'white.png']




```python
# リスト内包表記（推奨）
[color + '.png' for color in colors]
```




    ['red.png', 'blue.png', 'green.png', 'yellow.png', 'white.png']




```python
# enumerate
a = ["prius", "crown", "prius", "prius", "crown"]
b = [10, 20, 30, 40, 50]
c = 0
for idx, car in enumerate(a):
    if car == "prius":
        c += b[idx]
print(c)
```

    80
    

## lambda 関数


```python
(lambda a,b:a*b)(3,5)
```




    15
公開鍵を複数作ってサイトによって変える（メモ）

## サイトによって公開鍵を変えたい
- 登録してるメールアドレスがサイトによって違うから公開鍵何個か使い分けたい。

## 環境
- mac
- zshが標準シェル

## 公開鍵の作成と設置（１個目）
1. terminal起動
1. 以下コマンドでSSHキーの作成
``` 
$ ssh-keygen -C "自分のメールアドレス"
```
3.　以下のように好きなパスワードを作るように言われるので入力する（後でgithubとかからcloneしてくるときに求められるパスワードになる） 
```
Enter passphrase (empty for no passphrase):  //パスワードを入力
Enter same passphrase again:  //再入力
```

4.　作った公開鍵をコピーする(これ等符号の向き間違えると公開鍵の内容が消える)
```
pbcopy < ~/.ssh/id_rsa.pub
```

５．今コピーした公開鍵を使いたいサイトの該当場所にペーストして登録してくる。

## 公開鍵の作成と設置（２個目）
1. terminal起動
2. ~/.ssh/ に移動

```
$ cd ~/.ssh/
```

3.　以下コマンドでSSHキーの作成
``` 
$ ssh-keygen -C "自分のメールアドレス（さっきと違うメールのハズ）"
```

4.　１個めの公開鍵と違う名前のファイルに２個目の鍵を保存しないといけないので、２個目の鍵用のファイル名前を好きに付ける（xxxxの部分）
```
Enter file in which to save the key (/Users/ts/.ssh/id_rsa): xxxxxx
```

5.　以下のように好きなパスワードを作るように言われるので入力する（後でgithubとかからcloneしてくるときに求められるパスワードになる） 
```
Enter passphrase (empty for no passphrase):  //パスワードを入力
Enter same passphrase again:  //再入力
```

6.　作った公開鍵をコピーする(等符号の向き間違えると公開鍵の内容が消える)
```
pbcopy < ~/.ssh/xxxxxx
```

7.　今コピーした公開鍵を使いたいサイトの該当場所にペーストして登録してくる。

## どっちサイトでどっちの鍵使ってるのかmacに教えてあげる

1. config開く
```
vim ~/.ssh/config
```

2.　以下のような感じで入力して保存

例：
```
Host amazon.com                 //サイトのドメイン（１個目）
    User yamadataro             //サイトでのユーザー名
    IdentityFile ~/.ssh/id_rsa　　　//このサイトに登録した鍵のファイルパス
    IdentitiesOnly yes
Host github.com　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//サイトのドメイン（２個目）
    User yamada                 //サイトでのユーザー名
    IdentityFile ~/.ssh/xxxxxx  //このサイトに登録した鍵のファイルパス
    IdentitiesOnly yes
```

【参考】
vim開いたら、
i ... 入力できるようになる
:q ... 保存せずに閉じる
:wq ... 保存して閉じる
escキー ... 入力やめる

3.　terminalを完全に閉じてまた立ち上げ直す。



おしまい
Ruby on railsインストール　opensslでハマった話※Mac

## 1.rbenvインストール
```
brew install rbenv
```
```
rbenv install 3.1.2
```
テスト用フォルダ作成
```
mkdir ~/ruby-test
cd ~/ruby-test
```
テストフォルダへruby反映
```
rbenv local 3.1.2
rbenv rehash  
```
反映確認
```
ruby -v
```

rails インストール※bundlerはインストール済み
```
gem install rails
```
しかし、、
```
ERROR:  While executing gem ... (Gem::Exception)
    OpenSSL is not available. Install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources
```
opensslが利用できないとのことなので
```
brew link openssl --force
```
しかし、
```
Warning: Refusing to link macOS provided/shadowed software: openssl@3
If you need to have openssl@3 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> ~/.zshrc

For compilers to find openssl@3 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@3/include"

For pkg-config to find openssl@3 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
```
言う通りに実行
```
echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
```
再度実行するが変わらない。。
```
brew link openssl --force

Warning: Refusing to link macOS provided/shadowed software: openssl@3
If you need to have openssl@3 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> ~/.zshrc

For compilers to find openssl@3 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@3/include"

For pkg-config to find openssl@3 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
```
色々試したがわからなかったので、再度rubyインストール
```
rbenv install 3.1.2
```
別ディレクトリを作成
```
mkdir ruby-test2
cd ruby-test2
```
今度はディレクトリ指定ではなく、globalにしrailsインストール
```
rbenv global 3.1.2
gem install rails 
```
おっ！
```
Fetching thor-1.2.1.gem
Fetching method_source-1.0.0.gem
Fetching concurrent-ruby-1.1.10.gem
Fetching tzinfo-2.0.5.gem
Fetching i18n-1.12.0.gem
・
・
・
Installing ri documentation for rails-7.0.4
Done installing documentation for zeitwerk, thor, method_source, concurrent-ruby, tzinfo, i18n, activesupport, nokogiri, crass, loofah, rails-html-sanitizer, rails-dom-testing, rack, rack-test, erubi, builder, actionview, actionpack, railties, mini_mime, marcel, activemodel, activerecord, globalid, activejob, activestorage, actiontext, mail, actionmailer, actionmailbox, websocket-extensions, websocket-driver, nio4r, actioncable, rails after 45 seconds
35 gems installed
```
インストールできた！

原因は特定できていないけど、一旦これでテストアプリ開発しようと思います。

。。。続く
文字列中の複数の文字列を同時に置換

文字列中で置換したい文字列が複数あるとき、.replace() メソッドを連ねて書くことが多いですが問題もあります。先にreplaceされて出てきた文字列があとのreplaceで対象になってしまう現象ですね。
これがあるので、例えば二つのワードを相互に入れ替えるというのがそう簡単ではありません。
```python
"YES NO YES NO".replace("YES", "NO").replace("NO", "YES")

==> "YES YES YES YES"
# 相互入替になってくれていない！
```

str.translateというメソッドは同時置換ができるので目標にやや近いのですが、置換対象が文字列でなくて文字なので、2文字以上の文字列を対象にできず、利用シーンは限られます。

カッとなって同時置換してくれるモジュールを作ったので、ご入り用の際はご活用ください。Python2/3両対応で作ってあります。

```python
import re

def multi_replace(string, mapping):
    """
    文字列中の複数の文字列やパターンを同時に置換します。
    .replace を連ねる場合と違い、ある置換結果がさらに別の置換を受けてしまうことはありません。
    よって二つのワードを相互に入れ替えることもできます。

    mapping: 検索対象をキー、その置換文字列を値とする辞書。
        キーとしてstrまたはreパターンオブジェクトを指定できる。
        キーがreパターンオブジェクトの場合は、置換文字列中でグループ参照 '\\1', '\\2',... が有効。
    """
    catch_all_pattern = '|'.join(map(to_pattern, mapping))
    replacer = make_replacer(mapping)

    return re.subn(catch_all_pattern, replacer, string)[0]


_PatternType = type(re.compile(''))  # workaround for Python which does't have typing module

def to_pattern(key):
    if isinstance(key, str):
        return '(' + re.escape(key) + ')'
    elif isinstance(key, _PatternType):
        return '(' + key.pattern + ')'
    else:
        raise ValueError(expr(key) + " is not a str, neither re.compile.")


def make_replacer(mapping):

    def _replacer(match):
        src = match.group(0)
        for key, val in mapping.items():
            if src == key:
                return val
            elif isinstance(key, _PatternType) and re.match("(?:" + key.pattern + r")\Z", src):  # workaround for Python which doesn't have re.fullmatch
                return key.sub(val, src)

    return _replacer
```
Amazon EventBridge Scheduler が提供されたので動作確認してみた

# AWS EventBridge Scheduler

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-eventbridge-launches-new-scheduler/

# 従来

今まで Lambda 等から EC2 や RDS の ECS の定期停止を実行していました。

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/39c1aa3d-f80f-c5d1-bd71-de9e1a308f42.png)

# アップデート

複雑な処理を実行する場合は引き続き、Lambda を介して実行する必要があると思いますが、EventBridge Scheduler から直接実行できるようになりました。

 ![eb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a4993cef-b19e-a5e8-4298-5f18570222d1.png)

# やってみた

## EventBridge Scheduler の設定

### スケジュールの詳細の指定

ここは従来通りの設定です。今回はテスト目的ですので、「1回限りのスケジュール」で実行します。
![スクリーンショット 2022-11-22 19.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/fdfed40f-fc12-174b-3528-3deabe5052c9.png)

### ターゲットの選択

ここで実行するAPIを指定します。今回は「UpdateService」で、ECS(Fargate)を起動したいと思います。
![スクリーンショット 2022-11-22 20.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8e8eaa02-065c-3029-f3f8-9fb9698439d4.png)

API に渡すパラメータを入力します。
![スクリーンショット 2022-11-22 20.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/32bc79ef-13dd-b94b-f62d-8af64d5f2534.png)

https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html


### 設定

失敗時に再試行するポリシーを定義できます。
![スクリーンショット 2022-11-22 19.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/81bd9616-5c2f-0dd2-40fb-609151a7a579.png)

EventBridge scheduler が ECSサービスを実行するIAMロールが作成されます。
![スクリーンショット 2022-11-22 19.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c886bddf-a0f4-4220-1526-c166fb9b4423.png)


## 確認

次のとおり、サービスによりタスクが起動できたことが確認できました。

![スクリーンショット 2022-11-22 20.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/4fdb9723-5177-206d-391c-32edea60d9de.png)
Azure App Serviceに別の仮想ネットワークからプライベート接続

# はじめに

App Serviceを仮想ネットワークに接続して外からアクセスできないようにし、さらに別の仮想ネットワークからアクセスしたいといったケースがありましたので、その方法をご紹介します。

# 準備

初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/fa54e55c-0cff-f8e1-c026-4a57f1fd0fe9.png)

まずはプライベートエンドポイントを使って、App Serviceと仮想ネットワーク（VNET1）を接続します。（プライベートエンドポイントには専用のサブネットが必要です）

App Serviceのネットワーク設定からプライベートエンドポイントを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/ec45ee9f-7d2f-4652-0e77-2d93bbaa0323.png)

これでApp Serviceにプライベート接続できるようになります。また、外からアクセスできなくなります。
App ServiceのプライベートDNSゾーンも同時に作成されます（未作成の場合）。

プライベートエンドポイント作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/4b9c775d-b33e-0e68-f51f-2f6f82b79759.png)

# 課題

この時点ではピアリングしている仮想ネットワーク（VNET2）から、App ServiceのプライベートIPアドレスやドメイン名を使ってもApp Serviceにアクセスすることができません。

VNET2上の仮想マシンからプライベートIPアドレスでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/0bae0fc3-02f1-3bfd-1698-679093ec669a.png)

VNET2上の仮想マシンからドメイン名でアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/139eb6d7-a736-b7e9-5be2-0c62384b9a07.png)

# 解決方法

VNET2からアクセスできるようにするには、VNET2からもApp ServiceのプライベートDNSゾーンを参照するようにします。プライベートDNSゾーンで仮想ネットワークリンクを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/727c4c93-b9bb-9584-5776-9ae98b3c1604.png)

仮想ネットワークリンク作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/1edde9a1-5c95-bf93-f929-fcdb473d7a9f.png)

これでVNET2上の仮想マシンからドメイン名でApp Serviceにアクセスできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378608/598fc7d2-f878-59f8-9fac-9b9247e7a8d8.png)

# App Serviceにアクセスできなかった理由

VNET2からApp Serviceにアクセスできなかった理由は以下の通りです。
- プライベートIPアドレスでアクセスできない
  → App Serviceの仕様でドメイン名でアクセスする必要がある

  > Web アプリにプライベート エンドポイントを使用する場合は、要求する URL が Web アプリの名前と一致している必要があります。 既定値は mywebappname.azurewebsites.net です。

  > 既定の証明書が *.azurewebsites.net に対して発行されるため、この名前を使用する必要があります。

  [Azure Web アプリでプライベート エンドポイントを使用する](https://learn.microsoft.com/ja-jp/azure/app-service/networking/private-endpoint#dns)

- ドメイン名でアクセスできない
  → 名前解決できる必要がある
スポーツのライブ配信で（ほぼ）リアルタイムハイライトシーン機能が欲しい

今年のW杯はABEMAで観戦します。ABEMAの無料生中継は非常に感謝ですね！
![family_tv_soccer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43851/143b9098-f128-0ac5-66d2-9c877da0e565.png)

ぱっと見てた感じですと、HLSでの配信のようでした。

## 表面上で確認できた機能一覧
ブラウザアプリならではの機能も提供されていました。
### カメラ切り替え
4種類の目線とそれらを集約した映像が選択できるようになっていました。
このあたりの機能は最近ではよく見かけるかなと思います。
- メインカメラ
- チーム別(x2)
- 全体（上空）
（メッシは本当にあんまり動かないなというのもよく分かりました）

### チャット
ユーザー名が無いタイプのチャットでした。荒らしのようなコメントが無かったり、同じ速度でゆっくり流れていくのである程度フィルターかけつつ流していると予想されます。

### 試合データ
スタッツやメンバーが表示されます。このあたりはまあ、国際映像にも乗ってきてたりするものなのであまり目新しさを感じません。

さてこの記事の本題です。
### ゴールシーンや盛り上がったシーンを選んで見返したい！（試合中に）
テレビ中継ではゴール直後等は何度かリプレイが流れます。ですが、以下のようなシュチュエーションで自分が見たいタイミングで該当のシーンを流してほしい場合があります。

- ちょっと風呂に入ってた時のゴール
- 直前の2点目見たいのに国際映像がミスって1点目流しちゃってる時（イライラ）
- 点が入ったわけではないがスーパープレイだったシーン
- ちょっと監督が目立っちゃったシーン

等があります。
リアルタイムの映像を見つつも、別枠で自分が選択したシーンを追いかけ再生できればより楽しそうですね。
音声もどちらかをミュートできれば最高です。
システム的にはタイムラインにフラグをたててもらえばOKかと思います。


### シーン生成で考えられるアルゴリズム
運営側にはタイムラインにフラグをたててもらう必要があります。私が考えたフラグ立ての方法は以下。

- 手動（人力）
- 歓声の度合い
- チャットの数

手動は点が入った時点で運営スタッフがデータ登録する一番レガシーな方法になります。
残りの2個は少しAIっぽい処理になりますね。
点が入りそうで入らなかったシーンでも歓声は大きくなります。
興奮したような歓声だったりどよめきのような歓声を音声入力から判断してもらってフラグを立てればよいかと思います。
チャットも見所があるシーンでは自然に増える傾向にあります。チャットの文字列から判断してフラグたてつつ、どのようなシーンか表現してくれれば面白いかもしれません。

### 最後に
今回はスポーツをベースに欲しいという機能で考えてみましたが、スポーツ以外にもコンサートの配信でも活用できそうな気がします。
あとライブ配信に関係ないですが、朝4時に必ず起きれる機能が欲しいです。。。

### おまけ
そろそろ審判に360°カメラつけて全天球でのスポーツライブ実現してほしいですね。
if,else問題(演算子)

police_troubleメソッドを実装。

あなたは警官です。
aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
※問題文で登場したaとb二人の容疑者は、今回実装するpolice_troubleメソッドの引数として取り扱っていきます。

- 第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
- 第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
- 第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること

```ruby:雛形
def police_trouble(a, b)
  # ここに条件式を記述する
end

# 呼び出し例
police_trouble(true, true) 
police_trouble(false, false)
police_trouble(true, false)

```
```ruby:出力例
police_trouble(true, true) → True
police_trouble(false, false) → True
police_trouble(true, false) → False
```

# 論理演算子とは
真（true）と偽（false）の確認や演算を行うときに使われる演算子（記号・符号）のこと。
ifなどの要件分岐を実装するとき、条件式に複数の条件を組み合わせるために用いられる。

## 複数の条件を組み合わせた条件式
論理演算子　　&&　,　 ||　,　 !　を使う。
```
# aもbもtrueの場合にtrue 
a && b

# aかbのどちらかがtrueの場合にtrue
a || b 

# aがtrueの場合にfalse、aがfalseの場合にtrue
!a
```

```ruby:回答
def police_trouble(a, b)
  if (a && b) || (!a && !b)
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
police_trouble(true, true) 
police_trouble(false, false)
police_trouble(true, false) 
```

2行目の説明

(a && b)   
aとbの証言がどちらもtrue

||　　　
または

(!a && !b)
aとbの証言がどちらもfalse

この場合、
 "true"  を出力する。


それ以外、つまり(a && b) || (!a && !b)に当てはまらないのであれば、"false"  を出力する。
PHP静的解析ツール PHPStan(Larastan) 個人的メモ

# PHPStan (Larastan)

レベルに応じたソースコードの解析を行い、不具合の原因になりかねない箇所を指摘してくれる素晴らしいツール。

[PHPStan公式サイト](https://phpstan.org/ "PHPStan")

## 使い方

```bash
# ./vendor/bin/phpstan analyse -l [level] [検証するパス]

# example
./vendor/bin/phpstan analyse -l 4 app/Http/Controllers/TopController.php
```

## level

下位レベルのテストを全て含む（※レベル3はレベル0～2もチェックするよ）

| レベル | チェック内容 | 
|:-|:-|
| 0 | 基本的なチェック、未知のクラス、未知の関数、$thisに呼び出された未知のメソッド、これらのメソッドや関数に渡された引数の数が間違っている、常に未定義の変数。       |
| 1 | 未定義の変数、未知のマジックメソッド、__call や __get を持つクラスのプロパティがある可能性があります | 
| 2 | 未知のメソッドを ($this だけでなく) すべての式でチェックし、PHPDocs の検証を行います |
| 3 | 戻り値の型、プロパティに割り当てられた型 | 
| 4 | 基本的なデッドコードチェック - 常に偽のinstanceofやその他の型チェック、デッドelseブランチ、リターン後の到達不可能なコードなど | 
| 5 | メソッドや関数に渡される引数の種類を確認する | 
| 6 | タイプヒントの欠落を報告する | 
| 7 | 部分的に誤った組合タイプを報告する - 組合タイプ内のいくつかのタイプにのみ存在するメソッドを呼び出すと、レベル7はそれを報告し始める; その他の不正確な状況を報告する可能性がある | 
| 8 | null可能な型に対するメソッド呼び出しとプロパティアクセスを報告します | 
| 9 or max | 混合型については，厳密には別の混合型に渡すことだけが許されます | 


## 所見
チーム開発の場合は、どのレベルまで許容出来るかをチーム内で話し合った方がよさそう。
全てのファイルをレベル9で通そうとしたら膨大な時間が掛かることは間違いない。
[AWS Systems Manager] ManagedInstanceとして認識されない謎


AWSのインスタンスタイプはXeonからNitroに変更する作業は
AWS Systems Managerを活用して自動化ドキュメント仕組みを作成しましたので、
普段数クリック数分で終わるものと想定しました。
さっさと終わったら本日の仕事終了して休みの計画作成したい（祝日は外出気分転換と決まっている、、）

考えがあまい！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/55863892-45f7-6a26-0dfc-649025e9e4d9.png)


インスタンスが古すぎるのせいかと思いますが、
色々想定外事象発生することとトラブルシューティングとして記録します。


事象としましては、　件名の通りManagedInstanceにならなかった。

以下は解決できるまでの道のり、、長いので、時間がない方は最後にスクロールして見て頂ければと思います。
- SSMAgentは2.X　
　　ー＞　最新のSSMAgentを入れました。サービスとして再起動したが、NG
- PROXYのせい
　　ー＞　何も設定されないことを確認
え、念のため、手順を再度チェックします。
- Roleの設定/SG/Route/NACL問題ないか
　　ー＞問題ありません。
※https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/

- 普段SSM活用しているので、AWSが用意した診断プログラムを利用して診断したら
　　ー＞AWSSupport-TroubleshootManagedInstanceの結果は全部成功
※よくある話ですが、ショック！

- SSMの実フォルダに色々ログを確認したら、以下内容発見
[HandleAwsError @ awserr.go.48] [instanceID=i-xxxxxx] [MessagingDeliveryService] error when calling AWS APIs. error details - GetMessages Error: RequestError: send request failed
caused by: Post https://ec2messages.ap-northeast-1.amazonaws.com/: x509: certificate signed by unknown authority
　　ー＞　X509？証明書？　あまりよく見られないエラーですね。　（と言いつつ、実際昔々1回発生しましたようですけど、思い出せなくて、、(/ω＼)）
　　　　ー＞　証明書インストール：certutil -addstore -f "ROOT" AmazonRootCA1.crt
　　　　　https://www.amazontrust.com/repository/
- Restart-Service AmazonSSMAgentを実施して、数秒程度でManagedInstanceとして認識できました、
やったー！

これからやっと想定作業を実施できました。
SSMのおかけで、一台ずつマニュアル作業ではなく、
数台サーバ纏めてSSM自動化ドキュメントを一気に動き出して、
Nitro含むドライバ更新はわずか数分で全部終わりますね。

パッチ適用なども1000台以上Windowsに適用するなど色々取り込んできましたが、
該当ようなトラブル発生する場合もサーバにログインすることがなく、
いくつドキュメントを動かせば解決することを目指したいと思います。
AWSさん、頑張りましょう～


# まとめ (時間がない方へ)

今回は証明書エラーでAWSコマンド実施できないことが原因でしたので、
以下で解決。
①certutil -addstore -f "ROOT" AmazonRootCA1.crt
②Restart-Service AmazonSSMAgent
Gitの基礎知識１

## はじめに
僕は今年の夏からエンジニアインターンをしています。
ちなみに僕は文系なのでインターンをするまではずっと独学でした。
この機会にインターンを通して得たものを共有していければと思います。
また、Qiitanのぬいぐるみがどうしても欲しいので２５記事を必ず完走します！！

まずはGitについてです。
独学でプログラミングをしていると、チーム開発をする機会はほとんどないのでGitを触るにしても何となくの理解で終わってしまうことが多いと思います。
実際に僕はそうだったので最初の１ヶ月とかはかなり苦労しました。

## 大原則
<font color="Red">調べてみて、それが本当に正しいかわからないときは先輩のエンジニアに聞きましょう。</font>
<font color="Red">概念理解があっていたとしてもチームのリポジトリ管理規則とは違うなんてこともあると思います。</font>

## git add
gitではcommitする前にaddしますが、僕はこれをずっとただの呪文だと思っていました。

実際にはファイルごとのblobハッシュが作成されてindexに登録(ステージング)されています。
#### index
indexはcommit予備軍でindexに登録されていない変更分やファイルはコミットすることができません。
どのファイルがステージングされているかは、下記のコマンドでみることができます。
```terminal
    git ls-files --stage
```
    
#### blobハッシュ
blobとは```binary large object```の略称です。
```git add``` することによってファイルの中身が圧縮されてblobハッシュが作成されます。
blobハッシュの中身は下記のコマンドでみることができます。
```terminal
    git cat-file -p blob_hash
```

#### ステージングを取り消したいとき
多分、vscodeだと左上のところをぽちぽちするのが1番早いです。
```terminal
    git restore --stage file_name
```

#### ファイル削除時
ファイル削除しただけではgitの追跡は終了していないので、indexに登録する必要があります。
```
    git rm file_name
```
これでステージングまで一発でしてくれます。そうでない場合は下記のようになります。
```
    rm file_name
    git add file_name
```

#### ファイル名変更時
普通にファイル名を変更すると、gitは1つファイルを削除して新しく1つファイルを作成したと認識します。
gitにリネームしたと認識させるためには、下記のコマンドを使います。
```
    git mv old_file_name new_file_name
```

## git commit
commitすることによってローカルのリポジトリに変更分が登録されますが、ここでは主に3つのことが行われています。
1. indexからtreeオブジェクトの作成
1. commitオブジェクトの作成
1. HEADを新しいcommitオブジェクトに書き換える

#### treeオブジェクト
blobハッシュは１つのファイルの情報を持つものでしたが、treeオブジェクトはディレクトリの情報をもつものです。
blobハッシュの時と同様に```git cat-file -p tree_object```で中身を確認することができます。
```
    100644 blob e23d3c182b4717ed8c4af71caaf711ccb6f8402c    README.md
    100644 blob eb6bfd5aae58ede909be100cfadedf01ce4a3b70    docker.txt
    100644 blob 41e2cdea70dfb1603d1d0abf891a4d1522cc6671    feature.txt
    100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    for-stash.txt
    040000 tree 40e61af83f1c6bd75e41fa5643a480824d61dd32    fuga
    100644 blob 93034466dfd7dce785e1a5398f8cb80b8fdc343f    hoge.txt
```
それぞれのファイルのblobハッシュやディレクトリのtreeオブジェクトを管理していることがわかります。
commitした際にはまず、上の例のようなtreeオブジェクトが作成されます。

#### commitオブジェクト
commitオブジェクトはtreeオブジェクトとcommitに関する情報(コミットメッセージや親コミットや作成者など)を持つオブジェクトです。
commitオブジェクトは1番最初以外は常に親コミットを持っているためブロックチェーンのようになっています。
これも同様に```git cat-file -p commit_object```で確認することができます。

#### HEAD
HEADについては別記事で書きます！

#### fixup　
```
    git commit --fixup commit_object
```
上記のようにfixupを使うと、指定したcommit_objectのコミットメッセージに「！」が追加されたコミットメッセージを持つ新しいコミットが作成されます。
レビューをもらうごとに新しいコミットメッセージを付けるのはナンセンスなので、レビュー修正の際には基本的にfixupを使っています。

https://qiita.com/inukai-masanori/items/82eb0626fd75f3eb0922

## 参考にしたサイト

https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92Git-%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A6%E3%83%9E%E3%83%AA/dp/4798144614

https://mixi-developers.mixi.co.jp/22-technical-training-gw-b42d06431004#b274

https://backlog.com/ja/git-tutorial/