OmniAICreator/Qiita-1.07M huggingface dataset:
spyder-notebookでplotlyを使う

# 結論
Spyder側で
設定→アプリケーション→詳細設定→レンダリングエンジン→Desktop

に設定し、
```python
import plotly.io as pio
pio.renderers.default = 'iframe'
```
を実行することでうまく表示できました。以下サンプルです。
```python
import plotly.graph_objects as go
import plotly.io as pio
import numpy as np

pio.renderers.default = 'png'

fig = go.Figure(data=[go.Scatter3d(
    x=np.random.rand(20),
    y=np.random.rand(20),
    z=np.random.rand(20),
    mode='markers',     
    marker={'size':5, 'color':'blue', 'symbol':'circle'}
), ])

fig.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514045/4d773df3-dafd-41d3-5b0a-47544ade26b2.png)


# 補足
3次元plot（等、恐らくWebGLが必要なもの？）が不要であれば、
```python
print(pio.renderers.default)
```
```
Renderers configuration
-----------------------
    Default renderer: 'iframe'
    Available renderers:
        ['plotly_mimetype', 'jupyterlab', 'nteract', 'vscode',
         'notebook', 'notebook_connected', 'kaggle', 'azure', 'colab',
         'cocalc', 'databricks', 'json', 'png', 'jpeg', 'jpg', 'svg',
         'pdf', 'browser', 'firefox', 'chrome', 'chromium', 'iframe',
         'iframe_connected', 'sphinx_gallery', 'sphinx_gallery_png']
```
を色々変えれば表示されることが多いです。

# 追記
グラフのsvg表示や保存がうまくいかないこともある。環境によってはkaleidoを入れてもうまく動かないので、その場合はorcaを入れる。（requestsも必要。）
PythonをVSCode上でセル実行している場合のフラグ

# はじめに
Pythonコードを記述する際に、Jupyter Notebookのようなセル単位での実行が可能な環境は非常に便利です。
Visual Studio Code(VSCode)も、この[セル実行機能](https://code.visualstudio.com/docs/python/jupyter-support-py)を利用でき､```#%%```をコードの頭につけるだけで```hoge.py```ファイルのままソース管理とセル実行を両立させることができます｡
一方でVSCodeから実行する場合は､```if __name__ == '__main__'```ではスクリプトとして実行する場合特別がつきません｡

# 結論
これで区別できる
```python:sample.py
import sys

if "ipykernel_launcher.py" in sys.argv[0]:
    print("VSCodeのセルから実行されています")
else:
    print("シェルなどから実行されています")
```

# なぜこれでわかるのか
sys.argv[0]にはスクリプトの実行時にはスクリプト自身のファイル名が格納されます｡
コマンドラインから実行した場合は```sample.py```が格納されますが
セル実行の場合、このファイル名が```ipykernel_launcher.py```になります。
(```ipykernel```は、Jupyter 用の IPython カーネルを提供するパッケージ)

# 何が嬉しいのか
* セル実行とスクリプトとしての実行を区別できるのでセル実行時だけデバック出力を行う､可視化結果を出力する等が可能になる｡
Karabiner-Elementsでwindows-likeとemacs-likeの2つのキーバインドを使い分ける 2025年版


MacのKarabiner-Elementsでwindows-likeとemacs-likeの2つのキーバインドを使い分けるにはどうするのかに関するメモ。

やりたいこと：普段のWEBブラウザ等ではwindows-likeなキーバインド（Ctrl-c,Ctrl-vでコピーペーストCtrl-fで検索）を使い、terminalやEmacsではそのキーバインドをやめたい（Ctrl-w,Ctrl-yでコピーペースト、Ctrl-sで検索）。

[2020年に同じことを書いた](https://qiita.com/takiwaki_tomoya/items/3c6168cf7b63a4c48720)がKarabiner-Elementsが更新されていろいろ使いやすくなっているので更新する。

## 手順1: Karabiner-Elementsをインストールする
Karabiner-Elementsをインストールする。
https://karabiner-elements.pqrs.org/
上記のURLからダウンロードしてくる。本記事執筆時点ではversion 15.3.0である。


## 手順2: Karabiner-Elementsの使い方を理解する
まず、Karabiner-Elementsを起動してComplex modificationsタブを選択する。

次にAdd predefined ruleボタンを押したのちWindows shortcuts on macOSを検索しとりこむ。

![スクリーンショット 2025-01-14 20.51.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669744/40df38c1-3056-857c-116a-cfcef26c9306.png)

これでルール集を取り込めるが、まだそのルール集の中のどのルールを実際に使うのかを決めていない。実際に使うルールをEnableする。例えばCtrl+C, Ctrl+P, Ctrl+X => Cmd+C (Copy), Cmd+v (Paste), Cmd+X (Cut)をEnableにするとその瞬間からばCtrl+CがCmd+Cに変換されて、ブラウザ等のテキストがコピーできるようになる。まずはそこまで確認すること。

そして、この設定でEmacsを開いて編集しようとするとおかしなことになることに気づくはず。例えばCtrl-x Ctrl-fでファイルを開こうとすると最初のCtrl-xがCmd-xに変換されてしまうのでうまく開けなくなる。

## 手順3: アプリケーションごとにキーバインドを変えるためルールを編集する

この操作[2020年版](https://qiita.com/takiwaki_tomoya/items/3c6168cf7b63a4c48720)より簡単になっている。上記のルールでEditを押すと詳細が編集できる。Windows shortcuts on macOSにはこのショートカットを適用しないアプリがあらかじめ書いてあるのでそこに必要なアプリを追加する。設定をよくみると以下のような箇所が見つかるはずである。このconditionsの中の"bundle_identifiers"に書かれているアプリではこのショートカットは適用されない。
~~~json
            "conditions": [
                {
                    "bundle_identifiers": [
                        "^org\\.gnu\\.Emacs$",
                        "^com\\.apple\\.Terminal$",
                        "^com\\.utmapp\\.UTM$",
                        "^com\\.microsoft\\.rdc$"
                                            ],
                    "type": "frontmost_application_unless"      
                }
            ],
~~~

アプリケーションのBundle Identifierを調べるには、Karabiner-Elementsをインストールしたときに同時にインストールされるKarabiner-EventViewerを使用する。このアプリケーションを起動し、Frontmost applicationタブを選べばクリックしたアプリケーションのBundle Identifierを教えてくれる。
![スクリーンショット 2025-01-14 21.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669744/2a4d36b2-f737-e8ef-9c8d-0371c3084bc2.png)

2020年版に比べて極めて簡単になっているのがわかると思う。
Homebrew製アプリをAlfred5から起動する方法

多くのMacユーザーが慣れ親しんでいるコマンドランチャーのAlfredですが、Homebrewとの相性が悪くて毎回悩んでいませんか？筆者はHomebrewでインストールしたEmacsをAlfredから使う方法について何度もググっているので、いい加減まとめてみました。

## 前提：Alfred5について

筆者は長年MacのApp StoreアプリからAlfredをインストールしていたのですが、App Store経由でインストールされるAlfredはバージョン1.2（2012年リリース！）です。化石です。

2025年現在、最新のAlfredはバージョン5.5です。[Alfred公式サイト](https://www.alfredapp.com/)から直接ダウンロードしましょう。

## 手順1: Homebrew製アプリのインストール

まずお好きなHomebrew製アプリをインストールしましょう。Emacsの場合なら以下のようにインストールします。

```
$ brew tap railwaycat/emacsmacport
$ brew install emacs-mac
```

## 手順2: macOSエイリアスの作成

/Applications 以下に今インストールしたappのエイリアスを作ります。これはシンボリックリンクとは別の機能で、macOSネイティブの仕組みのようです。

ターミナルから下記のようにコマンドを打ちます。（別のアプリを使う場合はよしなに変更してください）

```
osascript -e "tell application \"Finder\" to make alias file to POSIX file \"$(brew --prefix emacs-mac)/Emacs.app\" at POSIX file \"/Applications\""
```

ダイアログが出るので「許可」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/0b4b4385-a770-1273-8006-18ca0db52b37.png)

## 手順3: Alfredの設定
1. Alfredの設定画面を開く
    - AlfredのPreferencesを開き、Features > Default Resultsに移動
2. エイリアスを検索対象に追加
    - ExtrasのAdvancedをクリックし、ポップアップウィンドウでファイルタイプの追加
    - Finderの/Applicationsウィンドウからエイリアスをドラッグしてポップアップウィンドウに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/215e0acd-53c3-c62c-5d6b-2b643f2514e8.png)

## 動作確認

Alfredで「emacs」を検索し、先ほど作ったエイリアスが表示されるか確認します。

## 注意点

これをやると全てのエイリアスがAlfredの検索対象になってしまいます。特に困らないと思いますが。
1000行でOSを作ってみよう

# 1000行未満のコードでOSを自作する方法を解説する日本語サイトが公開中

https://seiya.me/blog/operating-system-in-1000-lines

https://operating-system-in-1000-lines.vercel.app/ja/

## 絶好の機会をもらった
AndroidでAGP(Android Gradle Plugin)を8.xに更新したときに修正したこと 〜BuildConfigとRクラスの変更点〜

Android Gradle Plugin (AGP) を7から8へアップデートした際に、`BuildConfig` と `R` クラスの生成に関する変更点により、ビルドエラーが発生しました。その時のメモを備忘録として書いておきます。

AGP8のリリースノートは以下にあります。
https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes

このサイトに記載されている「互換性のない変更」のうち、手元の環境では`android.defaults.buildfeatures.buildconfig` と `android.nonTransitiveRClass` が該当していました。

## 1. BuildConfigのデフォルト生成が停止

### 問題点

AGP8では、`BuildConfig` クラスがデフォルトで生成されなくなりました。そのため、以下のように `BuildConfig.DEBUG` を使ってデバッグ時のみ特定の処理を実行していたコードがコンパイルエラーとなります。

```kotlin
if (BuildConfig.DEBUG) {
    // デバッグ時のみの処理
    Log.d("MyApp", "Debug mode");
}
```

エラーメッセージ例:
```
error: cannot find symbol
if (BuildConfig.DEBUG) {
    ^
  symbol:   variable DEBUG
  location: class BuildConfig
```


### (解決策1) 個別モジュールごとに buildConfig を有効化
各モジュールの build.gradle.kts (または build.gradle) ファイルで、buildFeatures 内の buildConfig を true に設定します。


```kotlin:app/build.gradle
android {
    buildFeatures {
        buildConfig = true
    }
}
```

この方法では、必要なモジュールのみで BuildConfig を生成できるため、ビルド時間の増加を最小限に抑えられます。

### (解決策2) gradle.properties で設定 (非推奨)
プロジェクトルートの gradle.properties ファイルに以下の行を追加することで、全てのモジュールで BuildConfig を生成できます。

```gradle:gradle.properties
android.defaults.buildfeatures.buildconfig=true
```

この方法は非推奨であり、以下の通りAGP9で削除される予定なので、暫定対応として対応しておきます。

```
The option setting 'android.defaults.buildfeatures.buildconfig=true' is deprecated.
The current default is 'false'.
It will be removed in version 9.0 of the Android Gradle plugin.
You can resolve this warning in Android Studio via Refactor > Migrate BuildConfig to Gradle Build Files
```


## 2. Rクラスの生成範囲の変更
### 問題点
AGP8では、デフォルトで現在のモジュールで定義されたリソースのRクラスのみが作成されるようになりました。つまり、マルチモジュール構成で、他のモジュールで定義されたリソースを Rクラス経由で参照できなくなりました。

例えば、feature モジュールから common モジュールで定義された文字列リソースを参照しようとすると、以下のようなコンパイルエラーが発生します。

```kotlin:Foo.kt
// featureモジュールのコード
getString(R.string.foo) // commonモジュールで定義された文字列リソース
```

```
error: cannot find symbol
getString(R.string.foo)
             ^
  symbol:   variable string
  location: class R
```

### (解決策1) リソースの完全修飾名で参照
参照したいリソースが定義されているモジュールのパッケージ名を明示的に指定します。

```kotlin:Foo.kt
// featureモジュールからcommonモジュールのRを参照
getString(com.example.common.R.string.foo)
```
この方法であれば、ビルド時間に影響を与えることなく問題を解決できます。しかし、すべてのリソース参照を完全修飾名に変更する必要があるため、修正コストが大きくなる可能性があります。

### (解決策2) gradle.properties で設定 (ビルド時間増加)
gradle.properties ファイルに以下の行を追加することで、以前の挙動（全てのモジュールのリソースを参照できる R クラスを生成）に戻すことができます。

```gradle:gradle.properties
android.nonTransitiveRClass=false
```
ただし、この方法はビルド時間が増加するデメリットがあります。特に大規模なプロジェクトでは、ビルド時間の増加が顕著になる可能性がありますが、手元のプロジェクトではこちらの方法を採用しました。
コマンドラインで翻訳するやつ Windows WSL2 Linux Shell

# 概要

 <img src="https://img.shields.io/badge/OS -Windows11-blue">
 <img src="https://img.shields.io/badge/WSL -2-yellow">
 <img src="https://img.shields.io/badge/distribution-RHEL Oracle Linux 8.7-red">

コマンド（sh実行）で翻訳を可能にする（Shellはbashを使用）
OSはWindows（WSL2 OracleLinux）
日本語と英語、引数を自動判定して相互翻訳したい

# インストール
まず`trans`コマンドを使えるようにします
```zsh:wgetでDirect_Download
wget git.io/trans
chmod +x ./trans
mv ./trans $HOME/.local/bin
```

`.bashrc` にPATH（`$HOME/.local/bin`）を記載
※記載済みならここは飛ばす
```zsh:.bashrc
 PATH="$HOME/.local/bin:$HOME/bin:$PATH"


 PATH="省略..
```
```zsh:.bashrcを再読み込みして反映
source ~/.bashrc
```
`trans`コマンドが使えればおｋ
```zsh:動作確認
trans
```
# スクリプトサンプル
```zsh:translate.sh
#!/bin/bash

# 文字列が日本語文字を含むかチェックする関数
has_japanese() {
    local text="$1"
    # Unicode範囲で日本語文字（ひらがな、カタカナ、漢字）をチェック
    echo "$text" | grep -q '[ぁ-んァ-ン一-龥]'
    return $?
}

# 文字列が英語のみで構成されているかチェックする関数
is_english_only() {
    local text="$1"
    # 英字のみ（空白を除く）かチェック
    echo "$text" | grep -q '^[A-Za-z[:space:]]*$'
    return $?
}

# 言語を判定する関数
detect_language() {
    local text="$1"
    
    # 空文字チェック
    if [ -z "$text" ]; then
        echo "void?"
        return
    fi
    
    # 日本語文字が含まれているかチェック
    if has_japanese "$text"; then
        trans ja:en "$text" # echo "japanese"
    else
        # 日本語文字を含まない場合は英語として判定
        if is_english_only "$text"; then
            trans en:ja "$text" # echo "english"
        else
            # その他の文字（記号など）が含まれる場合も英語として判定
            trans en:ja "$text" # echo "english"
        fi
    fi
}

# 出力内容
output() {
    local result="$1"
    echo -e "\n$result\n"
    echo "---------------------------"
    return $?
}

# メイン処理
if [ "$#" -eq 0 ]; then
    # 引数がない場合は対話モード
    while true; do
        echo -n "翻訳したい文字列を入力してください（終了はCtrl+C）: "
        read -r input
        result=$(detect_language "$input")
        output "$result"
    done
else
    # 引数がある場合はその文字列を判定
    full_text="$*"
    result=$(detect_language "$full_text")
    output "$result"
fi
```

# 使い方
引数に翻訳したい言葉を指定
```zsh:単語
# 英→日
translate.sh english

# 日→英
translate.sh 日本語
```
```zsh:文章もいける
translate.sh Are you mad?

translate.sh おこなの？ 激おこ？
```
なお翻訳精度は google翻訳レベルなのであしからず。。

# 参考

https://www.soimort.org/translate-shell/#installation

https://qiita.com/ntkgcj/items/42244265e132bbf7c931
ブランチを切り替えずに git rebase する

今まで分岐元のブランチを最新にしたい際はわざわざ作業中のブランチから切り替えていた。

分岐元のブランチ = `develop`, 作業中のブランチを `feature/XXX` とすると下記のような形だ。

```
$ git checkout develop 
$ git pull
$ git checkout feature/XXX
$ git rebase develop
```

わざわざこんなことをしなくても

```
$ git pull --rebase origin/develop
```

とすることでブランチを切り替えずに最新の状態に rebase することができる
Gitでサブモジュールを履歴を保持したまま親リポジトリに取り込む方法

# 初めに

みなさんはサブモジュールをご存知でしょうか？
Gitでプロジェクトを管理している場合、基本的には1つのリポジトリ内で全てを管理するケースが一般的です。しかし、オープンソースソフトウェア（OSS）や外部のライブラリを利用する場合、特定のディレクトリを別のリポジトリとして切り離して管理する「サブモジュール」という機能を活用することがあります。

サブモジュールを利用すると、外部プロジェクトの依存関係を管理しやすくなる一方で、運用や統合の際にいくつかの課題が発生することもあります。例えば、複数のリポジトリを扱うことで管理が煩雑になり、コンフリクトが発生しやすいといった問題が挙げられます。

この記事では、サブモジュールを利用していたが後ほど辞めたいと行った場合に「**サブモジュールを履歴を保持したまま親リポジトリに統合する**」 方法の具体的な手順を説明します。

それでは、手順を詳しく見ていきましょう。

## 実行手順
### 1. サブモジュールの削除
まず、既存のサブモジュールを削除します。以下のコマンドを順に実行します。

```
git submodule deinit -f <サブモジュール名>
git rm -f <サブモジュール名>
rm -rf .git/modules/<サブモジュール名>
```
例: サブモジュールが submodule_repo という名前の場合
```
git submodule deinit -f submodule_repo
git rm -f submodule_repo
rm -rf .git/modules/submodule_repo
```
これにより、サブモジュールの設定がリポジトリから完全に削除されます。

### 2. サブモジュールのリモートリポジトリを親リポジトリに追加
次に、サブモジュールのリモートリポジトリを親リポジトリにリモートとして追加します。

```
git remote add <リモート名> <サブモジュールのリポジトリURL>
git fetch <リモート名>
```

例:サブモジュールが submodule_repo という名前の場合
```
git remote add submodule_repo_remote git@github.com:example-org/submodule_repo.git
git fetch submodule_repo_remote
```
### 3. サブモジュールで取り込みたいブランチをチェックアウト
親リポジトリ内で、サブモジュールで取り込みたいブランチに一時的に切り替えます。

```
git switch --track <リモート名>/<ブランチ名>
```
例:サブモジュールが submodule_repo という名前の場合
```
git switch --track submodule_repo_remote/feature-branch
```

### 4. 親リポジトリのマージ対象ブランチに切り替える
マージを行う親リポジトリのブランチに切り替えます。適切なブランチに切り替えてください。
```
git switch <親リポジトリのブランチ名>
```
### 5. サブモジュールの内容を親リポジトリにマージする
以下の手順でマージを実行します。

ブランチ間の関係がないため、特殊なマージオプションを使用します。
```
git merge --strategy=ours --no-commit --allow-unrelated-histories <サブモジュールブランチ名>
```
サブモジュールの内容を親リポジトリに展開します。

```
git read-tree --prefix=<サブモジュールディレクトリ名>/ -u <サブモジュールブランチ名>
```
最後にコミットを作成します。

```
git commit -m "サブモジュールを親リポジトリに取り込み"
```

例:
```
git merge --strategy=ours --no-commit --allow-unrelated-histories feature-branch
git read-tree --prefix=submodule_repo/ -u feature-branch
git commit -m "サブモジュールを親リポジトリに取り込み"
```
これで、サブモジュールが親リポジトリに統合され、履歴が保持された状態で取り込みが完了します。

## 最後に

いかがでしたでしょうか？
あまり似たような状況の方はいないと思いますが、備忘録として記しておきます。
これが皆様の助けになれば幸いです。

### 参考資料
https://stackoverflow.com/questions/23327701/git-merge-submodule-into-parent-tree-cleanly-and-preserving-commit-history
材料力学「材料力学で、積分の1/6公式を使いますか。」をAI先生に聞きました。

**材料力学で、積分の1/6公式を使いますか。**

# ChatGPT先生へ
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。

>(回答抜粋)
1.梁のせん断力・曲げモーメント分布の解析...
2.応力集中の解析...
3.断面2次モーメントの計算

梁のせん断力・曲げモーメント分布の解析について、　sympyのソースコードを教えて下さい。
```python
from sympy import symbols, integrate, Piecewise

# 定義
x, L, w = symbols('x L w')

# せん断力 V(x)
V_x = integrate(-w, x) + symbols('C1')  # 積分定数 C1 を追加
V_x = V_x.subs(symbols('C1'), w * L / 2)  # せん断力の境界条件で C1 を決定

# 曲げモーメント M(x)
M_x = integrate(V_x, x) + symbols('C2')  # 積分定数 C2 を追加
M_x = M_x.subs(symbols('C2'), 0)  # 曲げモーメントの境界条件 (左端 M(0) = 0) で C2 を決定

# 出力
print("せん断力 V(x):", V_x)
print("曲げモーメント M(x):", M_x)
```
どの部分が1/6公式ですか。
```python
from sympy import symbols, integrate, simplify

# 定義
x, L, w = symbols('x L w')  # x: 梁の位置, L: 梁の長さ, w: 荷重の最大値

# 荷重分布 q(x): 三角形分布 (x=0で最大 w, x=Lで0)
q_x = w * (1 - x / L)

# せん断力 V(x) を計算
V_x = integrate(-q_x, x) + symbols('C1')  # 積分定数 C1 を含む
V_x = V_x.subs(symbols('C1'), w * L / 2)  # 境界条件を適用 (せん断力の釣り合い)

# 曲げモーメント M(x) を計算
M_x = integrate(V_x, x) + symbols('C2')  # 積分定数 C2 を含む
M_x = M_x.subs(symbols('C2'), 0)  # 境界条件を適用 (M(0) = 0)

# 確認
print("せん断力 V(x):", simplify(V_x))
print("曲げモーメント M(x):", simplify(M_x))
```
>(回答抜粋)
1/6公式の適用箇所
1.三角形荷重のせん断力...
2.曲げモーメントの計算での係数...


# Gemini先生へ

# copilot先生へ

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

#### wikipedia 

＞他言語版はまだありません。追加しますか？
日本だけかも。

https://ja.wikipedia.org/wiki/1/6%E5%85%AC%E5%BC%8F

#### 過去問
2022　大阪大学　前期MathJax ＞ 大学入試数学問題集成 様

https://mathexamtest.web.fc2.com/2022/202210561/2022105610100mj.html#top-0103

#### Google検索

https://www.google.com/search?q=1%2F6%E5%85%AC%E5%BC%8F&rlz=1CAUHAM_enJP1105&oq=1%2F6%E5%85%AC%E5%BC%8F&gs_lcrp=EgZjaHJvbWUyCQgAEEUYORiABDIHCAEQABiABDIHCAIQABiABDIHCAMQABiABDIHCAQQABiABDIHCAUQABiABDIHCAYQABiABDIGCAcQRRg90gEINzA5M2owajeoAgiwAgE&sourceid=chrome&ie=UTF-8
Salesforceでフローを作成しよう～Salesforceユーザー作成時に自動的に任意のChatterグループにユーザー追加する方法

本橋孝昭です。

今回はSalesforceでユーザー作成時に自動的に任意のChatterグループにユーザー追加するフローの作成方法について解説します

なお、今回の内容はこちらの記事を参考にしてます

https://automationchampion.com/2020/12/02/automatically-add-new-user-to-chatter-group/


##  前準備1 カスタム表示ラベルを作成し自動的に追加したいChatterグループのIDを追加しましょう


まずはChaterグループIDを調べます
Chatterグループを表示させた後URLの0Fから始まるものがChatterグループIDです

例えば下記画像のようなURLが出た場合IDは
0F9GA000000FJxV0AW
です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/af7c1d96-407c-9bd2-51a5-126dbba058a8.png)

そのあとカスタム表示ラベルを作成し調査したIDを記載します


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/acc252a3-3af3-477b-4a3f-8e1f3c507247.png)


これで準備は完了です　次にフロー作成をします

## ステップ2 フローを作成しよう


作成するフローの内容をスクリーンショットで示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c5108e59-cdd4-18ab-e2a0-ca133a497de9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f2f9f937-47cd-b781-b17d-796873d48e5b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dbd56fb6-d8f2-28cf-7cd3-1918239f346b.png)

なお、ここの「グループメンバー」は
「CollaborationGroupMember」のグループメンバーです
（※同じグループメンバーでも「CollaborationGroupMember」とは異なるオブジェクトでもグループメンバーがあるのでご注意ください）（※私はここで引っかかりました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c56e1afd-0e48-a27e-cfb0-469122fee8e1.png)


こちら
CollaborationGroupId
は最初に作成したカスタム表示ラベルを使用します

MemberId
は{!$Record.Id}
とします


以上でフローの作成は完了です


あとはユーザーを作成して少し待てば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6693593e-9835-bb71-2bc9-dc988c529175.png)

作成したユーザーがChatterグループに追加されていることが分かります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a5e1d52d-50ba-6148-9625-30338827bb92.png)


なお、ユーザー作成からChatterグループ追加まで若干（1～2分）ほど待たないと反映されないかもしれないです

フローがいつ動くか確認したい場合「時間ベースのワークフロー」を確認しましょう


このようにユーザー作成後フローが表示されれば、もうすぐフローが実行する　という意味ですので少し待ちましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/51c1b71e-3bf7-0abc-e98f-0a6e6f7d3e58.png)



もしもフローが動けばこのように時間ベースのワークフローから削除されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0f07711c-005c-1448-8ebf-2a85b2f5af55.png)
材料力学「梁解析の応力法とたわみ角法の違いを、sympyのソースコードで教えて下さい。」をAI先生に聞きました。


**梁解析の応力法とたわみ角法の違いを、sympyのソースコードで教えて下さい。**

# ChatGPT先生へ
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。

>(回答抜粋)
1. 応力法の例:
```python
from sympy import symbols, Eq, solve

# 変数定義
M1, M2, L, P = symbols('M1 M2 L P')  # モーメント, 長さ, 荷重

# 平衡式 (例: 二端固定梁)
eq1 = Eq(M1 + M2 - P * L, 0)  # モーメントの平衡
eq2 = Eq(2 * M1 - M2, 0)      # たわみ条件 (例)

# 方程式を解く
solution = solve([eq1, eq2], [M1, M2])
print("応力法の解:", solution)
```
2. たわみ角法の例:
```python
from sympy import symbols, integrate, Function

# 変数定義
x, L, E, I, P = symbols('x L E I P')  # 座標, 長さ, ヤング率, 断面2次モーメント, 荷重
v = Function('v')(x)  # たわみ

# 微分方程式 (例: 単純梁中央荷重の場合)
M = P * x * (L - x) / L  # 曲げモーメント
diff_eq = Eq(E * I * v.diff(x, x), -M)

# たわみを解く
v_solution = integrate(integrate(-M / (E * I), x), x)  # 2回積分
print("たわみ角法の解:", v_solution)
```
実行結果も教えて下さい。
1. 応力法の解:
```
{M1: L*P/3, M2: 2*L*P/3}
```
2. たわみ角法の解:
```
-P*x**3/(6*E*I) + P*x**4/(12*E*I*L)
```
上記のそれぞれをsympyの行列の積の表現でお願いします。
1. 応力法の行列積形式
```python
Matrix([
    [1, 1],       # 平衡式の係数行列
    [2, -1]       # たわみ条件の係数行列
]) * Matrix([
    [M1],         # モーメント M1
    [M2]          # モーメント M2
]) = Matrix([
    [P * L],      # 荷重のモーメント影響
    [0]           # たわみ条件の右辺
])
```
2. たわみ角法の行列積形式
```python
Matrix([
    [1]           # 単位行列を用いてスカラーを表現
]) * integrate(integrate(
    -P * x * (L - x) / L / (E * I), x), x)
```
```
Matrix([
    [-P*x**3/(6*E*I) + P*x**4/(12*E*I*L)]
])
```
# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境
# いつもと違うおすすめです。
[Laravel]データベースからデータを取得してページに表示しよう！

# はじめに
laravelでデータベースからデータを取得してページに表示する方法を簡単に実装します。


# 実装
### データベースの情報
⇩のようなFruitsというテーブルから「price」が「150」以下のデータを取得して表示したいと思います。
![スクリーンショット 2025-01-14 7.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984124/da459489-99a3-1489-5981-081a61a0c941.png)


### コントローラーの作成
ターミナルで以下のコマンドを実行し、コントローラーを作成します。
```
php artisan make:controller FruitController
```

Fruitsテーブルの中で「price」が「150以下」のデータを選択して、取得し $fruits に格納します。
取得したデータをcompact()関数に渡し、indexビューをページに表示します。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;

class FruitController extends Controller
{
    public function index()
    {
        $fruits = DB::table('fruits')
            ->where('price', '<=', 150)
            ->get();
        return view('index', compact('fruits'));
    }
}
```

### ビューの作成
resources/views/フォルダの中に「index.blade.php」というファイルを作成し、以下のように編集します。
```php
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Laravel</title>
</head>

<body>
    <p>値段が150円以下のものを表示します。</p>
    @foreach ($fruits as $fruit)
        <p>{{ $fruit->name }}</p>
    @endforeach
</body>

</html>
```

### ルートの設定→
/fruitsというURLにアクセスした時、先ほど作成したFruitControllerの「index」アクションが実行されるようにします。
routes/web.phpファイルを以下のように編集します。

```php
use App\Http\Controllers\FruitController;

Route::get('/fruits', [FruitController::class, 'index']);

```

### ページの確認
/fruitsにアクセスし、ページを確認します。
![スクリーンショット 2025-01-14 8.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984124/de8dbebb-e362-5e76-d1f2-f810e7414d30.png)

# さいごに
いかがだったでしょうか？
データベースの情報を取得して、ページに表示するために最低限必要なコードのイメージがつかめればと思います！
JetBrains社IDE【統合開発環境】でデータベースに接続してみる

## はじめに
皆様は開発する時のIDE【統合開発環境】は何を使っているでしょうか？
私はPhpStormを初めて使用してからは一貫してJetBrains社の回し者か？
と言う位にJetBrains社IDE【統合開発環境】を使用しています
(恐らく大半はMSのVSCodeだと思います)

## JetBrains社IDE【統合開発環境】の良いところ
今回の主題となるデータベースクライアント機能を紹介したいと思います

## 環境
環境は以下の通り(今回はPhpStormを使用します)
MySQL：8.0.25
PhpStorm：[PhpStorm 2024.3.1.1](https://www.jetbrains.com/ja-jp/phpstorm/)
OS：Windows10

## 接続設定
1. データソースのアイコン(①)をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/1c1e7aaf-1c20-8d7e-695f-8ae1eb1168a0.png)

1. 今回はWindowsにインストール済のMySQLに接続するため以下の様な設定です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/5be368f1-2f95-44e0-e55c-88ed135ee57e.png)
1. 実際に接続してみましょう。namesテーブルをダブルクリック(①)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/39deac17-8c71-ac6b-639b-f5793f64c31e.png)
1. テーブルが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/437eb0bd-0702-0059-e726-f11873a900af.png)
1. レコード追加する場合は左上のプラスアイコン(①)をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/28b44223-1b2a-20d2-5079-ef5bed9b8dcd.png)
1. 下記の様な感じでレコード追加する準備が出来ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/87b12186-4dd0-9156-e9ee-3d789f9272b4.png)
1. コミットするため「↑」アイコン(①)を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/28e10d43-d240-4197-7d17-212b76f7509c.png)
1. レコードが追加されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/f64c0c3a-d0d7-1455-88e5-f5481fe3035c.png)

## データベース操作でJetBrains社IDEを使用するメリット
1. SSHトンネリング接続する際に簡単に接続可能(MySQL・PostgreSQLだけでなくOracle・SQL Serverにも対応している)
1. WindowsのSQLクライアントではデータベースクライアントで良いツール([A5:SQL Mk-2](https://a5m2.mmatsubara.com/))もあるのだがMacだと良いツールが殆ど無いため私はJetBrains社IDE一択で使用しています

## データベース操作でJetBrains社IDEを使用するメリット
1. 殆どのIDE(Android Studio除く)で有償となる(殆どの場合にはVSCodeで間に合うとは思うのですが...一度使ってしまうとJetBrains社IDEのトリコになるんですよねー)

## さいごに
有償なIDE【統合開発環境】ではありますが痒いところに手の届く良いIDE【統合開発環境】だと思いますので
気になった方は30日間無料の全機能体験版もありますので試し使ってみるのも良いかも知れません
【コマンドライン　基本操作】

## コマンドラインとは
文字だけでコンピューターを操作すること
ターミナルにコマンドを命令することでコンピューターに指示を与えることができる
コマンドはEnterキーを押すことで実行することができる

### ファイルを作成
**``touch ファイル名``**

### ファイルの中身を表示
**``cat ファイル名``**

### ディレクトリの作成
**`mkdir ディレクトリ名`**

### ディレクトリの移動
**`cd ディレクトリ名`**

### ホームディレクトリに移動
**`cdのみ`**

　※ホームディレクトリとは➡ユーザー起点のディレクトリ

### ルートディレクトリからカレントディレクトリまでのルートを表示
**`pwd `**

### ディレクトリの中身を表示
**`ls`**

### １つ親のディレクトリに移動
**`cd ..`**

### ファイルを移動させる
**`mv 移動させたいファイル名　移動先のディレクトリ名`**

### ファイル名の変更
**`mv 現在のファイル名　新しいファイル名`**

### ファイルのコピー
**`cp コピーするファイル名　新しいファイル名`**

### ディレクトリのコピー
**`cp -r コピーするファイル名　新しいファイル名`**

### ファイルの削除
**`rm 削除するファイル名`**

### ディレクトリの削除
**`rm -r 削除するディレクトリ名`**
新しい技術を効率よく学ぶ！認知特性を活かした知識整理術

# はじめに
新しい技術を学ぶとき、こんな悩みを感じたことはありませんか？

- 情報量が多すぎて頭の中が整理できない
- 自分に合った学習法がわからない
- どこから手をつければいいのか迷う

実は、学び方には「自分に合ったスタイル」があります。本記事では、認知特性を活かして知識を効率的に整理する方法を解説します！


# 認知特性とは
認知特性とは、情報を処理する際に得意なスタイルのことです。主に以下の3つに分けられます。

1. **視覚優位**
   - 見た情報を処理するのが得意なタイプ。
   - 図やイラストを活用すると理解が進みます。

2. **言語優位**
   - 読んだり書いたりすることで頭に入るタイプ。
   - 文章やドキュメントで学ぶのが効果的です。

3. **聴覚優位**
   - 聞いた情報が頭に残りやすいタイプ。
   - 音声解説やディスカッションが有効です。


さらに細かな分類に関しては以下の記事を見てみてください。

https://surala.jp/daysurala/column/hello-world/

# 自分の認知特性を診断してみよう
自分の認知特性を確認してみましょう。以下の質問に当てはまるものが多いスタイルがあなたの強みです。

#### 視覚優位
- 図や表を使うと理解が深まる
- チュートリアル動画を見るのが好き

#### 言語優位
- 本やドキュメントを読み込むのが得意
- 読みながらメモを取るのが好き

#### 聴覚優位
- 音声講座やポッドキャストが役に立つ
- 他人と議論する中で理解が深まる

自分の特性を把握することで、学習法を選ぶ際の参考にできます。

# 認知特性別の学習方法
#### 視覚優位の学習方法
- フローチャートやマインドマップを活用
  - **おすすめツール**: [Lucidchart](https://www.lucidchart.com/)
- 動画チュートリアルを視聴
  - **おすすめプラットフォーム**: YouTube, Udemy

#### 言語優位の学習方法
- 技術書や公式ドキュメントを読み込む
  - **おすすめリソース**: [Qiita](https://qiita.com/), [Zenn](https://zenn.dev/)
- メモを自分の言葉で書き直す
  - **おすすめツール**: [Obsidian](https://obsidian.md/), [Notion](https://www.notion.so/)

#### 聴覚優位の学習方法
- ポッドキャストや音声教材を活用
  - **おすすめプラットフォーム**: [Spotify](https://www.spotify.com/), [Audible](https://www.audible.co.jp/)
- 仲間とディスカッション
  - **活用例**: 社内勉強会やオンラインコミュニティ（例: Slack, Discord）

# 学びを最大化するためのポイント
最後に、学びを最大化するためのポイントをまとめます。

- 自分の認知特性を意識し、それを活かした方法を試す。
- 時には異なるスタイルにも挑戦し、柔軟性を持つ。
- 学んだことは必ずアウトプットし、知識を整理・定着させる。

認知特性を活用することで、学びはもっと楽しく、効率的になります。あなたの学びの一助になれば幸いです！
Misskeyのフォントを変える方法（管理者向け）

## 前置きの前置き
この記事は[note](https://note.com/niisango/n/n40daaef9c636)に投稿した記事の転載になります。

## 前置き
みなさんはMisskeyというものをご存じですか？
Misskeyとは一言で言ってしまえば**オープンソースの**分散型SNSのソフトウェアです。
そのためGitHub[(リンク)](https://github.com/misskey-dev/misskey)にソースコードが公開されており、また、**ライセンスの範囲内で**ソースコードを改変して利用することができます
つまりフォントを変えたいと思ったら変えることができるわけです。

:::note warn
あくまでもライセンス（MisskeyではAGPL）の範囲内でソースコードの改変ができます。
ライセンスの条件から逸脱しないようにしましょう。
:::

## お願い
まず、Windows環境での作業を前提としています。
また、この記事どおりにやってもうまくいかなかった、サーバー環境が壊れたなどの場合でも筆者は責任を負いかねます
なので自己責任でお願いします。

## 下準備
下準備としては

* Gitのインストール
* Misskey本体のフォーク
* パソコンへクローン
* フォントの準備

をしておきましょう。
なお、Gitのインストールとフォークとクローンに関してはそこまで難しくないので、ここでは省略させていただきます。

### フォントの準備
フォントを変えるといってもそもそもファイルがないといけないので、変更したいフォントのファイルを準備しておきます。

:::note alert
ライセンスによっては、改変や再配布がNGというものがあるので、そのようなフォントは利用しないようにしましょう。。
:::

ここではKoruriフォント[(GitHub)](https://github.com/koruri/koruri)を例に挙げて解説していきます。
まず、フォントをダウンロードします。
リリースページを開き、最新のリリースのアセットをダウンロードします。
![Githubのリリース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494879/fdb9a23b-08fe-9914-4ae5-8544c792a211.png)

そのあと空のフォルダを作成し、そこにコピーしましょう。（アーカイブソフトの展開でディレクトリ作成でも可、ここではKoruriフォルダを作成し、そこにコピーしたものとする）
このフォントを利用してもいいのですが、Misskeyを利用する際、フォント分も通信が発生してくるので、やる気があるならWebフォント化もしておきましょう。

Webフォント化するにあたっては、武蔵システムさんのWOFFコンバータ[（サイト）](https://opentype.jp/woffconv.htm)を利用するのがそこそこ手軽かと思います。
インストール方法と利用方法は公式サイトの使用方法をご覧ください。

フォントが準備出来たら次はフォントファイルをクローンしたMisskeyに配置していきます。

:::note warn
woffファイルとwoff2ファイルは使うので削除しないようにしましょう。
ttfは筆者の環境ではなくても動作していますので、自己判断でお願いします。（訂正があればコメントで）
:::

フォントファイルの配置
大それたことを書いていますが、（クローンしたディレクトリ）\packages\frontend\assetsにフォントをフォルダごとコピーするだけです。

:::note
クローンしたディレクトリをC:\Users\hoge\Misskey、koruriフォルダにフォントがあるとした場合
C:\Users\Hoge\Misskey\packages\frontend\assets\Koruriとなるようにコピーします。
:::

そうすると下のような画像になると思います。

![explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494879/d18fbb0e-5703-687f-d9b2-292a73af2364.png)
![explorer_fonts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494879/4b20251e-cd37-2cd7-4642-897108d27930.png)

ここまできたらscssの改変をするだけです。

## Misskeyのscssファイルの改変
Misskeyでは、cssではなく、scssというファイルが用いられています。
そのため、cssと多少異なることに注意が必要です。

まず、適当なテキストエディタでフォントを置いたassetsフォルダの一つ上のfrontendフォルダにあるsrcフォルダを開き、style.scssファイルを適当なテキストエディタで開きます。
その次に次のコードを用意したファイルにあわせて書き換えてrootセクションの前に追記します。

```HTML:SCSS
@font-face {
  font-family: "Koruri";
  src: url("/assets/koruri/Koruri-Regular.woff2") format("woff2");
	src: url("/assets/koruri/Koruri-Regular.woff") format("woff");
  font-weight: normal;
}

@font-face {
  font-family: "Koruri";
  src: url("/assets/koruri/Koruri-Bold.woff2") format("woff2");
	src: url("/assets/koruri/Koruri-Bold.woff") format("woff");
  font-weight: bold;
}
```

Before

![vscode_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494879/1d40cc7a-336b-8c95-48ef-b8659a912e6b.png)

After

![vscode_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494879/0c3e5064-9e64-bf55-e181-32d0d3d6ae8e.png)

ここまで来たらあとはgit pushをし、正常に変更されたら完成です。

## 最後に
たまにビルドコケるのでその時はしっかり見返してみましょう。
また、ユーザー側で変える方法は自分の知る限りないので誰かあればお願いします。

長文読んでいただき、ありがとうございます。
VSCodeでvenvがdeactivateできない

## 症状

1. VSCode の Terminal で venv を起動
1. `$ deactivate` をしないまま VSCode を閉じる
1. 再度 VSCode を開いた時に，venv が自動で起動されるが `$ deactivate` を受け付けない

## 原因

再起動した VSCode が Terminal から venv を起動するが，正常起動したわけではないため venv を起動する前の環境への戻り値がなく，`$ deactivate` を受け付けない．

**なんか原因はVSCodeのPython拡張機能な気がする**

具体的にはこれ

https://github.com/microsoft/vscode-python/wiki/Activate-Environments-in-Terminal-Using-Environment-Variables



* 参考
  * [venv+VS Codeでプロンプトが変な状態になったときの修復法](https://dev.classmethod.jp/articles/venv-with-vscode-terminal-bug-fix/)

## 解決策

設定の `terminal.integrated.shellIntegration.enabled` を false にする．

> もしくは，
> 
> VS Code の キャッシュや設定ファイルを削除する．
> プロジェクトのファイルの PATH はデフォルト設定やワークスペース設定で異なるが，グローバルな設定ファイルの場所は以下．
> 
> * Windows: `%APPDATA%\Code\User`
> * Mac: `~/Library/Application Support/Code/User`
> * Linux: `~/.config/Code/User`
> 
> これらのフォルダを削除してvenvに関連するキャッシュや設定をリセットします．
> ただし，VS Codeの状態がリセットされるので，どこかにコピーをとってバックアップしておくといいかもしれません．
> 
> * 参考
>   * [How do I get out of a venv in VSCODE? - stackoverflow](https://stackoverflow.com/questions/77445913/how-do-i-get-out-of-a-venv-in-vscode)

## 終わりに

VSCode　を閉じるときは気をつけましょう…．
ExoPlayerで動画が縦方向に圧縮される現象の解決策

ExoPlayerを割り当てる前に、SerfaceViewに固定サイズを割り当ておく。

```kotlin
AndroidView(
    factory = {
        PlayerView(context).apply {
            (videoSurfaceView as? SurfaceView)
                ?.holder
                ?.setFixedSize(720, 1280)
            player = exoPlayer
        }
    },
)
```
Salesforce Hyperforce対応 メールリレー編

# 概要

Hyperforce移行にあたり、「メールリレー」＋「メールサーバーでIPフィルタリング」をしている際の対応方法について説明します。下記資料の③に該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/a11f4613-0a37-f6b0-2b3b-04dabbd356d2.png)

※参考資料：[Hyperforce移行時の注意点](https://res.cloudinary.com/hqvhlyexn/image/upload/v1725422836/GMfAAAA5L1Q/EqgrY8exH0ZZvvr7kNC5dg.png)

# 全体像

#### IPフィルタリングの場合

メールサーバーでSalesforceのIPを許可していて、該当IPからのメールは許可する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/0a072ef4-0192-5a23-4429-33b632ad7a24.png)

#### DKIMでフィルタリングの場合

HyperforceにおいてはIPでのフィルタリングは非推奨のため、代わりに`dkim=pass`されたメールのみを許可する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/b1b94f89-897a-ffbb-3b1c-17758a828e7d.png)

# 前提条件

- `hoge.co.jp`というドメインを仮定とします
- Salesforce Classicで説明します
- DKIMやSFPなどの説明は割愛

# 手順

1. Salesforce組織でDKIM鍵(メール管理 - DKIM鍵)を作成する
    （代替）セレクターは後続のDNSレコード登録用の識別子になりますので、Sandboxを含む複数の組織を管理されている場合は**命名規則を決める**ことをおすすめします。またSalesforceとわかるように`sfdc`を含めることもおすすめします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/fea2cd02-3cf8-8d6c-29d0-2857579add92.png)
1. 表示された**すべてのDNSレコード**をメールサーバーのドメイン(`hoge.co.jpを管理しているDNS`)を管理しているDNSサーバーにCNAMEレコードとして追加します
    追加される＆認識されるまでは「無効」状態↓
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/8a5c189e-f4f7-387c-ffdd-4f717b92a20f.png)
1. 該当組織で前述のDNSレコードが認識されたら、「有効化」ボタンを押下できるようになりますので、有効化してください
1. Salesforceからメール送信して、メールの詳細（ヘッダー）に`dkim=pass`が載るようになります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/7b18ad8c-2625-cf02-48d0-000a266f04ae.png)
1. メールサーバーの受信ルールをIPベースではなく、メールヘッダーベースに変更します
    条件：「ヘッダーに`dkim=pass`が含まれていたら許可」
    ただし、上記のように条件が1つだけだとSalesforce以外からのメールも意図せず許可することになるので、AND条件で`X-SFDC-`から始まるヘッダー情報も合わせてルールに含めて検討してください

# 気になること

Sandboxごとにこの設定をしないといけないのか？
おそらく、Sandbox同期すると本番のDKIM設定が同期されるので別途設定する必要はないと思われます
追って検証できたら更新します
2025年 エンジニア向け大型イベント・カンファレンスまとめ

2025年に開催されるエンジニア向け大型技術イベント・カンファレンスの情報をまとめています。昨年開催され今のとこ詳細未定なイベントは記事下部にまとめています。随時更新したいと思いますが、他におすすめの技術カンファレンス・イベントがあれば編集リクエストください。ストックされた方はイベント追加・更新時に通知がいきます。

# Regional Scrum Gathering Tokyo 2025

会場：御茶ノ水ソラシティカンファレンスセンター（Day1～3）＋オンライン
日程：2025年1月7日～10日
リンク：https://2025.scrumgatheringtokyo.org/

# 東京Ruby会議12

会場：横浜市鶴見区民文化センター サルビアホール
日程：2025年1月18日
リンク：https://regional.rubykaigi.org/tokyo12/
オンライン：なし

# JANOG54 Meeting in Kyoto

会場：京都市勧業館みやこめっせ
日程：2025年1月22日～24日
リンク：https://www.janog.gr.jp/meeting/janog55/
オンライン：なし

# SRE Kaigi 2025

会場：中野セントラルパーク カンファレンス
日程：2025年1月26日
リンク：https://2025.srekaigi.net/
オンライン：なし (アーカイブ動画の公開を予定)

# Developers Summit 2025

会場：ホテル雅叙園東京　〒153-0064 東京都目黒区下目黒1-8-1　2・3F
日程：2025年2月13日～14日
リンク：https://event.shoeisha.jp/devsumi/20250213
オンライン：なし

# Open Source Conference 2025 Tokyo/Spring

会場：ホテル雅叙園東京　〒153-0064 東京都目黒区下目黒1-8-1　2・3F
日程：2025年2月21日～22日
リンク：https://event.ospn.jp/osc2025-spring/
オンライン：なし

# Modern Infra Summit '25 (Google Cloud主催)

会場：Google 渋谷オフィス / オンライン配信
日程：2025年3月6日
リンク：https://cloudonair.withgoogle.com/events/modern-infra-summit-25q1
オンライン：あり

# AI Agent Summit '25 Spring (Google Cloud主催)

会場：ベルサール渋谷ガーデン
日程：2025年3月13日
リンク：https://cloudonair.withgoogle.com/events/gcai-agent-summit-25-spring
オンライン：あり


# NexTech Week 2025 【春展】

会場：ホテル雅叙園東京　〒153-0064 東京都目黒区下目黒1-8-1　2・3F
日程：2025年4月15日～17日
リンク：https://www.nextech-week.jp/hub/ja-jp.html
オンライン：なし

# TSKaigi 2025

会場：ベルサール神田
日程：2025年5月23日〜24日
リンク：https://2025.tskaigi.org/
オンライン：あり（[公式YouTube](https://www.youtube.com/@tskaigi)にてアーカイブ配信あり）

# CloudNative Days Summer 2025

会場：沖縄県市町村自治会館
日程：2025年6月11日～6月13日
リンク：https://event.cloudnativedays.jp/cnds2025
オンライン：あり

# AWS Summit Japan

会場：幕張メッセ
日程：2025年6月25日～6月26日
リンク：https://pages.awscloud.com/summit-japan-2025-interest.html
オンライン：あり

## Interop 25

会場：幕張メッセ
日程：2025年5月23日
リンク：https://www.interop.jp/
オンライン：あり

# SRE NEXT 2025 IN TOKYO

会場：TOC有明
日程：2025年7月11日～2025年7月12日
リンク：https://sre-next.dev/2025/
オンライン：あり

# Google Cloud Next Tokyo

会場：東京ビッグサイト 南展示棟
日程：2025年8月5日～2025年8月6日
リンク：https://www.googlecloudevents.com/next-tokyo/
オンライン：?

# Go Conference 2025

日程：2024年9月に2日間
詳細未定

## PyCon JP

会場：広島国際会議場
日程：2025年9月26日～9月27日
リンク：https://2025.pycon.jp/
オンライン：？

# NexTech Week 2025 【秋展】

会場：幕張メッセ
日程：2025年10月8日～10日
リンク：https://www.nextech-week.jp/hub/ja-jp.html
オンライン：なし



# 昨年開催されたイベント
昨年開催されたイベントで本記事更新時に未定のものをまとめています。見つけ次第更新予定ですが、情報がある方は編集リクエストいただけると助かります。



## Developers Boost

昨年開催日：2024年6月22日

## Platform Engineering Kaigi

昨年開催日：2024年7月9日

## オープンデベロッパーズカンファレンス

昨年開催日：2024年9月7日

## CEATEC

昨年開催日：2024年10月15日～18日

## Vue Fes Japan

昨年開催日：2024年10月19日

## Generative AI Summit Tokyo '24 Fall (Google Cloud 主催)

昨年開催日：2024年10月24日

## アジャイルジャパン

昨年開催日：2024年11月21日～22日

## CloudNative Days Winter

昨年開催日：2024年11月28日～29日

## Internet Week

昨年開催日：2024年11月19日～21日・25日～27日

## ソフトウェアテスト自動化カンファレンス

昨年開催日：2024年12月7日
SAAの勉強会参加記録①

## はじめに
今日からSAAの勉強会に参加
週１で開催予定
３月末までに資格を取りたい。

## 学んだこと
1. ルートテーブルの図表の読み方
ターゲットの中で送信先を探していく。

1. ステートフルとステートレスの違い
   - ステートフル
        発信と応答で１つのセットになっている。
        発信の際に許可したアドレスは、応答でも許容される
        
   - ステートレス
       許可するアドレスを厳密に設定する

1. レイヤーの作用
レイヤー=OSI参照モデル
レイヤーの数字が高いほど、情報量が増えるので複雑性が増す。

1. NATインスタンスに冗長を持たせるとは
同じAZ内にNATインスタンスを設置する
NATインスタンスはAWSが裏でいい感じに冗長性を持たせてくれないので
ユーザーが設定する必要がある
Data Firehoseを使ったログ基盤の構築

# はじめに

こんにちは、2024年12月からGakken Leapにジョインした丹羽です。

ポジションはインフラエンジニアで、今後はインフラの安定化や最適化に取り組んでいきたいと思います。

さて、この記事では入社早々に取り組んだData Firehoseを使ったログ基盤の構築について解説します。

# 構成

構成図を下記に示します。

![log_platform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/5f4e3fad-de03-efdb-e85e-ea16686c30e1.png)

各サービスを動かしているECSサービスからJSONフォーマットでログを送信します。ログの転送量や頻度が今後増加することを考慮してスケーラブルなKinesis DataStreamsでデータを受信し、それからData Firehoseに渡して加工、最終的にJSON LinesファイルとしてS3バケットに格納します。

AWSを活用したログ基盤のリソース構成としてはごく標準的なものだと思います。

以下では、実際に構築していく中でつまずいた点とその解決方法について見ていきます。

# つまずきポイント

## クロスアカウント

構成図で示した通り、ログを送信するECSサービスとログ基盤のAWSアカウントは分かれています。Kinesis DataStreamsはリソースポリシーという自前のアクセス許可機構を持っているので、ここで送信元のECSサービスのタスクロールを許可するのですが、一方タスクロールの方でもDataStreamsへのアクセス許可をIAMポリシーとして明示的に指定してやらなければいけません。

このうち後者の設定が漏れていたので、クロスアカウントでの動作確認に手間取ってしまいました。

## 改行の挿入

最終的にJSON Linesファイルとして保存するためには、DataStreamsに送信するデータに最初から改行コードを含めておく、あるいはFirehoseでLambdaによる前処理を挟んで挿入するなどの工夫が以前は必要だったと記憶していますが、今回の構築では「改行の区切り文字」というオプションを有効にしたところ、すぐ実現できました。

余計な手間をかけないよう、サービスの機能は事前に把握しておくのがいいですね。

## 動的パーティショニング

FirehoseがデータをS3に格納する際、デフォルトではFirehoseで処理された時のタイムスタンプに基づいてパーティションが自動設定されますが、今回はデータ内にあるtimestampプロパティに基づいてパーティショニングしたかったので、動的パーティショニング機能を使うことにしました。

この機能はデータをJSONとしてパース・加工し、取り出した値に基づいてパーティションを決定できるというものです。この値の加工にはjqコマンドのクエリを指定するので、jq力が問われます。

今回、timestampプロパティはISO8601形式だったので、strptime関数で何の苦労もなく文字列に変換できる…と思っていたのですが、なぜかミリ秒が含まれていると変換に失敗します。しばらく悩みましたが、結局ミリ秒の情報は使用しないので変換前に切り捨てることにしました。

```bash
# timestampは "2025-01-01T00:00:00.000Z" のフォーマット
.timestamp | split(".")[0] | strptime("%Y-%m-%dT%H:%M:%S") | strftime("%Y/%m/%d/%H")
```

## CLIでの動作確認

構築後に動作確認をしようとaws-cliからDataStreamsにデータを投げたところ、動的パーティショニングでエラーになりました。どうも送信したデータが文字化けしたような状態になっています。

Webで情報収集して判明したのは、aws-cli v2ではコンソールからデータを渡す際にbase64でエンコードされていることが前提で、生データを渡す時は`--cli-binary-format raw-in-base64-out`オプションを明示的に指定してやる必要があるということでした。v1の時はオプションを指定せずに生データを渡せたと記憶しているので嬉しくない改変ですが、ともかくこれで、動作確認も無事に行うことができました。

# まとめ

構成自体はそれなりに見当がついているつもりでいましたが、それでも細かい箇所では色々と調査や検証が必要でした。

この記事が今後似たような構成を構築する方の参考になれば幸いです。

# エンジニア募集

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

https://gakken-leap.co.jp/recruit/
RSpec.describe クラス名, type: タイプ名

モデル仕様書
>Model specs
# type: :modelとは?
### 必ずtype: :modelと書かなければならないわけではない
モデル仕様書は`type: :model`によってか、`spec/models`内に置くことによって`config.infer_spec_type_from_file_location!`を設定した場合に印づける

>Model specs are marked by type: :model or if you have set config.infer_spec_type_from_file_location! by placing them in spec/models.

モデル仕様書は`ActiveSupport::TestCase`の薄いラッパーです。RSpecの自分自身の振る舞いと期待に加えて、`ActiveSupport::TestCase`が供給する振る舞いと断言の全てを含みます
供給する断言を含みます。
>A model spec is a thin wrapper for an ActiveSupport::TestCase, and includes all of the behavior and assertions that it provides, in addition to RSpec’s own behavior and expectations.

Examples
```rb
require "rails_helper"

RSpec.describe Post, type: :model do
  context "with 2 or more comments" do
    it "orders them in reverse chronologically" do
      post = Post.create!
      comment1 = post.comments.create!(:body => "first comment")
      comment2 = post.comments.create!(:body => "second comment")
      expect(post.reload.comments).to eq([comment2, comment1])
    end
  end
end
```
https://rspec.info/features/6-0/rspec-rails/model-specs/

# describe横のPostとはそのクラスのインスタンスを他の例に使わせるための引数

暗黙的にサブジェクトを定義する
>Implicitly defined subject

exampleグループへの最初の引数がクラスだった場合、そのクラスのインスタンスがそれぞれのサブジェクトメソッドを通して例のグループ内の例に対して晒される。
>If the first argument to an example group is a class, an instance of that class is exposed to each example in that example group via the subject method.

以下の例では、どのようにサブジェクトがユーザーと向き合うコンセプトととして使われるか説明している、カスタムマッチャーのサポートと例からその（サブジェクトの）使用を隠す拡張ライブラリに対してその使用を控えるよう推奨します
>While the examples below demonstrate how subject can be used as a user-facing concept, we recommend that you reserve it for support of custom matchers and/or extension libraries that hide its use from examples.

トップレベルグループ内に公開される
>### subject exposed in top level group
```rb
RSpec.describe Array do
  it "should be empty when first created" do
    expect(subject).to be_empty
  end
end
```
https://rspec.info/features/3-12/rspec-core/subject/implicit-subject/#:~:text=Clear%20examples-,Implicitly%20defined%20subject,first%20created%22%20do%0A%20%20%20%20expect(subject).to%20be_empty%0A%20%20end%0Aend,-When%20I%20run
AIパワードメール処理エージェント

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/992fb9dc-c5a5-6ae1-6716-e724cfe7a750.gif" width="1280" height="720" alt="Futuristic AI Office">



# AIパワードメール処理エージェント

このプロジェクトは、未読メールの処理を自動化するAIパワードメール処理エージェントであり、特に会議リクエストに焦点を当てています。このプロジェクトの詳細な説明は以下の通りです。

## 概要

AIエージェントは、未読メールを監視し続けます。新しいメールを検出すると、そのメールを処理して会議リクエストが含まれているかどうかを判断します。メールの内容とリクエストされた会議時間の空き状況に基づき、会議をスケジュールするか、代替の時間帯を提案して丁重に断る返信を送信します。

## 主な特徴

1. **未読メールの取得**: エージェントは`FetchUnreadEmail_tool`を使用してIMAPサーバーから未読メールを取得します。
2. **会議リクエストの識別**: メールを自然言語処理 (NLP) を活用して解析し、会議リクエストやオンラインでの会話を求める内容が含まれているかを確認します。
3. **会議のスケジュール**: リクエストされた会議時間が利用可能であれば、`Zoom_tool`を使用してZoom会議をスケジュールし、`Calcom_tool`で予約を作成します。
4. **メールの送信**: リクエストされた会議時間の空き状況に基づき、確認または断りのメールを`SendEmail_tool`で送信します。
5. **リトライ機能**: 未読メール取得時のエラーに対応するリトライ機能を含みます。

## 使用ツール

### FetchUnreadEmail_tool

- **目的**: 指定されたIMAPサーバーから未読メールを取得します。
- **機能**: IMAPサーバーに接続し、未読メールを取得して処理のために返します。リトライ機能を備え、エラー時にも確実に処理を進めます。

### NLPによる会議リクエストの識別

- **目的**: メールの内容を解析し、会議リクエストまたはオンライン会話に関する内容を検出します。
- **機能**: 自然言語処理技術を活用して、メール文面から関連情報を抽出し、適切な対応を判断します。

### Zoom_tool

- **目的**: Zoom会議をスケジュールします。
- **機能**: Zoom API認証情報を使用してZoom会議を作成し、会議リンクを返します。

### Calcom_tool

- **目的**: 予約を作成し、空き状況を確認します。
- **機能**: リクエストされた会議時間が利用可能かを確認します。週末、日本の祝日、または平日の制限時間帯（午前9時以前、午後1時〜2時の間、午後6時以降）の場合はリクエストを丁重に断ります。利用可能な場合は予約を作成します。

### SendEmail_tool

- **目的**: 指定された受信者にメールを送信します。
- **機能**: SMTPサーバー認証情報を使用して、会議確認メールや丁重な断りメールを送信します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/3e91b3f5-0a94-3f4b-0577-06c642281330.png)



## 動作の仕組み

1. **セットアップ**: エージェントはメールおよびツール認証情報の環境変数で設定されます。
2. **メール取得**: `fetch_unread_emails`関数がリトライ機能を使用して未読メールを取得します。
3. **メール処理**: `process_emails`関数が各メールを処理し、会議リクエストが含まれているかを判断します。
4. **会議リクエストの処理**:
    - リクエストされた会議時間が利用不可の場合、代替時間帯を提案して丁重に断るメールを生成します。
    - リクエストされた会議時間が利用可能の場合、Zoom会議をスケジュールし、`Calcom_tool`で予約を作成し、確認メールを送信します。
5. **メールテンプレート**: プロフェッショナルかつ丁寧なコミュニケーションを確保するため、事前定義されたメールテンプレートを使用します。

## メールテンプレート例

```plaintext
[相手の名前] 様

お世話になっております。[私の名前] です。

[メールの目的や内容を簡潔に述べる]

[詳細な説明や必要な情報を提供する]

何卒よろしくお願い申し上げます。

[私の名前]
```

## 重要なガイドライン

- `noreply@...`など特定のアドレスからのメールは無視します。
- すべてのコミュニケーションで明確でプロフェッショナルかつ丁寧な言葉遣いを使用します。
- 提案された日時について不明確な点がある場合は、ユーザーに確認します。
- リクエストされた会議時間が週末または平日の制限時間帯の場合は、丁重に断り、今後の利用可能な時間帯を提供します。

## デバッグ

エージェントスクリプトで`debug_mode=True`を設定することで、コンソールに追加のデバッグ情報を出力できます。

## ライセンス

このプロジェクトはMITライセンスの下でライセンスされています。詳細についてはLICENSEファイルをご覧ください。

このプロジェクトは、メールでの会議リクエスト処理を自動化し、効率化を図り、プロフェッショナルなコミュニケーションを実現します。
【埼玉県教員向け】勤務管理用のエクセルファイル作ったよ（土日部活のやつ）

## １．経緯
 部活動休日指導手当の不正受給を減らすべく、管理するためのシステムを作れと各校に指示があったらしい。県から送られてきた見本ではエクセルを使って各教員に"〇"を手入力をさせる形であった。~~（って、また仕事が増えてるやないかい）~~

## ２．思い
　（以下、個人の意見です。）
　私は、仕事の属人化ならぬ**属校化**が進みすぎていると思うわけですよ。上から全学校にこれをやれと指示が出て、その学校の教員が頭を悩ませてシステムを構築する。そしてそれぞれの学校でマニュアルができあがる。つまり、埼玉県の公立高校だと約１５０校分のオリジナルシステムとオリジナルマニュアルができあがるわけだ。~~（なんとかナビとかね）~~
 
 **これって労働力の損失じゃね？**

　
 確かに、各学校に最適化するのは大事だけどさ、１５０人ぐらいの担当者と１５０人ぐらいの管理職がシステム作りとマニュアル作りに時間かけるの、損失では？

 　
　ということで、ここで一旦属人化させようと思って作ってみました。VBAも学びたかったし、埼玉県教育委員会も「学校における働き方改革基本方針」とか出してるしね。私が作ったファイルで皆が早く帰れますように。

## ３．ファイル
　はいこれ。これ見ながら解説見るといいよ。
 　https://github.com/RS2324/kinmukanri_saitama
  
　（サンプルで名前が入っているけれど、全員ランダムで生成したので特に誰でもないです。）

## ４．管理者向け解説
　まず最初に、VBA初心者が書いたことをご留意ください。~~Dimってなんだよ。~~
 
 　不正されないように重要な情報はできる限り隠しております。~~埼玉県の教員に悪い人なんていないと思っているので、皆変な操作をしないという性善説で作られています。~~

### ４－１．簡単な説明
　教員は「Form」シートの３つのセルしか入力できない。そこに**日付**と**名前**と**職員番号**を入力して登録ボタンを押すことで、月シートに"〇"が入力される。黄色いセルだけ触ってヨシ☞
 
 　月シートを管理職の先生が印刷して貼りだしたりするといいんじゃないかな？
　もしも登録を間違ってしまった場合は管理者（管理職？）がロック解除して編集する。

### ４－２．各シートの説明
　本ファイルは以下の４種類のシートで構成されている。
#### 「Form」シート
　一般の教員はここから勤務情報を入力する。３つのセルと登録ボタンだけ操作すれば完結する。
 #### 「月」シート*12
　各教員の勤務状況が表示される。
　一般教員は見るだけ。これを印刷して貼りだして皆で確認することになるのかな？
#### 「ID」シート
　各教員の**名前と職員番号**が必須情報。同姓同名対策にその２つで認証かけている。
 　 一応１０００人まで登録可能。教員定数増えろ！
#### 「config」シート
　**現在が何年度なのか**が必須情報。
 　　→うるう年対策もここでやってる。
　**管理パスワード**はここで設定できる。

 ### ４－３．細かい解説
　管理者はロック解除ボタンを押して管理者用パスワードで認証すると、全シートと全セルを編集可能になる。ちなみに、ロックボタンを押すとロックできるが、ロックを忘れてファイルを閉じても次開いたときに自動でロックする。
 #### 　◆初期設定
 　①管理者用アンロックボタンでロックを解除する。初期パスワードは「pass」。
　②月シートに祝日設定をする。曜日の下に「1」を入力すればOK
　③IDシートに職員情報を入力する。（順番は何でもよい）
　④configシートに年度設定と管理パスワードを入力する。
 　⑤Formシートのロックボンタンを押しておく。上書き保存→終了。
 　　以上
  

### ４－４．なんか色々ヒント
 * 日付は日付、名前は文字列、職員番号は文字列、パスワードは文字列
 * 管理職のところには／を入れるらしい
 * 管理パスワードが分からなくなったら詰みかと思いきや、案外そうでもない
 * IDシートとconfigシートはxlVeryHiddenで非表示しているので、頑張って解除してみてね
 * 問い合わせはXのDMやコメントまで


## ９９．まとめ
　謎の表　参照：https://www.mext.go.jp/content/20241220-mxt_syoto01-000039268_3.pdf
|R1|R2|R3|R4|R5|
|---|---|---|---|---|
|317|317|360|358|394|

　病休・休職という選択肢は当たり前のように皆が持っておいてほしい。完全に壊れる前にその切り札を使うのだ。経験ある人間を使い捨てるのはあまりにも損失だ。そのため、減らせる仕事は減らそう。さぁ、私のプログラムをお食べ…🍞。
【PHP】VSCodeでブレークポイントで止まらない問題を解決

# ブレークポイントで止まらない...

PHPを教材で勉強していたところ、うまく動作しない処理があったのでブレークポイントを貼って確認しようと思ったのですが何故か止まらない...

以下の記事を参考にしながら対処してみました。

https://zenn.dev/nobuhiro/articles/2d1abb266978c3

## 対処内容

launch.jsonに以下のコードを追加してみました。

~~~launch.json
"configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,

            // 追加
			"stopOnEntry": false
        },
~~~
この追加したコードがどういう意味・意図で追加されているのかわからなかったため、調べてみました。

## stopOnEntryとは？

VsCodeの公式ドキュメントには以下のように記載されていました。
https://code.visualstudio.com/Docs/editor/debugging

> stopOnEntry- プログラムの起動時にすぐに中断する 

これだけだと少し分かりにくいので、ChatGPTにも聞いてみました。

# ChatGPTに聞いてみた！
こういう小難しい説明はChatGPTを使うと分かりやすくなります。
学習にも活かしていきましょう。

## stopOnEntryとは？
プログラムが「最初に動き出す瞬間で一時停止する」ようにする設定です。
Visual Studio Code（VSCode）でデバッグするときに使います。


## どういう場面で使うの？
### プログラムが始まる前に確認したいことがあるとき
例えば、「最初にどんなデータが用意されているんだろう？」と感じた時に便利。

### プログラムが変な動きをするけど原因が分からないとき
プログラムが始まる「最初の一歩」で止めて、どこに問題があるか探れます。


## どうやって使うの？
launch.jsonを設定する デバッグを始めるための設定ファイルに、以下のように書きます。

~~~launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Start Debugging",
      "program": "${workspaceFolder}/app.js",
      "stopOnEntry": true
    }
  ]
}
~~~

stopOnEntry: true にするだけで、プログラムを「最初の行」で止めます。
デバッグを実行する

VSCodeのデバッグボタン（虫のアイコン）をクリック。
プログラムが始まる前にピタッと止まります。

### イメージしやすい例
- プログラムを映画に例えると、stopOnEntryは「映画の再生ボタンを押した瞬間に一時停止する」みたいな感じ。
- あなたは監督として、「最初のシーンで役者がどんなポーズを取っているのか」を確認できます。  

## ポイント

「stopOnEntry」はデバッグの始めにプログラムを止めてくれる。
初めてプログラムが動き出す「一歩目」をチェックするのに便利。
設定は stopOnEntry: true を追加するだけ。


# まとめ

調べてみましたが、基本的にstopOnEntryはfalseで問題なさそうです。
まだ腹落ちしていないところも多いですが、なんとなくイメージは掴めましたね。
レベルが上がってさらに追記できればこの記事も更新していこうと思います。
とりあえずJavaで ALTER SESSION SET ほにゃららをしてからストアドとか実行したい

私的なメモ書き。

JavaでJDBCを用いてOracleに接続する場合、
一度開かれたコネクションは閉じられるまではセッションとして生きているため、
以下のように開いたコネクションに対してステートメントでALTER SESSIONを実行することで、実行されたコネクションにおいてはALTER SESSIONによる変更が反映された状態になる。

```
PreparedStatement PS = Connection.prepareStatement("ALTER SESSION SET ほにゃらら");
PS.executeQuery();
```

特定のストアドを実行する直前にNLS_DATE_FORMATを「YYYY/MM/DD」形式に変えておきたい時に使った。
※本来はOracleやJava（Tomcatなど）側の設定を変更したりするのかもしれないが、
　都合上それができない時にJava側で一時的に変更したかったためこのような記述をした。

当たり前のことだとは思うが、検索しても見つからなかったため備忘録として記録する。