OmniAICreator/Qiita-1.07M huggingface dataset:
AutoGPTのインストール（2024年7月版）

去年の時点でのインストール方法を説明してくれている記事はあれど、その通りやってもできなかったので、自分も現時点でのインストール方法を書いておくことにしました。

:::note info
当方の環境
MacBookPro 2019 i9 64GB
macOS Ventura13.2.1
pyenv 2.3.36
Python 3.11.8
Poetry (version 1.8.3)
:::

各所でインストールについて解説してくれているのですが一気に話題になった1年〜半年前の情報が多く、その時点のものだと「『master』ブランチを『Stable』ブランチに変更して・・・」とありますが、現在はそのブランチが存在しません。


# Releasesから最新版を見つける
https://github.com/Significant-Gravitas/AutoGPT 右サイドにある「Releases」に最新版（Latest）のリリースページがあるのでそちらを開きます。（当記事執筆時点では v0.5.1。）

![スクリーンショット 2024-07-07 12.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826038/99f5e37e-6dd7-ef34-e123-f4b77737629b.png)

![スクリーンショット 2024-07-07 12.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826038/a3b7121d-c8b1-6e05-efe4-c7becd2595df.png)

（参考： https://bocek.co.jp/media/service/902/）

# ソースのダウンロード

ページの下の方にソースのダウンロードリンクがあります。zip でも tar.gz でもお好きな方で。

![スクリーンショット 2024-07-07 12.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826038/2392fab5-d874-297f-c890-ef73b8b6cd5c.png)

# インストール

解凍して解凍したディレクトリ「AutoGPT-autogpt-v0.5.1」に cd して setup.sh を実行します。
```
cd AutoGPT-autogpt-v0.5.1
./setup.sh
```
setup.sh では、pyenv、python、poetryの有無を確認しつつ無ければインストールしてくれるようです。
（自分は全て入っていたので実行しても何も起こりませんでした。）

あとは
```
./run setup
```
で、gitの設定についてワーニング等出るので、その通りにgitを設定してみてください。

インストールは、ここで完了です。
（動作については、このあと自分でいじってみて、書かせていただくかもしれません。）

:::note info
Qiita 初投稿です。ツッコミ歓迎します。
:::
【PostgreSQL】メタコマンド〜\dx〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dxとは

> インストールされた拡張を一覧表示します。 `pattern`を指定すると、パターンにマッチする名前の拡張のみを表示します。 `\dx+`形式が使用された場合、マッチする拡張それぞれについて拡張に属するすべてのオブジェクトが表示されます。
> 

[\dxについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5Cdx%5B%2B%5D%20%5B%20pattern%20%5D,-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C)

## 試してみた

まずは普通に使ってみた

```sql
postgres=# \dx
                    インストール済みの拡張一覧
  名前   | バージョン 　　　　　　　|  スキーマ 　　　　 |             説明             
---------+------------+------------+------------------------------
 plpgsql | 1.0        | pg_catalog | PL/pgSQL procedural language
(1 行)

```

詳細を見る

```sql
postgres=# \dx+
     機能拡張"plpgsql"内のオブジェクト
            オブジェクトの説明             
-------------------------------------------
 function plpgsql_call_handler()
 function plpgsql_inline_handler(internal)
 function plpgsql_validator(oid)
 language plpgsql
(4 行)
```

## まとめ

いつも`pg_available_extensions`に条件をつけて確認していたのでこれは知ってよかった。
爆速JS環境Bun入門：5分でNode.jsの4倍速を体験しよう

Bunは、JavaScriptの実行とパッケージ管理を高速化するランタイムです。Nodeを置き換える可能性を秘めています。

「本当に必要なの？」

そう思った方、ちょっと待ってください。Bunは単なる新顔ではありません。Nodeの4倍以上の速度[^1]で動作し、TypeScriptやJSXをネイティブサポートする、まさに「爆速」な開発環境なのです。

[^1]: Bunの公式ベンチマークによる。実際のパフォーマンスは環境やタスクによって異なる場合があります。

本記事では、Bunのセットアップからhello-worldまでを5分で体験できる方法をご紹介します。Nodeをご存知の方はもちろん、「bunってなんぞや？」と思っている方に読んでいただきたい内容です。

## 1分でできるBunのセットアップ

Bunのインストールはとても簡単です。ターミナルを開いて、以下のコマンドをコピー&ペーストするだけ。

### macOS, Linux

```bash
curl -fsSL https://bun.sh/install | bash
```

### windows

```sh
powershell -c "irm bun.sh/install.ps1|iex"
```

これだけで、Bunがインストールできます。インストールが完了したら、さっそく動作確認をしてみましょう。

```bash
bun --version
```

バージョン番号が表示されれば、準備完了です。

## Node.jsとの圧倒的な違い

Bunを使って初めてスクリプトを実行したとき、私は目を疑いました。これほどまでに起動が速いのかと。

例えば、簡単なHello Worldプログラムを実行してみましょう。

```javascript:hello.ts
console.log("Hello, Bun!");
```

このファイルをNodeで実行すると、ほんの少し（目に見えないくらいの）遅延があります。しかしBunで実行すると...

```bash
bun run hello.ts
```

瞬時に結果が表示されるのです。この差は、大規模なプロジェクトになればなるほど顕著になります。

以下はBunの作者Jarred Sumner氏による、node, denoとの実行スピード比較です。
Benchmark 1がbun、2がnode、3がdenoです。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">JavaScriptCore starts fast<br><br>`console.log(&quot;hi&quot;);` in bun:<br>- 2x faster than deno<br>- 4.5x faster than node 16 <a href="https://t.co/1shMukuGAy">pic.twitter.com/1shMukuGAy</a></p>&mdash; Jarred Sumner (@jarredsumner) <a href="https://twitter.com/jarredsumner/status/1499225725492076544?ref_src=twsrc%5Etfw">March 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

さらに先ほどのコマンドでお気づきだと思いますが、BunはTypeScriptやJSXをそのまま実行できます。つまり、事前のコンパイルやトランスパイルが不要なのです。いちいちTypescript周りのパッケージをインストールしてくる必要がありません。これは開発効率を大幅に向上させます。

## Bunを使って変わる開発ライフ

Bunを日々の開発に取り入れることで、私の開発ライフは大きく変わりました。

1. プロジェクトの起動時間とホットリロード時間が短縮され、ストレスが激減。
2. TypeScriptやReactの開発がシームレスに。
3. ビルトインのパッケージマネージャーにより、voltaなどのパッケージマネージャーを別途導入する必要がない。

特に印象的だったのは、大規模なReactプロジェクトでのホットリロードの速度です。変更を加えてから画面に反映されるまでの時間が、まるで瞬間移動のように感じられました。

## Bunを使ったReact, Next.jsの始め方

### React

```bash
bun create vite my-app
```

https://bun.sh/guides/ecosystem/vite

### Next.js

```bash
bun create next-app
```

https://bun.sh/guides/ecosystem/nextjs

## 留意点

ここまで良い点ばかり述べてきたので、最後にデメリットというか留意しておくべき点を述べて締めます。

Bunは、Jarred Sumner氏がほとんど一人で開発を手掛けているため、作者がモチベを保てなくなった瞬間にサポートが終了します。これはnodeにはない安定性の欠如を示します。

また、nodeと比較して新しいことができるようになるものではありません。既存の効率を大幅に向上させただけで、Bunにしかできないことは特にないです。

したがって、node、deno以外のランタイムの選択肢が新たにできたという認識が正しいです。

## まとめ

Bunは、JavaScriptの実行環境として非常に魅力的な選択肢です。特に、パフォーマンスを重視するプロジェクトや、開発効率の向上を目指すチームにとっては、検討する価値が十分にあるでしょう。

今すぐにでもBunをインストールして、あなたのプロジェクトで試してみてはいかがでしょうか？

それでは良きJavascript開発ライフを！
自己署名証明書の作り方

### 目的
* ApacheのSSL化に必要な証明書まわりの概要をまとめます
* オレオレ証明書（自己署名証明書）の作成手順をまとめます

### SSL/TLS化と証明書の種類
* オレオレ証明書（セキュリティの警告あり）
    公に信頼されている認証局（CA)の署名の代わりに開発者等が署名した証明書。
    信頼不足のためブラウザではセキュリティの警告が表示される。

    ルート証明書や中間証明書との関連性を持たず、単独で生成されたTLS/SSL証明書のこと。
* オレオレ証明書（セキュリティの警告なし）
* オレオレ認証局
* 無償認証局

### オレオレ証明書（セキュリティの警告あり）の作り方
参考 [SSL用 サーバー証明書と自己署名証明書について](https://tkyonezu.com/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/ssl%E7%94%A8-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A8%E8%87%AA%E5%B7%B1%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
##### 1. 秘密鍵の作成
```console
// 秘密鍵を作成。RSA 2048ビット
[root@marmoset ~]# openssl genrsa 2048 > server.key

// 内容確認
[root@marmoset ~]# openssl rsa -noout -text -in server.key
```
##### 2. 証明書署名要求の作成
```console
// 秘密鍵から証明書の署名要求を作成（ここではすべて規定値とする）
[root@marmoset ~]# openssl req -new -key server.key -out server.csr

// 内容確認
[root@marmoset ~]# openssl req -text -in server.csr
```
##### 3. 自己署名証明書の作成
```console
// 秘密鍵で署名した証明書を作成
[root@marmoset ~]# openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
Certificate request self-signature ok
subject=C = XX, L = Default City, O = Default Company Ltd

// 内容確認
[root@marmoset ~]# openssl x509 -text -in server.crt
```

#### 4. 作成したファイルの確認
```console
[root@marmoset ~]# ls -l | grep server
-rw-r--r--  1 root root 1115 Jul  7 13:12 server.crt
-rw-r--r--  1 root root  952 Jul  7 13:09 server.csr
-rw-r--r--  1 root root 1704 Jul  7 13:01 server.key
```
無償Linuxディストリビューション 有効期限一覧

基本的に無償の最終セキュリティアップデート日を収集しました。

|ディストリビューション|有効期限|備考|
|---|:-:|-|
|openSUSE Tumbleweed|[無期限](https://ja.opensuse.org/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%BF%E3%82%A4%E3%83%A0#openSUSE_Tumbleweed)|
|MIRACLE LINUX 9|[2032/11](https://www.miraclelinux.com/support/miraclelinux9/miraclelinux9-support/ml9-appstream-support)|次期バージョン(10)からAlmaLinuxに合流|
|AlmaLinux 9|[2032/5/31](https://endoflife.date/almalinux)|
|Rocky Linux 9|[2032/5/31](https://wiki.rockylinux.org/rocky/version/)|
|Rocky Linux 8|[2029/5/31](https://wiki.rockylinux.org/rocky/version/)|
|AlmaLinux 8|[2029/5/01](https://endoflife.date/almalinux)|
|Ubuntu 24.04 LTS|[2029/04](https://ubuntu.com/about/release-cycle)|
|Debian 12|[2028/06/30](https://www.debian.org/releases/bookworm/)|
|Ubuntu 22.04 LTS|[2027/04](https://ubuntu.com/about/release-cycle)|
|Debian 11|[2026/08/31](https://www.debian.org/releases/bullseye/)|
|openSUSE Leap |[2025/12/31](https://ja.opensuse.org/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%BF%E3%82%A4%E3%83%A0#openSUSE_Leap_.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6)|Leap 15.6|
|Fedora Linux 40|[2025/05/13](https://ja.wikipedia.org/wiki/Fedora)|サポート期間は約13ヶ月|
|Ubuntu 20.04 LTS|[2025/04](https://ubuntu.com/about/release-cycle)|
[比較]map と pluck



業務で`map`と`pluck`の違いを意識することが増えたので、整理する

---

| |map |pluck |
|:-- |:-- |:-- |
| 公式doc | https://docs.ruby-lang.org/ja/latest/class/Array.html#I_COLLECT | https://railsdoc.com/page/model_pluck |
| | RubyのArrayクラスのメソッド | RailsのActiveRecordのメソッド |
| | 各要素に対してブロックを評価した結果を全て含む**配列**を返す | 指定したカラムのレコードの**配列**を返す |
| 特定のカラムの配列を取得したいときの記法 | Array.map(&:カラム名) | モデル.pluck(:カラム名) |
| ActiveRecordインスタンスの生成 | する(必要なカラム以外の全てのカラムをloadする) | しない(必要なカラムのみを取得する) |
| 使い分け | インスタンスからカラムの配列を取得したいとき | インスタンス以外から直接カラムの配列を取得したいとき |
| 詳細説明 | 取り出したいカラム以外の情報も取得するためメモリ使用量は増えてしまう。既にインスタンス化されたものにmapを使用することで余計なクエリ発行を防ぐことができる。 | メモリ使用量が少なく大量のデータを扱う場合にパフォーマンスが高い。ただメソッド実行時に毎回SQL分が発行されるので、N+1の原因になるケースがあるので注意 |


```ruby
User.all.map(&:id)
 # => User Load  SELECT `users`.`id`, `users`.`name`, (省略) FROM `users`

User.all.pluck(:id)
 # => User Pluck  SELECT `users`.`id` FROM `users`


# インスタンスに対してmapを使用する例
users = User.all
 # => User Load  SELECT `users`.`id`, `users`.`name`, (省略) FROM `users`
users.map(&:id)
 # => [1,2,3,4,...,100]
```


---

[参考]

https://astrophysik928.hatenablog.com/entry/2021/07/10/235345


https://qiita.com/TT-nasu/items/e6971efd1383d7f500dd#%E3%81%BE%E3%81%A8%E3%82%81

https://zenn.dev/lovegraph/articles/36162fa551384e
Amazon RDSについて

# Amazon RDS とは？

## 概要
Amazon RDS (Relational Database Service) は、AWS が提供するフルマネージドなリレーショナルデータベースサービスです。RDS を使用することで、データベースのセットアップ、運用、スケーリングを簡単に行うことができます。これにより、ユーザーはインフラストラクチャの管理から解放され、アプリケーションの開発に集中することができます。

## 主な機能
- **マネージドなデータベース**
  - データベースのプロビジョニング、パッチ適用、バックアップ、リカバリ、スケーリングなどの管理タスクを自動化します。
- **高可用性と耐障害性**
  - マルチAZ (Availability Zone) 配置により、高可用性と自動フェイルオーバーを提供します。
- **スケーラビリティ**
  - 読み取り専用レプリカを使用して、読み取りスループットを向上させることができます。また、ストレージとコンピューティングリソースを独立してスケールできます。
- **セキュリティ**
  - データの暗号化、ネットワークの隔離、IAM を使用したアクセス管理など、強力なセキュリティ機能を提供します。
- **自動バックアップ**
  - 自動バックアップ機能により、データの保護とリカバリが容易になります。

## サポートされているデータベースエンジン
Amazon RDS は、以下の主要なリレーショナルデータベースエンジンをサポートしています。
- **Amazon Aurora**
  - 高性能で高可用性のリレーショナルデータベース。MySQL と PostgreSQL 互換。
- **MySQL**
  - オープンソースのリレーショナルデータベース。
- **PostgreSQL**
  - 高機能なオープンソースのリレーショナルデータベース。
- **MariaDB**
  - MySQL 互換のオープンソースデータベース。
- **Oracle**
  - 商用のリレーショナルデータベース。
- **Microsoft SQL Server**
  - 商用のリレーショナルデータベース。

## 利用例
- **ウェブアプリケーション**
  - 高可用性とスケーラビリティが求められるウェブアプリケーションのバックエンドデータベースとして利用。
- **データウェアハウス**
  - 大量のデータを効率的に処理するためのデータウェアハウスとして利用。
- **モバイルアプリケーション**
  - モバイルアプリケーションのデータストレージとして利用。

## 実際の例
以下は、Amazon RDS で MySQL データベースインスタンスを作成する CloudFormation テンプレートの例です。
EC2セキュリティグループを使用してRDSDBSecurityGroupを定義
``` yaml: CloudFormationファイル
AWSTemplateFormatVersion: '2010-09-09'
Resources:
    DBInstance:
      Type: AWS::RDS::DBInstance
      Properties:
        DBName:
          Ref: DBName
        Engine: MySQL
        MasterUsername:
          Ref: DBUsername
        DBInstanceClass:
          Ref: DBClass
        DBSecurityGroups:
        - Ref: DBSecurityGroup
        AllocatedStorage:
          Ref: DBAllocatedStorage
        MasterUserPassword:
          Ref: DBPassword
    DBSecurityGroup:
      Type: AWS::RDS::DBSecurityGroup
      Properties:
        DBSecurityGroupIngress:
          EC2SecurityGroupName:
            Ref: WebServerSecurityGroup
        GroupDescription: Frontend Access
    WebServerSecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Enable HTTP access via port 80 and SSH access
        SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
```

このテンプレートは、`db.t2.micro` タイプの MySQL データベースインスタンスを作成します。`MasterUsername` と `MasterUserPassword` にはデータベースの管理者ユーザー名とパスワードを指定し、`AllocatedStorage` にはストレージ容量を指定します。

## まとめ
Amazon RDS を使用することで、リレーショナルデータベースの管理が大幅に簡素化され、スケーラブルで高可用性のデータベースを簡単に構築できます。
Build a Travel Approval App

実際にこのトレイルヘッドを試してみました。プレイグランドのロケーションが日本だったので一番最初で躓きましたが、それ以外は問題なしです。


https://trailhead.salesforce.com/content/learn/trails/build-a-travel-approval-app

+ **[Build a Data Model for a Travel Approval App](https://qiita.com/Keiji_otsubo/items/da0121340bdb5dfe0f66)**
  + Create a Travel Approval Lightning App
  + Create a Department Object
  + Create a Travel Approval Object
  + Create an Expense Item Object
  + Import Data and Test the App
+ **Customize the User Interface for a Travel Approval App**
  + Create a User and Setup Approvals
  + Create and Customize a List View
  + Customize the Travel Approval Object Page Layout
  + Customize the Expense Item Related List
  + Enable Chatter on the Travel Approval Object
+ **Add Business Logic to a Travel Approval App**
  + Create Validation Rules
  + Create a Roll-Up Summary Field
  + Create Formula Fields
  + Create a Flow
  + Create an Approval Process
  + Test Your Approval Process
+ **Add Reports and Dashboards to a Travel Approval App**
  + Load Data Using the Data Import Wizard
  + Create a Travel Requests by Department Report
  + Create a Travel Requests by Month Report
  + Create a Travel Approvals Dashboard  


# Create a User and Setup Approvals

作ったプレイグランドが英語になっていたので安心していたが、ロケールが日本だったので姓と名が逆になってましたね。

:::note alert
We couldn't find a user named Eric Executive
:::
[vim script] #がつく時とつかないときの違い

# `#`がつくときとつかないときの違いとは（`==`の場合）
結論としては、文字列同士を比較したとき、小文字大文字関係なく等しいのかを評価するかどうかです。
以下で、例を示します。

## 例
### `#`がつかない場合↓
```vimscript
echo "hello" == "hello"
" -> 1(trueという意味です)

echo "hello" == "Hello"
" -> 1
```
### `#`がつく場合↓
```vimscript
echo "hello" ==# "hello"
" -> 1

echo "hello" ==# "Hello"
" -> 0（falseという意味です）
```

# まとめ
`#`がつく方がより厳密に評価するようです。
基本的には`#`をつけて評価を行った方が良さそうですね。
ISystem と SystemBase

## ISystem と SystemBase の違いと、用いるポイントについて

ECSでプログラムを作成しているとき、色々なサンプルプログラムを参照しつつ制作していくと思いますが、作業する中で思い至った ISystemとSystemBase の使い分けについて備忘録を残します。

### １，[BurstCompile] を使うかどうか
ECSを使ってゲームを作る場合、負荷軽減が目的になることも多いと思いますが、少しでも高速処理するために、BurstCompileを使いたい場面は多いと思います。

SystemBase上でもJobを起こして、.Scheduleや.ScheduleParallelを使えば、Job内ではBurstCompileを使えますが、多少の差は出てくると思います。

.Scheduleと.ScheduleParallelの違いはこちら
https://qiita.com/khbowling/items/c5daa1488312373f162f

### 2， GameObjectとの連携

ISystem はGameObjectと繋げて設計するのが難しいことが多いです。
なので実際には、MonoBehaviour ⇔ SystemBase ⇔ ISystem のように、間に挟んで設計することになります。
例えば、
・マウスクリックでカメラに対してのポジション（Vestar3）を取得する場合
・キャラクター（Entity）が戦闘でダメージを受けた時、ダメージアイコンを出現させる場合(Entityのダメージアイコンは出せるが、カメラの向きを取得して向きを変えられない)
のようなケースでは、SystemBaseを挟む必要が出てきます。

他にも思いついたら追記していこうと思いますが、
基本的にはできる限りISystemを使い、どうしても難しい場合はSystemBaseを使うように設計していくことが最適解と思います。
AWS CloudFormationについておさらいしてみた（初級です。）

# AWS CloudFormation とは？

## 概要
AWS CloudFormation は、AWS リソースをコードとして管理するためのサービスです。インフラストラクチャをテンプレートファイル（YAML または JSON 形式）で定義し、そのテンプレートを使用して AWS リソースをプロビジョニング、更新、削除することができます。

## 主な機能
- **テンプレートベースの管理**
  - インフラストラクチャをテンプレートファイルで定義することで、再現性のある環境を簡単に作成できます。
- **スタック**
  - テンプレートを使用して作成されたリソースの集合を「スタック」と呼びます。スタック単位でリソースの管理が可能です。
- **依存関係の管理**
  - リソース間の依存関係を自動的に解決し、正しい順序でリソースを作成します。
- **変更セット**
  - スタックの更新前に変更内容をプレビューできる「変更セット」を作成し、リスクを最小限に抑えます。
- **ロールバック**
  - スタックの作成や更新が失敗した場合、自動的にロールバックして前の状態に戻します。

## 利用例
- **インフラストラクチャの自動化**
  - 開発、テスト、本番環境のインフラストラクチャを自動化し、一貫性を保つことができます。
- **継続的デリバリー**
  - CI/CD パイプラインに組み込むことで、インフラストラクチャの変更を自動的にデプロイできます。
- **複数環境の管理**
  - 同じテンプレートを使用して、異なる環境（開発、ステージング、本番）に同一のインフラストラクチャをデプロイできます。

## テンプレートの例
以下は、シンプルな EC2 インスタンスを作成する CloudFormation テンプレートの例です。
```yaml: CloudFormation Templateファイル

AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template
Resources:
  MyEC2Instance: #An inline comment
    Type: "AWS::EC2::Instance"
    Properties: 
      ImageId: "ami-0ff8a91507f77f867" #Another comment -- This is a Linux AMI
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

このテンプレートは、`t2.micro` タイプの EC2 インスタンスを作成します。`ImageId` には Amazon Linux 2 の AMI ID を指定し、`KeyName` には事前に作成したキーペアの名前を指定します。

## まとめ
AWS CloudFormation を使用することで、インフラストラクチャの管理が効率化され、手動による設定ミスを防ぐことができます。

## 参考
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html
GitLab CIでdocker composeを使う場合のイメージ

## はじめに
最近、GitLabのCI/CDの機能を触りました。
その際に、docker composeコマンドを使ったのですが、imageの指定で悩んだのでまとめておきます。

## GitLab CIとは
GitLab CI（Continuous Integration）は、GitLabが提供する継続的インテグレーションと継続的デリバリー（CI/CD）ツールです。GitLab CI/CDを使用すると、ソフトウェアのビルド、テスト、自動デプロイをシームレスに行うことができます。
`.gitlab-ci.yml`にCI/CDの設定を記述することで、機能を使うことができます。

## docker composeコマンドのimage
GitLab CIでコンテナを作成し、そのコンテナでテストなどを行う場合、imageを指定しないといけません。
ただ、リポジトリで`docker-compose.yml`を使用し、複数のコンテナを起動している場合、docker composeのコマンドを使用しないといけません。
その場合、dockerイメージを使えばいいのか、docker/composeイメージを使えばいいのかと悩むと思います。

結論から言うと、dockerイメージで大丈夫です。

dockerイメージではdocker composeコマンドが使用できるようになったため、docker/composeイメージでなくてOKです。
```yml
image: docker:latest
```

参考↓

https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350#%E4%BB%8A%E5%BE%8C-compose-v1-%E3%81%AF%E9%9D%9E%E6%8E%A8%E5%A5%A8eol-%E3%81%BE%E3%81%A7%E7%8C%B6%E4%BA%88%E3%81%AF1%E5%B9%B42023%E5%B9%B46%E6%9C%88%E4%BB%A5%E9%99%8D%E3%81%AE%E4%BA%88%E5%AE%9A

## 終わりに
このimageを何にするか悩んだので、もし調べている方がいれば助けになればと思います。
ステータス別サブテーブル制御プラグインを紹介

ステータス条件によってサブテーブルに機能追加するプラグインです。

# 特徴
・サブテーブルの行増減を禁止にできる
・レコード作成時に初期行数を設定できる
・サブテーブルの任意のフィールド非活性/非表示にできる
・ステータス毎に機能を設定できる。

# 動作例
## 行増減禁止
サブテーブルの+/-を非表示にすることができます。
![サブテーブル行禁止.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/9c84a761-1aa7-afdf-c92c-2b4b4aa17dc9.png)

## 初期行数設定
レコード作成時に初期行数分の行を生成します。
※行増減禁止と合わせてサブテーブルの行数を固定にすることができます
![初期行数.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/e0e0a0cc-cb02-6b43-4109-eb6d4e6295fd.gif)

## 非活性フィールド設定
サブテーブル内の特定のフィールドを非活性にできます。
![非活性.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/fc1ecfd9-0d78-e92c-458b-3a57dc7da17e.png)

## 非表示フィールド設定
サブテーブル内の特定のフィールドを非表示にできます。
![非表示フィールド.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/cb55bb4a-d8ea-d280-073f-fe3dbd363c48.png)

# プラグインの設定例
新規作成時やステータスによって適用する機能を制御することができます。
![プラグイン画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/f9794045-ae44-8629-a04a-0a517e3f26c7.png)

# 販売元
紹介したプラグインは以下にて購入できます。
[ステータス別サブテーブル制御プラグイン](https://idepenshop.stores.jp/items/66816acfce75b20a6273ba47)

他にもプラグインを紹介していますので興味があればご確認ください。
[イデペンショップ](https://idepenshop.stores.jp/)
個人的に良く見る工数見積もり法

## はじめに
仕事で工数見積もりを行う機会があり、改めてどのような手法で工数見積もりを行っているのか考えてみたいと思いました。

私自身工数見積もりをそこまでやったことがなく、工数見積もりをやる際はいつもチームでそれまでやっていたものを踏襲する形で見積もりやっていました。

ただ、やり方が感覚頼りな面もあり、まだそのざっとの感覚がつかめておらずどのように見積もりをしていいのか、よく分からなくなります。
実際に、仕事でやっている工数見積もりをまとめながら、どう見積もるのが正しいのか考えたいと思います。

## 工数見積もり法
まず、仕事でやっている見積もり方法について、明言されていませんがこれだと思うものを挙げていきたいと思います。
### 類推見積もり法
過去の実績に基づいて、工数を算出する方法です。
過去に同じような改修で、4人日かかったので今回も４人日くらいだろうといったものです。
**メリット**：過去の実績に基づくため、現実的で信頼性のある見積もりが期待できる。
**デメリット**：過去のデータがなければ比較できない。経験や判断に基づくため、主観的な要素が入る。

よく、仕事ではこの類推見積もり法をやっています。
過去のデータや経験値としてこれくらいだろうといった感じで見積もりをしています。
ただ、これだと新入社員や開発未経験の人が見積もりを行うときに、感覚値がわからないといったことにもなると思います。
個人的には、この感覚というのがしっくりきていないと感じています。
長く開発をやっている人なら、なんとなくこのくらいだと見積もるのでしょうが、まだ経験が浅いとこの感覚がいまいちピンと来ないのです。

もしこの方法でやるとしたら、個人的には過去のデータを平均値で算出しておいてそのデータを誰でも見ることができる状態にし、経験が浅い人なら平均値＋αくらだろうとったふうにしたいです。

### 三点見積もり法
楽観的見積もり、悲観的見積もり、現実的見積もりの3つの値を見積もり、3つの値をもとに期待値を出します。
期待値によって、工数を決定します。
期待値 = {悲観値+(最可能値×4)＋楽観値}÷6

**メリット**：楽観的、悲観的、現実的な見積もりを使用することで、リスクや不確実性を反映した見積もりが得られる。複数の見積もり値を使用するため、単一の見積もりよりも精度が向上。
**デメリット**：各タスクについて3つの見積もり値を算出するため、見積もり作業に時間と労力がかかる。見積もりは主観的な判断に依存するため、見積もり値が不正確になる可能性がある。

類推見積もり法での工数決定のルールをより細かくしたような感じだと思っています。こちらも過去のデータを基に見積もりを行うもので、チームメンバーの経験が影響してきます。

## どう見積もるのが正しいのか
類推見積もり法、三点見積もり法はともに実際の仕事でよく使う工数見積もり法です。
ただ、どちらもチームメンバーの経験値が影響しています。経験値を考慮した工数見積もりができるというのは良いことです。しかし、経験や知識は人それぞれや時間によって変化します。

やはり、どちらも大切なのはデータをしっかりと目に見える形で示しておくことだと個人的に思いました。
また、チームメンバーの経験値の差がどの程度なのか認識しておくことも大切だと思います。このぐらいの差があるならとそれぞれで認識することで、見積もりもやりやすくなると思います。

- 過去のデータをいつでも見ることができる状態にする
- チームメンバーの経験の差を認識する

## 終わりに
まだ、どう見積もるのが正解なのか模索中ですが、一旦整理してみました。
これを読んだ方で、こうしたほうがいいという意見があれば、どしどしお願いします。
【PostgreSQL】メタコマンド〜\dv〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dvとは

> このコマンド群において、`E`、`i`、`m`、`s`、`t`、`v`という文字はそれぞれ、外部テーブル、インデックス、マテリアライズドビュー、シーケンス、テーブル、ビューを表します。 これらの種類のオブジェクトの一覧を表示するために、これらの文字の中の任意の文字またはすべてを任意の順番で指定することができます。 例えば、`\dti`はテーブルとインデックスを列挙します。 `+`がコマンド名に付与された場合、各オブジェクトは、もしあれば永続性の状態(permanent、temporary、またはunlogged)、ディスク上の物理容量、関連する説明をつけて表示されます。 `pattern`が指定されている場合は、パターンに名称がマッチする項目のみが表示されます。 デフォルトでは、ユーザが作成したオブジェクトのみが表示されます。 システムオブジェクトを含めるためにはパターンまたは`S`修飾子を付与してください。
> 

[\dvについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=S%2B%5D%20%5B%20pattern%20%5D-,%5Cdv%5BS%2B%5D%20%5B%20pattern%20%5D,-%E3%81%93%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%BE%A4)

## 試してみた

まずは使ってみる

```sql
postgres=# \dv
                    リレーション一覧
 スキーマ   |         名前           | タイプ  |   所有者   
----------+-----------------------+--------+------------
 public   | engineering_employees | ビュー   | daichi
(1 行)
```

詳細を確認する

```sql
postgres=# \dv+
                                 リレーション一覧
 スキーマ   |         名前          | タイプ   |   所有者    | 永続性  | サイズ   | 説明 
----------+-----------------------+--------+------------+--------+---------+------
 public   | engineering_employees | ビュー   | daichi     | 永続   | 0 bytes  | 
(1 行)
```

## まとめ

ビューだけに限定して一覧を見たい時は今ところなかった。
技術者大量解雇の時代が来るこれだけの理由

## 生成AIで中間管理職の仕事だけが増える未来

こんにちは。私はとある大手企業でバックオフィスの仕事をしています。

そんな現場から技術者大量解雇の時代が来る理由について何となく書いていこうと思います。

結論から言うと、AIをマスターした中間管理職が部下の仕事まで全部やってしまい、中間管理職のポストは増えるがその下のポジションが削減される未来になることが現実的なのかと思いました。

## 日本のテクノロジー企業の株価が全く上がらない問題

現在日本のテック産業、特に新興企業については株価が全く上がっていないどころか、プライム市場にいる企業の時価総額の合計が1000兆円を超えているにもかかわらず、日本のベンチャーはほとんどの場合株価が横ばい、または下振れしています。

この状況から、**テクノロジー企業は融資が受けにくくなり、案件が詰んでいたとしても増員できない問題**が発生すると思われます。

## 仕事はあるがその仕事は今やらなくてもいいし、そもそもやらなくてもいい

私がまだコロナが流行る前にかかわっていた仕事ですが、確かにガントチャートの引き直しが頻繁に行われ、プロジェクトが全く前に進んでいるような気配をみせていないような仕事で、PMの方はストレスまみれで愚痴ばかりこぼしているような案件だったのですが、増員はありませんでした。

なぜなら、予算がそもそも限られていたからです。その案件は予算が1カ月単位で決められていました。

そうすると、まず今いるメンバーを翌月も雇用できるかどうかすら危ない状況です。

そうなってくると、**新しいメンバーを雇用するより、既存のメンバーを強化する**ほうに目が向きやすくなるのかと思います。

## 既存のメンバーに教育資金をそもそもかけられない

既存メンバーを強化するしか限られた予算の中でやっていく方法はなく、予算が限られてしまった原因が、融資が受けにくい、資金を獲得しにくい環境にあるというお話をしました。

予算が限られていて、その予算が既存メンバーの単価を支払うために使われているので、もちろん教育にかける資金はありません。そこで次の傾向が出てくると思います。

## 生成AIありきの案件が増える

既存メンバーに対して、ツールの条件を限定するなどして強制的に生成AIを使わせるようにしていく流れができてくると思います。

生成AIについていくことができないメンバーについては、そもそもはじめから雇用しないという流れも出てくるかもしれません。

生成AIに注力する理由は単純で、限られた予算の中でより高い生産性を実現するためです。

## 結果、単価は高いけれど人数はいらないとなる

今後マネージャー職の人間もコーディングをすることが当たり前になってくると思います。

なぜなら、使われる技術の名前とすることさえ明確に指定すれば生成AIが精度の高いコーディングをしてくれるからです。

## そして中間管理職のメジャー投手化が進む

今のメジャーリーグの投手は昔より球速がより上がり変化球のバリエーションも増えたことから、ドジャースの山本投手をはじめ肘や肩を故障し長期離脱する選手が増えました。

つまり**より高パフォーマンスを求められたことで、より高出力になり、それが原因でケガしやすくなった**と言われています。

日本の中間管理職も今後マネージメントのほかに生成AIを使ったコーディングも仕事の中心になっていくのかもしれません。もしくは、そういった素養が案件に参画する条件として追加される可能性があります。

その結果、メジャーリーグの投手のように、無理をして体を壊す中間管理職がさらに増えるのではないかと思っています。

## 生成AIは便利なことに変わりはない

生成AIを使ってPGと同じ仕事ができるマネージャーが求められるというのがこの記事の結論です。

そうすれば、ほかのメンバーを雇用する必要がなくなり、生成AIができる中間管理職の単価を少し上げることで全体的な予算を抑えることができるというわけです。

## あなたのコメントをお待ちしています

反論もウェルカムですが打たれ弱いです。何かご意見があればコメントをお待ちしております。
[Flutter] エミュレータが真っ黒になった話

環境 Ubuntu 22.04  LTS

で android エミュレータを起動したところ
ずっと画面が真っ黒になった。

```sh
$  /home/name/Android/SDK/emulator/emulator -avd pixel7pro_34
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824473/2ea21aca-b88f-acb6-02a3-29e38fde8666.png)


データがいっぱいだったみたいです。
wipe  しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824473/a40f71fe-1c1e-ab89-7e5b-9b34b71fce8a.png)
ファイルの改行コードによるエラー

## はじめに
自分で変更したはずないのに、なぜか起こるエラーが私にはあります。
（おそらく眠気がすごいときに学習+コードを入力しているから…睡眠学習）
今回は多分眠気が原因で発生したであろうエラーについてアウトプットします。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3

## Layout/EndOfLine: Carriage return character detected.
VsCodeの初期設定がうまくいっていなく、このエラーが発生する人は一定数いると思います。エラーの意味と解決方法をまとめます。
### エラーの意味
- ファイル内の行末にキャリッジターン（\r）キャラクターが含まれていることを示している
- 通常、行末は改行（\n）だけであるべきで、キャリッジリターンは不要
- 特にWindowsで作成されたファイルにはこのキャリッジリターンが含まれていることが多いので、エディタやツールで行末をLF（\n）に統一すると解消できる

### 解決方法：エディタでの変更（例：VSCode）
1：ファイルを開く。
2：右下のステータスバーにある改行コード（CRLFまたはLF）をクリック。
3：上の検索窓でLFとCRLFを選択する一覧のようなものがでてくるので、LF（Unixスタイル）を選択。

[![Image from Gyazo](https://i.gyazo.com/2047837bef2b84d47bf9b243d7f663b5.png)](https://gyazo.com/2047837bef2b84d47bf9b243d7f663b5)

### 解決方法：コマンドラインでの変更
- Unix系システム（Linux/macOS）では、sedコマンドを使用して改行コードを変換できます
```
sed -i 's/\r$//' app/controllers/admin/site/attachments_controller.rb
```

- Windowsでは、dos2unixコマンドを使用して改行コードを変換できます。まず、dos2unixをインストールする必要があります。インストール方法は以下の通りです
- Homebrewを使用してインストール（macOS/Linux）：`brew install dos2unix`
- Ubuntu/Debian：`sudo apt-get install dos2unix`
- CentOS/RHEL：`sudo yum install dos2unix`

- それぞれインストール後、次のコマンドを実行します：`dos2unix app/controllers/admin/site/attachments_controller.rb`

## さいごに
私自身VsCodeを使用してコード入力等を行っているので、実際にはボタン2回くらいぽちぽちすることであっさり解決できました:relaxed:
眠気がひどいときにコード入力していると知らぬ間にマウスでカチッと押すこと今後もありそう💦最高のエンジニアになるためには仮眠も大事？
今回の記事が参考になれば幸いです。
【PostgreSQL】メタコマンド〜\du〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \duとは

> データベースロールを一覧表示します。 (「ユーザ」と「グループ」という概念は「ロール」に統合されましたので、このコマンドは`\dg`と同じものになりました。) `pattern`が指定されている場合は、そのパターンに名前がマッチするロールのみが表示されます。 デフォルトでは、ユーザによって作成されたロールのみが表示されます。 システムロールを含めるには`S`修飾子を付与してください。 `\du+`構文が使用された場合、ロールそれぞれについて更なる情報が表示されます。 現時点では各ロールのコメントが追加されます。
> 

[\duについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%5Cdu%5BS%2B%5D%20%5B%20pattern%20%5D,-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92)

## 試してみた

まずは普通に使ってみる

```sql
postgres=# \du
                                                ロール一覧
  ロール名    |                                     属性                                     | 所属グループ 
------------+------------------------------------------------------------------------------+--------------
 daichi     | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス               | {}

```

詳細を確認してみる

```sql
postgres=# \du+
                                                   ロール一覧
  ロール名    |                                     属性                                     | 所属グループ    | 説明 
------------+------------------------------------------------------------------------------+--------------+------
 daichi     | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス               | {}            | 
```

## まとめ

自分が実行した環境だと日本語で表示されてました。
いまいちグループの理解が浅いことに気づけたので理解を深めておきます。
PHP 8.3をインストールする

### 概要
Rocky Linux 9.4 にPHP 8.3をインストールする

### 現状確認
既にインストールされているかを確認する。メッセージが返ってこなければインストールされていないと断定。
```console
[root@marmoset ~]# dnf list installed | grep php
[root@marmoset ~]#
```
リポジトリのPHPバージョンを確認する。
```console
[root@marmoset ~]# dnf info php
Last metadata expiration check: 1:00:54 ago on Wed 03 Jul 2024 03:54:15 PM JST.
Available Packages
Name         : php
Version      : 8.0.30
Release      : 1.el9_2
Architecture : x86_64
Size         : 7.7 k
Source       : php-8.0.30-1.el9_2.src.rpm
Repository   : appstream
```
今回はPHP8.2を入れたいのでサードパーティリポジトリからインストールする

### リポジトリ追加
過去記事を参照 [サードパーティリポジトリインストール](https://qiita.com/tonoaki_sato/items/bc53256f164d18c62804)

### PHP 8.3 インストール
remiリポジトリからインストールするとremi用のディレクトリにインストールされる。
デフォルトのディレクトリにインストールするためには、モジュールとしてインストールする。
```console
// phpをモジュールとしてインストール
[root@marmoset ~]# dnf module install php:remi-8.3

// 確認
[root@marmoset ~]# php -v
PHP 8.3.9 (cli) (built: Jul  2 2024 14:10:14) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.9, Copyright (c) Zend Technologies
```
composer インストール

### Composerとは
>本家のイントロダクション
Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
Dependency management#
Composer is not a package manager in the same sense as Yum or Apt are. Yes, it deals with "packages" or libraries, but it manages them on a per-project basis, installing them in a directory (e.g. vendor) inside your project. By default, it does not install anything globally. Thus, it is a dependency manager. It does however support a "global" project for convenience via the global command
>
>Google翻訳
Composer は PHP の依存関係管理ツールです。プロジェクトが依存するライブラリを宣言すると、自動的に管理 (インストール/更新) されます。
依存関係の管理#
Composer は Yum や Apt と同じ意味でのパッケージ マネージャーではありません。確かに「パッケージ」やライブラリを扱いますが、プロジェクトごとに管理し、プロジェクト内のディレクトリ (例: vendor) にインストールします。デフォルトでは、グローバルに何もインストールしません。したがって、依存関係マネージャーです。ただし、利便性のために global コマンドを介して「グローバル」プロジェクトをサポートします。

### 本家
[A Dependency Manager for PHP](https://getcomposer.org/)

### インストール
ベリファイチェックはバージョン毎に変わるはずなので、本家サイトの [Command-line installation](https://getcomposer.org/download/) を参照してください。
```console
// セットアップ用ファイルをダウンロード
[root@marmoset ~]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

// ベリファイチェック
[root@marmoset ~]# php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

// セットアップ
[root@marmoset ~]# php composer-setup.php

// 不要なファイルを削除
[root@marmoset ~]# php -r "unlink('composer-setup.php');"

// パスの通ったディレクトリにファイルを移動
[root@marmoset ~]# mv composer.phar /usr/local/bin/composer

// コマンドの確認
[root@marmoset ~]# which composer
```
Leafletのマーカーを変更する

## マーカー画像を読み込む

マーカー画像を読み込んでマップに登録する。
画像読み込み時にサイズとアンカー位置を設定する。

```typescript
import imageAetheryte from '/public/eorzea_map/aetheryte.png';

const aetheryteIcon = L.icon({
  iconUrl: imageAetheryte.src,
  iconSize: [35, 35],
  iconAnchor: [17.5, 17.5],
});
L.marker(L.latLng(-128, 128), {
  icon: aetheryteIcon,
}).addTo(map);
```
【PostgreSQL】メタコマンド〜\ds〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dsとは

> このコマンド群において、`E`、`i`、`m`、`s`、`t`、`v`という文字はそれぞれ、外部テーブル、インデックス、マテリアライズドビュー、シーケンス、テーブル、ビューを表します。 これらの種類のオブジェクトの一覧を表示するために、これらの文字の中の任意の文字またはすべてを任意の順番で指定することができます。 例えば、`\dti`はテーブルとインデックスを列挙します。 `+`がコマンド名に付与された場合、各オブジェクトは、もしあれば永続性の状態(permanent、temporary、またはunlogged)、ディスク上の物理容量、関連する説明をつけて表示されます。 `pattern`が指定されている場合は、パターンに名称がマッチする項目のみが表示されます。 デフォルトでは、ユーザが作成したオブジェクトのみが表示されます。 システムオブジェクトを含めるためにはパターンまたは`S`修飾子を付与してください。
> 

[\dsについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=S%2B%5D%20%5B%20pattern%20%5D-,%5Cds%5BS%2B%5D%20%5B%20pattern%20%5D,-%5Cdt%5BS%2B%5D%20%5B)

## 試してみた

まずは使ってみる

```sql
postgres=# \ds
                   リレーション一覧
 スキーマ   |       名前       |   タイプ     |   所有者   
----------+------------------+------------+------------
 public   | employees_id_seq | シーケンス   | daichi
(1 行) 
```

詳細を確認する

```sql
postgres=# \ds+

 スキーマ   |       名前       |   タイプ     |   所有者    | 永続性  |   サイズ    | 説明 
----------+------------------+------------+------------+--------+------------+------
 public   | employees_id_seq | シーケンス   | daichi     | 永続    | 8192 bytes | 
(1 行)
```

## まとめ

シーケンスはロジカルレプリケーションの検証したとき気にしたけどまだいまいち運用で確認する状況がイメージつかない。
【PostgreSQL】メタコマンド〜\dt〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dtとは

> このコマンド群において、`E`、`i`、`m`、`s`、`t`、`v`という文字はそれぞれ、外部テーブル、インデックス、マテリアライズドビュー、シーケンス、テーブル、ビューを表します。 これらの種類のオブジェクトの一覧を表示するために、これらの文字の中の任意の文字またはすべてを任意の順番で指定することができます。 例えば、`\dti`はテーブルとインデックスを列挙します。 `+`がコマンド名に付与された場合、各オブジェクトは、もしあれば永続性の状態(permanent、temporary、またはunlogged)、ディスク上の物理容量、関連する説明をつけて表示されます。 `*pattern*`が指定されている場合は、パターンに名称がマッチする項目のみが表示されます。 デフォルトでは、ユーザが作成したオブジェクトのみが表示されます。 システムオブジェクトを含めるためにはパターンまたは`S`修飾子を付与してください。
> 

[\dtについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=S%2B%5D%20%5B%20pattern%20%5D-,%5Cdt%5BS%2B%5D%20%5B%20pattern%20%5D,-%5Cdv%5BS%2B%5D%20%5B)

## 試してみた

まずは普通に使ってみる

```sql
postgres=# \dt
               リレーション一覧
 スキーマ   |   名前     |  タイプ  |   所有者   
----------+-----------+----------+------------
 public   | employees | テーブル | daichi
 public   | test_tbl  | テーブル | daichi
(2 行)
```

詳細を確認する

```sql
postgres=# \dt+
                                     リレーション一覧
 スキーマ   |   名前    |  タイプ    |   所有者    | 永続性  | アクセスメソッド      | サイズ   | 説明 
----------+-----------+----------+------------+--------+------------------+---------+------
 public   | employees | テーブル  | daichi     | 永続    | heap             | 16 kB   | 
 public   | test_tbl  | テーブル  | daichi     | 永続    | heap             | 0 bytes | 
(2 行)
```

## まとめ

テーブル名をコピペしたい時に多用しています。
SELinuxについて

## SELinux
開発環境なので筆者は設定をオフにしています。
設定を反映するにはリブートが必要です。

#### 現状確認
```console
[root@momonga ~]# getenforce
Permissive
```
#### 設定変更
```console
[root@momonga ~]# vi /etc/selinux/config
```
変更内容
```diff
22c22
< SELINUX=enforcing
---
> SELINUX=disabled
```

#### 設定反映
OS再起動で反映します
```console
[root@momonga ~]# reboot
```

#### 設定確認
```console
[root@momonga ~]# getenforce
Disabled
```

とはいえ、運用で知識が必要になることもあるかもなので
#### SELinuxとは
>Security-Enhanced Linux (SELinux) は、アメリカ国家安全保障局 (NSA) がGPL下で提供している、Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。
[Wikipedia](https://ja.wikipedia.org/wiki/Security-Enhanced_Linux)

#### 監査ログ
```console
[root@momonga ~]# ausearch -m avc
```

#### lsコマンドでファイルのポリシーを表示
ls コマンドの Z オプション(--context)で各ファイルのSELinuxセキュリティコンテキストを表示
```console
[root@momonga ~]# ls -laZ /var/www/html/
total 16
drwxr-xr-x.  2 momonga wheel unconfined_u:object_r:usr_t:s0   77 Jun 20 23:41 .
drwxr-xr-x. 12 momonga wheel unconfined_u:object_r:usr_t:s0 4096 Jul  6 18:00 ..
-rw-r--r--.  1 momonga wheel unconfined_u:object_r:usr_t:s0    0 Jun 20 23:41 favicon.ico
-rw-r--r--.  1 momonga wheel unconfined_u:object_r:usr_t:s0  603 Jun 20 23:41 .htaccess
-rw-r--r--.  1 momonga wheel unconfined_u:object_r:usr_t:s0  468 Jun 20 23:41 index.php
-rw-r--r--.  1 momonga wheel unconfined_u:object_r:usr_t:s0   24 Jun 20 23:41 robots.txt

```

#### /var/www/ 以下のセキュリティポリシー？を確認
```console
[root@momonga ~]# grep -R '/var/www' /etc/selinux/targeted/
/etc/selinux/targeted/contexts/files/file_contexts:/var/www(/.*)?       system_u:object_r:httpd_sys_content_t:s0
```

#### ファイル・フォルダのセキュリティコンテキストの是正
とりあえず、コマンドの紹介だけ
個別に実行する場合: chcon
まとめて実行する場合: restorecon

#### 参考
[SELinux を使おう．使ってくれ．](https://qiita.com/chi9rin/items/af532d0dd9237cc65741)
Goでディレクトリ操作をしてみる

## ディレクトリ作成
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	dirName := "testDir"

	err := os.Mkdir(dirName, 0755)
	if err != nil {
		fmt.Println("Error creating directory:", err)
		return
	}

	fmt.Println("Directory created successfully:", dirName)
}
```

## ディレクトリ作成(再帰)
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	dirName := "dir1/dir2/dir3"

	err := os.MkdirAll(dirName, 0755)
	if err != nil {
		fmt.Println("Error creating directories:", err)
		return
	}

	fmt.Println("Directories created successfully:", dirName)
}
```

## ディレクトリ一覧取得
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	dirName := "."

	files, err := os.ReadDir(dirName)
	if err != nil {
		fmt.Println("Error reading directory:", err)
		return
	}

	for _, file := range files {
		fmt.Println(file.Name())
	}
}
```

## ディレクトリ一覧取得(再帰)
```go
package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	dirName := "."

	err := filepath.Walk(dirName, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		fmt.Println(path)
		return nil
	})
	if err != nil {
		fmt.Println("Error walking through directory:", err)
	}
}
```

## ディレクトリ削除
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	dirName := "testDir"

	err := os.Remove(dirName)
	if err != nil {
		fmt.Println("Error removing directory:", err)
		return
	}

	fmt.Println("Directory removed successfully:", dirName)
}
```

## ディレクトリ削除(再帰)
```go
package main

import (
	"fmt"
	"os"
)

func main() {
	dirName := "dir1"

	err := os.RemoveAll(dirName)
	if err != nil {
		fmt.Println("Error removing directory:", err)
		return
	}

	fmt.Println("Directory removed successfully:", dirName)
}
```
JavaScriptのよく使うメソッド

JavaScriptのよく使うメソッドをまとめていきます。
# 基本文法

### alert()
Window.alert()は、任意のメッセージを含むダイアログを表示し、そのダイアログを閉じるまで待機します。

### console.log()
console.log()メソッドは、メッセージをウェブコンソールに出力します。 このメッセージは単一の文字列（オプションの置換値を含む）であることを示し、1つ以上の JavaScript オブジェクトであることを意味します。

### prompt()
window.prompt()は、ユーザーにテキストを入力するように促すダイアログをオプションのメッセージと共に表示し、ユーザーがテキストを送信するかダイアログをキャンセルするまで待機するようにブラウザーに指示します。

### Number()
Number（数値）の値37や-9.25のような浮動小数点数を指定します。
Numberコンストラクターは、数値を扱うための定数とメソッドを含んでいます。他の型の変数関数Number()を用いてnumを変換することができます。

# データ構造
### push()
配列の末尾に要素を追加します。
また返値として配列の新しい長さを返します。
### pop()
配列から最後の要素を取り除き、その要素を返します。
### unshift()
配列の先頭の要素を追加します。
また返値として配列の新しい長さを返します。
### shift()
配列の先頭の要素を取り除き、その要素を返します。
### forEach()
forEach()メソッドは、与えられた関数を、配列の各要素に対して一度ずつ実行します。


【使用例】
```js
document.querySelectorAll('input').forEach((radio) => {
    if (radio.checked === true) {
        alert(radio.value);
    }
});
```
### filter()
filter()はTypedArray インスタンスのメソッドで、指定された関数で実装されているテストに合格した要素だけにフィルタリングされた、指定された型付き配列の一部のコピーを作成します。

【使用例】
```js
{
  const prices = [100, 150, 200];

  const pricesOver150 = prices.filter((price) => {
    return price >= 150;
  });

  console.log(pricesOver150);
}
```

### join()
join()インスタンスのメソッドArrayでは、配列の全要素を順に連結した新しい文字列を指定します。区切り文字はカンマ、または文字列です。配列にアイテムが一つでもある場合は、区切り文字を使用せずにアイテムが返されます。

### splice()
spliceメソッドとは、配列を表すArrayのメソッドで配列の要素を操作するメソッドです。
以下のような操作が可能です。

* 要素を取り除く
* 置き換える
* 追加する

第1引数は必ず必要です。
操作を開始する配列のインデックスを指定してください。
第1引数の指定のみの場合は、指定したインデックス以降を取り除く動作になります。

第2引数はオプションです。
指定した場合は、指定した数を第1引数で指定した要素以降から取り除きます。

第3引数以降はオプションです。
指定した場合は、その値が配列に追加され、追加する値の数だけ引数を増やすことができます。
# DOM (Document Object Model) 

### querySelector()
Documentのセレクターまたはセレクター群に一致する、文書内の最初のメッセージElementが表示されます。

### querySelectorAll()
DocumentのquerySelectorAll()メソッドは、指定された CSS セレクターに一致する文書中の要素のリストを示す静的なNodeList を返します。
結果にforEach()を使うことができます。

### addEventListener()
EventTargetインターフェイスのメソッドで、ターゲットに特定のイベントが配信されるたびにエクスポートする関数を設定します。

【使用例】
```js
{
  document.querySelector('button').addEventListener('click', () => {
    console.log('Clicked');
  });
}
```
### createElement()
HTML文書において、document.createElement()メソッドはtagNameでHTML要素を生成します。

【使用例】
```js
const liElement = document.createElement('li');
liElement.textContent = 'Hanako';
```
    
### classList.add()
addメソッドを使用した場合、HTMLにはclass属性が追加されます。
classNameで指定されたclassが追加されます。

【使用例】
```js
elements.classList.add('className')
```

### classList.toggle()
element（クラス名をチェックする対象）にクラス名があれば、クラス名を除去し、クラス名がなければ追加します。

### getElementById()
getElementById() は Document インターフェイスのメソッドで、 id プロパティが指定された文字列に一致する要素を表す Element オブジェクトを返します。

【使用例】
```js
getElementById(id)
```

### appendChild()
appendChild()はNodeインターフェイスのメソッドで、指定された親ノードの子ノードリストの末尾にノードを追加します。追加しようとしたノードが既に存在していた場合は、 appendChild() はその子ノードを現在の位置から新しい位置へ移動します。

### insertBefore()
insertBefore()はNodeインターフェイスのメソッドで、参照先ノードの前にこの親ノードの子としてノードを挿入します。

指定されたノードが既に文書中に存在した場合、 insertBefore()はこれを現在の位置から新しい位置に移動します。
ITエンジニア・プログラマが生産性を今の3倍に上げる方法 BEST3

生産性を上げるにはどうすれば良いのか？ 単なる努力ではとても無理そうな気がする。「頑張る」は最悪の対策だ。

アスリート並みの訓練と集中を身につければ良いのだろうか？ 決してそんな高難易度なトレーニングはしたくない。

だが朗報がある。プログラマというものは工夫次第で生産性を伸ばしやすい職業だ。頭脳労働なので肉体的な限界というものがあるわけではないのだ。

そしてここでは「人より3倍生産性があるんじゃないか」と言われる自分のオススメの手段をお伝えする。

# 高スペックなPCを使う

これは本当に効く。

自分もMac Book を Intel チップから Apple シリコンのものに買い換えた時は、その驚異的な速度向上に驚いた。
お金を出せば生産性は上がる。一番手っ取り早い。

時期や状況によってはお金を出しても飛躍的なスペックアップとまでは行かない場合もあるだろうが。

# ヘルスケア全般

運動して、よく眠り、適切なものを食べる。

ひとくちに言うのは簡単だが、ものすごく工夫の余地があるし深い世界だ。

- 歩く時は早足で歩気中程度の運動量を満たす。仕事の休憩としてリフレッシュのために歩く。
- 睡眠時間をたくさんとる。眠りづらい場合は日頃の運動、アルコール断ち、食べ過ぎないこと、カフェイン断ち、サウナ冷水浴、就寝90分前の入浴などで対策する。
- 加工度の低いものを食べる。地中海食的な食事を選ぶ。魚、鶏肉、野菜、ナッツ、果物、全粒粉のものを食べる。
- 疲れる前に休む。作業がラットレース状態になる前にリフレッシュする。
- ホワイトな労働時間を厳守する。やりすぎのラットレースにはまりこむべからず。
- 他、自然と接する、マインドフルネス・瞑想の実践など。


世には様々な書籍が出ているので参考にされたし。



# 人と話す

- 自分でしばらく考えてもよく分からないことは、人に聞いてしまうのが手っ取り早い。
- 要件に関してお客さんと話し、設計についてチームと話し合えば、不要な開発や手戻りを大きく減らせる場合がある。
- 雑談には多くの効用があると思う。たとえば雑談の中からアイデアが閃いたり、コミュニケーションで心理的安全性的なものが高まったりするはずだ。
- 自分個人の生産性だけではなくて、チームの生産性全体が上がれば、それはもっともだ。チームとのコミュニケーションを工夫することで、全体の士気を上げ、アウトプットを底上げすることは可能だろう。( たとえばあなたがチームリーダーであれば、話しにくい雰囲気であるよりも、話しすいやすい雰囲気がある方が、他のメンバーは仕事がしやすいだろう )
開発は常に人との関わりの中にある。

生産性というとつい個人のプログラミングの速さを思い浮かべがちだが、自分の外側にこそ、より大きなレバレッジポイントがある。



# 番外

好きな場所で働く。場所の力は偉大である。
GPTやCopilotなどのAIを使うのは当たり前なので特筆しなかった。



# Note

https://note.com/yumainaura/n/nc5dbb5517a45


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
SARIMA分析とARIMA分析による消費電力量予測




# 概要
消費電力量予測はエネルギー管理と環境政策の策定に欠かせない技術です。この記事では、時系列分析の強力なツールであるSARIMA分析とARIMA分析を用いて、特に長期予測の適用可能性に焦点を当てて解説します。

## キーワード
- SARIMAモデル
- ARIMAモデル
- 消費電力量予測
- 時系列分析
- 長期予測
- データセンター

# SARIMAとARIMAの基礎知識

## ARIMAモデルの基本
「ARIMAモデル」とは、非季節性の時間系列データを分析するためのモデルで、予測精度の高さから多くの産業で利用されています。ARIMAは「自己回帰（Auto-Regressive）」、「積分（Integrated）」、「移動平均（Moving Average）」の三要素を組み合わせてデータの将来値を予測します。

### PythonでのARIMAモデル構築例
```python
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA

# データのロード
data = pd.read_csv('electricity_consumption.csv')
data['Month'] = pd.to_datetime(data['Month'])

# ARIMAモデルの設定とフィット
model = ARIMA(data['Consumption'], order=(1,1,1))
model_fit = model.fit()

# 未来の消費量予測
forecast = model_fit.forecast(steps=12)
print(forecast)
```

## SARIMAモデルの特徴
SARIMAは「季節性自己回帰積分移動平均モデル（Seasonal ARIMA）」で、特定の季節性を持つデータに対して有効です。このモデルは、季節性の変動を考慮することで、より正確な予測を提供します。

### PythonでのSARIMAモデル構築例
```python
from statsmodels.tsa.statespace.sarimax import SARIMAX

# モデルの設定
model = SARIMAX(data['Consumption'], order=(1,1,1), seasonal_order=(1,1,1,12))
model_fit = model.fit()

# 消費量の予測
forecast = model_fit.forecast(steps=12)
print(forecast)
```

# 消費電力量予測への応用

## 長期予測のためのモデル選択
10年間という長期予測においては、季節パターンを考慮できるSARIMAモデルが特に有効です。これにより、夏季の冷房や冬季の暖房需要など、季節ごとの消費電力量の変動を正確に予測することが可能となります。
[RDS]突然リブートされた事件

# 空きメモリ枯渇のためRDSがリブートされました

突如サービスアラートがなり、調査していたらRDSイベントを確認したところ、
再起動イベントが発生していました。

原因としては空きメモリが枯渇したことによって発生していたのですが、
同じような被害者がでないためにも記事に残しておきます。

## なぜ再起動される前に予兆に気づけなかったのか

- 空きメモリの監視設定をしていなかった

CPUや接続数の監視はしていました。
接続数の制限もデフォルトではメモリ量によってい定まることは認識していましたが、  
空きメモリの監視設定を失念していました。

再起動が走る直前一時的に空きメモリが1GB以下になっていましたが、
1GB以下〜10GBの間で変動していたため、一旦3GB以下かつ
データポイントは1回にしています。

現状この設定にしてからアラートは検知していません。

## なぜ空きメモリが枯渇したのか

これは再起動される前に検知することができれば
拡張モニタリングの内容とパフォーマンスインサイトの情報を
付き合わせながら分析することができたかもしれません。

再起動が走ってしまったことで根本原因をおうことが
難しくなってしまいました。

現状の推測として特定のトランザクション処理が
ゾンビプロセスのように残ってしまい、
メモリを逼迫させてしまったのではないかと考えています。

当時拡張モニタリングを有効にしていなかったため
有効化の対応も行なっています。

拡張モニタリングを有効化するとAWSサポートの
調査もスムーズに進むそうです。

## イベント監視

再起動や他イベントが発生した場合の
調査にかかるリードタイム短縮のためにも
RDSのイベント監視も実装しています。

## まとめ

まだRDSの拡張モニタリング有効化および
アラート設定してない方は設定しておくことをお勧めします。

アラートとする対象メトリクスはCloudwatchのダッシュボードの
推奨を参考に設定するのが良さそうです。

参考: アラート推奨確認方法
https://dev.classmethod.jp/articles/cloudwatch-alarm-recommendations/
【ChatGPT＋Code Interpreter】動画の効果音を作りたい。


　どうも、カーブミラーです。

　今回は、動画に効果音を付けたい。どうしたら？という内容です。残念ながら、Qiitaに音声ファイルをアップできませんでした😅

:::note info
本記事は、ChatGPT（有料版）
で行なっております。あしからず。
:::

　今日（2024/07/07）は、
　　災害級の暑さだそうです。
　　　あっ、東京の話ですが😅

　屋外作業はおすすめできません。
　　とはいえ、現場仕事は
　　　そうも言っていられませんね。

　栄養と水分を摂って、
　　身体も休ませながら、
　　　生活していってください。

　無理しても
　　いいことありませんからね。
***
　さて、本題です。

　昨日（2024/07/06）は
　　Code Interpreterで
　　　音を作成できるライブラリが
　　　　あるのか確認しました。

　今回は、実際に作ってみました。
　　あっ、期待しないでくださいね。
　　　ビープ音を鳴らす程度なので😅

***
***user***
効果音を作りたいです。
方法を教えてください。
コードは必要ありません。

***ChatGPT***
効果音を作成するには、以下の手順を参考にしてください。ここでは、Pythonのライブラリを使用してシンプルな効果音を生成する方法を説明します。

### 必要なライブラリ
1. **numpy**：数値計算ライブラリ
2. **scipy**：信号処理や基本的な音声操作
3. **soundfile**：音声ファイルの読み書き
4. **pydub**（必要に応じて）：音声の操作やエフェクト

### 効果音作成の基本的な手順
1. **音波形の生成**：
   - 効果音の基本的な波形（正弦波、方形波、三角波など）を生成します。
   - これには、numpyを使用して時間配列を作成し、それに基づいて波形データを生成します。

2. **エフェクトの追加**：
   - 音量変化、フェードイン・フェードアウト、エコーなどのエフェクトを追加します。
   - numpyとscipyを使用して、これらのエフェクトを波形データに適用します。

3. **音声ファイルとして保存**：
   - 生成した波形データを音声ファイル（WAVなど）として保存します。
   - soundfileライブラリを使用して、波形データをファイルに書き出します。

### 具体的な効果音の例
- **ビープ音**：
  - 周波数と持続時間を指定して正弦波を生成します。
- **ホワイトノイズ**：
  - ランダムなノイズを生成し、必要に応じてフィルタリングします。
- **エコー付きサウンド**：
  - 基本的な音波に遅延を追加してエコー効果を作成します。

### 詳細な手順
1. **音波形の生成**：
   - numpyを使って時間配列を作成します。
   - 正弦波を生成する場合、周波数と時間に基づいて波形を計算します。

2. **エフェクトの追加**：
   - フェードイン・フェードアウト：音量を徐々に増加または減少させるために、波形データを適用します。
   - エコー：元の音に遅延を追加し、減衰させたコピーを重ねます。

3. **音声ファイルとして保存**：
   - soundfileを使用して、波形データをWAVファイルとして書き出します。

### まとめ
これらの手順を通じて、効果音を生成し、保存することができます。各ライブラリの公式ドキュメントを参考にしながら、具体的な音を作成するための詳細なコーディングを行ってください。これにより、独自の効果音を簡単に作成することができます。
***

　なんとなく、
　　できるのではないか、と期待。

　ここから
　　いろいろと
　　　実験しました。

　成功例がこちら。
***
***user***
CodeInterpreterを使って、音声を作成してください。内容はドレミファソラシド。長さは、5秒でお願いします。

***ChatGPT***
音声ファイル「ドレミファソラシド」を作成しました。こちらのリンクからダウンロードできます:

[ドレミファソラシド音声ファイル]

***user***
これにはどのライブラリを使用しましたか？

***ChatGPT***
この音声ファイルの作成には、以下のPythonライブラリを使用しました：

1. **NumPy**：数値計算ライブラリ。音声信号の生成に使用しました。
2. **SciPy**：科学技術計算ライブラリ。具体的には、`scipy.io.wavfile`モジュールを使用して、生成した音声信号をWAVファイルとして保存しました。

これらのライブラリを使うことで、音階の周波数に基づいた音声信号を生成し、それをWAV形式で保存することができました。

***user***
CodeInterpreterを使って、曲を作成してください。内容は和音を使ったメロディー。長さは、5秒でお願いします。

***ChatGPT***
和音を使ったメロディーを作成しました。こちらのリンクからダウンロードできます:

[和音メロディー音声ファイル]

***user***
このメロディーは、どんな内容なのですか？

***ChatGPT***
このメロディーは、以下の順番で和音を演奏したものです。それぞれの和音は約1.25秒の長さで、合計5秒の長さになります。

1. **C Major (ド・ミ・ソ)**: 261.63 Hz, 329.63 Hz, 392.00 Hz
2. **G Major (ソ・シ・レ)**: 196.00 Hz, 246.94 Hz, 392.00 Hz
3. **A Minor (ラ・ド・ミ)**: 220.00 Hz, 261.63 Hz, 329.63 Hz
4. **F Major (ファ・ラ・ド)**: 174.61 Hz, 220.00 Hz, 261.63 Hz

これらの和音が連続して演奏されることで、簡単なメロディーを構成しています。
***

　出来上がったのは
　　ビープ音でした😅

　このあと、
　　ゲームキャラが
　　　ピコピコ動いている音を
　　　　依頼しました。

　作成されたのが
　　なぜか救急車のサイレンでした😅

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
エモーショナルなdateコマンドを作ろう！

# はじめに
Linuxで作業をする際、`date`コマンドってよく使いますよね。

```bash
$ date
2024年 7月 7日 日曜日 11時23分54秒 JST
```

必要最低限の表示で便利なんですが、無機質だと思ったことはありませんか？

時間というものは、単なる数字の並びではありません。
月や日付、曜日などによって、あなた自身が持つ感情というものがあるはずです。

そこで今回は、そんな **あなたの感情を映し出す、世界でたった一つのコマンド「emotional_date」** を作ってみましょう！

# emotional_date: 時を彩る魔法のコマンド

`emotional_date` は、単なる時刻表示にとどまりません。
時間帯や曜日に合わせて、出力結果が変化する、まさに **生きた時計** となるでしょう。

### 実装例

今回は、シェルスクリプトを使って `emotional_date` を実装してみましょう。

```shell
#!/bin/bash

# あなたの好きな絵文字を設定
morning_emoji="☀️"
daytime_emoji="💪"
evening_emoji="🌙"
night_emoji="😴"

# 曜日ごとのメッセージを設定
mon_message="月曜日は新たな挑戦の日！ 💪"
tue_message="火曜日も着実に前進！ 🚀"
wed_message="週の真ん中水曜日、一息つこう☕"
thu_message="木曜日、週末はもうすぐそこ！ 🎉"
fri_message="華金だ！ 🍻"
sat_message="楽しい週末の始まり！ 🥳"
sun_message="ゆっくり休んでリフレッシュ！ 🛀"

year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
hour=$(date +%H)
minute=$(date +%M)
second=$(date +%S)

weekday=$(date +%a)

# 時間帯に応じた絵文字を設定
if [ $hour -ge 6 -a $hour -lt 12 ]; then
  emoji=$morning_emoji
elif [ $hour -ge 12 -a $hour -lt 18 ]; then
  emoji=$daytime_emoji
elif [ $hour -ge 18 -a $hour -lt 22 ]; then
  emoji=$evening_emoji
else
  emoji=$night_emoji
fi

# 曜日ごとのメッセージを取得
case $weekday in
  "月") message=$mon_message ;;
  "火") message=$tue_message ;;
  "水") message=$wed_message ;;
  "木") message=$thu_message ;;
  "金") message=$fri_message ;;
  "土") message=$sat_message ;;
  "日") message=$sun_message ;;
  *) message="今日も一日頑張ろう！" ;;
esac

# 時刻、絵文字、曜日メッセージを表示
echo "${emoji} ${year}年${month}月${day}日 ${hour}時${minute}分${second}秒 ${message}"
```

実行結果
```
$ sh emotional_date.sh 
☀️ 2024年07月07日 11時52分30秒 ゆっくり休んでリフレッシュ！ 🛀
```

### カスタマイズのススメ

`emotional_date` の真髄は、 **あなただけのオリジナル時計を作れる** ところにあります。上記スクリプトを自由に編集して、あなただけの `emotional_date` を完成させましょう！

-  **絵文字変更:** 各時間帯に表示する絵文字を、あなたの気分に合うものに変更できます。
- **メッセージ追加:** 曜日ごとに表示するメッセージを、あなたを励ます言葉や、週末の予定など、自由に設定できます。
- **天気予報の表示:** 天気予報APIを取得して、現在の天気と気温を表示するように改造することも可能です。
- **目標までのカウントダウン:** 次回リリース日や大切なイベントまでの日数を表示して、モチベーションを高めることもできます。

### まとめ

`emotional_date` は、時間という概念に、あなたの感情という彩りを加える、まさに魔法のコマンドです。

さあ、あなたもこのコマンドをカスタマイズ、dateコマンドを、より豊かでエモーショナルなものに変えてみましょう！
paiza.ioでelixir その294

# 概要
paiza.ioでelixirやってみた。
高位合成、やってみた。
練習問題やってみた。
構想編。

# 練習問題
俺言語で8bitシフトレジスタを実現せよ。

# 俺言語拡張仕様
変数をa,b,c,d,e,f,g,hに増やす。

# 8bitシフトレジスタな、俺言語コード
o, pは、入力でスイッチがつながってる。
oは、データ。
pは、クロック。
xは、出力でLEDがつながってる。
oがonになり, クロックが、８個目なら、点灯する。


```
10 x=0
20 a=o
30 #=p@1*50
40 #=20
50 x=h
60 h=g
70 g=f
80 f=e
90 e=d
100 d=c
110 c=b
120 b=a
130 #=p@0*20
140 #=130
```


以上。
MacOS、スクリーンショットの設定

<!--
2024/07/07
-->
## MacOS、スクリーンショットの設定
毎回設定するので、メモ
- 保存場所の変更
  - Command + shift + 5
  - option menu
  - 保存場所変更
- 保存ファイル名の変更
    ```sh
    defaults write com.apple.screencapture name "screenshot"
    defaults write com.apple.screencapture include-date -bool false
    ```
- ファイル形式の変更
    ```sh
    defaults write com.apple.screencapture type jpg
    ```
- 日付に戻す
    ```sh
    defaults delete com.apple.screencapture include-date
    ```
    
## 参考サイト
https://tcd-theme.com/2020/12/screen-shots-rename.html

## 追加の設定
- スクリーンショット時の画像プレビューを無効にする方法
    ```sh
    defaults write com.apple.screencapture show-thumbnail -bool false
    killall SystemUIServer
    ```
- ショートカットキーを変更する方法
  - システム環境設定 > キーボード > キーボードショートカット
  - 左側のリストから「スクリーンショット」を選択
  - 「画面全体のスクリーンショットを取得」を選択し、現在のショートカット（⌘ + Shift + 3）をクリック
  - キーボードで新しいショートカットキー「⌘ + 3」を入力