OmniAICreator/Qiita-1.07M huggingface dataset:
Windows PowerShell スクリプトで AWS 上の Linux 環境に SSM 接続

# はじめに
* Windows PowerShell スクリプトと AWS CLI 使用して、ワンクリックで以下を実現します
    * Namet タグ元に、対象 EC2 インスタンスを起動
    * EC2 起動中は待機（10秒ごとに確認）
    * 起動ステータスが 2/2 となったら、Session Manager 経由でログイン
# 前提
* 作業端末：Windows 10 Pro（他のバージョンでも大丈夫なはず）
* 接続先：Linux環境

# スクリプト
下記スクリプトを ps1 ファイルとして保存し、PowerShell で実行します。
```
## 初期設定
${profile} = "プロファイル名を指定"
${InstanceName} = "接続先 EC2 インスタンスの Name タグを指定"

## 指定インスタンスID取得
${InstanceId} = aws ec2 describe-instances `
    --profile ${profile} `
    --filter "Name=tag:Name,Values=${InstanceName}" `
    --query "Reservations[].Instances[].InstanceId" `
    --output text

## 指定インスタンス起動
aws ec2 start-instances `
    --profile ${profile} `
    --instance-ids ${InstanceId} > $null

Write-Host "Start Instances:" ${InstanceName} "/" ${InstanceId}

## 起動確認
do {
    Write-Host "checking status..."
    Start-Sleep -s 10
    ${SystemStatus} = aws ec2 describe-instance-status `
        --profile ${profile} `
        --instance-ids ${InstanceId} `
        --query "InstanceStatuses[].SystemStatus.Details[].Status" `
        --output text
    ${InstanceStatus} = aws ec2 describe-instance-status `
        --profile ${profile} `
        --instance-ids ${InstanceId} `
        --query "InstanceStatuses[].InstanceStatus.Details[].Status" `
        --output text
    Write-Host "  SystemStatus  :" ${SystemStatus}
    Write-Host "  InstanceStatus:" ${InstanceStatus}
} while ( (${InstanceStatus} -eq "initializing") -or (${SystemStatus} -eq "initializing") )

## 画面初期化
clear

## SSMで接続
aws ssm start-session `
    --profile ${profile} `
    --target ${InstanceId}
```
Attempted to load @next/swc-win32-ia32-msvc, but an error occurred: A dynamic link library (DLL) initialization routine failed.

## 何のエラー？

32bit版win用のNodeを64bit版winで稼動させようとすると起こるエラー．

## やること
1. 32bit版Nodeをアンインストール
    C:\Program Files (x86)\Nodejs のディレクトリを削除
    注意：ディレクトリの削除は不可逆な可能性があるので注意してください

2. Nodeを再インストール
    https://nodejs.org/en/download
    64bit版であることを確認してインストール
【Go言語】コマンド１つでGoのプロジェクトを作る

## 前置き

Goのプログラムを動かすために必要な動作は以下の4つです。他の言語であればいろいろと省ける部分がありますがGoはこのように動作が多いです。

cdなどを加えると打ち込むコマンドの数はそこそこ多くなるので大変です。

1. ディレクトリの作成
2. go mod init
3. main.goを作成
4. main.goにpackageとmain関数を用意する

## 便利にする

これらを1つのコマンドで実行できるようにすると便利です。そこで以下のような関数を用意しましょう。

```bash
function gomake() {
  rand=go-test-$(openssl rand -hex 2)
  mkdir $rand
  cd $rand
  go mod init test
  touch main.go
  echo "package main

func main(){}
  " > main.go
  code .
}
```

これを`.bashrc`や`.zshrc`などに追記しておくと、`gomake`というコマンドでGoのプロジェクトを作成できるようになります。

具体的にこの関数が行っていることを説明します。

まずはじめにランダムなディレクトリ名を作成します。これはGoのプロジェクトを作成するたびにディレクトリ名が被らないようにするためです。`openssl`コマンドを用いてランダムな文字列を生成しています。

```bash
rand=go-test-$(openssl rand -hex 2)
mkdir $rand
cd $rand
```

次に、この部分では`go mod init`コマンドを実行して初期化を行ったあと、`main.go`を作成し、そこに`package main`と`main`関数を書き込んでいます。

```bash
go mod init test
  touch main.go
  echo "package main

func main(){}
  " > main.go
```

これはすぐに作業ができるようにVScodeエディタを開くコマンドです。コマンドがない人はVScodeのコマンドパレットから`Shell Command: Install 'code' command in PATH`を実行すうことで`code`コマンドが使えるようになります。

```bash
code .
```

このようにすることで簡単にGoのプロジェクトを作成できるようになります。
![スクリーンショット 2023-12-23 12.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655718/d0dc8b32-9605-1d84-7adf-a54531b4f41a.png)
【PowerShell】処理時間を測定する

# はじめに

PowerShellで作ったスクリプトのパフォーマンスの尺度として、処理時間の測定方法を調べた結果を記事としてまとめてみました。

# 学習環境
今回はコマンドプロンプトとVS Codeを使いました。

# コマンドプロンプト（DOS）を使う方法

* PowerShellで処理時間を求める前に、比較対象としてコマンドプロンプトを使う方法をまとめておきます。
* コマンドプロンプトだと`time`を使って現在の時刻を求めますが、以下のように開始時間と終了時間から自力で処理時間を求めることになります。

```dosbatch:processing_time.bat
set start_time=%time%
rem pingをsleepの代わりに利用
Ping -n 3 localhost > null
set end_time=%time%

echo %start_time%
echo %end_time%
```

```text:実行結果
11:58:14.16
11:58:16.21
```

# PowerShellを使う方法

* PowerShellでは`Measure-Command`関数を使って処理時間を求めます。
* [スクリプトブロック](https://qiita.com/nkojima/items/5ecc29435cc5b6621520)を使うことで簡単に処理時間を求めることができますが、「日」「時」「分」「秒」「ミリ秒」のそれぞれの単位での結果が混在していて、これだと見づらいですね...

```processing_time.ps1
Measure-Command {
    Start-Sleep -Seconds 3
}
```

```text:実行結果
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 3
Milliseconds      : 12
Ticks             : 30121641
TotalDays         : 3.48630104166667E-05        
TotalHours        : 0.00083671225
TotalMinutes      : 0.050202735
TotalSeconds      : 3.0121641
TotalMilliseconds : 3012.1641
```

* そこで以下のように修正してみると、欲しかった「秒単位の処理時間」だけを求めることができました。
  * コマンドプロンプトの`time`を使うよりも、これなら圧倒的に楽でスッキリ書けますね。
* 戻り値は`TimeSpan`構造体で、この構造体のプロパティの扱いには注意が必要です。
  * `Seconds`は **「日/時/分/秒/ミリ秒で表現した時の秒部分の値」** で、処理時間が70秒の時は「69」などとなります。
  * `TotalSeconds`は **「処理時間を秒で表現した値（小数部含む）」** で、処理時間が70秒の時は「69.9977058」などとなります。

```processing_time2.ps1
$prcessing_time = Measure-Command {
    Start-Sleep -Seconds 3
}

Write-Host "$($prcessing_time.TotalSeconds) seconds"
```

```text:実行結果2
3.0008739 seconds
```

# 参考URL

* [Measure-Command - Microsoft Learn](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/measure-command?view=powershell-7.4)
* [TimeSpan 構造体](https://learn.microsoft.com/ja-jp/dotnet/api/system.timespan?view=net-8.0)
* [time - 時刻の設定・表示をする](https://www.k-tanaka.net/cmd/time.php)
* [【PowerShell】スクリプトブロックを利用する](https://qiita.com/nkojima/items/5ecc29435cc5b6621520)
システム管理者のためのnsswitch.confガイド

# システム管理者のためのnsswitch.confガイド

システム管理の世界では、効率的でセキュリティが確保された情報アクセス方法の定義は極めて重要です。UNIXやLinuxシステムでは、この重要な役割を担っているのが`nsswitch.conf`です。この記事では、`nsswitch.conf`の基本、それが使用されるユースケース、処理フロー、および特定のサービスの統合について詳しく解説します。

## nsswitch.confとは何か？

`nsswitch.conf`は、システムがユーザー情報、グループ情報、ホスト名などの重要なデータをどこから取得するかを決定する設定ファイルです。このファイルは、システムが情報を検索する順序とソースを定義し、ローカルファイルシステムからネットワークベースのディレクトリサービスまで、様々な情報源を柔軟に指定することができます。

## どんなユースケースで使用されるのか？

`nsswitch.conf`は以下のような様々なシナリオで役立ちます：

- **ローカルとリモートのユーザー管理**：中央集権型ディレクトリサービス（LDAPやActive Directoryなど）からユーザー情報を取得。
- **ネットワーク上のホスト名解決**：`/etc/hosts`やDNSなど、複数のソースからホスト名を解決。
- **サービスの切り替えとフォールバックメカニズム**：主要サービスのダウン時に代替サービスへのスムーズな切り替えをサポート。
- **セキュリティとパフォーマンスの最適化**：不要なソースの排除や、特定のサービスへの問い合わせ順序の調整。

## nsswitch.confの処理フロー

`nsswitch.conf`の処理フローは、以下のステップに従います：

1. **リクエストの識別**：システムが必要とする情報タイプを特定。
2. **サービスの設定の読み込み**：データ検索のためのソースと順序を定義。
3. **順序に従った検索**：指定された順序でサービスを使用してデータを検索。
4. **条件に基づく処理**：各サービスの結果に基づく次のステップの決定。
5. **最終結果の返却**：検索プロセスの完了と結果の提供。

## Active Directoryとの統合

Active Directoryを使用する場合、`nsswitch.conf`は通常、SSSDやWinbindのような専門的なサービスと連携します。これらのサービスはADサーバーと通信し、ユーザーやグループ情報を取得します。処理フローは、ローカルファイルの検索から始まり、必要に応じてADに問い合わせ、最終的には適切な情報が提供されます。

## 検索時のローカルファイルとは？

システムが`files`サービスを使用している場合、`/etc/passwd`や`/etc/hosts`のようなローカルファイルを最初に検索します。これらのファイルはシンプルで信頼性が高く、ネットワークに依存しないため、特に小規模な環境や初期のデータ検索に適しています。

## サービス
`nsswitch.conf`で言及される「サービス」とは、主にシステムが名前解決やユーザー情報の取得などの特定のタスクを実行するために利用するデータソースやメカニズムを指します。これらはデーモンのような常駐プロセスであることも、単純なファイルベースの機構であることもあります。ここでの「サービス」には以下のようなものが含まれます：

### ファイルベースのサービス
- **files**: これはローカルのシステムファイル（例：`/etc/passwd`, `/etc/hosts`など）を指します。これらはデーモンではなく、単純なテキストファイルですが、ユーザー情報やホスト名解決に使用されます。

### ネットワークベースのサービス
- **dns**: ドメインネームシステム（DNS）を指し、通常はネットワーク上のデーモンを介してホスト名をIPアドレスに解決します。
- **ldap**: 軽量ディレクトリアクセスプロトコル（LDAP）を指し、通常はネットワーク上のLDAPサーバーに問い合わせを行います。
- **nis**: ネットワーク情報サービス（NIS）を指し、分散型ディレクトリサービスを提供するために使用されます。

### 専門的なサービスまたはデーモン
- **sss**: System Security Services Daemon（SSSD）を指し、主にActive DirectoryやLDAPなどの認証サービスと連携して使用されます。
- **winbind**: Sambaスイートの一部として提供され、Windowsネットワーク（特にActive Directory）との統合を可能にします。

これらのサービスは、システムが特定の情報を必要とするときに参照され、それぞれが特定のタイプのデータソースを表しています。ファイルベースのサービスは通常、内部の静的ファイルを参照するだけですが、ネットワークベースのサービスや専門的なサービスは、デーモンや外部プロセスとの通信を伴うことが多いです。各サービスは異なるプロトコルやメカニズムを使用してデータを取得し、`nsswitch.conf`によって定義された順序と優先順位に従って処理が行われます。

## まとめ

`nsswitch.conf`は、システム管理者がシステムの名前解決と情報アクセスの動作を柔軟に制御できる強力なツールです。ローカルファイルからネットワークベースのサービスまで、さまざまな情報源を組み合わせて使用することで、効率的でセキュアな環境を実現できます。適切な設定と理解により、`nsswitch.conf`はシステムの柔軟性とパフォーマンスを大幅に向上させることができます。
Bitbucket Pipelinesで環境ごとの設定

## この記事について
この記事はBitbucket pipelineのymlの設定の中で、環境ごとに自動デプロイする仕組みを解説しています。
今回はReactアプリを使用してs3にアップロードします。

## 前提条件
* 前提条件としてS3にバケットが存在すること
* Bitbucketにリポジトリーが存在すること


## Bitbucketのリポジトリの設定
### パイプラインの有効化
まずはデプロイ対象のリポジトリの「Repository Setting」 → 「設定」の中にチェックがあるので押して有効にします。
有効にすると「このリポジトリはパイプラインを利用する」という設定が完了します。

![スクリーンショット 2023-12-21 11.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338345/909243e6-9207-21d4-efb4-ccc9c8d8874e.png)



## クレデンシャルの設定
次に環境ごとのクレデンシャルの設定を行います。
下記3つの環境に分けてs3のクレデンシャル情報を設定しています。
※環境ごとのs3のバケットが必要です。

* 今回設定した環境
Test : テスト環境
Stagings：ステージング環境
Production：本番環境

![スクリーンショット 2023-12-21 11.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338345/d280ab33-8fa9-8c26-24d1-e8cbfeb3a7af.png)

* Test環境のクレデンシャルの例
環境ごとのクレデンシャル情報を設定しておく。
![スクリーンショット 2023-12-23 11.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338345/3316ece4-a9b8-f774-192c-d0f344fb9adc.png)



## bitbucket-pipelines.ymlの設定
ルートディレクトリ直下にbitbucket-pipelines.ymlを作成。
以下はnode.jsを使用した設定例です。
```
image: node:16.15.1

pipelines: 
  branches: 
    develop:
      - step:
          deployment: staging
          name: "Deploy to staging"
          script:
            - yarn install
            - yarn run build
            - aws s3 sync build/ s3://$S3_BUCKET --delete

    master:
      - step:
          deployment: production
          name: "Deploy to Production"
          script:
            - yarn install
            - yarn run build
            - aws s3 sync build/ s3://$S3_BUCKET --delete
  custom:
    feature/*:
      - step:
          deployment: Test
          name: "Deploy to Test"
          script:
            - yarn install
            - yarn run build
            - aws s3 sync build/ s3://$S3_BUCKET --delete
```

順に解説していきます。
* 「branches」の中でブランチ（デプロイしたい環境）ごとにstepを分けていきます。
ここでは「develop」「master」「feature/*」で分けていて、対象ブランチをpushまたはマージのタイミングでstepの処理が走ります。
* 「deployment: staging」 ← は先ほどBitbucketに設定した環境名を書いてあげれば（この例ではstaging）クレデンシャル情報を参照します。環境名を書くだけで値を参照してくれるので処理が簡潔になります。
* 「script：」 ←　ビルドコマンドとs3にビルドファイルをアップロードするコマンドを書いて終了です。

## まとめ
node.jsでのymlの設定をメインに書きましたが、他の言語でも同じように設定することができるのでCI/CDについて触れてみたい方は参考にしてください。
バッファオーバーフロー脆弱性: 深刻なセキュリティの脅威

# バッファオーバーフロー脆弱性: 深刻なセキュリティの脅威

バッファオーバーフローは、不適切な入力検証が原因で発生する一般的なセキュリティ問題です。プログラムがバッファ（一時データを保持するメモリ領域）に予定されている容量を超えてデータを書き込むときにこの問題が発生します。これにより、不正なデータが隣接するメモリ領域に書き込まれ、プログラムの実行フローを変更し、悪意のあるコードの実行を可能にすることがあります。

## メモリとバッファの関係性 
プログラム実行時、メモリはデータとコードを保持します。バッファはその一部であり、ユーザーからの入力などを一時的に保存します。しかし、バッファには限られた容量があり、この限界を超える入力が書き込まれた場合、隣接するメモリ領域に影響を及ぼす可能性があります。

## 攻撃のメカニズム
攻撃者はバッファオーバーフローを利用してプログラムのリターンアドレスを上書きし、悪意のあるコードを実行します。これにより、システムの制御を奪い、データを盗み出す、不正な操作を行うなどの行動が可能になります。

## 有名なバッファオーバーフロー事件
- **Morris Worm (1988)**: 最初の大規模なワーム攻撃で、UNIXシステムのバッファオーバーフロー脆弱性を悪用しました。
- **Code Red Worm (2001)**: Microsoft IIS Webサーバーの脆弱性を悪用し、インターネット全体に著しい影響を及ぼしました。
- **Slammer Worm (2003)**: 数分で世界中に広がったワームで、インターネットの速度を大幅に低下させました。
- **Stack Clash (2017)**: 複数のOSに影響を及ぼし、攻撃者がシステムを完全に制御することを可能にしました。

## 防御策
バッファオーバーフローを防ぐには、プログラムがデータをバッファに書き込む前にサイズをチェックし、セキュリティ強化されたプログラミング言語の使用、オペレーティングシステムやコンパイラの保護機能を活用することが重要です。また、定期的なセキュリティ評価とアップデートも不可欠です。

## 言語ごとの対応
各プログラミング言語とフレームワークはバッファオーバーフローを防ぐために独自の対策を提供しています。以下に、Ruby, PHP, Python, Javaなどの言語で一般的に採用されている対策を紹介します。

### Ruby
- **安全なAPIの利用**: Rubyは、多くの場合、メモリ管理を内部的に行い、開発者がバッファのサイズを直接管理することは稀です。例えば、文字列操作はRubyの安全なメソッドを使用して行われます。
- **taint機構**: オブジェクトが外部からの入力で汚染されているかどうかを追跡し、危険な操作を実行する前にチェックします。

### PHP
- **自動的なメモリ管理**: PHPはメモリを自動的に管理し、多くの標準関数が内部でバッファサイズをチェックしてオーバーフローを防ぎます。
- **エラーレポーティング**: 開発時には全てのエラーを報告する設定にすることで、潜在的な問題を早期に発見できます。

### Python
- **高レベルの抽象化**: Pythonもメモリ管理を抽象化し、開発者が直接バッファにアクセスすることはほとんどありません。Pythonの標準ライブラリは安全に使用できるように設計されています。
- **第三者ライブラリ**: 例えば`NumPy`などのライブラリは、内部的なエラーチェックを提供してバッファオーバーフローを防ぎます。

### Java
- **自動ガベージコレクション**: Javaは自動メモリ管理とガベージコレクションを提供し、メモリの安全性を高めます。
- **例外処理**: Javaでは、バッファサイズを超えるアクセスが試みられた場合、`ArrayIndexOutOfBoundsException`などの例外が投げられます。適切な例外処理により、エラーが発生した際の適切な対応を行えます。

### 一般的なベストプラクティス
- **入力検証**: すべての入力データを検証し、予期しない形式やサイズのデータを拒否します。
- **コードレビューと静的解析**: コードレビューと静的解析ツールを使用して、潜在的な脆弱性を早期に検出します。
- **最新の状態を保つ**: ライブラリやフレームワークは定期的に更新され、セキュリティ修正が行われることが多いです。常に最新の状態を保つことが重要です。

バッファオーバーフローは、長年にわたり多くのセキュリティ侵害の原因となってきました。この脆弱性によって明らかになるのは、セキュリティは設計段階から組み込む必要があり、継続的な注意と対策が求められるという事実です。教訓を生かし、より安全なシステムとアプリケーションを開発することが、私たちの共通の目標でなければなりません。
C - Repunit Trio を Elixir で解いた〜トヨタ自動車プログラミングコンテスト2023#8（AtCoder Beginner Contest 333）

トヨタ自動車プログラミングコンテスト2023#8（AtCoder Beginner Contest 333）の C - Repunit Trio をElixirで解いたので報告します．

## 問題

https://atcoder.jp/contests/abc333/tasks/abc333_c

## 解答例

https://atcoder.jp/contests/abc333/submissions/48721661

```elixir
defmodule Main do
  def main() do
    n =
      IO.read(:line)
      |> String.trim()
      |> String.to_integer()

    Stream.unfold([1], fn a ->
      l =
        for p <- a, q <- a, r <- a  do
          p + q + r
        end
        |> Enum.uniq()
        |> Enum.sort()
     
      {l, [hd(a) * 10 + 1 | a]}
    end)
    |> Stream.drop_while(fn l -> Enum.count(l) < n end)
    |> Enum.take(1)
    |> List.flatten()
    |> Enum.at(n - 1)
    |> IO.puts()
  end
end
```

## 解説

まず，Repunit(レピュニット)の次の値を計算する関数を考えます．それは`fn a -> a * 10 + 1 end`です．こうすると，初期値`1`から始めて，`11`→`111`のようになります．

次に，Repunitを降順に並べたリストを生成する関数を考えます．それは，`fn a -> [hd(a) * 10 + 1 | a] end`です．こうすると，初期値`[1]`から始めて，`[11, 1]`→`[111, 11, 1]`のようになります．

次に，Repunitを降順に並べたリスト`a`が与えられているときに，組み合わせを生成して和を求め，値が等しい要素を1つに絞って，整列するという処理は，次のように書けます．

```elixir
for p <- a, q <- a, r <- a  do
  p + q + r
end
|> Enum.uniq()
|> Enum.sort()
```

`Stream.unfold`を用いて，Repunitを降順に並べたリストを無限に生成してみましょう．

```elixir
Stream.unfold([1], fn a ->
  l =
    for p <- a, q <- a, r <- a  do
      p + q + r
    end
    |> Enum.uniq()
    |> Enum.sort()
     
  {l, [hd(a) * 10 + 1 | a]}
end)
```

試しに`Enum.take`を用いて取り出してみると，期待通りになります．

```elixir
Stream.unfold([1], fn a ->
  l =
    for p <- a, q <- a, r <- a  do
      p + q + r
    end
    |> Enum.uniq()
    |> Enum.sort()
     
  {l, [hd(a) * 10 + 1 | a]}
end)
|> Enum.take(3)
```

結果は`[[3], [3, 13, 23, 33], [3, 13, 23, 33, 113, 123, 133, 223, 233, 333]]`となります．

次のようにして要素数が`n`以上になった最初の要素を取り出します．

```elixir
Stream.unfold([1], fn a ->
  l =
    for p <- a, q <- a, r <- a  do
      p + q + r
    end
    |> Enum.uniq()
    |> Enum.sort()
     
  {l, [hd(a) * 10 + 1 | a]}
end)
|> Stream.drop_while(fn l -> Enum.count(l) < n end)
|> Enum.take(1)
|> List.flatten()
```

あとは，`Enum.at`で，`n`番目の要素を取り出します．
WEBサーバの構築メモ2023

# WEBサーバの構築

[前回の続き](https://qiita.com/aqua0906/items/3116b563890af27fd262)
というわけで、今回はWebサーバをnginxとして、PHPを使えるようにし、SSL通信ができるようにしていきます。


### nginxとphp-fpmを連携

apacheではmodule/cgiがあり、CGIはリクエストごとにプロセス生成されて起動に時間かかったりするので、
moduleを使っていた。
apacheのモジュールも1リクエストごとのメモリ使用量も大きくなり大量リクエストを捌くにはリソース消費が激しい。
軽量にうごかせられるように、サーバ上で、PHPをAPサーバとして起動させてWEBサーバとPHPのAPサーバ間で連携させて動かすことでプロセスを分離して効率化するようなイメージなのかな。

[FastCGI(wikipedia)](https://ja.wikipedia.org/wiki/FastCGI)

[PHPマニュアル](https://www.php.net/manual/ja/install.unix.nginx.php)を参考にしてnginxとPHP-fpmを設定。

マニュアル記載と違うのは、php-fpmのunixソケットを指定するようにしたところあたり。

nginxのvirtualHost.conf

    location ~ \.php$ {
                 root     ***path_to_documentroot***;
                 include snippets/fastcgi-php.conf;
                 # With php-fpm (or other unix sockets):
                 #fastcgi_index index.php;
                 fastcgi_pass unix:/run/php/php8.2-fpm.sock;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 }

sites-availableを設定ファイルを置いて、sites-enabled配下にシンボリックリンクを貼るのが流儀のようでlnしていたはずなのに、いつの間にかsites-enabled配下のファイルが実ファイルになっていたのに気が付かず数時間設定が反映されないトラブルが・・・。emacsでシンボリックリンクを編集したら実ファイルなったりするんだろうか・・・。



## SSLの設定
無料のSSL証明書発行機関として、Lets Encryptというのがある。
これを使ってWEBサーバがSSL通信できるように設定する。
[こちら](https://qiita.com/shin4488/items/8738e13b92143c88aab6)がすごく参考になりました。ありがとうございます。


次は、phpの設定周りをやって、wordpressのインストールまでやります。
cpan で HTML::Template をインストール

cgiを利用したサーバのRedHat9.1への移行プロジェクトで、  
移行先のサーバで利用できるレポジトリが RedHatのレポジトリのみ環境。  
その際、モジュール「HTML::Template」が存在しないエラーが発生したが、dnf でインストールできなかった。  

対応策として、インターネットに接続できるサーバで 「install HTML::Template」したものをそのまま持っていけるかの検証  
作成サーバのOSは almalinux 9.2,perl 5.32。

## almalinux 9.2

```bash
[root@almalinux-9 ~]# perl -v
This is perl 5, version 32, subversion 1 (v5.32.1) built for x86_64-linux-thread-multi
[root@almalinux-9 ~]# perl -e "print @INC"
/usr/local/lib64/perl5/5.32
# No such file or directory ただし、CPANをインストールしたら作成されるディレクトリ
/usr/local/share/perl5/5.32
# No such file or directory ただし、CPANをインストールしたら作成されるディレクトリ
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
[root@almalinux-9 ~]#
```

## 事前確認

```bash
ll /usr/lib64/perl5/vendor_perl | sort
ll /usr/share/perl5/vendor_perl | sort
```

現状と同じものをdnf install

```text
dnf install perl-CGI
dnf install perl-XML-Simple
```

* cpanがそもそもなかった。。。

```bash
dnf install cpan
```

```bash
Perl site library directory "/usr/local/share/perl5/5.32" does not exist.
Perl site library directory "/usr/local/share/perl5/5.32" created.
Perl site library directory "/usr/local/lib64/perl5/5.32" does not exist.
Perl site library directory "/usr/local/lib64/perl5/5.32" created.
We initialized your 'urllist' to https://cpan.org/. Type 'o conf init urllist' to change it.
```

結構すぐインストール終わった

```bash
cpan
> install HTML::Template

Result: PASS
  SAMTREGAR/HTML-Template-2.97.tar.gz
  /usr/bin/make test -- OK
Running make install for SAMTREGAR/HTML-Template-2.97.tar.gz
Manifying 2 pod documents
Installing /usr/local/share/perl5/5.32/HTML/Template.pm
Installing /usr/local/share/perl5/5.32/HTML/Template/FAQ.pm
```

恐らく、以下のフォルダを固めて持っていけばOKなはず。

```text
[root@almalinux-9 ~]# ll /usr/local/share/perl5/5.32/HTML/
total 132
drwxr-xr-x. 2 root root     20 Dec 23 02:31 Template
-r--r--r--. 1 root root 134236 May 18  2017 Template.pm
```

### 動作確認

```bash
dnf install httpd
systemctl start httpd
```

[参考](https://perldoc.jp/docs/modules/HTML-Template-2.6/HTML/Template.pod)

```bash
cd /var/www/cgi-bin
vim test.tmpl
vim text.cgi
chmod 755 test.cgi
```

```text
http://192.168.33.24/cgi-bin/test.cgi
```
【Go言語】機密情報を扱うフィールドの定義と出力書式のカスタマイズ

Go言語で機密情報の取り扱いをする方法を説明する。
氏名、住所、クレジットカード番号などの個人情報や、顧客情報や仕入先リストなどの機密データの取り扱いは注意が必要になる。
不適切なログ出力によって、これらの情報が不要な箇所で露呈してしまわないようにする必要がある。

### 実装方法

Goの`fmt`パッケージに含まれる`Stringer`と`GoStringer`という二つのインターフェースを実装することで、クレジットカード番号などの機密情報の出力フォーマットをカスタマイズできる。

#### Stringerインターフェース

```go
type Stringer interface {
    String() string
}
```

#### GoStringerインターフェース

```go
type GoStringer interface {
    GoString() string
}
```

#### 使用サンプル
これらのインターフェースを使用して拡張することにより、クレジットカード番号などの機密情報を含むフィールドのログ出力を、ダミー値に置き換えることができる。

```go
package main

import (
	"encoding/json"
	"fmt"
)

// 機密情報を含むカスタマイズされた顧客構造体
type ConfidentialCustomer struct {
	CustomerID int64
	CreditCard CreditCard
}

// 機密情報を含むカスタマイズされたクレジットカード型
type CreditCard string

// Stringメソッドの実装
func (c CreditCard) String() string {
	return "xxxx-xxxx-xxxx-xxxx"
}

// GoStringメソッドの実装
func (c CreditCard) GoString() string {
	return "xxxx-xxxx-xxxx-xxxx"
}

func main() {
	c := ConfidentialCustomer{
		CustomerID: 1,
		CreditCard: "4111-1111-1111-1111",
	}

	// 様々なフォーマットで出力
	fmt.Println(c)         // マスキングされた出力
	fmt.Printf("%v\n", c)  // マスキングされた出力
	fmt.Printf("%+v\n", c) // マスキングされた出力
	fmt.Printf("%#v\n", c) // マスキングされた出力
	bytes, _ := json.Marshal(c)
	fmt.Println("JSON: ", string(bytes)) // JSON出力では元の値
}

```


## 参考
https://www.oreilly.co.jp/books/9784873119694/
PHP sprintf()

## はじめに
sprintf()のまとめです。文字数や桁数の指定が可能です。
自分用のまとめなので間違いや自分が完全に理解しているところに関しては省略して書いていることもあります。ご了承お願いします。

## 整数で使ってみる
さっそく使ってみます。指定するものが文字列か数字によって変わります。
整数でやってみます。
```php
$num = 500;

$newNum = sprintf('[%5d]', $num); //整数は%d,5は5桁出力

echo $newNum;
```
```php
[  500]
```
ちなみに[]は必要ありません、あったほうがわかりやすいですよね。
空白を0で埋めたいなら以下のように桁数の前に0をつけます。

```php
$num = 500;

$newNum = sprintf('[%05d]', $num); //整数は%d,5は5桁出力

echo $newNum;
```
```php
[00500]
```
また、左詰で出力したいなら先頭に-をつけます。
```php
$num = 500;

$newNum = sprintf('[%-5d]', $num); //整数,5は5桁出力

echo $newNum;
```
```
[500  ]
```

## 浮動小数点でやってみる
浮動小数点は%fになります。
```php
$num 123.456

$newNum = sprintf('[%7.2f]', $num); //浮動小数点、7桁出力でうち2桁が小数点

echo $newNum;
```
```
[ 123.46]
```
もし%5.2fとしても小数点含め6桁になるのでその場合は123.46と出力されます。
もちろんこちらも先頭に-を付けることで左づめにすることが可能です。

## 文字列でやってみる
文字列は%sになります。
```php
$name = 'keia';

$newName = sprintf([%15s]);

echo $newName;
```
```
[           keia]
```

## 終わりに
出力する桁数を指定したい時にめっちゃ便利ですね。
Atlantisを触ってみる

個人的にプラットフォームエンジニアリングがアツいのでキャッチアップをしているのですが、以下のサイトから[Atlantis](https://www.runatlantis.io/)というツールを見つけたので触ってみました。

https://platformengineering.org/platform-tooling

この図では`Infrastructure Controle Plane`に属するらしく、他サービスとの統合は特になさそう。

# Atlantis is 何?
> # What is Atlantis?
>A self-hosted golang application that listens for Terraform pull request events via webhooks.

めちゃくちゃシンプル！
[GitHubのREADME](https://github.com/runatlantis/atlantis?tab=readme-ov-file#what-is-atlantis)にあるように「セルフホストして、WebHook経由でPRからterraform実行できるサービスですぜ:kissing_smiling_eyes:」ってやつらしい。

# 何に使えそう？
類似サービスとの比較はこの記事がわかりやすいと思います。(クラメソさんいつもありがとう)

https://dev.classmethod.jp/articles/terraform-deploy-pipeline-tool/

例えば以下のようなワークフローで運用している場合、applyが正常に終わればよいのですがたまにapplyでコケる時があると思います。
1. PR出す    :`terraform plan`の実行
2. PRのマージ :`terraform apply`の実行

理解は浅いですが、AtlantisはPRで完結するためapply結果に合意してからのマージが可能になりそうです。

# 使ってみる
https://www.runatlantis.io/docs/installation-guide.html

こちらを元に進めます。
## 検証環境
https://www.runatlantis.io/docs/deployment.html

[terraform module](https://registry.terraform.io/modules/terraform-aws-modules/atlantis/aws/latest)が提供されているのでECS Fargateで構築します。

:::note warn
タスクがイメージをプルできない場合は以下の対処法があります。
- nat gatewayがあることを前提に作られているようなので構築する
- [ECS パブリックIP自動割り当ての変更はCLI経由で実施しよう](https://dev.classmethod.jp/articles/ecs-assignpublicip-change-with-cli/)を参考にCLIから設定する(クラメソさんいつもありがとう)

:::

### ディレクトリ構造
```sh
.
├── modules
│   ├── s3.tf
│   └── variables.tf
└── services
    ├── prod
    │   ├── main.tf
    │   └── provider.tf
    └── stg
        ├── main.tf
        └── provider.tf
```

### 認証情報
GithubのPATとWebhookのシークレットを作成しました。
それぞれご参考に.

https://www.runatlantis.io/docs/access-credentials.html

https://www.runatlantis.io/docs/webhook-secrets.html

## 動作
https://github.com/naruse666/atlantis-sandbox/pull/1

サンドボックス環境を作ったのでこのPRを元に一連の流れを書いていきます。

### terraform planの実行
`atlantis plan`とコメントすると`:eyes:`の絵文字がついてplan結果がコメントされます。
ディレクトリごとに実行されているし、[差分のないパス](https://github.com/naruse666/atlantis-sandbox/pull/2)には実行されないようです:+1:

![Screenshot 2023-12-23 at 10.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/77f48f10-d037-44a5-9c30-68a629c28292.png)

applyも同様に`atlantis apply`で実行できます。applyコケても大丈夫:raised_hands:

## ダッシュボード
planを行うとロックし、applyが終わると解除されるのですがセルフホストしたAtlantisのurlを叩くと以下のような画面が出てきます。

:::note warn
デフォルトでは認証がないので気をつけてください
:::

![Screenshot 2023-12-23 at 10.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/5d25baad-2e46-72e8-cf59-4ae5b95193b4.png)

## 実行ログを確認する
画面下側`Jobs`の右に日付付きのリンクを押すとお馴染みの実行ログが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/a40b7c14-2bd2-1e27-5ffe-106a9db2f18b.png)


# 所感
マージ前にapplyができたりは嬉しいが、セルフホストするのは少々大変。
なのでGitHub Actionsで同じ仕組みを作るのが魅力的に感じました。

https://techblog.finatext.com/terraform-github-actions-like-atlantis-e0846fc0565f

まとめると、PRベースでapplyできるのは素敵だが手段としてAtlantisを使うのがベストとは思えない。
更に、パイプラインが既に整備されているならば移行・管理コストに比べメリットは少ない。
Jira - BitBucket Cloud - Terraform Cloud - AWS パイプライン

# はじめに
この記事は [SRA Advent Calendar 2023](https://qiita.com/advent-calendar/2023/sra) の23日目の記事です。

アドバンスト クラウド エンジニアリング事業部の杉本です。
日々の業務では、ネットワーク、AWS、Azureの基盤の構築・運用を行なっています。
その中で、IaC や自動化を取り入れることもミッションとされています。

今週、忘年会を 3件入れたことを後悔しつつも前向きに、この記事を書いております。

社内の AWS 環境では、[Jira と AWS Service Catalog を利用](https://www.sra.co.jp/Portals/0/files/gsletter/pdf/GSLetterNeoVol159.pdf) し、環境の払い出しをしておりますが、昨今の CI/CD パイプラインのブームに乗っかるため、この払い出し方法を考えてみようと思います。

## 現在の構成
現在は、AWS Service Catalog と Jira を組み合わせて AWS Account の払い出しを行なっています。払い出しには Cloud Formation と一部 Lambda を使用しています。 数年前に Lambad のランタイムの変更で、一度コードを修正したくらいでほぼ手間はかからずでした。
ただ、Lambda で実行するスクリプトを zip して S3 に置くところは、少々面倒さを感じておりました。

![スクリーンショット 2023-12-22 16.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/c57b2083-318c-522c-e5ba-0706534a6a9a.png)

## こうしてみたい
まず、Cloud Formation ではなく、Terraform を使いたいが一番にあります。Terraform の plan して差分を見て apply する流れに運用する上ではこの上ない安心感があるためです。

次に、リポジトリですが、現在社内では Jira を使用しているので、そのまま使える BitBucket にしました。 
最後にワークフローについては Jira をそのまま利用することにしました。

![スクリーンショット 2023-12-22 16.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/0786dc8e-375f-0840-443c-df291347ddcf.png)

## やってみた
まず最初に、Jira のワークフローの部分は間に合わせることが出来ませんでした。そのため、上記の図の BitBucket から右側のみです。　Bitbucket内の Terraform テンプレート リポジトリのマージをトリガーに、Terraform Cloud が plan を自動実行し、その後 apply することで AWS リソースがデプロイされることを確認できました。
![スクリーンショット 2023-12-22 17.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/46c6d210-47f8-5d01-203f-e00c58ee18f5.png)

それぞれのサービスでは以下を実施しました。

## Terraform Cloud
1\. Terraform Cloud アカウント作成
2\. Project, Workspace 作成
3\. AWS アクセス用環境変数作成
- AWS 側で割り当てたロールの ARN を指定
4\. Bitbucket で作成したコンシューマキーを登録

## AWS
1\. IAM で IDプロバイダ として、app.terraform.io を登録
2\. ロール割り当て
- AWSアカウント、IAMユーザ・グループ作成のみなので、許可ポリシーは Organizations と IAM のみとした
- 信頼されたエンティティは Terraform Cloud の Project名、Workspace 名で絞った

## Bitbucket Cloud
1\. Butbucket アカウント作成
2\. ワークスペース、リポジトリ作成
3\. ワークスペースの設定から OAuth コンシューマキーを作成
- コールバックURL は Terraform Cloud のコンシューマキー登録ページに表示されたものを登録

4\. Terraform のテンプレートファイルをリポジトリに追加

# まとめ
上記を実施することで、リポジトリにマージされたタイミングで Terraform Cloud が動き、AWSリソースをデプロイすることができました。
Terraform のテンプレートの差分は Bitbucket で、 tfstate の差分は Terraform Cloud とそれぞれで確認することになりますが、それぞれの得意分野での確認なので気になることはなさそうです。

Terraform Cloud は、複数メンバーでデプロイ作業するため環境を統一したいが、サーバを管理対象として持ちたくない場合に便利だと感じました。 tfstate を持つ単位で Terraform Cloud の Workspace を分ける必要があるので、 Workspace を分ける単位は最初にある程度考えた方が良さそうです。

Jira Service Management から繋がることでパイプラインが完成するので、社内の環境払い出しを変えるため、次は Jira にトライしてみる予定です。
Amazon Bedrock,Amazon Kendra 検証まとめ

## はじめに

Amazon Bedrock,Amazon Kendraについて今年試したことのまとめです。

## サンプルコード

試しで作ったスクリプトなどはgithubに格納しました。

https://github.com/zgw426/llm-mysamples


## Amazon Bedrockの実装メモ

### Amazon Bedrock実装①：Python3(boto3)で実装してみる

- https://zenn.dev/zgw426/articles/e4046e62916d0f
    - Bedrock学びはじめ
    - PythonスクリプトでBedrockを使ってみました。
    - Pythonモジュールをインストールするとすぐ使えました。便利ですね

### Amazon Bedrock実装②：Docker on Cloud9で実装してみる

- https://zenn.dev/zgw426/articles/d5779a1c2ce1e4
    - BedrockをPythonで使える環境をDockerで用意できるようにしました。
    - 今後も考えて LangChain のモジュールもインストールしています。


### Webサーバーを立てずにlambdaを実行するhtml+JavaScript on Cloud9

- https://zenn.dev/zgw426/articles/52170421028231
    - Bedrockには直接関係ないのですが、Bedrockが使えるWebサイトを開発するために便利な環境を作りました。
    - LambdaとCloud9のHTMLプレビュー機能を使うことでWebサーバを立てずにWebサイトが利用できるようにしました。
    - Lambda内の処理でBedrockを呼び出せば、Bedrockと連携したWebサイトの開発ができる、という算段です。


### Amazon Bedrock実装③：Lambda(Python3)で実装してみる

- https://zenn.dev/zgw426/articles/cacdf290e4a599
    - Bedrockを実行するLambdaを作ります。次のブログでLambdaを使いWebサイトを作ります。


### Amazon Bedrock実装④：Cloud9環境のhtmlプレビューでBedrockを使えるようにする

- https://zenn.dev/zgw426/articles/de0892676f0bce
    - 作成したLambdaと前回のブログで作ったCloud9のHTMLプレビュー機能を組合せてWebサイトからBedrockを使えるようにしました。


デモ動画

https://www.youtube.com/watch?v=uX6io8uNTf0&t=53s

### Amazon Bedrock実装⑤：LangChainでBedrockを使ってみる

- https://zenn.dev/zgw426/articles/b260f75c516e9a
    - LangChainを使ってBedrockを使ってみます。ただ使っただけでLangChainはよくわかってません。

## Amazon Kendraの実装メモ

### Amazon Kendra実装①：Python3で使ってみる

- https://zenn.dev/zgw426/articles/6a680f9212b124
    - Kendraを実行するPythonスクリプトを作りました。
    - （日本語対応してるのありがたい）

### Amazon Kendra実装②：Kendraファセット検索やってみる

- https://zenn.dev/zgw426/articles/8e196043a33ac8
    - Kendraでより詳細な検索ができるようになるというファセット検索を試しました。
    - 追加した属性で絞込検索などができるようになります。

## RAGの実装メモ

### RAG実装①：Amazon Bedrock,Kendra(LangChain不使用)

- https://zenn.dev/zgw426/articles/a9d36104ded4de
    - BedrockとKendraを使いRAGを作りました。（LangCahinは使っていません）

## おわり

今年はここまでした。来年はもっと自在に使えるようにしたい。
data?.resultsの?ってなに？

# はじめに
data?.resultsという表記の意味がわからなかったので調べた。
# オプショナルチェーン
この？という表記はオプショナルチェーンまたは、オプショナルチェイニングというらしい。オプショナルチェーンの方がかっこいいからそう呼ぶことにする。
# 意味
?の前にある変数、定数がnullまたは、undefinedの場合にアクセスを中断し、undefinedを返すという意味。
# 使用例
user.likes.foodは存在するため'sushi'を出力
user.addres?.prefectureは存在しないが、?があるためundefinedを出力
user.address.prefectureは存在しないし、?もないためエラーを出力
```diff_javascript
  const user = {
    age: 30,
    likes: { food: "sushi" },
  };

  console.log(user.likes?.food); // 'sushi'
  console.log(user.address?.prefecture); // undefined
  console.log(user.address.prefecture); // TypeError: Cannot read properties
```
# 終わりに
個人的には非同期処理の際に見かけることが多いような気がする。
JAWS-UG事務局会計より 勉強会の領収書発行について

JAWS-UG事務局の会計を担当している加藤です。一般化して、勉強会の領収書発行(割り勘の、スポンサー費)についてちょっと書きます。

前置きとして、他の事務局メンバーにレビューをもらったような内容じゃないので限りなく「加藤の見解」です。ですので正しくは「JAWS-UG事務局会計を4年担当した加藤より」というのが正しいのかも。

かつ、私は特に会計系の資格を持っているわけでもなく、士業をしているわけではないので、ヘンなことを書いたり言ったりする・法に触れる可能性があることは避けるべきなのかもしれませんが、あくまで「一般的なこと」について書きます。ツッコミなどあったら即反映するので、即ツッコミおねがいしやす、、、。

（あ、一応私は [適格事業者番号を持つ自営業者](https://www.invoice-kohyo.nta.go.jp/regno-search/detail?selRegNo=9810607103502) で、確定申告は毎年やっていて今年もやるので、一般的なサラリーマンの方よりは現場に立っているのは多いかも。）

# インボイス(適格請求書)制度

みなさんご存じかと思いますが、「インボイス制度」が始まりました。
よくわからんかもしれませんがまぁとにかく

- 「適格事業者番号」が載ってる・載ってないのでは会計的に大きな違いがある
- 消費税額が8%か10％か明確にわかる書類じゃないとダメ

ってあたりが領収書を適格簡易請求書として扱うキモです( [freeeさんの記事](https://www.freee.co.jp/kb/kb-invoice/invoice_receipt/) )。

さて、ここで勉強会で会場費や飲み会費を割り勘すると、勉強会参加者から言われることがあります「領収書ください」と。

これまでは「はいはい、領収書ですねお待ちを。発行は JAWS-UG金沢 金額は税込1,000円、、、はいどうぞ」で済んでいたのですが、上記2点について質問されることがあります。


# 割り勘の領収書

## 方法 1. できないという

商売でやっていない限り、ほとんどの勉強会はただの割り勘です。よって

- 集金する人は事業者番号を持っていません。
- 法人でも自営業でもないので確定申告はしていません、よって消費税は納めていません。

ので「事業者番号はありません。消費税欄も書きません。」すなわち「できません」と案内してください。

## 方法 2. 割り勘したお店から発行してもらう

例えばαという会場を割り勘で借りたら、αさんに領収書を発行してもらうパターンです。そうなると、αさんは商売でやっていますので、「あれば事業者番号」「消費税額」がちゃんと書かれた領収書を(要求した)人数分いただけるはずです。（人数が多いと対応していただけない可能性は多いにあります。しゃーないよね、、、）

居酒屋さんとかでは結構対応してもらえます。

## 方法 3. 商売でやってる会社さんに会場を借りてもらう

勉強会に協力的な会社βさんを見つけて、αという会場を借りてもらう。領収書もβさんから出していただく。という方法です。


# スポンサー費の領収書

スポンサー費も会社さんから「領収書ください」と言われると思いますが、これも一般的な勉強会では「適格請求書」は出せない状況が多いと思います。

たぶんコツは「買ったものの領収書が直接スポンサーさんの名前になっていること」でしょう。

## 方法 1. 物品で直接スポンサーしていただく

例えば、ドリンクをスポンサーからご提供いただく場合、スポンサーさんにドリンクを買ってもらってモノを会場に送るなどしてもらってください。そうすれば、領収書はスポンサーさんがドリンクを買った先からもらえて、そのまま使える。こちらはお金の流れに介入しなくてよい、管理しなくてよいです。

## 方法 2. 請求書を回す

これも例えば、ドリンクをスポンサーからご提供いただく場合、支払いをスポンサーさん宛てに回してお願いします。そうすれば、領収書はスポンサーさんがドリンクを買った先からもらえて、そのまま使える。こちらはお金の流れに介入しなくてよい、管理しなくてよいです。

## 方法 3. 領収書を回す

これも例えば、ドリンクをスポンサーからご提供いただく場合、スポンサーさんの許可を得て、勉強会運営がスポンサーさんの名前で買います。(領収書はスポンサーさんの名前でもらいます）

勉強会運営は領収書を持ってその会社さんに立替払い精算で処理していただきます。（これはお金の流れに介入してしまうので、ちょっと手間。）

# 商売やってない人は難しいご時世

さて、領収書について少し書きました。事務局として代表口座の管理などもしていますし、JAWS-UG金沢として各種会場を借りたり [イベントを運営](https://jawsug-kanazawa.doorkeeper.jp/events/159890) したりしていますが、会場を借りる際や、スポンサー費をいただく際に、「我々は法人格を持たない、有志の集まりでやっています」というのはもうかなり難しいご時世です。

どう難しいのか？各社の法令遵守、セキュリティ、責任の所在の明確化などの観点から、「個人宛にお金を振り込めない」「個人宛に会場を貸せない」などなどで「個人を相手にできない」というのが大きいようです。

なんだか10年ぐらい前の勉強会ブームのときには割と緩くなってきてるなあと思ってたのですが、近年、マネロン問題や、国際的な犯罪などなどですごく引き締まってきました。

各勉強会の事務局もお金を少しでも取り扱う場合は、少し知識を入れておいた方がいいかもしれません。ていうか会計事務所さんとかAWS使ったりしとるやろ？そういう方にぜひ来てほしいし、JAWS-UG事務局に参加してほしいですー。

では。
【UiPath × Chat GPT】OpenAIアクティビティのすゝめ 【初期設定編】

OpenAIアクティビティめっちゃいいよ！って記事です。
使ってみたいけど使うまでの設定がわからない！って人のための内容になります。

# 設定が必要なもの
* OpenAI
* UiPath IntegrationService
* UiPath Studio

# 1. OpenAIの設定
OpenAIでAPIキーを発行すればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/cce7f621-9002-a80c-db01-2f7b8abbbfd5.png)

発行の仕方は私が書かなくても検索すればいっぱい出てくるので割愛します。

記事を書いた時点ではクレジットカードとの紐づけが必要でした。
OpenAIのAPIを使用するには課金が必要

とりあえず$10課金　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/e3b95b90-bcd9-be76-fb56-6545328ca46c.png)

:::note warn
ユーザ版のこれとは別ものなんでマジ注意！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/f4f50e08-f7f3-86b0-2b0a-c6e35ad2552d.png)
:::





リミッターをつけておけば金額が跳ね上がることがないのでとりあえず月に$5をリミッターに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/ae52c853-d7b1-d45f-d282-930b4d96ff41.png)

# 2. Integration Serviceの設定
IntegrationServiceでOrchestratorフォルダ(まずはMyWorkspaceがおすすめ)を選んで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/e78465a5-8199-a852-30d9-fe5b96cc29c4.png)

コネクタを追加から赤枠のOpenAIをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/a03b7272-1cd5-3638-a3cb-99427c227d75.png)
(黄枠のOpenAIはAzureを契約しててAzureの課金に紐づけたい場合はこちらを指定、設定方法が異なるためやり方を知りたい場合当記事にコメントいただければ解説します。私は基本的に黄枠を使ってます。)

OpenAI に接続から上で発行したAPIキーを入力して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/4286857e-b843-36a8-f103-37653fee46c2.png)

コネクションが緑の接続中になれば設定完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/8e9d7400-24c7-4539-0774-de6ac33b9b0e.png)

# 3. UiPathStudioの設定
パッケージを管理から先ほど登録した枠の色のアクティビティを選択してインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/917d3104-5a92-65b9-2d15-dff4d0e2d642.png)

あとは使って覚えろ感はある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630106/1ef438db-81eb-349b-7d2a-2f1d75651346.png)
IntegrationServiceの設定が終わっていれば自動でアクティビティの接続情報が設定されます。
IntegrationService楽でいいよね。

プロンプトに文字列入れたら上位の生成テキストに返答が返ってくるんであとはあなた次第！
具体的にこんなことに使えるよって情報は
【UiPath × Chat GPT】OpenAIアクティビティのすゝめ 【実践、コスト編】
https://qiita.com/Hash1mo/items/5e050c1ef5c7c9534b04
にて解説します。
React Native + Node.js+Expo+Xcode+Aodoroid Studio 環境構築

スマホ開発のはじめの一歩
環境構築について執筆しました。
よろしくお願いします。

https://zenn.dev/nori1234/books/fb9bdb5315843d?fbclid=IwAR3Ni4VPMuUu-39FPwXIpYv9Kd_k-Xe7aU9jlWPzdv0Ceajcj9eifkxwKj0_aem_AaxBq3Urj_BEN0BmtT-OSsqJnOhA0XhaZWK1bbGijqA-eVZLaMrdJOSMz1EhZu20pJU
軽深演習 #16 トヨタ

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 16日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。


### 前提知識　トヨタ
今回は価値あるビジネス情報の収集をどうしたら良いかという話です。
ビジネス上、参考になる有名な日本企業とはどこでしょうか？そう問われた時に、トヨタを思い浮かばない人が非常に多いです。有名なコンサルタントの方もそうだったので、かなり驚いた経験がありました。現象としては、[軽深演習 #15 天皇の魚](https://qiita.com/zanjibar/items/833095d98ee9611ac41b)のように天皇を思い浮かべないのと似た現象です。

図式で書くと、こんな感じでしょうか？ トヨタに矢印が伸びていません

```mermaid
flowchart LR
A[参考になる有名な日本企業]-->B[トヨタ以外]
A[参考になる有名な日本企業]--ｘ-->C[一番有名]-->D[トヨタ]
```

トヨタはどうですかと言われれば分かるのですが、意識からは、除外されてるようです。なぜトヨタが除外されるかよくわからないのですが。[軽深演習 #1 BL33XU](https://qiita.com/zanjibar/items/1c81641dcffe2373ec5b)を回答できる人がいないのと通じものがある気もします。理解できないことは、無視されるようなっているのかもしれません。またトヨタは、本質的に理解しにくいのかもしれません。例えばトヨタ生産方式は在庫を極限まで減らすのが目的だと言われています。[トヨタ生産方式を作った大野さんの本](https://amzn.to/488oVrU)を読んでみれば分かります。実際は違います。ギリギリな状態をつくるとトラブルが露見するからです。改善はトラブルが露見して初めて可能になります。

この現象は、図式で書くと、こんな感じでしょうか？

```mermaid
flowchart LR
A[最高到達点]-->B[理解/想像しにくいこと]-->C[なかったことにする]
```

理解/想像しにくいことがあったらどうしたらいいのでしょうか？ そんなに難しくはありません。分からないことは分からないことだと、まずは受け止めて、じっくりと観察すればいいだけです。もちろんわからないことが次から次へと出てくるでしょう。その時も。分からないことは分からないことだとまずは受け止めましょう。無理に理解しようとするから、いい加減な理解しやすい説明を求めてしまうのでしょう。

図式で書くと、こんな感じでしょうか？

```mermaid
flowchart LR
A[理解/想像しにくいこと]-->B[よく観察する]-->C[理解/想像できる]
```

### 演習 トヨタのホームページを見て、なんだこれと思うようなことがありますか？

なんでも好奇心を持って調べてみると面白いと思いませんか？ トヨタのプレスリースを見るだけでも面白いです。[トヨタ自動車とJT、トヨタ独自のDNA解析技術「GRAS-Di」に関するライセンス契約を締結](https://global.toyota/jp/newsroom/corporate/25439115.html)はどうでしょうか？　 自動車会社にはなじまない内容です。

数学的に厳密な議論とは程遠いですが、図式で表現されると理解が進んだ気がしませんか？
HTMLでのマークアップに慣れている人がMarkdown記法と仲良くなるために覚える優先順位

# はじめに
　Qiitaの記事で初めてmarkdown記法と出会いました。
 
　今までHTMLでサイトを作ったり、WordPressがブロックエディタ（Gutenberg）に代わる前はHTMLで書いていたので、その違いにかなり戸惑いました。

　ただ、苦労しながら覚えて思ったのが、「HTMLで身につけた考え方が、Markdown記法にもかなり役立っている」ということです。
 
　全く初めてでMarkdownを触り始めるよりも有利なところにいると思うので、まずは覚える表現の優先順位づけをすると、苦手意識がなくなると思います。
 
 :::note info
 全ては網羅していないので、Qiita公式さんの素敵チートシートをご参考ください！

[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#note---%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)
 
:::

# HTMLでのマークアップに慣れている人がMarkdown記法と仲良くなるために覚える優先順位

## 1. 見出し（`<h1><h2><h3><h4>`）

　Markdown記法では、#を重ねることで見出しのレベルを表現できます。
#の後に半角スペースを入れるのをお忘れなく。

### htmlの場合
~~~html
<h1>Hello</h1>
<h2>World</h2>
<h3>Merry</h3>
<h4>Christmas</h4>
~~~

### markdown記法の場合
~~~markdown
# Hello
## World
### Merry
#### Christmas
~~~
### 出力
※目次に影響が出てしまうのでスクリーンショット貼り付け

![スクリーンショット 2023-12-23 10.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/2d9f4610-d299-6da5-a632-ec1f95c65c6e.png)


## 2. 箇条書き・番号付きリスト
* 箇条書きリスト
文頭に"*"をつけることで表現できます。"*"の後に半角スペースを入れるのをお忘れなく。
* 番号付きリスト
「1.」などの数字を入れることで表現できます。"."の後に半角スペースを入れるのをお忘れなく。

### htmlの場合

~~~html
# 箇条書きリスト

<ul>
    <li>あんぱん</li>
    <li>食パン</li>
    <li>カレーパン</li>
</nl>

# 番号付きリスト

<ol>
    <li>あんまん</li>
    <li>豚まん</li>
    <li>カレーまん</li>
</ol>
~~~

### markdown記法の場合
~~~markdown
# 箇条書きリスト
* あんぱん
* 食パン
* カレーパン

# 番号付きリスト
1. あんまん
2. 豚まん
3. カレーまん
~~~

### 出力

* あんぱん
* 食パン
* カレーパン

1. あんまん
2. 豚まん
3. カレーまん

## 3. リンクの貼り方

* リンクカードを貼る
URLをコピペして、上下に空白を入れればOK！
* 文字リンクを貼る
タイトルや表示したい文字を[]内に入れて、（）内にURLをコピペすればOK！

### htmlの場合

~~~html
# リンクカードを貼る（媒体によって記述方法が異なるので割愛)

# 文字リンクを貼る

<a href="https://qiita.com/advent-calendar/2023/hata">
【目指せ完走賞】hataのワクワクしたことまとめ Advent Calendar 2023
</a>

~~~

### markdown記法の場合
~~~markdown
# リンクカードを貼る（媒体によって記述方法が異なるので割愛)

https://qiita.com/advent-calendar/2023/hata

# 文字リンクを貼る

[【目指せ完走賞】hataのワクワクしたことまとめ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hata)
~~~

### 出力

https://qiita.com/advent-calendar/2023/hata

[【目指せ完走賞】hataのワクワクしたことまとめ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hata)


## 4. Markdownの調べ方を覚える
　上記三つを覚えておけば、特に何も見なくても大体の記事は書けるようになります！
 
　もう一つ覚えておくといいのは、Markdownの調べ方です。

* **Qiita公式チートシートを参照する**

　冒頭でご紹介したリンクからも飛べますが、もう一つ行き方があります。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#bullet-list---%E9%A0%86%E5%BA%8F%E3%81%AA%E3%81%97%E3%83%AA%E3%82%B9%E3%83%88

　Qiitaの記事エディタ上の上のメニューバーにはてな（❓）があるので、クリックすると、公式チートシートに飛ぶことができます。記事を書いているときに、「あれ？　どうやって記述するんだっけ？」と思ったときにご活用ください。

![スクリーンショット 2023-12-23 10.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/de48024c-611a-4393-5e43-a8a60f6a7ff3.png)

![スクリーンショット 2023-12-23 10.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/94ced286-4a1f-e60d-361f-8612aa3a77b7.png)


# まとめ

　Markdownは基本タグを閉じなくていいのがめちゃくちゃ楽＆便利ですね。（補完してくれるエディタを使えばそこら辺はストレスないのですが）

　個人的に覚えて良かった順番なので、もしかしたら別の順番の方が覚えやすい！という方もいらっしゃるかもしれません。
 
　自分なりに優先順位を入れ替えつつ、記事執筆を楽しんでいただけると幸いです！

# おまけ

　iPhoneやMacで記事やネタメモを書くことが多いので、クラウドで同期できるメモアプリを使用しています。
 
　Simplenoteでは、Qiitaのように、Markdownで書いた記事のプレビューもできるので、ぜひ試してみてくださいね！

https://simplenote.com/
Wagtail 【エラー】Formsの機能でお問合せフォーム作成がうまくいかなかった話

wagtailで、公式のチュートリアルを参考にお問合せフォームを実装しようとしていたが
公式にコード通りに書く(コピーしても)とエラー出てしまいハマってしまったので解決法をメモしておおきます。

こちらが参考にした公式のサイト
https://docs.wagtail.org/en/latest/tutorial/create_contact_page.html

## エラー症状
チュートリアル通りに進めると、管理画面のページ追加するメニューに"Form Page"という項目が追加されます。
![フォr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/ea4bcfbd-3726-d740-ec28-e63192bc4396.png)


ここまでは順調ですが、この"Form Page"をクリックすると画面のようなエラーになります。
![erroe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/5bf6565a-a7b7-befc-d91f-f0ba095a44d2.png)

エラーで"ValueError at /admin/pages/add/base/formpage/3/"や
"Model instances passed to related filters must be saved."などが表示されていますが
ググっても合致する情報が見当たらずなんのエラーかは不明でした。
しかし、エラーを解消する方法は見つけました。


## 結論:解決方法
公式のコードのmodels.pyの"FormSubmissionsPanel()"の部分を消すと直ります。
![s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/17bd69b3-2a3e-2f6f-32e6-640f3a9e4516.png)

正直なぜこれで直るかは分かりません。
ただ公式のコードを見ていても"FormSubmissionsPanel()"がインポートされていないことに気付きました。
ひょっとしたら、インポートされてないものを使おうとしてエラーになったのかもしれません。
```python:models.py
from django.db import models

# import parentalKey:
from modelcluster.fields import ParentalKey

# import FieldRowPanel and InlinePanel:
from wagtail.admin.panels import (
    FieldPanel,
    FieldRowPanel,
    InlinePanel,
    MultiFieldPanel,
    PublishingPanel,
)

from wagtail.fields import RichTextField
from wagtail.models import (
    DraftStateMixin,
    PreviewableMixin,
    RevisionMixin,
    TranslatableMixin,
)

# import AbstractEmailForm and AbstractFormField:
from wagtail.contrib.forms.models import AbstractEmailForm, AbstractFormField

# import FormSubmissionsPanel:
from wagtail.contrib.forms.panels import FormSubmissionsPanel
from wagtail.contrib.settings.models import (
    BaseGenericSetting,
    register_setting,
)
from wagtail.snippets.models import register_snippet


#・・・・・・・以下省略
```

ともかく、"FormSubmissionsPanel()"を消すと今度は"Form Page"をクリックするとフォーム編集の画面が表示されます。

![名称未for定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/d6bb271e-beec-a5c4-2005-82d720422e7a.png)
ついでに、公式のチュートリアルは管理画面のスクショや操作方法について全く記載がなかったのでここで紹介します。
画像のような画面で、フォームの内容(例えば名前、メールアドレス、問い合わせ内容など)を自分で好きに追加できます。
inout,textarea,selectなど入力形式も設定できるようです。
![名称未設定７７2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/0369ed05-e2d4-3d2d-b1c6-221f287d9c86.png)
最後にpublishして画面を表示するとこのようになります。
![名称未あああ設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/74690cd7-204a-cdc6-cc17-449825973352.png)
試しに何か入力して送信してみましょう。
ここで送信した内容が、管理画面のサイドバーのFormsを押すと、作成したフォームが表示されるので
それを選択すると送信内容が表示されます。
![名称未設定っs3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/689bf142-9e8d-ee02-04fc-f6de227ba846.png)

以上で、エラー解決して動作確認まで出来ました。



## 備考

ちなみに、公式のドキュメントで"FormSubmissionsPanel()"を探してみると
英語ですがおおよそ編集インターフェースに読み取り専用の制限をかける旨が記載してありました。
https://docs.wagtail.org/en/stable/reference/pages/panels.html
![名称未z設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/6131fd36-a698-cba0-0844-42033fc4405e.png)
【Rails】rails_helperファイルについて、またその中で設定できること

## rails_helperファイルとは

:::note
【**rails_helper**ファイル】

**RSpecの実行に必要不可欠なファイルの一つであり、RSpecの設定をまとめて書いたファイル**。


* 各ファイルの先頭に、必ず `require "rails_helper"` を記述する
* spec ディレクトリ配下のテストで共通して使用される設定ファイル
* Railsの環境を利用するために(作成したファイルと連携させるために)記述必須

`require "ライブラリ名"`

別の場所に配置したファイルを読み込んで、そのファイルで定義されたクラスやメソッド利用することができます。その際に利用するのが、requireです。require関数は、標準ライブラリやインストールしたライブラリから使用する場合にはライブラリ名を渡すことで使えます。
:::

## 設定例
#### `ENV['RAILS_ENV'] = 'test'`
環境変数RAILS_ENVを'test'に設定することで、Railsがテスト環境用の設定を読み込む。これにより、テストを実行する際にRailsとその他の依存ライブラリがテスト環境を使用することを保証してくれる。テスト実行中に開発や本番環境のデータベースに影響を与えないようにするために重要。

#### `require File.expand_path('../config/environment', __dir__)`
Rails アプリケーションのメイン環境設定ファイルへのパス。RSpec でテストを実行する際に Rails アプリケーションの環境を完全にロードします。これにより、モデル、ビュー、コントローラーなど、Rails アプリケーションの全ての部分がテスト中に利用可能になります。

#### `abort('The Rails environment is running in production mode!') if Rails.env.production?`
テストが誤って本番環境で実行されることを防ぐためのセーフガード.abort メソッドは、指定されたメッセージを出力し、プログラムの実行を直ちに中止してくれる。

#### `RSpec.configure do |config|`
RSpec（Rubyのテストフレームワーク）の設定をカスタマイズするためのものです。RSpecの設定は通常、`spec_helper.rb` や `rails_helper.rb` の中で行われます。具体的には、このコードは`RSpec`の動作をカスタマイズし、特定のヘルパーモジュールをテストスイートに組み込むために使われています。

#### `config.fixture_path = "#{Rails.root}/spec/fixtures"`
RSpecがテストフィクスチャをロードするためのデフォルトのパスを設定.テストフィクスチャは、テスト中に使用される静的なデータ（例えば、画像データなど）を含むファイル.

#### `config.use_transactional_fixtures = true`
RSpecを使用したRailsアプリケーションのテストで、トランザクショナルフィクスチャの使用を有効に.`true`に設定されている場合、各テストケースの実行はトランザクション内で行われます。これは、テストが終了すると同時にトランザクションがロールバックされ、テストによって行われたデータベースへの変更が元に戻されることを意味します。
dockerでもzshが使いたい！

# 経緯
前回の記事では、ホストOS環境のshellをbashからzshに変更し、テーマをspaceshipというオシャレなものに変えました。

前回の記事

https://qiita.com/amaebin/items/6e24d0b4130dd8ff12e2

しかし・・・私はよくdockerの中に入って作業をするので、zshをあまり使えない。

じゃあ、dockerにzshをいれようというお話です。

# 作る環境
dockerの中に以下のものを入れます
- zsh
- prezto
- spaceship theme
これらを入れて初期設定まで済ますdockerfileを作りました。

```dockerfile
FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    git \
    zsh \
    sed \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
ENV SHELL /usr/bin/zsh
RUN zsh
#set default shell to zsh
RUN chsh -s /bin/zsh
#zprezto install
RUN git clone --recursive \
    https://github.com/sorin-ionescu/prezto.git \
    $HOME/.zprezto

SHELL ["/bin/zsh", "-c"]
RUN setopt EXTENDED_GLOB; \
    for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do \
      ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"; \
    done
RUN git clone --recurse https://github.com/belak/prezto-contrib $HOME/.zprezto/contrib
RUN sed -i "/'prompt'/c \\\ 'contrib-prompt' \\\\\n  'prompt'" /root/.zpreztorc
RUN sed -i "s/theme 'sorin'/theme 'spaceship'/g" /root/.zpreztorc

CMD ["/bin/zsh"]
```

これをいつも使っているdockerfileに入れちゃいましょう！
このコードは以下のgithubにて公開しております。
https://github.com/ktakita1011/docker_in_zsh
おわり
ギャンブルとゲーミフィケーションの依存性に関する総合的分析

現代社会では、ゲームのようなエンターテイメントが私たちの生活に深く根ざしています。特にギャンブルとゲーミフィケーションは、その魅力的な要素により、多くの人々を引き込んでいます。これらは楽しさやモチベーションを高める仕組みを利用していますが、依存症を引き起こすリスクも持っています。

![gamification-20231223-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/c8ae0c56-456d-9af4-f65a-46d8abc7fdf1.png)


ギャンブルは、賭け事による興奮や期待感が特徴で、運や偶然の要素が強いです。一方、ゲーミフィケーションは、日常の活動にゲームの要素を取り入れることで、ユーザーの関与や参加を促進します。これらの活動は、報酬系や進行感を利用して、ユーザーを引きつける一方で、依存症に陥りやすい環境を作り出しています。

ギャンブル依存症は長い間、社会的な問題とされてきましたが、ゲーミフィケーション依存症は比較的新しい概念です。この記事では、これらの依存性について深く掘り下げ、その原因、影響、そして予防策について詳しく解説します。

# 依存性の詳細とその原因

## ギャンブル依存症の詳細と原因：

ギャンブル依存症は、精神障害の一種として認識されています。この状態では、個人はギャンブルへの抑えがたい衝動に駆られ、しばしば経済的、社会的、心理的な問題を引き起こします。

この依存症の根源には、遺伝的要因と環境的要因の両方が関与しており、特にドーパミンなどの神経伝達物質の異常が大きな役割を果たしています。症状としては、ギャンブルへの強迫観念、借金や財産の喪失、家族や職業との関係悪化などが見られます。

## ゲーミフィケーション依存症の詳細と原因：
ゲーミフィケーション依存症は、ゲームの要素を日常生活に取り入れることで生じる依存状態です。ここでは、ユーザーはゲーム化された活動に過度に没頭し、日常生活に悪影響を及ぼすことがあります。この依存症は、ギャンブル依存症と同様に遺伝的、環境的要因が関連していますが、ゲームのデザインや報酬システムが特に重要な役割を果たします。症状には、過度の時間投資、社会的関係の悪化、職業や学業への影響などがあります。

# 依存性の違いとその影響

ギャンブルとゲーミフィケーションの依存性には、明確な違いがあります。ギャンブル依存症は、主に金銭的リスクと結びついており、運や偶然の要素が強いのが特徴です。これにより、破産や財産の喪失などの経済的な問題が生じやすくなります。

一方、ゲーミフィケーション依存症は、時間や社会的関係への影響が主であり、金銭的なリスクは比較的低いですが、仕事や家庭生活に悪影響を及ぼす可能性があります。

これらの違いは、依存症の対策と予防においても重要な意味を持ちます。ギャンブル依存症は、金銭的な問題を中心に治療やサポートが必要ですが、ゲーミフィケーション依存症では、時間管理や社会的関係の修復が主な焦点となります。また、ゲーミフィケーションの設計自体に依存性を減らす工夫が求められる場合があります。

# 依存性への対策と予防

依存症への対策と予防は、ギャンブルとゲーミフィケーションのリスクを理解し、早期に兆候を認識することから始まります。依存症の予防には、ルールやリスクの理解、時間管理、趣味や他の活動への参加が重要です。また、依存症に対する社会的な理解とサポートシステムの充実も不可欠です。

ギャンブル依存症の場合、金銭管理の教育、ギャンブルの機会の制限、心理療法やサポートグループへの参加が効果的です。ゲーミフィケーション依存症では、ゲームのデザインを調整し、報酬システムや進行度を管理することが重要です。また、個人の時間管理や社会的関係の強化に焦点を当てることも効果的です。

依存症に対する適切な対応は、個人の健康や社会全体の福祉に寄与します。最終的には、ギャンブルとゲーミフィケーションを安全に楽しむための社会的な理解と対策が、健全なエンターテイメント文化の発展につながるでしょう。
物事を進めるための手順を教えてくれるAI

## なぜAIを選んだのか
AI技術はますます向上する中人間が思いつかなかったようなことを見せてくれる。私は思うに将来の職業が奪われるといったデメリットだけではなくAIの提案新しい考え方が生まれることもあると考えた。その中で今回は物事を進めるための手順を教えてくれるAIを紹介しようと思う。


## 今回使用するAI
今回紹介するAIは物事を進めるための手順を教えてくれる[**goblin tool**](https://goblin.tools/)というAIだ。このツールは日本語にも対応しているため初心者の方にも比較的扱いやすAIとなっている。




## 使用方法
まず[**goblin tool**](https://goblin.tools/)のサイトにアクセスする。
![coblintool.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/94d39859-999d-c6ff-d993-777b7a15b432.png)

するとこのような画面が表示される

次に知りたい手順を写真中央の**Add new item**に入力する。
![プラスボタン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/2b176181-7fc1-2610-cca7-4d9b8364a587.png)

入力したら**青いプラスボタン**をクリックする
![goblintool2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/3a1411e1-690b-1034-0097-b86385764382.png)

するとこのような画面が出てくる。
![青いスティック.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/e2bbfa2c-13b5-b0f5-94e8-b89f4da32e2c.png)


調べたい項目の横の**青いスティックボタン**を押す。
これを押すことで詳しい手順がこのように表示される。
![カレーの作り方例.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/14e44fd2-6da3-7a16-3431-c3384bef2dbf.png)
さらに詳しく表示させたい場合は表示させたいリストの横の青いスティックボタンをもう一度押す。
大体の操作方法はこれで大丈夫だと思う。
あと削除のやり方も紹介する

![リムーブボタン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631499/f26d0b8d-6cc6-d74a-c5e8-33140cbce541.png)
リスト右はじの三つの点々をクリックするとこの画面が出ると思う。そしたらRemoveを押し削除できる。

## まとめ
このAIを用いることによってどうすればいいか？という疑問に対して最善の手を複数表示してくれるとともに新たな視点も見えてくると思う。
ぜひ活用してみてください！