OmniAICreator/Qiita-1.07M huggingface dataset:
【Drupal】EntityForm作ってみよ

EntityFormを「カスタマイズしたい。」「増やしたい。」って時、ありますよね。

え、いまいちイメージつかないですか？

今回は、Core搭載のFormModeを利用してCustomのControllerでFormを実装してみましょう。

## どういうシチュエーション...？
よくあるのってこんな感じですよね。
- 表示設定（ダークモード、言語設定）
- アカウント設定（メール、ユーザー名、住所）
- プロファイル（趣味やカジュアルな設定項目）
- API連携（外部連携用のAPITokenを入力できるフォーム）
- アカウント登録
- パスワード設定

「ユーザー設定だけでも複数画面を用意したい」って要件、よくあるんじゃないでしょうか。

今回は、Drupalでそれを実装してみましょう。

各エンティティが持つフォームって、標準インストールでは1つしか使えないはずです。（※ UserEntityの場合は、登録フォームがありますよね）

大丈夫。魔改造はしません。全部 DrupalCoreのAPI に沿った方法で実装します。

## 材料はこちら。
### 1. FormMode
フォームモード使ってますか？
InlineEnitityFormと相性ばっちしですので、あまりコードをかかないタイプのサイトビルダーの方には馴染みあるのでは...？

### 2. FormAPI
標準のFormAPIを利用します。実装したことないって人も大丈夫。
今回は、CoreのUserForm(ProfileForm)をほんの少し拡張するだけ。

### 3. Controller
Routingを定義して、簡単にページを作るには手っ取り早いですよね。
DrupalでのControllerの実装については、別記事で紹介していますのでそちらもぜひ。（まだ書けてません。しばしお待ちを。）

なんと今回は3つの機能のみで実装可能です。

## 実装方法
### 1. FormModeの定義
まずはGUIでFormModeを作成してください。
マシンネームメモっててくださいね。

### 2. Formの実装
```php
/**
 * カスタムユーザーフォームクラス: API設定 フォーム.
 */
class ProfileApiForm extends ProfileForm {

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, ?UserInterface $entity = NULL) {
    // 親クラスの buildForm を呼び出す.
    $form = parent::buildForm($form, $form_state);

    // ここで親のフォームを呼び出したあとにいろいろカスタマイズが可能です.
    $form['#id'] = 'user_api_form';
    
    return $form;
  }

}
```

### 3. 設定したFormをEntityFormとして登録
手順: 1 でメモしたマシンネームをこちらで使います。
```php
/**
 * Implements hook_entity_type_build().
 */
function hook_entity_type_build(array &$entity_types) {
  if (isset($entity_types['user'])) {
    $entity_types['user']->setFormClass('profile_default', ProfileDefaultForm::class);
    $entity_types['user']->setFormClass('profile_display', ProfileDisplayForm::class);
    $entity_types['user']->setFormClass('profile_api', ProfileApiForm::class);
  }
}
```

### 3. ControllerとRoutingの実装
割愛します。
Controllerの実装はまた別の記事で書きますね。

### 4. Controller内でFormを構築
DrupalのControllerBaseには、EntityFormBuilderを利用できるよう組み込みされています。

getForm メソッドで、Formを生成しましょう。

```php
class ProfileApiForm extends ControllerBase {

  public function __invoke(): array {
    // フォームの生成.
    $form = $this->entityFormBuilder()->getForm($user, 'profile_api');

    return [
      '#form' => $form,
    ];
  }
}
```

### 5. 動作確認
あとは表示確認してみましょう。

## まとめ
今回は、ControllerでEntityFormを呼び出す方法について紹介しました。

１からFormを実装してますので。

**hook_form_alter() なんて不要**...。
**EventSubscriber なんて不要**...。

ですよね！

## 参考
このあたりはドキュメントが少ないので難しいですよね...。

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityForm.php/class/EntityForm/8.9.x

https://www.drupal.org/docs/drupal-apis/form-api
【初心者向け】Dockerの基礎について解説

## 初めに
今回は、初めてDockerを一から導入し、理解しながら進めてみた経験をアウトプットとして記事にまとめました。この記事は、実際のDockerの構築の仕方ではなく、Dockerの全体的な理解にフォーカスして説明してきます。


## Dockerって何？
Dockerを使うと、チーム開発が非常にスムーズになります。例えば、個人で開発している場合、フロントエンド、バックエンド、データベースなどをそれぞれ個人のPC上で環境構築していることがあります。そのコードをGitHubに上げて、他の開発者がクローンし、ローカル環境で動かしたいとき、環境構築が再び必要になることがよくあります。特にデータベースなどの環境が整っていないと、その人は一から自分のPCで同じ環境を構築しなければならず、これがとても手間です。

そこで登場するのがDockerです。Dockerを使うと、仮想コンテナ内にデータベースやAPI、フロントエンドのコードなどをすべてパッケージ化できます。そのコンテナを他の人が立ち上げるだけで、ローカル環境でも同じ環境が再現され、動作確認などが簡単に行えます。このように、Dockerを使うことでチーム全体の開発効率が向上します。

ここからは、Dockerを使う際に必要なことを5つ説明していきます。


## DockerFileとは
Dockerfileとは、簡単に言うと設計図のようなものです。コンテナを立ち上げるには、その設定や手順が必要ですが、その設計書にあたるのがDockerfileです。

イメージとしては、まずDockerfileという設計図を作成し、その設計図に基づいてDockerイメージをビルドします。そして、そのイメージを元にコンテナを立ち上げます。Dockerfileを作成しておけば、誰のローカル環境でもこの設計図に基づいて同じコンテナを簡単に立ち上げられる、という仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749225/f0e41516-1f79-1b4b-52f6-b081326799ac.png)


## Dockerイメージとは
Dockerイメージは、Dockerfileを元にビルドされた成果物です。このイメージには、アプリケーションのコード、依存パッケージ、環境設定などがすべて含まれています。イメージは、動作する環境をまるごとパッケージ化しており、このイメージからDockerコンテナを作成します。

## Dockerコンテナとは
Dockerコンテナとは、Dockerイメージをもとに作成される実行可能な仮想環境のようなものです。コンテナは、軽量で、システムリソースを効率よく使用しながら、アプリケーションを他のプロセスから隔離して動作させます。Dockerコンテナを使用すると、イメージに基づいて簡単にアプリケーション環境を再現でき、どのPCでも同じように動作させることができます。

## Docker-Composeとは
ここから少し話の流れが変わります。先ほど、Dockerの「設計書（Dockerfile）→イメージ→コンテナ」という流れについて説明しましたが、まだ不便な点があります。それは、複数のコンテナを作成したい場合です。

例えば、フロントエンド、バックエンド、データベースなどの異なるサービスを一つのコンテナにまとめるのは非常に難しいです。ここで登場するのが Docker Compose です。Docker Composeを使うことで、複数のコンテナを簡単に管理し、それらの結びつきをスムーズに設定することができます。

以下に例としてDocker Composeのソースコードを載せておきます。すべてを理解する必要はありませんが、特に注目してほしいのは app と db の部分です。app と db で別々のコンテナを作成するコードや、これらのコンテナがどのように連携しているかが書かれています。最初は「ここでそれぞれのコンテナを作っているんだな」という程度の理解で問題ありません。


```docker:docker-compose.yml
version: "3"  # Composeファイルのバージョン

services:
  app:
    build: .
    ports:
      - "3000:3000"  # ホストのポート3000をコンテナの3000にマッピング
    environment:
      - DATABASE_URL=postgres://postgres:password@db:5432/mydb  # DB接続情報
    depends_on:
      - db  # appコンテナはdbコンテナに依存
    volumes:
      - .:/app  # ローカルのカレントディレクトリをコンテナ内の/appにマウント

  db:
    image: postgres:14  # 使用するPostgreSQLのバージョン
    environment:
      POSTGRES_USER: postgres  # データベースのユーザー名
      POSTGRES_PASSWORD: password  # データベースのパスワード
      POSTGRES_DB: mydb  # 作成するデータベース名
    volumes:
      - postgres_data:/var/lib/postgresql/data  # データ永続化のためのボリューム
    ports:
      - "5432:5432"  # ホストとコンテナ間でポート5432をマッピング

volumes:
  postgres_data:  # データ永続化用のボリューム定義

```




これでDockerの基本的な解説は以上になります。
次回の記事では、Next.jsの環境をDockerを使って構築する方法や、実際に苦戦した所について詳しく解説していきます。

ここまで読んでいただき、ありがとうございました。
応用編：Pythonでスクレイピングしたデータをテキストファイルに保存する方法

## はじめに
今回は、Pythonを使って指定したWebページからスクレイピングを行い、抽出したデータをテキストファイルに保存する方法を紹介します。

具体的には、HTMLのh3タグに囲まれたテキストデータを取得し、その内容をscraped_data.txtというファイルに書き出すサンプルコードを解説します。

前回の記事でもスクレイピングについて紹介しているので、興味のある方は参考にしてみてください。

https://qiita.com/free-honda/items/00f49bdd0799faea77e3

## スクレイピングとは？
スクレイピングとは、ウェブページから特定の情報を自動的に抽出する技術です。

データ分析、リサーチ、そして自動化の分野で広く活用されていますが、**スクレイピングを行う際にはそのサイトの利用規約やスクレイピングが許可されているかどうかを必ず確認しましょう。**

## 使用するPythonライブラリ

:::note 
今回のスクレイピングでは以下の2つのPythonライブラリを使用します：

**・``requests``**：指定したURLのウェブページデータを取得するためのライブラリ
**・``BeautifulSoup4``**：取得したHTMLデータを解析し、特定の要素を抽出するためのライブラリ
:::

これらのライブラリがインストールされていない場合は、以下のコマンドでインストールします。

```bash
pip install requests beautifulsoup4
```

## スクレイピングの実装例
次に、具体的なコード例を見ていきます。

```test.py
import requests
from bs4 import BeautifulSoup

# URLを設定
url = 'https://metrosisetu.com/echo-show-15/'

# ページを取得
response = requests.get(url)

# ページ内容をパース
soup = BeautifulSoup(response.content, 'html.parser')

# 全てのh3タグを取得
h3_tags = soup.find_all('h3')

# テキストファイルに書き出し
with open('scraped_data.txt', 'w', encoding='utf-8') as file:
    for h3 in h3_tags:
        file.write(h3.get_text() + '\n')
```

上記コードは、指定したウェブページからh3タグに含まれるテキストを抽出し、それをテキストファイルに保存します。

:::note alert
**ここでスクレイピングしているサイトは、私が過去に運営していたサイトのブログ記事です。**
:::


## コードの解説
### requests.get(url)
指定されたURLに対してHTTPリクエストを送り、HTMLデータを取得します。レスポンスとして返されるHTMLを解析するためにresponse.contentを使用します。

### BeautifulSoup(response.content, 'html.parser')
BeautifulSoupを使って取得したHTMLデータをパース（解析）します。ここでは、HTML全体の内容をBeautifulSoupオブジェクトに変換し、特定のタグや要素を簡単に操作できるようにします。

### soup.find_all('h3')
ページ内のすべてのh3タグを抽出します。このメソッドは、条件に一致するすべての要素をリスト形式で返します。

### テキストファイルへの書き出し
ファイルを'w'モードで開き、utf-8エンコーディングを指定して文字化けを防ぎます。各h3タグのテキスト内容を改行を含めて書き込むために、file.write()を使います。

## 実行結果
このコードを実行すると、指定したページのh3タグに含まれるテキストがscraped_data.txtというテキストファイルに保存されます。

以下は、テキストファイルに書き込まれる例です。

```scraped_data.txt
【Echo Show 15】新登場 15.6インチフルHDスマートディスプレイ with Alexa
【Echo Show 5】第2世代 – スマートディスプレイ 2メガピクセルカメラ付き
【Echo Show 8】第2世代 – HDスマートディスプレイ 13メガピクセルカメラ付き
【Echo Show 10】第3世代 – モーション機能付きスマートディスプレイ with Alexa
【セット買い】Echo Show 10 + Nature Remo mini2スマートリモコン

      【最新モデル】テンキーのおすすめ14選。Macbookにも使えるワイヤレス！    

      【2020年版】おすすめバリカン21選。自宅で簡単！【ピックアップ集】    

      【2021年最新】おすすめのディスプレイ11選。強く鮮明に出力!!【パソコン】    

      【2020年決定版】おすすめパソコンケース19選。人気ブランドも！【徹底比較】    

      【最新】おすすめマイク付きイヤホン4選。コスパ良し、性能良し！【高評価】    
最近の投稿
アーカイブ
カテゴリー
```

実際のプログラム実行後の画面は以下になり、指定したページ内のh3タグの内容を簡単に抽出し、テキストファイルに保存できます。

![スクリーンショット 2024-10-24 21.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/663f5b78-bf40-190f-0856-5289edbbd76e.png)

## 応用：スクレイピング結果の応用例
今回紹介したコードを基に、他のタグの情報を抽出したり、頻出単語の分析、さらには機械学習などの応用分野にも発展させることができます。

たとえば、スクレイピング結果をもとに以下のような応用が考えられます：

:::note warn
**・頻出単語の可視化（ワードクラウドの作成）**
**・新しいデータが追加された際の自動通知システムの構築**
**・スクレイピングデータのリアルタイム分析**
:::

## まとめ
Pythonを使ったスクレイピングは、ウェブページから手軽にデータを取得し、データ分析や自動化の作業を効率化できます。

今回の例ではh3タグを抽出してテキストファイルに書き出す方法を紹介しましたが、他の要素や属性を解析することで、様々なデータを取得できる可能性があります。

## 参考記事

https://www.shtockdata.com/blog/detail01.php
Rubyの`proc`と`lambda`についての学習記録

# Rubyの`proc`と`lambda`についての学習記録

Rubyの開発で役立つ`proc`と`lambda`について理解を深めるため、まずは基本となるブロックから学びました。この記事では、ブロック、`proc`、そして`lambda`の使い方や違いについて整理し、コード例を交えて説明します。

## ブロックとは

ブロックは、メソッドに渡す処理のまとまりを表します。以下の例では、`do...end`の間にある部分がブロックです。

```ruby
users = ["太郎", "花子"]
users.each do |user|
  p "私の名前は" + user + "です"
end
```
do...endの代わりに{ }を使うこともできます。
```ruby
users = ["太郎", "花子"]
users.each { |user| p "私の名前は" + user + "です" }
```

ブロックをメソッドの引数として渡すことで、繰り返し処理などを効率よく書けるようになります。このブロックをオブジェクトとして再利用できるようにしたものが、procやlambdaです。

# 方法1: Procクラスを使う

ブロックをオブジェクトに登録して、再利用可能にするには、Procクラスを使います。Procオブジェクトを作成するには、newメソッドでブロックを指定します。作成したオブジェクトは、callメソッドで実行できます。

# Procクラスの基本

`Proc`オブジェクトの定義
```ruby
name = Proc.new do |f_name, l_name|
  "私の名前は" + f_name + l_name + "です"
end
```

`Proc`オブジェクトの呼び出し
```ruby
introduction = name.call("山田", "太郎")
p introduction # => "私の名前は山田太郎です"
```

{}を使った定義も可能です。
```ruby
name = Proc.new { |f_name, l_name| "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```

# 方法2: procメソッド

Procオブジェクトは、procメソッドを使って簡潔に定義することもできます。procメソッドは、Kernelクラスのメソッドであり、Proc.newの短縮形として利用されます。
```ruby
name = proc do |f_name, l_name|
  "私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```
{}での定義も可能です。
```ruby
name = proc { |f_name, l_name| "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```

# 方法3: lambdaを使う

procに似た方法で、lambdaも使用できます。lambdaは、引数の扱いがprocとは少し異なり、引数の数が一致しない場合にエラーを出すなど、厳密な動作をします。
```ruby
name = lambda do |f_name, l_name|
  "私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```

# 方法4: アロー演算子 ->

lambdaはアロー演算子（->）で簡潔に記述できます。この場合、引数はブロックの前に()で指定します。

```ruby
name = -> (f_name, l_name) do
  "私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```

また、{}での定義も可能です。
```ruby
name = -> (f_name, l_name) { "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
```

### procとlambdaの違い

:::note info
引数の扱い: procは引数の数に柔軟ですが、lambdaは厳密です。例えば、lambdaでは引数が一致しないとエラーになります。
:::
:::note info
returnの動作: proc内でreturnを使うと、メソッド全体から抜けますが、lambdaではreturnが呼び出し元に戻ります。
:::





# まとめ

procとlambdaを使うことで、ブロックをオブジェクトとして管理し、コードの再利用性を高めることができます。これにより、より効率的でメンテナンス性の高いプログラムを作ることが可能です。
ページングして Entra ID の全サインインログを取得する MS Graph PowerShell スクリプト

# 本文

備忘がてら投稿しておきます。

~~~
# Microsoft Graph PowerShell モジュールのインストール
Install-Module Microsoft.Graph -Scope CurrentUser

# Microsoft Graph にサインイン
Connect-MgGraph -Scopes "AuditLog.Read.All"

# 初期設定
$allSignInLogs = @()
$top = 1000
$nextLink = "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$top=$top"

# ページングしてサインインログを取得
do {
    $response = Invoke-MgGraphRequest -Uri $nextLink -Method Get
    $allSignInLogs += $response.value
    $nextLink = $response.'@odata.nextLink'
} while ($null -ne $nextLink)

# ログを CSV ファイルにエクスポート
$allSignInLogs | Export-Csv -Path "PATH" -NoTypeInformation
~~~


# 補足

以下でも実現できるかもしれません
~~~
Import-Module Microsoft.Graph.Reports
Get-MgAuditLogSignIn
~~~

参考情報：[Get-MgAuditLogSignIn](https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.reports/get-mgauditlogsignin?view=graph-powershell-1.0)

GUI だと 100,000 件の取得上限があります

>ダウンロードを試みるデータ セットが大規模な場合、Microsoft Entra 管理センターのダウンロード サービスがタイムアウトになります。 一般に、監査ログでは 250,000 件未満のデータ セット、サインイン ログとプロビジョニング ログでは 100,000 件未満のデータ セットが、ブラウザーのダウンロード機能で適切に機能します。
ブラウザーで大量のダウンロードの実行に問題が発生した場合は、レポート API を使用 してデータをダウンロードするか、診断設定を使用してログをエンドポイントに送信します。

参考情報：[Microsoft Entra ID でログをダウンロードする方法](https://learn.microsoft.com/ja-jp/entra/identity/monitoring-health/howto-download-logs)
sympyのBeamを調べた。(追加)MathematicaのLaplace変換で

・タイトルを変更予定です。

# Doc

https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html

# sympyで
### 片持ち梁(cantilever beam)
#### 集中荷重
・操作が逆のような気もします。一般解の微分から,戻って積分です。
```python
# ver0.1
from sympy import *
var("E,I,w,P,l,x")
myEIw   =Rational(1,6)*P*(l-x)**3+Rational(1,2)*P*l**2*x-Rational(1,6)*P*l**3
myEIw_d1=diff(myEIw,x)
myEIw_d2=diff(myEIw,x,2)
print("#",myEIw)
print("#",myEIw_d1)
print("#",myEIw_d2)
print("#", integrate(integrate(myEIw_d2,x),x))
print("#",(integrate(integrate(myEIw_d2,x),x)-myEIw).simplify())
# -P*l**3/6 + P*l**2*x/2 + P*(l - x)**3/6
# P*l**2/2 - P*(l - x)**2/2
# P*(l - x)
# P*l*x**2/2 - P*x**3/6
# 0
```
・二重積分の部分を修正。
```python
# ver0.2
from sympy import *
var("E,I,w,P,l,x")
myEIw   =Rational(1,6)*P*(l-x)**3+Rational(1,2)*P*l**2*x-Rational(1,6)*P*l**3
myEIw_d1=diff(myEIw,x)
myEIw_d2=diff(myEIw,x,2)
print("#",myEIw)
print("#",myEIw_d1)
print("#",myEIw_d2)
print("#", integrate( myEIw_d2,(x,0,x)        ) )
print("#", integrate( myEIw_d2,(x,0,x),(x,0,x)) )
print("#",(integrate( myEIw_d2,(x,0,x),(x,0,x))-myEIw).simplify())
# -P*l**3/6 + P*l**2*x/2 + P*(l - x)**3/6
# P*l**2/2 - P*(l - x)**2/2
# P*(l - x)
# P*l*x - P*x**2/2
# P*l*x**2/2 - P*x**3/6
# 0
```
・仮想仕事の原理 で
【構造力学】一級項目別解説⑩「はり・ラーメンの変位（仮想仕事の原理）」〈確実に1点取る〉 【一級建築士試験】
10:35 13:14
https://youtu.be/jIk9uBtkM60?t=635
```python
# ver0.3
from sympy import *
var("E,I,P,l,x")
M    =-P*x
M_Bar=M.subs({P:1})
print("#",1/(E*I)*integrate( M*M_Bar,(x,0,l)))
# P*l**3/(3*E*I)
```
・(作業中)
```python
# ver0.4


```

**以下勉強中**
#### 等分布荷重

# 両端固定梁
#### 集中荷重

#### 等分布荷重


# (追加)Mathematicaの ラプラス変換で
### 片持ち梁(cantilever beam)
#### 集中荷重
```
LaplaceTransform[EI Y''[x] == -(-P*(l - x)), x, s] /. {Y[0] -> 0, 
   Y'[0] -> 0};
Solve[%, LaplaceTransform[Y[x], x, s]];
Expand[InverseLaplaceTransform[%, s, x]];
% //. {x_} :> x /. x -> l
D[%% //. {x_} :> x, x] /. x -> l
```
OUt
```
Y[l] -> (l^3 P)/(3 EI)
Derivative[1][Y][l] -> (l^2 P)/(2 EI)
```

# 両端固定梁
#### XXX できませんでした。ディラックのデルタ関数。集中荷重
```
LaplaceTransform[EI Y''''[x] == P*DiracDelta[l/2]] /. {Y[0] -> 0, 
   Y'[0] -> 0, Y[l] -> 0, Y'[l] -> 0};
Solve[%, LaplaceTransform[Y[x], x, s]];
Expand[InverseLaplaceTransform[%, s, x]];
% //. {x_} :> x /. x -> l
D[%% //. {x_} :> x, x] /. x -> l
```

# いつものリンク? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うリンクのおすすめです。
「弘前大学 Home Sweet Home - 弘大ホーム」様

https://home.hirosaki-u.ac.jp/relativity/%e7%90%86%e5%b7%a5%e7%b3%bb%e3%81%ae%e6%95%b0%e5%ad%a6c/sympy-%e3%81%a7%e7%90%86%e5%b7%a5%e7%b3%bb%e3%81%ae%e6%95%b0%e5%ad%a6c/

「構造と連続体の力学基礎を独習する」様　

http://mechanics.civil.tohoku.ac.jp/bear/nisikozo/s1node20.html#SECTION014420000000000000000

「構造力学II」様

＞・単位荷重法（単純梁）＜ 構造力学II第14回　＜ 構造力学II　Youtubeあり

https://www.str.ce.akita-u.ac.jp/~gotou/kouzou/kouzou2_14.html#tantan
【基本情報】独学マラソン バックアップ Day 24

事実に対してどうするのか　主観を排除

:::note worn
この記事は自分用の備忘録です。
:::

gitを使っていればあまり気にならないけれど

wordpressの案件はgit管理していないパターンも多いので

バックアップを忘れると寿命が縮んでしまう

長生きするために、バックアップの勉強をするよ

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/7003725a-1eac-9d7c-7efd-493da4dd597a.png)

# バックアップは4種類！

(1) **フルバックアップ**
全てのデータをバックアップする方法。
シンプルでわかりやすいが、時間と容量を多く消費する。

<br>

(2) **差分バックアップ**
最後の「フル」バックアップ以降に変更されたデータをバックアップする方法。
フルバックアップの時間と手間を削減できるが、データの増加に伴い時間がかかる場合がある。

<br>

(3) **増分バックアップ**
最後のバックアップ以降に変更されたデータをバックアップする方法。
増分が増えてきたら、途中でフルバックアップを入れる。
バックアップ時間が短く、容量も節約できるが、リストア時に手間がかかる。

<br>

(4) **永久増分バックアップ**
最初のフルバックアップ以降、全ての変更を順次バックアップする方法。
増分が増えてきても一切フルバックアップをしない。
データ量は抑えられるが、リストアの複雑さが増す。

## どう使い分ける？

### フルバックアップ
- サーバー移行時やサイト全体の保全が必要なとき。
- WordPressのプラグインでよく使うAll in One WP Migration

### 差分バックアップ
- 週1回のフルバックアップと組み合わせて、週中のバックアップに使う場合。


### 増分バックアップ
- 毎日の小規模な変更やアップデートに対応する場合。
- イメージはGitに近い

### 永久増分バックアップ
- 重要なデータの保全が必要な場合やデータセンターでの長期保存時。


## それぞれのメリット・デメリット

| バックアップの種類 | メリット                       | デメリット                     |
|--------------------|--------------------------------|--------------------------------|
| フルバックアップ   | 確実で信頼性が高い             | 時間とストレージ消費が多い     |
| 差分バックアップ   | データ復旧が簡単               | データ変更量に応じて時間が延びる|
| 増分バックアップ   | 処理が速く、ストレージ消費が少ない| リストア時に手間がかかる       |
| 永久増分バックアップ| ストレージ使用量が最小限       | データ復旧が非常に複雑        |


# 大事なこと
### データの可用性
いつでも必要なときにデータが利用できる状態を保つこと
- 更新頻度が多いデータは短いスパンでバックアップを取る必要がある
- 3-2-1ルールに基づいて、2つを異なるメディアに、1つはオフサイトに保管すると良い
- 自動化してヒューマンエラーを防ぐ

### 復旧の確実性
万が一のトラブル時に、バックアップデータを確実に復元できること
- 定期的に復旧テストを行う必要がある
- バックアップの手法をデータ量などに応じて適切に選ぶ
- 暗号化やアクセス制限などで機密性を確保する

# 感想
何か失くしても「まぁいっかー！死なない死なない！」と気楽に生きてきた人生
エンジニアとしてこれではまずいので猛省することにする


# 参考

https://www.networld.co.jp/solution/learn_first/backup/1st/01_basis/05_type/
質問に答えるスキル

戒めと備忘録のために書きます。
「ここは違うんじゃない？」などありましたらコメントください。
# 質問に答えられていますか？
私は答えられていないことが多いです。以下で例を出していきます。

# 聞かれたことに答えていない例
例：あなたは上司から、今取り組んでいる案件の進捗について聞かれています。
**上司「作業１って終わった？」**

こうやって文面で見ると **「終わりました/終わっていません」** を答えればいい話だとわかります。

ところが実際に喋っていると、脳はいらないことを考え始めます。
**「（上司は多分案件が締め切り通りに終わるかどうかを気にしてるんだろうな）」
「（え、まだ全然途中なんだけどこれってもう終わってなきゃまずい作業なのかな）」**
そうして、いらないことを答えます。
**「締め切りまでには案件終わらせられると思います」
「作業1ってそんなに簡単な作業ですか？」
上司「いやだから、作業1が終わったかを聞いてるんだけど」**

「1から10を全部くみ取って先に回答して」という了解事項が上司とあなたの間にあるなら話は別ですが、普通そんなことはないでしょう（というかミスコミュニケーションのもとなのであまりよくないと思います）。
雑談で意味の取り違えがあったとしてもすぐ修正すれば済む話ですが、エンジニア同士で意味の取り違えがあるとそれはバグの元です。そうなると「すぐ修正」では済みません。そういうわけで、「なんとなくの質疑」をしないことが重要です。 
+αで答えてはいけないわけではないですが、聞かれた内容に答えていることはMUSTです。

:::note info
日常生活のコミュニケーションでは「なんとなく」で話した方が円滑に進む場合もたくさんあります。また話す相手の指針や性格によってももちろん異なります。場面によって切り替えるのが大切ですね。
:::

# 質問に答えるには
じゃあどうしたらいいの？という話です。
## YESNOクエスチョンには、「はい」「いいえ」「わかりません」で答える。
**例：「作業1って終わってるの？」**

**NG:「取り組んではいるんですがこういうところでトラブり～」**
**OK：終わっている場合→「はい」
OK：終わっていない場合→「いいえ」
OK：終わっているのか自分では判断できない場合→「わかりません」**

**答えの理由や補足は後から聞かれたら言えばいいんです。** 欲しい情報が不足しているなら相手が追加で質問してくれます。
※不足していた部分は次同様の質問をされた際には言えるようにしておくとbetter。

## 質問の意味がよくわからないときは確認する
**例：「作業1ってどんな感じ？」**
これ、漠然としてますよね。そもそも質問としてあまりよくないとは思いますが一旦考えてみましょう。
**NG：「（進捗を聞いてるのかな）終わってます」**
これは仮説をもとに答えていますね。もしこの質問が作業1で作った製品の質について聞いているものだった場合、「そうじゃなくて…」という時間が入ります。あるいは上司が「（製品の質が）終わってる」と勘違いした場合大変なことになります。
**OK：「それって作業が終了しているのかってことで合ってますか？」**
**OK：「すみません、どんな感じってどういう意味ですか？」**
物分かりが悪いと思われたっていいんです。最初に前提をすり合わせてからコミュニケーションした方が効率的です。
「仮説を確かめて曖昧さをなくす」、または「そもそもの質問の曖昧さをなくす」ようにしなければいけません。


## 確実な根拠をもって答える
**例：「作業1って○○を扱ってるみたいだけど、これって△△には影響ないの？」**

**NG：「（あー、わかんないけど前に同様の事例あった気がするなー。その時は影響なかった気がするんだよな）多分影響ないです」**
**NG：「（今回どうかは試してないけど、普通に考えたら影響ないよな）多分影響ないです」**

不確実な根拠をもとにする回答にはあまり意味がありません。調べ直したら全然違う話だったとなったら報告内容を訂正する必要がありますし、仮に正しかったとしても「正しかったです」という報告をする必要が生じます。

**OK：「現状お答えできないので持ち帰ります」**
素直に持ち帰りましょう。補足したいのであればそのあとに「同様の事例知ってるのであたります」としましょう。
**「部分的にわかる」ことと「部分的にわからない」ことが両立している場合は、「部分的にわからない」を優先しましょう。**

## すぐに答えようとするのをやめる
**例：「作業1って終わった？」**

**NG：「（どうだったっけな）えーっと、工程1と工程2は終了していて、工程3は今確認頂いていて…」**

答えになっていないですね。多分この人は喋りながら考えて思い出しているのでしょうが、この思い出す過程での言葉は相手にとって意味をなさない情報なのでかえって理解を妨げています。
考えることは悪くないです。考えながらしゃべっているせいで、質問の答えになっていないことが悪いんです。
**OK：「確認するのでちょっと待ってください」**
少し時間をもらいましょう。すぐに答える不確実な情報より、時間をおいて出された正しい情報の方が価値があります。
数十秒程度の沈黙なら相手は待ってくれますし、5分かかるなら「5分ください」と言えばいいだけの話です。**黙っている時間が長いかどうかを判断するのは相手です。** 長いと思ったらそう言ってもらえますし、じゃあ今度にしようとなるだけの話かもしれませんから、黙ることを伝えてから安心して黙りましょう。

 ## 回答が長くなる場合事前に文面で渡す
 **例：「プロジェクトAの進捗を報告して」
 NG：「計画の日数がこのようになっていて、実際の進行状況がこうなっています。現在直面しているトラブルがこれで…」**
 もともと予定を取ってあって、資料を共有しているプレゼンなら別です。でもパッと聞かれてこれを口頭で答えられたとして、**覚えられますか？無理ですよね。** 答えている側も何を言ったか忘れます。そうなると、 **「よく覚えられなかったけどなんか大丈夫そうだからヨシ！」** という判断になります。危険ですね。

 **一言で答えられる内容でない限り口頭での返答を覚えることはできない**と思った方がいいです。文面を用意しましょう。凝った資料である必要はなく、ドキュメントベタ打ちでok。とにかく視覚的に把握できるものがあることが重要。
「その場で言われたって文面用意できないのでは？」と思ったら「パッとお答えできないので後で文面でお送りする形でいいですか？」と聞けばいいし、オンラインミーティングならその場でドキュメントを画面共有して打っていくのもありです。覚えられないことを長々喋るより相手にとっても建設的です。

# 終わりに
基本すぎると思われた方もいらっしゃるかもしれません。
相手による・場面によるというのも全くその通りですので、うまいこと脳を切り替えて使い分けていきたいものです。
Ubuntu環境でのFirefox導入ガイド - Chrome SIGILL エラーの対処法

# Ubuntu環境でのFirefox導入ガイド - Chrome SIGILL エラーの対処法

## はじめに
リモートデスクトップでUbuntu環境を使用中、Google Chromeで`SIGILL`エラーが発生した場合の代替ソリューションとして、Firefoxを導入する手順をまとめました。この記事では、管理者権限（sudo）が使用できない環境での対処方法を説明します。

実際、リモートデスクトップで接続して、JupyterLabを起動するとこのエラーに遭遇しました。SSH接続で、自分のPC側でJupyterLabを立ち上げれば問題は発生しませんでした。

## 環境
- OS: Ubuntu
- アクセス方法: SSH接続
- 制約条件: 管理者権限なし

## ChromeのSIGILLエラーについて
SIGILLエラーは、プロセッサーが認識できない不正な命令を実行しようとした際に発生します。SSH接続環境でのChrome使用時に頻繁に発生する可能性があります。

## Firefoxのインストール手順

### 1. Firefoxのダウンロードと解凍
```bash
cd ~/Downloads
tar xjf firefox-131.0.3.tar.bz2
cd firefox
```


### 2. 起動時の問題と対処

**最初のエラー**
```bash
./firefox
Error: cannot open display: :0
```

**ディスプレイ設定の確認**
```bash
echo $DISPLAY
export DISPLAY=:0.0
```

**X serverの状態確認**
```bash
ps aux | grep X
```

**正しいディスプレイ設定**
実行結果から、Xorgサーバーが`:10`で動作していることが判明したため、以下の設定を行います：
```bash
export DISPLAY=:10
```

### 3. Firefox起動
```bash
./firefox
```

## トラブルシューティング

### よくあるエラーと対処法

**1. display errorの場合**
```bash
Error: cannot open display: :0
```
- 対処法：`ps aux | grep X`でXorgサーバーの番号を確認し、正しいDISPLAY変数を設定

**2. コマンドが見つからない場合**
```bash
bash: firefox: コマンドが見つかりません
```
- 対処法：正しいディレクトリに移動してから実行

## 注意点
- 管理者権限がない環境では、システム全体にインストールせず、ユーザーディレクトリで実行する
- ディスプレイ設定は環境によって異なる場合があるため、必ず`ps aux | grep X`で確認
- セッションごとに`DISPLAY`変数の設定が必要な場合がある

## まとめ
Chrome SIGILL エラーの代替策として、Firefoxは有効なソリューションとなります。管理者権限がない環境でも、適切な手順で導入・実行が可能です。

## 参考情報
- [Firefox公式ダウンロードページ](https://www.mozilla.org/en-US/firefox/linux/)

*この記事は2024年10月24日時点の情報に基づいています。*
競技プログラミングにおけるコミットメッセージの書き方

## はじめに

先日以下の記事を見つけました。

https://qiita.com/itosho/items/9565c6ad2ffc24c09364

この記事を読んで、「確かに、このように書けば後から見る人が読みやすくなるな」と感じました。同時に、「競技プログラミングの場合は、この記事の内容が当てはまらない部分もあるから、別の方法を考える必要があるな」とも思い、自分なりに考えてみました。

## ターゲット

* 競技プログラミングを始めたばかりの人
* コミットメッセージに悩んでいる人
* 過去のコミットを探すのに苦労したことがある人

## 前置き

:::note
このコミットメッセージのルールは、コンテスト中ではなく、精進（練習や復習）時の実装を想定しています。
:::

## 結論

```
[judge_status]: [contest_name] [number] [title]
```

```: 例
AC: ABC 376 D - Cycle
```

ぼくが考えたコミットメッセージの形式はこれです。以下に各項目について説明します。

### judge_status: ジャッジステータス

まず最初に入れるのは「ジャッジステータス」です。ジャッジステータスとは、提出したプログラムがジャッジシステムによりどのように評価されたかを示すものです。詳しくは[こちら](https://atcoder.jp/contests/abc074/glossary?lang=ja)をご参照ください。

* AC (Accepted): 正答です。運営が用意したテストを全てパスし、正しいプログラムであると判定されました
* WA (Wrong Answer): 誤答です。提出したプログラムの出力は正しくありません
* TLE (Time Limit Exceeded): 問題で指定された実行時間以内にプログラムが終了しませんでした

上記が一般的なジャッジステータスです。これ以外にもいくつかステータスがありますので、その都度適切なものを使い分けてください。今回の例では、`AC` がこの部分に該当します。

### contest_name: コンテスト名

次に「コンテスト名」を記載します。コンテスト名は、AtCoderのABCやARCのように略語で書くと短く読みやすくなります。今回の例では、`ABC` がこの部分に該当します。

### number: コンテスト番号

「コンテスト番号」はそのコンテストに付与された番号です。今回の例では、`376` がコンテスト番号です。

### title: タイトル

「タイトル」は、問題の正式なタイトルを記載します。今回の例では、`D - Cycle` がタイトルです。

## おわりに

競技プログラミングのコミットメッセージは基本的に自分用なので、**正直そこまでこだわる必要はありません**。しかし、こだわって書くことで、自分にとって標準的な作法が身に付き、それが現場でも役立つようになります。自分用の環境で現場を意識した技術を試すことは、将来的なスキルアップに繋がる重要なステップです。

## 参考記事

https://qiita.com/itosho/items/9565c6ad2ffc24c09364

https://zenn.dev/itosho/articles/git-commit-message-2023

https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e
Ruby on Rails＆EC2,RDS使いのエンジニアがLambda,APIGateWay,DynamoDBに挑む！！

# この記事の目的
rubyやPHPでの開発経験やAWSのEC2、RDSの知見を活かして、AWSのLambda,APIGateway,DynamoDBをざっくりと理解する（例ではRuby on Railsで解説）

# こんな方に読んでほしい
- RubyやPHPで開発を経験を積んでいるとインフラはAWSの「EC2,RDS」を使用するケースが多い
- 今回、初めてAWSの「Lambda,APIGateWay,DynamoDB」を活用する事になった
- まだエンジニアの経験が浅い為、新しい知識や技術を理解するまで時間がかかる 


無駄な前置きはなしにして、結論から！

# 経験値はこう置き換る
- APIGateWay = Ruby on Railsで言う所のroute.rb
- Lambda = Ruby on Railsで言う所のController(〇〇controller.rb)
- DynamoDB = schema.rb

これだけだとちょっとざっくりしすぎているので、ちょっとだけ深堀りしてみます。

# ざっくり深堀
- APIGateWay = 読んで字のごとくAPI（バックエンドの処理の入り口）
Ruby on Railsで言う所のroute.rbですね。Railsをご存じであればGET,POST,PUT,DELETなどのメソッドを定義して、それに紐づくURLが作成されるかと思います。

```
$ rake routes
```

ここで生成されるメソッド（GET,POSTなど）とURLがAWSのAPIGatewayで作成できる！といったイメージでしょうか。
- Lambda =APIGatewayで紐づけ＆呼び出されて処理実行！
Ruby on Railsで言う所のController(〇〇controller.rb)は以下のコマンドで作成されます。

```
$ rails g controller Users home
```

上記コマンドなどで作成されたControllerには「index」の場合の処理、「post」などの処理の【中身】を記述していくかと思いますが、Lambdaにも同様の働きがあります。（これはLambda関数内に定義します。）

- DynamoDB ＝ データベースを格納する倉庫！
これは置き換えるまでもなく分かりやすいかと思いますが、切っても切り離せないので燃ため。
Ruby on Railsで言う所のschema.rbに近い存在かと思います。

```
rails g migration add_column_to_User
```

Railsではのmigrationファイルにデータベースの中身（カラム名やデータ型の定義）をしていくかと思いますが、DynamoDBでも似たような働きをします。


## 終わりに
今回はあくまで簡単な理解の入り口となればと思い記事にしました。
もっと細かな解説をしてほしい！や、いやいや！もうちょっとこういう違いがあるよ！などお気づきの点などあればお気軽にコメントお願いします。

## エンジニア募集中
経験が浅くてもいろんなことにチャレンジしたい！そんなエンジニアを募集中です。
SSDとHDDの違いと特徴


## はじめに
1日1項目1時間学ぼうの会
今回学んだ内容は**SSDとHDDの違いと特徴について**です。

## 構造の違い
- SSD
フラッシュメモリを使用する半導体記録装置
可動部分がなく、電気的にデータを読み書きする。
<br>

- HDD
磁気ディスクにデータを保存し、高速回転するプラッタに磁気ヘッドと呼ばれる部品を近づけ、データを読み書きする。
機械的な可動部分が多い。

## 速度

- SSD
高速な読み書きが可能（起動やデータ転送が速い）
実業務で言えばファイルを開く時間やコピーする時間が短くなる。
<br>

- HDD
ランダムアクセスの場合はSSDよりも読み書きの速度は遅い。
ディスクの回転速度によって性能が異なる。

## 耐久性と耐衝撃性

- SSD
可動部分がないため、落下や衝撃に強い。
使用回数に応じて劣化する。
<br>

- HDD
可動部分が多く、落下や衝撃に弱い。
長時間の使用や不適切な取り扱いで故障のリスクがある。

## 容量と価格
- SSD
GBあたりの単価が高い。
昔と比べると価格は安くはなってきている。
<br>

- HDD
容量あたりのコストが安い。
大容量モデル（4TB以上）が豊富で、バックアップやアーカイブ用途に適している。

## 消費電力
- SSD
消費電力も少なく、発熱も少ない。
バッテリー駆動のノートPCに適している。
<br>

- HDD
モーターの駆動が必要なため消費電力が多い。
長時間使用で発熱しやすい。

## 用途と適用分野
- SSD
OSやアプリケーションのインストール、ゲームの起動、動画編集など高速性が求められる場面に最適。
<br>

- HDD
大容量のデータ保存やバックアップ、アーカイブ目的に適している。
NAS（ネットワーク接続ストレージ）やデスクトップPCなど。


## SDとHDDを併用するメリット・デメリット
同じコンピューターに搭載可能
それぞれの特徴を知っておくことで適切な使い方ができる。
併用するメリット・デメリットを学んでいく。

### メリット
- コストパフォーマンスの向上
SSDはOSやアプリケーションのインストールに使用し、HDDを大容量のデータ保存用に使うことで、高速性と大容量をバランス良く実現できる。
<br>

- パフォーマンスの最適化
SSDの高速読み書きを活かし、PCの起動時間やアプリの立ち上げを高速化。
HDDは写真、動画、音楽、バックアップデータなど、高速性を必要としない大容量データの保管に適する。
<br>


- 耐久性と寿命のバランス
SSDの書き込み寿命（寿命に限りがある）を考慮し、大量の書き込みが必要なデータはHDDに保存することでSSDの劣化を抑えられます。
<br>


- 柔軟なストレージ管理
SSDをシステムドライブ（Cドライブ）に、HDDをデータ用ドライブ（Dドライブなど）に分けることで、用途に応じてストレージを管理しやすくなります。


### デメリット
- 管理の手間が増える
データをSSDとHDDに分けて保存するため、どのデータをどちらに保存するかの管理が必要になります。
複数のドライブの使用に慣れていないと、ストレージの使い分けに戸惑う場合があります。
<br>

- データ移行の手間
SSDとHDDの間でファイルの移動やバックアップ作業を行う必要があり、運用に少し手間がかかる可能性があります。
<br>

- ノートPCの場合は選択肢が限られる
ノートPCでは1つのストレージしか搭載できないモデルが多く、SSDとHDDの両方を併用するには外付けHDDを使う必要があります。

## 参考
https://www.buffalo.jp/topics/select/detail/ssdhdd.html

https://hodagori.com/hdd-ssd/

https://hddhakai.jp/adm/column/%E3%83%87%E3%83%BC%E3%82%BF%E4%BF%9D%E5%AD%98%E3%81%AFssd%E3%81%A8hdd%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%8C%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%EF%BC%81%E4%BD%B5%E7%94%A8%E3%81%99/
Amazon Bedrock Knowledge base deletion error

BedrockのKnowledge baseを削除する時，先に依存サービスを削除すると，Knowledge baseの削除に失敗します。
その対応法です。

# 1.現象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/5cbfef7a-a0d3-6de0-2a82-86e363284f62.png)

こんな感じでdeleteに失敗しています。

# 2.対応

Knowledge baseのリンクをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/9ec3a3a7-f19c-ef5b-04af-4ecbd66f4fc7.png)

Data sourceのリンクをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/57530443-7000-3420-f7e9-e24157e0f47b.png)

Data sourceのData deletion policyがDELETEになっているはずです。
Editをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/43c66605-063c-07ee-6553-3e28685d1d04.png)

Advanced settingsを展開して，Data deletion policyをRetainに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/01119ec6-3a86-9bbb-1206-5175bbeeca62.png)

これで正常に削除できるようになります。

# 3. 参考情報

[How do I resolve the “Failed to delete knowledge base” error in Amazon Bedrock?](
https://repost.aws/knowledge-center/bedrock-delete-knowledge-base-error)
Evaluating LLMs at Detecting Errors in LLM Responses

Ryo Kamoi, Sarkar Snigdha Sarathi Das, Renze Lou, Jihyun Janice
Ahn, Yilun Zhao, Xiaoxin Lu, Nan Zhang, Yusen Zhang, Ranran
Haoran Zhang, Sujeeth Reddy Vummanthala, Salika Dave, Shaobo
Qin, Arman Cohan, Wenpeng Yin, Rui Zhang. (2024) ”Evaluating
LLMs at Detecting Errors in LLM Responses” COLM 2024
• Ryo Kamoi, Yusen Zhang, Nan Zhang, Jiawei Han, Rui Zhang. (2024)
“When Can LLMs Actually Correct Their Own Mistakes? A Critical
Survey of Self-Correction of LLMs“ TACL 2024 (to appear)

• OpenAI (2024) “Learning to Reason with LLMs” https://openai.com/index/learning-to-reason-with-llms/ アクセス日: 2024/10/11
• Chan et al. (2024) “MLE-bench: Evaluating Machine Learning Agents on Machine Learning Engineering”
• Codeforces Round 304 (Div. 2) E. Soldier and Traveling https://codeforces.com/contest/546/problem/E
• OpenAI (2024) “How reasoning works” https://platform.openai.com/docs/guides/reasoning/how-reasoning-works アクセス日: 2024/10/11
• Kamoi et al. (TACL 2024) “When Can LLMs Actually Correct Their Own Mistakes? A Critical Survey of Self-Correction of LLMs”
• Kamoi et al. (COLM 2024) ”Evaluating LLMs at Detecting Errors in LLM Responses”
• Wang et al. (ICLR 2023) “Self-Consistency Improves Chain of Thought Reasoning in Language Models”
• Zhang et al. (ICML 2023) “Coder Reviewer Reranking for Code Generation”
• Weng et al. (EMNLP 2023 Findings) “Large Language Models are Better Reasoners with Self-Verification”
• Madaan et al. (NeurIPS 2023) ”Self-Refine: Iterative Refinement with Self-Feedback”
• Tyen et al. (ACL 2024 Findings) “LLMs cannot find reasoning errors, but can correct them given the error location”
• Huang et al. (ICLR 2024) “Large Language Models Cannot Self-Correct Reasoning Yet”
• Shinn et al. (NeurIPS 2023) “Reflexion: Language Agents with Verbal Reinforcement Learning”
• Gao et al. (ACL 2023) “RARR: Researching and Revising What Language Models Say, Using Language Models”
• Yao et al. (NeurIPS 2024) “Tree of Thoughts: Deliberate Problem Solving with Large Language Models”
• Dhuliawala et al. (ACL 2024 Findings) “Chain-of-Verification Reduces Hallucination in Large Language Models”
• Cobbe et al. (2021) “Training Verifiers to Solve Math Word Problems”
• Akyürek et al. (ACL 2023) “RL4F: Generating Natural Language Feedback with Reinforcement Learning for Repairing Model Outputs”
• Kumar et al. (2024) “Training Language Models to Self-Correct via Reinforcement Learning”
• Liang et al. (2024) “Improving LLM Reasoning through Scaling Inference Computation with Collaborative Verification”
• X Post by Schmid (2024) アクセス日: 2024/10/13
• Zhong et al. (2024) “Evaluation of OpenAI o1: Opportunities and Challenges of AGI”
【UI Toolkit】備忘録

## はじめに

UIToolkitを触り始めたばかり。その過程で躓いた点などを記載する。
この備忘録が誰かの役に立てば幸いです。

## 環境
Unity2022.3.33f1

## 備忘録

### style.visibilityはnullで親と同じになる
uGUIと同じで、親を無効にすれば子も同じになる。
その操作をプログラム側から行った場合、親だけ変更する場合はその動作になるが、
親を無効
子を有効
と別々に設定した場合、有効にした子だけが表示される。

visibility以外も、設定が無ければ基本nullなので、表示中か判定したい場合は表示する設定をしておく必要があったりする。

### ScrollViewの要素増減でScrollerのhighValueが変動しない場合
ScrollViewの要素をClear()した後に、次の要素を追加した場合、スクロールバーのhighValueが元のClear()前の数値のままになることがあった。

↓似たような現象の話は下記にもあったが、これでは解決しなかった。<p>
(理解度が足りなかっただけかも)
</p>
https://discussions.unity.com/t/make-baseslider-sethighvaluewithoutnotify-public/947241

再計算してくれないのが問題だったので、ゴリ押し気味に下記の対応を行った。

```
(ScrollViewの要素).contentViewport.style.display = DisplayStyle.None;
(1F待ち)
(ScrollViewの要素).contentViewport.style.display = DisplayStyle.Flex;
(1F待ち)
```
一旦、要素の親を非表示にして、再表示すると再計算が行われ、highValueが正しい数値になった。

### uGUIのImageなどにあるRaycastTarget的な設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918246/cbca2112-6654-63b6-9b0a-a8a95b34f7d6.png)
PickingModeをIgnoreにする。
これで後ろの項目もクリック出来る！

### FontAssetの作り方はTextMeshProとほぼ同じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918246/9152d496-59cf-34ec-9bc8-ab2a7fe28bd4.png)
Window＞Text＞FontAssetCreator
から作成する。
（TextMeshProからでも同じウィンドウなので間違えないように注意）

生成されるものは、Text経由とTextMeshPro経由で別物。
UIToolkitとuGUIとで使いまわしは出来ない。

## 参考
https://docs.unity3d.com/ja/current/Manual/UIElements.html
rex0220 シェイプ!プラグイン テーブルへの画像添付

テーブルの添付ファイルへ、シェイプ!プラグインで作成した画像を添付してみます。

# 概要

シェイプ!プラグインで作成した画像をテーブルの添付ファイル項目へドラッグ＆ドロップで添付することができます。
画像をドラッグしやすいように、横並びプラグインでテーブルの横にスペースを配置します。

![2024-10-24_19h12_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cb4eb2cd-ba23-9866-781c-e6df2a29f7a7.png)

# 操作例

![2024-10-24_17h32_50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0bf1e8ec-7b6b-d437-f3fd-1375b9fc684f.gif)

# アプリ設定

横並びにするため、テーブルの下にグループを配置します。

- テーブル内に添付ファイル
- グループにスペース項目


![2024-10-24_19h16_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/18775289-8d34-b2df-fb7a-fc4025183bfa.png)

# 横並びプラグイン設定

テーブルとグループにチェックを入れます。

![2024-10-24_19h15_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9b8b7f51-fbf3-9fc3-7701-cae7b44b877e.png)

# シェイプ!プラグイン設定

![2024-10-24_19h20_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ebf90616-03e9-3145-4311-ffd19eae2099.png)
fgdrパッケージで基盤地図情報（数値標高モデル）を一気にgeotiffに変換する

# データのダウンロード
基盤地図情報のダウンロードは1次メッシュ単位で選択することができます。広域を一気に取得したい場合におすすめです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/6d7f35e3-8581-294c-14d2-a3de5ef2c703.png)

ダウンロードしたデータはPackDLMap.zipという形式になっているのでこれを解凍します。解凍してできたディレクトリの中にもさらにzipファイルがたくさん格納されています。最大で70個ぐらいのファイルが格納されています。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/8a09fbe0-43ad-57e4-ce5f-4b81c04afce5.png)

# 一気に解凍する

対象が単一のディレクトリだけならそれほど大変ではないのですが、北海道全域ともなると40以上のディレクトリが処理対象となります。再帰的にunzip処理を施します。

あらかじめ、メタデータの入ったxmlファイルを削除し、その後一気にunzip処理をします。

```shell
# 不要なxmlを削除する
find . -name "*.xml" -delete

# 配下の複数のディレクトリに再帰的にunzipを適用する場合
# その場に出力する場合は -execdir を使う　コマンドの直下のディレクトリの場合は -execを使う
find . -name "*.zip" -execdir unzip -o {} \;
```

# fgdrパッケージを使って一気にgeotiffに変換する

ここからRでの処理になります。
二重for文を回しているだけのシンプルなコードですが、30GBぐらいのメモリがないと落ちます。

```R
# パッケージ読み込み
library(tidyverse)
library(raster)
library(fgdr)

# ディレクトリの一覧を取得
# ただし、配下のディレクトリの中のファイルも取得する
dir <- list.dirs(path = "親ディレクトリのパス", full.names = TRUE, recursive = TRUE)[-1]

## DEMのしゅつりょｋ
#1 ダウンロードして解凍したxmlファイルのリストを作成
for(i in 1:length(dir)) {
  xml <- 
    list.files(path = dir[i], 
               pattern = ".*\\.xml", 
               full.names = T) 
  #2 最初のxmlを読み込み
  dem <- read_fgd_dem(xml[1], resolution = 10 , return_class = "raster")  # 最初のラスタ
  #3 for文でxmlファイルをラスタオブジェクトに変換して結合
  for(j in 2:length(xml) ) {
    dem1 <- read_fgd_dem(xml[j], 
                         resolution = 10 ,
                         return_class = "raster" )
    dem <- merge(dem , dem1, tolerance = 0.5)
  }
  #4  海域=-9999に0を代入
  dem[dem<0] <- 0
  #5 座標系を変換
  dem_utm54 <- projectRaster(dem , crs = CRS("+init=epsg:3100") )
  #6 tiffに出力 -> 元のディレクトリに出力
  writeRaster(dem_utm54,
              paste0(dir[i],"/","DEM_JGD2000utm54.tif"),
              overwrite = T)
}
```

# 参考サイト

開発者のUryu Shinyaさんの[サイト](https://cran.r-project.org/web/packages/fgdr/readme/README.html)を参考にしました。
Pythonの変数基礎

# Pythonの変数基礎

Pythonの変数は、プログラミングの基本的な要素です。
この記事では、Pythonにおける変数の基本的な使い方をクイックに解説します。

## 1. 型宣言不要

Pythonでは変数の型を事前に宣言する必要がありません。  
変数はどのような種類の値でも扱うことができます。同じ変数に異なる型の値を代入することも可能です。

```python
name = "Python"  # 文字列型
age = 25        # 整数型
height = 1.75   # 浮動小数点型

# 同じ変数で異なる型の値を扱える
x = 10
x = "hello"
```

## 2. 変数の利用

変数名をそのまま入力して使用します。変数名は英数字とアンダースコアを使用でき、数字から始めることはできません。

```python
x = 10
print(x)  # 出力: 10

# 正しい変数名の例
user_name = "John"
age1 = 25
_private = "secret"

# 使用できない変数名の例
# 1name = "John"    # 数字から始まる
# my-name = "John"  # ハイフンを含む
# class = "Python"  # 予約語を使用

```

## 3. キャスト（型変換）

値の型を別の型に変換できます。

主な型変換関数：
- `int()`: 整数型に変換
- `float()`: 浮動小数点型に変換
- `str()`: 文字列型に変換

```python
x = 10
y = float(x)    # 整数から小数点へ
print(y)        # 出力: 10.0

z = str(x)      # 整数から文字列へ
print(z)        # 出力: "10"
```

## 4. 型の確認

`type()` 関数を使用して、変数が扱っている値の型を確認できます。

```python
x = 10
print(type(x))  # 出力: <class 'int'>

y = float(x)
print(type(y))  # 出力: <class 'float'>

name = "Python"
print(type(name))  # 出力: <class 'str'>
```

## 5. 複数の変数に同時に代入

Pythonでは複数の変数に一度に値を代入することができます。

```python
a, b, c = 1, 2, 3
x = y = z = 0  # 同じ値を複数の変数に代入
```

## まとめ
- Pythonの変数は型宣言が不要で、値を代入するだけで使用できます
- 型変換は組み込み関数で簡単に行えます
- 変数名には規則があり、適切な命名が重要です
windowsでiverilog その158

# 概要　
windowsでiverilogやってみた。
練習問題やってみた。

# 練習問題
2つのアセンブラプログラムが戦うゲームを魔改造のページのCPUを書け。

https://qiita.com/ohisama@github/items/1c47e4f30f39ac7e09af

# サンプルコード

```

module cpu12(input clk, input rst);
	reg [7:0] acc;
	reg [7:0] adr;
	reg [7:0] pc;
	reg [11:0] mem[31:0];
	reg jpflg;
	wire [11:0] code;
	wire [3:0] opcode;
	wire [7:0] opland;
	assign code = mem[pc];
	assign opcode = code[11:8];
	assign opland = code[7:0];
	task init_mem;
		begin
			mem[0] <= 12'h10A;//ld 10
			mem[1] <= 12'h300;//str
			mem[2] <= 12'h102;//ld 2
			mem[3] <= 12'h500;//stm
			mem[4] <= 12'h200;//ldr
			mem[5] <= 12'h601;//add 1
			mem[6] <= 12'h300;//str
			mem[7] <= 12'h80D;//gt 13
			mem[8] <= 12'h902;//if 2
			mem[9] <= 12'h000;//hlt
		end
	endtask
	task init_reg;
		begin
			acc <= 12'h0;
			adr <= 12'h0;
			pc <= 12'h0;
			jpflg <= 0;
		end
	endtask
	always @(posedge clk, negedge rst)
	begin
		if (!rst)
		begin
			init_mem;
			init_reg;
		end
		else
		begin
			case (opcode)
			4'h0: //hlt
				begin
					jpflg = 1;
					pc <= pc;
				end
			4'h1: //ld
				acc <= opland;
			4'h2: //ldr
				acc <= adr;
			4'h3: //str
				adr <= acc;
			4'h4: //ldm
				acc <= mem[adr];
			4'h5: //stm
				mem[adr] <= acc;
			4'h6: //add
				acc <= acc + opland;
			4'h7: //sub
				acc <= acc - opland;
			4'h8: //gt
				if (acc < opland)
				begin
					acc <= 1;
				end
				else
				begin
					acc <= 0;
				end
			4'h9: //if
				if (acc == 1)
				begin
					jpflg = 1;
					pc <= opland;
				end
			4'ha: //jmp
				begin
					jpflg = 1;
					pc <= opland;
				end
			endcase
			if (jpflg == 0)
				pc <= pc + 1;
			else
				jpflg <= 0;
		end
	end
	initial
	begin
		$display("pc  opcode opland acc  adr");
		$monitor(" %d %d %d %d %d", pc, opcode, opland, acc, adr);
	end
endmodule

module test;
	reg clk,
		rst;
	cpu12 u(.clk(clk), .rst(rst));
	initial
	begin
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#390
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule




```

# 実行結果

```
>vvp a.out
pc  opcode opland acc  adr
   x  x   x   x   x
   0  1  10   0   0
   1  3   0  10   0
   2  1   2  10  10
   3  5   0   2  10
   4  2   0   2  10
   5  6   1  10  10
   6  3   0  11  10
   7  8  13  11  11
   8  9   2   1  11
   2  1   2   1  11
   3  5   0   2  11
   4  2   0   2  11
   5  6   1  11  11
   6  3   0  12  11
   7  8  13  12  12
   8  9   2   1  12
   2  1   2   1  12
   3  5   0   2  12
   4  2   0   2  12
   5  6   1  12  12
   6  3   0  13  12
   7  8  13  13  13
   8  9   2   0  13
   9  0   0   0  13
game.v:112: $finish called at 394 (1s)


```

以上。
Railsマイグレーションの基本：複数カラムの追加と注意点

こんにちは！社会人１年目の初心者エンジニアです。
最近、データベースのスキーマを変更するためにマイグレーションを利用することが多くなりました。
この記事では、テーブルに複数のカラムを追加する方法と、マイグレーションを実行する際の注意点について説明します。

# 1. change_table を使って複数カラムを追加する
新しいカラムを追加する際、change_tableメソッドを使うと、複数のカラムを一度にまとめて追加できます。以下は、employeesテーブルにphone_numberとdepartmentを追加するマイグレーションの例です。
```
class AddColumnsToEmployees < ActiveRecord::Migration[6.0]
  def change
    change_table :employees do |t|
      t.string :phone_number, comment: '電話番号'
      t.string :department, comment: '部署名'
    end
  end
end
```
#### change_tableの利点
- 上記の例のように、change_tableを使うことで、複数のカラムを一度に追加できる
- 複数のカラムをまとめて追加することで、マイグレーションファイルがすっきりする

#### コメントを追加するメリット
- commentオプションを追加することで、以下のメリットがあります
   - データベーススキーマを視覚的に理解しやすくなる
   - データベースを見直す際に、コメントがあるとカラムの役割が明確になり、修正や新規機能の追加がスムーズに行える

コメント追加した際の例が以下になります。
```
t.string :phone_number, comment: '電話番号'
t.string :department, comment: '部署名'
```

# 2. テーブルのカラムを確認する
テーブルのカラムを確認したい場合、以下のコマンドを使用します。
```
ActiveRecord::Base.connection.columns(:確認したいテーブル名).map(&:name)
```
このコマンドを実行することで、テーブルに存在するカラム名のリストを確認できます。

# 3. マイグレーションの取り消し
もし最後に適用したマイグレーションを取り消したい場合、次のコマンドを使用します。
```
rails db:rollback
```
このコマンドを実行することで、最後に適用したマイグレーションが取り消されます。

# 4. マイグレーションファイルの修正に関する注意
一度マイグレーションを実行した後に、マイグレーションファイルを修正して再度rails db:migrateを実行することはできません。一度実行されると、そのマイグレーションはデータベースに適用済みとして記録されるため、修正したファイルは再実行されません。

#### 修正が必要な場合の対応方法
もしマイグレーションファイルを修正する必要が生じた場合、以下の手順を行なってください

1.　修正したいマイグレーションを適用した後であれば、まずrails db:rollbackコマンドを使用して最後のマイグレーションを取り消します
```
rails db:rollback
```
2.　マイグレーションファイルを修正
ロールバックした後、必要な変更をマイグレーションファイルに追加した後、再度マイグレーションを実行する。
```
rails db:migrate
```
# まとめ
Railsのマイグレーションを利用することで、データベースのスキーマを簡単に管理できます。change_tableを使って複数のカラムを一度に追加することができ、効率的に作業を進めることができます。カラムにコメントを追加することで、可読性やメンテナンス性が向上するため、ぜひ活用してみてください。この記事を参考にして、マイグレーションを活用してみてください。
Goのtime.AddDate()で月加算がズレる件の対処方法


## 概要


time.AddDate()で月末の月加算がずれることに気づいた際のメモ


下記の記事がとても参考になりました


[https://tech.mirrativ.stream/entry/2023/10/31/120000](https://tech.mirrativ.stream/entry/2023/10/31/120000)


## 問題点

- time.AddDate()で月末の月加算がずれる
	- 12月末 + 2ヶ月 = 2月末としたいが、3/2や3/3となる

```go
func main() {
	start := time.Date(2023, 12, 31, 0, 0, 0, 0, time.UTC)
	twoMonthLater := start.AddDate(0, 2, 0)

	fmt.Println(twoMonthLater)
}

// 出力: 2024-03-02 00:00:00 +0000 UTC
```


## 解決方法

- 独自に月を加算する関数を作成

```go
// AddMonthsPreservingEndOfMonth は、指定された月数を日付 t に加算します。元の日付が月の末日付近であった場合、は日付の調整を行います。
// 標準の time.AddDate 関数では、月末のない月の処理が行えないためこの関数を作成しました。
// 例えば、1月31日に1ヶ月をtime.AddDateで加算すると、3月3日となりますが、
// この関数では加算後の月の末日（2月の最終日28日または29日）に調整します
//
// 引数:
// - t: 基準の日付
// - months: 加算する月数
//
// 返り値:
// - time.Time: 月を加算した後の新しい日付
func AddMonthsPreservingEndOfMonth(t time.Time, months int) time.Time {
	// 基準日の日付部分を取得
	day := t.Day()

	// 加算後の日付の最終日を取得
	year, month, dayLimit := t.AddDate(0, months+1, -day).Date()

	// 基準日が月末付近だった際の日付の調整
	// 左辺は基準日の日付が30日や31日で加算後の月に30日や31日が存在しない場合に対応するため
	// 右辺は基準日の月の月末が30日で加算後の月の月末が31日の場合に対応するため
	if day > dayLimit || t.Month() != t.AddDate(0, 0, 1).Month() {
		day = dayLimit
	}

	h, m, s := t.Clock()
	return time.Date(year, month, day, h, m, s, t.Nanosecond(), t.Location())
}

func main() {
	start := time.Date(2023, 12, 31, 0, 0, 0, 0, time.UTC)
	twoMonthLater := AddMonthsPreservingEndOfMonth(start, 2)

	fmt.Println(twoMonthLater)
}
// 出力: 2024-02-29 00:00:00 +0000 UTC
```
ローカルリポジトリのリモート元URLを変更する方法

## 1. リモートリポジトリからcloneする
```:コマンド
git clone [cloneするリポジトリのURL]
```
:::note warn
cloneしたリポジトリ名とこれからpushするリポジトリ名が違う場合は
```:コマンド
git clone [cloneするリポジトリのURL] [pushするリポジトリ名]
```
としてリポジトリ名を変えておく。
:::
リモート元URLが正しいか確認しておく。
```:コマンド
$git remote -v
```

```:結果
origin [cloneしたリポジトリのURL] (fetch)
origin [cloneしたリポジトリのURL] (push)
```
git clone で入力したURLと同じであればOK
## 2. リモート元URLの変更
```:コマンド
git remote set-url origin [これからpushするリポジトリのURL]
```
こちらもpushするリポジトリのURLと一致しているか確認する
```:コマンド
$git remote -v
```
```:結果
origin [これからpushするリポジトリのURL] (fetch)
origin [これからpushするリポジトリのURL] (push)
```
git remote set-url origin で入力したURLと同じであればOK
## 3. リモートリポジトリにpush
```:コマンド
$git push origin main
```
GitHubでリポジトリを開いて変更が反映されているか確認する。
ラズベリーパイ samba設定

## やること
ラズパイのローカルディレクトリをwindowsから覗く。編集削除追加できるようにする。



参考

https://toki-blog.com/pi-samba/

## 注意
複数のラズパイをwindowsから同時にsamba接続するときはユーザー名とパスワードを統一したほうが使いやすさは上がります。
windowsは複数ユーザーを使って別のネットワークに同時に接続できません。
同一ユーザーを使えば複数ネットワークに接続できます。

## windows側からsamba設定したラズパイに接続できない場合
samba1.0を使っている場合に設定は合ってるけど接続できない症状が出ました。
→解決法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/ff0f60ef-6a4e-27cd-e4c0-f88c6e135af4.png)

windows側で設定してあげます。 コンパネ → windowsの機能～ → SMB1.0~を有効化します。再起動


## ラズパイ設定
ターミナルで実行
```
sudo apt-get update
sudo apt-get upgrade

sudo apt install samba
```

ラズパイのシステムにユーザー追加。
sambaはラズパイのシステムユーザー名とパスワードを使います。
システムユーザーにpcmainteというユーザーを追加する
```
sudo useradd pcmainte
```
パスワード設定
```
sudo passwd pcmainte
```

----------------------
### pcmainteで他のユーザーのフォルダをsambaで共有したいときの設定。
```
#まず、arisa1 ユーザーと pcmainte ユーザーを同じグループに追加します。
sudo usermod -aG arisa1 pcmainte
#次に、/home/arisa1 フォルダのグループを arisa1 に設定します。
sudo chown -R arisa1:arisa1 /home/arisa1
#その後、グループに対して読み書きアクセスを許可します。
sudo chmod -R 770 /home/arisa1
```
------------------



```
sudo nano /etc/samba/smb.conf
```
次の文言をいれる
```
[pcmainte]
   comment = pcmainte user file space
   path = /home/pcmainte
   valid users = pcmainte
   force user = pcmainte
   guest ok = yes
   create mask = 0666
   directory mask = 0777
   read only = no

```
path pcmainteはユーザー名
force userはユーザ名
guest ok  yesにするとパスワードなしでアクセスできる
read only 読み込み専用か否か

## sambaパスワード設定
```
sudo smbpasswd -a pcmainte 
```
piのパスワード聞かれるので打つ。
どっかにメモっといたほうが良い。

## 有効化
```
sudo smbpasswd -e pcmainte
```


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

## その他操作

### 削除
```
sudo smbpasswd -x arisa4
```

### システムから削除 (必要に応じて)
```
sudo userdel ユーザー名
```

### システムに追加
```
sudo adduser pcmainte
```

### 追加
```
sudo smbpasswd -a admin
```



### ファイルの所有者変更
aiueoにフルコントロールを与える
```
sudo chown -R aiueo:aiueo /mnt/raid1
```




## windows設定
windows資格の方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/4a5b9877-2522-8302-d161-1c9b955e530d.png)

windows資格情報の追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/dd65b8e5-d073-d282-bff9-a29eb85b0a32.png)
Fortify - Discordサーバー荒らし対策Bot!!

## はじめに
Discordの荒らし行為は、多くのサーバー運営者にとって大きな悩みの種です。**Fortify**は、荒らし対策を専門にしたシンプルかつ強力なBotです。本記事では、**Fortify**の導入方法や機能、設定手順について詳しく紹介します。

## Botを導入しよう！
[Botを招待](https://discord.com/oauth2/authorize?client_id=1240964440581603370&permissions=8&scope=bot+applications.commands)

## 目次
1.Fortifyとは？
2.Fortifyの主な機能
3.Fortifyの導入手順
4.Fortifyの活用事例
5.まとめ

## 1. Fortifyとは？
Fortifyは、荒らしやスパム、NSFWリンクの投稿など、Discordサーバーを安全に保つために開発されたBotです。設定は非常にシンプルで、サーバーに導入するだけで即座に監視を開始し、不適切な行動を検出・対応します。

特徴的な点は、導入後すぐに使えるという点で、複雑な設定は必要ありません。特に忙しいサーバー管理者にはぴったりのソリューションです。

## 2. Fortifyの主な機能
**1. スパム対策**
Fortifyは、ユーザーのスパム行為を検出し、自動で警告やタイムアウトを行います。ログも指定したチャンネルに自動送信されます。

**2. Token検知機能**
APIやWebhookのTokenが投稿されると、自動でメッセージを削除し、警告を表示します。Token漏洩のリスクを最小限に抑えるための必須機能です。

**3. NSFWリンク削除機能**
Google APIを利用し、NSFWリンクが投稿された場合にそのリンクを削除します。また、サーバー所有者に直接DMで通知されるので、リアルタイムでの対応が可能です。

**4. シンプルなUIと自動メンテナンス**
設定は不要で、定期的なメンテナンスにより常に最新の状態を保ちます。セキュリティやパフォーマンス向上を意識しているサーバー管理者に最適です。

## 3. Fortifyの導入手順
**1.Fortifyをサーバーに追加**
[こちら](https://discord.com/oauth2/authorize?client_id=1240964440581603370&permissions=8&scope=bot+applications.commands)から導入いただけます

**2.必要な権限を設定**
Fortifyが正しく機能するためには、適切な権限を与える必要があります。

**3.簡単なカスタマイズ**
Fortifyは基本的に初期設定のまま使用できますが、サーバーのニーズに合わせたカスタマイズも可能です。スパムの厳しさなど、細かい調整もできます。

## 4. Fortifyの活用事例
#ケース1: 大規模サーバーでのスパム防止
Fortifyは、数千人規模のサーバーでもスムーズに動作します。スパム行為を自動で検出し、管理者が手を煩わせることなく問題を即座に解決します。

**ケース2: Token漏洩防止**
APIキーやWebhook Tokenが誤って公開された場合、Fortifyが即座にそのメッセージを削除し、被害を最小限に抑えます。管理者への通知も自動で行われるため、迅速な対応が可能です。

**ケース3: NSFWコンテンツの管理**
Google APIを使用して、NSFWコンテンツが含まれるリンクを検出・削除します。これにより、サーバー内の安全性を常に保つことができます。

## 5. まとめ
Fortifyは、Discordサーバーを守るための信頼性の高いBotです。導入が簡単で、複雑な設定なしにサーバーの安全性を確保できるため、幅広いサーバーで活用されています。是非、Fortifyを導入して、安心してサーバー運営を行いましょう！

## Fortifyリンク
**公式サイト：** [リンク](https://authguardbot.github.io/Fortify/)
**Bot招待リンク：** [Botを招待](https://discord.com/oauth2/authorize?client_id=1240964440581603370&permissions=8&scope=bot+applications.commands)
**利用契約：** [利用契約リンク](https://authguardbot.github.io/Fortify/terms.html)
**プライバシーポリシー：** [プライバシーポリシーリンク](https://authguardbot.github.io/Fortify/privacy-policy.html)

**Support：** [サポートサーバー](https://discord.gg/8QT6e27cTY)
効率良く行う、プログラミング勉強方法

chat GPTを主に使った学習方法をまとめましたので参考していってください。
## 目指すべきゴール

・プログラミングでできることがわかる、周りのエンジニアと会話が出来る。
・作りたいとなったら、正しく動作するものを作れる
・一から書こうと思えば、書ける
・chatGPTが出してきたものを審査できる。（回答に出てきたものは100%正確でない場合に正しくできるか）

## 最新/効率的な学習方法
①インプット
②アウトプット
③コードを書く
④名前をつける

###### ①インプット
難しい教材からトライすると挫折する場合が多いです。
最初は入門向けの教材を使用することをお勧めします。YouTube,Progaet,Udemyなど

教材を使用していると、わからない部分をchatGPTを積極的に使用していきましょう。
例えば、「〇〇ってどういうこと？」を聞いてみましょう。:point_up:その内容でchatGPTはかなり詳しく説明してくれますが長い文章で理解しづらい場合がありますので、「子供向けに説明してください」とつけ加えると、理解しやすくなります。

その回答の中で、わからない単語があれば、その都度、質問するようにして下さい。
人間は説明してくれている最中に一定数、分からない単語があれば、すべて分からない状態に陥ります。その分からない単語がなくなっていくと、全体の説明に理解しやすくなりますので、分からないものはすべて潰してようにしていきましょう。

単語帳などをメモしていくようにしていきましょう。notionがオススメ！

本格的にスキルアップしてくなったら、骨太な書籍、公式ドキュメントに挑戦しましょう。入門編やネットに転がっている情報だけでは、プロフェッショナルには慣れません。仕事で成果を得るためには、段階的に踏み込んでいきましょう。


###### ②アウトプット
インプットだけでは、身につけません、アウトプットすることにより、自分の知識となりますので、セットで行うようにしましょう。
具体的なアクション
Qiita,ブログ,notionでまとめる

インプットした内容を少し変更して、作ってみましょう。教材のサンプルコードの使用を少し、変更したり、覚えたい単語を積極的に使用したり自分でアレンジしてみましょう。

今、手持ちのスキルで、「これなら作れるかも！」というものを作っていきましょう。
例えば、
if文で何か作れるものはないかな？と思い、じゃんけんをif文で作ってみよう！その際に足りない知識なども身に付くようになります。
自分で何作るか考えるのが難しいと感じた場合にはchatGPTに問題を作ってもらいましょう。
例えば、「if文を身につける初心者用の問題を作って」これらを解いて練習していくと良いでしょう。

###### まとめ
・重要なのは:point_up:インプットだけでは何も身につけない
・問題は難しくなくてOK
・スモールステップでステップアップ

###### ③コードを書く
一番大事なのは、自分でコードを書いて身に付くこと
何か、書きたいテーマについて書く→分からない部分をchatGPTに聞く→そのままの回答を写して実行→問題なく動くかをチェックchatGPTに聞いたコードを一行、一行理解する→chatGPTからもらったコードを消して、chatGPTを見ずに再度自分で書く→同じ実行結果になっているかを確認
手が動かない場合にchatGPTに聞いて写して、理解→書く
これらを行うと、かなり、自分でコードを書く力が身に付くことができます。
コードを書くときの注意点は、最初からchatGPTに聞かないで下さい。
すぐにchatGPTに頼ることは、問題集を解くときに、最初から答えを見ているのと同じ。答えを最初に見ると自分で考える力は身につきません。当たり前のことですが、きっちり守ることが成長につながります。

一行、一行コードの意味を理解するようにして下さい。
chatGPTもよく間違えるので、鵜呑みにしないで下さい。
書いたコードをchatGPTに投げてコードレビューをするものいいですね。

###### ④名前をつける編
コードを書いている最中に変数名やクラス名、ファイル名になやみますよ、chatGPTにさらっと聞いちゃって下さい。聞き方は
「〇〇を意味する関数名の候補をあげて」
こうするとたくさんの候補を挙げてくれます。そうするとたくさんの単語を見ているうちに良い名前がわかってくるようになってきます。最初のうちはとことんchatGPT聞いていって下さい！
良い名前の付け方の原則を知ってください。
・表したいことは明確か？
・表したいことが一つか
・表したいことを正確に表現できているか
[詳しくはこちら](https://zenn.dev/brainyblog/articles/2f19d462ebf40e "命名規則と良い名前の選び方")

###### まとめ
インプットとアウトプットは3:7の割合でやるぐらい、アウトプットを重要にして下さい。基本的にはchatGPTを積極的に使っていっていいのですが、自分で仮説を立てるようにし、脳へストレスを与えて下さい。そうしないと成長しないし、自分の知識としていつまで経っても身に付かないです。頑張っていきましょう！！