OmniAICreator/Qiita-1.07M huggingface dataset:
参照関係に出てくる「+新規〇〇」作成ボタンは消せないか　調査結果

本橋孝昭です

今回は参照関係項目で出てくるこの「+新規〇〇」作成ボタンを消せるかどうか確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1281e29f-1a3b-ab89-a1ed-8f2aabce6b8e.png)


結論は

・参照関係のオブジェクト作成権限が無ければ「+新規〇〇」作成ボタンは表示されない
・しかし作成権限がある場合は「+新規〇〇」作成ボタンは表示されてしまうので消すことはできない


ということになります

元々のオブジェクト作成権限（下記画像では取引先オブジェクト作成権限）を抜けばこのように「+新規〇〇」作成ボタンは表示されないですが、作成権限がある状態で「+新規〇〇」作成ボタン非表示にすることはできません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fe807f1f-5fcf-0c56-f7c1-fbb5f9b1b0d7.png)


なお、こちらの内容はIdeaにもあります
はやく修正されればと思います

Expand Standard New Override Action On Lightning Lookup Fields

https://ideas.salesforce.com/s/idea/a0B8W00000GdnNWUAZ/expand-standard-new-override-action-on-lightning-lookup-fields
Memory-Efficient Fine-Tuning of Compressed Large Language Models via sub-4-bit Integer Quantization

# 1. 概要
大規模言語モデル(LLM)では、パラメータ数が膨大となりファインチューニングと学習・推論のデプロイの際にメモリ使用量と計算コストが大きな課題となっている。パラメータ効率の良いファインチューニング手法はPEFT(Parameter-Efficient Fine-tuning)として種々の手法が提案されており、ファインチューニング時にオプティマイザーが消費するメモリを削減することを目指しているが、学習済みのLLMの重み自体が非常に大きく、以前としてメモリ使用量削減は大きな課題となっている。
この研究では、大規模言語モデルの効率的なファインチューニング方法とモデルの軽量化手法として、PEQA(Parameter-Efficient Quantization-aware Adaptation)を提案している。PEFTとモデル軽量化の量子化手法を組み合わせた手法となっている。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f76a9aa4-a2cc-f601-f570-435007c7abf6.png)

LLaMA-65Bの学習に使用されるDRAMの比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ca8e6662-7078-3b01-85d9-555ef66f5026.png)

WikiText2データセットを用いたLLaMAの学習時のモデルサイズ比較
(Perplexityが小さいほど言語モデルの予測性能が高い)

- 量子化スケールのみ更新：PEQAは学習済みのLLMの膨大な重み自体を更新するのではなく、量子化スケールと呼ばれるパラメータ値のみを更新することで、メモリ使用量を削減している。
- デプロイ段階での高速推論：PEQAでファインチューニングされたLLMは、量子化構造が維持されているためデプロイ段階での高速推論にも有効となっている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9ef404d7-423a-d087-7c67-525a0a03a3d3.png)

1. 事前にLLMを学習させておく。
2. LLMの重みを少ないビット数で表現するように変換する(量子化)。
3. PEQAを用いて、量子化スケールのみ更新し、特定のタスクに対してLLMをファインチューニングしていく。

ここで、ファインチューニングの仮定でLLMの重みを更新するアルゴリズムが使用する情報として、オプティマイザーの状態情報を利用する(従来のPEFTと共通)。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/81090533-a299-6954-746b-bdd44a28032b.png)

Wikitext2とPennTreeBankデータセットを用いて、LLMのモデルサイズが大きくなった際のスケーラビリティとタスク依存性の高いファインチューニングの精度比較を見ると、PEQAは、最大650億パラメータを持つLLMに対しても有効性を示している。また、4ビット以下の精度に量子化されたLLMであっても、PEQAを用いることで、元の精度での性能を維持・向上させることに成功している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/7bc314ea-c433-58bf-dc17-2fcba4f42c08.png)

提案手法では、従来のLoRAなどのPEFT手法と比べても、LLMのメモリ使用量を削減しつつ、性能を維持できている点が評価されている。

---

Paper URL: <https://openreview.net/forum?id=2jUKhUrBxP>

last updates: May. 7 2024
DMARCを設定していても成りすましメールを送信されてしまう脆弱性(CVE-2024-7208/CVE-2024-7209)について

## 脆弱性の概要
- SPF/DKIM/DMARCを正しく設定していたとしても、そのSPF/DKIM/DMARCに整合する形式で、第三者がそのドメインのメールアドレスを送信元とした電子メールを送信できてしまう脆弱性が報告されています

## 脆弱性の影響

- 影響としては、自ドメインのメール送信においてSPF/DKIM/DMARCを正しく設定していたとしても、悪意のある第三者が、この脆弱性が成立する条件のドメインを騙って成りすましメールを送信することができ、かつDMARCの正当性条件をクリアしてしまうため、スパムフィルターなどを通過する可能性が高まります

## 一次情報など

正確な情報は、下記を参照してください

- [CVE-2024-7208(nvd.nist.gov)](https://nvd.nist.gov/vuln/detail/CVE-2024-7208)
- [CVE-2024-7209(nvd.nist.gov)](https://nvd.nist.gov/vuln/detail/CVE-2024-7209)
- [Multiple SMTP services are susceptible to spoofing attacks due to insufficient enforcement(kb.cert.org)](https://kb.cert.org/vuls/id/244112)

## どのようにしてDMARCをすり抜けて成りすましメールを送信するのか

正確なことについては、上記の一次情報などをご覧ください

大雑把に言えば、メール送信サービスシステムが認証した正規のユーザーに対して、送信元ドメインの使用権限の認可を正しく行なっていない場合には、認証されたユーザーは同じメール送信サービスの別のユーザーのドメインを使うことができます

## 対策

### 1. まずは、自分のドメインがこの脆弱性に合致するかどうかを確認してください

- 自分のドメインを送信元として送信するメールサーバーのすべてが、自分のドメインのメールだけを送信するように構成されている場合は心配ないです
- なんらかのメール送信サービスを利用している場合は、その事業者にこれらの脆弱性の有無を問い合わせてください

### 2. もし、自分のドメインがこの脆弱性に合致していたら

- 利用しているメール送信サービスにその脆弱性がある場合は、脆弱性をなくすよう促してみてください。あるいは、脆弱性のない別のメール送信サービスへの移行を検討してください
Mathematical Capabilities of ChatGPT

# 1. 概要
この論文では、ChatGPTとGPT-4の数学的な課題解決能力を評価しており、人間の大学院生レベルの問題解決能力にはまだまだ課題があることを調査している。評価には2つのChatGPTモデル(9-January-2023, 30-January-2023)とGPT-4を用いており、大学院レベルの数学問題を集めたデータセットを2つ新たに公開している。従来のベンチマーク課題は、初等数学のみを取り扱っていたりデータセットが小さかったりしたため、数学的推論の様々な側面を扱えるようなデータセットを構築している。
また、実際に1636人の数学者に対して評価実験を行っており、ChatGPTとGPT-4が実際の数学者の業務でどのくらい役に立つかを調査している。

---

# 2. 新規性
大学院レベルの数学を対象とした、大規模言語モデルによる数学能力を幅広く評価できるデータセットを公開している。

---

# 3. 実現方法
1. GHOSTSとminiGHOSTSという新しい数学のベンチマークデータセットを作成
2. 公開されている他のデータセットと合わせて、ChatGPT (2種類のバージョン)とGPT-4 をテスト
3. 数学者の専門家が評価を行い、ChatGPTとGPT-4の能力を分析

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9ff29a16-d0d7-bec8-7116-8c78610e76a5.png)

サンキーダイアグラムでは1‐5段階評価でminiGHOSTデータセット上で評価されており、生成AIのバージョンが上がると数学的課題解決力の向上が見られるかを示しているが、ChatGPTの2つのバージョンはアップデートされても全体的なパフォーマンスが変わっていないことを示している。一方、GPT-4では最高評価5を獲得する割合が大幅に上昇している。

ChatGPTとGPT-4は、数学的な質問に答える検索エンジンや知識ベースとして利用するのが最も得意とする分野になるため、以下のような出力例で数学のサポートとして用いると効果があるとしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b31285f5-bf58-3c2c-1b6b-1259b8b37cdb.png)

GHOSTデータセットには各種サブセットの数学タスクがあり、平均評価の内訳を見てみるとGPT-4の課題解決力が平均して高いことが分かる。ここで、最高評価は5で質問の意味が分からなかった場合を1としているため、実質最低評価は2となり妥当な合格ラインは得点の50％である3.5としている。また、グラフのバーは95％信頼区間を表している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5c1156e3-1c79-6be0-f31f-62f391914aba.png)

GPT-4はある程度までなら大学レベルの数学も扱えるが、大学院レベルの数学の問題になると失敗する。メディアで報じられるような、試験問題を突破できるほどの能力は確認できなかったことから、過大評価の可能性を示唆している。

---

Paper URL: <https://openreview.net/forum?id=xJ7YWXQOrg>

last updates: May. 17 2024
[paiza]おやつは300円まで【殿堂入りキャンペーン】お菓子の詰め合わせ (paizaランク A 相当)

# からあげクンもファミチキもおやつに入ります！
食べ盛りの頃はそう思ってた時期もありました（油しんどみ

https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking

# 面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所は[こっちの記事](https://qiita.com/AsilHatake/items/842548e48ae4a0eae119)に書いてあるYO!!

```javascript:schoolHiking.js
// [問題文（原文）]
// A 君は学校の遠足に持っていくお菓子を買わなければなりません。しかし、学校のルールにより、お菓子の総額は指定範囲内に収めなければなりません。
// そこで、指定金額ギリギリまで使って、なるべく色々な種類のお菓子を食べたいと思った A 君は買うお菓子を決めるために、学校のルールと自分の要望を踏まえて以下の基準を満たす買い方をすることにしました。
// 
// ・お菓子の総額を指定範囲内
// ・種類の数を最大にする
// ・同じお菓子は複数買わない
// ・お釣りを最小
// ・お釣りを最小にすることよりも種類の数を最大にすることを優先する
//
// お菓子の値段が書いてあるリストが与えられるので、A 君の代わりに、上記ルールを満たすお菓子の組み合わせを指定範囲内の最大の金額で買ったときのお釣りを求めてください。ただし、少なくとも一種類は指定範囲の値段で買えるものとします。
// 
// 入力例 1 の場合は、以下のように、指定範囲の金額で最大 2 個買えます。そして、そのうち最小になるお釣りの金額は 20 円になります。
function schoolHiking(lines) {
  // 入力は以下のフォーマットで与えられます。
  // 
  // N X
  // x_1
  // x_2
  // ...
  // x_N
  // 
  // 
  // ・ 1 行目にそれぞれ、選択できるお菓子の種類、指定制限金額を表す N, X が与えられます。
  // ・ 続く N 行のうちの i 行目 (1 ≦ i ≦ N) には、i 番目のお菓子の値段を表す整数が与えられます。
  // ・ 入力は合計で N + 1 行となり、入力値最終行の末尾に改行が １ つ入ります。
  const [cnt, max] = lines[0].split(' ').map(Number);
  const prices = lines.slice(1).map(Number);

  // dp[i][j] は j 円を使って i 種類のお菓子を選んだときの最大使用金額
  let dp = Array.from({ length: cnt + 1 }, () => Array(max + 1).fill(-1));
  dp[0][0] = 0;

  // 金額が小さい順に並び替える
  prices.sort((a, b) => a - b);

  // dpの生成
  for (let price of prices) {
    for (let i = cnt; i > 0; i--) {
      for (let j = max; j >= price; j--) {
        if (dp[i - 1][j - price] !== -1) {
          dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - price] + price);
        }
      }
    }
  }

  // 最大購入数と最大購入費
  let maxCount = 0,  maxAmount = 0;
  for (let i = 0; i <= cnt; i++) {
    for (let j = 0; j <= max; j++) {
      if (dp[i][j] !== -1) {
        // 購入数を優先する
        if (i > maxCount || (i === maxCount && dp[i][j] > maxAmount)) {
          maxCount = i;
          maxAmount = dp[i][j];
        }
      }
    }
  }

  console.log(max - maxAmount);
}

module.exports = {
  schoolHiking
};
```

## 動的計画法（ナップサック問題）
指定された条件に基づいてお菓子の組み合わせを決定し、最大の種類数と指定範囲内の合計金額を満たすようにしなくてはならないので、とりあえず総組み合わせから1個・2個・3個買った時におイクラ万円かかるのかを割り出して、
その中から最大数と最大使用金額を求めるような組み合わせを探すような作りにしてます。

逆順（i--とかj--）ループしてるのは、
- 同一金額のお菓子が複数回登場しても、各ステップで独立した状態更新が保証するため
- 既に更新された状態が次の更新に影響を与えないため
この方法により、同じお菓子を複数回使用することを防ぎ、動的計画法の正確な結果を得ることができるんだって。

調べながら作ったので、動的計画法ってな～に？って感じでしたが、
なんとか動くものが作れたからよし！

## ちなみに
最後の結果を以下のように変えて、ちゃんと最大数で割り出してるか検証してみた
`console.log(max - maxAmount, maxCount, maxAmount);`
```text:テストケース1(同一お釣り合計が280になるパターンが2つ有るケース)
5 300
150
120
130
75
55
20 3 280
```
ちゃんと`150 + 75 + 55`の3つを購入してるという動きになったのでよし！

```text:テストケース2(最大お釣りは少ないけど、購入数が勝ってるケース)
5 300
150
120
130
70
55
25 3 275
```
最大お釣りは`150 + 130`の2つ購入の20だけど、
ちゃんと`150 + 70 + 55`の3つを購入してるという動きになったのでよし！
Don’t Stop Pretraining? Make Prompt-based Fine-tuning Powerful Learner

# 1. 概要
自然言語処理(NLP)では、大量のラベル付けされていないデータで学習された言語モデル(LM)は、近年大規模化を遂げてLLMとして目覚ましい進展を遂げている。従来のNLPでは言語モデルをタスクに関連するテキストで継続的に事前学習させ続けることで、その後個別のタスクでファインチューニングする際の性能が向上すると考えられてきた。
この研究では、LLMでも同様の議論ができるか再考しており、結果として従来の継続学習は必ずしも有効でないことを示している。そこで、プロンプトベースの継続学習(PCP: Prompt-based Continued Pre-training)を提案しており、タスクに特化したファインチューニングを行う前に、タスクに関連するテキストとプロンプトテンプレートの両方を入力として教師なし事前学習の目的関数を通じてLLMに入力することで、性能向上させることに成功している。

---

# 2. 新規性
LLMでは従来のNLPと異なり、継続学習が必ずしも有効でないことを示した。テキストセンテンスをペアで与えるタスクやプロンプトベースのファインチューニングでは、継続学習は悪影響を与える可能性があることを明らかにした。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0e1a3f2b-1ce7-fec2-7e0d-04ac4f2cfc81.png)

様々なLLMのファインチューニングを比較評価している。

まず、単一文タスク8種類とセンテンスペアタスク8種類のデータセットをデータセットを用いて、LLMをラベル付けされていない大量のテキストで事前学習する(教師なし学習)。次に、タスクに関連するテキストとプロンプトのテンプレートを教師なし事前学習の目的関数として用いて、LLMを継続的に学習させる。その後、個別のタスクに対して事前学習済みモデルをファインチューニングする。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1c804c4a-6585-6f7c-f58b-a34cb25d8f9c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c2cd26da-79a7-f5d9-6714-2f7c4c0f969f.png)

PCPは、従来の継続学習よりもプロンプトベースのファインチューニングと組み合わせた場合に特に効果を発揮することが分かった。また、21種類のベンチマークを使用した実証評価を行っており、わずか数百個のラベル付けされていない事例のみを利用して、従来のプロンプトベースのファインチューニング手法の性能を大幅に向上させることができている。提案手法は、半教師有りと完全教師有の両方の学習手法で効果を発揮することが示されている。

---

Paper URL: <https://openreview.net/forum?id=s7xWeJQACI>

last updates: May. 17 2024
OpenAI：APIにおける構造化出力の導入

## はじめに

OpenAIは、APIに構造化出力（Structured Outputs）を導入しました。これにより、モデルの出力が開発者が提供したJSONスキーマに確実に準拠するようになりました。

## 背景

### 従来の課題

- 非構造化入力からの構造化データ生成は、AIアプリケーションの主要なユースケース
- 開発者は、モデル出力を必要な形式に合わせるために様々な工夫を行ってきた

### 新機能の特徴

- 開発者が提供したJSONスキーマに完全に準拠した出力を保証
- 複雑なJSONスキーマの理解と生成に特化したモデルトレーニング

## 構造化出力の使用方法

### 関数呼び出し（Function Calling）

- ツール定義内で`strict: true`を設定
- すべての関数呼び出し対応モデルで利用可能

### レスポンスフォーマット

- `response_format`パラメータに`json_schema`オプションを追加
- 最新のGPT-4oモデルで利用可能

## 主要な使用例

- ユーザーインテントに基づくUI動的生成
- 最終回答と補足説明の分離
- 非構造化データからの構造化データ抽出

## 技術的詳細

### 制約付きデコーディング
- JSONスキーマを文脈自由文法（CFG）に変換
- 動的な制約付きデコーディングを実装

### 代替アプローチ
- 有限状態機械（FSM）やRegexを用いた手法との比較
- CFGアプローチの利点：より複雑なスキーマに対応可能

## 制限事項

- サポートされるJSONスキーマの制限
- 初回リクエストの追加レイテンシ
- 安全性の観点からのモデルの拒否可能性
- トークン制限による不完全な出力の可能性
- 並列関数呼び出しとの非互換性

## 利用可能性

### 関数呼び出しによる構造化出力
- すべての関数呼び出し対応モデルで利用可能
- Chat Completions API、Assistants API、Batch APIで利用可能
- ビジョン入力との互換性あり

### レスポンスフォーマットによる構造化出力
- gpt-4o-miniとgpt-4o-2024-08-06、およびこれらに基づくファインチューニングモデルで利用可能
- Chat Completions API、Assistants API、Batch APIで利用可能
- ビジョン入力との互換性あり

### 価格
- 新モデルgpt-4o-2024-08-06使用時、入力は50%、出力は33%のコスト削減

## まとめ

構造化出力の導入により、開発者はより信頼性の高いAIアプリケーションを構築できるようになりました。この機能は、様々なユースケースに対応し、開発プロセスを効率化する可能性を秘めています。

## 参考サイト

https://openai.com/index/introducing-structured-outputs-in-the-api/
Java gold 例題 匿名クラス

```java

public class AnonymousClassTest {
	public static void main(String[] args) {
		Sample sample = new Sample() {
			{
				super.print();
			}	
			Sample() { 
               System.out.println("B");
            }
			@Override
			void print() {
				System.out.println("anonymous");
			}
		};
		
		sample.print();
	}
}

class Sample {

	Sample() {
		System.out.println("Sample");
	}
	
	void print() {
		System.out.println("print");
	}
}

```

コードを実行するとどうなりますか？

1.Sampleと表示される
2.printと表示される
3.Bと表示される
4.print B anonymous と表示される
5.Sample print anonymous　と表示される
6.コンパイルエラー

<details><summary>解答</summary>
6<br>
匿名クラスの問題。匿名クラスではコンストラクターを定義することができない。<br>
そのため、単なるメソッドとして扱われるが、戻り値もないためコンパイルエラー。<br>
匿名クラス内のSample(){ }部分を消すと、Sample print anonymous と表示される。
</details>

---

https://qiita.com/T-ngtj/private/df254aacd05be698199a
OpsRamp - 自動的にモニターテンプレートを割り当てる方法について

本記事では、OpsRampでリソースに対し、自動的にモニターテンプレートを割り当てる方法について説明します。

# 概要
OpsRampには、デバイス管理ポリシーと呼ばれるリソースにモニターテンプレート、カスタム属性、ナレッジベース記事を動的に割り当てる機能があります。この機能により、リソースを登録するだけでモニターテンプレートなどを自動的に割り当てることができます。

# 設定方法
モニターテンプレートの自動割り当て設定は、Setup > Resources > デバイス管理ポリシー から可能です。
![device_management_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/8a5aafd5-7ae9-ecbe-9a14-166e96e0fe45.png)
Filter Criteria または Query を使用して、割り当てたいリソースを指定します。
アクション実行セクションの Assign Monitor Template を選択すると割り当てたいモニターテンプレートを指定することができます。
Force assign/Unassignオプションは、ここで指定したモニターテンプレートのみをリソースに強制します。既存で割り当たっているモニターテンプレートは、自動的外れます。
Override resource parametersオプションは、既存に割り当たっているモニターテンプレートのリソースレベルのパラメーター(閾値など)を上書きします。
![device_management_policy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/6949f07f-3c65-9b0f-7f72-296c3de29bc6.png)
モニターテンプレートのほかに下記を割り当てることが可能です。
- ナレッジ記事
- ジョブ
- 可用性ルール
- 資格情報
- カスタム属性

![device_management_policy3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/17e0bf04-8d3f-ce73-8b2f-af9db02c8da3.png)



---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Gulp５をローカルインストールでとにかく走らせてみる

ペンダープレフィックスもWatch機能も後回し
シンプルにとにかく通したいとき用のメモ


PC：Windows
Gulpのインストールの種類：ローカルインストール

グローバルインストールとローカルインストールがあるみたいですが、今回はローカルにインストールしました。

Node.jsをインストール
参考サイト

https://ics.media/entry/3290/


## 1. ローカルにインストール
コマンドプロンプトを開く
コードがある場所に移動する
windows Dドライブに移動する場合は cdのあとに /d
```
cd /d ファイルパス(コードのトップ階層)
```
```
npm init -y
```
*-yがないといろいろ入力したり、Enterを数回おさないといけない

ローカルインストールを行う
```
npm install -D gulp
npm install -D gulp-sass 
npm install -D sass 
```

グローバルインストールでは
npm install -g gulp-cli
でインストールするらしいが、ここではローカルインストールします。

## 2. VS codeで新規jsファイルを作成
ファイル名：gulpfile.js
自分でファイルを新規作成して指定の名前を付けて、package.jsonと同じところに置く。

gulpfile.jsの中身
以下のコードをコピペして保存

```
//gulpfile.jsというファイル名で新規作成
const gulp = require("gulp");
const sass = require("gulp-sass")(require("sass"));
gulp.task("default", () => {
  return (
    gulp
      .src("./sass/**/*.scss")
      .pipe(sass())
      .pipe(gulp.dest("css"))
  );
});
```

"./sass/**/*.scss"　
1．ローカルにインストールの
cd /d ファイルパス(コードのトップ階層)のファイルパス、のところからのパス。
sassフォルダの中の　.scss拡張子のデータを全部みてくれる

 ## 3. コマンドプロンプトに戻る
 Gulpを走らせる
 ```
 npx gulp
```
※gulp sassでは通りません

参考

 https://ics.media/entry/3290/
【JavaScript】非同期処理について（Promise, async, await）

# はじめに
JavaScriptを用いる際に理解しておくべき非同期処理についてまとめました。

# 非同期処理
- JavaScriptのコードは、基本的にメインスレッド（UIスレッド）で実行される
- メインスレッドでは、画面の描画等の処理も実行される
- ゆえに、メインスレッドに時間のかかる処理（サーバーへのHTTPリクエストなど）がある場合、そこで画面がフリーズしてしまう
- 非同期処理を用いれば、時間のかかる処理と**並行**してその他の処理を実行できる
- そのため、画面フリーズの問題を解決できる
- 非同期処理は、基本的に**並行**処理であって、それらはメインスレッドで実行される

# Promise
- Promiseは、現代のJavaScriptにおいて非同期処理を行う際の基礎となるもの
- `fetch()`APIなどのPromiseベースのAPIでは、返値としてPromiseオブジェクトを返す
- 非同期処理を実行すると、すぐにPromiseオブジェクトが返されて、次の処理へ移る
- Promiseオブジェクトの`then()`メソッドにハンドラー関数を渡すと、非同期処理が成功した場合にそのハンドラー関数が実行される
- Promiseオブジェクトの`catch()`メソッドにハンドラー関数を渡すと、非同期処理が失敗した場合にそのハンドラー関数が実行される。つまり、エラー処理を行う
- `then()`メソッドもPromiseオブジェクトを返すため、`.`（ドット）で繋いで非同期処理を連続して行うことができる。非同期処理は、その順番で完了されていく
- `then()`メソッドの連鎖の最後に`catch()`メソッドを繋ぐと、連鎖の中のいずれかの非同期処理が失敗した場合にエラー処理をすることができる
```js:fetch()を使った例
const fetchPromise = fetch(
  'https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json'
);

fetchPromise
  .then(response => {
    if (!response.ok) {
      throw new Error(`error: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    console.log(data[0].name);
  })
  .catch(error => {
    console.error(`処理が失敗しました。: ${error}`);
  });

console.log('処理の開始');

```
- 上記の例では、`fetch()`が呼び出されると、fetchPromiseにPromiseオブジェクトが格納され、非同期処理が始まる。この後の非同期処理（HTTPリクエスト及び`json()`メソッド）は時間がかかるので、先に`console.log('処理の開始');`が完了することに注意。その後、非同期処理が順に完了して行き、取得したデータの内容が表示される。なお、URLをいじってリクエストを失敗させれば、`catch()`メソッドの内容が実行される。

# Promiseが登場する前
- Promiseが登場する前には、コールバック関数を用いて非同期処理を実装していた
- しかし、コールバック関数を受け取るコールバック関数が必要となるなど、ネストが深くなりがちであったため、コードがとても分かり辛いものとなっていた（コールバック地獄）
- また、ある非同期処理の外側からその非同期処理のエラー処理をすることはできないため、各非同期処理ごとにエラー処理を記述する必要があり、これもコードが分かり辛くなる原因となっていた

# async/await
- `async`キーワードを用いると、Promiseによる非同期処理をさらにシンプルに動作させることができる。
- 関数の開始時に`async()`を追加すると、その関数は非同期関数になる
- 非同期関数の内部では、Promiseを返す関数を呼び出す前に`await`キーワードを使用することができる。これは、Promiseの結果が決定するまでその関数で処理を待たせ、Promiseの結果を返すか、失敗時の例外を発生させる
- `async`及び`await`を用いることで、あたかも通常の同期処理のコードのように記述することができる。エラー処理も通常のtry-catch文のように書ける。
```js:async/awaitを用いた例
async function fetchProducts () {
  try {
    const response = await fetch(
      'https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json'
    );
    if (!response.ok) {
      throw new Error(`error: ${response.status}`);
    }
    const data = await response.json();
    console.log(data[0].name);
  } catch (error) {
    console.error(`処理が失敗しました: ${error}`);
  }
}

// これは非同期関数であり、時間がかかる処理なので、この次のconsole.logの処理が先に実行される。
fetchProducts();

console.log('処理の開始');

```


# 参考文献
[mdn 非同期 JavaScript](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Asynchronous)
[JavaScript Primer 非同期処理:Promise/Async Function ](https://jsprimer.net/basic/async/)
３．HTMLから別のHTMLを開けるようにする

# 今日の目標：一覧ページから詳細ページを開けるようにする

## 0．前回の振り返り

https://qiita.com/LoAMiat/items/70d41f0f8abc1bf70f1c

スプレッドシートの内容を検索できるようになりました。

## 1．これまで用意したHTMLとGSを整理する
これまで作成したファイルは以下の4画面分です。
- TOP画面.html
- TOP画面.gs
- 一覧画面.html
- 一覧画面.gs
- 詳細画面.html
- 詳細画面.gs
- 編集画面.html
- 編集画面.gs

これから画面遷移・パラメータ付与をしていくためにハンドリング用の`handler.gs`を作ります。
ここではいったん、doGetは枠だけになっています。
``` handler.gs
/** 
 * 初期表示画面ハンドリング
 */
function doGet(e) {
  // URLパラメータ取得

  // パラメータに応じて読み込む画面を変更
  const htmlOutput = initDetailEdit(e, catId)
  
  return htmlOutput;
}
```

## 2．パラメータを使って分岐する
今回はどの画面を表示しているのかを表す「type」と、どの猫を表示しているのかを表す「catId」を受け取れるようにします。
`e.parameter.[パラメータ名]`で値が取得できるようなので、まずは`handler.gs`上で分岐を記述していきます。
``` handler.gs
/** 
 * 初期表示画面ハンドリング
 */
function doGet(e) {
  // パラメータ取得
  const type = e.parameter.type;
  const catId = e.parameter.catId;
  
  let htmlOutput;
  // TOP画面
  if( !type || type === '' || catId === '' ){
    htmlOutput = initTop(e);
  }
  // 一覧画面
  else if( type === 'List' ){
    htmlOutput = initList(e);
  }
  // 詳細画面
  else if( type === 'detail'){
    htmlOutput = initDetail(e, catId);
  }
  // 詳細編集画面
  else if( type === 'edit'|| type === 'add'){
    htmlOutput = initDetailEdit(e, catId);
  }
  
  return htmlOutput;
}
```

## 3．パラメータを設定してボタンを押せるようにする
まずは詳細画面から編集画面に遷移できるようにパラメータを設定してみます。
パラメータを複数設定する場合、`<button>＋<input type="hidden">`でも実現できるみたいですが、今回はより分かりやすく簡単に書ける`<a>`タグを使う形で書いてみます。

``` CatDetails.html
<a class="catBtn btn btn-outline-primary" href="<?= deployURL ?>?type=edit&catId=<?= catId ?>">編集</a>
```
この形であれば複数パラメータも怖くないです。可変の`catID`をパラメータとして利用しているので、URL本体と同様に変数として扱っています。

こんな感じでほかの画面にもパラメータ設定していきます！

## 4．ブックマークからの開けることを確認する
実際にボランティアメンバーがこのアプリを使う場合、よく利用するページをブックマークしていただくことになりそうです。ブックマークに残ったパラメータがうまく動くか確認していきます。
![Qiita_GAS3-4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782982/7c00bd2b-75a2-6747-fa0f-9ae9a05fd31b.gif)


できました！

## 5．ブラウザバックで戻れるようにする
各ページを切り替えるごとにURLが発行されるので、ブラウザバックが利用できるはず。ということで試してみました！
こちらも何とか動いているようです。
![Qiita_GAS3-5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782982/7335b506-1ccd-0e17-8b40-3a8732ba507d.gif)


---
ということで、今日はここまで。
画面遷移できるようになると、各画面の初期表示のもっさり感が気になるようになっちゃったので、どこかで改善したいですね。
Discord.jsのEmbedの書き方

ここなにも書くことないりょうです
今回はDiscordでたくさんの情報をｶｯﾁｮｲｲ感じに整理できる**Embed**の使い方。
使えるようになると便利だし見やすいので覚えましょ

## Embedとはなんぞや
まず、Embedがなんのことかわからない人もいると思います。
まああれです、埋め込みです(語彙力皆無)
こんなの↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/3369f072-4248-2939-c2e3-a93900121383.png)

こいつの書き方についての解説記事になってます。ではれっつごー

### Embedの各部名称
以前私もお世話になった[こちら](https://qiita.com/nedew/items/4e0c20c1a89e983a6992)の記事から引用させていただきます🙇‍♀　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/b5750c90-3f6d-12cc-a847-6debef720f4f.png)

それぞれの説明です
|:--------------------:|
**Author [name, iconURL]**
|bot名、アイコン表示|
**Title**
|Embedのタイトルとなる部分です。|
**Description**
|Embedの説明を入れるとこです。|
**Thumbnail [url]**
|Embedのサムネイルです。|
**Fields [name, value, inline]**
|いろんなのをいれていくところです。inlineを活用して横にも並べられます|
**Image**
|画像を入れるところです|
**Footer [text, iconURL]**
|フッターです。Embedに関連する情報や画像を置くところ<br>(左下にあるちっさい画像と©exampleなんちゃらってとこです)|
**TimeStamp**
時刻を表示するところです。設定次第では現在時刻以外でも表示可
**Color**
|Embedの右側に出てる色です。|

## EmbedBuilder
ここからはEmbedを作っていきます。
discord.js v14からMessageEmbedに替わって**EmbedBuilder**が出ました。
これを使います。

```js
const { EmbedBuilder } = require('discord.js');
/**
うんたらかんたらぴゃー
**/
      const embed = new EmbedBuilder()
        .setAuthor({ name:bot名, iconURL:アイコンURL })
        .setTitle('Embedのタイトル')
        .setDescription('Embedの説明')
        .setThumbnail('サムネイルURL')
        .addFields({ name: 'fieldのタイトル', value: 'fieldの内容' })     
        .setImage('画像URL')
        .setFooter({ text: 'フッターに表示したい内容', iconURL: 'アイコンURL' })
        .setTimestamp()
        .setColor('好きな色'); 
        
	message.channel.send({ embeds: [embed] });
//  await interaction.reply({ embeds: [embed] });
```
こんなかんじ。
#### 各部注意点
```js
.addFields()
```
**s**を忘れないように書いてください。
Fieldは1つのEmbedに25個まで含めることができます
`inline`(3つまでFieldsを横に並べられる)も活用して縦に長くなりすぎないよう注意したほうがいいと思います。
ただし、thumbnailを設定している場合は2つまでしか横並びにすることができません。

**複数個の場合**
```js
    .addFields(
        { name: 'field2️⃣', value: '2つめのfieldだよ', inline: true },
        { name: 'field1️⃣', value: '1つめのfieldだよ', inline: true },
    );
```
このようになります。実際に送信した画像です↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/f6251910-871a-f19a-949f-33f1fcee3b10.png)

**thumbnailがある場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/65ce83c3-2856-1206-8285-c7229f0dd0ee.png)

```js
.setTimestamp()
```
Timestampは、特に設定せずこのまま使えば現在時刻が表示されます。
```js
.setColor()
```
色の指定形式は`('#FFFFFF')`もしくは`(0xFFFFFF)`のようにしてください。

### マークダウンについて
Embed内でマークダウン(文字を太くしたりする装飾)が行える場所は限られています。
Description、Fieldsのvalueのみです。
また、#を使うものはできないので注意。`*`や`~`などは使えます

### まとめ
Embedは慣れると簡単に情報まとめられるから超便利です
なにかわからないこと等あれば書いてくれれば返答させてもらいます！

**Discordに湧いてる荒らしの情報や対策法の共有を行っている自鯖です↓**
https://discord.gg/ESRGwGQhxc
WebアプリからDB登録をする part1

WebアプリからDB登録処理を設計する。

## DB情報
customerテーブル
| id | name | code | age | address |
|----|------|------|-----|---------|
| 1 | 安藤 | 100001 | 30 | aaaa@bb.com |
| 2 | 井川 | 100002 | 35 | aabb@bb.com |
| ： | ： | ： | ： |

## 購入処理
```plantuml
@startuml
participant クライアント as client
participant サーバ as server
participant データベース as database

client -> server : 入力
activate server
    server -> database : 登録
    activate database
        database -> server : 通知
    deactivate
    server -> client : 通知
deactivate
@enduml
```

## 実装
### DB作成
データベースとテーブルを作成するコードを実装する。
<details>
<summary>実装</summary>

```python
import mysql.connector

def create_database():
  print('START CREATE DATABASE')

  mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="root",
    auth_plugin="mysql_native_password"
  )

  mycursor = mydb.cursor()

  mycursor.execute("CREATE DATABASE sample_db")

  print('-------------------------')
  mycursor.execute("SHOW databases")
  for x in mycursor:
    print(x)
  print('-------------------------')

  print('END CREATE DATABASE')

def create_table():
  print('START CREATE TABLES')

  mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="root",
    database="sample_db",
    auth_plugin="mysql_native_password"
  )

  mycursor = mydb.cursor()

  mycursor.execute("CREATE TABLE customer(id INT AUTO_INCREMENT, name TEXT, code TEXT, age INT, address TEXT, PRIMARY KEY (id)) DEFAULT CHARSET=utf8")

  print('-------------------------')
  mycursor.execute("SHOW tables")
  for x in mycursor:
    print(x)
  print('-------------------------')

  print('END CREATE TABLES')


print('START')
create_database()
create_table()
print('END')
```

</details>

### DB登録
サーバからDBへ登録するコードを実装する。
<details>
<summary>実装</summary>

```python
import mysql.connector


def register_customer(_name, _code, _age, _address):
  print('START CREATE MONEY STOCK TABLES')

  mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="root",
    database="sample_db",
    auth_plugin="mysql_native_password"
  )

  mycursor = mydb.cursor()

  sql = "INSERT INTO customer(name, code, age, address) VALUES (%s, %s, %s, %s)"
  val = [_name, _code, _age, _address]
  mycursor.execute(sql, val)

  print('-------------------------')
  mycursor.execute("SELECT * FROM customer")
  myresult = mycursor.fetchall()
  for x in myresult:
    print(x)
  print('-------------------------')

  print('END CREATE TABLES')

register_customer("安藤", 100001, 30, "aaaa@bb.com")
```

</details>

以後、続きは別のページで。
AWS API GatewayでLambdaプロキシ統合を設定する方法

AWS API Gatewayを使用してLambda関数をプロキシ統合する際に、正しいレスポンス形式を使用しないと500エラーが発生することがあります。
本記事では、Rubyで書かれたLambda関数を使用して、正しいレスポンス形式を返す方法について説明します。

# Lambdaプロキシ統合とは
Lambdaプロキシ統合は、API Gatewayが受け取ったリクエストをそのままLambda関数に渡し、Lambda関数からのレスポンスをそのままクライアントに返すシンプルな統合方法です。
この統合方法を使用することで、リクエストやレスポンスのマッピング設定を簡略化できます。

# 正しいレスポンス形式
Lambdaプロキシ統合を使用する場合、Lambda関数は以下の形式でレスポンスを返す必要があります：
```json
{
  "statusCode": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": "{\"message\":\"success\"}"
}
```

bodyフィールドはJSON文字列である必要があるため、RubyでJSON形式に変換する必要があります。

# Rubyでの実装例
以下は、Rubyで書かれたLambda関数の例です。この関数は、正しい形式でレスポンスを返します。

```ruby
require 'json'

def lambda_handler(event:, context:)
  {
    statusCode: 200,
    headers: {
      "Content-Type" => "application/json"
    },
    body: JSON.generate({
      message: 'success'
    })
  }
end
```

# ポイント
statusCode: HTTPステータスコードを指定します。
headers: レスポンスヘッダーを指定します。
Content-Typeはapplication/jsonに設定します。
body: JSON形式のレスポンスボディを文字列として返します。
RubyのJSON.generateメソッドを使用して、ハッシュをJSON文字列に変換します。

# まとめ
AWS API GatewayでLambdaプロキシ統合を使用する際には、Lambda関数が正しいレスポンス形式を返すことが重要です。
RubyでLambda関数を実装する場合、bodyフィールドはJSON文字列である必要があるため、JSON.generateメソッドを使用してJSON形式に変換します。
この形式を守ることで、500エラーを回避し、API GatewayとLambda関数の統合をスムーズに行うことができます。
初投稿！！　Ｑｉｉｔａ投稿スタート！

<h1>こんにちは！</h1>
<p>ゆるりんちょです。<br>
はじめに簡単に自己紹介させていただきます。</p>
<p>新卒時に、アプリ開発エンジニアとして運用保守、M365のローコード、Webコーダー(ウェブデザイナー)をしていました。</p>
<p>現在は、事務派遣か技術派遣で仕事を模索している最中です。</p>
<h2>はじめたきっかけ</h2>
<p>このQiitaに出会ったのが、Webコーダーの時に利用していました。
現在、趣味で自身のホームページ制作をしており、そこではITの基本的知識と旅ログを載せております。ITの基本的知識に加え、私自身、プログラミングやコーディングする際に、良く利用しているプログラムなどをメモとして残しておきたいのと、そのメモを他の方々にも参考にしていだけたらと思い、始めました！</p>
<h2>宣伝</h2>
<p>実際に私が制作して運用しているホームページ<br>
※知り合いが絵を描いており、ホームページを制作して欲しいとのことで試しに運用しております。</p>

<a href="https://riena-homepage.net/">https://riena-homepage.net/</a>

<h2>趣味</h2>
<p>音楽鑑賞、映画鑑賞(主に洋画)、旅行、野球観戦、カメラ、スプラトゥーン3、ホームページ制作</p>
<p>よろしくお願いいたします。</p>
【Python】Chrome for TestingでSeleniumを動かす

# Chrome for TestingでSeleniumを動かす

## はじめに
ChromeDriverとChromeブラウザのバージョンの不一致でエラーが起きたことはないでしょうか。

今回はこの問題を解消するChrome for Testingを使ってSeleniumを動かす方法を紹介します。

## Chrome for Testingとは
Chrome for Testingは、Googleが提供するブラウザの自動化とテストを目的として作成された特別なChromeバージョンです。通常のChromeブラウザとは異なり、テスト環境に特化した機能や設定が含まれています。

主な特徴：
- 自動更新が無効化されており、テスト環境の安定性が向上
- テスト用の特別な設定やフラグがデフォルトで有効
- ChromeDriverとの互換性が保証されており、バージョン不一致の問題を解消

詳細は公式ブログを参照してください：
https://developer.chrome.com/blog/chrome-for-testing?hl=ja

## インストール
Chrome for Testingは公式サイトからダウンロードできます。また、curlコマンドを使用してインストールすることも可能です。

インストール時は、使用しているOSとアーキテクチャに適したバージョンを選択してください。

例：macOS (ARM64)の場合
```bash
curl -O https://storage.googleapis.com/chrome-for-testing-public/127.0.6533.99/mac-arm64/chrome-mac-arm64.zip
unzip chrome-mac-arm64.zip -d /Applications/
```

ダウンロードページ：
https://googlechromelabs.github.io/chrome-for-testing/

注意：バージョン番号は定期的に更新されるため、最新バージョンを確認してください。

## 実際に使ってみる
以下のPythonコードでChrome for Testingを使用してSeleniumを動かすことができます。このセットアップでは、従来のChromeDriverが不要になります。

```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# Chrome for Testingのパスを指定
chrome_binary_path = "/Applications/chrome-for-testing/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"

# Chromeのオプションを設定
chrome_options = Options()
chrome_options.binary_location = chrome_binary_path

# Serviceオブジェクトを作成（ChromeDriverのパスは不要）
service = Service()

# WebDriverを初期化
driver = webdriver.Chrome(service=service, options=chrome_options)

# テストページを開く
driver.get("https://www.google.com")

# ブラウザを閉じる
driver.quit()
```

### 破損している場合の対処
macOSでChrome for Testingを初めて実行する際、セキュリティ警告が表示される場合があります。これを解決するには、以下のコマンドを実行してください：

```bash
xattr -cr '/Applications/chrome-for-testing/Google Chrome for Testing.app'
```

このコマンドは、アプリケーションに付加された拡張属性を削除し、macOSのGatekeeper機能による警告を回避します。

## さいごに
Chrome for Testingを使用することで、ChromeDriverとChromeブラウザのバージョン不一致問題が解消され、より安定したテスト環境を構築できます。また、自動更新が無効化されているため、長期的なテスト実行においても一貫性が保たれます。

是非使ってみてください。
Carthage + Firebase (AdMob)でビルド時にリンクエラーが発生したら

Carthage を使用して Firebase（AdMob）を導入後、ビルドした際に以下のエラーが出たときのお話です。インターネットを検索してもすぐに解決策が見つからなかったので、残しておきます。
```
ld: Undefined symbols:
  _OBJC_CLASS_$_JSContext, referenced from:
       in GoogleMobileAds[x86_64][418](GADOMIDLightJSExecutor.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
## 解決策
いきなりですが、JavaScriptCore.framework をアプリの `Frameworks, Libraries, and Embedded Content` に追加すれば、エラーは発生しなくなります。

![JavaScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/cb8b10d6-e8ff-8e12-d043-a05e1d627dcd.png)

以下は、発生した経緯等の内容なので、ふ〜んってかんじで流し見してください。

## 環境
Xcode: 15.2
Firebase Apple SDK: 10.28.0
Intel Mac: 13.6.8 (22G820)
Carthage: 0.39.1

## エラーが発生するまで
### 1. Cartfile
[Firebase Carthage](https://github.com/firebase/firebase-ios-sdk/blob/main/Carthage.md) の GitHub にある手順を参考に必要な機能（ここでは Analytics, AdmMob, Crashlytics [Version 10.28.0]）を記載した Cartfile を作成します。
```text:Cartfile
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json" == 10.28
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAdMobBinary.json" == 10.28
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseCrashlyticsBinary.json" == 10.28
```

### 2. carthage コマンド実行
`carthage update --platform ios --use-xcframeworks` を実行し、xcframework ファイルをダウンロードします。

### 3. Framework を追加
Xcode でアプリのプロジェクトを開き、`Carthage/Build` に出力された xcframework ファイルを `Frameworks, Libraries, and Embedded Content` に追加します。

![Frameworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/f7bdc853-8514-58c1-d977-b5164d484d86.png)

:::note warn
xcframework は、Firebase Apple SDK のバージョンによって異なる場合があるので注意してください。これは、Version 10.28.0 の例です。
:::

### 4. ビルドを実行 （エラー発生）
Xcode でアプリの .xcodeproj ファイルを開き、PROJECT → Build Settings → Linking - General → Other Linker Flags に `-ObjC` を設定後にビルドすると冒頭のエラーが発生します。

## さいごに
エラー内容に x86_64 とか書いてあるので、Arm Mac だと発生しないのかなと思っていますが、私は古い Intel Mac を使ってるので、確認できていないです。Arm Mac をお持ちの方はやってみていただけると助かります。

## 参考URL
https://github.com/firebase/firebase-ios-sdk/blob/main/Carthage.md
完璧主義のメモ魔がTodoアプリ開発するためにノーコードツール"BUBBLE"を使ったら、はじけちゃったって。

## 私はメモ魔だ！ ##

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/e7d23c51-72a0-b4e9-1f09-c6f7d4abf3e4.png" width=70%>

みなさんメモ魔という言葉をご存知でしょうか？？

:::note info
メモ魔とは？
→思い浮かんだことや見聞きしたことを
　何でもメモしておかなければ気が済まない人のこと
:::


私がメモをする理由には
おそらく自分の特性が関係しています。
それは、**完璧主義**だということです。

これ忘れてた！予定間違えた！などの
ミスを１つもしたくない気持ちがとてもあり
すぐにメモをすると防げることに気づいたことで
メモ魔になった原因なのではと考えています。

## メモ魔が困っているゾ
ただ、１つ困っていることがあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/f4483c81-89ec-b220-3dd9-351db1f4c6c2.png" width=70%>

メモは大体ToDoリストに入れて、
実行したら消していくという流れにしています。

現状を見ると・・・
ToDoリストはフォルダからカテゴリ別でを管理しています。
実際にToDoリストを検索するときは
カテゴリ別に辿っていかないと開けないのです。
画像のように２段階踏まなければなりません。

### １つのページにすれば良いのでは？

と思った方もいると思います。
ただToDoリストがありすぎてカテゴリ別で分けると
その日にやらなければならないことが
下へ表示されているものもあるため、
スクロールしてみないと見逃してしまいます。

なので・・・
## 様々なカテゴリが集まったToDoリストを作るゾ！

最近知った **BUBBLE** という
ノーコードツールを使って作ってみる！！！
と意気込んだのはいいのですが
最後まで作ることができませんでした・・・
完璧に終われないこの不完全燃焼感！！！
**悔しくてたまらない！！**
・・・という気持ちをバネにして
引き続き懲りずに作っていきたいと考えています。

**悔しい気持ちが超絶現れている記事はこちら↓**

https://zenn.dev/riyu/scraps/1be88f566b3c71


## 作ってみたのだ！！ ##

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/f309aa9f-4416-9a42-79e3-ecc56958c712.png" width=70%>

できてるように見えますよね？？
実際は、全然ToDoリストが表示してくれませんでした。

↓少し仕様も変えていますが、現在の途中段階のアプリです。

https://yuriyanagisawa11.bubbleapps.io/version-test?debug_mode=true

ひとまず振り返りとして、作り方を記録します。


### 準備するツール ###

💻　**BUBBLE**：

https://bubble.io/home/start-here

こちらのチュートリアルも参考に作りました。

https://bubble.io/page?type=page&name=index&id=learn&tab=tabs-1&lesson_ref=12&no_arrow=true


### 作った記録です(^^;; ###

・はじめは真っ白な画面から始まりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/37e7aeef-38c2-bced-3ea6-b89661a9b665.png
" width=70%>

・左の「text」などのボタンから選んでいき
　ページに挿入していくみたいです！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/5c086a0f-1171-1aa6-f339-e20046f7c761.png
" width=70%>

・色や、文字の大きさ、カレンダー表示などもできたので
　様々なボタンを触ってみました。

  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/907ba8c3-54d0-64ae-5182-c2f1b0e6507c.png
" width=70%>

ここまでは順調だったのですが・・・

・うまく裏側が作動せず、ひとまずシンプルなUIで
　作ってみることにしました。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/8d29ddac-58d1-edc5-f942-778376807d68.png
" width=70%>

結構シンプルになりました。
・ワークフローで裏側の設定しようと思ったのですが・・・

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/426f8bf7-a227-1ce0-ed7f-2c013f2a5508.png
" width=70%>

Data sourceのところや他の部分でも
参考にしていたチュートリアルと違いがあり
動かなくなりました。

・最後はこのような形でひとまず終了しました。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720831/cb314f08-5d21-42c0-1af2-196c4c0ca5e9.png
" width=70%>


## 引き続き改善したい！ ##

不完全燃焼で終わりましたが・・・
このアプリを使う明るい未来を目指して
完成まで挑戦していきたいと思います！


## 完璧主義者が作った前作までのお気に入り３選↓

**💡２つの記事が１つのストーリになっています。**

https://qiita.com/riyu_11/items/e8c6a1a57d730bd38b40

https://qiita.com/riyu_11/items/63a9a762159f41ddccbe

**💡我が家のハムスターの無防備な姿から始まります。**

https://qiita.com/riyu_11/items/41b238eed2ae00158f5b
OpenAIのChatGPT APIでstrict=trueを指定しても型通りに出力されない場合の対処法

# TLDR

```
parallel_tool_calls = false
```

を指定する

# 解説

ChatGPT APIのFunction Calling機能を使うと、jsonで定義したデータ構造でレスポンスを返却してくれるので、プログラム上の後段の処理に繋げるのに便利です。

https://qiita.com/muraokaz/items/602fc300699e6aed4965

2024年8月のアップデートで、このデータ構造を厳格に守るように命令するパラメータ"strict"が登場し、Function Callingがより使いやすくなりました。（逆に言うと、それまではデータ構造を指定してもそれをChatGPTが守るかどうかはベストエフォートだったため、プロンプト上でもデータ構造に誘導するような文言の工夫が必要でした。）

> When crafting function calls you need to think about what information the AI has at that moment in time, what are the function names like? Informative? would it be clear to the AI what the function does and when it should use it? Imagine the AI is a new employee and you need to explain to it everything it needs to complete the task.

https://community.openai.com/t/problem-with-required-property-when-function-calling/273635/13

ところが、この新しいパラメータstrictにtrueを指定しても、返却値が定義通りにならないことがあります。その理由のひとつとして、パラメータ"parallel_tool_calls"がデフォルトでtrueになっていることで、こちらが定義したデータ構造をChatGPTが勝手に分割して解釈し、アウトプットを複数のオブジェクトとして返却する場合があります。

ドキュメントを読む限り、parallel_tool_callsパラメータは、ユーザーが複数関数を定義してAPIを呼び出したときにアウトプットを分割させる役割のように読めるので、単一関数の定義の場合の挙動はおかしいように思いますが、とにかくこれのデフォルト値が望ましい結果を得られない原因となっているようです。

> When the model outputs multiple function calls via parallel function calling, model outputs may not match strict schemas supplied in tools.

https://platform.openai.com/docs/guides/function-calling

これを回避するためにこちらでparallel_tool_callsをfalseにしておく必要があります。ドキュメントのサンプルに挿入位置が載っていないようなので例示しておきます。

``` python
response = client.chat.completions.create(
    model='gpt-4o-2024-08-06',
    messages=messages,
    tools=tools,
    parallel_tool_calls=False,
)
```
interactions.py で VoiceWebsocketClosed が出る場合の対処

## 前説

2024/08/06 現在、interactions.py 製のDiscordBOTをボイスチャンネルに参加させるとタイトル通りのエラーが出る。

## 解決方法

以下のプルリクの変更内容を自前でマージする
https://github.com/interactions-py/interactions.py/pull/1727/commits/a2525622437e309b085adbfcf33d34de3af38141

現状 unstable ブランチにしか入っていない変更だけどそのうちリリースが来るはず

## 原因
Discordがサイレント仕様変更をやってくれた様子
HeartBeatイベントのpayloadに含まれる値としてfloatは受け付けなくなったとのこと
というわけでランダムシーケンスの生成方式を `random.uniform(0.0, 1.0)` から `random.getrandbits(64)` に変更することで解決している
＃23　スプレッドシートで1週間ごとに自動更新の当番表を作ってみた

## 概要

1週間ごとに担当者がローテーションしていく当番表を作成しました。
自動更新になっていて、翌週月曜日になると自動的に当番がスライドします。
一番下まで行くとまた先頭の人に戻ります。

**初日**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/c8985f5b-621c-b22c-8af0-3ff1131210e3.png)

**翌週月曜日**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/d315fedc-4f43-4034-c653-8bcdc1166cbe.png)


## 仕組み

### 当番の更新

B列には、こちらの式を設定しています。
```
=IF(MOD(QUOTIENT(DATEDIF($E$1,TODAY(),"d"),7),COUNTA(A:A))=ROW()-1,"当番","")
```

各関数の意味合いはざっくりと以下の通りです。
| 関数 | 説明 |
|--|--|
| IF(論理式,TRUE値,FALSE値) | 論理式の条件を満たすときTRUE値、満たさないときFALSE値を返す |
| MOD(被除数,除数) | 被除数 ÷ 除数のあまりを返す |
| QUOTIENT(被除数,除数) | 被除数 ÷ 除数の商を整数で返す |
| DATEDIF(開始日,終了日,単位) | 開始日から終了日までの差を返す。今回は単位dなので日数 |
| TODAY() | 今日の日付を返す |
| COUNTA(範囲) | 範囲内の空白でないセルの個数を返す。今回は範囲としてA列を指定 |
| ROW() | セルの行番号を返す |

これらを整理すると、上の式は
**(E1の日から今日までの経過週数 ÷ 人数)のあまり + 1 行目に「当番」と表示する**
という意味になります。
初週は、経過週数が0なので、1行目の人が当番。次の週は、経過週数が1なので、2行目の人が当番。といった具合です。

### セルの背景色の変更

条件付き書式を使用し、セルの値が「当番」のときだけ背景色がつくように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/ba5305ad-a550-b8f9-2406-c38f92909d7f.png)


### 自動更新を有効にする

スプレッドシートは、デフォルトではファイルに変更があったときしかTODAY()の再計算がされないようなので、
時間経過でも更新されるように設定を変更します。
ファイル → 設定 でスプレッドシートの設定を開き、計算 → 再計算 を「変更時と毎時」に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/760fcb10-f50d-2e32-f632-b49a83815d09.png)


## 応用

### 当番更新日を月曜以外にする

E1を基準日にしていますので、そこに月曜日の日付を入れれば月曜日更新。火曜日の日付を入れれば火曜日更新となります。

### 複数の当番を設定する

当番Aでなかったら当番Bか判定する、当番Bでなかったら当番Cか判定する...といったように条件をつけ足していくことで複数の当番をローテーションさせることも可能です。
例として、当番Aと当番Bをローテーションさせる場合の式は以下のようになります。
```
=IF(MOD(QUOTIENT(DATEDIF($E$1,TODAY(),"d"),7),COUNTA(A:A))=ROW()-1,"当番A",IF(MOD(QUOTIENT(DATEDIF($E$1,TODAY(),"d"),7)+1,COUNTA(A:A))=ROW()-1,"当番B",""))
```
条件付き書式は複数設定可能なので、セルの値が当番Aのときは緑、当番Bのときは黄といったように設定すれば色分けも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/67e821b0-a6c7-38f6-ad89-2dfe61fddd70.png)


あるいは、B列は当番A用の関数、C列は当番B用の関数、といったように列を切り分けることでも実現可能です。
この場合、当番B用の式は当番Aより一つ下にずらすので
```
=IF(MOD(QUOTIENT(DATEDIF($E$1,TODAY(),"d"),7)+1,COUNTA(B:B))=ROW()-1,"当番B","")
```
になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/fb26048c-08b1-b8a3-e544-a5260610364e.png)


### 週替わりではなく、日替わり、月替わりの当番表にする

式の `QUOTIENT(DATEDIF($E$1,TODAY(),"d"),7)` の部分を書き換えることで、日替わり、月替わりにすることができます。
日替わりの場合は、÷7をする必要がないので `DATEDIF($E$1,TODAY(),"d")`です。
月替わりの場合は、単位を月(m)にすればよいので `DATEDIF($E$1,TODAY(),"m")`です。毎月1日に更新する場合は、開始日を1日にします。
平日のみの日替わりとしたい場合は、祝・祭日のリストを用意し、NETWORKDAYS関数を使う必要があります。こちらの詳細は割愛しますので、必要であればNETWORKDAYS関数を調べてみてください。

## 最後に

今回は、当番表を手動で更新するのが大変なので自動化してみました。
ご参考になれば幸いです。
ありがとうございました！
30代エンジニアのシステム開発における概要設計の進め方

### はじめに

システム開発における概要設計は、プロジェクトの成功に直結する重要なフェーズです。適切な設計を行うことで、後続の詳細設計や実装がスムーズに進行し、プロジェクト全体のリスクを低減できます。本記事では、概要設計の基本から応用までを網羅し、実践的なアプローチとともに詳しく解説します。

---

#### 1. 概要設計とは

概要設計は、システム全体の骨格を定義し、プロジェクトの基盤を築く工程です。このフェーズでは、以下の要素を中心に設計を行います。

- **システム全体のアーキテクチャ設計**  
  システム全体の構造を定義し、各コンポーネントの配置と相互作用を設計します。アーキテクチャパターン（例えば、レイヤードアーキテクチャやマイクロサービスアーキテクチャ）を選定し、システムの可用性、スケーラビリティ、保守性を確保します。

- **各コンポーネントの役割と相互関係の定義**  
  システムを構成する各コンポーネントの役割を明確にし、データフローや依存関係を定義します。これにより、各モジュール間のコミュニケーションが効率的に行われるように設計します。

- **データフローとインターフェース設計**  
  システム全体のデータフローを設計し、各モジュール間のインターフェースを定義します。APIの設計や外部システムとの連携もこの段階で検討します。

- **非機能要件の明確化**  
  パフォーマンス、セキュリティ、スケーラビリティ、障害対応などの非機能要件を明確にし、設計に反映させます。これにより、システムの信頼性と運用効率が向上します。

---

#### 2. 概要設計の進め方

概要設計を成功させるためには、明確なプロセスに従うことが重要です。以下は、概要設計の進め方の詳細な手順です。

1. **要件分析**
   - システムの機能要件と非機能要件を詳細に分析し、プロジェクト全体の目標を明確にします。要件の優先順位を決定し、設計の指針を定めます。

2. **アーキテクチャ設計**
   - システム全体のアーキテクチャを設計します。特に、選定する技術スタック（例：フロントエンド、バックエンド、データベース、インフラ）やデータベースの構造、ネットワーク設計が重要です。ここでは、各技術の適用範囲や選定理由を明確にし、将来的な拡張性も考慮します。

3. **モジュール設計**
   - システムを複数のモジュールに分割し、各モジュールの役割、責任範囲、依存関係を定義します。モジュール間のデータ交換方法やAPIの仕様も設計に含めます。

4. **インターフェース設計**
   - モジュール間および外部システムとのインターフェースを設計します。データフォーマット、通信プロトコル、エラーハンドリングなど、インターフェースに関する詳細な仕様を決定します。

5. **データベース設計**
   - システム全体のデータモデルを設計し、データベースの構造を定義します。正規化、インデックス設計、パーティショニング、バックアップ戦略など、データベースのパフォーマンスと可用性を考慮した設計を行います。

6. **セキュリティ設計**
   - システムのセキュリティ要件を満たすための設計を行います。認証・認可、データ暗号化、セキュリティログの管理、脆弱性対策などを盛り込みます。特に、外部とのデータ通信やユーザーデータの保護に重点を置きます。

7. **パフォーマンス設計**
   - システムのパフォーマンス要件に基づき、負荷分散、キャッシュ戦略、非同期処理などの設計を行います。パフォーマンステストの計画もこの段階で策定します。

8. **非機能要件の検討**
   - 性能要件やセキュリティ要件、運用面での考慮事項を盛り込み、全体設計に反映させます。これにより、システムが想定される負荷やリスクに耐えられる設計が可能になります。

9. **レビューと修正**
   - 作成した概要設計を関係者とレビューし、フィードバックを反映します。技術的な妥当性、コスト、リスクを再評価し、必要に応じて設計を修正し、確定させます。

---

#### 3. 実践的なTips

- **アーキテクチャ選定のポイント:**  
  各プロジェクトに最適なアーキテクチャを選定するための指針を提供します。特に、モノリシック vs マイクロサービスの選択、クラウド vs オンプレミスの判断基準などを詳述します。

- **非機能要件の優先順位:**  
  パフォーマンスやセキュリティにおけるトレードオフの判断基準を示します。どの非機能要件を優先すべきか、プロジェクトの特性に応じたアプローチを解説します。

- **コミュニケーションの重要性:**  
  チーム内およびクライアントとの連携を強化するためのコミュニケーション手法を解説します。特に、設計の意図を正しく伝えるためのドキュメンテーションやプレゼンテーション技術を紹介します。

- **ツールとフレームワークの活用:**  
  モデリングツール（例：UML、ER図）、プロジェクト管理ツール（例：JIRA、Trello）、CI/CDパイプラインの構築方法など、効率的な概要設計を支援するツールやフレームワークの活用方法を説明します。

- **リスク管理:**  
  設計段階で予測されるリスクを洗い出し、それらに対する対策を検討します。特に、新技術の採用や大規模システムの設計に伴うリスクとその緩和策を詳述します。

- **ベストプラクティスの導入:**  
  先行プロジェクトで得られた知見を活用し、概要設計に反映する方法を提案します。これにより、プロジェクトの成功確率を高めることができます。

---

#### 4. ケーススタディ: 実際のプロジェクトにおける概要設計の応用例

最後に、実際のプロジェクトでの概要設計の事例を紹介します。ここでは、特定の業界やシステムの特性に応じた設計のアプローチを具体的に解説します。

- **事例1: 大規模ECサイトの概要設計**
  - モジュールの分割、キャッシュ戦略、セキュリティ設計に重点を置いた概要設計のプロセスを紹介します。

- **事例2: SaaSプロダクトの概要設計**
  - マルチテナントアーキテクチャの設計、スケーラブルなデータベース構造の考え方を説明します。

- **事例3: 金融システムの概要設計**
  - セキュリティとパフォーマンスが最優先されるシステムでの概要設計の手法を解説します。

---

#### 5. まとめ

概要設計は、システム開発の基盤を築く重要なプロセスです。本記事を通じて、概要設計の基本から応用までの知識を身につけ、実際のプロジェクトで活用できる具体的な手法を学んでいただけたと思います。しっかりとした設計を行うことで、プロジェクト全体の品質が向上し、リスクも最小限に抑えることができます。皆さんのプロジェクトが成功することを願っています。
Python3: 長テーブルのうなぎ屋 (paizaランク B 相当)やってみた

よく知られている問題ですが、ちょっと違うやりかたでやってみました。

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table

```py:
# 要素を順に評価して、最後の要素を返す
unbox = lambda *xs: xs[-1]

# 循環リストにおいて x は [ start, end ) の範囲内にあるか
inrange = lambda start, end: lambda x: unbox(
    ge := start <= x
    , lt := x < end
    , ge and lt if start < end else
        lt or ge if end < start else
        False
    )
           

LEN_SEATS, LEN_GROUPS = map(int, input().split())

sits = []
total = 0

for _ in range(LEN_GROUPS):
    n, start, end = (lambda n, s:
                     (n, s % LEN_SEATS, (n + s) % LEN_SEATS)
                     )(*map(int, input().split()))
    
    if len(sits) == 0:
        sits = [(start, end)]
        total += n
        continue
    
    for i in range( len(sits) ):
        # 前のグループの end と 今のグループの start の間にあるか
        invacant = inrange( sits[(i-1) % len(sits)][1]
                            , sits[i][0]
                            )
        
        if not invacant( start ):
            continue
        if not invacant( (end-1) % LEN_SEATS ):
            break
        
        total += n
        sits = [*sits[:i], (start, end), *sits[i:]]
        break
            
print(total)
```
この問題、たいがいは単純に席のリストを作って、座れたかどうかのフラグをチェックするやりかたか、集合演算でするか、みたいな感じだと思います。

ここでのやりかたは前者に似ているのですが、座れているグループとグループの間に、新しいグループの先頭と最後尾が座れればみんなが座れる、という感じ。毎回全部の席をチェックする必要なくない?的なことです。

コンセプトはいいと思ったんだけどなー。書いてみると意外と複雑でした。

せっかくやってみたんでここにあげときます。
分散型VPN（dVPN）と従来のVPNの違い(簡易ver.)



分散型VPN（dVPN）は、従来のVPNが抱える信頼問題を解決するために設計されています。この記事では、dVPNと従来のVPNの違い、そしてdVPNの利点について詳しく説明します。

## 従来のVPNとは？

VPN（仮想プライベートネットワーク）は、インターネットトラフィックを暗号化し、VPNサーバーを経由してルーティングすることで、ユーザーのIPアドレスを隠します。これにより、ISPや第三者からの追跡を防ぎます。主要なプロトコルにはIPsec、OpenVPN、WireGuardがあります。これらのプロトコルは、VPNサービスの基本的な暗号化とセキュリティを提供します。

### 従来のVPNのリスク

- **セキュリティの脆弱性**: 中央集権型VPNは、0デイ攻撃やデータリークのリスクがあります。多くのVPNがセキュリティの脆弱性を抱えており、ユーザーのデータが漏洩する可能性があります。
- **データ収集と販売**: 無料のVPNサービスは、ユーザーのブラウジングデータを収集し、データブローカーに販売することがあります。一部のVPNは、データを暗号化していないことが判明しています。
- **信頼の問題**: VPNプロバイダーがユーザーの活動を監視しないと保証することは困難です。プロバイダーがユーザーデータを第三者に販売するリスクもあります。

## 分散型VPN（dVPN）とは？

分散型VPN（dVPN）は、従来の中央集権型VPNの代わりに、ネットワーク全体を複数の独立したノードで運営することで、信頼問題を解決します。以下はdVPNの主な特徴です。

### dVPNの利点

1. **マルチホップルーティング**: dVPNは、複数のホップをデフォルトで提供し、ユーザーの匿名性を大幅に向上させます。これにより、ネットワーク全体を監視することが難しくなり、追跡を防ぎます。
2. **単一障害点がない**: dVPNは、中央集権型のサーバーを持たず、複数のノードがネットワークを運営するため、単一障害点が存在しません。これにより、ネットワーク全体が侵害されるリスクが低減します。
3. **中央集権的なログ記録がない**: ノードが独立して運営されているため、ユーザーの行動をログに記録することが困難です。これにより、プライバシーが強化されます。
4. **オープンソースのコードベース**: dVPNは一般的にオープンソースであり、コードベースが公開されています。これにより、誰でもコードを確認し、セキュリティやプライバシーの透明性を確保できます。

### NymVPNの特徴

- **マルチホップルーティングのデフォルト**: NymVPNはデフォルトでマルチホップルーティングを実装しており、プライバシーとセキュリティを強化しています。これにより、スヌーパーや中間者攻撃に対する耐性が向上します。
- **5ホップミックスネットモード**: NymVPNは5ホップミックスネットモードを提供しており、特に強力な匿名性を実現しています。これにより、通信のパターンを守り、ユーザーを特定するための情報を隠します。
- **分散型ディレクトリアクセス権**: NymVPNでは、ディレクトリアクセス権が分散型で管理されており、スマートコントラクトを使用してネットワークの健康状態と構成を監視します。
- **パフォーマンス向上のインセンティブ**: ノードオペレーターには経済的インセンティブがあり、サービスの品質を維持するための動機があります。これにより、ネットワーク全体のパフォーマンスが向上します。

## 結論

dVPNは、従来の中央集権型VPNの問題を解決し、より高い匿名性とプライバシーを提供します。NymVPNは、その分散型ネットワークとマルチホップルーティングにより、他のdVPNと比較しても特に強力なプライバシー保護を実現しています。NymVPNのウェイトリストに登録し、最先端のプライバシーシステムにアクセスしてみてください。

# sponsor
HStorageは、高度なセキュリティ機能を提供しているオンラインストレージサービスです。


https://hstorage.io/


# 参考リンク

- [Nym公式サイト](https://nymtech.net/)
- [Nymのミキシングネットワーク - Wikipedia](https://ja.wikipedia.org/wiki/Nymミックスネット)
- [Nymホワイトペーパー](https://nymtech.net/nym-whitepaper.pdf)
- [分散型VPN と中央集権型VPN:違いの全て](https://note.com/koko_crypto/n/n71fe7e92b68a)
- [ミックスネットとは何か？ VPNによる比類なきオンラインプライバシー](https://note.com/koko_crypto/n/n302e7516f691?magazine_key=m0129d65e3526)
- [Sphinx暗号-Nymを支える匿名データフォーマット](https://qiita.com/pseudonym2/items/107cf005e9cab0b165b6)
- [ココナッツ認証（Coconut Credentials）とは？- プライバシーを保護するゼロ知識証明技術](https://qiita.com/pseudonym2/items/b2739ae32f4fb29de0b6)

# コミュニティ

- [Nym日本コミュニティ - Telegram](https://t.me/nymjapanese)
- [Nym日本コミュニティ - Discord](https://discord.com/invite/nym)
- [Nym日本コミュニティ - LINEオープンチャット](https://line.me/ti/g2/0YGYYq4EoQZ8fL5FYQmqU4O9SRuE_a6YX19GtA?utm_source=invitation&utm_medium=link_copy&utm_campaign=default)
- [Nym 公式LINE(現在非稼働)](https://line.me/R/ti/p/@986ytsdx?from=page&accountId=986ytsdx)
- [Nymプロジェクト日本語アカウント - X](https://x.com/nymproject_jp)
NeuroEvoBench: Benchmarking Evolutionary Optimizers for Deep Learning Applications

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/7b3c2a12-773d-71b0-4f6c-e9ff20f1e04b.png)

ディープラーニングでは、勾配降下法以外の最適化手法として、進化型最適化(EO: Evolutionary Optimizers)が注目されている。EOは、長期的なメタラーニングや非微分可能演算子の最適化など、従来は最適化が困難だった課題への適用に有効とされている。
この論文では、ディープラーニングに特化したEOベンチマーク(NEB)を構築しており、包括的な評価ができるようにしている。

*メタラーニング：学習アルゴリズム自体を学習させる手法
 非微分可能演算子：微分ができれば勾配降下法が適用できるが、微分が定義できない関数や操作を示す

---

# 2. 新規性
ディープラーニングに特化したEOのベンチマークを初めて公開している。リソース割り当てや適合度関数調整、正規化、正則化、スケーラビリティなど、ディープラーニングをする上で重要なタスクを網羅している。(Apatch-2.0ライセンス下でオープンソース化)

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dc46bc76-c101-b18f-c74c-fd15d9583df0.png)

NEB(NeuroEvoBench)ベンチマークの設計
　・ ディープラーニングにおける代表的なタスクを網羅　　
　　　BBO/Control/Vision/Sequenceの4種類のタスクに対応している。
　・ 複数のEOと評価指標を採択
　　　異なるタイプの最適化問題として、3つのEOから選択が可能となっている。
　・ 計算効率とスケーラビリティを考慮
　　　実験タイプではランダムサーチによるチューニングプロトコルが組み込まれており、コストに応じてDefault/Small/Medium/Largeを設定することが可能となっている。進化アルゴリズムの実行時間や計算資源に制限をかけるパラメータとなっている。


---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/782267ec-f746-a473-d9dc-e85d2a3f6d72.png)

図は9つのNeuro Evolutionタスクに対して9種類のEOアルゴリズムを示しており、5回の試行で平均化されており中央値のパフォーマンスが高いものが右側に来ている。一般的に用いられる遺伝的アルゴリズム(GA: Genetic Algorithm)は戦略進化(ES: Evolution Strategy)よりもパフォーマンスが低くなっていることから、ESの方がより効果的な最適化手法であることが示唆されている。メタラーニングを取り入れたEOアルゴリズムは、従来のEOアルゴリズムよりも優れた性能を発揮することが示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5caf6edc-d876-591f-56d4-2a8eaba1db09.png)

ニューラルネットワークの重みの更新をEOで評価できるようにしている。

---

Paper URL: <https://openreview.net/forum?id=s6qtLyR6uJ>

last updates: May. 17 2024