OmniAICreator/Qiita-1.07M huggingface dataset:
【A tour of go】Goのパッケージとエクスポートの仕組みをやさしく解説！

先日、Go言語のインターンに参加する機会がありました。そのため、その復習も兼ねて、Go公式チュートリアルの「A Tour of Go」に取り組んでいます。

今回はその中でも「Basics：variables, and functions」の章を進める中で、特にエクスポートのルールやパッケージの仕組みについて、分かりにくいと感じた部分を中心にまとめました。

間違いや勘違いがあればぜひコメントで教えていただけると嬉しいです🙇
Go初学者の方の参考になれば幸いです！

### Export names (3/17ページ)

Goでは、**大文字で始まる名前（関数・変数・構造体など）は「エクスポート」され、他のパッケージから参照できます**。 
逆に、**小文字で始まる名前はパッケージ内でしか使えません**。

### パッケージとは？
パッケージとは、関連する機能をまとめたGoの「ファイルの集まり」のことです。  
例えば以下のような構成の時は

```
application/
├── main.go        ← package main に含まれるファイル
├── model/
│   └── user.go    ← package model に含まれるファイル
└── handler/
    └── user.go    ← package handler に含まれるファイル
```

`model/user.go` から `handler/user.go` 内に含まれる関数/変数を使いたいときは、  `model/user.go` 内に以下のように `import` 文を書きます。

```go
import "application/handler"
```


### 「エクスポートされた名前」は別のパッケージから使える




Goでは、次のようなルールがあります：

- `Hoge` のように **大文字で始まる名前 → 外部パッケージからアクセス可能**
これを`Public`と言います。
- `huga` のように **小文字で始まる名前 → 外部パッケージからアクセス不可**
これを`Private`と言います。

つまり、`handler` パッケージ内に以下のような関数があった場合：

```go
// エクスポートされる = Public
func Hoge() {
    ...
}

// エクスポートされない = Private
func huga() {
    ...
}
```

`model/user.go` からは `Hoge()` は呼び出せますが、`huga()` は呼び出せません。
つまり、handler パッケージ内で定義された関数のうち、大文字で始まる Hoge は外部から見える（使える)のに対し、小文字で始まる huga は見えない（使えない）という違いがあります。
変数、構造体、構造体のフィールド、定数にも同じルールが適用されています。


### 標準パッケージのmathを使う例
```go
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi) 
}
```
標準パッケージの `math` をインポートすると、そこに含まれる Public変数のPi（円周率）を自分のファイル内でも使うことができます。


:::note info
📦 **パッケージをまたぐときは、大文字で始まる「エクスポート名」だけが使えます**
:::

:::note info
📂 **同じパッケージ内のファイル同士では、大文字・小文字に関係なくアクセスできます**
:::

:::note info
🚫 **他パッケージの小文字始まりの名前にはアクセスできません**
:::

>引用元　https://go-tour-jp.appspot.com/basics/1
縮退がある点で有効質量をフィッティングで求めるときの注意点

ZincBlend構造のVBMでのGamma点での有効質量をバンド計算で求めるのにはどうしたらいいか？縮退がある場合に注意しないといけない。普通はフィッティングで求めたい。

Gamma点で考えることにする。Gamma点での群対称性を考えると(L=1,S=1/2)の3x2=6つの状態が縮退しており、角運動量合成法則により$p_{3/2}$(J=3/2,4重縮退)と$p_{1/2}$(J=1/2,2重縮退)の２つの準位に分類できる。スピン軌道相互作用により、この２つの準位が分離する。$p_{3/2}$はHH(Heavy Hole)＋LH(Light Hole)であり、$p_{1/2}$はSH(スプリットオフ）である。

$p_{3/2}$は二重縮退であり、Gamma点周りの分散関係が問題になる。
HHバンドとLHバンドに分かれる。キッテル本には以下のようなHH,LHの分散（有効質量）の式がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/abb7f20e-b115-429a-aef3-bdead6ee8e71.png)

* $e({\bf k})$の式には${\bf k}=0$を特異点（分岐点）とする関数が含まれている。すなわち、
$z_1=k_x^2,z_2=k_y^2,z_3=k_z^2$という３つの変数$z_1,z_2,z_3$に関する複素解析関数であると見立てると、$z_1=z_2=z_3=0$が特異点となっている（多変数複素関数は難しいらしいが、無限回微分可能かどうか考えれば良い）。

* k=0でテイラー展開できない。$k_y$を有限の値、$k_z=0$を固定して考えてみる。$k_x^2$の関数として$k_x^2=0$での微分を考察する.$k_x^2$での微分が、$k_x \to 0,k_y \to 0$において、その比を与えないと定まらないことがわかる。注意深く考察しておくべき。33式が複素解析関数$y=\sqrt{z}$という分岐のある関数を含むためにこういうことが起こっている。

「大雑把に言って」と書かれている点に注意が必要。球面でないので向きによって２次曲率がものすごく違っている。ダイヤモンドでもSOCをいれないと有効質量は計算できない。
- Siで100方向だと($k_x=k,k_y=k_z=0$として）
$\epsilon(k)=(A \pm B) *k^2=(-4.29 \pm .68) *k^2$
- Siで111方向だと($k_x=k_y=k_z=k/\sqrt{3}$として）
  $\epsilon(k)=(A \pm (B^2+C^2/3)^{1/2}) *k^2=(-4.29 \pm 2.89) *k^2$

となる。向きによって質量が全く違っていることに注意しないといけない。(ほんとにこんなに違うのかな？）.
通常、300Kとかいう室温が問題になるので、そもそもその範囲が、この摂動論の有効範囲かどうかにも注意がいる。

フィッティングしようと思ったら、たとえば、100,110,111方向でフィットしないといけない。で、数式３３からA,B,Cを決めるか、あるいは何らかの単純な方法で有効質量を求めないといけない。あるいはSOCハミルトニアンを直接に書かせたほうが簡単かもしれない。

一般に縮退がある場合は同様のことがおこりえる。Hamiltonianがｋ空間でスムーズなものであってもその固有値は二重縮退なら二次方程式の解の公式を用いることになり、どうしても特異点周りの展開になってしまう。
バンド構造はBZ中で多くのバンド面があるが、交差したり、接触したりしており、それなりにいろいろと面倒くさいことにはなっている。
MacのデスクトップアプリをTauri・React開発するためにプロジェクトを作成

# はじめに

こんにちは、エンジニアのケイタMaxです。

今回はMacのデスクトップアプリを開発してみたくなったので、

https://zenn.dev/yoneya/articles/f0dc01bf826528

こちらの記事の通りにTauriを使用してアプリの立ち上げまでをやってみようと思います。

# Tauriとは
>Tauri は、主要なデスクトップおよびモバイル・プラットフォームのすべてで、軽量・高速なバイナリ・ファイルを構築できるフレームワーク（仕組み）です。フロントエンドには、HTML、JavaScript、CSS にコンパイルされるフレームワークを利用してユーザー・エクスペリエンス（UX）を構築し、バックエンドの処理ロジックには、必要に応じて Rust、Swift、Kotlin などの言語を活用できます。
(引用：https://v2.tauri.app/ja/start/)

Tauri は HTML/CSS/JavaScriptなどのWeb技術で見た目を作り、Rust等でバックエンドを処理す流ことができるデスクトップアプリ開発フレームワークのようです。

# インストール

参考下の記事にあるように、インストールします。

```
brew install rustup-init
rustup-init
```

# プロジェクト作成

以下コマンドでプロジェクトが作成できます。

```
npm create tauri-app@latest
```

色々聞かれるので質問に答えていきます。
今回はReact TypeScriptでフロントを書きたいので以下のように回答しました。

```
% npm create tauri-app@latest
Need to install the following packages:
create-tauri-app@4.5.9
Ok to proceed? (y) y
✔ Project name · tauri-sample
✔ Identifier · com.tauri-sample.app
✔ Choose which language to use for your frontend · TypeScript / JavaScript - (pnpm, yarn, npm, deno, bun)
✔ Choose your package manager · npm
✔ Choose your UI template · React - (https://react.dev/)
✔ Choose your UI flavor · TypeScript

Template created! To get started run:
  cd tauri-sample
  npm install
  npm run tauri android init
  npm run tauri ios init

For Desktop development, run:
  npm run tauri dev

For Android development, run:
  npm run tauri android dev

For iOS development, run:
  npm run tauri ios dev
```

すると`tauri-sample`というディレクトリができているかと思うので`cd tauri-sample `で移動します。

# 起動してみる

以下コマンドでjsのライブラリをインストールします。

```
npm install
```

完了したら、以下のコマンドで立ち上げてみましょう。

```
npm run tauri dev
```

すると以下のようにアプリが立ち上がります。

![スクリーンショット 2025-04-20 8.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/c4167d8e-171f-46b6-be8c-98adf5f086d6.png)

# おわりに



この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://v2.tauri.app/ja/start/create-project/

https://zenn.dev/yoneya/articles/f0dc01bf826528
1分で分かるVBAコード解説

## エクセルのシートG列に12以上の数字のセルがあった場合、そのセルの値を削除するコード
```bash
Sub JyuryouSakujo() #「JyuryouSakujo」というサブプロシージャ名

Dim lastRow As Long #「lastRow」というロング型の変数
Dim r As Long #「r」というロング型の変数
Dim rowCount As Long #「rowCount」というロング型の変数
Dim Cstrnum As Integer #「Cstrnum」という整数型の変数
 
 lastRow = Range("G" & Rows.Count).End(xlUp).Row #「lastRow」にG列の最終行数を代入
 
For r = 1 To lastRow #1から開始して「lastRow」の数字まで繰り返す。
     Cstrnum = Range("G" & (r)) #「Cstrnum」にG列の「r」の行数のセルの値を代入
   If Cstrnum > 11 Then #「Cstrnum」が12以上の場合「End If」までの処理を実行
     Range("G" & (r)).EntireRow.Delete #G列の「r」の数字のセルの値を削除
     r = r - 1 #「r」に代入されている数字から1引き算する
   Else
   End If
Next

End Sub
```
ABC402の振り返り

歯茎痛い
## [A問題](https://atcoder.jp/contests/abc402/tasks/abc402_a)(diff:10) ##
やるだけ
大文字かの判定は<code>isupper</code>関数でできます。小文字の場合は<code>islower</code>。
計算量は $O(|S|)$ です。
ACコード(2ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  string S, ans = "";
  cin >> S;
  for(char o : S) {
    if(isupper(o)) {
      ans += o;
    }
  }
  cout << ans << endl;
}
```
AC時間:1:18
## [B問題](https://atcoder.jp/contests/abc402/tasks/abc402_b)(diff:27) ##
問題名に従い、<code>queue</code>で殴る!
1種類目のクエリに関しては、キューに $X$ を入れ、2種類目のクエリに関しては、キューから取り出し、出力します。
計算量は $O(Q)$ です。
ACコード(1ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int Q;
  cin >> Q;
  queue<int> que;
  for(int i = 0; i < Q; i++) {
    int query;
    cin >> query;
    if(query - 1) {
      cout << que.front() << endl;
      que.pop();
    }
    else {
      int X;
      cin >> X, que.push(X);
    }
  }
}
```
AC時間:5:07
## [C問題](https://atcoder.jp/contests/abc402/tasks/abc402_c)(diff:337) ##
ABCではすぬけくん久々に見る…かも?
$\sum_{i = 1}^M K_i \le 3 \times 10^5$ から、各料理を順にみていくのでは間に合いませんが、すぬけくんが克服できた食材を含む料理を順にみていけばその回数の総和が $\sum_{i = 1}^M K_i$ になるため間に合います。
$A_{i,1}, \dots , A_{i,K_i}$ を<code>set</code>などで管理することで解くこともできますし、$K_i$ を管理して解くこともできます。
後者の場合 $O(N + M + $\sum_{i = 1}^M K_i$)$ です。
ACコード(544ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, M;
  cin >> N >> M;
  vector<int> K(M);
  vector<vector<int>> pos(N + 1, vector<int>(0, 0));
  for(int i = 0; i < M; i++) {
    cin >> K[i];
    for(int j = 0; j < K[i]; j++) {
      int a;
      cin >> a, pos[a].push_back(i);
    }
  }
  int cnt = 0;
  for(int i = 0; i < N; i++) {
    int B;
    cin >> B;
    for(int o : pos[B]) {
      K[o]--, cnt += (!K[o]);
    }
    cout << cnt << endl;
  }
}
```
AC時間:9:31
## [D問題](https://atcoder.jp/contests/abc402/tasks/abc402_d)(diff:827) ##
平行になるようなものを列挙する…のような構想はできましたが、そこからうまくいきませんでした
傾きを考える、という案をもうちょっと考えていれれば良かったです。
## 感想 ##
微下がり(パフォ713、レート743)
Dが難しくなっていってるので追いつけるよう頑張りたいです。
参加Community 


# Programming language
## C/C++
### MISRA C/C++
### CERT C/C++
### gcc/g++
### clang/clang++
## python
## RUST
## C#
## FORTRAN
## COBOL
## BASIC

# Network 
## TCP/IP(RFC)
## Ethernet
## Wi-Fi
## bluetooth
# OS
## POSIX
## OSEK
## TOPPERS
## ROS
## BSD

# Domain
## Open Source

## Natural Language

東大大規模言語モデル（Large Language Models／LLM)
https://weblab.t.u-tokyo.ac.jp/lecture/course-list/large-language-model/

からあげ帝国
https://karaage-teikoku.com/

## Medical
## Food
## Vehicle

## Safety
### HAZOP
### 安全工学シンポジウム
### Entropy
Microsoft Defenderで推奨された設定をmacOSで行う

仕事環境のエンドポイント対策をMicrosoft Defenderに寄せています。先日macOSにMicrosoft Defenderを入れたところ、いくつかの設定を推奨されたので、その設定をやってみた記録を残します。

# Turn on Microsoft Defender Antivirus PUA protection in block mode in macOS
これは、Microsoft Defenderの望ましくない可能性のあるアプリケーション (PUA) 保護機能を「ブロック」モードに設定することを勧める内容です。デフォルトでは「監査」モードになっているのを、次のコマンドで「ブロック」モードに変更できます。

```mdatp threat policy set --type potentially_unwanted_application --action block```

https://learn.microsoft.com/ja-jp/defender-endpoint/mac-pua

# Turn on Firewall in macOS
macOSのFirewall機能の有効化を勧める内容です。「設定」→「ネットワーク」→「ファイアウォール」で有効化できます。

# Secure Home Folders in macOS
これは、macOS上のホームフォルダーを、ほかのユーザからアクセスさせないように設定することを勧める内容です。次のコマンドで、自分以外のグループやユーザから読み書きできないように設定できます。

```sudo chmod -R og-rw /Users/<username>```
VBA_ワークシート範囲のクラス化

次のような入力フォームや指定様式のようなワークシートがあったとします。入出力する箇所が点在しており、コ－ディングする際にセル番号の確認が煩雑になる場合がありますが、あらかじめ処理に必要なセル範囲をクラス化すれば都度確認が不要になります。

![20250420_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/04a734ef-f544-4b84-93a9-d5b9fb3eb8ce.jpeg)


1.クラスモジュールを追加します。
2.クラスモジュールの名前をプロパティで変更します。ここでは「CommonWorksheetRange」とします。
3.クラスモジュール_CommonWorksheetRangeをコーディングします。
```VBA:クラスモジュール_CommonWorksheetRange
Property Get 印刷シート_住所() As Range
    Set 印刷シート_住所 = Worksheets("印刷シート").Cells(2, 3)
End Property
Property Get 印刷シート_氏名() As Range
    Set 印刷シート_氏名 = Worksheets("印刷シート").Cells(4, 3)
End Property
Property Get 印刷シート_電話番号() As Range
    Set 印刷シート_電話番号 = Worksheets("印刷シート").Cells(7, 3)
End Property
```
4.使いたいモジュールの宣言セクションで宣言すると、インテリセンスにより自動メンバ表示が使えます。

![20250420_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/9ba60c08-b5e2-441e-8b82-776fc56a6e47.jpeg)

5.使用例
```VBA:標準モジュール_Module1
Public wsRng As New CommonWorksheetRange

Sub テスト()
    wsRng.印刷シート_氏名.ClearContents
    wsRng.印刷シート_住所.ClearContents
    wsRng.印刷シート_電話番号.ClearContents
End Sub
```

```VBA:クラスモジュール_CommonWorksheetRange
Property Get 印刷シート() As Range
    With Worksheets("印刷シート")
        Set 印刷シート = Range(.Cells(2, 3), Cells(4, 3), Cells(7, 3))
    End With
End Property
```

```VBA:標準モジュール_Module1
Public wsRng As New CommonWorksheetRange

Sub テスト2()
    wsRng.印刷シート.ClearContents
End Sub
```
OpenVPNサーバの構築① ～OSインストール～

# どういう構成か
![OpenVPN.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643685/ba248d00-198a-46d0-98de-cac181761646.jpeg)
- パブリッククラウド上にOpenVPNサーバを構築して、必要なリソースにしかアクセスできないようにする

# なぜ必要か
- 正直、SaaSを利用した方が運用管理コストは低いしセキュリティもサービスベンダーに依存すればいい
- コストを抑えたい、外部サービスから社内へ通信を許可したくない、IP制限があるなどの場合は有効

# スペック
| CPU | メモリ |OS | ミドルウェア | 
| ---- | ---- | ---- | ---- |
| 1core 1GHz| 1GB | Ubuntu | OepnVPN |

# サーバ設定
## OSアップデート
```
apt update && apt upgrade
```
## pingインストール
```
apt install iputils-ping
```
## NW設定ファイルのバックアップ
```
mv /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.ymal.org
```
## 新規でNW設定ファイルを作成
```
vi /etc/netplan/99-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    ens160:
      addresses: [xx.xx.xx.xx/xx]  # サーバのIPアドレス
      nameservers:
        addresses: 
          - xx.xx.xx.xx      # DNSサーバ
      routes:
        - to: default
          via: xx.xx.xx.xx    # DGW
    ens192:
      addresses: [xx.xx.xx.xx/xx]      # 複数NICがある場合
      nameservers:
        addresses: [xx.xx.xx.xx]         # 内部DNSサーバ
      routes:
        - to: xx.xx.xx.xx            # 独自のルーティング設定がある場合
          via: xx.xx.xx.xx/xx
```
## 権限設定
```
chmod 600 /etc/netplan/99-netcfg.yaml
```
## 以下のコマンド発行後にエンターを押して設定を反映
※10秒以内にエンターが押されなければ設定が元に戻る
```
netplan try --timeout 10
```
## DNSにバグがあるので、以下の設定を行う
スタブリゾルバを使用しない
```
sed -i"" -e "s/.*DNSStubListener=yes/DNSStubListener=no/" /etc/systemd/resolved.conf
```
## リゾルバファイルのシンボリックリンク先を変更
```
cd /etc
ln -sf ../run/systemd/resolve/resolv.conf resolv.conf
```
## 再起動して反映
```
systemctl restart systemd-resolved.service
```
## パケット転送を有効化
```
vi /etc/sysctl.conf

#28行目のコメントを解除
net.ipv4.ip_forward = 1
```
## 設定反映
```
sysctl -p
```
## IPフォワーディングが有効か確認
```
sysctl net.ipv4.ip_forward
```
## iptablesを起動する
```
systemctl start iptables
```
## 自動起動を有効にする
```
systemctl enable iptables
```
## IPマスカレードの設定を行う
```
iptables -t nat -D POSTROUTING -s 172.20.0.0/16 -o ens160 -j MASQUERADE
iptables -t nat -D POSTROUTING -s 172.20.0.0/16 -o ens190 -j MASQUERADE
```
※172.20.0.0/16はOpenVPNのNWセグメント

## 設定を保存する
```
iptables-save > /etc/iptables/rules.v4
```
直接)XIAO ESP32C6+SSD1306、「回復のアイテム」を表示して遊ぶ。



いろいろ、注意
----

- 過去の記事を読んでね!!!


目的
----

OLEDのテスト
ハートがどこかに表示される
(まだ、アドレスの事は、やってないので?)


結果
----

![o_coq874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5704b28a-5c3c-40c5-a673-b90be87a9451.jpeg)


プログラム
----

```c++



//有機ELのSSD1306で豆腐を召喚
//秋月のOLEDとアイテンドウのOLEDのアドレスは3c
//SSD1306_int_cls_Heart_XIAO_ESP32C6_1


//ヘッダー
#include <Arduino.h>
#include <Wire.h>


//定義
#define COMMAND_MODE               0x80 // continuation bit is set!
#define DATA_MODE                  0x40

#define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above
#define HORIZONTAL_ADDRESSING_MODE 0x00


//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(  0x3c  );

  for (int icount = 0; icount < len1; icount++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//write_s


//セットメモリーアドレシングモード
void setMemoryAddressingMode()
{
  uint8_t databytes[4] = {COMMAND_MODE, SET_MEMORY_ADDRESSING_MODE, COMMAND_MODE, HORIZONTAL_ADDRESSING_MODE};
  write_s(databytes, 4);
}//setMemoryAddressingMode


//初期化
void setup() {

  //I2Cの初期化
  Wire.begin(D9,D10); //XIAO ESP32C6+SSD1306
  //Wire.begin(D10,D9); //XIAO ESP32C6+GROVE
  delay(200);

  //SSD1306の初期化スペル(魔法)
  //0x80,0x8D,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);

  //セットメモリーアドレシングモード (画面の終端に来たら画面の先頭に)
  setMemoryAddressingMode();

  //データの配列の定義
  uint8_t databytes[2] = {DATA_MODE,0x00};

  //画面のクリア
  databytes[1] = 0x00;
  for (int icount = 0; icount < ((128/8)*64); icount++) {
    write_s(databytes, 2);
  }//for

  //8x8のHeartの表画
  databytes[1] = 0b01100110;write_s(databytes, 2);// ..  ..
  databytes[1] = 0b10101111;write_s(databytes, 2);//. . ....
  databytes[1] = 0b10111111;write_s(databytes, 2);//. ......
  databytes[1] = 0b11011111;write_s(databytes, 2);//.. .....
  databytes[1] = 0b01111110;write_s(databytes, 2);// ......
  databytes[1] = 0b01111110;write_s(databytes, 2);// ......
  databytes[1] = 0b00111100;write_s(databytes, 2);//  ....
  databytes[1] = 0b00011000;write_s(databytes, 2);//   ..
 
}//setup


//メインループ
void loop() {
  delay(3); //dummy
}//loop



```
ABC402回答メモ

# 0.はじめに
　今週も体調悪めな中参加したABC402
　Ａ～Ｃの問題はさらっと解けましたがＤ以降には歯が立たず終了
　レートは-5の729と微減でした


# 1. A - CBC
　Sをリストとして読み込んで、大文字なら
　回答用文字列ansに加えていき
　最後にansを出力して終了
　大文字化の判定は、”Z”以下であるかどうかで行いました。

　https://atcoder.jp/contests/abc402/submissions/64998200


# 2.B - Restaurant Queue
　デキュー使うかーと思いましたが、それほどの問題でもないなと思い
　以下の方法で実装しACとなりました。
　【実装】
　1.Ｑをインプット
　2.お客さん一覧リストＬを空で初期化
　3.次に入店するお客さんの位置変数iを0で初期化
　4.以下Q回繰り返し
　　-1.クエリーが１なら、Lにｘを追加
　　-２クエリーが２なら、リストのi番目を出力し
　　　　iに1加算

　https://atcoder.jp/contests/abc402/submissions/65004459


# 3.C - Dislike Foods
　もう食べるのやめちまえと思うような問題ではあります
　素直に実装したらTLEが気になるかと思いましたが
　意外と大丈夫でした。

　【考え方】
　　1.料理に使う食材リストをリストAに保持
　　2.食材ごとの克服日を辞書DにKey食材、i克服日（0-INDEX）で保持
　　3.回答用リストansを0×Nで初期化
　　4.リストAを先頭から見ていき
　　　リストA内の料理毎食材リストをもとに料理毎の
　　　全食材克服日を算出
　　　算出した克服日をもとにansの項目に1加算
　　5.ansを先頭から累積して出力

　https://atcoder.jp/contests/abc402/submissions/65015730

# 4.D - Line Crossing
　コンテスト中には、
　　・だいたいの辺は交差する
　　・2辺が並行の時のみ交差しない
　　・辺の傾きを求め、辺の全組み合わせ数-同じ傾きの辺の組数が答え
　というところまでは考えが及びましたが、辺の傾きを求める方法が分かりませんでした。

　ある辺の頂点からの距離が同じなら（頂点が５なら、１-2と5-3みたいに）
　並行になるんだろうな・・・ということはうっすら分かりましたが
　解説を見て、辺の番号を足してNmodを取ると言う方法で行けると分かり
　目からうろこでした。

　https://atcoder.jp/contests/abc402/submissions/65041532


以上
sortedWithで複雑な条件を組む

Kotlinコレクションの1つに`sortedWith`メソッドがある。複雑な条件での並び替えが可能で扱いに慣れたいので処理のテンプレートをいくつかメモする。
`compareBy`は比較ルールを簡単に作るための関数でこれを利用して並び替え条件を決める。
```kotlin
data class User(val name: String?, val age: Int, val score: Double)

val users = listOf(
    User("Taro", 25, 80.0),
    User("Hanako", 22, 95.5),
    User("Jiro", 25, 70.0),
    User("Akira", 30, 85.0),
    User("Yuki", 22, 95.5),
    User(null, 27, 60.0),
    User("Mika", 30, 85.0),
)
```

```kotlin
val sorted1 = users.sortedWith(
    compareBy<User> { it.age }.thenByDescending { it.score }
)
// 年齢昇順、スコア降順
sorted1.forEach { println("名前：${it.name}　年齢：${it.age}　スコア：${it.score}") }
/*
名前：Hanako　年齢：22　スコア：95.5
名前：Yuki　年齢：22　スコア：95.5
名前：Taro　年齢：25　スコア：80.0
名前：Jiro　年齢：25　スコア：70.0
名前：null　年齢：27　スコア：60.0
名前：Akira　年齢：30　スコア：85.0
名前：Mika　年齢：30　スコア：85.0
```

```kotlin
val sorted2 = users.sortedWith(
    compareBy<User> { it.name == null }
        .thenBy { it.name?.length ?: 0 }
        .thenBy { it.name }
)
// 名前の長さと昇順 nullは最後
sorted2.forEach { println("名前：${it.name}　年齢：${it.age}　スコア：${it.score}") }
/*
名前：Jiro　年齢：25　スコア：70.0
名前：Mika　年齢：30　スコア：85.0
名前：Taro　年齢：25　スコア：80.0
名前：Yuki　年齢：22　スコア：95.5
名前：Akira　年齢：30　スコア：85.0
名前：Hanako　年齢：22　スコア：95.5
名前：null　年齢：27　スコア：60.0
```


```kotlin
val sorted3 = users.sortedWith(
    compareBy<User> { it.name == null }
        .thenBy { it.name?.lowercase() }
)
// 名前の大文字小文字を同じに昇順 nullは最後
sorted3.forEach { println("名前：${it.name}　年齢：${it.age}　スコア：${it.score}") }
/*
名前：Akira　年齢：30　スコア：85.0
名前：Hanako　年齢：22　スコア：95.5
名前：Jiro　年齢：25　スコア：70.0
名前：Mika　年齢：30　スコア：85.0
名前：Taro　年齢：25　スコア：80.0
名前：Yuki　年齢：22　スコア：95.5
名前：null　年齢：27　スコア：60.0
```

```kotlin
val customComparator = Comparator<User> { a, b ->
    when {
        a.age != b.age -> a.age - b.age
        a.score != b.score -> b.score.compareTo(a.score)
        else -> (a.name ?: "").compareTo(b.name ?: "")
    }
}
val sorted4 = users.sortedWith(customComparator)
// 自作したコンパレータを使用
// 年齢昇順、スコア昇順、名前昇順
sorted4.forEach { println("名前：${it.name}　年齢：${it.age}　スコア：${it.score}") }
/*
名前：Hanako　年齢：22　スコア：95.5
名前：Yuki　年齢：22　スコア：95.5
名前：Taro　年齢：25　スコア：80.0
名前：Jiro　年齢：25　スコア：70.0
名前：null　年齢：27　スコア：60.0
名前：Akira　年齢：30　スコア：85.0
名前：Mika　年齢：30　スコア：85.0
```


#### 参考

https://zenn.dev/kentama/articles/8266c40430c884#sortedwith
正n/m角形

面白い[解説動画](https://www.youtube.com/watch?v=hvS1OUmKifI)があったので紹介しておきます。
正多角形の定義は「すべての辺の長さと内角の大きさが等しい図形」です。
内角を求める公式で計算すると、正2.5角形の一つの内角の大きさは36°になるから、これを頼りに作図すると…なんと五芒星となります。
ちなみにn/mは2より大きい有理数です。
## 作図program
本家の不要な部分を削ぎ落としてあります。しかしcssによるanimationは健在なので処理が重いかも
```html:
<!DOCTYPE html><html lang=ja><head>
<meta charset=utf8>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name=viewport content="width=device-width,initial-scale=1.0">
<title>正n/m角形</title>
<style>
*{margin:0;padding:0}
body{background-color:#000;text-align:center}
form{color:#fff;margin-top:60px}
@keyframes example{0%{transform:rotate(0)}
100%{transform:rotate(360deg)}}
#cv{animation:20s linear infinite example}
form{margin-top:20px}
</style></head><body>
<form id=select name=select>
正<input id=number type=number value="2.5">角形
<input type=button value="作成" onclick="check()"><br>頂点:<span id=vertex>5</span>個
<p>(2より大きな有理数を入力)</p>
</form>
<canvas id="cv"width="500"height="500"></canvas>
<script>{
//canvasの設定
const cvs=document.getElementById("cv"),ctx=cvs.getContext("2d"),grad=ctx.createLinearGradient(0,0,0,600);
grad.addColorStop(0,'rgb(255,255,0)');
grad.addColorStop(0.5,'rgb(0,255,255)');
grad.addColorStop(1,'rgb(255,0,255)');
ctx.lineWidth=1;
//作図関数
function check(){
	var j=4,v=+document.select.number.value||2.5,n=Math.floor(v*10000+0.5),theta=Math.PI*2/v,r=200;
	for(;j--;n%5||(n/=5))n&1||(n/=2);
	document.getElementById('vertex').textContent=n;
	ctx.clearRect(0,0,500,500);
	ctx.beginPath();
	ctx.strokeStyle=grad;
	ctx.moveTo(250+r*Math.cos(theta),250+r*Math.sin(theta));
	for(;n--;)ctx.lineTo(250+r*Math.cos(theta=theta+Math.PI*2/v),250+r*Math.sin(theta));
	ctx.stroke()
}
}</script>
```
体験版
<p class="codepen" data-height="450" data-default-tab="html,result" data-slug-hash="ByyoNvP" data-pen-title="正n/m角形" data-user="xezz" style="height:300px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;border:2px solid;margin:1em 0;padding:1em"><span>See the Pen <a href="https://codepen.io/xezz/pen/ByyoNvP">正n/m角形</a> by xezz (<a href="https://codepen.io/xezz">@xezz</a>) on <a href="https://codepen.io">CodePen</a>.</span></p><script async src="https://public.codepenassets.com/embed/index.js"></script>
VBA_ワークシート名のクラス化

次のようなワークシート名があったとします。（ワークシートの差し替えがあったり、入力する箇所が多かったりするとワークシート名の入力が煩雑になります。）

![20250420_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/f01938a6-691b-43a6-b86c-48b95a538133.jpeg)

1.クラスモジュールを追加します。
2.クラスモジュールの名前をプロパティで変更します。ここでは「CommonWorksheetName」とします。
3.CommonWorksheetColumnNumberクラスモジュールをコーディングします。
```VBA:CommonWorksheetNameクラスモジュール
Property Get 住所録() As String
    住所録 = "住所録_20250420062800"
End Property
```
4.使いたいモジュールの宣言セクションで宣言すると、インテリセンスにより自動メンバ表示が使えます。
![20250420_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/d1cddb00-6498-459d-8b78-78152a265686.jpeg)
AZ-500 合格まで (2025.04)

[AZ-900 と MS-900 合格まで (2023.01) - Qiita](https://qiita.com/e99h2121/items/4ee69f047e555990065d)
[AZ-104 合格まで (2023.06) #AZ-104 - Qiita](https://qiita.com/e99h2121/items/de97a5e78b083739b5a1)
[AI-900 合格まで (2023.11) #AI-900 - Qiita](https://qiita.com/e99h2121/items/f32fcf4648bdf33a5ebd)
[AZ-305 合格まで (2023.12) #AZ-305 - Qiita](https://qiita.com/e99h2121/items/18ed097e6ecb66aafb3f)
[DP-900 合格まで (2024.02) #DP-900 - Qiita](https://qiita.com/e99h2121/items/51bf98981bffa218a712)
[AZ-204 合格まで (2024.05) #AZ-204 - Qiita](https://qiita.com/e99h2121/items/efbc9164bf5276880d9d)
[AZ-400 合格まで (2024.09) #AZ-400 - Qiita](https://qiita.com/e99h2121/items/00801184d7309b36b933)
[AZ-700 合格まで (2024.12) #AZ-700 - Qiita](https://qiita.com/e99h2121/items/ea446701bfe5f9c5c309)
[SC-900 合格まで (2025.01) #SC-900 - Qiita](https://qiita.com/e99h2121/items/bc9600f639decdcf9256)


2025.04.19 AZ-500 を受けて合格したメモです。



## 感想

- SC-900 が良い準備になったかもしれない。内容は、MS に関わるセキュリティ用語的なところをひとしきり。
- 実務的にも知っていると便利なセキュリティ系ということで、割と興味深く受けられた。
- 個人的にもまあまあ馴染み深いところを復習できたかもしれない。




## MS Learn

[コース AZ-500T00-A: Microsoft Azure Security Technologies - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/courses/az-500t00)
[AZ-500:ID とアクセスを管理する - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/paths/manage-identity-access-new/)
[AZ-500:セキュアなネットワーキング - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/paths/secure-networking/)
[AZ-500:コンピューティング、ストレージ、データベースをセキュリティで保護する - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/paths/secure-compute-storage-databases/)
[AZ-500:セキュリティ オペレーションを管理する - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/paths/manage-security-operations-new/)



https://learn.microsoft.com/ja-jp/credentials/certifications/azure-security-engineer/practice/assessment?assessment-type=practice&assessmentId=57&practice-assessment-type=certification


## 参考

[AZ-500 Azure Security Technology 100% Original Practice Exam | Udemy](https://www.udemy.com/course/az500-azure-practice/)
[Amazon.co.jp: 最短突破 Microsoft Azureセキュリティ テクノロジ［AZ-500］合格教本 eBook : 阿部 直樹, 国井 傑, 神谷 正: Kindleストア](https://www.amazon.co.jp/dp/B0BDYFCZ5G)
珍しく本も出ていて、↑ をひとまわり。

[Azure認定資格 AZ-500を取得しました #Azure - Qiita](https://qiita.com/shingo_kawahara/items/6c23e843b21257287031)



## 次ステップ

AI-xxx やらに手を出してみるか、流行りものだし、という昨今。


以上です～
VBA_列番号のクラス化

次のようなワークシートがあったとします。コーディングしているとワークシートを見て列番号を確認するのが煩雑になりますが、あらかじめ列番号をクラス化してしまえば列番号の都度確認が不要になります。

![20250506_04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/3f16c1ec-eb0e-488e-a979-75125775062c.jpeg)


1.クラスモジュールを追加します。
2.クラスモジュールの名前をプロパティで変更します。ここでは「CommonWorksheetColumnNumber」とします。
3.CommonWorksheetColumnNumberクラスモジュールをコーディングします。
```VBA:クラスモジュール_CommonWorksheetColumnNumber
Property Get 住所録_番号() as Integer
    住所録_番号 = 1
End Property
Property Get 住所録_氏名() As Integer
    住所録_氏名 = 2
End Property
Property Get 住所録_住所() As Integer
    住所録_住所 = 3
End Property
Property Get 住所録_電話番号() As Integer
    住所録_電話番号 = 4
End Property
Property Get 住所録_備考() As Integer
    住所録_備考 = 5
End Property
```
4.使いたいモジュールの宣言セクションで宣言すると、インテリセンスにより自動メンバ表示が使えます。
![20250420_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820751/f5c9363d-83e5-4aa4-8182-113e31b97dba.jpeg)

5.使用例
```VBA:標準モジュール_Module1
Private colNum As New CommonWorksheetColumnNumber

Sub テスト()
    Dim i As Long
    For i = 1 to 5
        Debug.Print Worksheets("Sheet1").Cells(i, colNum.住所録_番号)
        Debug.Print Worksheets("Sheet1").Cells(i, colNum.住所録_氏名)
        Debug.Print Worksheets("Sheet1").Cells(i, colNum.住所録_住所)
        Debug.Print Worksheets("Sheet1").Cells(i, colNum.住所録_電話番号)
        Debug.Print Worksheets("Sheet1").Cells(i, colNum.住所録_備考)
    Next i
End Sub
```
ABC402振り返り

## はじめに

東京海上日動プログラミングコンテスト2025(AtCoder Beginner Contest 402)に参加しましたので報告します。

## 結論

- 今回も解いたのはA問題B問題のみ
- ABCが行われる時間は通常寝ている時間であるため、眠気による思考力と気力の低下が今後の課題
- パフォーマンスは221(前回215)、レートは+23されて54(前回31)に
- レート147の壁は(Ratedを続けていれば)越えそう
- (特にトップ層の点数状況を見て)ABC401同様の難度とみた
- ただし、G問題は正解人数5名と少ない

## A - CBC

与えられた文字列のうち、大文字だけを抽出して出力する問題です。
基本的には問題文通りにすればOKです。

※以下のコードは実際の提出とは異なります。提出時に付けていた余分なヘッダーを削っています。

```cpp:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  string s;
  cin >> s;
  for (int i = 0; i < (int)s.size(); i++) {
    if (isupper(s[i])) cout << s[i];
  }
  cout << endl;
  return 0;
}
```

## B - Restaurant Queue

FIFO(先入先出)キューの処理を行う問題です。
dequeを使って解きました。

```cpp:B.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  deque<int> dq;
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int cmd, x;
    cin >> cmd;
    if (cmd == 1) {
      cin >> x;
      dq.push_back(x);
    } else {
      cout << dq.front() << endl;
      dq.pop_front();
    }
  }
  return 0;
}
```

## C問題以降について

- C問題以降は眠気が酷く、パフォーマンスを維持できないと判断し離脱した
- B問題までを解く速度は15分を切る程度なので、引き続きAtCoder Daily Trainingで訓練していきたい

## レーティング変動

31→54(+23)。
A問題B問題を解くのにようやく15分を切るようになったので、ややパフォーマンス(とレート上昇値)が上がりました。
レート147はいけそうですが、茶色にはまだほど遠いです。

## 今後の課題

- ABCの実施時間(21時〜22時40分)に慣れる
- 引き続き、『問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本』で勉強する(要・読み返し)
- 引き続き、高校数学の再履修を行う
- まだまだ遅いA問題B問題の回答速度を上げる。とりあえずの目標は10分
- AtCoder Daily Trainingに参加してトレーニングを続ける
- 過去問を解いてないので解くようにする。過去コンテストのバーチャル参加もしたいところ
- いずれはレートが下がる時が来るので、それに対して覚悟を決める

## おわりに

まだまだ始めたばかり(まだ1ヶ月経過していない)なので慣れていませんが、今後も精進します。
よろしくお願いします。

## その他

次回(ABC403、27日・日曜)は私用のため不参加になる予定です。
後日、バーチャル参加はしておきたいところです。
Google Cloud認定Associate Cloud Engineer受験談＆学習方法

## 概要
2025年4月19日にGoogle Cloud認定Associate Cloud Engineerの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。

## 前提の知識と経験
パブリッククラウドとしてはAWSをメインに扱い、SAPやDOPの試験に合格しているということ、3週間前のCloud Digital Leaderへの合格が、私の前提になっています。
実務でGoogle Cloudの経験はなく、少ししか触ったくらいです。

## 学習期間
今回は大体3週間くらいで、平日は1日2〜3時間、休日は5〜6時間くらいです。

## 学習教材
### 1. Google Cloud公式サンプル問題
Associate Cloud Engineerのサンプル問題が20問あり、レベル感も本番と近いです。試験のレベル感を確かめて100％の正答率になるまで頑張りましょう。

https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/viewform

### 2. 【直前対策】Google Cloud 認定資格 - Associate Cloud Engineer - 模擬試験2回付

Udemyの教材で、試験範囲のサービスを網羅して説明している動画です。ただ、サービスを説明がメインですので、合う合わないがありそうです。同じような動画教材でしたら、Maruchin Tech氏の方が合っていたかもと。

https://www.udemy.com/course/google-cloud-associate-cloud-engineer-2

### 3. これだけで合格！Google Cloud Associate Cloud Engineer模擬試験問題集（4回200問）
Udemyの模擬試験で、他の記事でもオススメしていたので購入してみました。本番と同様のレベル感でしたので、これは私もオススメです。これが9割くらいできていれば合格できるかなと。

https://www.udemy.com/course/google-cloud-associate-cloud-engineer4200

## 試験直前
今回は少しトラブルがありました。
カメラが写っていないとのことで、「パソコンを再起動してくれ」と試験官から言われてしまい、大丈夫かなと思いながら再起動させました、、、全部、英語でのやりとりだったので、合っているかなと。
とりあえず再起動後に改めてCertMetricsからログインし、セキュアブラウザを立ち上げ、試験官に「戻ったよ」と伝えると、次の工程に進むことができました。
カメラ自体は性能テストで写っていたので、こちら側では大丈夫だったが、試験官側で何かあったのかなと思っています。

## 本番試験
120分の試験時間で50問出題されました。見直し含めて60分で終了。すぐに「合格」の表示があったので、安心しました。
試験の内容としてh、Kubernetes自体の問題も出てくるので、触ったことがなくても概要は把握しておいた方が良いですね。あとgcloudのコマンドもあるので、これは実際に使って慣れていなかったら、覚えるしかないですね〜

## 試験後
メールボックスを見ると、試験前の上記のトラブルの時間帯に「試験再登録」のお知らせメールが届いていたので、「試験が無効」かと思い、正式な合格のメールが届くまで心配していましたね。
次の日の朝に正式に合格のメールが届いていたので、とりあえずトラブルがあった場合も試験官の指示に従い、落ち着いて対応したら大丈夫だということです。

## 最後に
会社としてGoogle Cloudに力を入れるということで資格取得を進めていて、次はProfessional Cloud Architectを挑戦したいと思っています。
競プロ日記#25/04/19

# AtCoder
## ABC142_[A-Odds of Oddness](https://atcoder.jp/contests/abc142/tasks/abc142_a)
- 特になし
- 絶対誤差または相対誤差を1e-6以下にするためにfixed << setprecision(10)を使う。setprecision(10)の中は10が安心

```
int main() {
    int N;
    cin >> N;
    int total = 0;
    for (int i = 1; i <= N;i++){
        if (i % 2 != 0){
            total++;
        }
    }
    double ans = total / (double)N;
    cout << fixed << setprecision(10) << ans << endl;
}
```

## ABC142_[B-Roller Coaster](https://atcoder.jp/contests/abc142/tasks/abc142_b)
- 特になし
- 昇順でソートしてN回for文で回す。初めて身長がK以上になったらそれ以降の人たちもK以上の身長を持っているのでN - i人がKcm以上と分かる。
- あとは誰一人Kcmを超えていない場合の考慮を加えて終わり
```
int main() {
    int N,K;
    cin >> N >> K;
    vector<int> A(N);
    for (int i = 0; i < N; i++){
        cin >> A[i];
    }
    sort(A.begin(), A.end());
    for (int i = 0; i < N; i++){
        if (A[i] >= K){
            cout << N - i << endl;
            return 0;
        }
    }
    cout << 0 << endl;
}
```

## ABC142_[C-Go to School ](https://atcoder.jp/contests/abc142/tasks/abc142_c)
- 少し頭がこんがらがりそうだが、要は出席番号1からN順番にその人が何番目に登校したかという情報がA1~ANで入ってくるという話なので適切に並び替えてあげれば答えが出せる。
- 空白区切りなので出力の仕方だけ少し注意
-AtCoder ProblemsのBoot camp for Beginnersをやっているのだが昔のC問題の難易度がやさしめだったのかあまり練習にならない気がする（練習にならないは語弊だが最近のC問題は明らかにもっと難しい気がする...）

```
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; i++){
        cin >> A[i];
    }
    vector<int> ans(N);

    for (int i = 0; i < N; i++){
        ans[A[i] - 1] = i + 1;   
    }

    for (int i = 0; i < N; i++){
        if (i == N - 1){
            cout << ans[i] << endl;
            return 0;
        }
        cout << ans[i] << " ";
        
    }
    
}
```

## ABC094_[A-Cats and Dog](https://atcoder.jp/contests/abc094/tasks/abc094_a)
- 特になし
- 問題設定が多少ややこしい
```
int main() {
    int A,B,X;
    cin >> A >> B >> X;
    if (A + B > X && A <= X) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
}
```

## ABC094_[B-Toll Gates](https://atcoder.jp/contests/abc094/tasks/abc094_b)
- 特になし
```
int main() {
    int N,M,X;
    cin >> N >> M >> X;
    int left = 0;
    int right = 0;
    for (int i = 0; i < M;i++){
        int a;
        cin >> a;
        if (a < X) {
            left++;
        } else {
            right++;
        }
    }

    cout << min(left, right) << endl;
}
```


# アルゴ式-[2乗和](https://algo-method.com/tasks/654)

- nの2乗の総和について導出する問題
```

long long func(long long N){
    return N*(N+1)*(2*N+1) / 6;
} 
```

# アルゴ式-[ボールと箱 (3)](https://algo-method.com/tasks/740)
- 手順的にはnCmで選んだものたちを階乗で並べるという流れだが、そもそもnCm = nPm / m!となるので結果としてnPm / m! * m!つまりnPmが求める値

```
int main() {
    int N,M;
    cin >> N >> M;

    cout << funcPermutation(N,M) << endl;

}
```
Gitに追跡されないローカルフォルダを作成する

Gitに追跡されない（`git add .`してもステージングされない）フォルダの作り方。
ローカルリポジトリに自分専用の検証用ファイルを置きたい時などに使う。

## 作り方

1. 追跡対象外にしたいローカルフォルダを作成する
    - フォルダ名は何でもOK
1. 作成したフォルダの中に「.gitignore」という名前の空のテキストファイルを作成する
1. .gitignore をテキストエディタを開き、`*`だけ入力して保存する
    ```gitignore:.gitignore
    *
    ```

## 結果
以下のようにローカルフォルダの中身がGitに監視されなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736050/07d97fe4-6530-4dea-b512-81e210387dd8.png)
※フォルダ自体は追跡対象だが、中のファイルが全て対象外の場合はステージングされない。
エイリアスを引き継いだアドレスをSparkで使用する時の注意

# 背景
進学に伴いメールアドレスも変更になったため、これまで使用していたエイリアスを引き続き使えるように大学に申請を行い処理はすぐに完了しました。しかし、受信できることにはできるんですが、前のアドレス経由で送信してしまうことがあり、そのメールへの返信を旧アカウントで受信したりごちゃごちゃに...使用しているメーラーはSparkです。

# 原因
完全に私のミスでした！Sparkに新しいアカウントを追加したもののエイリアスの変更を行なっていませんでした...


![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515843/d0c91536-6d88-400c-b1a1-3ff0f8af215d.png)


そのため、2024年度までのエイリアスを削除し2025年度〜のエイリアスにコピペしたところ意図した通りに送受信ができるようになりました。

![名称未設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515843/7b655ae3-5b66-4396-9e8c-e517bacd2e1b.png)



数年前に人生で初めてエイリアスを申請したのですが、メーラーの操作なんてすっかり忘れていました...

## Webもついでに
大人しくbeb版使えばいいんだよな...と思いつつ、ふと気になってweb版Gmail開いてみたらwebも自分で設定しないいけなかったです、危ない危ない(?)

# 番外編：院進学者よ、エイリアスを活用しよう！
ほぼ全ての大学生が、学部を卒業して修士課程に、または博士課程に進学する際にメールアドレスが変更になるかと思います。その際に、学会の登録情報とか変更するの、面倒ですよね。しかし、エイリアスを設定してしまえば大学から支給されたアドレスが変わっても引き継ぎの申請をすれば、引き続き自分で設定したメアドにメールが転送されてきます！
詳しい説明：https://docs.gandi.net/ja/gandimail/forwarding_and_aliases/
https://frauddetection.cacco.co.jp/media/knowhow/20159/

あと自分で好きな文字列を申請できるので、学籍番号とか学生IDで構成された変なアドレスとおさらばできます、テンション上がらない？
※あくまで僕の所属大学でなので、確認してみてください。　僕は自分の名前使ってます。

# さいごに
一つの悩みはアカウントの移行ですよね、何度やっても慣れません...ちなみにChatGPTとかDeepLやら解約しました？意外と忘れがちな気もするので、旧アカウント使えなくなる前に解約しましょう。ではd
【Samsung Wallet不具合解消法】ログインできない問題をADBで解決する方法【初期化不要】

こんにちは、今回は2025年2月下旬に報告された**Samsung Walletにログインできない不具合**に関して、**初期化せずに解決できた手順**をまとめてみました。

## :warning: 問題の概要

一部のGalaxy端末（例：Galaxy S24シリーズなど）にて、Samsung Walletがログイン画面から進まず、何度再起動しても状況が改善されないという報告が相次ぎました。

### :iphone: 該当機種例
- Galaxy S21～S25シリーズ
- Z Flip/Foldシリーズ（Flip3以降、Fold3以降）
- A52～A55などAシリーズ（5G対応モデル）

## :mag: 原因の可能性

- **旧バージョンのSamsung Pay Framework（例：v15.2.52）が残存**
- 過去に**APKからインストール**していた可能性
- システムが**正式版と試用版を誤認識**

Samsung公式では「初期化が必要」と案内されているケースもありますが、実は**ADB（Android Debug Bridge）を使えば回避できる可能性がある**ことが判明しました。

## :gear: 解決までの手順（ADB使用）

### :hammer_and_wrench: 必要な準備
- PCに **ADBがインストール**されていること
- スマホの **USBデバッグモード**をオン
- デバイスを **PCとUSB接続**

### :keyboard: コマンド手順

```bash
# デバイスが認識されているか確認
adb devices

# Samsung Pay Frameworkを無効化
adb shell pm disable-user --user 0 com.samsung.android.spayfw

# 一旦有効化（強制的にバージョンをリロードさせるため）
adb shell pm enable --user 0 com.samsung.android.spayfw

# 再度無効化
adb shell pm disable-user --user 0 com.samsung.android.spayfw

# アンインストールは失敗（ブロックされるため）
adb uninstall com.samsung.android.spayfw  # → Failure [DELETE_FAILED_OWNER_BLOCKED]

# 再度有効化
adb shell pm enable --user 0 com.samsung.android.spayfw
```

> :bulb: `uninstall`コマンドでは削除できないことがほとんどです。重要なのは「**無効化 → 再有効化 → 再無効化**」という流れで、内部設定がリフレッシュされる点です。

完了後、5.x.xのAPKファイルをインストールすれば完了です。

## :white_check_mark: 結果

この手順により、Samsung Walletが正常に起動・ログイン可能となり、**Samsung Pay Frameworkのバージョンも更新**されました。

初期化せずに解決できたため、**バックアップや再設定の手間を回避できる有力な方法**といえるでしょう。


Samsung Walletが使えず困っている方は、ぜひ一度この手順をお試しください！

### :exclamation: 注意点

- ADB操作は自己責任で行ってください。
- 万が一不具合が悪化した場合は、Samsungサポートへの相談をおすすめします。
- ADBコマンドが効かない環境（キャリアロックなど）では効果がない可能性もあります。
【Mendix Pro】DomainModelとは - エンティティを定義する

Mendixでアプリ開発を進めるにあたり、まず作業をする場所はDomainModelへのテーブル(エンティティ)作成だと思います。
下記のようにDomainModelはモジュールごとに１つ存在しており、最初は何もありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/b4f8a7c4-07e0-4d73-a455-fa6af4460fd5.png)

Mendixには`「永続エンティティ」と「非永続エンティティ」`という２つのエンティティの定義の仕方が基本的にはあるのですが、本記事ではその内容には踏み込まず下記の１点について記述します。

:::note info
ポイント
永続エンティティとして定義したエンティティはMendixではテーブルとして扱われる
:::

つまり、データベースのテーブルとして扱われるため、データが実際に格納されていきます。
（非永続エンティティは逆で処理が終了するとデータは消えるメモリのようなもの）
MendixにはあらかじめデフォルトでDBが設定されているため、自分で別のMySQLやOracleなどの外部DBを使用する以外は内包されているDBを使うことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/96871a80-4179-44c4-9e79-751c53f311a6.png)


実際にエンティティを定義してみましょう。

アプリの作成に必要なテーブルとして、まずは手始めに「ユーザ情報」を作ってみます。

ユーザ情報で持っておきたいものは
・苗字
・名前
・フルネーム
・メールアドレス
・削除フラグ
など

物理名は「UserMaster」とします。

①青い「e」マークを押すと、エンティティが作成できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/667d222b-56c7-4bbe-bc6b-5609354bbd91.png)

②作成したエンティティをダブルクリックすると、下記のような画面がポップします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/306298ad-df5f-4f7a-ada9-c40e4e2760d5.png)

（Persistable＝永続性のトグルがOnになっていますね）
英語の通り、エンティティのオブジェクトはデータベースに格納されていきます。

③エンティティの名前を決めます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/402a1a06-2bdc-4fe9-a4f4-34aa1a1257f0.png)

④エンティティのAttribute（属性）を作っていきます
Attributeタブでnewを押し、下記のように設定し、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/9e995d88-145e-45b2-86d6-60aad895962f.png)

デフォルト値に何かを入れておきたいときはDefault Valueに好きな値を設定します
また、型は下記が選べます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/fb0ca17d-0606-4132-a060-aeef5e9ddd0e.png)

⑤上記の要領で登録を繰り返すと下記のようになります
テーブルに見えてきましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/e830e626-e585-4474-9fb4-1480f9f474e1.png)

今回はAssociationやEventHandlers、AccessRulesなどのタブの説明はしませんが、このままOKを押下すると、DomainModelにユーザ情報エンティティが作成され、実際の処理でオブジェクトを生成したり、画面に表示したり、コミットしたりと使用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/82018cad-5997-4f1c-9f07-07ecebf7c88f.png)

Mendix最大の特長であるアソシエーションの話や、権限設定については後日別の記事でとさせてください。

永続エンティティは青色、非永続エンティティは黄色（オレンジ？）で表されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/0caf4f95-2c30-44d7-a469-7b69b14f733d.png)

永続エンティティは登録先のエンティティやマスタテーブルとして、
非永続エンティティは画面表示用や処理用など一時的な使用として使われることが多いと思います。

例）
永続エンティティ→非永続エンティティへオブジェクトのデータ内容を移し
画面上では非永続エンティティのデータに対してユーザが情報を入力
登録処理では非永続エンティティから永続エンティティに更新をかける形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/805b0b50-fff3-4c9e-ada5-af035e980adc.png)

詳しい処理の作り方は別記事でご紹介します。
イメージはこのような感じとなります。

DomainModelのエンティティの定義の仕方については以上です。
お読みいただきありがとうございました。
【Rails】Gemfileについて

# 記事概要
Ruby on Railsのライブラリについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# 基本情報
## ファイルパス
Gemfile

## 記載方法
修正箇所のみ、更新する

# まとめ
## pry-rails
デバッグ用のGem

```ruby
# 最終行に、下記を記述する
gem 'pry-rails'
```
インストール以降は、[こちら](https://qiita.com/likapantrip/items/e9a7d06557a0929c4de3)を参照

## devise
ユーザー管理機能を簡単に実装するためのGem

```ruby
# 最終行に、下記を記述する
gem 'devise'
```
インストール以降は、[こちら](https://qiita.com/likapantrip/items/f89df3e5076ef3c78ae8)を参照

## RSpec
Ruby on Railsのテストコードを書くために用いられるGem

```ruby
group :development, :test do
  # 省略
  
  # グループ「group :development, :test」の中に記述する
  gem 'rspec-rails', '~> 4.0.0'
end
```
インストール以降は、[こちら](https://qiita.com/likapantrip/items/5bff444bf5edfe4f1436)を参照

## FactoryBot
インスタンスをまとめることができるGem

```ruby
group :development, :test do
  # 省略
  
  # グループ「group :development, :test」の中に記述する
  gem 'factory_bot_rails'
end
```
インストール以降は、[こちら](https://qiita.com/likapantrip/items/1dedea14ed93c37053c4)を参照

## Faker
ランダムな値を生成するGem

```ruby
group :development, :test do
  # 省略
  
  # グループ「group :development, :test」の中に記述する
  gem 'faker'
end
```
インストール以降は、[こちら](https://qiita.com/likapantrip/items/d258599656ba4a248423)を参照

## Capybara
System Spec(結合テストコードを記述するための仕組み)を記述するために必要なGem
デフォルト導入されているので、インストールは不要

```ruby
group :test do
  # 省略
  gem 'capybara', '>= 2.15'
  # 省略
end
```
使用方法は、[こちら](https://qiita.com/likapantrip/items/2b0cda56c11e269e33df)を参照

## Active Storage
ファイルアップロード機能を簡単に実装できるGem
`.png`または`.jpeg`の画像に対応している

インストール方法および使用方法は、[こちら](https://qiita.com/likapantrip/items/e2fed31dd0413fbb3d8f)を参照

## MiniMagick
ImageMagickの機能をRubyで扱えるようにしてくれるGem

```ruby
# 最終行に、下記を記述する
gem 'mini_magick'
```
使用方法は、[こちら](https://qiita.com/likapantrip/items/e2fed31dd0413fbb3d8f)を参照

## ImageProcessing
MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem

```ruby
# 最終行に、下記を記述する
gem 'image_processing', '~> 1.2'
```
使用方法は、[こちら](https://qiita.com/likapantrip/items/e2fed31dd0413fbb3d8f)を参照

## pg
データベース(PostgreSQL)を使用できるようにするGem

```ruby
# 最終行に、下記(group ~ end)を記述する ※本番環境のDBとして設定する場合
group :production do
  gem 'pg'
end
```
Renderでの使用方法は、[こちら](https://qiita.com/likapantrip/items/933f246c2faf3867b211)を参照

## Rubocop
静的コード解析ツール

```ruby
group :development do
	# 中略
  gem 'rubocop', require: false
end
```
使用方法は、[こちら](https://qiita.com/likapantrip/items/27204abb187372637e54)を参照

## ActiveHash
変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができる

```ruby
# 最終行に、下記を記述する
gem 'active_hash'
```
使用方法は、[こちら](https://qiita.com/likapantrip/items/2ca32a2323928f4730df)を参照

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a

# ライブラリ
https://qiita.com/likapantrip/items/d7317b9ece36b58dffd6
【Python初心者】関数の引数の種類まとめ：仮引数実引数・位置・キーワード・デフォルト・可変長

Pythonで関数を学んでいる中で、「仮引数」「実引数」「位置引数」「キーワード引数」など引数に関する言葉がよく登場します。  
それぞれ意味や使い方が異なり、初心者には混乱しがちです。

そこで、自分の理解を整理するために、具体例とともにそれぞれの違いをまとめてみました。

## 仮引数（parameter）

関数を**定義する側**で使う変数名です。  
この時点では値は決まっておらず、**名前だけが決まっている状態**です。

```python
def greet(name):  # ← ここが仮引数
    print("Hello, " + name)
```

## 実引数（argument）

関数を**呼び出すときに渡す具体的な値**のことです。  
関数に「これを処理して」と渡すデータです。

```python
greet("Alice")  # ← ここが実引数
```

## 位置引数（positional argument）

**引数の順番が意味を持つ**渡し方です。  
定義された順番に対応して値が渡されます。

```python
def introduce(name, age):
    print(f"My name is {name}, I'm {age} years old.")

introduce("Bob", 25)
```

## キーワード引数（keyword argument）

**引数名を明示して値を渡す方法**です。  
順番を入れ替えても問題なく、可読性が上がります。

```python
introduce(age=30, name="Charlie")
```

## 位置引数とキーワード引数の併用

位置引数のあとにキーワード引数を使うことで、柔軟に関数を呼び出せます。

```python
introduce("Diana", age=22)  # OK
```

ただし、**キーワード引数を先に書くとエラー**になります。

```python
introduce(age=22, "Diana")  # ❌ SyntaxError
```

## デフォルト引数（default argument）

**関数を定義するときに、あらかじめ値を設定しておける引数**です。  
呼び出し時にその引数が省略された場合、デフォルト値が使われます。

```python
def greet(name="Guest"):
    print("Hello, " + name)

greet()           # → Hello, Guest
greet("Erika")    # → Hello, Erika
```

### 🔸 ポイント

- 引数を**渡さなかったとき** → デフォルト値が使われる
- 引数を**渡したとき** → 渡した値が使われ、デフォルト値は無視される


## 可変長引数（variable-length argument）

関数に**引数をいくつでも渡せるようにする仕組み**です。  
主に次の2種類があります。


### *args（複数の位置引数を受け取る）

`*args` を使うと、複数の位置引数を1つのタプルとして受け取れます。

```python
def show_colors(*args):
    for color in args:
        print(color)

show_colors("red", "green", "blue")
```

実行結果：
```
red
green
blue
```


### **kwargs（複数のキーワード引数を受け取る）

`**kwargs` を使うと、複数のキーワード引数を1つの辞書として受け取れます。

```python
def show_prices(**kwargs):
    for item, price in kwargs.items():
        print(f"{item}: {price} yen")

show_prices(apple=120, banana=80, orange=100)
```

実行結果：
```
apple: 120 yen
banana: 80 yen
orange: 100 yen
```



### 🔸 ポイント

- `*args` は「いくつ渡してもOKな位置引数」
- `**kwargs` は「いくつ渡してもOKなキーワード引数」
- `*args` → タプルで受け取る  
- `**kwargs` → 辞書で受け取る



## まとめ（比較表）

| 用語              | 意味                                          | 例                                      |
|-------------------|-----------------------------------------------|-----------------------------------------|
| 仮引数            | 関数定義時に使う変数名                        | `def func(x):` の `x`                   |
| 実引数            | 関数呼び出し時に渡す具体的な値                | `func(10)` の `10`                      |
| 位置引数          | 順番どおりに渡す実引数                        | `func("A", "B")`                        |
| キーワード引数    | 名前付きで渡す実引数                          | `func(x="A", y="B")`                    |
| デフォルト引数    | 渡されなかったときに使われる値                | `def func(x=10):` の `10`               |
| 可変長引数（*args）   | 任意の数の位置引数をタプルで受け取る             | `def func(*args):`                      |
| 可変長引数（**kwargs）| 任意の数のキーワード引数を辞書で受け取る         | `def func(**kwargs):`                   |

## おわりに

引数にはいくつか種類がありますが、それぞれの違いを理解しておくと、関数を柔軟に使いこなせるようになると思いました。

実際にいくつかのパターンを書いてみて、挙動を確かめながら覚えていきます。
【Rails】ライブラリについて

# 記事概要
Ruby on Railsのライブラリについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# ライブラリとは
## 概要
他のプログラムと組み合わせて使用するために、複雑なプログラムを1つのセットにしたもの

## RubyGems
Rubyのライブラリを管理するシステム
[こちらのサイト](https://rubygems.org)を参照

### Gem
RubyGemsに登録されている、各ライブラリのこと

### Gemfile
アプリケーションで使用するGemの「名前」と「バージョン」の情報を記載し、管理するファイル

### Gemfile.lock
`bundle install`によってインストール済みとなったGemの情報を記録するファイル

# 手順
1. VSCodeで[Gemfile](https://qiita.com/likapantrip/items/c8718db9a4e72b7c6ad0)を、編集する
1. `bundle install`コマンドを実行し、Gemのインストールを行う
    ```
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    # Gemfileを元にGemをインストールし、Gemfile.lockを更新する
    % bundle install
    ```
1. サーバーの再起動

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
AWSのSlack通知がスレッド化するのを防ぐ方法

# 近況

最近はECSを触り始め、Dockerやらコンテナの基本的なところを学ぶことができました。
今後はDBとかもうっすらわかるように触っていきたいです。


# 困ってたこと
AWSの通知をAmazon Q(旧Chatbot)からSlackへ飛ばすようにしていたんですが、なんか通知が届いたり届かなかったり・・・

通知先にEmailも設定していたところ、こっちはすべて正常に飛んできている。

Slackのチャンネルで確認したところ、通知がスレッド化しており通知がされていませんでした。
※初回の通知のみされて、ほかの「5件の返信」の部分は通知されない・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/c2c76e62-4bbf-4119-88f8-ccc8ecef13f2.png)



# 解決法
Slackのチャンネル内における設定で解決できました。
手順は以下の通りです。
#### ① Amazon Qをメンションし、preferencesと書いてチャンネルに投稿する
#### ② ユーザー「Amazon Q」がチャンネルに参加していない場合は参加させる
#### ③ Amazon Qさんから返信がスレッドで返信来るので「Set Preference」を押下する
#### ④ 「Display notification updates in main cannel」を選択し、「Set」を押下する
※ほかの設定項目については自身でカスタマイズしてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/ba6d22de-a9df-4842-877f-974a12d1e07b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/189a84e1-56eb-4e6a-8ef6-76b37fe46bb1.png)

これで無事通知も届き、通知内容の視認性もよくなるハズです。


# さいごに

最近記事にしたいことだらけなんですが、思ったように書けていないです。
やっぱり習慣化しないとダメかもです。
それではまたどこかで。
Kotlin/Java on IntelliJ で log を Click したらすぐ該当箇所に飛ぶための魔法

結論：`logback(-test).xml` の `<pattern>` 末尾に `at %white(%C.%M\(%F:%L\)` と入れる。

----

* `at` IntelliJ にこの文章が stack trace の一部だと認識させ、FQCN 部分を認識して貰う。
* `%C`: Fully qualified class name
* `%M`: Method name
* `%F:%L`: FileName : 行番号
* `%white` : 付加情報を良い感じに一段穏やかにする（white と書いてあるが darkmode / lightmode 両方で良い感じに

![ezgif-178a92cfb3dd91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/cd639b1a-4cb9-4d47-9436-b1de290f9d15.png)


最小構成で以下。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- @formatter:off -->
            <pattern><![CDATA[%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level){TRACE=blue,DEBUG=blue,INFO=green,WARN=yellow,ERROR=red} %cyan(%logger{36}) - %msg at %white(%C.%M\(%F:%L\)) %n]]></pattern>
            <!-- @formatter:on -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- ルートロガー設定 -->
    <root level="DEBUG">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>
```

ちなみに `%C` 部分が無くても `()` でファイル名と行番号を囲えば Clickable になることもあるが、その場合同名ファイルがあった場合ユーザー選択が必要になってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/c67c5f2c-59fb-44d9-aeef-f0e0e30259f0.png)


直前に FQCN を書いておけばよしなに扱ってくれる。
Gitでタグ（tag）からブランチを作る

## 例：v1.0.0 というタグからブランチを作る場合
```bash
git checkout -b new-branch-name v1.0.0
```
これで v1.0.0 タグが指しているコミットを基点にして new-branch-name というブランチができる。

## ポイント補足
タグには「軽量タグ」と「注釈付きタグ」があるけど、どちらでもブランチ作成はOK。

作ったブランチで作業して push したい場合は：

```bash
git push origin new-branch-name
```
VBA　ファイルを開いたときに自動で関数を非表示にする

①まずは、thisworkbookに下記コードを張り付け

Private Sub Workbook_Open()
    Call SecretProtect
End Sub



➁モジュール1に以下貼り付け

Option Explicit

Public Sub SecretProtect()
    On Error GoTo ManualExecution

    ' ▼自動実行か判定
    If Application.Caller = "" Then
        ' 自動実行時のみ処理を行う
        Call RealProtectProcess
    End If
    Exit Sub

ManualExecution:
    ' エラー時の処理 (メッセージを表示せず、ただ終了する)
    Exit Sub
End Sub


Public Sub RealProtectProcess()
    Dim ws As Worksheet
    Dim hiddenSheet As Worksheet
    Dim cell As Range
    Dim t As Double

    ' 開始時間を記録
    t = Timer

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set ws = ThisWorkbook.Sheets("") '任意のシート名

    ' 設定用の隠しシートがなければ作成
    On Error Resume Next
    Set hiddenSheet = ThisWorkbook.Sheets("HiddenConfig")
    On Error GoTo 0

    If hiddenSheet Is Nothing Then
        Set hiddenSheet = ThisWorkbook.Sheets.Add(After:=ws)
        With hiddenSheet
            .Name = "HiddenConfig"
            .Visible = xlSheetVeryHidden
            .Range("A1").Value = "設定データ"
        End With
    End If

    ' シート保護解除
    ws.Unprotect Password:="mypassword"

    ' 全体ロック＋数式表示ONに戻す
    ws.Cells.Locked = True
    ws.Cells.FormulaHidden = False

    ' 関数が入っているセルを検索して非表示＆ロック
    For Each cell In ws.UsedRange
        If cell.HasFormula Then
            cell.Locked = True
            cell.FormulaHidden = True
        End If
    Next cell

    ' 入力セルは解除（例: B1:B10）
    With ws.Range("B1:B10")
        .Locked = False
        .FormulaHidden = False
    End With

    ' 保護再設定
    ws.Protect Password:="mypassword", UserInterfaceOnly:=True

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    ' 処理時間を出力
    Debug.Print "SecretProtect 実行時間: " & Format(Timer - t, "0.000") & " 秒"
End Sub