OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Railsの7つの主要なアクション

## Ruby on Railsの7つの主要なアクション

Ruby on Railsは、Webアプリケーションを開発するためのフレームワークで、HTTPリクエストに対して7つの主要なアクションを提供します。これらのアクションは、CRUD操作（Create, Read, Update, Delete）に対応しており、データベースとのやりとりやビューの表示など、さまざまなタスクに使用されます。以下に、Railsの主要な7つのアクションを詳しく説明します。

### 1. `index` アクション

`index` アクションは、データベース内の複数のレコードを一覧表示するために使用されます。これは、例えば、記事一覧、商品一覧、ユーザー一覧などのページを生成するのに役立ちます。一般的に、コントローラ内でデータを取得し、対応するビューで表示します。

### 2. `show` アクション

`show` アクションは、特定のレコードの詳細情報を表示するために使用されます。一般的な用途として、個別の記事、商品、ユーザーなどの詳細ページが挙げられます。コントローラは、リクエストされた特定のレコードを取得し、それを表示するためのビューに渡します。

### 3. `new` アクション

`new` アクションは、新しいレコードを作成するためのフォームを表示するために使用されます。これにより、ユーザーは新しいデータを入力し、データベースに保存するための `create` アクションに移行できます。

### 4. `create` アクション

`create` アクションは、新しいレコードをデータベースに保存するために使用されます。通常、`new` アクションで表示されたフォームから送信されたデータを取得し、新しいレコードを作成し、データベースに保存します。

### 5. `edit` アクション

`edit` アクションは、既存のレコードを編集するためのフォームを表示するために使用されます。ユーザーは既存のデータを変更し、変更内容をデータベースに保存するための `update` アクションに移行できます。

### 6. `update` アクション

`update` アクションは、既存のレコードを更新し、データベースに変更内容を保存します。通常、`edit` アクションで表示されたフォームから送信されたデータを取得し、該当のレコードを更新します。

### 7. `destroy` アクション

`destroy` アクションは、特定のレコードを削除するために使用されます。ユーザーが削除ボタンをクリックした場合など、データベースから該当のレコードを削除します。

これらの7つの主要なアクションは、CRUD操作の中心であり、Webアプリケーションの基本的な機能を実装するのに役立ちます。Railsのコントローラとビューを組み合わせて使用することで、強力なWebアプリケーションを効率的に開発できます。
Google Cloud Runのデプロイは.gitignoreを見ている

Cloud Runのビルドでハマったのでメモ

`gcloud run deploy`でCloud Runでデプロイ時に確実に含まれているはずのファイルが
`Module not found: Error: Can't resolve './setting' in '/workspace/src'`
となる現象が発生。

しばらく悩んだところ、
デバッグ用の設定ファイルをgit commitでいちいち更新扱いになるのが面倒くさかったので.gitignoreにファイルを追加していたのが原因のようでした。

Cloud Runのビルドはどうやら.gitignoreを使用しているようで、ここでignoreしたファイルはdeployに含まれない模様。.gitignoreから削除したことで解消。
Ruby on Railsでよく使用される10の主要なバリデーション

# Ruby on Railsでよく使用される10の主要なバリデーション

Ruby on Railsはデータの整合性を保つためにさまざまなバリデーションを提供しています。これらのバリデーションはモデルの属性に適用し、データが期待どおりの形式で保存されることを確認します。以下に、Railsでよく使用される10の主要なバリデーションを説明します。

## 1. 存在性のバリデーション (Presence Validation)

`presence` バリデーションは、指定した属性が空でないことを確認します。これは通常、必須フィールドの検証に使用されます。たとえば、ユーザーが名前を入力する必要がある場合、以下のように使用します。

```ruby
validates :name, presence: true
```

## 2. 文字列の長さのバリデーション (Length Validation)

`length` バリデーションを使用すると、文字列の長さを制限できます。最小長さと最大長さを指定でき、文字列の長さがその範囲内に収まるかどうかを確認します。

```ruby
validates :title, length: { minimum: 5, maximum: 100 }
```

## 3. 数値の範囲のバリデーション (Numerical Range Validation)

`numericality` バリデーションは、属性が指定された数値範囲内にあることを確認します。たとえば、年齢が18歳以上であることを検証するには次のようにします。

```ruby
validates :age, numericality: { greater_than_or_equal_to: 18 }
```

## 4. 一意性のバリデーション (Uniqueness Validation)

`uniqueness` バリデーションは、属性の値が一意であることを確認します。これは通常、ユーザー名やメールアドレスなどの一意である必要があるフィールドで使用されます。

```ruby
validates :email, uniqueness: true
```

## 5. フォーマットのバリデーション (Format Validation)

`format` バリデーションを使用すると、属性の値が指定した正規表現パターンに一致するかどうかを確認できます。たとえば、電話番号のフォーマットを検証するには次のようにします。

```ruby
validates :phone_number, format: { with: /\A\d{10}\z/, message: "正しいフォーマットで入力してください" }
```

## 6. 関連のバリデーション (Association Validation)

`belongs_to` 関連や他の関連に対して、`belongs_to` バリデーションを使用して、関連オブジェクトが存在するかどうかを確認できます。

```ruby
validates :author, presence: true
```

## 7. カスタムバリデーション (Custom Validation)

カスタムバリデーションは、独自の検証ロジックを定義できる強力なオプションです。独自の条件を満たすかどうかを確認するために、任意のカスタムバリデーションメソッドを作成できます。

```ruby
validate :custom_validation_method

def custom_validation_method
  if some_condition
    errors.add(:base, "カスタムエラーメッセージ")
  end
end
```

## 8. 組み合わせのバリデーション (Combination

 Validation)

`with` オプションを使用して、複数のバリデーションを組み合わせて使用することができます。これにより、複雑な検証条件を指定できます。たとえば、2つの属性が同時に存在する場合の検証を行うには次のようにします。

```ruby
validates :start_date, presence: true, if: :end_date?
validates :end_date, presence: true, if: :start_date?
```

## 9. 条件つきのバリデーション (Conditional Validation)

`if` や `unless` オプションを使用して、特定の条件が満たされた場合にのみバリデーションを実行できます。条件に応じて異なるバリデーションを適用することができます。

```ruby
validates :discount, numericality: true, if: :has_discount?
```

## 10. カスタムエラーメッセージの設定 (Custom Error Messages)

各バリデーションにはデフォルトのエラーメッセージが用意されていますが、必要に応じてカスタムエラーメッセージを設定できます。これにより、ユーザーフレンドリーなエラーメッセージを提供できます。

```ruby
validates :age, numericality: { greater_than_or_equal_to: 18, message: "18歳以上である必要があります" }
```

これらのバリデーションを活用して、アプリケーションのデータの整合性を確保し、ユーザーエクスペリエンスを向上させることができます。適切なバリデーションを使用して、データの品質を維持しましょう。
GitHubコンフリクトの原因と対処法

## GitHubコンフリクトの原因と対処法

ソフトウェア開発において、GitHubでコードを共有する際にコンフリクトが発生することはよくあります。コンフリクトは複数の開発者が同じ箇所を同時に変更したり、変更が競合したりしたときに発生します。以下に、コンフリクトの一般的な原因と対処法をまとめます。

### **原因1: 同一ファイルの同一行の同時変更**

- **原因**: 複数の開発者が同じファイルの同じ行を変更し、競合が発生した場合。
- **対処法**: コンフリクトを解消するためには、手動でコードを統合する必要があります。競合した箇所を特定し、適切な変更を選択してコードを修正します。

### **原因2: ブランチのマージ時に競合**

- **原因**: 別々のブランチで異なる変更を加えた場合、それらのブランチをマージしようとしたときに競合が発生することがあります。
- **対処法**: マージ前に競合を解消するために、競合したファイルを手動で修正します。また、競合の発生を防ぐためにコミュニケーションを密にしましょう。

### **原因3: コミットの順序が異なる場合**

- **原因**: コミットの順序が異なると、同じコード行を変更していた場合に競合が発生します。
- **対処法**: コミットの順序を調整し、競合が発生しないようにします。また、コミットメッセージに詳細情報を含めることで、他の開発者に変更内容を伝えましょう。

### **原因4: コンフリクトを無視した場合**

- **原因**: マージ時に競合を無視したり、コンフリクトを解消しないままコードをコミットした場合。
- **対処法**: コンフリクトを無視せず、必ず解消しましょう。無視すると、コードの品質が低下し、エラーが発生する可能性が高まります。

### **原因5: リベースとプッシュ**

- **原因**: リベースとプッシュを使用してブランチをアップデートし、既存のコミットを書き換えた場合。
- **対処法**: リベースを使用するとコミットが書き換えられ、競合が発生しやすくなります。リベース前に他の変更をマージし、競合を解消してからリベースしましょう。

### **原因6: コードのスタイル変更**

- **原因**: コードのスタイル変更（インデント、フォーマットなど）が競合を引き起こすことがあります。
- **対処法**: コードのスタイル変更は注意深く行い、他の開発者と共通のスタイルガイドを使用しましょう。また、ツールを活用してコードフォーマットを自動化することで、競合を減少させます。

## まとめ
GitHubコンフリクトは避けられないことですが、効果的なコミュニケーション、コードレビュー、そしてテストがコンフリクトの発生を減少させるのに役立ちます。また、競合が発生した場合には適切に解消するためのスキルも重要です。開発者はコンフリクトを恐れず、プロジェクトの品質向上に向けて積極的に取り組むべきです。
テストの正常系、異常系、準正常系について

## テストの正常系、異常系、準正常系について

ソフトウェアテストは正常系、異常系、そして準正常系のケースをカバーすることが重要です。これにより、アプリケーションが予想どおりに動作し、エラーや問題に対処できるかどうかを確認できます。

### 1. 正常系テスト
正常系テストは、アプリケーションが正常な状態で正しく動作するかどうかを確認します。ユーザーが期待通りの操作を行う場合の挙動をテストします。例えば、ユーザーがログインし、メールを送信するなどです。

### 2. 異常系テスト
異常系テストは、アプリケーションが異常な状況に遭遇したときにどのように振る舞うかを確認します。ユーザーが誤った情報を提供したり、システムエラーが発生した場合のテストです。これにより、エラーメッセージが正しく表示され、セキュリティの問題やデータ損失を防ぎます。

### 3. 準正常系テスト
準正常系テストは、正常系と異常系の中間に位置します。一部の条件が満たされるが、他の条件が満たされない場合をテストします。例えば、ユーザーが必要事項を入力したがパスワードが弱い場合のテストです。アプリケーションが部分的に成功し、部分的に失敗する場合を検証します。

### テストの重要性
正常系テストはアプリケーションの主要な機能を確認し、品質を保証します。異常系テストはセキュリティと信頼性を強化し、準正常系テストはユーザーエクスペリエンスを向上させます。

全てのケースをテストすることで、アプリケーションがユーザーやデータに対して安全かつ信頼性があり、優れたパフォーマンスを発揮することを確認できます。これにより、問題を事前に特定し修正でき、高品質なソフトウェアを提供できます。
【圏論入門】自然変換の定義と例

# 自然変換の定義

:::note
**定義（自然変換）**

$\mathscr{A},\ \mathscr{B}$ を圏、$F,\ G$ をそれぞれ $\mathscr{A}$ から $\mathscr{B}$ への関手とします。$\alpha:F\to G$ が自然変換であるとは、射の族 $(\alpha_A:F(A)\to G(A))_{A\in \mathscr{A}}$ が、$\mathscr{A}$ の任意の射 $f:A\to B$ に対して

$$\alpha_B\circ F(f) = G(f)\circ \alpha_A$$ を満たすことをいいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/58296902-516a-325c-a92b-65cefc6dea01.png)
:::

## 自然変換の例

　『[ベーシック圏論](https://www.amazon.co.jp/dp/4621300709)』から例を引用します。

　$\mathbf{CRing}$ を対象が可換環で射が環準同型という圏、$\mathbf{Mon}$ を対象がモノイドで射がモノイド準同型からなる圏とします（モノイド準同型とはモノイドに定義された演算を保ち、かつ単位元を単位元にうつす写像のこと）。まず $\mathbf{CRing}$ から $\mathbf{Mon}$ への関手を 2 つ定めます。$n\in \mathbb{N}$ を 1 つ固定しておきます。

　まず、$F:\mathbf{CRing}\to \mathbf{Mon}$ を定めます。$A\in \mathbf{CRing}$ とします。$A$ 成分の $n\times n$ 行列 $(a_{i,\ j})$ 全体がなすモノイドを $M_n(A)$ とします。$M_n(A)$ の演算は行列の積です。もちろん $M_n(A)\in \mathbf{Mon}$ です。$F(A):=M_n(A)$ と定めます。
 
　次に $F$ による射の行き先を定めます。$A,\ B\in \mathbf{CRing}$ に対して環準同型写像 $f:A\to B$ は、モノイド準同型写像 
$$F(f):M_n(A)\to M_n(B),\ (a_{i,\ j})\to (f(a_{i,\ j}))$$ を誘導します。これで $F(f)$ も定まりました。$f,\ f'$ を $\\mathbf{CRing}$ の関手とすると、$F(f'\circ f) = F(f')\circ F(f)$ が成り立ちます。また $F(1_{\mathbf{CRing}}) = 1_{\mathbf{Mon}}$ も成り立ちます。以上により、$F$ は関手です。

　次にもう一つの関手 $G:\mathbf{CRing}\to \mathbf{Mon}$ を定めます。こちらは簡単です。$A\in \mathbf{CRing}$ は乗法とその単位元によりモノイド $U(A)$ とみることができます。$G(A):=U(A)$ と定めます。集合としては変わりませんが、環に定義された加法を取り去ります。$G$ による射の対応も同じです。環準同型 $f:A\to B$ に対して、$G(f)$ には $f$ から加法の構造を保つことを取り去ったモノイド準同型を対応させます。これで 関手 $G$ も定まりました。

　ここからは自然変換 $F\to G$ を定めます。各 $A\in \mathbf{CRing}$ に対して
$$\alpha_A:F(A) \to G(A),\ (a_{i,\ j})\to \text{det}((a_{i,\ j}))$$ と定義します。$\alpha_A$ はモノイド準同型であるため、$\alpha_A$ は $\mathbf{Mon}$ の射になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/447950fa-62d7-dc5b-4359-ab2db1f698c1.png)

　$\alpha_B\circ F(f) = G(f)\circ \alpha_A$ を確認します。$X:=(a_{i,\ j})$ とおきます。
 
 　左辺の合成 $G(f)\circ \alpha_A$ を計算していき、右辺に等しくなることを確認します。
$$G(f)(\alpha_A(X))= G(f)(\text{det}_A(X)) = f(\text{det}_A(X))$$ となります。さらに、行列式と環準同型と $F(f)$ の定義から
$$f(\text{det}_A(X)) = \text{det}_B(F(f)(X)) = \alpha_B(F(f)(X))$$ となります。これで右辺の合成と等しくなりました。以上により $\alpha$ が自然変換であることが確認できました。
中間テーブルとアソシエーションの基本


# 中間テーブルとアソシエーションの基本

データベース設計において、中間テーブルとアソシエーションは非常に重要な概念です。これらを理解することは、データベースの設計や複雑なリレーションシップの管理に役立ちます。

## 1. 中間テーブルとは

中間テーブルは、2つ以上のテーブルを結びつけるテーブルのことです。例えば、ブログ記事とカテゴリの関係を考えてみましょう。1つの記事は複数のカテゴリに関連付けられる可能性があり、1つのカテゴリには複数の記事が関連付けられる可能性があります。このような多対多の関係を管理するのに中間テーブルが使用されます。

## 2. アソシエーションとは

アソシエーションは、Active Recordモデル間の関連性を定義する方法です。アソシエーションを使用することで、データベーステーブル間の関連を簡単に設定できます。例えば、前述の記事とカテゴリの例で、記事モデルとカテゴリモデルの間にアソシエーションを設定することで、記事とカテゴリが関連付けられます。

## 3. 多対多の関係の処理

多対多の関係を処理するために、中間テーブルとアソシエーションを組み合わせます。中間テーブルは、例えば`categories_posts`のように、関連付けたい2つのモデル名を複数形で組み合わせた名前になります。この中間テーブルには、2つのモデルの外部キーが含まれます。

```ruby
class CategoryPost < ApplicationRecord
  belongs_to :category
  belongs_to :post
end
```

このように中間テーブルのモデルを作成し、各モデルに対して`belongs_to`メソッドを使用してアソシエーションを設定します。

## 4. アソシエーションの種類

アソシエーションにはさまざまな種類があり、`has_many`、`belongs_to`、`has_one`、`has_and_belongs_to_many`などがあります。それぞれのアソシエーションは異なる関連性を表現します。例えば、1つの記事に対して多くのカテゴリがある場合は`has_and_belongs_to_many`を使用し、1つの記事に1つの著者がある場合は`belongs_to`を使用します。

## 5. アソシエーションの利点

アソシエーションを使用することで、データベースのテーブル間の複雑な関係を簡単に設定できます。これにより、データベースのクエリやデータの取得が容易になり、コードがより読みやすく保守性が向上します。

中間テーブルとアソシエーションは、データベース設計とアプリケーションの開発において非常に強力なツールです。これらの概念を理解し、適切に使用することで、データベースの複雑なリレーションシップを効果的に管理できます。

## まとめ
以上が中間テーブルとアソシエーションに関するまとめになります。データベース設計とリレーションシップの管理は、アプリケーションの成功に不可欠なスキルです。
RSpecを使用したテストの基本手順

# RSpecを使用したテストの基本手順

RSpecはRubyベースのテスティングフレームワークで、Ruby on Railsを含む多くのプロジェクトで使用されています。RSpecを使用してアプリケーションのテストを行う基本的な手順を説明します。

## 1. RSpecのインストール

アプリケーションにRSpecを導入するには、`Gemfile`にRSpecのGemを追加します。Gemfileに以下の行を追加し、`bundle install`を実行します。

```ruby
group :development, :test do
  gem 'rspec-rails'
end


その後、次のコマンドでRSpecを設定します。

```bash
rails generate rspec:install
```

## 2. テストの作成

RSpecでは、テストスクリプトを生成し、それに基づいてテストを記述します。例えば、ユーザーモデルのテストを作成するには、ターミナルで以下のコマンドを実行します。

```bash
rails generate rspec:model User
```

これにより、`spec/models/user_spec.rb`ファイルが生成されます。このファイル内にテストコードを記述します。

## 3. テストコードの記述

生成されたテストファイル内で、テストケースやテストステップを記述します。例えば、ユーザーモデルのバリデーションをテストする場合、以下のようなコードを追加します。

```ruby
require 'rails_helper'

RSpec.describe User, type: :model do
  it 'is valid with valid attributes' do
    user = User.new(name: 'John', email: 'john@example.com')
    expect(user).to be_valid
  end

  it 'is not valid without a name' do
    user = User.new(email: 'john@example.com')
    expect(user).not_to be_valid
  end
end
```

## 4. テストの実行

テストコードを記述したら、次のコマンドでRSpecを実行します。

```bash
bundle exec rspec
```

RSpecはテストを実行し、結果をターミナルに表示します。各テストが成功したか、失敗したかを確認できます。

## 5. テストのデバッグ

テストが失敗した場合、RSpecは失敗したテストを指摘し、失敗の理由を示します。この情報を使用して、問題の特定とデバッグを行います。

## 6. テストスイートの実行

アプリケーションの全てのテストを一度に実行するには、以下のコマンドを使用します。

```bash
bundle exec rspec spec
```

これにより、すべてのテストファイルが実行され、結果が報告されます。

## まとめ

これで、RSpecを使用してアプリケーションのテストを行う基本的な手順を学びました。テストはアプリケーションの信頼性を高め、バグを特定するのに役立ちます。この手順をマスターして、アプリケーションの品質を向上させましょう。
未成年なのでGooglePlayにアプリを出せないからAWSで自分のサイトからダウンロードできるようにする

## 悲しいことに未成年はアプリのリリースができない
悲しいことにGooglePlayは18歳、AppleStoreは20歳じゃないとアプリが出せません。
自分は普段UnrealEngineでアプリを開発しているのですがリリースできないのは悲しいです。
そこでAndroidでは野良アプリのダウンロードができるため、自分のwebサイト(AWS)でapkを配布することにしますた。

https://aoharu.works/works/index.html

:::note warn
見よう見まねでAWSは構築しているためセキュリティなどで不備がある場合は優しく教えて頂けると幸いです。
:::

## S3+Lambda+API Gateway +reCAPTCHAで実装する
reCAPTCHAをweb側に搭載し、API Gatewayを通じてAWS Lambdaで認証をしS3の署名付きurl(時間制限付き)を生成し、クライアント側に返す形です。クライアント側からはobject key(apkファイル)を指定します。
以下がガバガバ構成図です(厳密には多分違う)


![Desktop Screenshot 2023.11.01 - 00.41.26.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953041/d687c34e-1839-8662-c5a4-25212fbb04d7.png)

## サーバー側のコード

```AWS Lambda.py

import json
import urllib
import boto3
import os

def lambda_handler(event, context):
    recaptcha_secret = os.environ['RECAPTCHA_SECRET']
    bucket_name = os.environ['bucket_name']
    
    body = json.loads(event['body'])
    response = body['g-recaptcha-response']
    object_key = body['object_key']

    url = "https://www.google.com/recaptcha/api/siteverify"
    values = {
        'secret': recaptcha_secret,
        'response': response
    }

    data = urllib.parse.urlencode(values).encode()
    req = urllib.request.Request(url, data)
    response = urllib.request.urlopen(req)
    result = json.load(response)

    common_headers = {
        'Access-Control-Allow-Origin': 'https://aoharu.works',
        'Access-Control-Allow-Methods': 'POST',
        'Access-Control-Allow-Headers': 'Content-Type'
    }

    if result['success']:
        s3_client = boto3.client('s3')
        url_expiration_seconds = 4
        signed_url = s3_client.generate_presigned_url('get_object',
                                                      Params={'Bucket': bucket_name, 'Key': object_key},
                                                      ExpiresIn=url_expiration_seconds)

        return {
            'statusCode': 200,
            'headers': common_headers,
            'body': json.dumps({'message': 'Success', 'link': signed_url})
        }
    else:
        return {
            'statusCode': 400,
            'headers': common_headers,
            'body': json.dumps({'message': 'reCAPTCHA validation failed'})
        }

```

多分本当はobject keyにバリデーションを付けるべきなんだと思います

## 最後に
何かご指摘があれば優しく教えて頂けると嬉しいです
ハッシュ化したパスワードの特定とその対策

# 概要

DBに保存していたハッシュ化したパスワードが盗まれたら、どのくらいのスピードでパスワードを特定できるのか、簡単なプログラムで試してみたいと思います。


今回作成するプログラムは、赤い枠の部分になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/704cdd4f-cb1a-bd1e-493a-09d9579f3cc0.png)


# セキュリティ用語

### 総当たり攻撃

総当たり攻撃とは、暗号解読方法のひとつで、可能な組合せを全て試すやり方。攻撃、または片仮名でブルートフォースアタックとも呼ばれる。（出典：[Wikipedia](https://ja.wikipedia.org/wiki/%E7%B7%8F%E5%BD%93%E3%81%9F%E3%82%8A%E6%94%BB%E6%92%83))

### レインボーテーブル攻撃

レインボーテーブルは、ハッシュから平文を得るために使われるテクニックの一つである。特殊なテーブルを使用して表引きを行う。（出典：[Wikipedia](https://ja.wikipedia.org/wiki/%E7%B7%8F%E5%BD%93%E3%81%9F%E3%82%8A%E6%94%BB%E6%92%83))


# プログラム

### パスワードのハッシュ化

初めにパスワードは以下のルールで作成します。

- 文字数: `5文字`
- 使用可能な文字: `abcdefghijklmnopqrstuvwxyz` の27文字

計測は最後の文字列の`zzzzz`で作成したいと思います。
暗号化方式は、SHA512で行います。


```python3
import hashlib
password = 'zzzzz'
text = hashlib.sha512(password.encode()).hexdigest()
print(text)
```

下記が`zzzzz`をSHA512で暗号化した文字列です。

```
de2adab3fb5ff37f39a37695a9ddeae600774d1ca00244651c023eb3fa413db1a9454e771db6fad39363dc6fd1c4e5eac2e53a3d86117bed95017b2394b8e4b4
```


### パスワードの特定
```python3
import hashlib
import time
import itertools
import string

# 使用可能な文字列(abcdefghijklmnopqrstuvwxyz)
availableStr = string.ascii_lowercase

# パスワード桁数
digit = 5

# 暗号化した文字列
text = 'de2adab3fb5ff37f39a37695a9ddeae600774d1ca00244651c023eb3fa413db1a9454e771db6fad39363dc6fd1c4e5eac2e53a3d86117bed95017b2394b8e4b4'

# 開始時間を記録
startTime = time.time(); 
attackCount = 0 # 試行回数を保存する

# パスワードを特定
for i in itertools.product(availableStr, repeat=digit):
    attackCount += 1
    if hashlib.sha512(''.join(i).encode()).hexdigest() == text:
        password = ''.join(i)
        break
    
# 処理時間を計測を終了
elapsedTime = time.time() - startTime

print("パスワード:"+ password)
print("試行回数:"+ str(attackCount))
print("処理時間:"+ '{0:.3f}'.format(elapsedTime))
```

出力結果です

```
パスワード:zzzzz
試行回数:11881376
処理時間:28.527
```

### パスワード桁数ごとの比較

使用可能文字が27文字だと、パスワード6桁の場合でも15分もあればパスワードを特定できるようです。

|桁数|試行回数|処理時間(秒)|
|-|-:|-:|
|3桁|17,576|0.039|
|4桁|456,976|1.024|
|5桁|11,881,376|28.527|
|6桁|308,915,776|919.719||

桁数が増えるたびに処理時間が指数的に増えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/cf36b207-ae5a-a992-9873-fd4cd20fe7b5.png)

# 対策

### 対策① 使用可能文字やパスワード文字列を増やす

今回は、検証時間が長くなってしまうので検証しませんが、「使用可能文字」「パスワード文字列」を増やすことで、特定までに時間がかかります。

### 対策② ソルトを使用する

ソルトとは、ハッシュ化するときにパスワードの文字列を追加することで、パスワードを特定しにくくします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/6a190e10-7e83-da9c-5941-e72746698993.png)

### 対策③ ストレッチングを行う

ストレッチングとは、ハッシュ化した文字列を再度ハッシュ化することで強固なパスワードになります。複数回ハッシュ化することでさらに強固になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/8e85888b-caa5-9687-c8a3-ee6c1b1124c2.png)

# おわりに

今回は、「パスワードの特定」と「対策」を簡単に説明しました。

プログラムのほうは、「処理の最適化」や「性能の良いPCで実施」することで処理時間を速くすることができると思います。

どんどんセキュリティ対策を強化していきましょう！

ここまで見ていただきありがとうございました。
初めてのアプリ製作過程をQiitaに記録していく

## はじめに
9月からJavaをProgateで学び始めた30代の初学者です。
目標はエンジニアデビューですが道のりは遠く険しそうです。
## 9月に学んだこと
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569128/f3422bd8-12c3-d77a-8a5a-d100dae975ee.png)

9月1日から始めたProgateのjavaコースを5日程で終えた後は、[スッキリわかるJava入門](https://amzn.asia/d/665RcEN "スッキリわかるJava入門")を読みながら[北ソフト工房様](https://kitako.tokyo/lib/JavaExercise.aspx "Java 練習問題集")のJava 練習問題集を一通りやりました。
その辺りで明らかに成長速度の鈍化と何をすれば伸びるのかわからなくなり、paizaラーニングでCランクの問題を解きながら、Progateの他の基礎的な講座を並行して受けることにしました。

## 学んだProgateの講座の一覧
- Java
- HTML & CSS
- JavaScript
- SQL
- Git
- Command Line

## 10月に学んだこと
![abb8efef9671bee226a4be1d24fbc692.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569128/55b0aa2b-6a42-376e-d934-a83a25c9773a.png)
学習方法を模索した結果、自分の中で選択肢が二つできました。

1. Javaのアプリ製作
2. 他のよく使われるツール（SpringBoot, MySQL, Docker, Linux等）の環境構築 

選んだ選択は画像でもわかる通り2です。
色々なソフトを導入し、かなり初歩的なことだけをしたものの、実際使わないと馴染むことはないなと判断し、やはり1のアプリ製作が必須と感じたのでそれに向けて動きました。

## 本 + ゲーミフィケーション
ようやく本題のアプリ製作の話まで来れました。
アプリ製作をする上で何を作るかは、これまで学習しながら複数の案を考えていた中でなるべくシンプルなものを選びました。
仮で現在は**BookMap**と名付けています。
- 最初に読みたい本のページ数を入力し、毎日進んだページ数を入力
- そこから現在のペースであれば残り何日で読了できるのかを表示
- 本を現在何％読んでいるかを画像でわかるように表示
:::note
雰囲気だけの画面設計書
:::
![BOOKmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569128/890d1138-7317-d0ee-6888-d91c42385040.png)

## これから
とりあえず最低限必要な機能だけを実装することを目指し、学習から2か月でようやくアプリ製作へと動き出しました。
何週間、何か月かかるか計算することもできない程のヒヨッコなので、なんとか形になるように願いながらがんばっていきたいと思います。
そのうえで製作状況や必ず出てくるエラー祭り等の四苦八苦加減を記録して、後にこんな時代もあったなと振り返られることを期待しながら制作過程の日々を綴っていきたいと思います。
初めての記事で読みづらい所もあったかと思いますが、ご覧いただきありがとうございました。
オブジェクト指向プログラミングの三大要素　「クラス」について

オブジェクト指向プログラミングには、以前のプログラミングにはない３つの優れた仕組みが備わっている。


#### オブジェクト指向プログラミングの３大要素
1. **クラス**
1. **ポリモーフィズム**
1. **継承**

上記の３つの仕組みがあることで、「**重複した無駄なロジックを排除し、必要な機能を整理整頓する仕組み**」をプログラマに提供してくれる

まずは**クラス**について整理。

▼参考

https://bookplus.nikkei.com/atcl/catalog/21/S00180/

---
## クラスに備わる３つの仕組み

書籍「オブジェクト指向でなぜつくるのか」では、クラスの仕組みを以下のように説明しています。

:::note
クラスは「**まとめて、隠して、たくさん作る**」仕組み

1. サブルーチンと変数を「まとめる」
1. クラスの内部だけで使う変数やサブルーチンを「隠す」
1. １つのクラスからインスタンスを「たくさん作る」

:::

### クラスの性能1 まとめる

:::note
「**まとめる**」について
結びつきの強い複数のサブルーチンと複数のグローバル変数を１つのクラスに「まとめる」ことができる。

**メリット**

* 部品の数が減る
* メソッドの名前付けが楽になる
* メソッドが探しやすくなる
:::

クラスにより、変数とサブルーチンをまとめることができる。オブジェクト思考プログラミングでは、クラスにまとめたサブルーチンを**メソッド**と呼び、グローバル変数のことを**インスタンス変数**と呼ぶ。

数行のコードをまとめただけではまとめることの効果は感じづらいが、大規模なアプリケーションにおいては、全体の部品の数を減らすこと大きなメリットになる。


### クラスの性能2 隠す

:::note
「**隠す**」について

クラスに定義した変数とメソッドを、他のクラスから「隠す」ことができる。

これにより、
プログラムの保守性悪化の元凶となるグローバル変数を使わずにプログラムを書くことが可能になる。
:::

「隠す」ことで、変数やメソッドが使用される範囲を限定でき、修正の影響範囲を小さくすることができる。

### クラスの性能3 たくさん作る

:::note
「**たくさん作る**」について

一旦クラスとして定義すると、実行時にそこからいくつでもインスタンスを作ることができる。

これにより、
ファイル、文字列、顧客情報など、同種の情報を複数同時に扱う処理であっても、そのクラス内部のロジックをシンプルにできる。
:::
開発系イベントの開催で役に立ったサービス

# 背景
ハッカソンなどのような開発系イベントを開催する際に役立ったサービスをメモとして残す。
他に有用なものがあればコメントお願いします。

# 会場レンタル
- スペースマーケット
    - https://www.spacemarket.com/

自社以外の外部で開催する場合、会場をレンタルする必要がある。
最大収容人数や設備、地域などで検索できるので便利だった。
予約したあとにメッセージ機能で担当者に質問できるのも◯
実際レンタルする前に見学するのがおすすめ。

# WiFi レンタル
- NETAGE
    - https://www.netage.ne.jp/

会場で WiFi を提供していることも多いが、速度や同時接続可能数などで想定したスピードが出ない可能性がある。
バックアップのインターネット回線を用意する際に便利だった。
n泊n+1日という形で借りるので、イベント当日から利用したい場合は前日から借りるのが無難。

# 食事
- ごちクル
    - https://gochikuru.com/

主催者で食事も提供する場合、それなりの人数がいると結構大変です。
お弁当の宅配を手配するのに便利でした。
金額、ジャンル、宅配可能地域などで検索できるのが良い。

# 今回利用しなかったもの
- PC、タブレットなどのレンタル
- 宿泊する場合の会場
第一世代のQAエンジニア(5)JIS Q 9005のススメ

## 1. はじめに
JIS Q 9005が2023年2月に改正され、「[JIS Q 9005:2023 品質マネジメントシステム―持続的成功の指針](https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=JIS+Q+9005%3A2023)」として発行されました。今回はこのJIS規格を取り上げてみます。

## 2. JIS Q 9005:2023
QAは品質マネジメントシステム（QMS）を回すのが役割ですが、そのQMSが備えていると良いことをまとめたガイドブックが「[JIS Q 9005:2023 品質マネジメントシステム―持続的成功の指針](https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=JIS+Q+9005%3A2023)」です。2005年に制定され、2014年および2023年に改正されました。

JIS Q 9005は「認証，規制又は契約に用いることを意図していない」ガイドラインです。

### 2.1 規格の趣旨
本規格の趣旨を序文より引用します。

> 0 序文
> 0.1 一般
> 組織がその使命を果たし，競争優位を維持して持続的成功を実現するためには，組織の提供する製品・サービスの価値が顧客，社会及びその他の利害関係者に満足を与えることによって，組織の存在意義を高めることが不可欠である。
>
> そのために，組織は，効果的かつ効率的に組織の総合的なパフォーマンスを継続的に改善し，顧客，社会及びその他の利害関係者のニーズ及び期待に応えて，価値を創造していくことが必要である。また，高い価値を創造し続けるためには，組織は市場のニーズの多様化，技術革新など組織を取り巻く事業環境の変化を迅速に察知し，対応することが必要である。
>
> この規格は，変化する事業環境に組織が俊敏に適応するための品質マネジメントシステムのモデルを提供する。

第一世代のQAエンジニアの役割をJIS Q 9005に倣って言うと、組織にQMSを構築し、QMSを運用、改善、革新しながら次のような取り組みを以って経営に貢献することと言えます。

- 効果的かつ効率的に組織の総合的なパフォーマンスを継続的に改善する
- 顧客，社会及びその他の利害関係者のニーズ及び期待に応えて，価値を創造する
- 市場のニーズの多様化，技術革新など組織を取り巻く事業環境の変化を迅速に察知し，対応する

ここで事業環境の変化への対応は製品やサービス、QMS自体の改善にとどまらず事業シナリオの見直しおよび新たな事業シナリオに適したQMSへの作り替えも含んでいます。

### 2.2 品質の定義
用語及び定義より引用します。

> 3.1
> 品質（quality）
> 考慮の対象に関する特性の集まりが，ニーズ又は期待を満たす程度
> 注釈1 JIS Q 9000 の品質の定義とは，次の点で異なる。
> － JIS Q 9000 では，“本来備わっている特性”としているのに対し，この規格では，本来備わっているかどうかにかかわらず，ニーズ又は期待を満たす能力に関する特性の全体としており，価格など付与された特性も品質に含まれるものとしている。
> － JIS Q 9000 では，“要求事項を満たす程度”としているのに対し，この規格ではニーズ又は期待とした。これによって，品質に関する考慮事項には，要求事項であると認識されていないニーズ又は期待が含まれることになる。

JIS Q 9000（ISO 9000）と比べると広く押さえています。また価格など付与された特性も含むのが特徴です。

### 2.3 スコープ
マーケティングからリリース後の顧客サポートまで幅広く含みます。

- マーケティング
- 研究開発
- 製品・サービスの企画
- 設計・開発
- 購買
- 製造及びサービス提供
- 製品・サービスの検査及び試験
- 製品・サービスの販売
- 製品・サービスの引渡し及び引渡し後の顧客サポート

QA部門のスコープを筆者なりに図解したものを以下に示します。マーケティング、研究開発から顧客サポートまでQAエンジニアの守備範囲は多岐にわたります。
![qa-scope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/23fbe9d8-091c-a4b7-6606-0f956b7f817f.png)

### 2.4 品質部門の役割
品質部門の役割を「品質部門は，事業の持続的成功を実現するための品質マネジメントシステムを運用し，管轄する部門であると認識し，自らが果たすべき役割を明確にするとともに，その役割を果たすために必要なプロセス及び仕組みを計画し，確実に実施することが望ましい。」と示し、次の2点が挙げられています。

- 価値提供のための運営基盤の整備及び推進
- CQO の確実な任務遂行のための支援活動

## 3. 活用の仕方
そもそもQMSに馴染みがない場合、こちらは京都府の薬事講習会の資料ですがQMSについて初めて読む資料として分かりやすいと思いました。後者は自社ドメインの事例に置き換えながら読むと良いでしょう。

- [組織に見合った品質管理体制の構築](https://www.pref.kyoto.jp/yakumu/documents/4_iida2.pdf)（[平成28年度薬事講習会／京都府](https://www.pref.kyoto.jp/yakumu/27yakuzikousyuu.html)）
- [新規参入企業・小規模事業者のための医療機器品質マネジメントシステムの基礎知識](https://www.pref.kyoto.jp/yakumu/documents/r41021_iida.pdf)（[第5回薬事支援セミナー／京都府・2022年](https://www.pref.kyoto.jp/yakumu/seminar.html)）

JIS規格はさまざまな産業に利用できるよう汎用的に書かれていて必ずしもソフトウェア開発になじまない項目があったり、第一世代のQAエンジニアは最初はあれもこれもはできなかったりします。すでに実施している取り組みとJIS Q 9005:2023を見比べて優先度が高くて達成度が低い領域を見つけ、改善の糸口にします。

## 4. おわりに
QMSを回す役割を担うQA部門、QAエンジニアはその活動の範囲がとても広いです。JIS Q 9005は組織が描くありたい姿と現在のギャップを認識しそのギャップを埋めるための地図を作るものと捉えると良いと思います。
【CSS】:has()の使い方

## 子孫要素に特定のクラスを持つ`div`
```css
div:has(.sample)
```
`sample`というクラスが子孫要素にある`div`を対象にできます。

`,`で区切ることで複数のクラスを指定できます。

```css
div:has(.sample, .example)
```

## 子要素が特定の要素の`div`

```css
div:has(> p)
```

`p`が子要素である`div`が対象。

## 直後に特定の要素がある`div`

```css
div:has(+ p)
```

直後に`p`がある`div`が対象になります。
Transpoterを使ってExpoアプリをTestFlightで配布

# Transpoterを使ってExpoアプリをTestFlightで配布
easコマンドではなくiosはMacAppの「**Transporter**」を使ってTestFlightを配布するところまでの忘備録
androidも
[Transporter](https://apps.apple.com/jp/app/transporter/id1450874784?mt=12 "App Store Transporter")
# 1 buildに必要なファイル作成
**eas build**を実行する前に
eas.json,
app.config.js,
app.json
この3ファイルを適宜作成します。
# 2　build実行
次に早速buikdしていきます。

**iosの場合**
```zsh
eas build --profile develop --platform ios
```
**androidの場合**
```zsh
eas build --profile develop --platform android
```
それぞれ実行してうまくいくとexpoの管理画面からbuild中のアイコンが表示される。
# 3　アプリを作成
iosの場合**App Store Connect**で、androidの場合は**Google Play Console**でそれぞれ新しくアプリを作成します。
# 4 提出
いよいよ提出します。
iosの時にTransporterを使っていきます。
expoの管理画面からbuildが終了すると画像のようにダウンロードすることができますのでダウンロードします。
![expo_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556229/d1f2e59f-39f2-3625-3fca-3de85cbb696b.png)
iosはipaファイル、androidはaabファイルがダウンロードできます。

**iosの場合**
Transporterを起動してダウンロードしたipaファイルをドラッグアンドドロップします。
そしてデリバリを押すとApp Store Connectに提出されます。

**androidの場合**
Google Play Consoleで作成したアプリを開きアプリ署名鍵を選択してファイルをドラッグアンドドロップして終了です。
この後それぞれのTestFlightを配布したら無事終了です。
sp-apiのcreatefeedは制限をかけられていてUnauthorizedになる？


以下のページの補足です。
https://github.com/amzn/selling-partner-api-docs/issues/122
検索で見つけて読んでくれることを想定しているので、全体をかなり端折っています。

## 動作環境
- php laravel jlevers/selling-partner-api 

## エラーの内容(Unauthorized)

```
$result = $apiInstance->createFeed($body);
```
を実行した結果、以下のレスポンス(Unauthorized)となる。
```
[403] {
  "errors": [
    {
      "code": "Unauthorized",
      "message": "Access to the resource is forbidden",
      "details": ""
    }
  ]
}
```
Unauthorizedと表示されているので、認証エラー的なやつなのだが、他のAPIは問題く実行できているのに、CreateFeed()のみ、Unauthorizedとなってしまう。

## 解決策
- ①セラーセントラルに入って、アプリの開発 > アプリの編集 > 次のチェックがついていることを確認する。
  - Amazonから発送 Amazonに納品し、Amazonが購入者に直接発送します。フルフィルメント by Amazonも含まれます。
  - たぶん、これがUnauthorizedになった制限の理由だと思う。(初めから全てにチェックをつけておけばよかった)
- ②リフレッシュトークンとクライアントIDとクライアントシークレットを新しいのに変更しましょう。そして、キャッシュを消すコマンドを叩く(Laravelなら、php artisan cache:clearとphp artisan config:cache)
  - これに気づかなくて、ほぼ一日 Unauthorized と格闘してしまった。

## 成功
- 成功すると、以下のようなレスポンスとなります。
```
  "feedId": "1126430XXXXX"
```
Dynamics 365 SCM リリース済製品マスタ登録手順

# はじめに
Dynamics365 SCMでリリース済製品の登録方法をスクリーンショット、手順付きで解説します。
リリース済製品を登録すると、登録した単位で使用できるようになります。

# 今回確認した環境のVersion・必要ライセンス
バージョン: 10.0.35 (10.0.1627.92)
Dynamics365 SCM Base License

# リリース済製品マスタ登録
:::note info
以降、Dynamics365 Finance and Operationsを操作しています
:::

[製品情報管理] > [製品] > [リリースされた製品]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/6a443d46-3f0c-572a-2419-5f993bf11cba.png)

[+新規]ボタンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/819b0730-62fe-5208-34c3-1b119f69438c.png)

[製品番号],[製品名]を入力

:::note info
●製品番号は番号順序を予め設定していると自動で入力されます。
●検索名には製品名が自動で入力されます。任意の検索名に変更も可能です。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/776631f2-4641-ae4a-15d3-9a481fb30b15.png)

[品目モデルグループ]のドロップダウンを開き、グループを選択
例として[FIFO]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/717c118a-d4c3-9c00-9729-4f97a0a26337.png)

[品目グループ]のドロップダウンを開き、グループを選択
例として[Consume]を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/29356707-8d3c-a393-7e7b-df9e7ac97f94.png)

[保管分析コードグループ]のドロップタウンを開き、グループを選択
例として[SiteWH]を選択。

:::note info
保管分析コードは、品目保管方法と在庫の取得方法を管理します。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/5e07f215-4463-e6b5-00ee-9238b1738758.png)


[追跡用分析コードグループ]のドロップダウンを開き、グループを選択
例として[None]を選択

:::note info
追跡用分析コードは、製品に追加できる追跡用分析コードです。バッチ番号、シリアル番号などをセットすると在庫品目を追跡できます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/ec491d37-e14b-e9e9-b40e-d84965832402.png)

必要な測定単位を入力
[在庫単位・購買単位・販売単位]に[ea]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/9b0f5bbe-35da-7273-2c8c-3305cdf6906c.png)

OKボタンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/fb993ac4-6b8f-b152-8f3b-8f0d3d7c11b4.png)

登録が完了しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/0116c831-a5f9-9084-d99d-7f5bdd9970ec.png)

[製品]タブの [管理] > [検証]を選択すると、
リリース済製品のマスタ登録に必要な項目の抜け漏れを確認する事ができます。
例：品目モデルグループが入力されていなかった場合の挙動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/104df01f-1995-1054-6ccc-21c2df9083ff.png)

必要な項目に入力した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/6de1d208-4d50-db99-05b2-94127b0c7e73.png)


# 閑話休題
Bing Chatに指示して本内容をOutputできるか？
うーん。おしい😔
```
Dynamics365SCMでリリース済製品の登録方法を詳細手順付き、画像を付けて教えてください
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/43295657-39a2-cb52-5d74-26b87ff32dbe.png)

# 参考資料
https://learn.microsoft.com/ja-jp/dynamics365/supply-chain/pim/tasks/create-released-product-single-company
LPIC102の内容から業務で使いそうなコマンド②

本記事は、勉強したことのアウトプット（メモ）です。
LPIC102を勉強中のため、試験内容から使ったことあるコマンドや使ってみたいコマンドをまとめました。
以下記事の続きです。

https://qiita.com/kahataku/items/6405eeeac13349a01b8a

#### 現状
- web系エンジニアやっています。
- LPIC101に合格し、LPIC102の勉強中。

#### 他記事
LPIC101の記事も投稿しています。

https://qiita.com/kahataku/items/2e94dacd26a926b80f14

https://qiita.com/kahataku/items/b12e01dd1f36fd26f315

## 使用参考書、サイト
- [inux教科書 LPICレベル1 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798160490/ref=asc_df_4798160490/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=10026356874543379694&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009292&hvtargid=pla-649269108462&psc=1&th=1&psc=1)
- [ping-t](https://ping-t.com/)
- [Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version5-0%E5%AF%BE%E5%BF%9C-%E5%B1%B1%E6%9C%AC/dp/4798160857/ref=sr_1_1?adgrpid=56122615434&hvadid=667834322319&hvdev=c&hvlocphy=1009292&hvnetw=g&hvqmt=e&hvrand=9361466665802150923&hvtargid=kwd-334266044763&hydadcr=26605_11772063&jp-ad-ap=0&keywords=lpic+%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC&qid=1694935740&sr=8-1)

## コマンド
#### date
システムクロックを参照して、現在の日時を表示します。
また、rootの場合、dateコマンドでシステムクロックを変更することができます。
###### オプション
| オプション | 説明 |
|:-:|:-:|
|  -d | 指定したオプションで日時取得  |
|  -s | 日時を設定  |
|  -u | 協定世界時を取得  |
|  +format | 指定した形式で日時を取得  |

```linux:bash
$ date
2023年 10月31日 火曜日 22時00分00秒 JST
```
#### hwclock
ハードウェアロックの参照や設定を行います。
###### オプション
| オプション | 説明 |
|:-:|:-:|
| -r  | ハードウェアクロックを表示  |
| -w(--systohc)  | システムクロックの時刻をハードウェアクロックに設定  |
| -s(--hctosys)  | ハードウェアクロックの時刻をシステムクロックに設定  |

#### nptdate
指定したNTPサーバから現在時刻を取得します。
```linux:bash
#test.server.jpの現在時刻を取得
# ntpdate test.server.jp
```
#### ping
指定されたホスト（ホスト名、IPアドレス）にICMPパケットを送信し、その反応を表示します。
###### オプション
| オプション | 説明 |
|:-:|:-:|
| -c 回数  | 指定した回数だけICMPパケットを送信  |
| -i 間隔  | 指定した間隔（秒）ごとにICMPパケットを送信（デフォルト：1秒）|

#### hostname
ホスト名を指定しなかった場合、現在のホスト名を表示します。
ホスト名を指定した場合、ホスト名を変更します。
ホスト名の変更は、rootのみ可能です。

```linux:bash
#ホスト名をtest.test.netに変更
# hostname test.test.net
```
#### ip
ネットワークインターフェースやルーティングテーブル、ARPテーブル等を管理するコマンドです。
###### ipコマンドの主な操作対象
| 操作対象 | 説明 |
|:-:|:-:|
| link  | データリンク層  |
| addr  | IPアドレス  |
| route  | ルーティングテーブル  |

###### サブコマンド
| サブコマンド | 説明 |
|:-:|:-:|
| show  | 表示  |
| add  | 設定  |

サブコマンドを省略するとshowが指定されたとみなされます。

## 参考文献
- https://www.sejuku.net/blog/50053
- https://eng-entrance.com/linux-clock-hard

## 最後に
まだ記載内容が浅いので、勉強していくのと並行して、更新できたらと思っています。
【React】イベントハンドラーにイベントオブジェクトを渡す方法

# はじめに
Reactでイベントハンドラーの引数にDOMのイベントオブジェクトを渡す方法についてのメモになるので、React初心者向けです。
通常のJavaScriptや他のWebフロントエンドライブラリ（Angular）との違いも併せて紹介します。

※イベントオブジェクトはイベント（クリック、入力、マウスオーバー等）が発生した要素の情報を持つオブジェクトです。

https://tcd-theme.com/2022/09/javascript-eventobject.html

# 概要

- 通常のJavaScript
- Angular
- React

## 通常のJavaScript

DOMの要素に渡すイベントハンドラーの引数にイベントオブジェクトを指定

```js
document.getElementById("text").addEventListener('input', listener);

function listener(e){
  console.log(e.target.textContent);
}

// 指定した要素に文字が入力されたタイミングで発火
```

## Angular

clickイベントに渡した独自のイベントハンドラーの引数に「$event」の形式でイベントオブジェクトを渡す

```js
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <!-- 自前のイベントハンドラー（onClickHandler）イベントオブジェクトを渡す-->
    <input type="button" value="イベントオブジェクト" (click)="onClickHandler($event)" />
  `,
})
export class AppComponent  { 
  // イベント情報を出力する関数
  onClickHandler(e: HTMLInputElement) {
    console.log(e);
  }
}
```

TypeScriptでイベントオブジェクトの型を厳密に取り扱おうとすると少し面倒。。

https://zenn.dev/koduki/articles/0f8fcbc9a7485b

:::note info
Angularでは`()`がイベントバインディングで`[]`がプロパティバインディングとなっており、コンポーネント側で定義した`@Input` あるいは `@Output`プロパティに紐づけることが可能。
`[()]`と組み合わせることで双方向バインディングとなる。
:::

## React

これだと未定義エラー

```jsx
export default function Button({ title }) {
  const handler = (e) => {
    console.log(e)
  }
  return <button onClick={handler(e)}>{title}</button>;
  // 'e' is not defined.
}
```

onClickイベントには 関数呼び出しを渡すのではなく、関数そのものを渡す

独自の引数を渡すために一度アロー関数を介してイベントハンドラーを呼び出している

```jsx
export default function Button({ title }) {
  const handler = (e) => {
    console.log(e);
  };
  return <button onClick={(e) => handler(e)}>{title}</button>;
}

```
:::note warn
※2023年11月2日 いただいたコメントを基に追記


on○○に指定した関数は引数としてイベントオブジェクトを受け取ることができるみたいです。
:::


```jsx
import { MouseEvent } from "react";

export default function SampleEvent() {
  // 中略
  const handleClick = (e: MouseEvent<HTMLButtonElement>) => {
    // SyntheticBaseEvent {_reactName: 'onClick', ... という内容がコンソールに表示される
    console.log(e);
  };

  return (
    <button id="hogehoge" onClick={handleClick}>
      クリック
    </button>
  );
}
```

# 最後に

現在Reactの勉強中ですが、Angularを長く触っていたのでつい癖でイベントハンドラーをそのまま渡しそうになります。
定時帰る術-Linux ログ管理（rsyslog）

Linux世界のログが大体rsyslogに管理され、/var/log配下に格納されている。
rsyslogを使って、ロカールのログだけではなく、リモートにログ転送することや、リモートからのログ集中管理することもできる。
転送ポート：514

・サービス管理：systemdに管理されているため、systemctl系のコマンドが実行できる。status/start/stop/restart等々
・定義ファイル場所：
```
[root@mgmt ~]# ll /etc/rsyslog.conf
-rw-r--r-- 1 root root 3489 12月 26  2022 /etc/rsyslog.conf
```
↓も忘れず
```
[root@mgmt ~]# grep include /etc/rsyslog.conf
include(file="/etc/rsyslog.d/*.conf" mode="optional")
```
### クライアント側
**（Targetのところだけ環境に合わせて設定すれば、普通にいける。以外のはコメントアウトを外すだけ）**

```
action(type="omfwd"
queue.filename="fwdRule1"       # unique name prefix for spool files
queue.saveonshutdown="on"       # save messages to disk on shutdown
queue.type="LinkedList"         # run asynchronously
action.resumeRetryCount="-1"    # infinite retries if host is down
Target="192.168.100.6" Port="514" Protocol="tcp")
```
修正が終わったら、定義ファイルのチェックしてから、サービスを再起動するようにしよう
```
[root@mgmt syslog]#  rsyslogd -N 1
rsyslogd: version 8.2102.0-10.el8, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
[root@momo ~]# systemctl restart rsyslog
```

### サーバ側
**TCPの方がパフォーマンスよく、tcpでいこう**
これで、クライアント側にSSHすると、ログがサーバ側の/var/log/syslog/配下にとんでいく。

```
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
$template RemoteAllLogs,"/var/log/syslog/%HOSTNAME%/%PROGRAMNAME%.log"
$template RemoteSSHLogs,"/var/log/syslog/%HOSTNAME%-ssh.log"
*.warning ?RemoteAllLogs
authpriv.* ?RemoteSSHLogs
$AllowedSender TCP, 192.168.0.0/16
```
### やってみる
クライアント側からテストログを送る
```
[root@momo ~]# logger -p cron.warning "snow log test"
```
サーバ側で確認
```
[root@mgmt momo]# pwd
/var/log/syslog/momo
[root@mgmt momo]#  cat root.log
Oct 31 22:51:30 momo root[319241]: snow log test
```

### 設定ファイルの考え方
facilityとpriorityがあり、↓が考え方
facilityのpriorityログを/var/log/snowにはくということ
facility.priority /var/log/snow
例えば、デフォルトの場合、メール、認証、cronログの除いて、全部のwarningログを「/var/log/messages」に出力する。
*.warning;mail.none;authpriv.none;cron.none                /var/log/messages

### よく使うfacilityの種類
authpriv、cron,、daemon、kern、mail、syslog、user、local0 ～ local7
### よく使うpriorityの種類
debug、info、notice、warn、err、crit、alert
### テンプレート
↑の例では、HOSTNAMEとPROGRAMNAMEを設定したが、その以外もいろんなモノがあり、詳しくはgoogle先生に聞いてみよう。

### 最後
ここらへんの種類（facility、priority、テンプレート）が多すぎで、川口も年をとって覚えられなく、基本的にはgoogle先生にききながら、やっていく感じ
だが、**ネット上の記事通りにやるだけではなく、ちゃんとloggerコマンドで確認することが重要**
### トラブルシューティング
↓にはよく問題ある箇所

■サービスの状態
■ディスクの容量
■ディレクトリの権限
■ping疎通
■ポート番号
■tcp/udp
■FW
■selinux
【Rails】CSVファイルを用意して開発環境のテーブルにデータを登録する方法

いつもプログラミングお疲れ様です。

この記事が自分にとって初めてのQiitaでの投稿になります。
自分自身の発信力・アウトプット力の向上と、同じような機能を実装したい方への道しるべになればと思い筆をとりました。

Ruby on Railsでアプリを作成している方の手助けになれば幸いです。


# 大まかな流れ
①モデルを作成する
➁CSVファイルと、CSVを読み込ませるスクリプトファイルを作る
➂スクリプトファイルを実行し、CSVの内容をテーブルに書き込む。

# 実際の手順 
順を追って手順をご紹介いたします。
## ①モデルを作成する。
ここでは、モデル名を「hoge」とする。
```ターミナル
$ rails g model Hoge
```

マイグレーションファイルにカラムを追加したり、型や制約を加える。
```ruby
class CreateHoges < ActiveRecord::Migration[6.0]
  def change
    create_table :hoges do |t|
      t.string     :name,          null: false # 例です
      t.integer    :foo,           null: false # 例です
      t.references :user,          null: false, foreign_key: true # 例です
      t.timestamps
    end
  end
end
```


テーブルをマイグレートする。
```ターミナル
$ rails db:migrate
```




## ➁CSVファイルと、CSVを読み込ませるスクリプトファイルを作る
dbディレクトリに、csvディレクトリを新しく作成する。
```
db/csv
```

↓

そのcsvディレクトリ内に、読み込ませたいcsvファイルを置く。
この記事ではfoo.csvファイルとする。

【参考】CSVファイルをVSCodeで編集したり、Excelで編集したりするときに文字化けして困ったときにお世話になった記事
[CSVファイルをExcelで開くと文字化けする場合の対処法](https://www.pc-koubou.jp/magazine/38143)

↓

スクリプトファイル hoge_script.rb を作成する。分かりやすい名前ならなんでもよい。
この記事においてスクリプトファイルは、Railsプロジェクトのルートディレクトリに置くとする。

後述するスクリプトファイル内で記述するCSVへのパスをいじれば、プロジェクト内のディレクトリのどこに置いても動作するようになるが、この記事ではルートディレクトリに置くという前提で説明していく。

以下はひな形。

```ruby
require 'csv'

# 1 … CSVファイルのパスを設定する
csv_file_path = 'db/csv/foo.csv' # ルートディレクトリにスクリプトファイルを、db/csvディレクトリにcsvファイルを置いた場合の記述 

# 2 … CSVファイルからデータを読み込み、Hogesテーブルに登録
CSV.foreach(csv_file_path, headers: true) do |row|
  Hoge.create!(
    fuga_1: row['hoge_1'],
    fuga_2: row['hoge_2'],
    fuga_3: row['hoge_3']
  )
end

# 3 … ファイル実行後に、処理が成功したという文章を表示させる。
# ここはお好みで。記述しなくても動作はする。
puts 'Hoge data imported successfully!'
```
ひな形の解説
まず、スクリプト内の csv_file_path 変数にCSVファイルの相対パスを設定している。
次に、スクリプト内でCSVファイルを読み込み、各行のデータを使用してHogesテーブルに新しいレコードを作成している。
そして最後に。CSVファイルのヘッダー行を考慮して、各列のデータを正しいフィールドに割り当てて登録する、という流れになっている。

## ➂スクリプトファイルを実行し、CSVの内容をテーブルに書き込む。
いよいよ、CSVファイルをテーブルに書きこむスクリプトを実行する。
コンソールからスクリプトファイルを実行する手順となっている。

ターミナルでコンソールを起動する。
```
$ rails c
```

コンソールで次のようにコマンドを打ち込む。
```
load 'hoge_script.rb'
```
スクリプトが正常に実行された場合、HogeテーブルにCSVファイル内のデータがインポートされ、"Hoge data imported successfully!" というメッセージが表示される。
もし表示されなかったら、エラーが発生している。


# 各種エラーへの対処
## ①CSV::MalformedCSVError: Invalid byte sequence in UTF-8 in line 2.みたいなエラーが出た時

```
[1] pry(main)> load 'hoge_script.rb'
CSV::MalformedCSVError: Invalid byte sequence in UTF-8 in line 2.
from /home/hogehoge/nantokakanntoka
```
みたいなエラーが出た時
以下の手順でエラーを解決できるか試してみよう。

CSVファイルをUTF-8エンコーディングで保存し、BOMなしのUTF-8形式に変換するように記述。

```ruby
# CSVファイルをUTF-8に変換してデータを読み込み、Hogesテーブルに登録
CSV.foreach(csv_file_path, headers: true, encoding: 'bom|utf-8') do |row|
```



## ➁テーブルのカラムの1列目が必ず読み込まれない場合
こちらの記事を参考に対処してみよう。
[【ruby】CSVファイル読み込み時に1列目のデータが読み込めない時の対応](https://qiita.com/ryo_kh/items/a2dab5e239f1db005a8a)
掌握成功的關鍵：海外工作面試訣竅


在全球化的時代，許多人夢想著在國外工作，這不僅能夠提供更多的機會，還能夠豐富個人經歷。然而，海外工作的面試過程可能會令人感到壓力重重。在這篇文章中，我們將探討一些在[美國工作](https://www.apexcharity.org/news/3/85)的面試中關鍵的訣竅，包括如何進行[英文自我介紹](https://www.apexcharity.org/news/3/92)以及應對[英文面試](https://www.apexcharity.org/news/3/93)的技巧。

英文自我介紹
當你參加[海外工作](https://www.apexcharity.org/news/3/86)的面試時，首先要準備好一份出色的英文自我介紹。這是你給面試官留下第一印象的機會，因此需要仔細考慮。以下是一些撰寫英文自我介紹的建議：

簡單而明確的開場白：在開始介紹自己時，使用簡單明確的語言，提到你的姓名、所學專業或工作經驗，以及你為何對該職位感興趣。

強調關鍵技能：列舉你在過去的工作或學習中獲得的技能和成就，特別是那些與申請的工作相關的技能。

表達對公司的興趣：講述你為什麼對該公司感興趣，可能是因為他們的產品、價值觀或企業文化。這表明你已經對該公司有一定的了解。

強調國際經驗：如果你有國際經驗，例如留學或在國際環境中工作，請強調這些經驗，這對於海外職位非常有價值。

練習流利的英文：確保你的自我介紹流利，自信，不要在用詞或語法上出現錯誤。可以多次練習，並請友人或導師提供反饋。

英文面試
面試是進一步評估你是否適合該職位的關鍵階段，特別是在國外工作的情況下。以下是一些應對英文面試的技巧：

提前準備：研究公司，了解他們的價值觀和文化，並查找可能問到的常見面試問題。

積極的身體語言：面試時，注意你的姿勢，保持積極的身體語言，這表現出你的自信和專注。

清晰的回答：回答問題時，使用清晰，有邏輯的結構，提供具體的例子來支持你的回答。

語言技巧：保持語速適中，不要急促，避免使用口語詞彙，確保用詞準確。

提問機會：當結束面試時，通常會有機會提問面試官問題。這是一個展示你對公司的興趣和思考能力的機會，不要浪費。

在努力克服語言障礙的同時，要記住，自信和對自己的能力的信心是成功的關鍵。經過充分的準備和實踐，你可以在海外工作的面試中表現出色，實現自己的夢想。祝你好運！
データベーステーブルにカラムを追加する方法


# データベーステーブルにカラムを追加する方法

データベース設計はアプリケーションの要となる部分で、時折新しい情報を格納する必要が出てきます。幸い、Ruby on Railsなどのフレームワークはこのタスクを比較的容易に行うことができます。

## 1. マイグレーションファイルの作成

新しいカラムを追加するには、マイグレーションファイルを作成します。例えば、ユーザーのテーブルに誕生日カラムを追加する場合、ターミナルで以下のコマンドを実行します：

```
rails generate migration AddBirthdayToUsers birthday:date
```

このコマンドで`AddBirthdayToUsers`という名前のマイグレーションファイルが`db/migrate`ディレクトリに作成されます。

## 2. マイグレーションファイルの編集

生成されたマイグレーションファイルを開き、`change`メソッド内に新しいカラムを追加します。例：

```ruby
class AddBirthdayToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :birthday, :date
  end
end
```

この例では、`users`テーブルに`birthday`という名前の`date`型カラムが追加されます。

## 3. マイグレーションの実行

マイグレーションを実行してデータベースに変更を適用します：

```
rails db:migrate
```

これにより、新しいカラムがテーブルに追加されます。

## 4. モデルの更新

カラムがテーブルに追加されたら、モデルも更新する必要があります。ユーザーモデルに`birthday`カラムを追加する場合、`app/models/user.rb`ファイルを開き、以下のように追加します：

```ruby
class User < ApplicationRecord
  # 他のカラムの定義
  # ...
  validates :birthday, presence: true
end
```

## まとめ

データベーステーブルにカラムを追加するには、マイグレーションファイルを生成し、編集し、`db:migrate`コマンドを実行します。また、モデルも新しいカラムを考慮に入れて更新することを忘れないようにしましょう。これにより、アプリケーションに新しい情報を格納できるようになります。

データベース設計はアプリケーションの進化に合わせて変更することがよくあり、マイグレーションを理解していることは開発者にとって重要なスキルです。
JavaScript Primer - 迷わないための入門書を読んで

初学者がJavaScript Primer - 迷わないための入門書を読んだ感想です。

# 良かったところ
- メソッドの解説だけでなく、どういった使い方ができるかも書かれていた。
- その機能が作られた経緯や歴史が解説されており、理解の向上につながった。

# 学んだこと
- constは再代入できない変数の宣言。letは再代入が可能な変数の宣言。varは同じ名前の変数が宣言できてしまうことから非推奨となっている。
- 等価演算子（==）は、オペランド同士が異なる型の値の際に、同じ型となるように**暗黙的な型変換**を行うので厳密等価演算子（==）を使う。
```
// 文字列の１を数値に変換してから比較される
console.log(1 == "1"); // => true
```
- Nullish coalescing演算子(??)は左辺の値が**nullish**(評価結果がnull,undefinedとなる値のこと)なら右辺の評価結果を返す。
値のデフォルト値を指定する場合によく利用される。
```
const inputValue = 0;
const value = inputValue ?? 10;
// OR演算子（||）の場合は、0だとfalsyな値と評価され10と出力されてしまい、
// 意図しない動作となるのを防げる
console.log(value) // => 0
```
- NaNはNot a NumberだがNumber型の値であり、何と演算してもNaNになる。また、NaNは自分自身と一致しない特徴を持っている。
- ...(Spread構文)を使うことで、配列リテラル中に既存の配列を展開できる。
```
const array = [1, 2, 3]
const newArray = [4, ...array, 5]
// concatとは違い任意の場所で展開できる
console.log(newArray) // => [4, 1, 2, 3, 5]
```
- for文はループ毎に新しいスコープを作成するので、constが使えること。
- Arrow functionはthisを暗黙的な引数として受け付けていない。Arrow function内のthisは外側のスコープを参照するので、他の関数やメソッドとは違いthisを意識しなくていい。
- 非同期処理はコードを順番に処理しているが、一つの非同期処理が終わるのを待たずに次の処理を評価する。

# 難しかったこと
- thisや非同期処理などの解説は１度読んだだけではあまり理解できなかった。解説も難しいと感じた。
- ボリュームが結構あり、単体での解説では理解できたことも、他の要素と組み合わさるとよくわからない状態になった。
PHPでよく起こるエラーと対処方法

プログラムを書いていると必ず出会うのがエラーです。
エラーはちゃんとログを読めば、何が原因でエラーが起きているか分かるので怖いものではないです。
（ただ、初心者の頃はエラーが出ると、分からなくて困っていた記憶があります）

このあたり慣れると感覚でできますが、慣れるまでは難しいと思ってしまうところです。
**なので、日本語ベースでだいたい「どういうエラーが起きるのか？」を知っておくと、解決するのが早くなります。**

前提として、どんなエラーが起きているか分かっているのと、分からないのとでは、全く違いますからね。
（これはプログラミング以外のことでも同様です）

## PHPでよく起こるエラーと対処方法

### 文法的に書き方が間違っている

初心者にあるあるなエラーですが、ネストが深くて分からなくなってしまうケースもあります。
**基本的に、始めたら閉じるのがプログラミング言語の書き方では重要です。**
（{}とか()とか""とか;とか）

あとは、変数の宣言やコードの途中に全角で文字が入ってしまっているケースですかね。
スペースが全角になっていると見つけるのが大変なので、VSCodeでプラグインを入れてコードを書くとミスが減りますよ。

### 値が分からない、引数が足りない

変数や定数に値が入ってないまま、他の関数で使っていたり呼び出しているとエラーになります。
コードを書いている時は「ちゃんと通ったら持っているはず！」と考えながら書いてますが、たまにDBから取得できてなくてエラー起きてたりします。

だいたい、Undefinedってログに出ます。

### 値（変数・定数）を間違えている

変数よりも定数のほうがよく見かける気がします。
Laravelで読み込んでいる.envファイルが違くて、別の環境の設定呼び出している時など。
環境が違うと、DBは繋がらないし、外部サービスとの連携も落ちます。

環境以外でよくあるのは、型のエラー。

### ディレクトリを間違えている

ファイルのパスが違うケースがほとんどだと思います。
このあたりは、直接PHPで書いているとなかなか遭遇しないですが、LaravelやCakePHPなどフレームワークやWordPressを使っているとよく出会います。

フレームワークやCMSによってパスの設定が様々ですから。
覚えていないとできないってことはないので、使用するたびにどうなっているか調べるといいと思います。
（フレームワークのバージョンによってもパスが変わっていたりするので）
個人的オススメのVScode拡張機能

# これはなに
個人的にオススメするVScode拡張機能を纏めたもの
Qiita内でもオススメ拡張機能記事は多いがここでは特定の言語で使うもの、どの記事でも紹介されているようなものは省いて紹介する。


## [change-case](https://marketplace.visualstudio.com/items?itemName=zhengxiaoyao0716.intelligence-change-case)

キャメルケース,スネークケース(それぞれアッパー,ローワー対応)変換する
デフォルトで選択範囲を`Control + U`で変換出来てコマンドを使わない分楽

## [Peacock](https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock)

ワークスペースごとに縁の色を変えてくれる
VScodeを複数タブ開くような人にオススメ

## [Shortcuts](https://marketplace.visualstudio.com/items?itemName=gizak.shortcuts)

ショートカットボタンを追加できる
設定できるアイコンの一覧は以下を参照
https://primer.style/design/foundations/icons

## [Project Manager](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager)

ワークスペースの一覧の確認,切り替えができる
API,フロントなど複数ワークスペースを使う人にオススメ

## [CharacterCount](https://marketplace.visualstudio.com/items?itemName=8amjp.charactercount)

リアルタイムで文字数をカウントしてくれる
普段文章もVScodeで書く人にオススメ

## [Open in Editor](https://marketplace.visualstudio.com/items?itemName=generalov.open-in-editor-vscode)

開いているファイルを別のエディタで開いてくれる
VScode以外に常用するエディタがある人にオススメ

## [codic](https://marketplace.visualstudio.com/items?itemName=pizzacat83.codic)

[codic](https://codic.jp/)のAPiを叩いてコマンドパレットで操作してくれる
普段codicを使ったり命名が面倒な人にオススメ

## [Regex Previewer](https://marketplace.visualstudio.com/items?itemName=chrmarti.regex)

正規表現を書いた際にどの文字列がマッチするのか確かめてくれる
ChatGPT先生に、VBAの面倒くさいマッピング処理を記述してもらった

### はじめに

Excelの業務効率化で、よくVBA使いますよね、みなさん。
でも、VBAって癖強言語だから意外とすんなりロジック書けなかったりして、、、
ふたを開けてみると、手でやるのとそんな作業時間変わんなかったり、とかザラですよね。。。

そう、VBA書くのってめんどいんです。そのめんどい作業を効率化するためにchatGPTを使いましょう。

### どれを使えばいいの？

最近Qiitaを眺めてたらこんな記事があったので参考にしました。
[えっ、まだChatGPT使ってんの？ Bingは無料でGPT-4使えますよ！ ](https://qiita.com/takao-takass/items/16a7052a4a0e857b7c90?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=9a36b2a414-Qiita_newsletter_586_10_04&utm_medium=email&utm_term=0_e44feaa081-9a36b2a414-49163985)

もうBing一択ですね。

### GPT先生に質問してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/f171ac2f-889a-34ec-b261-a34966327c2f.png)


いや、雑ｗ
さすがにこれじゃ欲しい回答得られないだろ・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/08d6bde0-c727-6404-1e98-1b46cd1d8cfd.png)
え？
有能？

## 検証してみた

まずはテストデータを用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/042936e9-d7c4-a455-69ac-b26dfada42a1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/0fb8b07b-6e66-49c1-a859-880f17509dda.png)

シート２の、「人気度」と「価格」部分にシート１の「おいしさ」と「料金」が入る想定。
シート２は五十音順に入れ替えているので、そのままだとコピペできない。

さっそく走らせてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/7ee5bd71-eac1-b497-ddce-462d5521c343.png)

エラーかよ！！！

よく見ると、B1セルのヘッダー部分の名称（名産品）で検索してしまったために、
シート１の列Aに該当セル見つからずMatch関数で0を返してしまい、If IsNumeric~の処理で行番号を指定する際にご臨終となったようだ。

なので、参照範囲を変えることでいったんは切り抜ける。
（レコード中にもマッチしないセルが存在することもあり得るので、本来ならエラーハンドルのやり方を変えるか別の関数を使うかした方がいい）

ここも先生にお願いしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/e0cdb918-4fd5-4cc4-3318-16592d1a822c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/950fcfeb-ea5e-f50a-ac18-a15a78c9d8ba.png)

このコードを参考に、参照範囲を変更すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/198a5a9f-f681-4fff-fb3b-6e3939cbbbd4.png)

ws1.Range("B1:B")をws1.Range("B2:B")に変えるだけで良さそう。

気を取り直してもう一度。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/09d08a83-4c33-83ee-5c1a-80ae89bd466d.png)

できてる！！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513151/355a9a4f-f409-832e-c73c-fcba6d172e7f.png)

ちゃんとおいしさと名産品も反映されてそう。
やるじゃん、Chat-GPT。

### おわりに

いかがだったでしょうか。
上手く使えるか不安なChat-GPTですが、意外と使いこなせそうですね。
ポイントとしては、100%GPT先生の出力に頼るのではなく、
適宜修正する前提で使う、ということですね。
雑な指示に対しても、ほぼ正確なコードで返してくれるので、
かなり時短ができそうというのが今回の所感でした。

みなさんも試してみては？