OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTでC言語を実行する

ChatGPTのPython実行環境にはGCCがインストールされているので、C言語のソースコードをコンパイルおよび実行できます。

```python
import os
import subprocess
import sys
import tempfile
import typing


def compile(code: str) -> bytes:
    with tempfile.NamedTemporaryFile() as f, subprocess.Popen(
        ["gcc", "-xc", "-", "-o", f.name],
        stdin=subprocess.PIPE,
        stdout=sys.stdout,
        stderr=sys.stderr,
    ) as proc:
        proc.communicate(code.encode())
        if proc.returncode != 0:
            raise RuntimeError(f"compilation failed with returncode={proc.returncode}")
        f.seek(0)
        compiled = f.read()
    return compiled


def execute(
    compiled: bytes, args: typing.Iterable[str] = [], stdin: bytes | None = None
) -> tuple[bytes, bytes]:
    with tempfile.NamedTemporaryFile(
        delete=False
    ) as f:  # Using `delete=False` is necessary because the file needs to be available for execution.
        f.write(compiled)
        f.flush()
        f_name = f.name
    try:
        subprocess.run(["chmod", "+x", f_name], check=True)
        with subprocess.Popen(
            [f_name, *args],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        ) as proc:
            stdout, stderr = proc.communicate(stdin)
            if proc.returncode != 0:
                raise RuntimeError(
                    f"execution failed with returncode={proc.returncode}"
                )
    finally:
        try:
            os.remove(f_name)
        except:
            pass
    return stdout, stderr
```

https://chatgpt.com/share/66ffd04e-12dc-8011-9c29-5f887f122a86
資格学習やハンズオンを経て感じたこと、学んだこと

# 目次
1.はじめに
2.資格関連について
3.ハンズオンについて
4.まとめ

# 1.はじめに
入社して約6か月、現在は自社業務として資格勉強やハンズオンにて学習していてなかで学んだこと、感じたことについて紹介したいと思います。

# 2.資格関連について
最初に資格勉強したのがJavaBronzeでした。もともとJava自体は専門で学んでいたのでそこまで苦労しないで取れると思っていました。


感じたこと：
・普段聞かない用語に戸惑う
　問題の中でも「データ隠蔽」「情報隠蔽」「ポリモーフィズム」という用語が出てきます。
専門学校でもこの用語自体あまり聞いたことがなかったので「え、なにこれ？」と思いました。
データ隠蔽と情報隠蔽って何が違う？ポリモーフィズムって継承とどう違うの？と疑問だらけでした。
　
・コンパイルエラーと例外スローの違いってなんだ？
　問題の選択肢にいつもいるこの二つ。
最初はあまり違いだったりどういうときに起こるのか曖昧でした。
問題を解くなかで、コンパイルエラーが起こると思っていたのが例外スローになったり判別自体が難しかったです。


学んだこと：
　とにかく問題集を周回しててもダメだなと思いました。
勿論、人によっては最適な学習方法になると思うんですけど私は、答えを覚えてしまうので問題を見たら「確か答えはA」というように本番では絶対活きないやり方だったので
**間違えた部分をルーズリーフに問題ごと書き起こしました。**
書き起こした問題に、「**データ隠蔽はカプセル化の維持を目的とし、まとめられたデータをほかのモジュールから利用されて関係が複雑化してしまうこと防ぐためにある**」という感じで意味を書き、他の選択肢も意味まで書くように勉強しました。

イメージは**自分だけの教科書を作る**感じですね。
問題集を周回することよりも時間が多くかかってしまうやり方ですが、頭にしっかり入って本番でもかなり活きたのでただ問題を解き続けるのではなく意味や他の選択肢との違いまで勉強することの大切さを学びました。

# 3.ハンズオンについて
　UdemyのSpringを使ったTodoアプリ開発を現在も学習しています。


感じたこと：
・学習していく中でWeb開発がイメージしやすい
　動画の中でクライアントとサーバでのやりとり、実際にコーディングしていくなかでサーバに対してリクエストしている箇所やレスポンスが返ってきて画面に表示する箇所が明確でイメージがしやすい。

・ただ写すだけじゃダメ
　Udemyの動画でソースコードを写して実行しここでどういうやり取りを行っているという説明なのでイメージせずに**ただ写して実行して画面の確認だけだとちゃんとインプットできない**と感じました。

# 4.まとめ
 資格取得やハンズオンの中で新しく学べたこと、また改めて覚えなおせたことが多くあったのでこれからも継続して勉強していきたいと思いますしテクニカルスキル以外もビジネススキル面もまだまだな所も多くあるので頑張りたいと思います。また、インプットだけでなくアウトプットする機会も増やしたいのでまたQiitaに書き込みたいと思います。
AWS X-Rayについて

## AWS X-Rayとは
AWS X-Rayはアプリケーションの動作に関するデータを収集・分析できるサービスです。CloudWatchはインフラレイヤでのパフォーマンスを確認できますが、X-Rayはアプリケーションレイヤを対象としてレスポンスタイムやレスポンスステータスなどの情報を収集します。主にトラブルシューティング目的で利用されます。アプリケーション内のリクエストをトレースし、処理時間やレスポンスを分析することで、パフォーマンスのボトルネックやエラーの発生箇所を特定できます。

## 使用方法
EC2、ECSやLambda、API Gatewayなど非常に多くのサービスと統合して使用することができ、統合する方法はサービスによって異なります。CloudWatchの「X-Rayトレース」として利用したり、ECSではサイドカーを使用したり、Lambdaではマネジメントコンソールからアクティブトレースを有効化するだけで使えたりします。
Python 初級入門 簡単なappを作成

## 前提
- python初学者、触ったことない人が投稿しています
- 個人的にあまり馴染みのない書き方について記載しています
- 誤っている箇所等があればコメントでご指摘いただけると幸いです
- こちらの記事は[ファイル操作](https://qiita.com/takemaru_shuna/items/ada9a56b826f90dd3600)編の続きとなっていますので気になる方は是非！


## アプリ実装
これまでの学習で学んだものを形にしてみました

### アプリケーション説明
- 画像のような対話型シェル
- 上記画像で質問した内容の回答とカウントを簡単にcsvやエクセルでまとめる
    - 初めてカウントされたものは新規で新しいデータとして挿入される
    - 2回目以降の場合は、すでに登録されているもののカウントを１増やす
    - ：注意：大文字、小文字等別々で入力されても同じものとしてカウントされるようにする
        - 例）Orange, orange → これは両方同じもの
- 以下は試しで実装
    - logをカラーで出す
    - csvのファイルを出力するようにしている


### ディレクトリツリー

<details><summary>参考までにディレクトリのツリーを置いておきます</summary>

```
├── README.txt
├── main.py
├── python_demo_app.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── python_programming_demo_app.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── ranking.csv
├── roboter
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-312.pyc
│   │   └── __init__.cpython-36.pyc
│   ├── controller
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-312.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── conversation.cpython-312.pyc
│   │   │   └── conversation.cpython-36.pyc
│   │   └── conversation.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-312.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── ranking.cpython-312.pyc
│   │   │   ├── ranking.cpython-36.pyc
│   │   │   ├── robot.cpython-312.pyc
│   │   │   └── robot.cpython-36.pyc
│   │   ├── ranking.py
│   │   └── robot.py
│   ├── templates
│   │   ├── good_by.txt
│   │   ├── greeting.txt
│   │   ├── hello.txt
│   │   └── which_restaurant.txt
│   └── views
│       ├── __init__.py
│       ├── __pycache__
│       │   ├── __init__.cpython-312.pyc
│       │   ├── __init__.cpython-36.pyc
│       │   ├── console.cpython-312.pyc
│       │   └── console.cpython-36.pyc
│       └── console.py
├── setup.cfg
└── setup.py
```
</details>




## 完成系
- [ソースコード](https://github.com/takeru1026/python-demo-app)
![スクリーンショット 2024-10-04 16.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606285/71d86f8d-4bd7-9ebc-dbb2-70834bd56f44.png)


### Pythonを学習してみて
- 自分が思っていたよりも描きやすく、便利な言語だと思った
- ただ、便利な反面安易な操作で大量のバグを生む可能性があることに注意が必要だと感じた
    - 実際、簡単なappの作成の中でも何度か起きた
- 型を意識してやる必要が他の言語よりは多い気がする
    - 他の言語はエラーとして吐かれたりするがpythonはない（多分）
- 実際にもう少しコードを書いてみたいと思うので他のアプリとは言わずとも、試しで色々なものを触ってみようと思う
- rubyと似ていてプログラミング初学者に優しい感じはあるがこれに慣れてしまうと、型付けを必要となった時に苦労するなと思う。自分もその節はあった
- 上記の面を踏まえるとrailsとかpythonを扱っているプログラミング学習塾が多かったのもうなづける



### 参照
- [Python公式](https://www.python.org/)
- [Python 初級入門　ファイル操作](https://qiita.com/takemaru_shuna/items/ada9a56b826f90dd3600)
- [Python 初級入門 オブジェクトとクラス編](https://qiita.com/takemaru_shuna/items/9e7ceb610aa68b389d13)
- [Python 初級入門 モジュールとパッケージ編](https://qiita.com/takemaru_shuna/items/f4ba304674a859a8b3f2)
- [Python 初級入門　制御フロー編](https://qiita.com/takemaru_shuna/items/3adfe0d5a3cfb79df7e0)
- [Python 初級入門　基本とデータ](https://qiita.com/takemaru_shuna/items/b510a8cc6b3e296c9ca3)
- [Udemy](https://www.udemy.com/course/python-beginner)
サーバーレスCSV出力・ダウンロードの構成

こんにちは！
普段Web開発や保守をしており、
サーバーレス構成で開発を行ったので、その記事を記載します。


## はじめに
今回は、サーバーレスアーキテクチャを活用した出力システムの構成についてご紹介します。
サーバーレスアーキテクチャは、スケーラビリティとコスト効率が高いため、多くの企業で採用されています。
本記事では、AWSのStep Functions、Lambda、RDS、S3を使用して、データを取得し、CSV形式でS3に保存した後、CloudFrontの署名付きURLでメール送信するシステムの構築について詳しく解説します。

## 構成図
![【資料用】記事用_構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/bb8a2fff-f6bf-7338-aeae-bdfe38eb87e7.png)


## 各サービスの役割
- Step Functions
    -  一連の処理フローをオーケストレーションし、各サービス間の連携を管理します。
- Lambda
    - 各種処理を担当します。
- RDS
    - ログを保存するリレーショナルデータベースサービスです。
- S3
    - 生成されたCSVファイルを保存するストレージサービスです。
- CloudFront
    - S3に保存されたファイルへの署名付きURLを提供し、安全かつ効率的に配信します。
- SES
    - メール送信サービスで、通知を送信します。
- ECS Fargate
    - フルマネージドのコンテナオーケストレーションサービスで、コンテナ化されたアプリケーションのデプロイと管理を行います。
- Secrets Manager
    -  機密情報を安全に管理します。

## システム詳細

1. ユーザー操作（ECS・Fargate）
ユーザーが画面を通じて処理リクエストします。
StepFunctionsの呼び出し方は複数あり、今回はAWS SDK を使用しました。

2. CSV生成（Lambda）
Lambda関数がRDSからデータを取得し、CSVファイルを生成しS3に出力します。

3. 署名付きURLの生成とメール送信（Lambda）
アップロード完了後、CloudFrontの署名付きURLを生成し、そのURLを含むメールをSESを使用してメール送信します。

5. エラー通知（Lambda）
処理の途中でエラーが発生した場合、それを検知して通知します。

## セキュリティの強化
CloudFrontの署名付きURLを活用し、S3にアップロードされたCSVファイルへのアクセスを制限します。署名付きURLは、指定した期限が過ぎると無効になり、セキュリティを強化します。これにより、ユーザーは一時的にしかファイルにアクセスできず、個人情報の漏洩リスクを軽減します。具体的には、署名付きURLの有効期限を「通知後3時間」に設定しています。

## エラーハンドリングと通知
ログ出力処理がLambdaの最大実行時間である15分を超える場合、タイムアウト通知がメールでユーザーに送信され、再確認を促します。また、タイムアウト以外のエラーが発生した場合は、運用チームにチャット通知が送られ、迅速に対応できる体制を整えています。

システムは最大6回まで再試行を行い、それでも失敗が続いた場合にのみ通知が送信されます。

## サーバーレス技術の活用
今回のシステムでは、サーバーレス技術を最大限に活用しています。特にAWS Lambdaは、リクエストに応じて自動的にスケールするため、データが少量でも大量でも効率的に処理可能です。また、Step Functionsは、各処理フローをスケーラブルにオーケストレーションする設計になっており、柔軟に対応可能です。

コスト面でも、サーバーを常時稼働させる必要がなく、オンデマンドで必要なリソースを使用することで効率的な運用が可能です。LambdaやStep Functionsは、実行時間に基づいて課金されるため、無駄なコストを抑えられます。

## AWS SAMによるデプロイ
AWS SAMを使用してStep FunctionsとLambdaをデプロイしました。これにより、サーバーレスアプリケーションのデプロイと管理が効率化され、YAML形式のテンプレートを使用して、Lambda関数の定義やStep Functionsのワークフローを一括でデプロイ可能です。

SAMを活用することで、リソース管理がコードとして一元化され、人為的なミスが減少し、属人化を防ぐことが期待できます。

## まとめ
今回紹介した出力システムは、サーバーレスアーキテクチャを基盤としたスケーラビリティ、コスト効率、セキュリティを考慮した構成となっています。ユーザーからのリクエストに基づき、RDSからデータを取得し、それをS3にアップロードし、CloudFrontの署名付きURLを生成してメールで送信するという一連のプロセスを実現しました。

エラーやタイムアウトが発生した際には迅速に適切な通知が行われ、システムの信頼性が高まります。この仕組みにより、ユーザーは安心してログ出力を利用でき、スムーズな運用が可能となります。

今後もサーバーレス技術を活用し、さらなる改善を図っていきたいと思います。
日本語版Gemma 2 2Bをサクッと動かしてみる

# google/gemma-2-2b-jpn-it
2024年10月3日に発表された日本語版Gemma 2 2B

> 日本語版 Gemma 2 2Bは、自社評価において、 GPT-3.5 を上回るパフォーマンスを発揮し、モバイル端末での高速でスムーズな処理能力や日英両言語における高い品質を維持しています。この結果は、モデルのサイズを考慮すると、Gemma モデルが英語以外の言語でも高い性能を発揮できる可能性を示しています。

https://blog.google/intl/ja-jp/company-news/technology/gemma-2-2b/

# Google Colabにて実行
今回はGoogle Colabの環境を使用しGemmaを動かしてみます。

https://colab.google/

Hugging Faceのアカウントが必要です。
アカウントをお持ちでない場合は、事前に登録してください。

最初にTransformers libraryをインストールします。
```shell
!pip install -U transformers
```

そしてhuggingfaceの設定を忘れずにしましょう。
```shell
!huggingface-cli login
```

あとはサンプルコードにあるpythonのコードをコピペして実行するだけ
```python:Running with the pipeline API:
import torch
from transformers import pipeline

pipe = pipeline(
    "text-generation",
    model="google/gemma-2-2b-jpn-it",
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cuda",  # replace with "mps" to run on a Mac device
)

messages = [
    {"role": "user", "content": "UEFAチャンピオンズリーグについて教えてください"},
]

outputs = pipe(messages, return_full_text=False, max_new_tokens=256)
assistant_response = outputs[0]["generated_text"].strip()
print(assistant_response)
```

そして実行します。

結果はこちら

```
## UEFAチャンピオンズリーグについて

UEFAチャンピオンズリーグ（**UCL**）は、ヨーロッパのサッカーリーグの頂点である、ヨーロッパのクラブチームによるサッカー大会です。

**特徴:**

* **世界的な注目度:**  世界中のサッカーファンから高い人気を誇り、テレビ視聴者数や試合のチケット販売数など、様々な指標で世界的な規模を誇ります。
* **強豪クラブの舞台:**  世界トップレベルのクラブチームが参加し、高いレベルの試合が展開されます。
* **歴史と伝統:**  1955年に始まり、長年続く歴史と伝統を持つ大会です。
* **賞金とタイトル:**  優勝チームには大きな賞金が贈られ、チームや選手のキャリアに大きな影響を与えるタイトルです。

**大会概要:**

* **参加チーム:**  ヨーロッパのクラブチームが参加します。
* **試合形式:**  グループリーグ、 knockout形式で試合が行われます。
* **優勝チーム:**  大会を通して勝ち進むチームが優勝者となり、UEFAチャンピオンズリーグのタイトルを獲得します。
* **大会期間:**  毎年夏に開催されます。

**魅力:**

* **世界トップレベルの試合:**  世界
```

とても簡単に実行して試すことができました。
ただ回答結果が途中で切れている気も...

`max_new_tokens` の値を倍の`512`に変更して再度実行してみます。 

```
## UEFAチャンピオンズリーグについて

UEFAチャンピオンズリーグ（**UCL**）は、ヨーロッパのサッカーリーグの頂点である、ヨーロッパのクラブチームによるサッカー大会です。

**特徴:**

* **世界的な注目度:**  世界中のサッカーファンから高い人気を誇り、テレビ視聴者数や試合のチケット販売数など、様々な指標で世界的な規模を誇ります。
* **強豪クラブの舞台:**  世界トップレベルのクラブチームが参加し、高いレベルの試合が展開されます。
* **歴史と伝統:**  1955年に始まり、長年、ヨーロッパのサッカー界を牽引してきました。
* **賞金とタイトル:**  優勝チームには大きな賞金が贈られ、チームや選手のキャリアに大きな影響を与えるタイトルです。

**大会概要:**

* **参加チーム:**  ヨーロッパのクラブチームが参加し、グループリーグ、 knockoutステージを経て優勝チームが決まります。
* **開催地:**  毎年、異なるヨーロッパの都市で開催されます。
* **期間:**  毎年、9月から11月にかけて開催されます。
* **優勝チーム:**  UEFAチャンピオンズリーグの優勝チームは、UEFAヨーロッパリーグの優勝チームと同様に、ヨーロッパのサッカー界の頂点に位置します。

**魅力:**

* **世界トップレベルの試合:**  世界中のトップレベルの選手が参加し、高いレベルの試合が展開されます。
* **歴史と伝統:**  長年、ヨーロッパのサッカー界を牽引してきた大会であり、歴史と伝統を感じることができます。
* **賞金とタイトル:**  優勝チームには大きな賞金が贈られ、チームや選手のキャリアに大きな影響を与えるタイトルです。
```

無事に最後まで出力されました。

# 最後に

今回実行したのはこちらに記載があるサンプルコードをほぼそのままです。

https://huggingface.co/google/gemma-2-2b-jpn-it

非常に簡単に試すことができたGemma 2 2Bですが、
GPUが利用できない環境では、device="cuda" を device="cpu"、macの場合はdevice="mps"に変更すれば動作します。MacBook Proなどで仮想環境を構築し試してみるのもよいかもです。

# 関連書籍
- [大規模言語モデル入門](https://amzn.to/3YnR3Fn)
Spring Bootでの日時管理、LocalDateTime vs Timestampの選び方！

# はじめに
日付の入力値を検証する際、**java.sql.Timestamp型** を使用すると
BindingResultでは意図しない影響を及ぼす事が判明したので備忘録として記載。
>入力値を受け取るフォーム
>```java:DateMoldForm.java
>@Data
>@NoArgsConstructor
>public class DateMoldForm {
>    private Timestamp timestampMold;
>    private LocalDateTime datetimeMold;
>
>    public DateMoldForm(VerificationDateMold entity) {
>        this.timestampMold = entity.getTimestamp_mold();
>        this.datetimeMold = entity.getDatetime_mold();
>    }
>```
# 影響について
必須入力ではない、日付を空文字で登録した場合Timestamp型ではエラーが発生する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897734/e109dad3-fbb4-3fe6-586b-7e3bf9454792.png)

これはアノテーションによるチェックではなく
フォームから送信された値をコントローラーのオブジェクトにバインド（型変換）する際に失敗しており、BindingResultでは型変換失敗のエラーも含んでいる事が分かりました。
※String→Timestampに型変換するConverterは存在しませんでした。
https://docs.spring.io/spring-framework/docs/4.2.0.RC2_to_4.2.0.RC3/Spring%20Framework%204.2.0.RC3/index.html?org/springframework/core/convert/support/package-summary.html

__必須入力ではないためでチェック対象から外す。__
解決策として@DateTimeFormatアノテーションを付与。
引数に日付フォーマットを指定し挙動に問題がないかを確認する。

# @**DateTimeFormat** の確認
DateMoldFormを修正し、登録ボタンを押下し結果を確認する。
>```java:DateMoldForm.java
>@Data
>@NoArgsConstructor
>public class DateMoldForm {
>    @DateTimeFormat(pattern = "yyyy-MM-dd")
>    private Timestamp timestampMold;
>
>    @DateTimeFormat(pattern = "yyyy-MM-dd")
>    private LocalDateTime datetimeMold;
>
>    public DateMoldForm(VerificationDateMold entity) {
>        this.timestampMold = entity.getTimestamp_mold();
>        this.datetimeMold = entity.getDatetime_mold();
>    }
>}
>```

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897734/aed8f7fc-e892-c210-9190-f398cf6e8aee.png)

エラーは発生しなくなったが、Timestamp型が __NULL__ で登録されている事が分かりました。
__java.sql.Timestamp__ 、 __java.time.LocalDateTime__ は
バリデーションだけではなく@DateTimeFormatを付与して登録する場合も影響を及ぼす事が分かりました。

```sql
MariaDB [spring_practice]> select * from verification_date_mold;
+---------------------+---------------+
| timestamp_mold      | datetime_mold |
+---------------------+---------------+
| 2024-10-02 19:12:07 | NULL          |
+---------------------+---------------+
```

以上になります。
皆さんの経験はどうですか？
RPCエンドポイントを使ってgethのeth_gasPriceメソッドを呼び出す

# テーマ設定
RPCノードを使ってgethのeth_gasPriceメソッドを呼び出す処理を実装してみる。

# 前提環境
+ Node.js がインストールされている。
+ axios ライブラリがインストールされている。

+ RPCエンドポイントを取得（無料）
https://cabinet-node.com/ja/docs/user-guide/create-access-token

### axiosのインストール
```bash
npm install axios
```

# 実装
以下の内容でeth_gasPrice.jsファイルを作成してください。
 ```js
const axios = require('axios');

// RPCエンドポイントを設定
const rpcUrl = 'https://gateway-api.cabinet-node.com/{access_token}';

// eth_gasPriceメソッドを使ってガス価格を取得する関数
async function getGasPriceUsingRpc() {
    const data = {
        jsonrpc: '2.0',
        method: 'eth_gasPrice',
        params: [],
        id: 1
    };

    try {
        // axiosを使ってRPCリクエストを送信
        const response = await axios.post(rpcUrl, data);
        
        // ガス価格を取得（Wei単位で返される）
        const gasPriceInWei = response.data.result;
        
        // WeiをGweiに変換
        const gasPriceInGwei = parseInt(gasPriceInWei, 16) / 1e9;

        console.log(`Current Gas Price: ${gasPriceInGwei} Gwei`);
    } catch (error) {
        console.error('Error fetching gas price:', error);
    }
}

getGasPriceUsingRpc();
 ```

 # 実行
 
  ```
node eth_gasPrice.js
  ```

 
### 結果の例

```
Current Gas Price: 4.298716428 Gwei
```
ChatGPTにシフト表を作成してもらう【人工知能・勤務管理表】

```md
2024年11月のシフト表を以下の条件で作成して

- カラム名は従業員の名前
- 従業員は山田さん、田中さん、佐藤さん、鈴木さん、高橋さん
- 週休二日制
- 毎日最低３人は出勤すること
- 月に20日は働くこと
- 鈴木さんと佐藤さんは仲が悪いため同じ日に出勤させないこと
- 山田さんはマネージャーで田中さんは認定店長なので毎日どちらかは出勤すること
- 鈴木さんは20日に有給をいただくこと
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b6835db5-fa91-2313-d265-1e6fc0bf675a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/cdac5396-6354-a77e-007f-80357fc9ddf0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c3a2f57a-76fa-f71e-386b-b61af7febaad.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/085d9438-8a4f-4d37-fcb9-b3374c545302.png)

完ペキ

https://qiita.com/nao_ams_jp/items/c6cca5bd2efd37bc51c1
【Raills】閲覧数のカウント


### 要件
1. **各投稿（Book）が表示された回数（閲覧数）をカウントする**
2. **閲覧数を一覧ページ（indexページ）に表示する**

---

### 実装の全体的な流れ

1. **Bookモデルに閲覧数を保存するカラムを追加**
2. **`show` ページが表示されるたびに閲覧数をカウントする処理を追加**
3. **`index` ページで各Bookの閲覧数を表示**

---

### 1. **Bookモデルに閲覧数を保存するカラムを追加**

まず、各投稿の閲覧数を保存するために、`Book` モデルに **`view_count`** という新しいカラムを追加します。このカラムに、各投稿が表示された回数を保存していきます。

#### マイグレーションの作成

新しいカラムを追加するために、「マイグレーション」というデータベースの変更を反映するスクリプトを作成します。

ターミナルで以下のコマンドを実行します。

```bash
rails generate migration AddViewCountToBooks view_count:integer
```

これにより、`view_count` カラムを持つマイグレーションファイルが生成されます。

#### マイグレーションファイルの修正

次に、生成されたマイグレーションファイルを開いて、`view_count` の初期値を `0` に設定します。

```ruby
class AddViewCountToBooks < ActiveRecord::Migration[6.1]
  def change
    add_column :books, :view_count, :integer, default: 0, null: false
  end
end
```

- **`add_column :books, :view_count, :integer, default: 0, null: false`**:
  これは、`books` テーブルに `view_count` というカラムを追加し、そのデフォルト値を `0` に設定しています。これで、新しく作成された投稿の閲覧数は初期値として `0` が設定されます。

#### マイグレーションを実行

以下のコマンドでマイグレーションを実行し、データベースに変更を適用します。

```bash
rails db:migrate
```

これで、`books` テーブルに `view_count` カラムが追加され、各投稿の閲覧数を保存する準備が整いました。

---

### 2. **`show` ページが表示されるたびに閲覧数をカウントする処理を追加**

次に、各投稿の詳細ページ（`show` ページ）が表示されるたびに、その投稿の閲覧数を1増やす処理を追加します。

#### `BooksController` の修正

```ruby
class BooksController < ApplicationController
  def show
    @book = Book.find(params[:id])
    
    # 閲覧数を1増やす処理
    @book.increment!(:view_count)
  end
end
```

#### 解説

- **`@book = Book.find(params[:id])`**:
  この行は、URLに含まれる投稿IDを使って、その投稿（Book）をデータベースから取得します。
  
- **`@book.increment!(:view_count)`**:
  これは、投稿の `view_count`（閲覧数）を1増やし、データベースにその変更を保存するメソッドです。`increment!` は、「指定されたカラムの値を1増やし、その結果をデータベースに反映する」メソッドです。`!` が付いていることで、エラーが発生した場合は例外が投げられます。

---

### 3. **`index` ページで各Bookの閲覧数を表示**

最後に、投稿の一覧ページ（`index` ページ）で各投稿の閲覧数を表示します。

#### `BooksController` の `index` アクションの修正

まず、`BooksController` の `index` アクションで、すべての投稿を取得します。

```ruby
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
```

#### `index.html.erb` の修正

次に、`index` ページで、各投稿の閲覧数を表示します。

```erb
<h1>投稿一覧</h1>

<table class="table">
  <thead>
    <tr>
      <th>タイトル</th>
      <th>著者</th>
      <th>閲覧数</th> <!-- 閲覧数の列を追加 -->
    </tr>
  </thead>
  <tbody>
    <% @books.each do |book| %>
      <tr>
        <td><%= link_to book.title, book_path(book) %></td> <!-- タイトルをリンクとして表示 -->
        <td><%= book.author %></td> <!-- 著者名を表示 -->
        <td><%= book.view_count %></td> <!-- 閲覧数を表示 -->
      </tr>
    <% end %>
  </tbody>
</table>
```

#### 解説

- **`<%= book.view_count %>`**:
  これは、各投稿の `view_count`（閲覧数）を画面に表示するコードです。`@books.each do |book|` で、すべての投稿を順番に取り出し、その閲覧数を表示しています。

---

### まとめ

本日実装した「閲覧数のカウント機能」の流れをもう一度まとめます。

1. **`view_count` カラムを追加**:
   - 投稿が何回表示されたかを保存するために `view_count` カラムを追加し、デフォルト値を `0` に設定。
   
2. **`show` アクションで閲覧数をカウント**:
   - 各投稿の `show` ページが表示されるたびに、`view_count` を1増やす処理を追加。

3. **`index` ページに閲覧数を表示**:
   - `index` ページで、すべての投稿の `view_count` を表示し、閲覧数が確認できるようにしました。

これで、閲覧数をカウントして表示する機能が再現できるようになります。
JavaのコードをSwiftのコードにした時のメモ

## Javaのbyte[]は、、、
* byteはSwiftでは`UInt8`
```swift
    // ※extension Dataなどに書いてください
    /// バイト配列に変換
    var toByteArray: [UInt8] {
        [UInt8](self)
    }
```

## Javaのshort[]は、、、
* shortはSwiftでは`Int16`
```swift
    // ※extension Dataなどに書いてください
    /// Int16（short）の配列に変換
    var toShortArray: [Int16] {
        var result: [Int16] = []
        let count = self.count
        guard count % MemoryLayout<Int16>.size == 0 else {
            // Int16に変換できないサイズだった
            return result
        }
        for i in stride(from: 0, to: count, by: 2) {
            let shortValue = self.subdata(in: i..<(i+2)).withUnsafeBytes { $0.load(as: Int16.self) }
            result.append(shortValue)
        }
        return result
    }
```

## Javaのintは、、、
* Javaではintは32bit
* SwiftではIntは実行環境によって異なるので、`Int32`をつかう

## Javaのlongは、、、
* Swiftでは`Int64`

---
* 参考記事

https://qiita.com/sauna1137/items/673e0b5b6ae58cc7337c
CodeWars オススメ問題 #6

# はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

:::note
CodeWarsはいいぞ！の紹介は[こちら](https://qiita.com/kohki_takatama/items/2ae2808b931e943262b8)

CodeWarsの始め方は[こちら](https://qiita.com/javacommons/items/7c473cda7825ab99e08c
)
:::

今回はTypeScriptに挑戦してみようと思います。

簡単な問題を解きながら、TSに慣れていきたい。
# オススメ問題

https://www.codewars.com/kata/5625618b1fe21ab49f00001f/typescript

### 問題
「以下の`sayHello`関数を変更して、引数`name`も返すようにしたい」

```ts
export function sayHello(name: string): string {
  return 'Hello'
}

//例：Hello, Mr. Spock
```
### 難易度
分類は 8kyu です。
最も簡単な問題で、TSのお作法を学ぼうと思います。

# オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。
今回はTSのお作法も見ていきます。

:::note
<details><summary>模範解答</summary>

```ts
export function sayHello(name: string): string {
  return `Hello, ${name}`;
}
```

テンプレート記法`${name}`を使用したスマートな解答です。

`name: string` / `~~~: string {}` がTSならではですね。

型定義なのですが、思ったより簡単そうです。
関数にしろ、引数にしろ`~~~: 型`という感じで、最後に書けばいいのかな。

</details>
:::





:::note
<details><summary>1行の解答</summary>

```ts
export const sayHello = (name: string): string => `Hello, ${name}`;
```

1行にするテクニックはJavaScriptと同じですね。アロー関数が使われています。
</details>
:::

# おわりに
以上、CodeWarsオススメ問題でした。

TS、思ったよりもJSでした。すぐ慣れそうです。
「〇〇の配列」等の型定義もしていきたいですね。

オススメ問題・解法など、ぜひコメントお待ちしております！

# 参考記事

https://www.blog.itosae.com/posts/2022092

https://zenn.dev/usamik26/articles/regex-lookahead

https://qiita.com/ichironagata/items/091f8cd629b82b0dcbf8
BoxとServiceNow連携：フォルダ作成

# 概要
[別の記事でServiceNowとBoxの連携について書きました](https://qiita.com/mshcruz/items/5e3f8e72d5550b0c3937)が、認証のテストまでしかありませんでしたので、今回は実際のBox上の操作（フォルダ作成）の実装方法を紹介します。

# 準備

本記事では、Boxカスタムアプリ、ServiceNowのアプリケーションレジストリとRESTメッセージが作成・設定されたことを仮定します。それらの設定について、「[BoxとServiceNow連携：認証方法](https://qiita.com/mshcruz/items/5e3f8e72d5550b0c3937)」を参考してください。

# 実装

今回の実装ステップとして、まずはBoxフォルダ作成用の新規なHTTPメソッドを実装します。その後に、動作確認を行います。

## 「フォルダ作成」のHTTPメソッドを追加

Box上のフォルダ作成は次のAPIエンドポイントへのリクエストで実施できます：`https://api.box.com/2.0/folders`（[ガイド](https://ja.developer.box.com/reference/post-folders/)）。

パラメータとして、フォルダ名と親フォルダIDを設定する必要があります。両方はリクエストの本文で指定します：
- フォルダ名（`name`）は任意ですが、[使えない文字があります](https://support.box.com/hc/ja/articles/360044196773-Box%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)
- 親フォルダID（`parent.id`）はBoxのWebアプリのURLから取得できます。例えば、`https://app.box.com/folder/123456789`の場合は、`123456789`はフォルダIDです。ユーザーのルートフォルダ（「すべてのファイル」のページ）のIDは`0`です。[Box APIでもフォルダIDを取得することが可能](https://ja.developer.box.com/reference/get-folders-id/)ですが、この記事ではフォルダIDを事前に取得ことを仮定します

上記のエンドポイントへリクエストを送信するために、事前に作成されたRESTメッセージで新規なHTTPメソッドを追加します。新規HTTPメソッド画面で以下のように設定します（詳細設定は[Box APIガイド](https://ja.developer.box.com/reference/post-folders/)で確認だきます）：
- 名前：<任意の名前>（例：Boxフォルダ作成）
- HTTP メソッド：POST
- REST エンドポイント：https://api.box.com/2.0/folders
- 「HTTP要求」タブの「コンテンツ」の内容は以下のJSONです。JSONでは`folder_name`と`parent_folder_id`を変数として指定しました

```JSON
{
  "name": "${folder_name}",
  "parent": {
    "id": "${parent_folder_id}"
   }
}
```

![Boxフォルダ作成HTTPメソッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895687/d2ff1b0a-2f53-1f74-895a-f3eea868eeb0.png)

レコードを保存すると、画面の下に「REST メッセージ関数パラメーター」タブが表示されます。「関連リンク」の「変数の自動生成」をクリックすると、JSONで指定した変数がパラメーターとして設定されます。

![Screenshot 2024-10-04 at 16.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895687/c15df98b-da43-a39c-f18c-8f16b4849a09.png)

## 動作確認

テストのため、変数の「値」列も設定します。以上の画像でID`228438198016`のフォルダの配下に`テスト`というフォルダを作成するように設定しました。

:::note warn
フォルダを作成するため、リクエストを送信するユーザーは親フォルダに対して[適切な権限](https://support.box.com/hc/ja/articles/360044196413-%E3%82%B3%E3%83%A9%E3%83%9C%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E6%A8%A9%E9%99%90%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)が必要です（例えば、編集権限）。サーバ認証を使う際に、サービスアカウントを対象フォルダに招待する必要があります。
:::

「関連リンク」の「テスト」をクリックすると、設定されたメソッドでBox APIへリクエストが送信されます。結果として、Box上のフォルダが作成さます。作成者はリクエストを送信したユーザーです（以下の画像で、「ServiceNow CCG」です）。

![Boxフォルダ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895687/ba000414-824a-3c3c-d7cb-62ca3e4e1dac.png)

リクエストのレスポンスも「テスト実行」画面で確認できます。「HTTP ステータス」は`201`ですので、リクエストは成功したことをわかります。

![テスト実行レスポンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895687/1cf44078-c3a1-375d-29ff-efb09a1cc13c.png)

:::note
リクエストのレスポンスから作成されたフォルダID（`id`項目）があり、それをレスポンスから抽出すると、引き続きの処理（例えば、コラボレーション作成）で使えます。
:::

# まとめ

この記事では、ServiceNowからBox上のフォルダ作成方法について説明しました。

フォルダ作成はよくある操作ですので、様々な場面で使えると思います。作成したHTTPメソッドをクビジネスルールやワークフローで使えますので、多くのケースで活用できます。

また、似たような実装仕方で、他のBox上の操作（例えば、ユーザー作成やグループ作成など）も実現できます。
AWS: CodeBuild GitHubへ接続 (「GitHubへ接続」ボタンが見つからない....)

CodeBuildへ接続。プロジェクト名を記入。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/60e01d7e-900d-c501-3d03-3c4f8e8342d4.png)


ソースで「デフォルトソース認証情報を管理」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/2bb3de6f-c5c0-96b7-ae7c-ac29d9ecb2e0.png)

「新しいシークレット」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/63796ccf-a3a0-90ae-7a0f-0f999d525b3b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/9102e6b4-6105-e262-7a39-a42b7ae3ba98.png)


GitHubで作成したトークンを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/3487c94a-fa64-06f8-5580-a8417ec21104.png)

接続完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/acc8f985-213e-e579-907c-9856063b8aa4.png)


プロジェクトの作成ボタン押し下げ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/bb2e8ba0-0828-8d44-afc7-bb31753585c0.png)

プロジェクトの作成完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600486/e5c1b9fd-835b-6be6-5e8d-0976ace4e35f.png)
30代後半プログラミング未経験からの出発

初めまして。
この記事では、30代後半の未経験からプログラマーを目指す過程を記録していきます。
Webサービスで少しずつ勉強を始めた後、資格試験に挑戦しようと考えていましたが、まずは何か自分で作ってみることにしました。そして、その過程をQiitaで発信していこうと思います。

主にGPT関連のツールを使用して作成を進め、不明点があればその都度調べながら学習していく予定です。
また、文章力にも自信がないため、記事の添削などはAIに頼ることが多くなりそうです。

どうぞよろしくお願いいたします。
Breezeをインストールしてログイン機能を実装

# 目次

1.準備
2.Breezeをインストール
3.マイグレーション
4.(おまけ)ユーザー名を使用してログイン

# 1.準備
マイグレーションのロールバック
既にマイグレーションを行っている場合は以下でロールバックする
```php
php artisan migrate:reset
```

# 2.インストール
Breezeをインストール
```php
composer require laravel/breeze --dev
```

Breezeのインストールを実行
```php
php artisan breeze:install
```

npm パッケージのインストールとビルド
```php
npm install
npm run dev
```

# 3.マイグレーション
Breezeをインストールするとマイグレーションファイルの書き換え&作成が行われる
マイグレーションを実行
```php
php artisan db:seed
```
※LaravelのBootstrapとBreezeのTailwindCSSがぶつかってしまいレイアウトが崩れるため、
ブレードを修正する必要がある

# 4.(おまけ)ユーザー名を使用してログイン
デフォルトではメールアドレスでログインする仕様になっているため、
ユーザー名でログインさせたい場合は変更が必要

以下が参考になった
https://qiita.com/haessal/items/54ca3ea37c8df9918780
ReactでBootstrapを使った際の「text-left」問題とその解決法

## 概要
この記事では、ReactプロジェクトでBootstrapを使用する際に直面した「text-left」クラスが期待通りに動作しなかった問題について解説し、その解決法を紹介します。

## 問題の詳細
ReactでBootstrapのContainerとTableコンポーネントを使用して、テーブル内のテキストを左寄せにしようとしたところ、text-leftクラスが機能しませんでした。
```jsx
<Container>
  <Table>
    <tbody>
      <tr>
        <th className="text-left">犬の散歩</th>
      </tr>
    </tbody>
  </Table>
</Container>
```
![スクリーンショット 2024-10-04 16.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862120/87066a5a-f5ed-6ba2-6457-95d262ce11c9.png)

## 解決策
調べたところ、Bootstrap 5以降では、text-leftクラスが廃止され、text-startクラスが導入されたことがわかりました。これにより、テキストを左寄せにするにはtext-startを使用する必要があります。
```jsx
<Container>
  <Table>
    <tbody>
      <tr>
        <th className="text-start">犬の散歩</th>
      </tr>
    </tbody>
  </Table>
</Container>
```
![スクリーンショット 2024-10-04 16.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862120/9308092d-dcf8-a6c7-dc0d-a01237f54b48.png)

## 参考

https://getbootstrap.jp/docs/5.3/migration/#%e3%83%a6%e3%83%bc%e3%83%86%e3%82%a3%e3%83%aa%e3%83%86%e3%82%a3-1
Jest failed to parse a file. エラーが生じる

## 初めに
昨年3月まで医療職で、そこからWeb制作を学習。
Web制作以外にもReactスキルを身につけたいと思い、今年の1月よりJISOUに参加しました！

今回はReact×TypescriptプロジェクトをJEST・React Testing Libraryでテストした際のエラーを共有します。

## 問題点
ターミナルにて`npm run test`を叩くと以下のエラーが返ってくる。
>Jest encountered an unexpected token
    Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.
    Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

どうやらテストの環境設定がうまくできていないようです。

## 解決策
以下をターミナルに入力
```
$ npm i --save-dev　jest
$ npm i --save-dev @types/jest
$ npm i --save-dev ts-jest
```
jest.config.jsを作る
```javascript
export default {
  preset: "ts-jest",
  testEnvironment: "jsdom",
  setupFilesAfterEnv: ["./jest.setup.ts"],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest",
  },
  moduleNameMapper: {
    "\\.(css|less)$": "identity-obj-proxy",
  },
};
```
jest.setup.tsを作る(拡張子がjsではない)
```typescript
import "@testing-library/jest-dom";

require("dotenv").config();
```
以下をターミナルに入力
```
$ npm install dotenv
```
tsconfig.jsonを変更する。
```json
{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "allowJs": false,
    "skipLibCheck": true,
    "esModuleInterop": false,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "types": ["node", "jest", "@testing-library/jest-dom"]
  },
  "include": ["src"],
}
```
以下をターミナルに入力
```
$ npm i --save-dev @testing-library/react
$ npm i --save-dev @testing-library/jest-dom 
$ npm i --save-dev jest-environment-jsdom 
$ npm i --save-dev @testing-library/user-event
```
package.jsonにtestを追加する
```json
    "test": "jest"
```

## 終わりに
毎回CI/CDのあたりでつまづきます。
ただつまづかないスキルではなく、つまづいた時にそれを乗り越えるスキルを身につけたいです。
Power Automate のエラーハンドリングについて

## はじめに
BizOptimars のいのうえです。
皆さんは、エラーが発生した場合を考慮してフローの作成をしていますでしょうか？
初めはなかなかそこまで考えるのは難しいとは思いますが、よりよいシステム開発につなげるためには必要です。

## エラーハンドリングとは
エラーハンドリングとは、プログラムやシステムがエラー（問題や障害）に遭遇した際、それを適切に処理する方法のことです。主な要素は以下の 4 つになります。

1. **エラーの検出** : プログラムが正常に動作していないことを見つけること
2. **エラーの報告** : エラーが発生したことをユーザーや開発者に知らせること
3. **エラーの処理** : エラーが発生したときに、プログラムがクラッシュしないように対策を講じること
4. **エラーの記録** : エラーの詳細をログファイルに記録して、後で問題を解決するために役立てること

例えば、システムがクラッシュしたり、データが失われたり...
こういったことが起こらないようにしたいですよね！
エラーハンドリングを行うことで、ユーザーにとって使いやすく、信頼性の高いシステムを提供できます。

今回は、Power Automate のエラーハンドリングの方法について紹介いたします。

## 実行条件
以下手順で、各アクションの実行条件を設定することができます。

1. 実行条件を設定したいアクションをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/e5a92d66-3397-1fdd-4879-ec1f0a29aef3.png)

2. 「設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/c5761c21-b921-f436-0c52-cbc6fac6c883.png)

3. 下にスクロールして、**Run after** の「項目の作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/e1624567-efa4-97d8-dd57-a8975c3a8551.png)

4. アクションが実行されるタイミングについてのチェックボックスが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/7f136302-daeb-0cc9-0a52-330ee97d7b2d.png)
ここで、実行条件を設定することができます。
例えば以下画像の場合、「項目の作成」アクションが成功または失敗した際に「チャットまたはメッセージを投稿する」アクションが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/836a4306-1318-729c-f569-cef003e54305.png)

::: note info
- **成功しました**：前のアクションが成功した時に実行
- **タイムアウトになりました**：フロー自体のタイムアウト、またはアクションごとのタイムアウトに該当した場合実行
- **スキップされます**：前のアクションがスキップされたときに実行
- **失敗しました**：前のアクションがエラーになったときに実行
::: 

実行したフローの情報を取得できる workflow 関数を使うと、
例えば、失敗した際の情報を取得して、メールで通知を行うことが可能です。
Wrokflow 関数についてはこちらをご覧ください。
[Power Automate の Workflow 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#workflow)

## スコープ
先ほどの実行条件の設定では、アクション単位でのエラー検知ですが、**スコープ**を用いることで、フロー全体を監視することができます。

スコープは、以下手順で追加できます。
1. アクションの追加から Control を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/321fa9e7-2890-c23f-6e59-01717bd5fc14.png)

2. スコープを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/98875418-73d6-c497-512f-e3cc6c30946e.png)

スコープには、複数のアクションを格納することができるアクションです。
スコープを使うことで、エラーが発生した場合の処理を明確に分けることができます。
以下のように、Try、Catch、Finally の 3 つのスコープを設定します。

**Try**：エラーが発生する可能性のあるアクションを含めます
**Catch**:：Try スコープでエラーが発生した場合に実行されるアクションを含めます
**Finally**：エラーの有無にかかわらず、必ず実行されるアクションを含めます

## おわりに 
エラーハンドリングは、プログラムが予期しない状況に対しても安定して動作するために非常に重要です。最初は難しく感じるかもしれませんが、エラーは学びのチャンスです。失敗を恐れず、試行錯誤を楽しんでください！
絵って難しい

## おことわり

馬鹿馬鹿しすぎる日記です．
プログラミングの話は一切出てきません．

## bit深度は 1bit がいいんじゃないか？

「ゲームのような物を作ろう！」とか言い出すと，どうしても「絵」が欲しくなるときというのがやってくるから困る．

「音」の側については「音のことは忘れろ．そうすればお前は強くなる」とか何とか誰かが言ってたような記憶があるし，実際「まぁとりあえずは無くてもいいんじゃないか？」と思えるが，
「絵」の側となると，なかなかどうして「じゃあ無しで」とは行かないというか…

```
Q. 絵が必要です．どうすればいいですか？
A. 描けば？
```

はい．
俺には「ペイント」があるじゃないか．
しかも「現代のペイントではなくて Windows XP 時代のペイントが好きだったんだよぉおお！」ということでわざわざ "Paint XP" とかいうのを導入しているのだぞ．
ならばこれを用いて描くしかあるまいよ．

```
Q. でも絵心というか絵を描く技量がどうので～
A. Monochrome Bitmap
```

はい．
つまりはこういう話だ：

* デジタルな世界で絵を描くというのは，要するに「各画素の色を決めるという作業」だよね？
* Monochrome Bitmap ならば，各ピクセルの色の選択肢は２つ：「白 or 黒」　しかないわけ．
* そしたらさ，ある画素に着目したとき， **プロが描いた絵のそれと俺が描いた絵のそれとが，何と 50% の確率で完全一致する** ってことですよね？　すごくないですか！？

……というわけだ．
「色数が減れば　上手い←→下手　の差が縮まるハズ」という理論である！
こいつぁすげぇや！！

## そんな屁理屈よりも，もっと大切なことがあったぜ！

…とかなんとかいう前記の話に基づいて結構前にお絵かきしてたときの絵……というのが今になってUSBメモリから発掘されたんですよ．

「そしたら せっかくだから コレ使ってみようか」ということで，「ターン制RPGの戦闘シーンみたいなのを作ることに挑戦してみようか～」みたいな．

で，こうなった↓

![Fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/91b1928a-41bd-de05-c92e-c87bf0c42ac2.png)

```
Q. ……
A. ……（馬鹿なの？）
```

**結論：**
「色数がどうの（笑）」とか言うよりも前に， **まず大前提として「解像度だとか絵のスケールとかいう規格」を決める必要がある！！**

うん，なんだか　言われるまでもないような当たり前のこと　であるような気がしないでもないけど，
この　実経験に基づいて得られた知見　をここに書き記すものである！！

## それはそれとして，見難い感じですな

ガチの白黒ってのはちょっとコントラスト強すぎて，その上に何か表示しても目立たないというか見難いというか．うん．
描画に際してはある程度輝度を抑えてやる必要があるかも．

![Dmg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/819492a5-dd1a-eb5c-1ca1-a25c2b7dfd2c.png)
（ダメージ表示の視認難易度が……）

↓（追記）

この点に関しては単純に「文字の側をでかくすれば見やすいよね！」っていう，これまた当たり前な話に行き着いた感じなり．はい．

![Fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/fac91edf-0eb1-8620-d755-ee8c089e6a23.png)

## 学ばない

敵の絵の上側に　名前　と　HPのゲージ　を表示することにした結果……

でかい敵の表示が入りきらないニャー！
![Fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574818/4c7f2891-8e2e-04a1-5c76-418340bfb3a4.png)

先に決めておくって大事！（２回目）
3年間他業界にいた人間がSAAの勉強をしてみたら

今回は３年間IT業界から離れて教育業界にいた人間が、３年ぶりにAWS Solutions Architect - Associate(SAA)の勉強をしてみた途中経過と感想を書いていこうと思います。
## はじめに
今回は「３年間他業界にいた人間」を主題にしているので、まずはこれまでの経歴を簡単に紹介しておきます。

- 学生時代はバリバリの文系
- 新卒でIT系の会社へ
- 4月1ヶ月間の研修期間中にAWS SAAを取得
- その後、1年3ヶ月間AWSの構築の現場へ
- 教育業界へ転職し3年
- IT業界へ復帰
- 現在に至る

新卒入社から1年4ヶ月IT業界にいました。
その後、3年間他業界なので、数えてみれば資格取得から4年半近くたっていますね...。
ということで、AWSの認定は3年で有効期限が切れてしまうので、今回再受験しようと思い立ちました。

## 勉強してみた
とりあえず、やってみた感想は後述するとして、実際にやったことを書いていきます。

### 勉強方法
どうやって勉強しているのかというと

- テキストをサラッと読んで
- Ping-tの問題集で一番実践に近い問題を解く
- Ping-tの解説を読んで復習

という感じです。

（Ping-t：https://mondai.ping-t.com/g/ ）
### 勉強内容
勉強を始めて今日（3日目）までの勉強内容は
- 1日目：テキストをサラッと読み通し（約7時間）、Ping-tの問題30問解く
- 2日目：前日の問題の復習、30問解く、復習、30問解く
- 3日目：前日の問題の復習、30問解く、復習

という内容です。

### 正答率
- 1日目：56.7%（17/30)
- 2日目：63.4%（19/30）、76.7%（23/30）
- 3日目：60.0%（18/30）

3日目で正答率80％以上を目指していましたが残念ながら届かず。。

## 感想
3年前と比べて特段難易度が上がっているとは感じませんでした。
テキストを読むときは、大まかなサービスは覚えていたので抵抗なく
「ああ、こんな名前のあったな」と思いながら読んでいました。

最初に問題を解いたときは、「どうやって考えたらいいんだっけ？？」となりましたが...。

ただ、細かい機能や仕様が変わっていたり新しくなっていたり増えていたりで、そこがなかなか覚えられません。

（私の記憶では）
変わっているものを挙げると、たとえば
- S3のストレージクラスこんなにあったっけ？
- オンプレからAWSにデータを移行する方法こんなにあったっけ？？
- Kinesisとかのデータ収集⇒分析⇒DBに保存、的な問題こんなに多かったっけ？？？
- 疎結合、マイクロサービスってこんなにたくさん言われるっけ？？？？

という感じで、大きく変わっていることはないですが各サービスの中身が変わってきているのと、問題の傾向も若干変わっているのかなと感じました。

こういった細かい部分はあまりテキストにも載っていないところなので、問題を解きながら覚えていっている感じです。

## 3年間他業界にいた人間がSAAの勉強をしてみたら
さあやっと、タイトル回収です。

3年間他業界にいた人間がSAAの勉強をしてみたら...
**思ったよりも覚えてました。(^_^)v**

もう少し合格までは勉強が必要ですが「お先真っ暗」ではないのがとてもうれしいです。
今後も引き続き問題を解きながら覚えていくスタイルで勉強を続け、今月末には受験したいなと考えています。

これから受験する皆さん！一緒に頑張りましょう！！
量子の小説を書こうとする話,そして量子コンピューターのポートフォリオでディスる話し

小説を前から書いていたので、前のスペックでは書けなかったデスクトップパソコンに続いて

新しく買ったノートパソコンで量子の話しの小説を書くことになった。

出てくるキーワードとしては、量子AIやら量子インターネットやら量子ハッカーなどである。

量子の世界が現実化する前の時代の話しかもしれませんが、小説を書いてみたいと思いました。


そして2024年11月、AIによるプログラミングがある時代でもありながら、量子コンピューターのポートフォリオが
できないかどうか考える時が来るのでありました。
【Rails】いいね数順に投稿を表示する機能の実装※自己学習

### 1. **Favorite（いいね）の数によって表示順を変更する実装手順**

### 実装の全体的な流れ
1. **過去1週間での「いいね」数を数える仕組みを作る**
2. **「いいね」数が多い順に投稿を並び替える**
3. **並び替えた投稿を画面に表示する**

---

### 1. **過去1週間の「いいね」数を数える**

まず、投稿が「いいね」された数を数える必要があります。そのために、`Book` モデルに「この投稿に何回「いいね」がされたか？」を調べるメソッドを追加します。

#### `Book` モデルにスコープを追加

`Book` モデルとは、投稿に関する情報を管理する部分です。ここに「過去1週間のいいねの数を数える」ための仕組み（スコープ）を追加します。

```ruby
class Book < ApplicationRecord
  has_many :favorites # 各Bookに対する「いいね」を管理する関連
  
  # 過去1週間の「いいね」数が多い順にBookを並び替えるメソッド
  scope :popular_in_last_week, -> {
    left_joins(:favorites) # Bookと「いいね」を結びつけて「いいね」の情報を取り出す
      .where('favorites.created_at >= ?', 1.week.ago) # 過去1週間の「いいね」だけを対象にする
      .group('books.id') # 各Bookごとに「いいね」をまとめる
      .order('COUNT(favorites.id) DESC') # 「いいね」の数が多い順に並び替える
  }
end
```

#### 解説

- **`scope`**: 特定の条件でデータを検索したり並び替える仕組みです。
- **`left_joins(:favorites)`**: 各Bookに対して「いいね」が付けられた回数を調べるために、`Book` と `Favorite`（「いいね」）を関連付けます。`left_joins` というのは、「「いいね」がなくてもそのBookを表示する」という意味です。
- **`where('favorites.created_at >= ?', 1.week.ago)`**: 「いいね」の日付が過去1週間以内のものだけを対象にします。これを外すと、期間の縛りに捉われず、全期間のいいね数となる。
- **`group('books.id')`**: 各Bookごとに「いいね」の数をまとめます。
- **`order('COUNT(favorites.id) DESC')`**: 「いいね」の数が多い順に並べます。`DESC` は降順（多い順）という意味です。

---

### 2. **「いいね」数が多い順に投稿を並び替える**

次に、`BooksController` という投稿を管理する場所で、過去1週間の「いいね」数が多い順に投稿を取得して表示する処理を追加します。

#### `BooksController` の修正

```ruby
class BooksController < ApplicationController
  def index
    # 過去1週間の「いいね」数が多い順にBookを取得する
    @books = Book.popular_in_last_week
  end
end
```

#### 解説

- **`Book.popular_in_last_week`**: これは、先ほど `Book` モデルに作った「過去1週間の「いいね」数が多い順に並び替えるメソッド」を使って投稿を取得しています。
- **`@books`**: 取得した投稿を `@books` という変数に格納し、これをビュー（画面）に表示するために使います。

---

### 3. **並び替えた投稿を画面に表示する**

最後に、投稿の一覧ページ（`index.html.erb`）で、並び替えた投稿を表示します。

#### `views/books/index.html.erb` の修正

```erb
<h1>人気の投稿（過去1週間のいいね数順）</h1>

<table class="table">
  <thead>
    <tr>
      <th>タイトル</th>
      <th>著者</th>
      <th>いいね数</th>
    </tr>
  </thead>
  <tbody>
    <% @books.each do |book| %> <!-- 取得したBookを順番に表示 -->
      <tr>
        <td><%= link_to book.title, book_path(book) %></td> <!-- Bookのタイトルへのリンク -->
        <td><%= book.author %></td> <!-- 著者名の表示 -->
        <td><%= book.favorites.count %></td> <!-- いいね数の表示 -->
      </tr>
    <% end %>
  </tbody>
</table>
```

#### 解説

- **`@books.each do |book|`**: 取得した `@books` の中から1つずつ投稿（`book`）を取り出して画面に表示しています。
- **`book.favorites.count`**: 各Bookの「いいね」の数を数えて画面に表示しています。
- **`link_to book.title, book_path(book)`**: タイトルにリンクを付けて、その投稿の詳細ページ（`show` ページ）に飛べるようにしています。

---

### まとめ

1. **過去1週間の「いいね」数を数える**ために、`Book` モデルに「いいね数順に並び替える」スコープを追加しました。
   - `scope :popular_in_last_week` を使って、過去1週間の「いいね」が多い順に投稿を並び替える処理を実装。
   
2. **「いいね」数が多い順に投稿を並び替えて取得**するために、`BooksController` の `index` アクションを修正しました。
   - `@books = Book.popular_in_last_week` により、過去1週間の「いいね」数に基づいて投稿を取得。

3. **並び替えた投稿を画面に表示**するために、`index.html.erb` で「いいね」数を含めて投稿を表示しました。
   - 各投稿の「いいね」数を表示するために `book.favorites.count` を使いました。
Kotlin 基礎

## １．入る前に ： kotlinとは？
Javaを開発した “ Jetbrains ” 社が公開したプログラミング言語でJavaと100%互換しており、もっと簡潔で色んな機能が追加されている．

Javaが好きで結構使ってた私の主観的な感想では、Javaを基本としてpythonを載せたような感覚で勉強しながら「どこまで略せるの」とか「この表現でこの機能が使えるんだ」って思い、すごく楽しかった．
kotlinを学ぶぐらいの人だったらpythonかJavaどっちかを経験した人が多いと思います．私と同じ感想だった人があったらいいねお願いします！

## ２．Hello worldを出力させよう

プログラミングを学ぶ際に必ず出会う皆さん親しみのHello worldを出力してみよう

```
//Java
public class Hello_world{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

//Kotlin
fun main() {
    println("Hello, World!")
}

fun main() = println("Hello, World!") //こんな風にもできる
``` 
:::note info
1. main()をパブリッククラスに入れる必要がない
2. 宣言する時にvoidやリターンされる型を明示しなくていい
3. 「；」を付けなくてもいい．（つけても問題はない）
+ 下のmain()みたいにkotlinではメソッドのリターン値や出力をあんな風にも表現できる
（あくまで例として作成しただけで実際main()をあんな風に使う人はないでしょ)
:::

## ３．メソッドの基本 

```
fun printMessage(message : String) = println(message) 

fun printMessage_Prefix(message : String, prefix: String ="Info") 
                                        = println("[$prefix] $message")

fun sum(x: Int, y: Int): Int {
    return x + y
}

fun sum2(x: Int, y: Int) = x + y 

fun main(){
    printMessage("hello")
    printMessage_Prefix("hello")
    printMessage_Prefix("hello","log")
    printMessage_Prefix(prefix="hello",message="kotlin")
    println(sum(1,2))
    println(sum2(3,4))
}
``` 
+ 結果

![캡처.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876472/88a93494-ff4b-f49a-30cf-c677ef8c52b3.png)


+ ２章で説明したようにパラメータがある場合も 「＝」を使って表現できる
+ printMessage_prefix(message,prefix)でprefixの右に「＝“Info”」を付けたのが見える．これはデフォルト値で、パラメータにmessageしか渡さなくてもデフォルト値の「Info」が出力される
+ printMessage_Prefix(prefix="hello",message="kotlin")ではprefixとmessageの順番を変えたけど、左にパラメータの名前を加えることでメソッドの内容通り出力されるのがわかる

## 終わり
どうでしたか．私は最初勉強しながら当たり前だったことが当たり前じゃなくなる感覚でしたがみなさんはどう思ったのか聞かせてほしいです

次はinfixという中置記法とオペレーター、kotlinでよく見ることになる「vararg」という概念に関して投稿します
sshで強制的にパスワードログインを実行させる

SSHでは通常、公開鍵認証が優先されますが、パスワード認証を強制的に使用したい時はないでしょうか。いつも忘れてしまうので、メモ書きさせていただきます。

```
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no username@server_ip
```
AWS Lambdaで簡単な運勢占いAPIを作ってみた

最近、AWS Lambdaを使って簡単なAPIを作成する方法を学んだので、アウトプットとして運勢占いAPIを作ってみました。サーバーレスで動作するため、コストを抑えつつ簡易的なAPIを作りたいときに便利です。

## どんなAPIか？
このAPIは、リクエストを送るとランダムに次の情報を返してくれる運勢占いです。

https://bx7pag052e.execute-api.us-east-1.amazonaws.com/default/fotuneFunction

- 今日の運勢: 「大吉」「中吉」「凶」など
- ラッキーカラー: 「赤」「青」「緑」などのランダムな色
- ラッキーアイテム: 「使い古した靴下」「かたつむりの置物」「賞味期限切れの大福」など、ユニークで面白いアイテム

## 使用技術
- AWS Lambda: サーバーレスでPython関数を実行
- API Gateway: Lambda関数をHTTPリクエストで呼び出すためのインターフェース
- Python: ランダムな運勢やアイテムを生成するためのスクリプト

## APIの動作サンプル
実際にAPIを叩いてみると、こんな感じでJSON形式のレスポンスが返ってきます。
```json
{
    "fortune": "大吉",
    "lucky_color": "赤",
    "lucky_item": "笑顔のステッカー"
}
```

## 作ってみた感想
LambdaとAPI Gatewayを使えば、簡単にAPIを公開できるという点が非常に便利でした。サーバーを立てる必要がなく、コードを書いてデプロイするだけで即座に動作するのは驚きです。また、今回は占いAPIにしましたが、他にもアイデア次第でいろんなAPIを作成できそうです。
SnowflakeのQUALIFYを試してみた

# はじめに

https://note.com/ym202110/n/ndaf6e6f8127d

この記事で「ナニコレ、スゴイ！！」って衝撃を受けたのでした。
QUALIFYとは何ぞやというのはこの記事にお任せしますので、とにかくまずはリンク先を読んでみてください。
この記事に全乗っかりして試してみたという話です。

>実用例: 重複データの除外
ROW_NUMBER()とQUALIFYを組み合わせて、データセット内の重複データを除去し、特定の基準に基づいて優先する行だけを残すことができます。

特に↑この部分、私がSnowflakeで扱ってる対象のテーブルには重複したデータが入っているケースが実際にあるんです。
その「重複データの除外」をもうちょっと長めのクエリでやってたんです。
QUALIFYを使うように変えるとクエリがシンプルになりそうです。
得られる結果が同じ＆パフォーマンスに問題がなければQUALIFYを使う形式に変えたいと思い、検証してみました。
レッツ、リファクタリングです。

# 現クエリ
注）実際のテーブル名、カラム名をボカシています。

```
with numbering as	
(	
select
*,row_number() over (partition by ID order by UPDATETIME desc) as num
from TEST_LAKE_TABLE
)
select 
	UPDATETIME,
	ID,
	AAA,
	BBB,
	CCC
from numbering
where num = 1
group by all;
```

with句で先に対象テーブル全カラム＋タイムスタンプの降順で番号：numを付けてnumberingという一時Viewっぽいものを作るということをした上で、numberingからnum = 1で最新を取って、group by allで重複削除（タイムスタンプまで全く同じデータを削除）しています。
ちょっとめんどくさいし、脳ミソから拒絶反応が出ますね。

# 新クエリ
QUALIFYを使ってみます。
```
SELECT 	
	UPDATETIME,
	ID,
	AAA,
	BBB,
	CCC
FROM TEST_LAKE_TABLE
QUALIFY ROW_NUMBER() OVER (partition by ID order by UPDATETIME desc) = 1;
```
with句を使わずに短くシンプルに書き換えできました。
15行⇒8行です。

- 得られる結果が同じか
- パフォーマンスに問題がないか
を見ていきます。

# 結果の検証
## 件数
まったく同じでした。

## 実際の全データ比較
Snowsightで出力された全件をcsvダウンロードしてDIFFツール（WinMerge）で比較して完全一致を確認しました。
※order by UPDATETIME,ID
をつけて同じ順序で出力されるようにして比較しています。

## パフォーマンス
まずは結果出力の右側に出る情報でクエリ時間を確認しました。
現クエリ：2.1秒
新クエリ：1.7秒
誤差くらいかもしれませんが、パフォーマンスに問題はなさそうです。

クエリプロファイルを見ます。
クエリプロファイルの見方は（SnowProとったくせに）いまいちよくわかっていないのですが、ノードがつながってるGUI表示の部分は
現クエリ：ノードが6個
新クエリ：ノードが5個
とノードが1個減ったようです。
何が減ったかを見比べると「Aggregate」が減ってました。
現クエリにはgroup by allがあって、新クエリにはないからでした。
QUALIFYは「Aggregate」ではないんですね。
この「Aggregate」が減った分だけパフォーマンスはよくなるはずと思います。

クエリプロファイルの画面右側に出てくる値を下記表にまとめました。
クエリ内の割合で出てきた数値なので比較というのが難しく、パフォーマンス的にいいのか悪いのかの判断がつきませんでした。（比較するものじゃなさそう）
| | 現クエリ | 新クエリ |
|:-----------|:------------|:------------|
| 処理中 | 35.30% | 29.20% |
| リモートディスクI/O | 45.10% | 50.00% |
| 同期 | 3.90% | 出力なし |
| 初期化 | 15.70% | 20.80% |

# まとめ
QUALIFYを使うことで
- クエリがシンプルになる
- 集計関数を使わなくてよくなる
- 取得できる結果は全く同じ
- パフォーマンスは低下しない（よくなってるハズ）
ということが確認できました。

あえてデメリットを挙げると。。。
Snowflakeから別のデータ基盤に乗り換える必要が出てきたときに、QUALIFYはSnowflake独自の機能っぽいのでそのまま移植できないという、Snowflakeロックインの原因になることくらいかと思います。

:::note
追記
BigQuery、RedshiftでもQUALIFYは使えるみたいです。
ということはロックインにはならないのでデメリットではないと言えます。
:::

実際のSnowflake環境の定義もQUALIFYを使うように変えていこうと思います。

元記事のモリユウキ様、ありがとうございます。
Mac の「アプリケーションメモリが不足しています」の対処

# 解決策
不要なファイルを削除して、SSD の空き容量を確保する。

# 原因
アクティビティモニタでメモリ状況を確認すると、スワップ使用領域が数百MBしか使われていない状態でした。
※スワップ使用領域は Mac のメモリが不足した時に確保している SSD などのストレージの容量のこと

つまり、SSDのストレージがいっぱいでスワップ領域を確保できなかったため、メモリ不足の警告が表示されたということでした。

# おまけ
スワップ領域を使用している状態はストレージを介しているため、動作が遅くなります。

常に大量のスワップ領域を使用している方はメモリの増設を検討した方がいいかもしれません。
Gitで過去コミットで消してしまったファイルを取り戻す

# はじめに
あれ？？以前存在したファイルが消えてしまってる???
前に使ってたファイル消してしまったけど、復元して〜!
なんて事ありませんか？

そんな時の対処法です!!

# ファイルが消されたcommitを見つけよう
### 削除されたファイルを含むコミットを検索

```bash
git log --diff-filter=D --summary
```

:::note info

- 誰が変更したのかなどを気にする必要がないのであれば、
`git log`の後ろに`--oneline`を追加すると見やすくなります


- また、ファイル名が明確にわかっているのであれば、
一番最後に`-- "ファイル名"`で検索することも可能です(ワイルドカード可)
:::

### 例: 間違えて消した`example.txt`を復元する
```bash
git log --oneline --diff-filter=D --summary -- "*example.txt"
810d535 (HEAD -> main, origin/main) delete example.txt
 delete mode 100644 Qiita/example.txt
```
今回はexample.txtという情報だけを記憶していてどこにあるものだったか忘れていたため`*example.txt`としました。

すると`Qiita/example.txt`を消した履歴が出てきました

:::note info
ここでいう`810d535`が下で言う`<コミットハッシュ>`にあたります
:::



# ファイルを復元しよう
`git checkout`を使用してファイルを復元します。`<コミットハッシュ>`には先ほど検索したものを使用してください

```bash
git checkout <コミットハッシュ>^　-- <ファイル名>
```
:::note info
`^`を使用してファイルが削除されたコミットの一つ前のコミットから復元している
:::


### 例: Qiita/example.txtを復元

```bash
git checkout 810d535^ -- Qiita/example.txt
```

# 補足
ファイル限定ではなくディレクトリの復元も可能です

### 例: Qiitaディレクトリを消してしまった。
ディレクトリの中身が下記のようなQiitaディレクトリを消してしまっていたとしましょう
```bash
cd Qiita/
ls
example.txt	example2.txt	example3.txt
```
ファイルと同様に、ディレクトリを消したコミットを見つけます
```bash
git log --oneline --diff-filter=D --summary -- "*Qiita/**"
e382d54 (HEAD -> main, origin/main) Qiita/の削除
 delete mode 100644 Qiita/example.txt
 delete mode 100644 Qiita/example2.txt
 delete mode 100644 Qiita/example3.txt
```

ファイルを復元
```bash
git checkout e382d54^ -- Qiita/
```

:::note warn
- 実際にgitで追跡されているのはファイルであり、ディレクトリではありません。そのため、空のディレクトリは復元できません

- ディレクトリが完全に削除されたのではなく、ファイルの一部だけが削除された場合、削除されたファイルのみが復元されます
:::
HTTPメッセージとは

# HTTPメッセージとは
>リクエストメッセージとレスポンスメッセージをまとめて「HTTPメッセージ」と呼びます。

# リクエストメッセージの構造
### リクエストライン
>一行目は「リクエストライン」と呼び、メソッド、リクエストURI、プロトコルバージョン(HTTP 1.1)から成り立ちます。

####  メソッド
>URIで識別するサーバ上のリソースに対する処理を指定します。

#### リクエストURI
https://qiita.com/masatom86650860/items/a55a44097cb8086ac23c

>リクエストURIha,これまでのようにパス以降の文字列になるか、あるいは絶対URIになります。

### ヘッダ
>リクエストメッセージの二行目以降はヘッダが続きます。ヘッダはメッセージのメタデータです。

#### メタデータとは
>データを記述するデータ、データについてのデータのことです。メタというのはこのように、ある対象について高次なものを示す接頭辞です。

### ボディ
>ヘッダの後にボディが続くこともあります。ボディには、その`メッセージを表す本質的な情報`が入ります。例えばリソースを新しく作成したり更新したりするときは、`リクエストのボディにリソースの表現そのもの`が入ります。

# レスポンスメッセージ
### ステータスライン
>プロトコルバージョン、ステータスコード、テキストフレーズ（OK)から成ります。

### ヘッダ
上の説明の応答版

### ボディ
上の説明の応答版

# httpメッセージの構成
>一行目は「スタートライン」と総称されます。
...
リクエストメッセージの場合は、リクエストライン、レスポンスメッセージの場合はステータスラインです。
スタートラインに続いてヘッダが並びます。
...
ヘッダの終了は空行で識別します。
...
ボディにはテキストだけでなくバイナリデータも入れられます。

# 出典
https://gihyo.jp/book/2010/978-4-7741-4204-3


# 感想
ヘッダーがどの位置にあるのか知ることができた。
この一塊のデータを送信、受信していることを改めて理解できた。
ちなみに
`curl -v https://www.kantei.go.jp/`でhttpメッセージを確認できます。