OmniAICreator/Qiita-1.07M huggingface dataset:
キッティング時に使用するPowershellスクリプト

# ICMP（Ping）応答するコマンド

```icmp_allow.ps1
# 変数に確認したいルール名を格納
$ruleName = "A_ICMPv4_Allow"

# 指定したルール名が存在するか確認
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue

# ルールが存在しない場合にのみ作成
if (-not $existingRule) {
    New-NetFirewallRule -Name ICMPv4 -DisplayName AsuzacFoodsICMPv4_Allow -Description キッティング時に設定されるPing応答コマンド -Profile Any -Direction Inbound -Action Allow -Protocol ICMPv4 -Program Any -LocalAddress Any -RemoteAddress Any
    Write-Host "ファイアウォールルール '$ruleName' を作成しました。"
} else {
    Write-Host "ファイアウォールルール '$ruleName' は既に存在しています。"
}
```

# 自動ログイン コマンド
```auto_login.bat

echo 自動ログインレジストリ設定
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /t "REG_SZ" /d "MyPassword" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /t "REG_SZ" /d "User1" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t "REG_SZ" /d "1" /f
```

# RDP許可 コマンド
```remote_desktop.bat

echo リモートログイン許可設定
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
echo リモートデスクトップ用FireWall作成
netsh advfirewall firewall add rule name="remoteDesktopShadow TCP IN" dir=in action=allow protocol=TCP
netsh advfirewall firewall add rule name="remoteDesktopModeUser TCP IN" dir=in action=allow protocol=TCP localport=3389
netsh advfirewall firewall add rule name="remoteDesktopModeUser UDP IN" dir=in action=allow protocol=UDP localport=3389

```
pyserialで文字コードを直接指定して送信

pythonを使用してシリアル通信で文字コードを直接指定して送信したい場合
通信相手:E220-900T22S

とりあえず書いてみる

```python
import serial

ser = serial.Serial('COM1', 9600)
pt = '\xc1\x00\x08'
ser.write(pt)
ser.close()
```

encodeしてくださいと怒られる
```
TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
```

encodeしてみる

```python
ser = serial.Serial('COM1', 9600)
pt = '\xc1\x00\x08'
pt = str.encode(pt)
ser.write(pt)
ser.close()
```

モジュールから0xff,0xff,0xffが返ってくるのでコマンドが違うようです
encode後のptの2文字目をordで数値化してみてみる。

```python
pt = '\xc1\x00\x08'
print(ord(pt[1])) # => 0
pt = str.encode(pt)
print(ord(pt[1])) # => 128
```

数値が変わっている
encodeで16桁の文字コードへ変換されてしまっている。

動作したコード：

```python
import serial

ser = serial.Serial('COM1', 9600)
pt = [0xc1,0x00,0x08]
pt = bytes(pt)
ser.write(pt)
ser.close()
```
競プロをPythonでやるときのチートシート

# 競プロをPythonでやるときのチートシート
競プロをpythonでやるときのチートシートです
標準入力などよく使うものをまとめてみました
ジャンルでまとめてあります

# 標準入力
複数行はリスト内包表記かfor分で書くと良いです
スニペットにまとめとくと便利です
### 文字列一つ
標準入力の基本のき
```python
input()
```

### 文字列が一行に複数
あまり使いません
文字列は複数行が多いと思います(灰色の感想)
```python
input().split()
```

### 整数一つ
```python
int(input())
```
### 整数が一行に複数
```python
list(map(int,input().split()))
```

# 出力
入力の次に大事?
### リストを空白区切りで出力
```python
print(*A)
```
これだけです区切り文字を付けたい場合は引数にsepを追加します
改行区切りの例
```python
print(*A,sep="\n")
```

# 数学系
### 1からnまでの総和
なんやかんや使います
愚直に計算する場合は$O(n)$ですが
この公式は$O(1)$です
そろそろ急かす声が出てくるとこなので公式を出します
```math
\displaylines{
\frac{1}{2} \
n(n+1)
}
```
実装
```python
int(n/2*(n+1))
```
$x$から$y$までの総和は
1から$y$までの総和-1から$x$までの総和です
簡単でしょ
### ルート
```python
i ** 0.5
```
これだけmath.sqrtを使う方法があるけどこっちのほうが楽

### 繰り返し二乗法
べき乗の$a^b$のbが30を超えるときに使用します
普通に使っても全然いいです
$O(log n)$なので$10^18$超えても60回しか計算しません
テンプレとして関数を用意しておきます
引数の$t$はmodを取る場合に使用します
```python
def pow(x,n,t=1):
    if t == 1:
    
        ans = 1
        while n:
            if n%2:
                ans = (ans*x)
            x=(x*x)
            n>>=1
        return ans 
    ans = 1
    while n:
        if n%2:
            ans = (ans*x)%t
        x=(x*x)%t
        n>>=1
    return ans 
```

# 便利系
### heapq
優先度付きキュー計算量は

# 最後に
こんなもんかな
自分でチートシートを作る方法もあるのでぜひやってみてください
僕のチートシート↓↓

https://github.com/hidehic0/utiltext

よかったら見てくださいただunionfindは鉄則本の丸パクリです
Java, JDK, JRE, Spring Boot, GraalVMの違いをまとめてみた

# Java, JDK, JRE, Spring Boot, GraalVMの違いをまとめてみた

Javaを使った開発をしていると、JavaやJDK、JRE、そしてSpring BootやGraalVMといった言葉をよく耳にします。これらの用語は関連性がありながら、それぞれ役割が異なっています。今回は、これらの違いや関係をシンプルにまとめてみました。

## Javaとは？
Javaは、プログラミング言語の一つで、"Write Once, Run Anywhere" というスローガンの通り、一度書けばどのプラットフォームでも動くのが特長です。Javaのコードは、まずコンパイルされてバイトコードという中間コードに変換され、Java仮想マシン (JVM) 上で実行されます。

ポイント：
- プログラミング言語
- JVMで実行される
- クロスプラットフォーム対応

## JDK（Java Development Kit）とは？
JDKは、Javaで開発を行うためのツールキットです。Javaプログラムのコンパイルと実行を行うために必要なツールがすべて含まれています。

### JDKに含まれる主なもの：
- コンパイラ（javac）: Javaのソースコードをバイトコードに変換する
- JRE（Java Runtime Environment）: Javaプログラムを実行する環境（後述）
- 開発ツール: デバッガやプロファイラなど、開発時に役立つツールが含まれています

要するに、JDKは開発者用のツールキット。開発を行うならJDKが必要です。

## JRE（Java Runtime Environment）とは？
JREは、Javaプログラムを実行するための環境です。開発ツールは含まれておらず、純粋にJavaアプリケーションを実行するためのものです。

JREの役割：
- JVM（Java Virtual Machine）: バイトコードを実行する仮想マシン
- 標準ライブラリ: Javaプログラムが依存するクラスライブラリなどが含まれます
- つまり、JREは実行環境。開発はしないけど、Javaプログラムを動かすために必要です。

## Spring Bootとは？
Spring Bootは、JavaのフレームワークであるSpring Frameworkをベースにした、Webアプリケーション開発をより簡単に行えるツールです。設定が少なく、すぐに動くということで、Webアプリやマイクロサービスの開発に非常に人気があります。

Spring Bootの特徴：
- 簡単な設定: アノテーションベースで複雑なXML設定は不要
- 組み込みサーバー: TomcatやJettyなどのサーバーが組み込まれており、単一のアプリケーションとして動かせる
- 依存関係の管理: MavenやGradleを使って必要なライブラリを自動で管理

要は、Spring BootはJavaでWebアプリを作るための便利なツールです。

## GraalVMとは？
GraalVMは、Javaだけでなく他の言語（JavaScript、Ruby、Pythonなど）も実行できる、高パフォーマンスな仮想マシンです。特に、Javaアプリケーションのパフォーマンスを向上させるための機能が多く、注目されています。

GraalVMの特徴：
- ネイティブイメージの生成: Javaアプリをバイナリファイルにコンパイルして、起動時間を短縮し、メモリ使用量を削減
- 多言語対応: Javaだけでなく、複数のプログラミング言語をサポート
- 互換性: 通常のJavaプログラムも動作可能

つまり、GraalVMはJavaアプリを高速化するための次世代JVMであり、他の言語もサポートする多機能ツールです。

まとめ
- Java: プログラミング言語およびJVM上で動作するプラットフォーム
- JDK: Javaの開発に必要なツールキット（JRE含む）
- JRE: Javaアプリを実行するためのランタイム環境
- Spring Boot: Webアプリ開発を簡単にするJavaフレームワーク
- GraalVM: Javaや他の言語を高パフォーマンスで動作させる仮想マシン
Slackにインスタントな翻訳機能を提供する-概要編-

# はじめに
Slackを使ったコミュニケーションで、海外のメンバーからのメッセージの翻訳に困ったことはありませんか？
毎回Google翻訳にコピペして確認するのも面倒だし、何とかしたい…と思っている方も多いのではないでしょうか。

そこで今回は、Slackの投稿をワンクリックでさくっと翻訳してくれるボットをWorkatoで作ってみました。
これさえあれば、メッセージをコピーして翻訳サイトを開く手間もなく、スムーズにやりとりができます。

今回の記事では、このボットの構築方法を３部作で紹介していきます。
ぜひ参考にしながら一緒に進めてみてください。

# ボットの仕様
1. Slackの投稿に絵文字リアクション :flag_jp: が付けられたら起動
2. 日本語訳に対応
3. 翻訳結果をスレッドに返信する

# 使用イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/98f4dcfb-5781-074d-eeb4-bff7b7d9829f.png)


# Workatoレシピ
![スクリーンショット 2024-10-15 114400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/f92cc82c-6de3-69ad-94f6-74795c8d2092.png)


# さいごに
次回は、**[カスタムワークボット設定編](https://qiita.com/yabikkio/items/a9d13e5c1ec14be5097f)** をお届けします。
PrettierのPre-commit Hookを入れる正しいやり方

# 1. 概要

フォーマットが不正のソースコードをgitブランチに混入しないよう、PrettierのPre-commit Hookを使ってコミットする前に自動的にフォーマットを行いたい。

色んなweb記事やオフィシャルサイトに古い情報があるため、混乱してしまうが、`2024年10月`現在の正しいやる方をこの記事にまとめる

この記事はprettier設定が終わっていることを前提とする。

# 2. 予備知識

## 2-1. Pre-commit Hookはなに？

gitが色んなhook機能を提供されていて、その中の１つはPre-commitである。名前の通り、コミット前に指定された処理が実行される。

プロジェクト直下の.git/hooksフォルダに色んなhookの雛形があり、ファイル名の`.sample`を消せば使える。

```ls
applypatch-msg.sample		fsmonitor-watchman.sample	pre-applypatch.sample		pre-merge-commit.sample		pre-rebase.sample		prepare-commit-msg.sample	sendemail-validate.sample
commit-msg.sample		post-update.sample		pre-commit.sample		pre-push.sample			pre-receive.sample		push-to-checkout.sample		update.sample
```

## 2-2. Huskyはなに？

git hooksは使い難いため、huskyが登場する。

huskyはJavaScriptライブラリであり、それをプロジェクトに入れると、`.husky/pre-commit`というファイルが作れて、そのファイルに記載するコマンドがcommit前に実行される。

git hooksのようなシェル処理を弄らず、JavaScriptコマンドだけでPre-commitできるのがhuskyの価値である。

## 2-3. lint-stageはなに？

gitやhuskyはデフォルトで全てのファイルが処理対象になるため、処理が時間かかる一方、無駄な作業になることが多い。

lint-stageはgit commitで変更したファイルのみを絞って、処理を行なうためのJavaScriptライブラリである。

# 3. PrettierのPre-commit Hookを入れる正しいやり方

## 3-1. huskyを入れる

huskyのオフィシャルdocsの[インストール手順](https://typicode.github.io/husky/get-started.html)の通りでやると、最新のhusky v9のファイルが作られる。

```js
npx husky init
```

- package.jsonにhuskyの内容が追加されること

```json-doc
{
  ...
  "scripts": {
    ...
    "prepare": "husky"
  },
  ...
  "devDependencies": {
    ...
    "husky": "^9.1.6",
    ...
  }
}

```

- `.husky/pre-commit`ファイルが作成されること

```js
npm test
```

npm installなどが実行すると、`prepare`スクリプトが自動的に呼ばれて、huskyが初期化される。

## 3-2. lint-stagedを入れる

```js
npm install --save-dev lint-staged
```

## 3-3. `.husky/pre-commit`を変更

lint-stagedを呼ぶ出す

```js
npx lint-staged
```

## 3-4. `flat config`形式のlint-staged設定ファイルをプロジェクト直下に作成

- `lint-staged.config.mjs`

```js
const config = {
  '*.css': ['stylelint --fix', 'prettier --write'],
  '*.{ts,tsx,mjs}': ['eslint --fix', 'prettier --write'],
  '*.{json,md,html}': ['prettier --write'],
};

export default config;
```

stylelintやeslintとprettierを行なう例であるが、必要によって設定を変更する。

# 4. あと書き

JavaScriptライブラリはお互いに綿密に依存している一方、各自の進化も早いため、それに関するweb記事があっという間に臭くなる。

## 4-1. Prettierのlint-stagedでやる手順の問題点

Prettier[オフィシャルdoc](https://prettier.io/docs/en/precommit#option-1-lint-stagedhttpsgithubcomokonetlint-staged)に書いてあるが、`npx mrm@2 lint-staged`一発で全ての依存が完璧に用意される。

- 問題点１
  - mrm@2は古い、最新はv4系のmrm@4である
- 問題点２
  - `npx mrm lint-staged`でやってもhusky v8形式なファイルが生成される
  - しかし、husky v9がdevDependenciesに入っている
  - prepareが`husky install`である
  - husky v9が欲しいprepareは`husky`であるため、`install command is DEPRECATED`警告が出る
    - 設定とコマンドの不一致は最悪

husky v9の変更点は[こちら](https://github.com/typicode/husky/releases/tag/v9.0.1)

## 4-2. 区別にくい古いhuskyのインストールコマンド

husky v9の`npm husky init`とよく似ってるコマンド`npx husky-init`がある。

`npx husky-init`でやるとhusky v8が使われてしまう。
- 依存ライブラリがv8
- pre-commitファイルがv8の形式
- 最新版でないため気持ち悪い
ケースコメントについて

## ケースコメントがなにかについてしれべて見た。

最初はケースレコードページのフィードの投稿だと思ったか、違った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/7ac6bcd0-0096-4a5a-b0f8-29c656f7d92f.png)

[ケースコメント](https://help.salesforce.com/s/articleView?id=sf.case_comments.htm&type=5)
記事にあるように[ケースコメント] 関連リストに表示されている。
>ケースコメントを使用して、ユーザーおよびサポートエージェントは、ケースに対して公開または非公開のコメントの追加、編集、削除ができます。すべてのコメントは、[ケースコメント] 関連リストに表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/a3f458a4-9a82-3878-a6a3-66d09cd06d1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/1cc7561f-ac07-cb81-a460-0655a675ca9d.png)

続いて、「ケース通知をシステムアドレスから送信」をテストしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/8215c3d7-b260-dcca-acdd-deab4523174f.png)

Onの場合は「noreply@salesforce.com」からメールがくる
Offの場合は「組織のアドレス」で設定したアドレスからメールがくる
注意点：「組織のアドレス」の設定には組み合わせが色々ある。
以下の記事を見て
[デフォルトの No-Reply メールアドレスの設定](https://help.salesforce.com/s/articleView?id=sf.email_default_no_reply.htm&type=5)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/80984379-b9aa-a4c4-2e9c-5d945d3cdcd6.png)
ActiveRecord::Core の clone と dup の違い

## clone と dup の違い

- clone
  - shallow コピー 
  - **id を保持する**
  - **タイムスタンプやロックに関する属性を保持する**
  - **属性はコピーしない**
    - つまり、clone したオブジェクトの属性を変更すると、元のオブジェクトの属性も (同じオブジェクトなので) 変更されてしまう
  - アソシエーションはコピーしない

- dup
  - shallow コピー 
  - **id は保持しない (新規レコード)**
  - **タイムスタンプやロックに関する属性は保持しない**
  - **属性をコピーする**
  - アソシエーションはコピーしない

```rb
yoyo = Yoyo.find_by!(name: 'モジョ')
cloned_yoyo, duped_yoyo = yoyo.clone, yoyo.dup

# duped_yoyo は新規レコード扱い。
[yoyo.id, cloned_yoyo.id, duped_yoyo.id]
#=> [1, 1, nil]
[yoyo.new_record?, cloned_yoyo.new_record?, duped_yoyo.new_record?]
#=> [false, false, true]

# duped_yoyo は changes_to_save が発生する。
cloned_yoyo.changes_to_save
#=> {}
duped_yoyo.changes_to_save
#=> {"brand_id"=>[nil, 1], "name"=>[nil, "モジョ"], "diameter"=>[nil, 57.0], "width"=>[nil, 47.33], "weight"=>[nil, 67.8]}

# duped_yoyo はタイムスタンプを引き継がない。
cloned_yoyo.values_at(:created_at, :updated_at)
#=> [Fri, 11 Oct 2024 00:47:11.789479000 UTC +00:00, Fri, 11 Oct 2024 00:47:11.789479000 UTC +00:00]
duped_yoyo.values_at(:created_at, :updated_at)
#=> [nil, nil]

# cloned_yoyo は属性のオブジェクトを引き継ぐ (同じ object_id) 。
# duped_yoyo は属性のオブジェクトは引き継がない。
[yoyo.name.object_id, cloned_yoyo.name.object_id, duped_yoyo.name.object_id]
#=> [567340, 567340, 831580]

# cloned_yoyo も duped_yoyo もアソシエーションを引き継ぐ。 
# cloned_yoyo はアソシエーションのオブジェクトを引き継ぐ (同じ object_id) 。
# duped_yoyo はアソシエーションのオブジェクトは引き継がない。
[yoyo.brand.id, cloned_yoyo.brand.id, dup_yoyo.brand.id]
#=> [1, 1, 1]
[yoyo.brand.object_id, cloned_yoyo.brand.object_id, dup_yoyo.brand.object_id]
#=> [87100, 87100, 87120]
```

## バージョン情報

```rb
RUBY_VERSION
#=> "3.3.5"

Rails.version
#=> "7.2.1"
```

## 参考

- Ruby on Rails API
  - [ActiveRecord::Core#clone](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-clone)
  - [ActiveRecord::Core#dup](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-dup)

## 関連

- [ActiveRecord オブジェクトを dup メソッドでコピーする場合は、インスタンス変数もコピーすることに注意する #Ruby - Qiita](https://qiita.com/QUANON/items/287ff2c5c72c93c2ff07)
pythonのファイル操作をまとめてみた

## 問題の発生
ファイル操作がよくわからないのでまとめてみた

## ファイルを読み込むとき
基本形）
```python:python
with open('テキストファイル名','ファイル操作モード') as 置き換えるファイル名:
    操作
```
例）
```python:python
with open('test1.txt','r') as f:
    s = f.read()
```

## ファイル操作モードの種類
| ファイル操作名 | 効果 |
|:-:|:-:|
| r  | 読み込み  |
|  w|書き込み   |
| a  | 追記  |
| r+  | 読み込み＋書き込み  |

### 参照するファイル　test1.txtの中身
ぼくはボブです
９９歳です。
よろしくお願いします


### 読み込み
#### 全ての行を読み込む
```python:python
with open('test1.txt','r') as f:
    s = f.read()
print(s)

#結果
#ぼくはボブです
#９９歳です。
#よろしくお願いします
```
::: note info
ファイル操作モードをr、read()メソッドを使用することでファイルの全体を一度に読み込むことができる。
:::

#### ファイルの中身をリストで取得する

```python:python
with open('test1.txt','r') as f:
    s = f.readlines()
print(s)

'''結果
['ぼくはボブです\n', '９９歳です。\n', 'よろしくお願いします']
'''
```
:::note warn
改行を取り除いたリストを作成したい場合は
```python:python
s = [line.rstrip() for line in f.readlines()] 
'''結果
['ぼくはボブです', '９９歳です。', 'よろしくお願いします']
'''
```
:::

#### 先頭２行だけ読み込む
```python:python
with open('test1.txt','r') as f:
    for _ in range(2):
        s = f.readline()
        print(s)
#結果
#ぼくはボブです
#
#９９歳です。
#
'''
```

:::note warn
結果に改行が入ってしまっているのは行の最後に\nが入ってしまっているからだ。
以下参照
ぼくはボブです\n
９９歳です。\n
もし、改行を除きたいのであれば
f.readline().rstrip()
とすると改行を取り除ける
:::

### 書き込み
```python:python
with open('test1.txt','w') as f:
    f.write('僕はジョンです\nすべて書き換えました')
```
```:test.1txtの中身
僕はジョンです
すべて書き換えました
```
:::note info
ファイル操作モードをw、write()メソッドを使用することでファイルに書き込むことができる。もし、指定したファイルが存在しない場合は、指定したファイル名で新たにファイルが作成される
:::

#### リストの書き込み
```python:python
x_list = ['大変','疲れた','頑張ろう']
s = '\n'.join(x_list)

with open('test1.txt','w') as f:
    f.write(s)
```
:::note info
`.join`を使用することで、リストの各要素を指定した文字で結合することができる。この場合、要素を改行で区切って、一つの文字列にしている。
`'a'.join(x_list)`とすると
大変a疲れたa頑張ろう
aをつけて結合することができる
:::

### 追記
```python:python
with open('test1.txt','a') as f:
    f.write('\n追記しました。')
```
```:test1.txtの中身
僕はジョンです
すべて書き換えました
追記しました。
```

:::note info
ファイル操作をa、処理をwrite()とすることでファイルに追記することができる。
:::

## 感想
ファイル操作の処理をまとめてみた。
同じところでつまづく初心者の方の手助けになれば幸いです
【ノート】PHP　foreach文

```PHP:foreach文
foreach(配列 as 各要素の添え字が代入される変数 => 各要素の値が代入される変数){
    繰り返したい処理
}
foreach($numbers as $key => $value){
    echo"添え字". $key. "番は";
    echo $value. "です。<br>";
}
```

:::note info
チェックボックスとの関係
チェックボックスからデータを送る場合、選択されたものを配列として送るのでforeach文で処理する。
:::
Astroで数式を使いたい！LaTeX数式を表示させる方法について解説します。

Astroでブログを書いている中で、数式を使いたいと思い、KaTeXを使ってLaTeX形式の数式の表示を実装しました。以下、その手順をご紹介します。

---

### ステップ1: プラグインのインストール

まず、`rehype-katex`と`remark-math`をインストールします。

```bash
npm install rehype-katex remark-math
```

次に、`astro.config.mjs`を編集して、プラグインを設定します。

```js
import { defineConfig } from 'astro/config';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkMath],
    rehypePlugins: [rehypeKatex],
  },
});
```

---

### ステップ2: CSSの追加

数式を綺麗に表示するために、KaTeXのCSSをプロジェクトに追加します。

```jsx
// src/layouts/Layout.astro （または任意のコンポーネント）
<head>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css" integrity="sha384-vZTGshhcJwVjMEcoCsoDhbLMegZbDrg6eRmFwhl/8tSru3CTb5EgGF9aFLPeANtO" crossorigin="anonymous">
</head>
```

---

### ステップ3: KaTeXで数式をレンダリング

数式をKaTeXでレンダリングするには、以下のように数式を囲みます。

- **インライン数式**: `$...$`で囲む
- **ブロック数式**: `$$...$$`で囲む

例:

```markdown
$\sqrt{3x-1}+(1+x)^2$
```

結果:
![$\sqrt{3x-1}+(1+x)^2$](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623476/30d757a7-b987-f54d-4861-e161cea7b3b8.png)

---

### まとめ

この手順を使えば、AstroでKaTeXを利用して簡単に数式を表示できます。
GCPのAPIGWにおけるAPI更新方法について

# はじめに

どうも、@to-fmakです。最近GCPのAPI Gatewayを使ってAPI管理を始めたので、API更新方法についてメモ書き程度にまとめます。

## 注意事項

PoC段階のため、現在はIaCやCICDを導入していません。

# APIの作成と更新手順

## 作成手順

1. **OpenAPI仕様の `openapi.yaml` を作成**
2. **API Gatewayを作成**
3. **API構成を作成し、`openapi.yaml` を指定**
4. **APIをデプロイ**

## 更新手順

1. **新しいAPI構成を作成**
2. **Gatewayを新しいAPI構成で更新**
3. **古いAPI構成を削除（オプション）**

# 管理コンソールについて

現段階では、基本的にGCPの管理コンソールでリソース作成や更新を手動で行っています。ただし、新しいAPI構成の作成やGatewayの更新はコンソールからはできないため、CLIを使っています。

# CLIによる更新手順

CloudShellを使って、以下のCLIコマンドでAPIを更新します。

```bash
# 新しいAPI構成の作成（古いAPI構成をsample-api-01とします）
gcloud api-gateway api-configs create sample-api-02 \
    --api=sample-api \
    --openapi-spec=sample.yaml \
    --project=sample-pj

# Gatewayを新しいAPI構成で更新
gcloud api-gateway gateways update sample \
    --api=sample-api \
    --api-config=sample-api-02 \
    --project=sample-pj \
    --location=asia-northeast1

# 新しいAPI構成の確認（オプション）
gcloud api-gateway gateways describe sample \
    --project=sample-pj \
    --location=asia-northeast1

# 古いAPI構成の削除（オプション）
gcloud api-gateway api-configs delete sample-api-01 \
    --api=sample-api \
    --project=sample-pj

```

# 課題

今後はTerraform等のIaCツールでインフラのコード化し、CICD環境も整備していきたいと考えています。

# 参考URL

- https://cloud.google.com/api-gateway/docs/creating-api?hl=ja
- https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ja
- https://cloud.google.com/api-gateway/docs/deploying-api?hl=ja

## エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

<https://gakken-leap.co.jp/recruit/>
選択公理を使って排中律を証明する

CIC において、以下を仮定すると排中律が証明できるそうです。実際、Lean における排中律の証明項はそのようにして作られています→[コード](https://github.com/leanprover/lean4/blob/d10d41bc07942ca6d8f3081a637045321db15c5a/src/Init/Classical.lean#L31)

- 強い選択公理(グローバルチョイス)
- 関数の外延性
- 命題の外延性
- Proof Irrevalence

勉強がてら Coq で書き直してみました:

```coq
Section AC_EM.

Variable gchoice : forall A P, (exists a, P a) -> {a:A | P a}.
Variable pext : forall (P Q:Prop), (P<->Q) -> P = Q.
Variable pirr : forall (P: Prop) (H1 H2: P), H1 = H2.
Variable fext : forall {A B} (f g:A->B), (forall x, f x = g x) -> f = g.

Variable P: Prop. (*will prove P \/ ~P*)

Definition U := fun x =>  x = True \/ P.
Definition V := fun x => x = False \/ P.
Definition inhU: exists a, U a.
  exists True. cbv. now left. Qed.
Definition inhV: exists a, V a.
  exists False. cbv. now left. Qed.
Definition u  := proj1_sig (gchoice _ _ inhU).
Definition Hu: U u  := proj2_sig (gchoice _ _ inhU).
Definition v  := proj1_sig (gchoice _ _ inhV).
Definition Hv: V v  := proj2_sig (gchoice _ _ inhV).

Lemma uvn_p: u<>v \/ P.
Proof. destruct Hu; destruct Hv; unfold U, V in*; simpl in *.
- left. rewrite H. rewrite H0. intro. rewrite <-H1. constructor.
- right. assumption.
- right. assumption.
- right. assumption.
Qed.

Lemma p_uv: P-> u=v.
Proof. intros HP.
assert (HeqUV: U=V). {
  apply fext. intros. cbv.
  apply pext. split; intros.
  right. assumption.
  right. assumption.
}
assert (H: forall H H',  proj1_sig (gchoice _ U H) = proj1_sig (gchoice _ V H')). {
  rewrite HeqUV.
  intros.
  enough (H=H') by (now subst).
  apply pirr.
}
 apply H.
Qed.

Theorem em : P \/ ~P.
Proof. destruct (uvn_p).
- right. intro. apply H. now apply p_uv.
- now left.
Qed.

End AC_EM.
```

# 補足
Diaconescu's theorem (→ [en:Wikipedia](https://en.wikipedia.org/wiki/Diaconescu%27s_theorem) )という直感主義論理上の公理的集合論の定理をカリーハワード対応させたもののようです。論理と計算ではやっぱりちょっぴり違うので（例：分出公理のCICでの対応物は？）、命題の外延性とかの公理が出てきたりするのでしょうか？

いずれにせよ、選択公理と排中律というなんかあまり関係がなさそうな二つが繋がっているというのはおもしろいですね
paizaラーニング問題集「【シミュレーション 1】反復横跳び」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__repeated_side_jump

▼考え方

ポイントになる考え方1.～6.を以下に示します。

1.【題意の掘り下げ】左の線を元の位置から外側にXcm遠ざけられたあとに、中央の線から左の線をまたぐときに、Xcm多く移動します。次に、左の線から中央の線をまたぐときに、さらにXcm多く移動します。

2.【題意の掘り下げ】例えばN=1のとき、友達が線をまたぐのがN*4+2回(6回目)までは、本来の反復横跳びの移動距離に差はありません。7回目に中央の線から左の線をまたぐのでXcm、8回目に左の線から中央の線をまたぐのでXcm、多く移動します。

3.移動距離に差がない移動回数は除外して考えます。Kが移動回数で、N*4+2が移動距離に差がない移動回数です。

4.N=1、Xcm、K=20とします。移動回数1～6は移動距離に差がありません。7回目にXcm、8回目にXcm、多く移動します。その時の例を以下に示します。

```
[移動回数]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
　　　　　　 X X      X  X        X  X        X  X
[Xcm多く移動するタイミング]
```

ここで、移動回数6～20を変数hとし、6～9,10～13,14～17は同じパターン(なし,X,X,なし)が繰り返されるのでグループgとします。

5.hに含まれるグループgの個数はh//4であり、gにはXが2つ含まれます。

6.グループgなれなかった移動回数18～20は、Xが2つ含まれます。

▼コード
```py
########## 処理0(準備) インプット,リスト定義 ###########

N,X,K = map(int,input().split())

########## 処理1 移動距離の差を計算 ###########

# 考え方1.～4.
h = K-(N*4+2)+1

# 考え方5.
g = (h//4)*X*2

# 考え方6.
gn = 0
if h % 4 == 2:
    gn += X
elif h % 4 == 3:
    gn += X*2

print(g+gn)
```
投稿 102 共通鍵暗号方式/公開鍵暗号方式 2024/10/10

本日の勉強時間　4H

共通鍵暗号方式は受信者の共通鍵で暗号化
公開鍵暗号方式は受信者の公開鍵で暗号化、その後秘密鍵で解除
デジタル認証の場合は送信者の秘密鍵で暗号化、公開鍵で鍵を解除されてしまっても問題なし
TerraformでAWS VPCのサブネットをcidrsubnet関数を利用して作る

## はじめに
**Terraform**でAWS VPC (Virtual Private Cloud)のサブネットを作る例を紹介します。サブネットのCIDRブロックをTerraformの`cidrsubnet`関数を使って計算します。

今回の例では、以下の構成でVPCとサブネットを設計します。

項目|値
---|---
VPC CIDR|10.1.0.0/16
サブネットタイプ|public, private, protected
アベイラビリティゾーン (AZ)|a, c, d
サブネットのネットマスク| /20

## Terraformコードの解説
### VPCリソースの定義

```hcl
# VPC
resource "aws_vpc" "main" {
  cidr_block           = "10.1.0.0/16"
  enable_dns_hostnames = true
}
```
このコードブロックでは、aws_vpcリソースを使用してVPCを作成します。`cidr_block`パラメータでVPCのIPアドレス範囲を指定します。

### サブネットCIDRの計算
```hcl
data "aws_region" "current" {}

# サブネットのCIDR
locals {
  subnet_cidr_blocks = {
    public = {
      for i, v in ["a", "c", "d"] :
      v => {
        az   = "${data.aws_region.current.name}${v}"
        cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i)
      }
    }
    private = {
      for i, v in ["a", "c", "d"] :
      v => {
        az   = "${data.aws_region.current.name}${v}"
        cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i + 3)
      }
    }
    protected = {
      for i, v in ["a", "c", "d"] :
      v => {
        az   = "${data.aws_region.current.name}${v}"
        cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i + 6)
      }
    }
  }
}
```
このlocalsブロックでは、`cidrsubnet`関数を使用してサブネットのCIDRブロックを計算しています。

```hcl
cidrsubnet(prefix, newbits, netnum)
```
- **prefix**: 計算の元になるCIDR。ここではVPCのCIDR(`aws_vpc.main.cidr_block`)を設定します。
- **newbits**: prefixに追加するビット数。この結果がサブネットの長さになります。今回の例ではprefix(`/16`)にnewbits(`4`)を足した`/20`がサブネットの長さになります。
- **netnum**: 0から順番に増やしていくことで連続したサブネットを作ることができます。

## サブネットリソースの作成
```hcl
# サブネット
resource "aws_subnet" "public" {
  for_each = local.subnet_cidr_blocks.public

  vpc_id            = aws_vpc.main.id
  availability_zone = each.value.az
  cidr_block        = each.value.cidr

  tags = {
    Name = "public-${each.key}"
    Tier = "public"
  }
}
resource "aws_subnet" "private" {
  for_each = local.subnet_cidr_blocks.private

  vpc_id            = aws_vpc.main.id
  availability_zone = each.value.az
  cidr_block        = each.value.cidr

  tags = {
    Name = "private-${each.key}"
    Tier = "private"
  }
}
resource "aws_subnet" "protected" {
  for_each = local.subnet_cidr_blocks.protected

  vpc_id            = aws_vpc.main.id
  availability_zone = each.value.az
  cidr_block        = each.value.cidr

  tags = {
    Name = "protected-${each.key}"
    Tier = "protected"
  }
}
```
このaws_subnetリソースブロックでは、`for_each`を使用して、複数のサブネットを作成しています。各サブネットは、localsブロックっで計算されたCIDRブロックとアベイラビリティゾーンに関連付けられます。

## 確認をした環境
- Terraform v1.9.2
- aws provider v5.66.0

## 参考
https://developer.hashicorp.com/terraform/language/functions/cidrsubnet
GeM-CoT論文

## GeM-CoT論文

**note**  
Generalizable Chain-of-Thought Prompting in Mixed-task Scenarios with
Large Language Models  
https://arxiv.org/abs/2310.06692  

**1. 序論:**

* LLM は CoT プロンプトによって優れた推論能力を示すが、既存手法は汎用性と性能の両立が難しい。
* 特定タスク向けの手法は性能は高いが汎用性に欠け、汎用的な手法は性能が低い。
* 実際には、入力質問の種類が未知である混合タスクシナリオに LLM が直面することが多い。
* 本研究では、汎用性と性能のトレードオフを考慮し、実用的な CoT プロンプト機構 GeM-CoT を提案する。

**2. 関連研究:**

* CoT プロンプトとタスク横断的な汎化に関する既存研究を紹介。
* CoT プロンプトは、汎用的な Zero-Shot-CoT とタスク特化型の Few-Shot-CoT に大別される。
* 既存研究はタスク特化型に偏っており、汎用化の追求が不足している。

**3. 混合タスクシナリオにおける汎用的な CoT に向けて:**

* 混合タスクシナリオの概念を定義: 入力質問の種類が未知で、複数のタスクからデータが混在し、質問の順序も任意である。
* 予備実験を通して、混合タスクシナリオにおける課題を明らかにする。

**4. GeM-CoT:**

* GeM-CoT のアーキテクチャとフローチャートを図示し、各モジュールを詳細に説明。
* GeM-CoT は、入力質問を種類ごとに異なるパスにルーティングする。
* マッチング成功時はデモプールからデモンストレーションを取得し、推論を行う。
* マッチング失敗時は Zero-Shot 推論を行い、データをキャッシュに保存し、密度ベースクラスタリングでデモを自動構築する。

**5. 実験:**

* 10 個の推論タスクと 23 個の BBH タスクを用いて GeM-CoT を評価。
* GeM-CoT は、既存手法と比較して、汎用性と性能の両面で優れていることを示す。
* BBH データセットでは、ストリーミング設定での安定性と汎化能力も検証。

**6. 分析:**

* デモンストレーション選択手法の影響を分析し、多様性の重要性を示す。
* Type Matching モジュールの効果を検証し、汎用化における役割を明らかにする。
* マッチングしきい値の選択について分析し、妥当性を示す。

**7. 結論:**

* 混合タスクシナリオという新しい設定を提案し、GeM-CoT という汎用的な CoT プロンプト機構を提案した。  
* 実験結果から、GeM-CoT は性能と汎用性の両立を実現することを示した。
* 今後の研究では、推論プロセスの改善や、より効率的なデモンストレーション選択手法の開発などが考えられる。

**付録:**

* 実験の詳細やデータセット情報、LLM ベース分類器の詳細などを補足。
* ケーススタディとエラー分析を通して、GeM-CoT の解釈可能性を検討。

この論文は、大規模言語モデル (LLM) における連鎖的な思考プロンプト (Chain-of-Thought Prompting: CoT) について、特に混合タスクシナリオにおける汎用化を目指した新しい手法 GeM-CoT を提案している。
この論文は、LLM の実用化に向けて重要な課題である混合タスクシナリオにおける CoT プロンプトの汎用化に焦点を当て、GeM-CoT という新しい手法を提案している。実験結果から、GeM-CoT は既存手法と比較して優れた性能と汎用性を示している。
【日記的な】(ほぼ)未経験でWeb系エンジニアに転職してから1週間

# 筆者経歴
- 情報系の学部、修士卒業
- インターンとしてSESにて自社プロダクト開発
- 大手SIerにて顧客提案や開発方針策定を経験
- 趣味でWebアプリを個人開発
- 31歳
- 上記を読むと、「いや、経験者やん」となりそうですが、まともなチーム開発はしてないし、コーディングのいろはも殆ど分かってません

# 想定読者
- 特になし
- でも、私みたいな経歴の人やエンジニアを中途入社で採用した受け入れ側の方が参考になると思っています

# 1週間経って一番最初に思ったこと
全然できへんやん、俺…
やはり、実務経験に勝るものはないな、と。

# 今タメになってること
- コードレビュー
→「こんな書き方あるんや！」と、綺麗でスマートなコードに毎日改善してくれる。

- タスク管理ツールの操作
→コードのどの部分が課題か一目瞭然で、これまでの自分の癖を矯正してくれる。

# 考えないといけないこと
- キャリアの方向性
→ただのWebエンジニアになりたくない。何をもって会社での存在感を発揮するのか。これは中途入社における悩みかな。
- 得意にしていく分野
→「先輩に追いつくぞ！」では筋が悪い。チームの弱点を埋めたり、得意分野を伸ばさないと平均的な人材になってしまう。

# 学習と成長
これまでは、自分で本を買って読んだり、ググったりしながら開発してた。
それはそれで良いんだけど、個人でやってると「もうこれでいいや」ってなったり、「本買って読んだだけ」になってしまってた。
お客に出せるだけの品質なんて考えてなかった。というかいい加減にやってた。
自分に負荷をかけてこその成長、それは「良いコードを書くための苦労」なんだと思う。

# レビュー
「なんでこうしたの？」「これってどういう意味？」「こういう書き方の方が良くね？」「こういう書き方もあるよ！」
これが私にとって足りてなかった「良いコードを書くための苦労」。
目から鱗の毎日。
脳に汗かいて、保守性高く、拡張性高いコードを書く苦労がある環境。
(筆者はプログラミングスクールに通った経験も無い)

# 最後に
これからどうしていくか、どうなっていくかを31歳の中途入社は考えなければならない。
凡庸なエンジニアにならないために思考を凝らす。
どうしたって成長速度は鈍化していく。
Q*論文

## Q*論文

### note
Q*: Improving Multi-step Reasoning for LLMs with
Deliberative Planning
https://arxiv.org/abs/2406.14283

### 1. 序論 (Introduction)

- 大規模言語モデル (LLM) は、数学の文章問題、コード生成、計画など、様々な推論タスクにおいて目覚ましい能力を示している。
- しかし、LLMは自己回帰的な生成プロセスであるため、推論ステップが増えるにつれて、エラー、幻覚、矛盾した記述を生み出す傾向がある。
- 既存のLLM改善手法は、大規模なタスク固有コーパスを用いたファインチューニングや、報酬モデルを用いた候補応答のランク付けなど、計算コストや他のタスクへの悪影響といった課題を抱えている。
- 本論文では、LLMの多段階推論をヒューリスティック探索問題と捉え、熟慮的な計画を用いてLLMのデコードプロセスをガイドする、汎用的で用途が広く機敏なフレームワークであるQ*を提案する。
- Q*は、プラグアンドプレイ可能なQ値モデルを学習することで、LLMをファインチューニングすることなく、最も有望な次の推論ステップを選択するように効果的にガイドする。

### 2. 関連研究 (Related Works)

- LLMの調整：LLMの出力が人間の期待から逸脱しないようにするための技術として、教師ありファインチューニング (SFT)、人間のフィードバックからの強化学習 (RLHF)、直接選好最適化 (DPO)、Alignerなどがある。
- 計画を用いたLLMの強化：思考の木 (ToT) は、基本的な木探索アルゴリズムを用いて問題解決に向けた中間ステップを探索することで、LLMの推論能力を向上させる。A*探索やモンテカルロ木探索 (MCTS) も、複雑な推論問題を解決する際のLLMの性能を向上させる計画技術として応用されている。
- 数学的推論とコード生成のためのLLM：数学的推論とコード生成は、LLMが関係、量、論理について本質的に難しい多段階推論を行うことを要求する。現在の手法としては、プロンプトエンジニアリング、LLMのファインチューニング、報酬モデル/検証器の訓練などがある。

### 3. 準備 (Preliminary)

- 3.1 LLMの多段階推論をMDPとして定式化する：LLMの回答生成プロセスは、複数の推論ステップに分解することができ、最終的な回答シーケンスはこれらのステップの連結とみなせる。このプロセスは、マルコフ決定過程 (MDP) として定式化できる。
- 3.2 A*探索：A*は、熟慮的な計画、マルチエージェント経路探索、制約推論において重要なヒューリスティック探索アルゴリズムである。A*は、経路探索問題において、始点から目標点までの最短経路を見つけるために提案された。

### 4. Q*：LLMのための汎用的、用途が広く機敏な熟慮フレームワーク (Q*: A General, Versatile and Agile Deliberation Framework for LLMs)

- 多くの最新のLLMは、自己回帰的な方法で自然言語を生成する。そのため、多段階推論問題に適用すると、以前のステップが間違っていると、後続の推論トレースにエラー、幻覚、矛盾した記述が生じる可能性がある。
- Q*は、LLMが各タスクのために事前にコストのかかるファインチューニングを行うことなく、多段階推論を実行する際に、最も有望な次のステップを選択するように効果的にガイドする、A*に基づく汎用的、用途が広く機敏な熟慮フレームワークである。
- Q*は、与えられた問題に対する最も適切な推論シーケンスを見つけることを、各状態が将来得られる効用を推定するf値と関連付けられたヒューリスティック探索プロセスとして扱う。
- 4.1 最適Q値の推定：Q*を実装する上での重要な課題は、与えられた推論問題において最適とは限らない固定されたLLMポリシーπθを用いて、状態行動ペアの最適Q値を推定することである。そのため、オフライン強化学習、ロールアウトからの学習、より強力なLLMによる近似など、Q値ラベルを効果的に構築する方法を提案する。
- 4.2 A*を用いた熟慮的な計画：プロキシQ値モデルQを取得したら、それを式(6)に代入して各状態のf値を計算し、A*を用いて最良優先探索を実行できる。

### 5. 実験 (Experiments)

- 5.1 実験設定：Q*の有効性を、2つの数学的推論タスクと1つのコード生成タスクで評価する。データセットには、GSM8K、MATH、MBPPを使用する。
- 5.2 実験結果：GSM8Kでは、Llama-2-7bをベースモデルとして選択し、MetaMathでファインチューニングした後の精度が65.2%に達する。MATHでは、Llama-2-7bの性能が低いため、他の2つの強力なLLM、Synthetic DataでファインチューニングしたLlama-2-7bとDeepSeek-Math-7bを用いてQ*の有効性を評価する。MBPPでは、コード生成の観点から最も強力なオープンソースLLMであるCodeQwen1.5-7b-Chatをベースモデルとして選択する。

### 6. 結論 (Conclusion)

- 難しい多段階推論問題を解決するには、LLMが自己回帰的なトークン生成だけでなく、深い熟慮を行う必要がある。
- 本論文では、LLMのための汎用的、用途が広く機敏な熟慮フレームワークであるQ*を提案する。
- Q*は、各特定タスクの効用関数を設計するために広範な専門知識を必要とする既存の熟慮方法とは異なり、値モデルを訓練するために真の値のみに依存し、変更なしに様々な推論タスクに容易に適用できる。
- さらに、プラグアンドプレイ可能なQ値モデルをヒューリスティック関数として活用することで、Q*はLLMを事前にファインチューニングすることなく、様々なタスクを解決するように効果的にガイドできるため、他のタスクの潜在的な性能低下を回避できる。
- 最後に、Q*は、MCTSにおけるシミュレーションのような完全なロールアウトではなく、毎回1ステップのみを考慮するため、機敏である。
- 数学的推論とコード生成タスクに関する広範な実験的評価により、提案手法の優位性が確認された。


## まとめ

本論文では、LLMの多段階推論能力を向上させるための新しいフレームワークQ*が提案されている。Q*は、熟慮的な計画を用いることで、LLMがより正確で効率的に推論を行うことを可能にする。実験結果から、Q*は既存の手法と比較して優れた性能を示しており、LLMの多段階推論における重要な進歩と言える。
Gmailでメール処理が爆速化した話

こんにちは、ゆーちゃんです。
今回は、Gmailのキーボードショートカットを活用して、メール処理が劇的にスピードアップした話をシェアします。
普段Gmailを使っている方で、マウス操作がメインになっている方には特におすすめの内容です。

## Gmailのキーボードショートカット、使ってますか？

Gmailには実はたくさんのキーボードショートカットが用意されていますが、意外と使いこなしている人は少ないのではないでしょうか？最近ショートカットを色々とカスタムしてて、「Gmailでもできるかな？」とふと思って調べてみました。

結果は驚くほどの効果！メール処理のスピードが格段に上がり、時間短縮になりました。

## 使えるショートカット一例

以下、私が特に使っている便利なショートカットを紹介します。Vimのキーバインドに慣れている人には特におすすめです。

### Vimキーバインドでの移動

- `j`: 次のメールスレッドに移動
- `k`: 前のメールスレッドに移動

メール一覧の中で、`j`と`k`キーを使うことで、上下のメールをスムーズに移動できます。Vimライクな操作が好きな方にはとても自然に感じられてオススメ！

### `x`で選択

メールの選択には`x`キーを使用します。これでメールを選んだ状態になり、その後の操作がより簡単に行えます。

- `x`: メールを選択/解除

例えば、アーカイブや削除を一括で行いたいときには、`x`で選択してから操作を実行すればスピーディです。

### `e`でアーカイブ

メールをアーカイブする操作には`e`キーを使います。不要なメールをどんどんアーカイブして、受信トレイをすっきりと整理できます。

- `e`: 選択したメールをアーカイブ

「このメールはもういらないけど、削除するほどでもないな」といったときに、さっと`e`でアーカイブ。これだけで受信トレイがぐっと整理されます。

## その他のおすすめショートカット

上記の他にも、以下のショートカットが役に立ちます。

- `c`: 新規メール作成
- `r`: メールに返信
- `a`: 全員に返信
- `f`: メールを転送

これらを覚えると、マウスを使わずにスピーディーに操作できるようになります。

## 試してみて感じた効果

キーボードショートカットを活用するだけで、メールの処理速度がかなり向上しました。これまではマウスで一つ一つメールを選んで、操作をしていた時間が大幅に短縮され、結果的に他の業務に使える時間も増えました。

**もしまだキーボードショートカットを使っていないのであれば、ぜひ試してみてください。**

## まとめ

Gmailのキーボードショートカットは最初は覚えるのが大変かもしれませんが、使い始めるとその便利さに驚くはずです。特にVimユーザーの方には馴染みやすい操作感です。メール処理の効率を上げたい方は、ぜひこの記事で紹介したショートカットを試してみてくださいね！:relaxed:

マウスに手を伸ばす回数が減るだけで、気持ちも作業も軽くなりますよ！
【DAY31】チーム開発について

## はじめに
今まで個人開発をしてきましたが、チーム開発をする機会は短期のインターンでしかありませんでした。また、そのインターンも2人での開発で規模も小さく、チーム開発の楽しさやチーム開発で重要ことなどについてまだ分かっていません。
そこで、サポーターズ主催の勉強会「チーム開発で成果を引き出すためのアプローチを学ぼう」に参加させていただきました。そこでの学びをここに記します。
講師はGMOインターネットグループの成瀬 允宣さんです。

## チーム開発と個人開発は全然違う
個人開発で1の成果を出せるとして、普通に2人でチーム開発をすると1.5くらいの成果になってしまうようです。この成果を最大化するにも、チーム開発で成果を引き出す能力を身につけておくことは重要になります。企業では必ずチーム開発をするので、必須のスキルです。

## チームビルディングの難しさ
チーム開発には画一的な成長のためのレールがありません。「この本さえ学べばチームビルディングができる」みたいなものがないということです。
とはいえ、セオリーはあるようです。

## チームワークの構築
### リードを決める
物事を進めるために必要なことは、「誰が何をやるか」です。それを決めないと、誰が権限や責任を持つか分からず全然進みません。
そのため、役割を分けてチームごとにリードする人を決める必要があります。ただ、失敗の責任がリードではなくチームにあります。

リードは意見を集め、主体的に進めて方針を決定する必要があります。
一方で、ほかのメンバーはチームの決定を尊重し、チームに寄与する必要があります。

### チームでのコミュニケーション
細かいマネジメントは互いに不幸になりがちなので、チームで開発する上では細かいマネジメントより細かいコミュニケーションの場を設けることが重要です。


### 起こりがちな問題
チーム開発で起こりがちな問題にバッファを盛り過ぎてしまうという問題があります。

### 停滞を打破する方法
オンラインのミーティングでは停滞してしまうことが多いです。
そのため、基本マイクオンにして、発言のハードルを下げるのが重要です。
### リーダーシップの種類
#### 後ろに立つ
精神的につらく、肉体的に楽
#### 前に立つ
肉体的につらく、精神的に楽

現状のまま最高のパフォーマンスを出すには後ろに立つリーダーシップでもいいですが、現状の先に進むには前に立つリーダーシップが必要になります。

## ハッカソンでのチーム開発
チーム開発の実地訓練をする場所はなかなかありませんが、ハッカソンに参加するという方法があります。
そこで求められることは、基礎的なプログラミングとWebの基礎です。
また、フロントエンドかバックエンドどちらかの知識があれば最低限活躍できるようです。
演算子について

今回は演算子について記事にしたいと思います。

1. 算術演算子
算術演算子は、数値に対する基本的な四則演算を行うための演算子です。

演算子	説明	例
+	加算（足し算）	a + b
-	減算（引き算）	a - b
*	乗算（掛け算）	a * b
/	除算（割り算）	a / b
%	剰余（割った余り）	a % b
```java
int a = 10;
int b = 3;
System.out.println(a + b);  // 13
System.out.println(a - b);  // 7
System.out.println(a * b);  // 30
System.out.println(a / b);  // 3  (割り算の結果は整数の商)
System.out.println(a % b);  // 1  (10を3で割った余り)
```

2. 代入演算子
代入演算子は、右側の値を左側の変数に代入するために使用されます。

演算子	説明	例
=	代入（右の値を左の変数に代入）	a = 10
+=	加算して代入	a += 5
-=	減算して代入	a -= 3
*=	乗算して代入	a *= 2
/=	除算して代入	a /= 4
%=	剰余を計算して代入	a %= 7

```java
int a = 10;
a += 5;  // a = a + 5; → a = 15
a -= 3;  // a = a - 3; → a = 12
a *= 2;  // a = a * 2; → a = 24
a /= 4;  // a = a / 4; → a = 6
a %= 7;  // a = a % 7; → a = 6
```

3. 関係演算子
関係演算子は、二つの値の関係を比較し、結果としてブール値（true または false）を返します。

演算子	説明	例
==	等しい	a == b
!=	等しくない	a != b
>	大きい	a > b
<	小さい	a < b
>=	大きいか等しい	a >= b
<=	小さいか等しい	a <= b
```java
int a = 10;
int b = 20;
System.out.println(a == b);  // false
System.out.println(a != b);  // true
System.out.println(a > b);   // false
System.out.println(a < b);   // true
System.out.println(a >= 10); // true
System.out.println(b <= 20); // true
```

4. 論理演算子（Logical Operators）
論理演算子は、ブール値を使った条件を組み合わせるために使用されます。

演算子	説明	例
&&	論理積（AND、両方がtrueならtrue）	a && b
`		`
!	否定（NOT、trueをfalseに反転）	!a

```java
boolean a = true;
boolean b = false;

System.out.println(a && b);  // false (両方がtrueでないとtrueにならない)
System.out.println(a || b);  // true  (どちらかがtrueであればtrue)
System.out.println(!a);      // false (aがtrueならfalseに、falseならtrueに)
```

5. インクリメント・デクリメント演算子
これらは、変数の値を1ずつ増減させるために使用されます。

演算子	説明	例
++	1を加算する	a++
--	1を減算する	a--

```java
int a = 5;
a++;  // a = a + 1; → aは6
a--;  // a = a - 1; → aは5
```

前置（++a）: 値を返す前に1を加算。
後置（a++）: 値を返した後に1を加算。
例:

```java
int a = 5;
System.out.println(a++);  // 5 （後置のため、まず値が返されてから加算される）
System.out.println(a);    // 6

int b = 5;
System.out.println(++b);  // 6 （前置のため、まず加算されてから値が返される）
```

6. 条件（三項）演算子
三項演算子は、簡単な条件分岐を1行で書くための演算子です。

演算子	説明	例
?:	条件式 ? 真の値 : 偽の値	(a > b) ? "大きい" : "小さい"
```java
int a = 10;
int b = 20;
String result = (a > b) ? "aが大きい" : "bが大きい";
System.out.println(result);  // bが大きい
```

7. ビット演算子（Bitwise Operators）
ビット演算子は、ビット単位での操作を行うための演算子です。

演算子	説明	例
&	ビットごとのAND	a & b
`	`	ビットごとのOR
^	ビットごとのXOR（排他的論理和）	a ^ b
~	ビットごとのNOT	~a
<<	左シフト（ビットを左にずらす）	a << 2
>>	右シフト（ビットを右にずらす）	a >> 2
>>>	符号なし右シフト	a >>> 2
```java
int a = 5;  // 0101
int b = 3;  // 0011
System.out.println(a & b);  // 1  (ビットごとのAND：0001)
System.out.println(a | b);  // 7  (ビットごとのOR：0111)
```


まとめ
Javaには様々な演算子が存在し、それぞれの演算子が異なる目的や用途に応じて使用されます。これらの演算子を理解し、適切に使いこなすことで、より効率的なプログラムを作成できるようになります。

算術演算子や代入演算子は数値を扱う際に基本となります。
関係演算子や論理演算子は条件分岐に役立ちます。
三項演算子やインクリメント・デクリメント演算子は、簡潔なコードを記述する際に便利です。
文字を区切り文字で分割して配列に入れる

文字を区切り文字で分割して配列に入れるソースコードは下記の実装です

```Ruby
input_line = gets.chomp
array1 = input_line.split(' ')
A = array1[0].to_i 
B = array1[1].to_i 
puts A + B
```
パソコンに接続されたUSBメモリの痕跡


パソコンに接続されたUSBメモリの痕跡をWindowsの標準機能だけで解析する方法です。

# USBメモリの接続履歴一覧
レジストリエディタで、

```
HKEY_LOCAL_MACHINE\System\ControlSet001\Enum\SWD\WPDBUSENUM
```

を確認します。

長いキー名の中に、BUFFALOとか見覚えのある単語が見つかると思います。

`Ven_`の後ろが、ベンダー
`Prod_`の後ろが、製品名
`#`の後ろが、シリアル番号

なお、この一覧には、同じシリアル番号のUSBメモリが重複して記録される場合があります。

# USBメモリを最後に接続した日時は？

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\SWD\WPDBUSENUMで表示された各行をテキストファイル形式でエクスポートします。

出力結果中の `Device Parameters` の `最終書き込み時刻` が、最後に接続した日時になります。

なお、この方法で確認できる日時は、時分までで、秒は確認できません。
javascriptをサイトで実行する

# このページの作者が使うサイトは？
p5.js一択です！
p5.jsだと動きが見られるから、
なにかのアニメーションや図形、ゲームを作る時に使えます！
<br>

https://editor.p5js.org/
# 使ってみよう

```js
function setup() {
  createCanvas(400, 400);
}

let mouseX_m = 0;
let mouseY_m = 0;
function draw() {
  background(220);
  rect(mouseX_m, mouseY_m, mouseX-mouseX_m, mouseY-mouseY_m);
  mouseX_m = mouseX;
  mouseY_m = mouseY;
}
```

右の薄灰色の背景があるところでマウスを振ったりしてみてください！

このような動きを作れます。
いろいろいじって遊んでみてください！
【Vim】ファイルツリー機能 NERDTree導入手順

[概要](#概要)
[変更点](#変更点)
[導入手順](#導入手順)
[操作法](#操作法)

## 概要
参考にさせていただいた記事を基に、いくつかの変更と、自分用にカスタマイズさせていただきました。

https://qiita.com/zwirky/items/0209579a635b4f9c95ee

## 変更点
1. 古い `neobundle#rc()` 関数が含まれているため `neobundle#begin` に修正。
1. ファイルツリー表示のショートカットキーを`VSCode`に合わせる。
1. `NEOBUNDLE`インストール時の`sh`コマンドを分ける。

## 導入手順

1. Vimのプラグイン管理ツール「NEOBUNDLE」をインストール。

```bash:bash
# curlコマンドでGitHubから install.sh に保存
curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh

# いったんスクリプトをインストールして確認してから shコマンドを実行
sh ./install.sh
```


<br>
2. Vim設定ファイルを編集

```vim:.vimrc
" neoBundleを利用してプラグインを管理するための設定

" Vimの動作を活用する
set nocompatible
" ファイルタイプの自動検出と関連設定を一時的に無効
filetype off       

" Vim起動時にNeoBundleを初期化する設定
" 以下はVimが起動しているかどうか確認している もしtrueであれば処理を実行する
if has('vim_starting')
    " NeoBundleのパスを設定
    set runtimepath+=~/.vim/bundle/neobundle.vim
    " neobundle#begin() を使ってプラグインの設定を開始
    call neobundle#begin(expand('~/.vim/bundle/'))
endif

" ここにNeoBundleのプラグインを追加
NeoBundle 'scrooloose/nerdtree'

" プラグインの設定を終了
call neobundle#end()

" ファイルタイププラグインとインデントを有効化
filetype plugin indent on
```

<br>
3. Vimを再起動する
<br>
<br>
4. Vim内でプラグインをインストール

```vim:vim
:NeoBundleInstall
```

<br>
5. インストールされているか確認

```bash:bash
ls ~/.vim/bundle/

# もしディレクトリ自体が無ければ作成する
mkdir -p ~/.vim/bundle
```

<br>
6. ツリー表示するための標準モード用ショートカット作成


```bash:bash
# Vimで.vimrcファイルを開く
vim ~/.vimrc
```
```vim:.vimrc
" 標準モードで 内容の出力を非表示にし Ctrl+B を押して NERDTreeToggleが CR(エンターキー)実行する 
nnoremap <silent><C-b> :NERDTreeToggle<CR>
```

<br>

## 操作法
1. 操作したいディレクトリに移動してVimで開く
```bash
cd <ディレクトリ名>　&& vim .
```


![2024-10-11_05-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/a4144037-7466-7dc1-6b32-7d60d273531c.png)


<br>
2. 操作するファイルまで移動しツリーを開いたままファイルを開く

```vim
" 操作したいファイル上で
go

" ウィンドウ間を移動
Ctrl + w + w

" ウィンドウを左右に移動
Ctrl + w ← or →
```

![2024-10-11_05-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/938dce76-2778-97c6-1930-39a0601cc388.png)
Windowsで共有フォルダが出てこないときに確認したこと

## 前置き
今回自分が直面したシーンは、VPN接続でマシンA（Windows10）とマシンB（Windows Server 2022）を接続し、マシンBにある共有フォルダをマシンAから見ようとしてうまくいかなかったというものです。一般的なLAN構成でネットワーク越しに見れないというのとは若干異なっているかもしれませんが、チェックすべきポイントとしては同じことかなと思います。

## 発生事象
VPN接続としてマシンBに割り振られたIPアドレスをXX.XX.XX.XXとしますが、マシンAのエクスプローラーで\\\\XX.XX.XX.XXを指定してもエラーとなって共有フォルダが出てきませんでした。そればかりか、マシンBで\\\\XX.XX.XX.XXを指定してもアクセスできませんと言われてしまいました。

## 確認したこと
#### Ping
Pingは通っていました。

#### telnet
telnet XX.XX.XX.XX 445がエラーとなっていたため、ポート周りがおかしいのだろうというアタリは付けておりました。

#### ネットワーク設定
共有フォルダへのアクセスはプライベートネットワークになってないといけないため、VPN接続をプライベートネットワークにします。
[ファイル名を指定して実行]から、[gpedit.msc]でローカルグループポリシーエディターを開き、[コンピューターの構成]-[Windowsの設定]-[セキュリティの設定]-[ネットワークリストマネージャーポリシー]を展開します。
VPN接続にあたるものを右クリックしてプロパティを開き、[ネットワークの場所]タブで「場所の種類：プライベート」を選択します。「ユーザーは場所を変更できない」にチェックしておいていいと思います。
マシンAについても同様にします。

#### 共有設定
ファイル共有の設定を確認します。[ネットワークと共有センター]-[共有の詳細設定の変更]を開きます。「プライベート」の「ネットワーク探索」「ファイルとプリンターの共有」をいずれも有効にしておきます。

#### ポートの開放
共有フォルダへのアクセスには、TCPポート445が必要なので、これがファイアウォール（受信）で許可されるように設定します。コントロールパネルの[Windows Defenderファイアウォール]-[詳細設定]から[受信の規則]-[新しい規則]でTCPポート445を許可します。

#### IPセキュリティポリシー
これが今回さんざんググっても全く引っかからなかった情報で、かつ自分のケースの問題の原因でした。[ファイル名を指定して実行]から[secpol.msc]でローカルセキュリティポリシーを開いてみると、[IPセキュリティポリシー]のところにポート445をブロックするという設定がされていました。これを無効化します。

#### ちなみに
ググっていると、Windowsの機能の有効化の「SMB1.0/CIFS ファイル共有のサポート」をONにするという対応が出てきますが、今回の自分のケースではONにする必要はありませんでした。またローカルグループポリシーエディターの[コンピューターの構成]-[管理用テンプレート]-[ネットワーク]-[Lanmanワークステーション]で「安全でないゲストログオンを有効にする」というのもありましたが、それも関係なさそうでした。

### 備考：共有設定について
ここまでの設定（というか、IPセキュリティポリシー設定の発見）により、マシンB上で\\\\XX.XX.XX.XXをエクスプローラーで指定したら共有フォルダが表示されました。同様に、マシンAからも\\\\XX.XX.XX.XXを指定して共有フォルダが見えるようになりました。

フォルダ共有の際に特に何もアカウントの制限をかけていない（Everyoneに許可されている）状態なら、上記フォルダをダブルクリックで問題なく開くことが可能ですが、今回はアクセス可能なアカウントを1つ（userXとします）に制限しており、そのままだと「アクセス許可がありません」とエラーが出てフォルダを開くことができませんでした。

ググっているとWindows資格情報を指定するといった対応が出てくるのですが、自分のケースではいまいちうまくいきませんでした。最終的に、コマンドプロンプトで`net use`を下記のように利用することで、ドライブを割り当ててうまくアクセスできるようになりました。
```
net use (DriveLetter): \\XX.XX.XX.XX\shareName /user:userX passwordOfUserX
```
以上、同様の事象で困っている方のチェックポイントとして一助となれば幸いです。
【Ruby】配列への追加(push・unshift)・削除(pop・shift)が覚えずらい

# はじめに
こんにちは、progateでRubyを勉強したのち「ゼロからわかるRuby超入門」を勉強しています。
本書で配列への追加と削除コマンドを習ったのですが、覚えずら過ぎたので自分なりにまとめてみました。
同じ境遇の方の力になれば幸いです

環境：ruby 3.3.5

# それぞれの概要
まずは追加・削除コマンドのそれぞれの概要について説明したのち、整理していこうと思います
### `push`
まず、`push`は配列の末尾に要素を追加します。
```ruby:push.rb
drinks = ["カフェラテ", "コーヒー"]
drinks.push("紅茶")
p drinks  # => ["カフェラテ", "コーヒー", "紅茶"]
```

### `unshift`
`unshift`は、配列の先頭に要素を追加するメソッドです。
```ruby:unshift.rb
drinks = ["カフェラテ", "コーヒー"]
drinks.unshift("紅茶")
p drinks  # => ["紅茶", "カフェラテ", "コーヒー"]
```

### `pop`
`pop`は、配列の末尾の要素を削除するメソッドです。
```ruby:pop.rb
drinks = ["カフェラテ", "コーヒー"]
drinks.pop("コーヒー")
p drinks  # => ["カフェラテ"]
```

### `shift`
`shift`は配列の先頭の要素を削除するメソッドです。
```ruby:shift.rb
drinks = ["カフェラテ", "コーヒー", "紅茶"]
removed = drinks.shift
p removed  # => "カフェラテ"
p drinks   # => ["コーヒー", "紅茶"]
```

# 覚え方
これで追加・削除の方法は理解していただけたと思います。
ただし、これだとpushとunshiftどっちが先頭だったっけ？とかshiftとunshiftどっちが追加だったっけ？などいろいろ忘れてしまうと思います。
まずは追加・削除で分類するのではなく、<strong>先頭か末尾で分類</strong>しましょう。
`push`って後ろから押すイメージがあると思うので文末、同じ`p`から始まるので`pop`も文末です。
残った2つは先頭系のコマンドであると認識しましょう。

### 先頭のコマンド
`unshift`、`shift`は先頭のコマンドですね。
次にこれがどっちがどっちなのかを判別できるようになりましょう。
まず一番単語として聞きなじみがあるのは`shift`だと思います。
`shift`は英単語で位置を移動するって意味があります。先頭の単語が削除されるので、その空いているスペースをつめる（シフトする）って感じです。
`unshift`はその逆で、後ろにシフトしてもらって入れてもらうってイメージです
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883070/8ad6e860-2219-0f93-530f-7199ba309c31.png)

### 末尾系
`push`、`pop`は末尾コマンドですね。
`push`は何となくわかると思いますが、後ろから押して(プッシュする)追加するって感じです。
`pop`は日本語的な意味でいえば軽い感じのやつって意味があります。末尾かどうかは`push`と同じくpから始まるのでそれで覚えてもらって、`pop`は早く(末尾から)でたいと思っていて、ポンっと出て行ってしまう感じですね。
`pop`は英単語で破裂とか爆発的な意味もあるのでそれで覚えてもいいかもしれないですね
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883070/5c92179d-7574-aac5-3de7-a3fda4fbe664.png)

# まとめ
本日は配列への追加(push・unshift)・削除(pop・shift)が覚えずらいというタイトルでしたがイメージわきましたか。
こういうイメージを持っているだけで長期記憶に定着しやすいのですし、私は覚えずらいものは何かしらのとっかかりを見つけて覚えてますｗ
これを見ているということはrubyを始めて間もない方だと思うので一緒に勉強頑張りましょう。
RAGをはじめるならここから（仕組みを図解、超入門）

# はじめに
最近、RAG（Retrieval-Augmented Generation）という言葉を耳にすることが増えました。しかし、その具体的な意味や仕組みについてはよくわからない方も多いのではないでしょうか。そんな方々に向けて、RAGの基本をわかりやすく解説します。

# 筆者のレベル
- RAGという言葉に触れたことはあるが、その背後にある仕組みには詳しくなかった。
- RAGについてもっと深く学び、実際の応用に役立てたいと考えている。

# RAGの仕組み
RAGの仕組みをざっくりと図にすると、このような流れになります。ここで注目すべきは、全体が大きく二つのパートに分かれている点です。

- データの準備と埋め込みを行うパート（Augmented）
- データを検索し、回答を生成するパート（Retrieval ＋ Generation）

この二つのプロセスが連携することで、RAGは高精度な応答を実現しています。

![RAGの基本的な仕組み](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833753/9850a250-5b91-7cb3-1977-77069ff02210.jpeg)

# RAGのプロセスを詳しく見ていきましょう
RAGのプロセスは以下のステップから構成されています：

### ①分割
入力データは、情報の検索や処理を容易にするために**チャンク**（小さな単位）に分割します。

- チャンク化により、検索の精度が向上します。例えば、大量のテキストデータを数百文字程度の文単位や、意味的に関連のある情報単位で分割することで、検索効率を高め、モデルが必要な情報を迅速に取得できるようにします。このプロセスは、特に情報量が多い場合に効果を発揮し、必要なデータを瞬時に取り出すことが可能になります。

### ②埋め込み
分割したデータは、埋め込みモデルを用いてベクトル化し、**ベクトルストア**に格納します。

- 埋め込みは、テキストデータを数値のベクトルに変換するプロセスです。これにより、異なるデータ間の類似性を計算できるようになります。一般的に使用される埋め込み手法には、BERTやSentence-BERTなどがあり、これらは文脈を考慮したベクトル表現を生成します。埋め込み技術により、モデルは言語の意味を深く理解し、より関連性の高い情報を引き出すことができます。

### (1)検索
質問が入力されると、**ベクトルストア**から関連するチャンクを検索します。

- 検索プロセスでは、質問の埋め込みベクトルを生成し、ベクトルストア内のチャンクと比較して、最も関連性の高いものを特定します。この際、コサイン類似度やユークリッド距離などの距離計算手法が用いられ、効率的にデータを取得するための手段が提供されます。これにより、ユーザーの質問に対して最も適切な情報を迅速に見つけ出すことが可能になります。

### (2)検索結果、スコア
検索結果に対してスコアを付与し、どのチャンクが最も関連性が高いかを評価します。

- 検索結果のスコアリングは、関連度に基づいて順位を付けるプロセスです。このスコアは、情報の関連性や重要度を示します。例えば、スコアが高いチャンクは、質問に対してより直接的な回答を提供できる可能性が高まります。この評価プロセスによって、最も価値のある情報がユーザーに提示されます。

### (3)回答生成
最終的に、関連する情報を基に **大規模言語モデル（LLM）** が最終的な回答を生成します。

- LLMは、検索結果から得られた情報を統合し、自然な言語で応答を作成します。このプロセスでは、質問の文脈を考慮し、流暢で意味のある回答を生成します。

# RAGの範囲を確認しましょう

RAGは、その名の通り「Retrieval」「Augmented」「Generation」の三つの主要なコンポーネントから成り立っています。それぞれの範囲を理解することは、RAGの効果的な活用に欠かせません。これらのプロセスがどのように連携し、最終的な応答を生成するのかを把握することで、より高精度で柔軟な情報処理を実現できます。

### Retrievalの範囲
Retrievalは、関連する情報を外部のデータベースや知識ベースから引き出すプロセスです。
- **範囲**:
  - 検索クエリに基づく情報の取得
  - 大量のデータから特定のチャンクを迅速に特定する能力
  - 検索手法（例：k-NN、TF-IDF）や埋め込み技術を使用すること

### Augmentedの範囲
Augmentedは、生成される応答を向上させるために外部情報を統合するプロセスを指します。
- **範囲**:
  - 取得した情報を基にLLMが生成する回答の精度を高めること
  - ユーザーの質問や意図に応じた情報のカスタマイズ
  - 更新された情報を利用して、常に最新の応答を提供すること

### Generationの範囲
Generationは、言語モデルが自然言語のテキストを生成するプロセスです。
- **範囲**:
  - 入力された情報やコンテキストに基づく自然な文章の作成
  - 異なるスタイルやトーンの応答を生成する能力
  - 複雑な質問に対する詳細な回答を生成すること

# RAGの利点
- **高精度な回答**: RAGは、外部情報を活用することで、モデルが持つ知識だけに依存せず、より正確な回答を提供します。
- **柔軟性**: 新しいデータを容易に追加できるため、最新の情報を反映した応答が可能です。

# まとめ
本記事では、RAGの基本的な仕組みについて解説しました。これはあくまで基本的なフレームワークであり、さまざまな工夫や最適化を施すことで、さらに回答精度を向上させることが可能です。今後は、RAGに関する学習範囲を広げ、より深くこの技術について探求していきたいと考えています。
ix2105 ファームウェアアップデート

## 背景・環境
NECのix2105をVPNとして使おうと思ったが、公式の[設定ガイド](https://jpn.nec.com/univerge/ix/Support/ipv6/OCN-VC/index.html)を使用するにはバージョンが低すぎたため、アップデートすることにした。

* サーバー：ix2105 
     * ファームウェアバージョン：8.10.11

* 作業PC
    * MacBookPro 2019 
    * MacOS Sonoma 14.6.1


## 作業の概要
NECの公式からファームウェアのrapファイルをダウンロード後、MacのTFTPサーバー機能を使ってサーバーから受け取り、アップデートを行います。


## 手順
### ハードウェアの準備
1. ix2105のコンソールポートとMacをコンソールケーブルで接続する
1. ix2105のGE1ポートの1番とMacのLANポートを接続する

### サーバー側のセットアップ
今回私は初期化状態から始めました。必要に応じて初期化を行なってください。
[初期化手順：参考](https://zazameta.net/archives/4568)
バージョンの確認は以下のコマンドで行えます。アップデートを行う前に現在のバージョンを確認しておきましょう。
```
Router# show version
```

初期化してすぐはix2105にipアドレスが設定されていないため、設定します。手っ取り早く設定するために、本来WebGUIを起動するための基本設定をアクティベートするコマンドがあるため、今回はこれを使用します。
```
Router# default-console web
```
ルーターをリロードする旨の案内が出るため、restartコマンドで再起動します
``` 
Router# restart
```
その後ルーターにipアドレスが割り振られていることを確認します。
```
Router# enable-config
Enter configuration commands, one per line. End with CNTL/Z.

Router(config)# show ip address
Interface GigaEthernet1.0 is up, line protocol is up
  Internet address is 192.168.1.254/24
  Broadcast address is 255.255.255.255
  Address determined by config
Interface Null0.0 is up, line protocol is up
  Interface is unnumbered.

```
ipアドレスが192.168.1.254に設定されていることが分かります。

### Mac側のセットアップ
#### 更新ファームウェアの入手
NEC公式の[ファームウェアダウンロードページ](https://jpn.nec.com/univerge/ix/Download/index.html?)に行き、ファイルをダウンロードします。私は`ix2105-boot-18.2-gate-ms-10.1.22.rap`というファイルがダウンロードできました。

#### ネットワークの設定
先ほど確認した通り、ルーターのipアドレスが192.168.1.254に設定されているので、それに合わせてMac側のipアドレスを手動で合わせます。
システム設定 > ネットワーク > 詳細 > TCP/IP
からIPv4の構成を手動に切り替え、IPアドレスを設定します。
今回私は`192.168.1.10`に設定しました。
サブネットマスクも`255.255.255.0`に設定しておきます。

#### TFTPサーバーのセットアップ
Macには標準でTFTPサーバー機能があるため、それを使っていきます。
ターミナルを開き、コマンドを実行していきます。
```
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
sudo launchctl start com.apple.tftpd
```
TFTPサーバーのファイルをやり取りするデフォルトのディレクトリは`/private/tftpboot`です。手に入れたファームウェアのファイルをこのディレクトリにコピーします。

```
sudo mkdir /private/tftpboot
sudo cp /path/to/file/ix2105-boot-18.2-gate-ms-10.1.22.rap /private/tftpboot
```
フォルダとファイルに権限を付与します。
```
sudo chmod 777 /private/tftpboot
sudo chmod 777 /private/tftpboot/ix2105-boot-18.2-gate-ms-10.1.22.rap
```
以上でTFTPサーバーが起動し、ファイル転送を行う準備が整いました。

### 更新の実行
ix2105に戻り、更新のコマンドを実行します。
```
Router# enable-config
Enter configuration commands, one per line. End with CNTL/Z.

Router(config)# software-update tftp://192.168.1.10/ix2105-boot-18.2-gate-ms-10.1.22.rap
```
自動で更新が始まり、数分で完了のテキストが表示されます。
完了したらリスタートします。
```
Router# restart
```
再起動完了後、`show version`コマンドでバージョンが上がっていることを確認できます。


### TFTPサーバの停止
使用が終了したら忘れずにTFTPサーバを停止しましょう
```
sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist
sudo launchctl stop com.apple.tftpd
```
M2 MacbookのRuby環境構築について

## Ruby の環境構築について

PC を新調して Macbook M2 になったので改めてRubyの環境構築してみてみました。
私の環境構築が誰かに役立てればと思います。
ただ、プログラミングは初心者で環境構築に関しても知見が浅いため、間違っていれば指摘していただけると嬉しいです。

### 前提 

VScode はインストール済みです。
PC の概要は以下です。
・Apple M2
・Mac OS sonoma 14.6.1（23G93）


## ▼　Command Line Tools をインストール
Command Line Tools は Web アプリケーション開発に必要なソフトウェアをダウンロードするために必要な機能みたいです。
以下のコマンドでインストールできます。

```
% xcode-select --install
```

## ▼　Homebrewを用意しよう！
Homebrew は、ソフトウェア管理ツールです。
M2 の場合以下のコマンドでインストールできました。
```
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
確認コマンド。
```
% brew -v
# 結果↓
# @MacBook-Air ~ % brew -v

Homebrew 4.4.0
```

Homebrew をアップデートするコマンド。
```
% brew update
```

Homebrew の権限を変更する。
```
% sudo chown -R `whoami`:admin /usr/local/bin
```

## ▼ Ruby をインストールする。
rbenv と ruby-buildをインストール
```
% brew install rbenv ruby-build
```

rbenv をどこからも使用できるようにする。
```
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```
zshrc というのは、設定ファイルの名称。

```
% source ~/.zshrc
```

readline を install しよう。

```
% brew install readline
```

readline をどこからも使用できるように設定する。
```
% brew link readline --force
```

rbenv を利用して Ruby をインストールする。
```
% RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
% rbenv install 3.3.5
```

利用する Ruby のバージョンを指定する。
```
% rbenv global 3.3.5
```

rbenv を読み込んで変更を反映させる。
```
% rbenv rehash
```

Rubyのバージョンを確認するコマンド
```
ruby -v

# 結果
# ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [arm64-darwin23]
```

私はこれでRubyの環境構築ができました〜〜！

次回は、Railsのインストールして他にいるものもインストールするところまで行ってみたいと思います。