OmniAICreator/Qiita-1.07M huggingface dataset:
非常に便利なhping3

いつも負荷試験等でお世話になっているhping3についての記事です。

:::note warn
※攻撃ツールとして利用することは厳禁であり、必ず管理下にあるノードに対してのみ実行しましょう。
:::

hping3は非常に強力なツールで、TCP/IPパケットの生成、送信などができネットワークの診断やセキュリティテストなど幅広く利用されていると思います。ただ負荷試験については場合によってですが、そのままの利用ができないパターンもあります。

その一つとして、hping3には時刻データを含むパケットを送信する機能がありません。そのため、時系列データを伴う負荷試験にhping3を利用するのは難しくなります。

**※もちろん、JMeterとかGatlingを使うという方法もありますが、時系列データのテストにDummyデータ送りたいだけの場合とか、わざわざ新しいツール覚えるより手っ取り早くhping3のみで負荷試験して時間短縮したいですよね？**

そこで、今回はあるデータを大量に送信しつつも、送信タイミングの日時をデータ内のタイムスタンプフィールドに設定するという事をやってみました。（※コンマ何秒という世界までは考慮できていませんがそれでもある程度、時系列データのDummyデータとして役に立ってくれそうです。）


# 前提
OS：CentOS7.9(3.10.0-1160.108.1.el7.x86_64)
hping3: hping version 3.0.0-alpha-1 ($Id: release.h,v 1.4 2004/04/09 23:38:56 antirez Exp $)
python3: Python 3.10.2

# 1. ログファイルの準備
送りたいログを準備します。送りたいデータには以下のような日時データを含む想定としています。
```bash
2024/06/22 13:00:00
```

# 2. ツールの準備
まずは日付を変更するためのスクリプトを準備します（これはpythonで作成しました。）
```python
#update.py
import sys
import re
import time
from datetime import datetime

# ログファイルのパス
LogPath = f"/opt/DummyTools/data/" + sys.argv[1]

# 現在のタイムスタンプとフォーマットされた日時を取得
CurrentDatetime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")

# ログ読込み
with open(LogPath, 'r') as file:
    LogData = file.read()

# 日時置換え
LogData = re.sub(r'\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}', CurrentDatetime, LogData)

# 更新されたログファイル書込み
with open(LogPath, 'w') as file:
    file.write(LogData)
```

続いて、データ送信するためのShellScriptを作成します。
このShellScriptは先ほどのpythonスクリプト(update.py)に準備したデータを渡しつつ、2000パケットを準備するために0.1ミリ秒(u100)を指定し、さらに送信元IPを偽装してデータ送信させるためのスクリプトになります。※このu100などはそれぞれのシステムで調整が必要かもしれません。
```bash
# SendUdpPackets.sh
#!/bin/bash

TARGET_IP="xx.xx.xx.xx"                   #データ送信先サーバのIP
TARGET_PORT=xxxx                          #データ送信先サーバの待ち受けPort

LOG_FILE="/opt/DummyTools/data/$1"        #送りたいデータが格納されているデータ 

COUNT=10000000                            #送りたいデータ個数

INTERVAL=0.5

for ((i=0; i<COUNT; i++))
do
  python3 /opt/DummyTools/data/update.py $1
  hping3 --udp -p $TARGET_PORT -d $2 -E $LOG_FILE -i u100 -c 2000 -a $3 $TARGET_IP
  sleep $INTERVAL
done
```

# 3. ツール実行
実行には引き数を３つ渡します。

```bash
引き数1: 送信したいデータファイル名
引き数2: 送信したいデータファイルのサイズ(Byte)  #ls -lなどでサイズ調べておく。
引き数3: 送信元IPアドレス
````

では実行してみます。
```bash
# 実行例
cd /opt/DummyTools/data/       #ファイル保存場所、実行パスなどは適宜変更してください。
SendUdpPackets.sh test.txt 620 xx.xx.xx.xx

Sending packet with updated log file content
HPING xx.xx.xx.xx (ens192 xx.xx.xx.xx): udp mode set, 28 headers + 620 data bytes
[main] memlockall(): Success
Warning: can't disable memory paging!'

--- 10.2.0.31 hping statistic ---
2000 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
Sending packet with updated log file content
HPING xx.xx.xx.xx (ens192 xx.xx.xx.xx): udp mode set, 28 headers + 620 data bytes
[main] memlockall(): Success
Warning: can't disable memory paging!

※以下繰り返し。
```

これで秒間2000パケットのデータ(日時変更済み)が宛先に飛びます。

Portを変更したり、宛先を変更・日次の正規表現をログ仕様に合わせることで色々なログフォーマットにも対応できると思いますし、この大量のdummyにひっそりと意味のあるデータを手動で混ぜ込ませて検知できるか？っと言った用途にも利用できると思います。

同じく負荷試験などでお困りの方のお役に立てれば幸いです。
Cloud Storageにデータをアーカイブする方法：TNOアプローチの解説

## はじめに 

データをGoogle Cloud Storageにアーカイブする際、特に機密性の高いデータを扱う場合には「Trust No One（TNO）」アプローチを使用することが推奨されます。このアプローチにより、クラウドプロバイダーのスタッフがデータを解読できないようにすることができます。本記事では、TNOアプローチを使用してデータを暗号化し、Cloud Storageに安全に保存する方法を解説します。

## 基本的な概念と原則

### Cloud Storage
Google Cloudのオブジェクトストレージサービスで、バイナリーデータなどの様々なデータを保存、取得することができます。耐久性とスケーラビリティがあり、データのアーカイブやバックアップに適しています。

### Trust No One（TNO）
機密データのセキュリティアプローチで、データを所有者自身が暗号化し、キーを保持します。クラウドプロバイダーや他の第三者がデータを解読できないようにすることを目的としています。

### 顧客指定の暗号化キー（CSEK）
Google Cloud Storageで使用できるセキュリティ機能の一つで、ユーザー自身が管理する暗号化キーを使用します。このキーはGoogleでは管理されず、ユーザーのみが管理します。

### .boto設定ファイル
gsutilコマンドラインツールの設定ファイルであり、CSEKなどの設定を指定することができます。

### gsutil
Google Cloud Storageと通信するためのPython製コマンドラインツールで、データのアップロードやダウンロードなどの操作を行います。

### gcloud kms keys
Google Cloud KMSで暗号キーを作成するコマンドです。キーのローテーションや暗号化、復号化が可能です。

## 要件を満たすためのステップ

### 1. gcloud kms keys createを使用して共通鍵を作成
まず、共通鍵を作成します。この鍵を使用してデータを暗号化します。

```bash
# KMSキーリングを作成
gcloud kms keyrings create my-key-ring --location global

# KMS暗号キーを作成
gcloud kms keys create my-key --location global --keyring my-key-ring --purpose encryption
```

### 2. gcloud kms encryptを使用して各アーカイブファイルを暗号化
次に、作成したKMSキーを使用してアーカイブファイルを暗号化します。

```bash
# ファイルを暗号化
gcloud kms encrypt --location global --keyring my-key-ring --key my-key \
  --plaintext-file my-archive-file.txt --ciphertext-file my-archive-file.txt.enc
```

### 3. gsutil cpを使って、暗号化された各ファイルをCloud Storageバケットにアップロード
暗号化されたファイルをCloud Storageにアップロードします。

```bash
# 暗号化されたファイルをアップロード
gsutil cp my-archive-file.txt.enc gs://my-bucket/
```

### 4. .boto設定ファイルに顧客指定の暗号化キー（CSEK）を指定
.boto設定ファイルにCSEKを指定して設定します。

```ini
# .boto設定ファイルの例
[GSUtil]
encryption_key = <base64-encoded encryption key>
```

### 5. gsutil cpを使用して、各アーカイブファイルをCloud Storageバケットにアップロード
先ほどと同じように、gsutil cpコマンドでファイルをアップロードします。この際、CSEKが適用されます。

```bash
# CSEKを使用してファイルをアップロード
gsutil cp my-archive-file.txt.enc gs://my-bucket/
```

### 6. セキュリティチームのみがアクセスできる別のプロジェクトにCSEKを保存
セキュリティチームのみがアクセス可能なプロジェクトにCSEKを安全に保存します。

```bash
# CSEKを保存するためのプロジェクトに移動
gcloud config set project my-security-project

# キーを保存（例：Secret Managerを使用）
echo -n "<base64-encoded encryption key>" | gcloud secrets create my-csek --data-file=-
```

## 結論

以上の手順で、機密データをTNOアプローチで暗号化し、Cloud Storageに安全に保存することができます。この方法により、クラウドプロバイダーのスタッフがデータを解読するリスクを排除し、データの機密性を保護することができます。
TailwinMergeで競合するTailwindCSSクラスを解決する

# はじめに
tailwind-mergeは競合するTailwind CSSクラスを解決してくれるライブラリです。
同じTailwind CSSクラスが指定された際に役立ちます。

https://github.com/dcastil/tailwind-merge


# ゴール

tailwind-mergeを使ってReactコンポーネントを作成する。


# 環境
- React：18.3.1
- Vite：5.3.1
- tailwindcss：3.4.4
- tailwind-merge：2.3.0

Viteを利用したReactとtailwindcssの環境構築は下記の記事が参考になります。

https://qiita.com/enumura1/items/71d4b4f75123cf5135fa


# tailwind-merge のインストール

tailwind-mergeをインストールします。

```
npm i tailwind-merge
```

https://www.npmjs.com/package/tailwind-merge

# 使い方

次の例では`text-red-600`と`text-black-600`が競合していますが、tailwind-mergeが後者を優先してくれます。このように競合するTailwindCSSのクラスをマージする事ができます。

```tsx
// 結果は 'bg-blue-500 text-white'
const mergedClassName = twMerge('text-red-600 text-white', 'text-black-600');
```


# コンポーネント化して使ってみる

twMergeを使用し次のようにReactコンポーネントを作成します。
`className` 属性には、twMerge を使ってデフォルトのクラス（第一引数）と動的な className（第二引数） をマージした結果を設定します。

```tsx:sample.tsx
import { ReactNode } from 'react';
import { twMerge } from 'tailwind-merge';


interface ButtonProps {
  className: string;
  children: ReactNode;
}

const Button = ({ className, children } : ButtonProps) => {
    return (
      <button className={twMerge('px-4 py-2 font-light bg-blue-300 mt-5', className)}>
        {children}
      </button>
    );
};
  
export default Button;
```

上記作成した `Sample` コンポーネントを表示します。
`Sample` コンポーネントではデフォルトのクラスとマージされ、`px-4 py-2 bg-green-500 font-bold mt-10` が適用されます。

```tsx:App.tsx
import Sample from './Sample';

function App() {

  return (
    <div className="flex flex-col items-center justify-center min-h-screen">
      <h1 className='font-bold text-4xl	'>Hello World!</h1>
      {/* 結果は px-4 py-2 bg-green-500 font-bold mt-10 が適用*/  }
      <Sample className="bg-green-500 font-bold mt-10">ボタン</Sample>
    </div>
  )
}

export default App
```


# 実行結果

次のコマンドで実際にブラウザで確認してみると、`px-4 py-2 bg-green-500 font-bold mt-10`が適用されてることを確認できました。

```
npm run dev
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/531737b1-0a23-11d4-687a-2d8d781cf92b.png)


# 参考

https://github.com/dcastil/tailwind-merge

https://www.npmjs.com/package/tailwind-merge
【Rails, MySQL, ORM】where('user.id': 1)ってことができる

業務開発でRailsを使用しており、ORMもよく使用しているのですが、業務開発を通して知った `where` 句の文法的なのをここで紹介していきます。

## where(column: value)
これはRailsのwhere句の一番オーソドックスな書き方だと思います。
whereをメソッドチェーンで繋げていけば `and` 句となり条件をより絞ることができます。
```ruby
# e.g.
User.where(id: 1)
User.where(gender: "man").where(name: "hoge")
```

## where(column: [value])
これはいわゆる `where in` 句の書き方で、 `or` 検索をかけたい時は基本的にこの書き方が一番いい気がします。
若干話が変わりますが、SQLアンチパターンにおいて、 `or` 検索はインデックスが効かない `where` 句の書き方ですが、 `where in` 句はインデックスが効く書き方なので、もし `or` のような**和集合条件**でインデックスが効く検索をしたい場合は **`where(column: [value])`** のパターンが個人的には一番いい気がします。

::: note
DBのインデックスについては、下記の記事が非常にわかりやすいと思います。
:::

https://qiita.com/masayasviel/items/b4f2fe76235f30270b07

```ruby
# e.g.
User.where(id: [1, 2, 3])
User.where(gender: [1, 2]).where(name: ["hoge", "ruby"])
```

## where('RAW SQL')
これは引数を全て文字列にすることで、実際のSQLの構文を用いた `where` 句を書くことができます。しかし、これは避けされるのなら基本的に避けたい書き方かなと思います。**SQLインジェクション**に繋がりかねない書き方という点、Rubyの特徴に合わせたORMの利点が欠けてしまう点、という二つから個人的にはそこまでおすすめはしないです。
が、やはり複雑な条件をつけなければならない時はいつかくるし、その時は仕方なく使っています。
```ruby
# e.g.
User.where('id = 1')
User.where('gender in (1, 2)').where("name = 'hoge'")
```

## where('RAW SQL ?', value)
先ほどの生SQLに、動的な値を入れたい場合に使用する書き方です。
`?` を生SQLの部分に記述すると、その後引数に入れた値が入るので、動的に検索することが可能になり便利です。この記法は、サニタイズされた値が `?` の部分に入るので、SQLインジェクションの可能性が非常に低いです。

https://zenn.dev/igaiga/books/rails-practice-note/viewer/ar_sql_injection

```ruby
# e.g.
User.where("id = ?", 1)
# ?をつけた分だけ、動的な値を入れることができます
User.where("gender = ? and gender = ?", 1, 2)
```

## where('RAW SQL ?', [value])
これはほぼ `where in` 句専用と言っても個人的には過言ではない書き方です。てかもしかしたら `where in` 専用な気がしてきました。`?` に、配列の要素を展開してSQLを作ってくれます。 

```ruby
User.where('id in (?)', [1, 2, 3, 4])
User.where('gender in (?)', [1, 2])
```

## where('column': value)
この記事を書く直近でこの書き方を知ったのですが、個人的に結構衝撃でした。
というのも、結合したテーブルのレコードにも対して `where` 句が書けるからです。今までは上記で紹介した `where('RAW SQL')` を使って書いていたので、結合したテーブルの条件場面ではよく使用しています。

```ruby
# e.g.
User.joins(:posts).where('user.id': 1).where('post.id': [1, 2, 3])
```
[Dify]Workflowの最大ステップ数の上限を増やす！


Difyの記事を投稿した時にXで以下のようなコメントをもらいました。

https://x.com/fujimaru0227/status/1804086018573824028

これ確かにWorkflowの最大ステップ数を増やす方法どうすればいいのかな？と思い解決策を見つけてみました！
皆さんも簡単にWorkflowの最大ステップ数を増やすことができるので困っている人は一度やってみてください！

## 最大ステップ数を増やす解決策

docker-compose.ymlのapiに以下を環境変数として追加してください。
今回は動作を簡単に確認したいため、ステップを10としてすぐに停められるようにしています。

```
WORKFLOW_MAX_EXECUTION_STEPS: 10
```


実際に10ステップ以上のものを実行しようとすると以下のようになります。
![スクリーンショット 2024-06-22 11.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/6cb4e1ff-45c0-5696-07a8-7187a473a30d.png)

## 最後に

Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto
[Dify]ベクトルDBでpgvectorを使おう

みなさん、Difyで使用しているベクトルDBは何を使用していますか？
私はローカルでDifyを使用する場合はweaviateを使用していますが、クラウド上にホスティングする際には使用するサービスが増えるのことを避けたく、PostgreSQLで完結するようにpgvectorを使用しています。

割と簡単に設定できるので今回はそれを解説します。


## pgvectorの設定
docker-compose.pgvector.yamlの設定ファイルがありますが、前置きにもありましたが既存のpostgreSQLに設定する方法を解説します。
以下をpostgresのcli内で実行してください。

```
postgres=> CREATE EXTENSION IF NOT EXISTS vector;
```

これでpgvectorの拡張機能が有効になりました。
気をつけて欲しいことはdocker-compose.pgvector.yamlで立ち上げた場合は今回の設定はおそらく必要ないと思います。（やっていないのでわからないですが。）


## Dify環境変数の設定

続いてDify側での環境変数の設定です。以下をdocker-compose.ymlで実行して下さい。

```
VECTOR_STORE: pgvector
PGVECTOR_HOST: "ご自身が設定したもの"
PGVECTOR_PORT: 5432　#docker-compose.pgvector.yamlで立ち上げた場合は5433なのは注意です
PGVECTOR_USER: "ご自身が設定したもの"
PGVECTOR_PASSWORD: "ご自身が設定したもの"
PGVECTOR_DATABASE: "ご自身が設定したもの"
```

これだけでpgvectorをつかるのでぜひやってみてください。

## 最後に
Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto
AWS Summit Japan 2024へ行きました

https://aws.amazon.com/jp/summits/japan/

「AWS と創る次の時代」ということで、2024年からは生成AIが大きく推されていくと感じました。

以下ただの感想です...

### 初日
朝到着が早過ぎて12番乗りくらいで入場できました😆
![IMG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/f25be1bf-9830-799c-9970-e8963cb21b89.jpeg)

### 基調講演
![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/c6499a26-2a4c-0a1e-f75e-da1e09e075d5.jpeg)
Anthropicのジャレッド カプラン氏

### 会場のようす

![IMG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/3062fd5b-e1fa-131e-8e8c-a7c8bc8b84fa.jpeg)

AWSのスタッフさん曰く、5万人ほどの来場者が来たとか？？


### QuizKnockとクイズで学ぶ AWS
6/22の18時から30分ほど開催されたクイズ大会ですが、ブースに溢れかえるほどの人数が参加していました！

### AWS DeepRacerも開催されていました
![IMG_15](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/9ab94d4f-c337-356a-d4c3-46747c277586.jpeg)
いつかは参加してみたいです！

### serverlesspresso
AWSサーバレスサービスで構築された注文システムでコーヒーが注文できるブースがありました！コーヒー美味しかったです、ありがとうございます‼︎

![IMG_1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1d5e0e4f-0600-7abc-8b80-65181a17a3f0.jpeg)

![IMG_](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/aa683df6-fe05-2fca-9fda-14489bff6e8c.jpeg)

サーバレスに関する質問も受け付けていて、サーバレス好きなので色々お話をしました☺️

### 個人的に良かったセッション
サーバレスの活用についてのセッションで為になりました！
![IMG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/d0a438a2-352d-a191-7b37-41086a9fc14d.png)


### 最後に
様々なAWSサービスに関する情報を浴びることが出来ました。
いい刺激になったと思います！AWSサービスを使ってイノベーションを！✨
Burcam Grinder Pump 400700 User Guide

1. Introduction
The Burcam Grinder Pump 400700 is designed for residential and light commercial sewage applications. This guide will provide information on the installation, operation, and maintenance of the grinder pump.

2. Safety Instructions
Read all instructions before operating the grinder pump.
Electrical Safety: Ensure the power supply is disconnected before installing or servicing the pump.
Installation Compliance: Follow local electrical and plumbing codes.
Avoid hazards: Do not use the pump for applications other than those intended.
3. Specifications
Model Number: 400700
Horsepower: 3/4 HP
Voltage: 115V / 230V
Frequency: 60 Hz
Discharge Size: 1-1/4 inch NPT
Max Flow Rate: 50 GPM
Max Head: 50 feet
4. Installation Instructions
A. Tools and Materials Required
Pipe wrench
Screwdriver
PVC piping and fittings
Pipe sealant
B. Installation Steps
Positioning: Place the pump in the sump basin. Ensure it is stable and level.
Piping:
Connect the discharge pipe to the pump outlet.
Install a check valve in the discharge line to prevent backflow.
Use pipe sealant on all threaded connections to prevent leaks.
Electrical Connection:
Ensure the power supply matches the pump’s voltage rating.
Connect the pump to a grounded outlet or hardwire according to local codes.
Install a dedicated circuit breaker for the pump.
Ventilation: Ensure the sump basin is properly vented to avoid gas buildup.
Testing:
Fill the sump basin with water.
Turn on the power and observe the pump operation.
Check for leaks and proper discharge.
5. Operation
The grinder pump operates automatically with a float switch that activates the pump when the water level rises.
Regularly inspect the pump and basin to ensure proper operation.
Avoid disposing of materials that can damage the pump such as diapers, rags, or large solid objects.
6. Maintenance
Monthly: Inspect the pump for debris and clean if necessary.
Annually: Have a professional check the pump and electrical connections.
Troubleshooting
Pump not starting: Check the power supply and float switch operation.
Reduced flow: Inspect the discharge pipe and check valve for blockages.
Pump runs continuously: Verify float switch is not obstructed and check for leaks in the discharge line.
This guide should help you with the basic installation, operation, and maintenance of your Burcam Grinder Pump 400700. For detailed technical support, always refer to the official manual provided with your unit or visit the manufacturer’s website.
ZipArchiveのopenの結果が分かり難い時のメモ

## openの結果が分かり難い

ZIPをopenしようとしたけど、エラーになる。
そこで、結果を出力すると以下の様になってします。

```example.php
    $zip = new ZipArchive;
	$res = $zip->open($filename);
    echo 'result: ', $res, "\n";
    // result: 1
```
## 定数の値が何か分からない

仕方ないので、PHPのドキュメント見に行くと、今度は定数の説明はあるがその定数の値が何か分からない。

## 結論

マップを作った。

```zip_reason.php
<?php
const ZIP_REASON = [
	'ER_OK',
	'ER_MULTIDISK',
	'ER_RENAME',
	'ER_CLOSE',
	'ER_SEEK',
	'ER_READ',
	'ER_WRITE',
	'ER_CRC',
	'ER_ZIPCLOSED',
	'ER_NOENT',
	'ER_EXISTS',
	'ER_OPEN',
	'ER_TMPOPEN',
	'ER_ZLIB',
	'ER_MEMORY',
	'ER_CHANGED',
	'ER_COMPNOTSUPP',
	'ER_EOF',
	'ER_INVAL',
	'ER_NOZIP',
	'ER_INTERNAL',
	'ER_INCONS',
	'ER_REMOVE',
	'ER_DELETED',
];
/**
 * Zipのopenのエラーコード名を取得する
 * @param {int} $code リザルトコード
 * @return string エラー名
 */
function getZipReason($code): string {
	return ZIP_REASON[$code] ?? 'undefined';
}
```

<a href="https://raw.githubusercontent.com/chaftta/JumbledCodes/master/php/zip_reason.php" download="zip_reason.php">ソース</a>

リンクから直接ソース単体をダウンロードできる方法は無いのだろうか…。
Kotlin でServlet

# 概要
(日記) そうだServletを作ってみよう

# 環境
- Kotlin
- Amper

# Jvmで普通にWar(Servletアプリ)作成

[Kotlin公式文書](https://ktor.io/docs/server-war.html#configure-gretty)

```yaml:module.yaml
product: jvm/app

dependencies:
  - jakarta.servlet:jakarta.servlet-api:5.0.0
```
```build.gradle.kts
plugins {
    war
}
```
```kotlin:settings.gradle.kts (IntelliJの新規プロジェクトで生成された)
pluginManagement {
    repositories {
        mavenCentral()
        google()
        gradlePluginPortal()
        maven("https://maven.pkg.jetbrains.space/public/p/amper/amper")
        maven("https://www.jetbrains.com/intellij-repository/releases")
        maven("https://packages.jetbrains.team/maven/p/ij/intellij-dependencies")
    }
}

plugins {
    id("org.jetbrains.amper.settings.plugin").version("0.2.0")
}

rootProject.name = "test"
```
```src/Main.kt
import jakarta.servlet.annotation.WebServlet
import jakarta.servlet.http.HttpServlet
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse

@WebServlet("/echo")
class HelloServlet : HttpServlet() {
    public override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) {
        resp.writer.write("Hello, query='${req.queryString}'")
    }
}
```

```sh:ビルド
sh gradlew war
```
`build/libs/test-1.0-SNAPSHOT.war` のように生成される。

# テスト実行
Gretty pluginを使用し、Tomcat10の上で実行
```build.gradle.kts
plugins {
    war
    id("org.gretty") version "4.0.3"
}

gretty {
    httpPort = 8081
    servletContainer = "tomcat10"
}
```

```sh:
sh gradlew appRun
```
ブラウザで`http://localhost:8081/test/echo`を開くと応答が表示される。

[ここまでのソース](https://github.com/kyoya-p/samples/tree/8f50c50d6d45cf151f9f4ec1746266816fdd29f8/2024/KtWarTrial)
【tips】VSCodeのTS静的解析を再実行する【VSCode,Typescript】

# はじめに
業務中にたまたま知ったお役立ち情報です
## シチュエーション
VSCodeでTypescriptを編集している時、合ってるのになぜかエラーが出る場合。
だいたいVSCodeを再起動すると治る症状。

※tsconfig.jsonとか直したときによく出るイメージ

## 解決方法
１. VSCodeで.tsファイルを開く
２. Ctrl + Shift + P でコマンド一覧を開く
３. `restart ta server`コマンドを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773132/fd17a619-9bed-ed1b-2161-a2c89df99870.png)
DB周りの勉強


# 備忘録
「[詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド](https://www.shoeisha.co.jp/book/detail/9784798147406)」を読みながら学習していたときの自分用のメモ。


## カーディナリティ
テーブルのカラムに格納されているデータの種類がどの程度あるかを示す値をカーディナリティという。あるカラムに性別を格納した場合は、データの種類は男と女で２種類となるためカーディナリティは２となる。

またインデックスを作るときの目安は、そのカラムで検索したときに全体の5%に絞り込めるカーディナリティであること。上記の性別の例だと、1/2で50%でしかないため、この場合はインデックス作成はしない方が良いという判断。

複合インデックスを貼るときはカーディナリティが高い方から順に貼っていく。


### 参考
- https://qiita.com/soyanchu/items/034be19a2e3cb87b2efb

## MysqlのJOINアルゴリズム
NJL（ネステッドループJOIN）しか存在しない。その他のJOINアルゴリズムとして、ソートマージJOINやハッシュJOINなどがあるが、MysqlはNJLのみ。基本となるアルゴリズムはループ。

JOINのキーが指定されたり、WHERE句で絞り込みをこなった場合のアルゴリズム

```
for each row in t1 matching where condition
{
    for each row in t2 matching join and where condition
    {
        send joined row to client
    }
}
```

- ループになっているため、テーブル数が増えればループのネストがどんどん深くなる。
- できるだけ早い段階で多くの絞り込みを行うほうが効率的なクエリになる（つまり、順序がクエリを効率化するために重要な要因になる）

### 内部表と駆動表
JOINするときのベースになる表が**駆動表**で、外部表にくっつく表が**内部表**と呼ばれる。JOINのアルゴリズム例で載せたプログラムの例では、t1が駆動表であり、t2が内部表となる。

### BNLJ
駆動表から１行フェッチするたびに、その行とマッチする内部表をスキャンするときにインデックスが使えない場合は、スキャンが繰り返されるため非常に効率が悪い。内部表が巨大であれば致命的な効率の悪さになる。

可能であればインデックスを貼るべきだが、インデックスがあれば更新コストが高くなったり、必要なストレージのサイズも増える。

BNLJはそのような場合にJOINバッファというメモリ領域を使って内部表がスキャンされる回数を減らすアルゴリズム。

1. 駆動表から条件にマッチする行をフェッチするとJOINバッファに貯める
1. JOINバッファが一杯になったら内部表をスキャンしてマッチする行を探す

##### ポイント
- JOINバッファにためてまとめて内部表をスキャンすることでI/O負荷を軽減
- バッファに貯められたデータと内部表の行が逐一比較されるためCPUには負荷
- バッファサイズが大きすぎるとメモリ割り当てのオーバーヘッドが増加、メモリ枯渇の可能性
- JOINバッファはセッションごとに変更可能





#### 参考
- https://zenn.dev/captain_blue/articles/three-types-of-join-algorithms
2024/6/22主にITとかセキュリティの記事

「Juniper Secure Analytics」のアップデートで200件以上の脆弱性を解消
https://www.security-next.com/158698

Fortraのファイル転送ソリューション「FileCatalyst」に脆弱性
https://www.security-next.com/158659

Atlassian、6月のセキュリティアドバイザリを公開
https://www.security-next.com/158676

医療ユニフォームメーカーの通販サイトに不正アクセス - 個人情報が流出
https://www.security-next.com/158622

教員がサポート詐欺被害、個人情報に攻撃者がアクセス - 熊取町
https://www.security-next.com/158094

フランスのグループ会社でランサム被害、詳細を調査 - ダイセル
https://www.security-next.com/158693

スマホサポーターの個人情報が流出、閲覧権限設定ミスで - 東京都
https://www.security-next.com/158689

ファッション通販「ZOZOTOWN」のAndroidアプリに脆弱性
https://www.security-next.com/158673

AWSが東京リージョンで「Claude 3」を提供へ、生成AIの強化を発表(6/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02875/062000003/

安全性が低いネットワークに誘導　全無線LAN機器を脅かす脆弱性(6/21)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100113/061800135/

長野の県立高校2校で立て続けにサポート詐欺、個情委への報告を忘れ行政指導(6/21)
https://xtech.nikkei.com/atcl/nxt/column/18/01157/061900113/

話題の最新生成AIモデル「GPT-4o」を試す、画像分析やOCRの処理を手軽に実装(6/21)
https://xtech.nikkei.com/atcl/nxt/column/18/00160/061900409/

AIによるズルをどこまで許容？　禁止する分野と代替不可能な分野(6/21)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100112/061800096/

生成AIを賢くするメガプロンプト　ファインチューニングは有害？(6/21)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100111/061900126/
WindowsのBad_System_Config_Infoを修復する方法

:::note warn
今回の内容を使用して起きた問題について一切の責任を負いかねます。ご了承ください
:::
# 初めに
今回はBad_System_Config_Infoというブルースクリーンを修復する方法を紹介します。

# Bad_System_Config_Infoとは
そもそもこのエラーは、以下の理由で発生することが多いです（多分）:
・レジストリの設定が正しくない
・マルウェアなどの感染によるレジストリ又はシステムファイルの改変
・HDDの物理的な故障
# 修正する方法
修正する方法はいくつかあります。（今回は一部を表示します）
### 方法1:sfc /scannow
まず、以下のコマンドを入力してください:
```:cmd
sfc /scannow
```
もし問題が見つかったら、以下のコマンドを実行します。
```:cmd
dism /online /Cleanup-Image /RestoreHealth 
```
これで再起動してみてください
### 方法２:bootrecコマンド
以下のコマンドを上から順番に実行します。
```:cmd
bootrec /fixmbr
bootrec /fixboot
bootrec /rebuildbcd
```
終わったら再起動してみてください
### 方法３:chkdsk
以下のコマンドを実行します
```:cmd
chkdsk c: /f /r
```
しばらく待ちます...
chkdskが終わったら再起動します。
# 最終手段：Windowsの再インストール
### 注意
Windowsを再インストールする場合は、全データ(ネット、アカウント設定含む)が消えることになるので、データをUSBメモリなどにバックアップすることをお勧めします。
また、上記以外の別の方法で治る可能性があるので、実行する前に少し調べてみることをお勧めします。
## 手順
まず、以下のページにアクセスして、Windowsのインストールメディアの作成ツールをダウンロードしてインストールメディアをを作成してください。
[windowsインストールメディアの作成 - Windows10](https://www.microsoft.com/ja-jp/software-download/windows10)
[Windowsインストールメディアの作成 - Windows11](https://www.microsoft.com/ja-jp/software-download/windows11)

### インストールメディアの作成に必要なもの:
・インストールメディアに使用して問題ないというUSBディスク(中に入っているデータが消えます。)
・ネット接続(インストールメディアを作成しているときにネット接続が必要です。)
多分以上のものが必要です
1,インストールメディアを作成したら、Windowsを回復環境で開きます。
### 回復環境の開きかた
電源を入れてからロゴが表示されたら電源を切る
これを自動修復を準備していますが表示されるまで繰り返します。

修復に失敗しましたが表示されたら、先ほど作成したインストールメディアをpcに接続して、詳細オプションをクリック>デバイスの使用>インストールメディアを選択>画面の指示に従う
これで、次回正常に初期設定画面に行くと思います。
# 以上の方法で治らない場合:
以上の理由で治らない場合（再インストールも含む）は、HDD又はSSDの物理的な故障が原因の可能性があります。以上の方法で治らなかったら、pcのHDD又はSSDを交換することで問題が解決する可能性があります。
# 最後に
皆さん、いかがだったでしょうか、今回はBad_System_Config_Infoを修復する方法について解説しました。ちなみに自分は、最終的にwindowsを再インストールすることで問題が解決しました。
それではまたお会いしましょう！
Qiitaのマークダウン機能に驚き！PlantUMLと他の便利な記法

## はじめに
こんにちは、エンジニアの皆さん！今回は、Qiitaの素晴らしいマークダウン機能について共有したいと思います。特に、PlantUMLを直接埋め込める機能には驚きました。他の便利な記法も含めて、Qiitaの記事作成がいかに楽しく効率的になるかをご紹介します。

## 1. PlantUML：ダイアグラムを簡単に

PlantUMLは、テキストベースでUML図を作成できるオープンソースのツールです。Qiitaでは、このPlantUMLのコードをマークダウン内に直接書くことで、自動的に図として表示されます。これは本当に便利です！

例えば：

    ```plantuml
    @startuml
    Alice -> Bob: Hello
    Bob --> Alice: Hi!
    @enduml
    ```

出力結果：

```plantuml
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi!
@enduml
```

このコードを記事に貼り付けるだけで、シーケンス図が自動的に生成されます。図の作成、保存、アップロードの手間が省けるのは大きなメリットですね。

## 2. KaTeX：数式も美しく

LaTeX形式で数式を書くと、KaTeXによって美しくレンダリングされます。例えば：

    ```math
    f(x) = \int_{-\infty}^\infty \hat f(\xi)\,e^{2 \pi i \xi x} \,d\xi
    ```

出力結果：

```math
f(x) = \int_{-\infty}^\infty \hat f(\xi)\,e^{2 \pi i \xi x} \,d\xi
```

この機能により、数学や物理の複雑な式も簡単に表現できます。

## 3. Mermaid：様々な図表を手軽に

Mermaidを使うと、フローチャート、ガントチャート、クラス図なども簡単に作成できます。

    ```mermaid
    graph TD;
        A-->B;
        A-->C;
        B-->D;
        C-->D;
    ```

出力結果：

```mermaid
graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->D;
```

## 4. シンタックスハイライト

コードブロックの言語を指定するだけで、自動的にシンタックスハイライトが適用されます。

    ```python
    def hello_world():
        print("Hello, Qiita!")
    ```

出力結果：

```python
def hello_world():
    print("Hello, Qiita!")
```

## まとめ

Qiitaのマークダウン機能は、単なるテキスト装飾だけでなく、図表や数式の表現まで幅広くサポートしています。これらの機能を使いこなすことで、より分かりやすく、見栄えの良い技術記事を簡単に作成できます。

特にPlantUMLの直接埋め込み機能は、図表作成の手間を大幅に削減してくれます。エンジニアにとって、アイデアを素早く視覚化できるのは非常に価値があります。

ぜひ、これらの機能を活用して、あなたの知識や経験を魅力的な形で共有してみてください。Qiitaでの記事作成が、今まで以上に楽しくなるはずです！
【ChatGPT＋DALL-E3】【Dream Machine】の動画を白黒に変換します。


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

　今回は、Dream Machineの動画を白黒に変換します。たぶん、ほかの動画も可能（未確認）

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　いやぁ、X-Twitter上では
　　Claude 3.5 Sonnetのポストが
　　　有象無象しています😅

　まぁ、早くなって安くなった、と
　　聞いたら、AI関連を扱っている
　　　人には、試さずにいられない
　　　　気持ちはわかります。

　私はAIを仕事に使っていませんので
　　パワフルさを実感できていません。

　それに画像生成が目的ですから
　　その機能がないClaudeさんには
　　　触手が動きません😅
***
　さて、本題です。

　今回は、
　　動画を白黒に変換します。

　変換する必要を
　　具体的に考えると、
　　　思い出のシーンを
　　　　現実と区別するために
　　　　　白黒にすることが
　　　　　　思い付きます。

　画像でも
　　白黒にすると
　　　渋い感じになります。
　　　　マンガなんかにも使えます。
　　　　　それと一緒ですね。
***
　では、やり方です。

　まずは、セッションが
　　GPT-4oであることを
　　　確認します。

　次に、
　　動画をアップロード。

　下記のPromptを入力。
```Text:
MoviePyで白黒動画にしてください。
```
　これで、送信。

　しばらくすると
　　ダウンロードリンクが
　　　出てきますから、
　　　　ダウンロードします。

　出来上がった動画を
　　確認してください。

　はい、終了。
***
　ツールを使わずに
　　こんなことができる
　　　ChatGPTさんには
　　　　感謝感激雨あられ（大袈裟w）

　多機能ツールは
　　習熟に時間が掛かり、
　　　素人同然の私には
　　　　手を出すのも
　　　　　躊躇してしまいます。

　ですが、
　　すでに手に入れている
　　　ChatGPTさんの能力を
　　　　使うだけで済むのですから
　　　　　ありがたいものです。

　問題は、
　　その機能を
　　　どこまで知っているか
　　　　なのでしょうね。

　私も画像生成を
　　していなければ
　　　こんな機能があるなんて
　　　　知りもしませんでした。

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

　今回は、ここまで。
DHH流のルーティングの書き方

今回は私が現場で使用しているルーティング構成について自分のメモとしてまとめました。

## DHH流ルーティングとは？
DHH流ルーティングとは、Railsの創始者であるDavid Heinemeier Hansson（DHH）の提唱するルーティング設計の方法論です。
 
DHH流ルーティングでは、リソースに対して標準的なCRUD操作（Create, Read, Update, Delete）を簡潔に定義し、カスタムアクションやネストリソースを最小限に抑えることで、ルートの複雑さを減らして記述を行うというものです。

つまり、デフォルトCRUDのindex , show, new, edit, create, update, destroyメソッドのみですべてを表現するということです。

## 具体的な設定例

### ・ 例１
```
  namespace :admins do
    root 'dashboards#index'

    resources :staffs
    resources :users do
      resource :enable, only: %i[ update ], module: :users
      resource :disable, only: %i[ update ], module: :users
    end
    resources :companies do
      resource :company_brand, only: %i[ edit update ], module: :companies
    end
  end
```

上記のような記述がDHH流のルーティングになります。

例えば resources :users であれば、今までであればデフォルトCRUDにenable、disableといったカスタムアクションを UsersController に設定していたと思います。

しかしDHH流ルーティングでは**update**という単一のメソッドのみを持つ 
 Admins::Users::EnablesController という、新しいコントローラを持つことになります。
※userの status というカラムデータを有効にする( = update )するということからEnablesControllerを作成し、updateアクションを定義するということになります。

### ・ 例２
ここではRecipeに対して公開/非公開のアクションを付け加えた場合です。
カスタムアクションを追加するのであれば、コントローラは以下のようにな理ます。

```
class RecipesController < ApplicationController
  def index
  end
  # デフォルトのCRUDアクションが続く

  def publish
    # 公開処理
  end

  def unpublish
    # 非公開処理
  end
end
```

でもDHH流に書く場合には、ここがコントローラの分割されるポイントになります。
```
class Recipes::PublicationsController < ApplicationController
  def update
    # 公開処理
  end

  def destroy
    # 非公開処理
  end
end
```
recipe の配下に publication という公開/非公開を担うサブアクションを追加し、 update に公開処理を、 destroy に非公開処理を設定します。

ルーティングは下記のようになります。
```
resources :recipes do
  resource :publication, only: [:update, :destroy]
end
```
参照：https://tech.kitchhike.com/entry/2017/03/07/190739
受動的な子ネコの憂鬱

## 主旨：
脳科学の発展には、ネコがたくさん協力してくれている。
スペリー（アメリカ）、ウィーセル（スエーデン）、ヒューベル（アメリカ）	　大脳半球の機能分化に関する研究　視覚系の情報処理に関する研究（ネコ）
の研究は1981のノーベル賞を受賞している。

今日紹介するのは、それとはまた別の受動的な子ネコと能動的な子ネコの実験だ。
神経科学などの研究の歴史の中で紹介されることがある。

## 受動的な子ネコと能動的な子ネコの実験
- [Movement-Produced Stimulation in the Development of
Visually Guided Behavior](https://www.researchgate.net/profile/Richard-Held/publication/9517409_Movement-Produced_Stimulation_in_the_Development_of_Visually_Guided_Behavior/links/54341f2b0cf2bf1f1f27b881/Movement-Produced-Stimulation-in-the-Development-of-Visually-Guided-Behavior.pdf) 1963年の論文のpdf


- [ヘルドとハインの研究（Held ＆Hein, 1963)](https://kazz-ash.com/2014/01/21/held-%EF%BC%86hein-1963/#google_vignette)

- [Held And Hein (1963) Kitten Carosel](https://www.simplypsychology.org/held-and-hein-1963.html)

>Conclusion
>The findings fit the idea that self-produced movement and concurrent visual feedback are essential for the development of visually-guided behavior.

> この発見は、視覚誘導行動の発達には、自己生成運動と同時視覚フィードバックが不可欠であるという考えに合致する。

今の動物実験の基準では倫理的に許されない種類のものだろう。


ゴンドラの中でほぼ同じはずの視覚経験をえているはずなのに、能動的に自分の脚で動いているネコと、
ゴンドラに載せられているだけで、自分の脚の動きとなんら関係を持たない視覚経験をしているネコでは
その時間の中で習得しているものが違ってきていて、視覚誘導行動の発達が損なわれるという主張だ。

ここまではふつうに論文の紹介だ。

### 能動的な子ネコ
- 自分で選択した行動、それが何を引き起こすのかを、相関関係として、まず知ることになるだろう。
- 自分が前方に進めば、それにともなって筋肉の動き・脚の感触のリズムを生じている。
- 自分が前方に進めば、それにともなって、眼に写るものが移動する。optical flow を生じる。
- 自分自身のバランス感覚とoptical flow とは相関関係を持って関係づけられるようになる。
  - だから、自分が傾いたときとかに生じるような一貫性のあるoptical flow を生じる動画を広い範囲で見せると、バランスを崩しやすくなる。
- 能動的な子ネコでは、行動することによって、それらの関係付けを学習している。
- そうして出来上がるのが、自己の身体モデルと世界の物理モデルなのだろう。

### 受動的な子ネコ
- 自らが行動を起こすわけではないので、注意力を高めている時間というのが存在しにくい。
- 自分の筋肉の動き・脚の触覚のリズムは、自分の眼に見えているものとまったく関係を持たない。
- 眼に写るものが移動する。optical flow を生じる。しかし、それを空間での移動と紐付ける仕組みをもたない。
- 「前に行きたいな」と思ったタイミングに前に進んだとすれば、「前に行きたいな」と思うことだけで先に進めると勘違いをするかもしれない。


### 視覚を含む大規模言語モデルは自然法則を理解する
- 技術それ自体の話で考えてみる。
- Transfomerベースの視覚情報を含む大規模言語モデルは、近年性能の向上が著しい。
- その中で、動画データを元に、学習を行なっているのもある。
- 適切に学習された視覚言語モデルは、自然法則を理解する。
- 適切に学習されたモデルは、3D形状を理解するし、少しあとの画像の見え方を予測する。
- 重力も、力学も、動物の経験的な動きも適切に学習された視覚言語モデルは再現するだろう。
- ただ、多くの画像は第三者視点による動画である。

## 受動的な子ネコの限界は、大規模言語モデルでも限界になるかもしれない。
- 動画をベースにする学習では、そのときのカメラの姿勢情報の変化も欠いている。
- 動画をベースとする学習では、自らの行動を決める主体がないまま、移動した結果の動画がある。
- 自己視点画像での動画であっても、その動画の時系列の中に、自らの行動を決める主体は、学習データに含まれていない。
- そういう意味で、受動的な子ネコが見る動画になっていると思う。
- そのため、何に着目して、何を判断して、どう行動したのかを、どこまで大規模言語モデルで学習できるだろうか。

### 自己視点画像の大規模言語モデルの学習への大幅な追加
- ここ数年の傾向として、自己視点画像のデータ・セットの拡充がある。
- それ以前のデータ・セットと自己視点画像では見え方が違う。
- 自己視点画像では、その画像の中に主体者としての自分自身の一部が写っている。
- 自己視点画像では、行動する主体としての自分自身と行動に関連付けられる言葉とを学ぶことになる。


## 判断する主体としての身体性を持った大規模言語モデルが作られる。
- 間違いなくロボットは、そのような身体性を持った大規模言語モデルになるだろう。
- 重力を感知し、重力の働いている空間での物体の動きをモデル化するだろう。
- 個々の身体性の違いを考慮しつつ、共通のpre-trained モデルができる。
- deploy先では、限定された身体性でfine-tune されたモデルが使われるだろう。
- 各種センサによる推論の結果が時間遅れをともなっていることを前提として、自らの動作を生成するようになるだろう。
- 「受動的な子ネコ」から「能動的な子ネコ」になったときに、大規模言語モデルはどう変貌するだろうか。
権限セットグループ・ミュート権限セットについて解説してみた

本橋孝昭です

今回は権限セットグループおよびミュート権限セットについて解説します

今回を確認すればSalesforceの権限について理解が深まります。

今回の内容は動画でも解説しています

https://youtu.be/Nc4st4ry-sQ?si=cUNT4Lx-tW6_Hxbz

<iframe width="560" height="315" src="https://www.youtube.com/embed/Nc4st4ry-sQ?si=cUNT4Lx-tW6_Hxbz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


## 権限セットグループってなんだ？

権限セットグループは権限セットをまとめたものです

ちなみに、権限セットとは「特定ユーザに対してプロファイルよりも権限を追加を行う」ための権限セットです


同じプロファイルのユーザでも権限付与に差異がある場合、権限セット付与でユーザごとの権限を付与します


プロファイルと権限セットの違いはこちらとなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ab45834d-33dc-0cbf-48a6-3cc04c0c68fe.png)



プロファイルと権限セットのイメージを図にしました。
このように、ユーザの権限はプロファイルと権限セットの組み合わせで決まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1a7bde27-94c2-fe2c-1a20-7971ec1f62c1.png)


もっと簡単に言うとこのようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/82f5b8fb-9793-9d83-5ce5-e441a532c6c3.png)


プロファイルと権限セットの詳細について知りたい方はこちら

https://qiita.com/Takaa/items/10071d4eee1319a2b9f5

さて、権限セットを複数ユーザに付与するのは大変な場合がありますね
その場合、権限セットグループを作成して付与することにより、複数の権限セットを割り当てた権限と同じにすることが可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b42e03e1-5504-7319-75e1-43d43c9ee7cb.png)


他にも権限セットグループではミュート権限セットを使い対応することが可能です


## ミュート権限セット

ミュート権限セットを使うことにより、権限セットグループ内の権限の一部を削除することが可能です。
このミュート権限セットを権限セットグループ内に組み込むことにより、既存の権限セットの権限を変えずに権限のカスタマイズをすることが可能です


ミュートの設定画面はこちらです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/04758e19-c7f7-1bce-a667-2a95cfbee0d2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/61b1d2bb-5a1c-d328-c43e-e1a06761f77e.png)


以下ミュート権限セットの分かりにくいところ、細かいところを解説します

## ミュート権限セットポイント1 　ミュート権限セットはプロファイルの権限を無効にすることはできません

ミュート権限セットはプロファイル権限をミュートにすることはできません

ミュート権限セットはあくまでも権限セットグループ内の権限をミュートにすることしかできないです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/876e3764-70d4-4c20-6130-ceb9e81ef9d8.png)



## ミュート権限セットポイント2 　ミュート権限セットは権限セットの権限を無効にすることはできません

ユーザには権限セットグループと権限セット両方を付与することが可能です。
しかしながら、ミュート権限セットはあくまでも権限セットグループ内の権限をミュートにするだけなので、権限セットの権限を無効にすることはできないです



ミュート権限セットはプロファイル権限をミュートにすることはできません

ミュート権限セットはあくまでも権限セットグループ内の権限をミュートにすることしかできないです


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/aeffec6e-4761-d161-8c92-4aa210ac0c86.png)


もっと詳細を知りたい人はこちらのTrailheadに挑戦してみてください

https://trailhead.salesforce.com/ja/content/learn/modules/permission-set-groups/get-started-with-permission-set-groups


## おまけ
ユーザがどの権限セットグループ、権限セットが付与されるか確認するにはレポートでの表示が便利です

https://qiita.com/Takaa/items/a51e3780c387fb80f309
Databricks生成AIクックブック - 3. RAG品質のノブ

[3\. RAG quality knobs — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/3-deep-dive.html) [2024/6/22時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。


# 3. RAG品質のノブ

前のセクションでは、RAGアプリケーションのキーコンポーネントを紹介し、非構造化データに対するRAGアプリケーション開発における基本的な還俗を議論しました。このセクションでは、あなたのアプリケーションの品質を高めるためのそれぞれのコンポーネントの改善についてどのように考えることができるのかを議論します。

オフラインのデータパイプラインとオンラインのRAGチェーンの両方のすべてのポイントにおいてチューニングすべき"ノブ"が多数存在します。他に多くのものが存在していますが、あなたのRAGアプリケーションの品質に最大のインパクトをもたらす最も重要なノブにフォーカスします。Databricksではこれらのノブからスタートすることをお勧めします。

概念的な観点から、2つのキーとなるタイプの品質問題のレンズを通じてRAGの品質ノブを見ることが有益です。

1. **収集の品質**
    - 与えられた収集クエリーに対して最も適切な情報を収集していますか？
        - LLMに与えられるコンテキストで重要な情報が欠けていたり、過剰な情報が含まれていると、高品質なRAGアウトプットを生成することが困難になります。
1. **生成の品質**
    - 収集された情報とオリジナルのユーザーのクエリーに対して、LLMは最も正確で、一貫性があり、有益なレスポンスを生成できていますか？
        - ここでの問題は、ハルシネーション、一貫性のないアウトプット、ユーザークエリーに直接対応することに失敗するといったことが挙げられます。

RAGアプリケーションには、品質の課題に対応すべきに試行錯誤できる二つのコンポーネントがあります: データパイプラインとチェーンです。収集の問題(シンプルにデータパイプラインをアップデートする)と生成の問題(RAGチェーンをアップデートする)の間に明確な線引きをしたいと思うかもしれません。しかし、現実はさらに微妙なものとなっています。収集の品質は、データパイプライン(パーシング/チャンキング戦略、メタデータ戦略、エンベディングモデルなど)とRAGチェーン(ユーザークエリーの変換処理、収集するチャンクの数、リランキングなど)の*両方*によって影響を受けることがあります。同様に、貧弱な収集(モデルのアウトプットに影響を与える不適切、あるいは不十分な情報など)のインパクトを生成の品質は避けることができません。

このオーバーラップによって、RAG品質改善に対する全体的なアプローチのニーズが高まります。データパイプラインとRAGチェーンの両方においてどのコンポーネントを変更するのか、これらの変更が全体的にどのような影響を与えるのかを理解することで、RAGのアウトプット品質を改善するためにターゲティングされたアップデートをかけることができるようになります。

[**データパイプライン**](https://qiita.com/taka_yayoi/items/4f21f8905f54bef53f10)

![](https://ai-cookbook.io/_images/15_img.png)

- 入力データのコーパスの構成は？
- 生データはどのように抽出され、利用可能なフォーマットに変換されているのか(PDFドキュメントのパースなど)
- ドキュメントがどのように小さなチャンクに分割され、それらのチャンクがどのようにフォーマットされるのか(チャンキング戦略、チャンクサイズなど)
- それぞれのドキュメント/チャンクからどのようにメタデータ(セクションタイトル、ドキュメントタイトルなど)が抽出されるのか？このメタデータはそれぞれのチャンクにどのように含まれているのか(含まれていないのか)？
- 類似検索のために、テキストをベクトル表現に変換するためにどのエンベディングモデルが使われているのか

[**RAGチェーン**](https://qiita.com/taka_yayoi/items/7097a738ea8e014d86f2)

![](https://ai-cookbook.io/_images/16_img.png)

- 使用するLLMとパラメーター(温度、最大トークン数など)
- 収集パラメーター(収集するチャンク/ドキュメントの数など)
- 収集アプローチ(キーワード vs ハイブリッド vs セマンティック検索、ユーザークエリーの書き換え、ユーザークエリーをフィルターに変換、リランキングなど)
- 期待するアウトプットに向けてLLMをガイドするために、収集したコンテキストをどのようにプロンプトにフォーマットしているのか

<br>

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [2.4. ガバナンスとLLMOps](https://qiita.com/taka_yayoi/items/741420c779118fae1114)
- 次のセクション: [3.1. データパイプライン](https://qiita.com/taka_yayoi/items/4f21f8905f54bef53f10)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
最速で作るKotlin Minecraft Plugin開発 A-3 オススメ資料

# 概要
1. オススメ資料
2. 結

# オススメ資料
翻訳ツールの使用したりYoutubeでコードだけ参照するようにすれば英語に自信が無くても、参考資料の幅が広がるためオススメです。
Javaのコードであっても大体は同じであり、分からなかったらChatGPTに変換&解説をしてもらいましょう。

https://spigot-event-list.s7a.dev/

https://qiita.com/tooooowa/items/4aed0ea7e2cf2b55f134
https://www.youtube.com/watch?v=tnJZMaoMPhE&list=PLfu_Bpi_zcDNEKmR82hnbv9UxQ16nUBF7
https://www.youtube.com/watch?v=zpSpLvycd1E&list=PL_MDptw3Zft_Xb8-i0WBGtwdUN14TMJNE


# 結
お疲れさまでした。

[目次](https://qiita.com/Y_RyuZU/items/c2c42fa05be49f5739d7)
[前の話](https://qiita.com/Y_RyuZU/items/cc30ce812cd445b6d31b)
[次の話](https://qiita.com/Y_RyuZU/items/681b73c996b1c7e00249)
最速で作るKotlin Minecraft Plugin開発 A-1 環境構築前準備

# 概要
1. [GitHub](https://github.com/join)アカウント作成
2. [ChatGPT](https://chatgpt.com/)アカウント作成
3. [Git](https://www.git-scm.com/downloads)インストール
4. [JetBrains ToolBox](https://www.jetbrains.com/toolbox-app/)経由でIntelliJ IDEAのインストール
5. IntelliJ IDEAのプラグインをインストール
6. IntelliJ IDEAにGitHubアカウントを紐づけ
7. 結

# 1,2,3ステップ
各リンクをクリックし、アカウント作成およびインストールを行ってください。
詳しい画像付きステップが必要な場合はGoogle検索を行うと出てきます。

# JetBrains ToolBox経由のIntelliJ IDEAのインストール

1. インストール後Windowsの場合は右下のバックグラウンドアプリ一覧からToolboxのアイコンをクリック
![スクリーンショット 2024-06-18 163326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629918/31c89abc-c60d-27f2-301d-d3a8e87d1f10.png)
---
2. IntelliJ IDEA Community Edition をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629918/d96f751c-d30d-d063-e29b-cee79058299f.png)

# プラグインのインストール

1. 起動後左側のバーから「Plugin」を選択

2. 下記全てをインストール
- Minecraft Development
- Atom Material Icons
- Inspection Lens
- Indent Rainbow
- Code Glance Pro
- Rainbow Brackets
- Key Promoter X

Minecraft Development以外は必須ではありませんが、入れることを強く推奨します。
バージョンが対応していないなどがあれば無視して構いません。

3. 全てのインストールが完了後、IntelliJ IDEAを再起動

また、上記とは別でGitHub Copilotを入れることを強く推奨しますが
無料で使うにはGitHubの学生ライセンスに申し込む必要があるため、ここでは省きます。
気になった方用にザックリ手順を残しますが、ところどころトラップがあるので
1. GitHub Educationを申請(ac.jpで終わるメールアドレスが必要です。学生証アップロード画面にて自身の英語名での学校名の記載が必要です。手書きで構わないので背景に書いておきましょう)
2. [GitHub Copilot](https://github.com/features/copilot/)を申請
3. GitHub CopilotプラグインをIntelliJにインストール

分かりやすい記事は他に大量にあるため、ここでは概略のみとします。

# IntelliJ IDEAにGitHubアカウントを紐づけ

カスタマイズ > すべての設定 > 検索バー「GitHub」 > バージョン管理 > GitHub > +アイコン > GitHubでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629918/44e3d48f-c0f0-049e-f1b1-5d4b18315c3b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629918/76784fda-0a22-849e-75cc-42753fac066a.png)


# 結
お疲れさまでした。

[目次](https://qiita.com/Y_RyuZU/items/c2c42fa05be49f5739d7)
[前の話](https://qiita.com/Y_RyuZU/items/c2c42fa05be49f5739d7)
[次の話](https://qiita.com/Y_RyuZU/items/cc30ce812cd445b6d31b)
最速で作るKotlin Minecraft Plugin開発 A-0 目次

# 挨拶
AzisabaNetwork 統括開発者 りゅーずです。

アジ鯖運営志願者、アジ鯖運営、その他プログラミング初学者向けにKotlinを用いたMinecraft Plugin開発チュートリアルを書いていきます。

# はじめに
### 学習の進め方
1. 理解は後からついてきます。理解できなくても見様見真似で書き、完成することを最優先としてください
2. ChatGPTを使いまくってください。文法、コードの意味、書き方...なんでも全て聞いてください

### 分からないとき
1. ChatGPTに聞いてください
2. 「開発協力チャンネル」で聞いてください
3. りゅーずに聞いてください

### 注意事項
1. このシリーズでは既に他の方が書かれている部分は大幅に省略します
2. 保守性の観点からライブラリを使いまくります
3. 読みやすさ最優先とし、説明をかなり省きます。なぜ？という疑問は大事にしChatGPTに投げるようにしましょう

# 記事一覧
アルファベットが基本的に難易度
数字が話数を表すものとします

| **ページURL** | **内容** |
|:-:|:--|
| [A-1] | [環境構築前準備](https://qiita.com/Y_RyuZU/items/263ddc19d7410bb3442f) |
| [A-2] | [環境構築](https://qiita.com/Y_RyuZU/items/cc30ce812cd445b6d31b) |
| [A-3] | [おすすめ資料](https://qiita.com/Y_RyuZU/items/bce27a3072fd5c630f66) |
| [A-4] | Git管理
| [B-1] | [ライブラリの入れ方](https://qiita.com/Y_RyuZU/items/681b73c996b1c7e00249) |
| [B-2] | GUI作成 |
| [B-3] | コマンド作成 |
| [C-1] | 依存関係の分離 |
| [C-2] | Dependency Injection |
| [C-3] | NMS |
| [C-4] | パケット操作 |
| [C-5] | データベースアクセス |
【TypeScript】esModuleInterop を true に設定するよう警告が出る原因

# はじめに
テスト中に下記のような警告が出たため、その原因についてメモしました。

この警告文は、**「TypeScriptの設定ファイル（通常は tsconfig.json）において、 esModuleInterop を true に設定することを検討すべき」**　という意味になります。
```
ts-jest[config] (WARN) message TS151001: If you have issues related to imports, you should consider setting esModuleInterop to true in your TypeScript configuration file (usually tsconfig.json). 
See https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/#easier-ecmascript-module-interoperability for more information.
```
# 原因
なぜesModuleInterop を true に設定する必要があるのかというと、
**CommonJSとESモジュールの違いをうまく取り扱うため**です。

### ・CommonJSモジュールとは

主にNode.js環境で使われています。
**他ファイルからコードを参照するときはrequire、他ファイルから参照可能にしたいときはmodule.exportsを使用します。**
```js
// math.js
module.exports = {
  add: (a, b) => a + b,
  subtract: (a, b) => a - b
};

// main.js
const math = require('./math');
console.log(math.add(2, 3)); // 結果: 5
```
### ・ESモジュールとは

**他ファイルからコードを参照するときはimport、他ファイルから参照可能にしたいときはexportを使用します。**
```js
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;

// main.js
import { add, subtract } from './math';
console.log(add(2, 3)); // 結果: 5
```
### esModuleInterop を true に設定すると・・
Node.jsの標準モジュールや**多くの既存のライブラリはCommonJS形式で提供されているのですが、これをESモジュール形式でインポートしても使える**ようになります。

**さらにかみ砕くと、インポート形式をESモジュール形式に勝手に統一してくれるので、開発者は両者の違いをあまり意識せずに済みます。**


# 設定方法
書くまでもないかもしれませんが、、
esModuleInterop を true に設定する場合は設定ファイル(tsconfig.json)に下記を追記します。

```json
{
  "compilerOptions": {
    "esModuleInterop": true,
  }
```
# おわりに
無意識にESモジュールを使用していたので、このような違いがあることを理解していませんでした。
誰かの一助となれば幸いです。
Hexabase TypeScript SDKの使い方（ユーザー情報の取得・更新）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、ユーザー情報の取得・アップデート方法を解説します。

## インストール

インストールはnpmやyarnを使って行います。

```bash
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

## 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

認証後、現在のユーザーは `client.currentUser` で取得できます。

```jsx
const user = client.currentUser;
```

後はこの `user` に対して処理を行います。

## ユーザー情報の取得

ユーザー情報を更新した後など、ユーザー情報を再取得する際には `fetch()` を使います。レスポンスはユーザーオブジェクトです。

```jsx
const user = await client.currentUser!.fetch();
expect(user.email).toBe(email);
expect(user.currentWorkspace.id).toBe(client.currentWorkspace!.id);
```

## ユーザー情報の更新

ユーザー情報を更新する際には `save` メソッドを使います。アップデート対象はユーザー名とユーザーコードです。

```jsx
const user = await client.currentUser!.fetch();
const newUsername = 'test';
user.set('username', newUsername);
const res = await user.save();
expect(res).toBe(true);
```

## ユーザーアイコンのアップデート

ユーザーアイコンを変更する際には `updatePicture` メソッドを使います。Blob形式のファイルを引数に渡します。ブラウザの場合は `File` オブエクトを渡してください。

```jsx
const res = await user.updatePicture(blob);
expect(res).toBe(true);
```

## ユーザーアイコンの削除

ユーザーアイコンを削除する際には `deletePicture` メソッドを使います。

```jsx
const res = await user.deletePicture();
```

## ユーザーアイコンの取得

ユーザーアイコンは `user.profilePicture` で取得できます。これは `img` タグの `src` に使えるURLです。

```html
<img src={user.profilePicture} />
```

## まとめ

Hexabase TypeScript SDKを使って、ユーザー情報の取得、更新、アイコンのアップデート・削除を行う方法を解説しました。Hexabaseには他にもFaaSや、ステータス管理などの機能があります。ぜひ、それらの機能も利用してください。

[Hexabase \| 新規事業向け開発・競争領域でのDX実現をサポート](https://www.hexabase.com/)
GoのNamed Return Valueとそのうまい使い方

Goには関数/メソッドを定義する時に返り値を名前をつけて関数の内部で初期化することなく変数を作ることができる仕組みがある。

これをNamed Return Valueと言う。

本記事ではNamed Return Valueのメリットデメリットと使い所を解説していく。

## Named Return Value

こちらにかかれている。

https://go.dev/doc/effective_go#named-results

参考のコードは以下のようになる。

```go
func sampleNamedReturnValue() (value int) {
    value = 2
    return
}
```

この返り値valueはint型で扱われ、ゼロ値（intでは0）で初期化される。

また関数内ではreturnだけ書くことでvalueにセットされている変数を返すことができる。

### メリット

個人的には2つあると考えている。

- 命名から返り値が何かが予測しやすい
- 少し短く書ける

まず命名については言うまでもなく、返す値がどのような役目をするのかが型情報に加えて補強されるため慣れている人にとっては可読性が向上する。

短く書けることは変数をあらかじめ準備されていることから変数宣言が不要になります。

### デメリット

こちらは一つで

- 変数のスコープが広い

必要以上にスコープを広げることは良しとされていないが、Named Return Valueでは変数が関数内全体で有効になる。

変数のスコープを狭めたい場合には使えないことになります。

## 使い所

個人的には返り値の情報を付け足してあげるのが良いと考える。

Goはご存知の通り複数の返り値を持たせることができるため、それぞれが何を示すのかを使うとよい。

例えばゲームを作るとして得点をまとめて取得するような関数があるとする。

あるユーザーの今回の得点、ユーザーの最高得点、全ユーザーの最高得点を返したいときには以下のようにすると読みやすくなる。

```go
func GetScores(userID string) (currentScore, userHighScore, highScore int) {
    // 具体的な処理
    return
}
```
SharePoint の「サイトのページ」に新規フォルダ作成ボタンを表示させる方法

## こういう人むけの記事です
SharePoint Onlineで複数のページやニュース記事をたくさん公開していて、それらの記事をフォルダ管理したい方向けの記事です。

お仕事場のSharePointではフォルダ管理されていたので当然できて当たり前だとおもっていたのですが、プライベートなテナントではフォルダの作成ができませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/581bf408-094a-4846-c0b2-a04af6196d81.png)

ページの管理も実態はSharePointリストなはずなので、設定を探しました。

## リストの場合はどうなっているか
まずは、ふつうのSharePointリストを見てみます。
新規ボタンの中にフォルダーの作成ボタンがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/68f18eb2-38d6-6a22-94ce-0c74e5cce9b2.png)
リストの設定＞詳細設定と開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/91b7c5af-a68d-876e-2b57-454e69edd3b3.png)

うえから５番目あたりに新規フォルダを作成できるかどうかを選択できるラジオボタンがあります。この設定がリストにあるならば、同じように設定できるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/ff7e2947-0c52-6b2d-3f38-631b7657c51a.png)

　この設定画面のURLは以下の通りでした。注目するべきは後半のList=%7B以降。ここにサイトのページの裏側に隠れているリストIDを当てはめてやれば良さそうです。
 
  ```
https://<固有>.sharepoint.com/sites/testSite/_layouts/15/advsetng.aspx?List=%7B<　リストID>%7D
 ```
 
 ちなみに、リストID前後の%7Bと%7Dは波括弧を表すURLエンコードです。
 
 https://www.seil.jp/doc/index.html#tool/url-encode.html

 ## サイトのページのリストIDを調べる
 サイトのページ一覧が表示されているページもSharePointリストですが、リストIDは表からは隠されています。

 このページのリストIDを調べる方法については以前にQiitaに投稿しましたので参考にしてください。どうやら今のSharePoint Online　では、当時書いたようなExcelでのエクスポートができなくなっているようなので、設定画面から取得する方法を使いました。

 
https://qiita.com/DaddyDaddy/items/1918c4fcd68ae93546e7#%E3%81%9D%E3%81%AE%EF%BC%91-%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

ばっちりフォルダの有効化を設定できる画面が出てきました。「はい」に切り替えて適用します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/4055783d-c8fd-e980-a69c-085db276920b.png)

サイトのページ画面でフォルダの新規作成ができるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/3a2c23e9-b7ec-fd54-0ddb-8f447cb2b4c1.png)
闘魂Elixir ーー AtCoder Beginner Contest 333(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 333](https://atcoder.jp/contests/abc333)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - Pentagon](https://atcoder.jp/contests/abc333/tasks/abc333_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_


五角形なので辺と対角線の数はそれほど多くないので全部のパターンを[Module attributes](https://hexdocs.pm/elixir/module-attributes.html)に予め定義しておきました。あとは関数のパターンマッチで、`S1S2`と`T1T2`が両方とも辺グループか対角線グループに含まれていれば`Yes`でそうでなければ`No`という寸法で解きました。

```elixir
defmodule Main do
  @sides ["AB", "BC", "CD", "DE", "EA", "AE", "ED", "DC", "CB", "BA"]
  @diagonals ["AD", "AC", "BD", "BE", "CA", "CE", "DB", "DA", "EB", "EC"]

  def main do
    s = IO.read(:line) |> String.trim()
    t = IO.read(:line) |> String.trim()
    
    solve(s, t)
    |> IO.puts()
  end
  
  def solve(s, t) when s in @sides and t in @sides, do: "Yes"
  def solve(s, t) when s in @diagonals and t in @diagonals, do: "Yes"
  def solve(_, _), do: "No"
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 333](https://atcoder.jp/contests/abc333)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
エンドレスメソッドについて

今回は元有名企業で開発をしていた方が御用達しているというエンドレスメソッドについて調べたのでその使い方をメモ程度にまとめました。

## エンドレスメソッドとは
『end を書かずにメソッドを定義する』というそのままの意味のメソッドになります。
これにより def set_user = @user = User.find(params[:id]) という形でメソッドを定義する事ができるようになります。

基本的には１行でかけるメソッドの時に多様するようです。

### わかりやすいイメージ
```
# 今までは def ~ end でメソッドを定義していた
  def set_user
    @user = User.find params[:id]
  end

# これが def だけで定義できるようになる
def set_user = @user = User.find(params[:id])
```

### 実際のコード
```
class ExampleController < ApplicationController
  def show
    sum = square(1)
    puts sum
    render plain: "Check logs for the result"
  end

  private

  def square(x) = x + x
end
```
### 結果
```
irb(main):005> puts response.body
The sum is 100
=> nil
```
※puts メソッドは標準出力に文字列を表示するだけであり、表示が成功した場合の戻り値は常に nil です。

結構色々な場面で使用できそうなので、個人開発の時にでも取り入れてみようと思います！

参考文献：
https://secret-garden.hatenablog.com/entry/2020/10/03/180130