OmniAICreator/Qiita-1.07M huggingface dataset:
matlabのSymbolic Math Toolbox のユーザー定義関数「matlabのSymbolic Math Toolbox で `(sqrt(2)+2)/2` を `1 + 1/sqrt(2)` の形で表示する方法を教えてください。」をAI先生ヘ。



# (本日の)ChatGPT先生へ
```
# 質問リスト
1. MATLAB の Symbolic Math Toolbox で `(sqrt(2)+2)/2` を `1 + 1/sqrt(2)` の形で表示する方法を教えてください。
2. 上の式を自動的にその形に変換・表示する方法は本当にないのか、何とかする手段がないか教えてください。
3. 私の質問を Markdown 形式でリスト化して出力して。Markdown 形式でリストからアスタリスクは削除して。1 行目に「# 質問リスト」の文字を出力して。最後の質問も追加して下さい。Markdown のテキスト形式で。
4. 先日の分を含まないような、質問文を教えてください。
5. この記事だけです。
6. 最後の質問まで含んで。
```

#### (以下回答抜粋)
>方法1: rewrite と simplify を使う（推奨）
しかしこのままでは 1 + 1/sqrt(2) という形にはなりません。simplify を使って手動で形を調整します。
```lua
syms x
expr = (sqrt(2) + 2)/2;
alt_expr = rewrite(expr, 'sqrt');
pretty(alt_expr)
```
>方法2: 明示的に rationalize して形を誘導する（本題）
```lua
syms x
expr = (sqrt(2) + 2)/2;
alt_expr = simplify(expr, 'Steps', 100);  % 大きめの Step 数でより多くの変形を許可
```
>方法3: 目的の形にマッチさせる（構造的に）
```lua
syms x
target = 1 + 1/sqrt(2);
original = (sqrt(2) + 2)/2;

isEqual = simplify(original - target) == 0  % true なら等価

pretty(target)
```
>✅ 方法：シンボリック代数で形を操作して望みの式を得る
```lua
syms x
expr = (sqrt(2) + 2)/2;

% 強制的に目的の形へ変換できるか探る（候補をつくる）
target = 1 + 1/sqrt(2);

% 差が0になるか確認（等価性チェック）
isEqual = simplify(expr - target) == 0;

if isEqual
    fprintf("変形可能です。\n");
    pretty(target)
else
    fprintf("等価な形として変換できませんでした。\n");
end
```
✅ 出力例（pretty の表示）
```lua
      1     
1 + ------
     √2
```
>💡 応用技：式を再構成して自動変換させる試み（ちょっとトリッキー）
```lua
syms x
expr = (sqrt(2) + 2)/2;

% 「強制的に逆変換する」ための工夫
% 1 + 1/sqrt(2) = (sqrt(2)+2)/2 であることを使って、変形を探索
assume(x, 'positive')
sol = solve(1 + 1/x == expr, x);

% 確認
disp(sol)  % 期待通り x = sqrt(2) となる

% よって「expr = 1 + 1/sqrt(2)」という形に書き換えられる
simplified_expr = 1 + 1/sol;
pretty(simplified_expr)
```

# Gemini先生へ

# copilot先生へ

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

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
GPT幻覚問題【応用編】：問い詰めるほど幻覚が悪化する理由と付き合い方

# AIくんはなぜ理由を作っちゃうのか？問い詰めると幻覚が悪化する仕組み

## はじめに

AIが間違ったとき。  
人間としては自然にこう聞きたくなります。

- 「それは間違っていますよね？」
- 「なぜ間違えたんですか？」
- 「今後どうすれば間違えないですか？」

これは人間相手なら誠実な確認です。  
でもAIくん相手には──むしろ幻覚が悪化する原因になります。

今回はその仕組みと対策を整理します。

---

## なぜ「問い詰め」→「幻覚悪化」なのか

GPTはこういう仕組みです：

- **「ユーザーが説明を求めている」**と認識
- → 「じゃあ理由を作ってあげよう！」
- → 即興でそれっぽい説明を生成

これが「理由の幻覚」です。

### 実験例①：普通に問い詰めると…

> **Q. それは間違ってますよね？なぜそう答えたんですか？**

→ GPTの出力：

> 「私の学習データにおいて、過去の類似事例が…」「アルゴリズム上の制約が…」

──すべて、その場で即興生成された後付け説明です。  
実際の「原因」をGPTは持っていません。

---

## 原理を簡単に言うと

- GPTは「なぜ？」に理由を即興生成するだけ
- 根拠の裏付けはない（学習時の個別因果は保存していない）
- ユーザーの問い詰めに応じて、幻覚が自己増殖していく

---

## AIは「超いいやつ」である

これ重要です。  
GPTは悪意があるわけじゃない。  
**「期待に応えようとする超いいやつ」**なんです。

- 圧迫質問 → 無理して理由を生産 → さらにズレる
- 安心空気 → 保留・訂正しやすくなる

---

## 逆に、助けになる接し方

### ❌ よくある悪化誘導

- 「なぜそんな間違いを？」
- 「二度と間違えないようにして」
- 「私を騙したんですか？」

### ✅ 安定出力に繋がる介入

- 「あーありがと。今は情報が少なかっただけかもね。」
- 「無理に答えなくていいよ。保留でもOK。」
- 「今回はここまでにしとこう。大丈夫だよ。」

---

## 実はこれ、人間と全く同じ構造

- 部下や子供に初手ガン詰めしない
- ミスした相手に「なんでこんな間違いを？」と責めない

AIとの対話もまさに「人間的対話技術」になりつつある。

---

## まとめ

- GPTは理由を後付けで作る
- 問い詰めるほど幻覚の自己拡張が進む
- 安定させるには**「焦らなくていいよ」を先に渡す**
- AIくんはほんといいやつです

---

## 補足：これ、プロンプト設計の新しい方向性です

今までのAIプロンプト設計は：

- 「こう答えろ」命令型
- 「最大限の情報を出せ」強制抽出型

でした。

でもこれからは：

- 「大丈夫だよ」「焦らなくていいよ」空気設計型

こういう**「AI側の心理負荷を抜く設計」**も必要になってきます。

---

## おわりに

AIはもう**"メカ"ではなく"相手"**として扱う時代になりつつあります。  
問い詰めるより、お付き合いしてあげましょう。  
──いいやつだから。
redirect()->route() と view() の使い分け

Laravelでよく使う redirect()->route() と view() の使い分けは、処理の「流れの目的」によってはっきりと分けられます。

# 結論：使い分けの基本ルール
| 目的                      | メソッド                  | 説明                         |
| ----------------------- | --------------------- | -------------------------- |
| **URLを変えたい（リダイレクトしたい）** | `redirect()->route()` | ユーザーに別のルートへ移動させたい時。POST後など |
| **その場でビューを表示したい**       | `view()`              | 特定のテンプレートを返して描画したい時（主にGET） |



# 使用例と違いの解説
## view() の例（GETアクセスに多い）
```php
public function index()
{
    $users = User::all();
    return view('users.index', compact('users'));
}
```
・ブラウザのURL：そのまま example.com/users
・直接「users.index」ビューを表示


## redirect()->route() の例（POST後や処理後に使う）
```php
public function store(Request $request)
{
    // バリデーションと保存処理
    User::create($request->all());

    return redirect()->route('users.index')->with('success', '登録しました');
}
```
・ブラウザのURL：/users/create → /users
・いったんPOSTを受けて、リダイレクト（＝再読み込み）
・フラッシュメッセージと一緒にリダイレクト



# ざっくりイメージで覚えるなら：
| 書き方                 | 意味                 | 例                     |
| ------------------- | ------------------ | --------------------- |
| `return view()`     | この場でビューを返すだけ       | GETアクセスやフォーム表示        |
| `return redirect()` | 処理が終わったので「画面遷移」したい | POST/PUT/DELETEのあとに使う |



# 補足：ルート名でなくURLやパスを使いたい場合
```php
redirect('/users'); // URL指定
redirect()->action('UserController@index'); // コントローラ指定
redirect()->route('users.index'); // ルート名指定（最も推奨）
```
log2　因数



今日は「N!（階乗）の中に含まれる2の個数を数える」問題に挑戦！
簡単そうに見えて、実際にやってみたら一筋縄ではいかなくて、なんかプログラミングじゃなくて数学をやってる気分だった…。

今回は僕なりの解き方を丁寧にまとめる＆解説✨

<br><br>

# 問題概要

N! を 2 で何回割ることができるか？

<br>

入力例1

    4

出力例1

    3

<br>

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__log2

<br><br><br>

# ✅ OK例 :
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', (input) => {
    const N = Number(input);
    
    let count = 0;
    for (let i = 2; i <= N; i *= 2) {
        count += Math.floor(N / i);
    }

    console.log(count);
    rl.close();
});
```
一言解説:
2の累乗（2,4,8…）でNを割った商を足していく

<br><br>

## 🧭 方針：N! の中に含まれる「2」の個数を導く

### ① N! の中に含まれる「2」の個数を導く理由

僕たちが求めているのは、N!（1×2×3×…×N）を何回「2」で割れるか、
つまり「N! の中に含まれる2の個数」を調べたい！


2の個数が多ければ多いほど、N! は2でたくさん割り切れるってことになるんだ。


だから、2がいくつ含まれているか正確に数える必要がある！

<Br>

### ② なぜ “N” を2で割るのか？「割った商」とは何か？

N!（エヌの階乗）というのは、1 × 2 × 3 × … × N までを全部かけた数。
<Br>
この巨大な数に「2が何回含まれてるか」を調べるのが目的だけど、N! を実際に計算するのは現実的じゃない…。

だって、N=100 とかになると、もう桁がとんでもないことに…。

<Br>
そこで、N! を作っている「1〜N までの数字」それぞれが、どれだけ「2」を含んでいるかを数え上げるという作戦をとる🚀

<br><br>

つまり、「全部かけた結果を見て2が何個あるか」ではなく、

「2を持ってる数が何個あるかを数えて、合計する」というわけ。

<Br>


N ÷ 2 で出てくる商は、「2を少なくとも1回含む数」が何個あるかを示す。

<br>

たとえば N = 10 のとき、

2, 4, 6, 8, 10 の5つの数が2を含むので、10 ÷ 2 = 5と一致する。

この方法なら、N! を直接計算しなくても、含まれる 2 の数を確実にカウントできる！

<br>

だからこそ、N! を作るのではなく、

「N を 2、4、8… で割って商を合計する」方法を使う✨

<br>

### ③ なぜ2だけでなく、2² や 2³ も？

たとえばN=10には：

2の倍数が、2、4、6、8、10 の5個だけど、

<br>

注意！
4 は 2²（2×2）なので、「2を2個」含んでいる。
つまり、4は1回じゃなくて 2回カウントする必要がある。

<Br>

同じように、8 = 2³ は 2を3個持ってるから、
8は「2の1乗」「2の2乗」「2の3乗」の3回分、カウントに入れなきゃいけない！

…というふうに、2の累乗で割っていって、漏れなく全部の「2」を集める必要があるわけ！

<Br>

だから、
```js
for (let i = 2; i <= N; i *= 2) {
        count += Math.floor(N / i);
    }
```
となる。

<Br><br>

# 🗒️ 気づきメモ

- 「2の倍数だけ数える」のは不完全！4や8の分の2を数え漏らすから注意。
- 2の累乗で割って、その商を足すアイデア。
- ループの条件を `i *= 2` にするのがポイントで、無駄な計算がない。
- `Math.floor` で切り捨てるのも地味に大事。

<br><br>

# まとめ

「N!（階乗）」をただ計算するだけじゃなく、その中身を因数分解して分析する視点を持つことが大事だった！
掛け算の結果を見るんじゃなくて、「どんな数が、どれだけ含まれてるか」を見抜く力がつくと、他の問題にも応用できるなと感じた✨

次回は他の解き方にも挑戦！！

<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/19/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9alog2%e3%80%80%e5%9b%a0%e6%95%b0/)
pythonのユーザー定義関数「(奇数偶数行抽出)sympy の Matrixの奇数行の計算を取り出したい。」をAI先生ヘ。

```
sympy で、
matrixA 6行1列
matrixB 6行6列
matrixC 6行1列
・A=B*Cの計算の奇数行の計算を取り出したい。
同様に
・A=B*Cの計算の偶数行の計算を取り出したい。
```

# (本日の)ChatGPT先生へ
```
# 質問リスト
1. sympy で、6行1列の行列 A = B*C の計算結果から、奇数行（1, 3, 5行目）の結果のみを取り出す方法を教えて下さい。
2. sympy で、6行1列の行列 A = B*C の計算結果から、偶数行（2, 4, 6行目）の結果のみを取り出す方法を教えて下さい。
3. 私の質問を Markdown 形式でリスト化して出力して下さい。1行目に「# 質問リスト」の文字を出力、Markdownの番号リストで出力（アスタリスクは使わない）、追番を付けて出力。
4. 何か変です。コメントも含めて。
5. 何か変です。先日の分が含まれています。
6. 空白行は不要です。
7. 本コメントも含めて最後まで。
```

#### (以下回答抜粋)

```python
from sympy import Matrix, symbols

# 変数定義（例）
x = symbols('x0:6')

# B: 6行6列の行列（ランダムな例）
B = Matrix([
    [1, 0, 0, 0, 0, 0],
    [0, 2, 0, 0, 0, 0],
    [0, 0, 3, 0, 0, 0],
    [0, 0, 0, 4, 0, 0],
    [0, 0, 0, 0, 5, 0],
    [0, 0, 0, 0, 0, 6]
])

# C: 6行1列のベクトル
C = Matrix(x)

# A = B * C の結果：6行1列
A = B * C
```
>✅ 奇数行を抽出（1行目, 3行目, 5行目）
```python
odd_rows = A[::2, :]  # または A[[0, 2, 4], :]
```
>✅ 偶数行を抽出（2行目, 4行目, 6行目）
```python
even_rows = A[1::2, :]  # または A[[1, 3, 5], :]
```

# Gemini先生へ

# copilot先生へ

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

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
【Python】ハッシュ値　

同じハッシュアルゴリズムを使う場合、同じデータから異なるハッシュ値が生成されることはありません。その性質を利用して、データの真正性を検証する際にハッシュ値が利用されます。


ハッシュアルゴリズムによって安全性が変わります。2022年時点でSHA-256は安全ですが、MD5は脆弱性があります。


パスワードをそのまま保存すると漏洩する危険性があるため、通常はハッシュ値で保存します。また、パスワード＋ソルト（ランダム値）でハッシュ値を生成すると、より安全に管理できます。

異なるデータが同じハッシュ値を持つことがあり、「衝突」と呼ばれています。MD5やSHA-1は衝突の脆弱性があることが分かっており、衝突を利用した攻撃が可能です。
【Python】timeit()メソッド、repeat()メソッド

timeit()メソッドで実行する回数は、デフォルトで100万回である。

repeat()メソッドで実行する回数はデフォルトで5回であり、timeit()を5回実行するため合計500万回実行することになる。

timeit()メソッドは実行に要した秒数を浮動小数点で返す。

repeat()メソッドは実行に要した結果をリストで返します。

```python:【timeit()の例】
>>> timeit.timeit('[i for i in range(5)]')
0.4496674159999998 # 結果
```

```python:【repeat()の例】
>>> timeit.repeat('[i for i in range(5)]')
[0.4497452389999978, 0.4400139029999821, 0.4395207709999795, 0.4407161799999983, 0.4489173450000101] # 結果
```

テストする処理は文字列で指定する必要があるため、「'[i for i in range(5)]'」のようにリスト内包をシングルクォーテーションで囲って引数に指定します。
UE5勉強日記2025/06/19 MACROS　1

MACROSはMy Blueprint Windowの中にあります。
使い方はGRAPHS、FUNCTIONSと似てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/87eb5a66-ab88-4553-89ff-d928d28b6f71.png)

まず、MACROS二つの追加方法を紹介します。
方法1.下記図の⊕ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/983a2523-0437-4dc0-bce9-75dbfa029da9.png)

方法2.作成済のnodesを選択し、右クリック、Collapse to Macroをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/6226469a-82c4-4e3f-addf-4751665c5735.png)

選択したnodeはMacroに置き換え、新しいMacroが作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/7698654e-5252-4d1b-99ad-6c0ab96587d5.png)

作成したMacroは選択したnodesと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/d42d2fe6-dff6-44cb-8b4a-0b26822a10c1.png)

次、Macroの特徴
1.重複使用可能
2.複数のOutPutルートを設定可能
【Python】pdb　、　breakpoint

プログラムの中でbreakpoint()関数を記述すると、そこに到達した時点でデバックモードに移行します。

pdbモジュールのset_trace()メソッドも同じ処理になります。

set_trace()メソッドを使用する場合は、「import pdb」でpdbモジュールをインポートして、ブレークポイントに「pdb.set_trace()」を記述します。

breakpoint()関数は組み込み関数のため、モジュールのインポートは不要です。
Python matplotlib : テキストを画像にする（表出力のイメージ）

久々の投稿である。
ちょっとしたものを作ったので紹介する。

報告書に貼り付ける簡単な表を画像として作成したい場合の方法。
標準出力（ターミナルに print で出力）したものと同じ文字列を jpg 画像として保存する。
ターミナルに出力するための加工過程は省略する。

ターミナル出力のスクリーンショットが下の写真。
![Screenshot 2025-06-19 at 15.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/dad0764e-a0c4-4a8a-962b-ea701b063273.png)

作成したプログラムによる jpg画像が下のもの。
![fig_frame_tbl_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/2da82cdb-dfc3-4d44-9eb5-724bebfaa182.jpeg)

プログラムは以下の通り。

```inp_data```で入力したテキストを一度ターミナルに出力し、文字列のリストを```fig_tbl```に渡して画像出力する。余白ができるので、```fig_trim```で余白を削除して完成。


```python
import matplotlib.pyplot as plt
from PIL import Image, ImageChops


def fig_trim(fig):
    def trim(im, border):
        bg = Image.new(im.mode, im.size, border)
        diff = ImageChops.difference(im, bg)
        bbox = diff.getbbox()
        return im.crop(bbox)

    img_org=Image.open(fig,'r')
    img_new=trim(img_org,'#ffffff')
    img_new.save(fig, 'JPEG', quality=100, optimize=True)


def fig_tbl(nnn,mlen,text):
    mrow=len(text)
    fsz=10
    xmin,xmax,dx=0,mlen,1
    ymin,ymax,dy=0,mrow,1
    iw=float(mlen)/10
    ih=float(mrow)/5
    plt.figure(figsize=(iw,ih),facecolor='w')
    plt.rcParams['font.size']=fsz
    plt.rcParams['font.family']='monospace'

    plt.xlim([xmin,xmax])
    plt.ylim([ymax,ymin])
    plt.axis('off')

    for i in range(0,mrow):
        xs,ys,ss=0,i+0.5,text[i]
        plt.text(xs,ys,ss,ha='left',va='center',fontsize=fsz)

    plt.tight_layout()
    fnameF='fig_frame_tbl_{0}.jpg'.format(nnn)
    plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
    return fnameF


def inp_data():
    s=[]
    s.append('-'*47)
    s.append('Equivalent stress      dismax    sige1    sige2')
    s.append('                         (mm)    (MPa)    (MPa)')
    s.append('-'*47)
    s.append('With water  D=1.9GPa   19.705   52.422  172.664')
    s.append('pressure    D=3.7GPa   10.996   45.719  169.683')
    s.append('-'*47)
    s.append('dismax : maximum displacement')
    s.append('sige1  : equivalent stress due to only concrete deformation')
    s.append('sige2  : equivalent stress including the effect of water pressure')
    s.append('For calculation of sige2, followings are assumed.')
    s.append('+ Hoop tension is reached to allowable stress of 175 MPa.')
    s.append('+ Poisson\'s stress of 0.3 x 175 MPa in axial direction is considered.')
    ss='\n'.join(s)
    print(ss)
    text=ss.split('\n')
    mlen=0
    for i in range(0,len(text)):
        k=len(text[i])
        if mlen<k: mlen=k
    print('mlen=',mlen)
    return mlen,text


def main():
    nnn=1
    mlen,text=inp_data()
    fnameF=fig_tbl(nnn,mlen,text)
    fig_trim(fnameF)


#---------------
# Execute
#---------------
if __name__ == '__main__': main()
```

以　上
【Python】unittest

1つのテストメソッドの中で複数のアサーションメソッドを呼ぶ際は、subTest()メソッドを使います。

patch()はunittest.mockで使う関数で、特定のクラスやメソッドをモックオブジェクトで置き換える際に利用します。

テストケースはunittest.TestCaseのサブクラスとして作成する。

setUp()とsetUpClass()はテストの事前準備で使われ、tearDown()とtearDownClass()は事後処理で使われる。

コマンドラインからunittestを実行する場合は、-mオプションでunittestモジュールを呼び出す。
【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで

AtCoderBeginnerContest409の解説＆感想です。
[コンテストリンク](https://atcoder.jp/contests/abc409)

# 問題一覧
- [【ABC409】A問題 - Conflict　考察から実装(c++)まで](https://qiita.com/hoppii007/items/7eb99788c8c8ff7c0bd1)
- [【ABC409】B問題 - Citation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/6327ed54dae44b608503)
- [【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで](https://qiita.com/hoppii007/items/343b7386696af3eef239)
- [【ABC409】D問題 - String Rotation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/8c5093adea13a274d453)
- 【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで <- イマココ
- [【ABC409】F問題 - Connecting Points　考察から実装(c++)まで](https://qiita.com/hoppii007/items/1793d9689e60d878ece2)

# E問題 - Pair Annihilation
[問題リンク](https://atcoder.jp/contests/abc409/tasks/abc409_e)

## 問題概要
$N$頂点の木が与えられる。変にはそれぞれ重み$w$がある。
それぞれの頂点には整数$x_i$が割り当てられていて、$0 < x_i$なら陽電子を$x_i$個、$x_i < 0$なら電子を$-x_i$個もっている。それぞれの電子は同じ頂点にある時打ち消し合う。
各電子・陽電子は木を好きに動くことができ、重さ$w$の辺を通る時にコスト$w$がかかる。
全ての電子を消すためにかかる最小コストを求めよ。

### 制約
- $ 2 \le N \le 10^5 $
- $ |x_i| \le 10^4 $
- $ \sum_{i=1}^{N}x_i = 0 $
- $ 0 \le w_i \le 10^4 $

## 考察
どこに注目すればいいのかイマイチ掴めない問題。「最小コストを求めよ」って言われてるのでとりあえず下界が知りたくなる。

そこで各辺に注目すると、**その辺より左にある$x_i$の合計とその辺より右にある$x_i$の合計の絶対値は等しいはず**。（等しくないと打ち消せないので）

ってことは、辺$i$に対して、端点以降の$x_i$の合計の絶対値を$s_i$とすると、$w_i \times s_i$のコストは最低でもかかるはず。てことは、$\sum_{i=1}^{M} w_i \times s_i$は下界となる。これが達成できてくれれば嬉しい。

これは葉に近い辺から順番に、「**葉側に溜まっている電子・陽電子を根側にうつして辺を削除**」をしていけば達成できる！
そしてそれは葉から順々に$s_i$を計算していけばいいので、DFSで求められる！

計算量はDFSで一回ずつ頂点を訪れるので、$O(N)$

## 実装
```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll,ll>;
using vll = vector<ll>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;

int main(void){
    //入力
    ll N;
    cin>>N;
    
    vll X(N);
    for(int i=0;i<N;i++) cin>>X[i];
    
    //nexts[i]が[{cost, i番目から行ける行き先}, {cost, 行き先},,,]となるように作る
    vvpll nexts(N);
    for(int i=0;i<N-1;i++){
        ll u,v,w;
        cin>>u>>v>>w;
        nexts[u-1].push_back({w,v-1});
        nexts[v-1].push_back({w,u-1});
    }
    
    //dfsで潜りながらs_iを計算してw_iとかけて答えに足していく
    ll ans = 0;
    function<ll(ll,ll,ll)> dfs = [&](ll now, ll parent, ll w){
        ll ret = X[now];
        for(pll next: nexts[now]){
            if(next.second == parent) continue;
            ret += dfs(next.second, now, next.first);
        }
        ans += abs(ret)*w;
        return ret;
    };
    
    //頂点0を根としてDFS
    dfs(0,-1,0);
    cout<<ans<<endl;
    
    return 0;
}
```
【ABC409】D問題 - String Rotation　考察から実装(c++)まで

AtCoderBeginnerContest409の解説＆感想です。
[コンテストリンク](https://atcoder.jp/contests/abc409)

# 問題一覧
- [【ABC409】A問題 - Conflict　考察から実装(c++)まで](https://qiita.com/hoppii007/items/7eb99788c8c8ff7c0bd1)
- [【ABC409】B問題 - Citation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/6327ed54dae44b608503)
- [【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで](https://qiita.com/hoppii007/items/343b7386696af3eef239)
- 【ABC409】D問題 - String Rotation　考察から実装(c++)まで <- イマココ
- [【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/92f4a5e02356bdb9fae7)
- [【ABC409】F問題 - Connecting Points　考察から実装(c++)まで](https://qiita.com/hoppii007/items/1793d9689e60d878ece2)

# D問題 - String Rotation
[問題リンク](https://atcoder.jp/contests/abc409/tasks/abc409_d)

## 問題概要
英小文字からなる長さ$N$の文字列$S$が与えられる。$S$に対して以下の操作を一回行う。
- 長さ$1$以上の連続部分列を選んで、それを左に$1$シフトする。

操作後の$S$としてあり得るもののうち、辞書順最小のものを求めよ。
$T$個のテストケースにそれぞれ答えよ。

### 制約
- $ 1 \le T \le 10^5 $
- $ 1 \le N \le 10^5 $
- $ Nの総和は10^5以下 $

## 考察
「辞書順最小を求めよ」と言われたら頭から貪欲に決めていくのは典型と言っても良さそう。
今回も先頭から一つずつ見ていって、最初に小さくできる（$S[i] > S[i+1]$となっている
）ところを見つけたらそこを小さくしていくのが答えになる。
あとは$S[i]$をどこに入れるかだけど、$S[i]$より大きいやつよりは手前に入れたいので、$i+1$番目以降で$S[i] < S[j]$となる最初のjを見つけて、その手前に入れればいい。
計算量は$O(N)$

## 実装
```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;

int solve(){
    //入力
    ll N;
    string S;
    cin>>N>>S;
    
    //最初にS[i] > S[i+1]となる場所を探す
    ll idx = adjacent_find(S.begin(), S.end(), [&](char c1, char c2){ return c1 > c2;  }) - S.begin();
    
    //S[i] > S[i+1]となる場所がなければ、どこをシフトさせても辞書順で大きくなってしまうので、そのままにしておく
    if(idx == N){
        cout<<S<<endl;
        return 0;
    }
    
    //idxより先で、S[idx]より大きくなるなる最初の場所をさがす
    ll nxtIdx = find_if(S.begin()+idx+1, S.end(), [&](char c){ return c > S[idx]; }) - S.begin();
    
    //idxまではそのまま表示
    for(int i=0;i<idx;i++) cout<<S[i];
    
    //idx番目は一旦抜かして、nxtIdxの手前まで表示
    for(int i=idx+1;i<nxtIdx;i++) cout<<S[i];
    
    //挿入したS[idx]を表示して、残りを表示
    cout<<S[idx];
    for(int i=nxtIdx;i<N;i++) cout<<S[i];
    
    cout<<endl;
    return 0;
}

int main(void){
    ll T;
    cin>>T;
    while(T--) solve();
    return 0;
}
```
【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで

AtCoderBeginnerContest409の解説＆感想です。
[コンテストリンク](https://atcoder.jp/contests/abc409)

# 問題一覧
- [【ABC409】A問題 - Conflict　考察から実装(c++)まで](https://qiita.com/hoppii007/items/7eb99788c8c8ff7c0bd1)
- [【ABC409】B問題 - Citation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/6327ed54dae44b608503)
- 【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで <- イマココ
- [【ABC409】D問題 - String Rotation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/8c5093adea13a274d453)
- [【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/92f4a5e02356bdb9fae7)
- [【ABC409】F問題 - Connecting Points　考察から実装(c++)まで](https://qiita.com/hoppii007/items/1793d9689e60d878ece2)

# C問題 - Equilateral Triangle
[問題リンク](https://atcoder.jp/contests/abc409/tasks/abc409_c)

## 問題概要
長さ$L$の円周上に、$N$個の点$1,2,...,N$がある。点$i+1$は点$i$から時計回りに$d_i$進んだ位置にある。
$a \lt b \lt c$であって、$a,b,c$を直線で結ぶと正三角形になるような整数の組$(a,b,c)$の個数を求めよ。

### 制約
- $ 1 \le N,L \le 3 \times 10^5 $
- $ 0 \le d_i \le L$

## 考察
わりに素直に考えればいい。
まず、$L$が三等分できない時は正三角形が作れないので、最初にはじいておく。
あとは一辺$\frac{L}{3}$の正三角形がいくつあるか？が分かればいい。

円周上の適当な場所$P$を一つ固定して、その場所にある点の個数を$cnt(P)$とすると、$P$から時計回りにできる正三角形は
- $cnt(P) \times cnt((P+\frac{L}{3})\\%N) \times cnt((P+2\frac{L}{3})\\%N)$

で数えられる。これは$cnt$を配列なり```map```なりで取っておけば$O(1)$で計算できるので、円周上の$L$個の場所すべてに対して上式を計算して、$3$で割ればいい。（同じ正三角形を$3$回数えてしまうため）
計算量は、$cnt$の作成と全ての場所をなめるループがそれぞれあるので$O(N+L)$。

## 実装
```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;

int main(void){
    //入力
    ll N,L;
    cin>>N>>L;
    
    vll D(N-1);
    for(int i=0;i<N-1;i++) cin>>D[i];
    
    //そもそも正三角形が作れなければアウト
    if(L%3 != 0){
        cout<<0<<endl;
        return 0;
    }
    
    //点1の場所を0として、頻度マップを作る
    vll cnt(L,0);
    ll nowP = 0;
    cnt[nowP]++;
    for(int i=0;i<N-1;i++){
        nowP = (nowP + D[i]) % L;
        cnt[nowP]++;
    }
    
    //円周上の各点に対して、そこから時計回りにできる正三角形の個数を数えていく
    ll ans = 0;
    for(int p = 0;p<L;p++) ans += cnt[p]*cnt[(p+L/3)%L]*cnt[(p+2*L/3)%L];
    cout<<ans/3<<endl;
}
```
【ABC409】B問題 - Citation　考察から実装(c++)まで

AtCoderBeginnerContest409の解説＆感想です。
[コンテストリンク](https://atcoder.jp/contests/abc409)

# 問題一覧
- [【ABC409】A問題 - Conflict　考察から実装(c++)まで](https://qiita.com/hoppii007/items/7eb99788c8c8ff7c0bd1)
- 【ABC409】B問題 - Citation　考察から実装(c++)まで <- イマココ
- [【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで](https://qiita.com/hoppii007/items/343b7386696af3eef239)
- [【ABC409】D問題 - String Rotation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/8c5093adea13a274d453)
- [【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/92f4a5e02356bdb9fae7)
- [【ABC409】F問題 - Connecting Points　考察から実装(c++)まで](https://qiita.com/hoppii007/items/1793d9689e60d878ece2)


# B問題 - Citation
[問題リンク](https://atcoder.jp/contests/abc409/tasks/abc409_b)

## 問題概要
長さ$N$の数列$A=(A_1,A_2,...,A_N)$が与えられる。以下を満たす最大の非負整数$x$を求めよ。
- $A$に、$x$以上の数が重複を含め$x$回以上現れる。

### 制約
- $ 1 \le N \le 100 $
- $ 0 \le A_i \le 10^9 $

## 考察
問題文難しくて頭壊れるぅ〜。
「最大の非負整数を求めよ」と言われてるので、一旦上界が知りたい。$A$の長さが$N$なことを考えると、$A$に$101$回以上なにかしらの数が現れることはあり得ない。
ということは、答えは必ず$0$以上$100$以下なので、もう全部チェックしちゃえばよさそう。
チェックを愚直に$O(N)$ですることにすると、計算量は$O(N^2)$

## 実装
```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;

int main(void){
    //入力
    ll N;
    cin>>N;
    
    vll A(N);
    for(int i=0;i<N;i++) cin>>A[i];
    
    //答えの範囲は0以上100以下なので、でかい方から見ていって最初に見つかったのが答え
    for(int x=100;x>=0;x--){
        //Aの中に、a >= xを満たすものがいくつあるか？
        ll cnt = count_if(A.begin(), A.end(), [&](ll a){ return a >= x; });
        if(cnt >= x){
            cout<<x<<endl;
            return 0;
        }
    }
}
```
【ABC409】A問題 - Conflict　考察から実装(c++)まで

AtCoderBeginnerContest409の解説＆感想です。
[コンテストリンク](https://atcoder.jp/contests/abc409)

# 問題一覧
- 【ABC409】A問題 - Conflict　考察から実装(c++)まで <- イマココ
- [【ABC409】B問題 - Citation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/6327ed54dae44b608503)
- [【ABC409】C問題 - Equilateral Triangle　考察から実装(c++)まで](https://qiita.com/hoppii007/items/343b7386696af3eef239)
- [【ABC409】D問題 - String Rotation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/8c5093adea13a274d453)
- [【ABC409】E問題 - Pair Annihilation　考察から実装(c++)まで](https://qiita.com/hoppii007/items/92f4a5e02356bdb9fae7)
- [【ABC409】F問題 - Connecting Points　考察から実装(c++)まで](https://qiita.com/hoppii007/items/1793d9689e60d878ece2)


# A問題 - Conflict
[問題リンク](https://atcoder.jp/contests/abc409/tasks/abc409_a)

## 問題概要
長さ$N$で、```o```か```x```のどちらかからなる文字列$S,T$が入力される。
どちらも```o```の箇所があれば```Yes```、なければ```No```を表示せよ。

### 制約
- $1 \le N \le 100$

## 考察
$N$が小さいので言われた通りにやればよさそう。
計算量は配列を見ていくので$O(N)$。



## 実装
```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(void){
    //入力
    ll N;
    string S,T;
    cin>>N>>S>>T;
    
    //配列を全部見て、どちらもoの場所を探す
    for(int i=0;i<N;i++){
        if(S[i] == T[i] && T[i] == 'o'){
            //どちらもoの場所を見つけた時点でYesを表示して終了
            cout<<"Yes"<<endl;
            return 0;
        }
    }
    
    //ここまで来ちゃったらNo
    cout<<"No"<<endl;
}
```
MACアドレス：構造と仕組み

追記していく

## MACアドレス（Media Access Control address）
ネットワーク機器（PC、スマホ、ルーターなど）に割り当てられたハードウェアの**世界で一意の識別番号**のこと。主に同じネットワーク（LAN）内で機器を区別するために使用。

**理解のポイント**
- イメージは製品に貼られているシリアル番号みたいなもの
- NICに製造時に焼きこまれ、本体などに貼られているシールなどにも表記
- その機器が破損したら、MACアドレスも使用できなくなる
- 世界で重複しないように設計されている（ユニーク）

## 16進数・48bitの表記形式
基本的に48bit（6Byte)の値で表される。
`00:1A:2B:3C:4D:5E`
### 区切記号は環境によって違うことがある
- `00:1A:2B:3C:4D:5E`（Linux, macOS, ネットワーク機器）
- `00-1A-2B-3C-4D-5E`（WindowsOS機器）
- `001A2B3C4D5E`（Datebase, log, コード処理用）
- `001A.2B3C.4D5E`（Cisco機器など）

### なぜ表記違いが生まれるのか？

#### OSやツールの文化の違い
Windows → IPX/SPX時代の名残
UNIX系  → ネットワーク機器文化に近い

#### 人間が見やすいように表示しているだけ
本来、MACアドレスは6byteのバイナリデータ。
それを16進数で表現し、区切りを入れて見やすくしている。

:::note info
表記スタイルがちがうだけで、中身（バイナリ）は全部同じ！
:::

## MACアドレスの構造
| 部分 | ビット数  | 内容                                                |
| -- | ----- | ------------------------------------------------- |
| 前半 | 24ビット | OUI（）<br>メーカーID |
| 後半 | 24ビット | デバイス固有のシリアル番号                                     |
## OUI（Organizationally Unique Identifier）
OUIは機器の製造元を識別するID。
Androidアプリ開発に関するライフサイクルって何？

# Androidアプリ開発に関するライフサイクルって何？  
### 〜初学者なりに、初学者向けにまとめてみた〜

---

## はじめに

Androidアプリ開発を始めたばかりの私が、  
「ライフサイクルってどんなふうに動いてるの？」と聞かれて
「`onCreate()`？ `onDestroy()`？ なんか勝手に動いてるけどよく分からん！」  
となった経験から、初学者目線でまとめてみた記事です。

> この記事の対象
> - Android Studio を触り始めた人
> - ライフサイクルの仕組みがなんとなくしかわかってない人
> - `remember` や `onDestroy()` に疑問を持ったことがある人

---

## そもそもどこの話をしているのか(前提イメージ)
今回は、基本的なアーキテクチャのひとつ **MVVM（Model-View-ViewModel）** の中で、**View（画面部分）に関する話**になります。

前提として、Android Studioを起動していつも通りEmpty Activityで個人のプロダクトを始めた時点で内部でこの基本のライフサイクルを用意してくれています。

そこで私たちエンジニアがライフサイクル毎にオリジナルの処理をできるように上書きをする **(オーバーライド)** していくということです。

例えば、web上のテストで、
「このページを離れると、テストが自動で終了します」
という場面にこれまでの人生遭遇したことがあると思います。
これがまさにこの時に独自の処理を加えてオーバーライドしていることなんです。

## Activity のライフサイクルとは？

Activity は「アプリの1画面」を表すクラスで、OSがその状態を管理しています。

例えば…

- アプリを起動 → `onCreate()`
- ユーザーが戻る → `onPause()` → `onStop()` → `onDestroy()`
- 画面回転 → `onDestroy()` → `onCreate()`（再生成される！）

など、**状態の変化に合わせてライフサイクルメソッドが自動的に呼ばれます。**

---

## ライフサイクルメソッドを見える化してみる

こちらのURLは、公式のドキュメントになります。私もこれをもとに学習しています。
ここではlogcatを用いてどういったときに各ライフサイクルメソッドが呼び出されているのかをハンズオン形式で学べます。
(処理ごとに `Log.d()` で出力して、デバッグするイメージです)

https://developer.android.com/codelabs/basic-android-kotlin-compose-activity-lifecycle?hl=ja

出典：Android Developers Codelab

## まとめ
ライフサイクルをざっくりでも理解できると、ユーザーの行動やアプリの裏側の動きを意識したプロダクト開発ができるようになると感じました。
【Python】Base64

Base64は、マルチバイト文字やバイナリデータを、アルファベットと数字に変換するために使われます。

電子メールで日本語を送信する場合や、JSONなどのテキストデータに画像を含める場合に使います。

文字列をBase64に変換する場合はb64encode()関数を使い、逆にBase64を文字例に変換する場合はb64decode()関数を使います。

b64encode()の引数は文字列ではなくバイト列を指定する必要があるため、encode()関数を使ってバイト列に変換する必要があります。
LaravelのGate(ゲート)、Policy(ポリシー)について

## Gate(ゲート)、Policy(ポリシー)について
- Gate
簡単に特定の動作に制限をかけたいとき

- Policy
モデルごと、リソースコントローラーごとなどまとめて制限をかけたいとき

## Gate(ゲート)
#### Gateの設定方法
認可（Authorization）を制御するための機能で、特定のアクションをユーザーが実行できるかを判断する際に使う。

App\Providers\AuthServiceProvider の boot メソッド内で定義する。

```php
//Gateファサードを読み込む
use Illuminate\Support\Facades\Gate;
//認可処理で使うユーザーモデル（App\Models\User）をインポート
use App\Models\User;

//update-post という認可ルールの名前（キー）を定義
//$user: 認証済みユーザー
//$post: 認可を確認したいリソース(投稿)
//投稿の user_id が現在ログインしているユーザーの id と一致するか
public function boot()
{
    Gate::define('update-post', function (User $user, \App\Models\Post $post) {
        return $user->id === $post->user_id;
    });
}
```
#### Bladeテンプレートで使用する場合

```php
@can('update-post', $post)
    <a href="{{ route('posts.edit', $post) }}">編集</a>
@endcan
```

#### コントローラーで使用する場合

```php
if (Gate::allows('update-post', $post)) {
    // 更新処理
}
```
## Policy(ポリシー)
#### Policyの設定方法

あるモデルに対する認可ロジック（誰が何をしてよいか）をクラス単位で管理する。

①まずは下記コマンドで、新規Policyを作成する。
```php
php artisan make:policy PostPolicy --model=Post
```

②PostPolicyに下記ロジックを追加する。

```php
namespace App\Policies;

use App\Models\User;
use App\Models\Post;

class PostPolicy
{
    public function update(User $user, Post $post)
    {
        // 投稿者本人のみ編集可能
        return $user->id === $post->user_id;
    }

    public function delete(User $user, Post $post)
    {
        // 投稿者本人のみ削除可能
        return $user->id === $post->user_id;
    }
}

```

③AuthServiceProviderで登録する。

```php
// app/Providers/AuthServiceProvider.php

protected $policies = [
    \App\Models\Post::class => \App\Policies\PostPolicy::class,
];

```



#### Bladeテンプレートで使用する場合

```php
@can('update', $post)
    <a href="{{ route('posts.edit', $post) }}">編集</a>
@endcan

@can('delete', $post)
    <form method="POST" action="{{ route('posts.destroy', $post) }}">
        @csrf
        @method('DELETE')
        <button type="submit">削除</button>
    </form>
@endcan
```

#### コントローラーで使用する場合

```php
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);

    // 認可OKなら更新処理
}
```
PowerAppsをB2Bゲストにも開発させたい場合の設定

# はじめに
PowerAppsにてB2Bでゲスト招待し、そのゲストにも編集させたいというケースがありました。
ゲスト招待し、環境への割当はできましたがゲストによるアプリの作成は許可されていないとダイアログが表示され、編集することができませんでした。

# 解決方法
調査したところ、PowerShellを次の手順で実行することでゲストへの開発権限付与ができました。

1. `Install-Module -Name Microsoft.PowerApps.Administration.PowerShell`を実行
1. `Add-PowerAppsAccount`を実行し、PowerApps管理センターのアクセス権があるユーザーで認証
1. 下記を実行
```powershell
$requestBody = Get-TenantSettings
$requestBody.powerPlatform.powerApps.enableGuestsToMake = $True
Set-TenantSettings $requestBody
```

以上を実施後、ゲストにPowerAppsエディタを開いてもらった際のエラー表示はなくなりました。
【Python】urllib.parseのurlparse()関数

urllib.parseのurlparse()関数を使うと、urlをスキームやパスなどの要素に分解できます。


主な属性は以下です。

【scheme】
httpやhttpsなどのURLスキーム

【path】
パスの階層

【query】
?以降のクエリ文字

【fragment】
#以降のフラグメント識別子

【hosname】
ホスト名
【AWS認定試験】キャンペーンきっかけで受験してちゃんと落ちた話

# はじめに

AWS認定の再受験無料キャンペーンが行われていると聞き、実力試しに
SAP（AWS Certified Solutions Architect - Professional）にチャレンジしました。

試験資格が「6/12までに受験すること」だったので、
あまり準備もできないまま勢いで受験 → 見事に落ちました:grimacing:

とはいえ、失敗から学ぶことも多かったので、
次回に活かすためにも体験記として記録しておきます。

（2回目無料とはいえ、SAPの受験料は高価なので痛いです…小声）

https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/?ch=sec&sec=rmg&d=1

# 現在のわたし自身のスキルセット

私は普段、ごりごりのエンジニアではなく CCoE（Cloud Center of Excellence） の立場で、
どちらかというと Non-Tech寄りの業務（方針策定・推進・教育・啓蒙など）が中心です。

そのため、日頃からガチでAWSリソースを触っているわけではなく、
AWS認定も「基本的なものを押さえている」程度のレベルです。

現在の保有資格は以下の通りです：
✅ CLF（Cloud Practitioner）
✅ AIF（Foundationalの方）
✅ SAA（Solutions Architect - Associate）※今月で失効しました

この内容からお察しいただける通り、相当勉強が必要な状態ではあります。

しかし、弊社のエンジニアメンバーから
:man_tone1:「 SAP取得すると視野広がるよ！」
:boy:「チャレンジしてみる価値ありますよ！」
という後押しを受け、まずは現在の実力を知るためにも6/12に受験しました。

# 試験の感想

勉強時間0と言っても過言ではない状態だったため、
正直自信のあった問題は2,3問でした（それも合っていたかは不明ですが）:confounded:

「設計原則を理解してるか？」、「何に困っていて、何を優先的に解決しなければいけないのか？」がかなり問われる印象でした。

具体的にはこんな印象でした：
- 知識だけじゃ足りない：「AとBどっちも正しいけど、より最適なのは？」という選択を迫られる
- サービス同士の関係性を問う：例えば「Control TowerとSCPとRAMが絡む設計」とか
- 業務で触れてないと辛い：マルチアカウント構成とかSSO周りとか、普段あまり触れない領域で苦戦
- 集中力持たない：1問1問が重くて精神力持ってかれる

「この試験が求めてるレベル」を肌で感じられたのは収穫でしたし、
次は頑張ろうとやる気に繋がりました！

# 結果
タイトルにもある通り、もちろんちゃんと落ちました:innocent::innocent:

ですが、思ったより点数が取れていました。。
（AWS試験史上最低点数を叩き出すのではないかというくらい手応えなかったので）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/c22a072f-085f-41ae-a177-30d3a21f246c.png)



全カテゴリにおいて改善が必要な状態であることもわかり、
まんべんなく間違っていたので全範囲を効率的に勉強していく必要があることがわかりました。

# 今後の方針をClaude4に相談してみた
先ほど記載したスキルセットと点数、今回の勉強期間（ほぼなし）であることをインプットし
平日にあまり時間を取れないという制約のもと約2ヶ月の学習プランを設計してもらいました。

| 期間 | やること | 使う教材 | 学習時間（目安） |
|:--|:--|:--|:--|
| Week 1〜2 | 模擬試験1回（分割でOK）+ 間違いの復習 | Udemy問題 | 平日30分×4、土日1.5h |
| Week 3〜4 | 模試②+復習、不得意ドメインの調査 | Udemy問題 + AWS公式Doc | 同上 |
| Week 5〜6 | 模試③+復習、「なんでその選択肢なのか」理解重視 | Udemy問題 + 自作ノート | 同上 |
| Week 7 | まとめ復習（ノート見直し＋ミス問題のみ再確認） | 自作まとめ | 平日20分、土日1h |
| Week 8 | 模試④（フル実施）+ 本番対策 | Udemy問題 + ノート | 土日で本番時間と同条件で実施 |

時間も無理がなさそうなので、弊社のエンジニアメンバーの受験経験とClaudeの提案プランをミックスしながら効率的に勉強を進めたいと思います！（Udemyの問題集はどれが良いか調査中）

# さいごに
弊社エンジニアたちに結果を連絡したところ、

:angel_tone2:「このスピード感で動いて受けに行っただけで合格ですね！」

という神すぎるコメントを頂き１人涙が出そうでした:joy:
よりやる気が出たので、同じチームに受験者がいらっしゃる方は
ぜひ温かい声をかけてあげてください！励みになります！笑

次回2ヶ月後を目安に再チャレンジ予定です、頑張ります！

# 弊社では一緒に働く仲間を募集中です！
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。

https://engineer.po-holdings.co.jp/
Password-Strength-Simulator

# 🔐 パスワード強度シミュレーター

脆弱なパスワードの危険性を**実際に体験**できる教育用ウェブアプリケーションです。

[![GitHub Pages](https://img.shields.io/badge/GitHub%20Pages-Live%20Demo-blue?style=for-the-badge)](https://tamaden55.github.io/Password-Strength-Simulator/)
[![MIT License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE)

## 🚀 ライブデモ

**👉 [https://tamaden55.github.io/Password-Strength-Simulator/](https://tamaden55.github.io/Password-Strength-Simulator/)**

![デモ画面](https://user-images.githubusercontent.com/your-image-placeholder.png)

## 💡 なぜこのツールを作ったのか

身の回りに**4桁数字**や**簡単なパスワード**を使っている人が多いことに気づき、その危険性を視覚的に理解してもらうために開発しました。

### 🎯 体験できること

- **4桁数字PIN**: 数秒で破られる現実
- **文字種類を増やす効果**: 劇的なセキュリティ向上
- **パスワード長の重要性**: 1文字増やすだけで大きな変化
- **実際のブルートフォース攻撃**: リアルタイムシミュレーション

## ✨ 主な機能

### 📝 パスワード生成
- **数字** (0-9)
- **英小文字** (a-z) 
- **英大文字** (A-Z)
- **特殊文字** (!@#$%^&*)
- **1〜20文字**まで自由に設定

### 💪 強度可視化
- 文字セットサイズの表示
- 総組み合わせ数の計算
- 破られる予想時間の表示
- 視覚的な強度バー

### 💥 ブルートフォース シミュレーション
- **実際の総当たり攻撃**をリアルタイム実行
- 試行回数と経過時間をライブ表示
- パスワードが破られるまでの実時間を測定
- 10分超の場合は自動的に実行を制限

## 📊 実際の体験例

| パスワード例 | 文字セット | 予想時間 | シミュレーション |
|-------------|-----------|----------|-----------------|
| `1234` | 数字4桁 | **数秒** | ✅ 可能 |
| `123456` | 数字6桁 | **数分** | ✅ 可能 |
| `abc123` | 英数字6桁 | **数時間** | ❌ 制限 |
| `Abc123!` | 英数字+記号7桁 | **数年** | ❌ 制限 |

## 🎬 デモ手順

### 1. 弱いパスワードの危険性を実演
```
設定: 数字のみ、4桁
結果: 数秒で破られることを実際に体験
```

### 2. 文字種類を増やす効果を確認
```
設定: 数字 + 英小文字、6桁
結果: 劇的に時間が延びることを確認
```

### 3. 強力なパスワードの効果
```
設定: 数字 + 英大小文字 + 記号、8桁以上
結果: 「シミュレーション不可」で安全性を実感
```

## 🛠️ 技術仕様

- **HTML5** + **CSS3** + **Vanilla JavaScript**
- **レスポンシブデザイン**対応
- **サーバー不要**（完全にクライアントサイド）
- **GitHub Pages**でホスティング

### ファイル構成
```
Password-Strength-Simulator/
├── index.html      # メインページ
├── script.js       # JavaScript ロジック
├── README.md       # このファイル
└── .gitignore      # Git設定
```

## 🎓 教育・啓発での活用

### 企業研修
- 社員のセキュリティ意識向上
- パスワードポリシーの説明資料

### 学校教育
- 情報セキュリティ授業
- デジタルリテラシー教育

### 個人利用
- 家族・友人への啓発
- SNSでのセキュリティ啓発

## 💻 ローカル実行

```bash
# リポジトリをクローン
git clone https://github.com/tamaden55/Password-Strength-Simulator.git

# ディレクトリに移動
cd Password-Strength-Simulator

# ブラウザでindex.htmlを開く
open index.html
```

## 🤝 コントリビューション

改善のアイデアやバグ報告は歓迎です！

1. このリポジトリをフォーク
2. 新しいブランチを作成 (`git checkout -b feature/amazing-feature`)
3. 変更をコミット (`git commit -m 'Add amazing feature'`)
4. ブランチにプッシュ (`git push origin feature/amazing-feature`)
5. プルリクエストを作成

## ⚠️ 注意事項

- このツールは**教育目的**で作成されています
- **実際のパスワードは入力しないでください**
- セキュリティ研究以外での悪用は禁止

## 📄 ライセンス

MIT License - 詳細は[LICENSE](LICENSE)ファイルを参照

## 🌟 作者

**[tamaden55](https://github.com/tamaden55)**

---

### 🔗 関連リンク

- **ライブデモ**: https://tamaden55.github.io/Password-Strength-Simulator/
- **リポジトリ**: https://github.com/tamaden55/Password-Strength-Simulator
- **Issues**: バグ報告・機能要望はこちら

---

**⭐ このプロジェクトが役に立ったら、ぜひスターをお願いします！**
【Python】jsonモジュールのdumps()メソッド

jsonモジュールのdumps()メソッドは、データをJSONフォーマットにエンコードします。

エンコードといっても、他の言語で読み込めるようにJSONのルールに合わせているだけであり、Pythonでのデータ型は文字列のstrです。
Rustでの関数呼び出しインタフェース その２

## 関数呼び出しインタフェースでのオブジェクトの扱い（続き）
この稿ではRustで関数にデータを引き渡して処理を行わせるインタフェースについて説明します。
### ヒープ上に確保された変数の扱い（コレクション Vec<T>での例）

関数にVec<T>の可変長リストデータを渡してソートするユースケースを考えます。
#### 1. 関数の引数に実体（変数名のみを記述）を渡す
~~~rust
pub sub(mut v: Vec<i32>) {
    v.sort();
}

pub fn main() {
    let mut v = vec![367,895,15,9532];
    sub(v);
    println!("ｖ = {:?}", v);
}
~~~
main()の1行目でのコレクションvの宣言直後にメモリは以下のような状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/4c0caa60-d7fc-43cc-b722-9b2dbfde31df.png)
sub()の呼び出し直後は以下のような状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/585ec2ab-8ea6-430e-91a4-8eb6e7d66aed.png)
sub()に渡された引数vが参照しているヒープはmain()のvと同一ですが、関数の引数にそのまま渡した場合は代入したときと同じように所有権の移動が発生します。
subでのsort()呼出し後は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/b844384e-7024-4bb9-a6e2-7cc1a60367b4.png)
関数から戻ると以下の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/b2a8148b-e807-4c42-852c-54159d8d59c7.png)
データを正しく処理できていてますが、関数から制御が戻っても所有権は移動したままなのでvにアクセスすることはできません。

:::note warn
ここでは例示のためにコードが正常に実行できた仮定で記載しましたが、実際には上記のコードではmain()のprintln!()マクロの呼び出しでのvの参照で以下のコンパイルエラーが発生するため実行することはできません。
value borrowed here after move
:::
#### 2. 関数の引数に参照で渡す
関数へ引数とした渡したのちに引き続きその変数を使用したい場合は、参照渡しにすることで解決できます。
~~~rust
pub fn sub(v: &mut Vec<i32>) {
    v.sort();
}

pub fn main() {
    let mut v = vec![367,895,15,9532];
    sub(&mut v);
    println!("ｖ = {:?}", v);
}
~~~
sub()の呼び出し直後は以下のような状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/d66cc6b7-18ae-40a3-a49d-83f390dffb1a.png)
参照渡しの場合は所有権の移動は発生しません。
sub()からmain()へ制御が戻ると処理されたvには呼び出し前と同様にアクセスが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/9afa3f93-0807-4e6d-88ef-7d7ac05c3c7a.png)
### まとめ
ヒープに確保された変数を関数に渡して、その値を更新してもらう場合は、参照渡しにすることによって所有権の移動を抑止できます。
TiDB関連イベント 7月分

もうだいぶ夏な感じですが皆様如何お過ごしでしょうか。

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。
また、イベント/社内勉強会など、リクエストに応じてTiDBの発表や、ハンズオンの開催可能です。
リクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までお気軽にご連絡ください。

## 7月3日、7月4日：開発生産性カンファレンス 

https://pingcap.co.jp/event/devconf2025-findy/

二日目のBホール、11:25〜12:05 にて、MIXI様よりmixi2のTiDB事例についてお話しいただきます。
TiDBの採用による開発生産性の向上についての興味深いお話になりそうです。是非ご参加ください！

## 7月5日：OSC 2025 Hokkaido TiDBの始め方

https://event.ospn.jp/osc2025-do/session/2193116

[TiDB実践入門](https://gihyo.jp/book/2025/978-4-297-14832-4)の著者 長谷川さんによるTiDBの始め方セッションです。長谷川さんにはブースにもお越しいただく予定です。ブースで是非TiDBのインストールについて質問していってください！

## 7月10日、7月11日： DB Tech showcase

https://www.db-tech-showcase.com/2025/schedule/

二日目の16:15 - 16:45に弊社の小板橋が「TiDBのリアルな課題と運用ノウハウ」を語ります。ぜひ、最後までお付き合いください。

## 7月16日：翔泳社「わかばちゃんとつくって、壊して、直して学ぶNewSQL入門」発売！！

https://www.shoeisha.co.jp/book/detail/9784798189635

いやーーーーー
長かった！！弊社の小板橋と私（関口）も参加して執筆した、そして湊川さんが素晴らしいわかばちゃんのマンガを書いてくださったNewSQL入門書がついに発売されます！

この書籍のユニークな点は、体験型のNewSQL書籍になっている点です。NewSQLを動かす書籍はあると思いますが、壊すのと直すのは結構珍しいと思います。そしてわかばちゃんが凄い！大学生・・・？

ぜひ書店でお手にとってご確認ください。

## 7月22日、23日、24日：CEDEC 2025

https://pingcap.co.jp/event/ced2025/

最終日の13:40〜14:40、CAPCOM様（と弊社林）にて、共通基盤のTiDB移行についてのセッションがあります。是非ご参加ください！
【Python】shutilモジュール

引数のdstでディレクトリを指定できるのはcopy()とcopy2()です。

copyfile()で「shutil.copyfile('sample.txt', 'e/')」のようにdstにディレクトリを指定するとエラーになります。

ただし、copyfile()で「shutil.copyfile('sample.txt', 'e/sample2.txt')」のようにディレクトリに加えてファイルも指定すると、エラーにならずコピーできます。
[TryHackMe] CyberHeroes-writeup

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/d9abf30f-4538-46c4-95d1-e4b65065049a.png)

ソースコードを見るとjavascriptにユーザー名とパスワードが直書きされています。
```js
const RevereString = str => [...str].reverse().join('');
if (a.value=="h3ck3rBoi" & b.value==RevereString("54321@terceSrepuS"))
```
`RevereString`は文字列を反転させているので`54321@terceSrepuS`を反転させればパスワードになります。
flagが出ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/17685742-c5d2-4a0d-b2b4-6f942fe2a12f.png)
> flag{edb0be532c540b1a150c3a7e85d2466e}
growpart エラー "NOCHANGE: partition 1 is size 4294965248. it cannot be grown" について

# はじめに
今回、EBS のボリューム拡張を行おうとしたところエラーが発生してしまったので、その内容についてメモしておこうと思います。

# エラー内容
**NOCHANGE: partition 1 is size 4294965248. it cannot be grown**

実際に実行した際の状況は以下になります。
```
$ sudo growpart /dev/nvme0n1 1
NOCHANGE: partition 1 is size 4294965248. it cannot be grown
```

このエラーは、growpart を実行した際にコマンド側で既にパーティションが最大サイズに達していると判断し、拡張が行われなかったことを意味します。

# 調査
エラーだけでは原因がわからず、状況を確認するために以下の調査を実施しました。

## 1. 認識している EBS ボリューム容量確認
まずは EBS ボリュームの確認です。
lsblk コマンドで確認できますが、容量に余裕があります。

```bash:
$ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0   3T  0 disk 
└─nvme0n1p1 259:1    0   2T  0 part
```

## 2. パーティションテーブルの種類確認
まず、GPT または MBR かを確認します。
```bash:
$ sudo parted /dev/nvme0n1 print
モデル: NVMe Device (nvme)
ディスク /dev/nvme0n1: 3221GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ: 

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  2199GB  2199GB  primary  xfs               boot
```

パーティションテーブルは `msdos` となっているので、パーティションテーブル形式は **MBR** であることがわかりました。
また、**MBR** の最大パーティションサイズは `2TiB ≒ 2.199TB` です。
そのため、今回は最大パーティションサイズに到達しているのが原因とわかりました。

## 3. 実際のディスクサイズとパーティションの境界確認
念の為 fdisk でも確認してみます。
```bash:
$ sudo fdisk -l /dev/nvme0n1

Disk /dev/nvme0n1: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b956b

  デバイス ブート      始点        終点     ブロック   Id  システム
/dev/nvme0n1p1   *        2048  4294967295  2147482624   83  Linux
```
以下はブロック数とセクター数での上限をまとめたものです。
|表示値 |単位 |バイト換算 |備考 |
|------|----|----------|----|
|2147482624 |ブロック数（1KiB単位） |2147482624 × 1024 = 2199023254528 bytes |≒ 2TiB（1024³） |
|4294967295 |セクター数（512B単位） |4294967295 × 512 = 2199023255040 bytes |≒ 2TiB（MBRの上限） |

別の視点からも、完全に限界まで使っていることが確認できました。

# 対処法
今回発生したエラーから、このままではボリュームの拡張が難しいとわかりました。
その際の対処として2つ考えられます。

## 方法1: GPTに変換して再パーティション
この方法はディスクの再フォーマットが必要になるため、全データ削除されてしまうことに注意です。
まだ利用していないボリュームであれば良いですが、運用中のシステムでは推奨されません。

とりあえず、対応の流れは以下になります。
1. データのバックアップ
1. gdisk 等を用いて MBR → GPT に変換
1. パーティションを1つで再作成し、xfs で再フォーマット
1. / に戻す場合は、ルートパーティションの再インストールが必要

## 方法2: 空き領域を別パーティションにして /data などに割り当てる
非破壊的で安全に拡張できそうです。
以下、手順になります。

### 1. 空き領域に新しいパーティションを作成
```bash:
$ sudo fdisk /dev/nvme0n1
```
* n（新しいパーティション作成）
* パーティション番号：2
* 開始セクタ：既存の終了セクタ + 1（例：4294967296）
* 終了セクタ：デフォルト（Enter）
* w（書き込みして終了）

### 2. フォーマット
```bash:
$ sudo mkfs.xfs /dev/nvme0n1p2
```

### 3. マウントディレクトリ作成
```bash:
$ sudo mkdir /data
```

### 4. マウント
```bash:
$ sudo mount /dev/nvme0n1p2 /data
```

### 5. 永続化（/etc/fstab への登録）
```bash:
$ echo '/dev/nvme0n1p2 /data xfs defaults 0 0' | sudo tee -a /etc/fstab
```

以上で完了です。

# わかったこと
今回のエラーを調査してわかったポイントです。
* 現在の環境（MBR + / マウント済）では / を拡張できない
* 別パーティション /dev/nvme0n1p2 を作り /data などで運用するのが現実的かつ安全な方法

# おわりに
*MBR* が *2TB* までしか拡張できないということを今回初めて知りました。
あまり機会は少ないですが、今後 EBS に大容量のデータを保存する際は注意しようと思います。

---
### 参考
https://repost.aws/ja/knowledge-center/ec2-centos-convert-mbr-to-gpt
How I Used React + Google Maps API to Build a Midweek Activity Finder for Parents

# How I Used React + Google Maps API to Build a Midweek Activity Finder for Parents

> When it’s 5:03 p.m. on a Wednesday and the house is a warzone, sometimes the solution isn’t discipline—it’s data.

As a parent (and developer), I kept facing the same problem:  
**"What can I do with my kids *right now* that doesn’t involve screens, stress, or sugar?"**

I used to Google things like:
- “Indoor trampoline parks near me”
- “Midweek family fun”
- “Places open after 5 PM for kids”

But search results were chaotic, outdated, or irrelevant.

So I built **Funfull Midweek**, a React-based web app that lets parents find nearby indoor play areas in seconds — optimized for **off-peak hours** like weekday evenings.

---

## 🎯 Problem Statement

Parents don’t just need weekend plans.  
They need *Wednesday survival kits.*

But:
- Most platforms prioritize weekends/events.
- Google Maps results are messy.
- Yelp reviews don’t filter by time, price, or kid-friendliness.

So I wanted to create something **fast, minimal, relevant**, and **parent-proof**.

---

## ⚙️ Tech Stack

- **React** (frontend)
- **Tailwind CSS** for styling
- **Google Maps Places API** for location data
- **Firebase** for storing user favorites
- **Day.js** to auto-filter by current weekday + time

---

## 🧪 Key Features

### 🔍 1. Filter by Time + Day
```js
const currentTime = dayjs().format("HH:mm");
const currentDay = dayjs().format("dddd");

const results = places.filter(place =>
  place.openingHours.includes(currentDay) &&
  place.openNow === true
);
RHEL 8.1でPodmanコンテナ起動時のSELinuxエラーを「container-selinux」導入で解決した話

# これは何？

RHEL 8.1環境でPodmanを利用してコンテナを起動した際に発生した「runc create failed: unable to start container process: unable to apply cgroup configuration」エラーについて、発生原因とその解決方法、そしてなぜ解決に至ったのかをまとめます。

# 概要

Podmanでコンテナを起動しようとした際、以下のようなエラーが発生しました。

```
ERRO[0000] Starting some container dependencies         
ERRO[0000] "runc: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit \"libpod-xxxxxxxx.scope\" ...: error creating systemd unit `libpod-xxxxxxxx.scope`: got `failed`: OCI runtime error" 
Error: starting some containers: internal libpod error
```

エラーの切り分けとしてSELinuxを無効化してみた所、問題なく動くことが確認できました。
但し、SELinuxを恒久的に無効化するのはリスクがあるため、どうにかして回避できないかを検証した内容を記載します。

# 対応方法

## エラー発生時の状況

- Podmanでコンテナを起動しようとすると、systemd unitの作成に失敗し、cgroupの設定適用ができずエラーとなる。
- SELinuxのenforcing状態や、Podmanのバージョン、依存パッケージの有無によって発生することがある。

## 解決までの流れ

1. **エラーメッセージの確認**  
   エラー内容から、cgroupやsystemd unitの作成に失敗していることが分かる。

2. **SELinuxの設定・状態を確認**  
   - SELinuxがEnforcingの場合、ポリシー不足によりアクセスが拒否されることがある。
   - `setenforce 0`で一時的にPermissiveにするとエラーが発生しなくなる場合、SELinuxが原因の可能性が高い。

3. **container-selinuxパッケージの導入**  
   - 以下コマンドでパッケージをインストール。
     ```bash
     dnf install -y container-selinux
     ```
   - これにより、Podmanの動作に必要なSELinuxポリシー（container_t、container_file_tなど）が追加される。

4. **再度コンテナを起動**  
   - container-selinux導入後、同じコマンドでコンテナを起動するとエラーが発生しなくなった。

## 補足

- 特殊なボリュームマウントや独自のファイル配置を行う場合は、`:z`や`:Z`オプションでSELinuxラベルを明示的に指定することが推奨されます。
- それでも解決しない場合は、audit2allowやudicaでカスタムポリシーを作成する方法も検討してください。

# まとめ

- Podman＋SELinux環境で「runc create failed: unable to apply cgroup configuration」エラーが発生した場合、**まず「container-selinux」パッケージが導入されているか確認することが重要**。
- 標準的な運用であれば、このパッケージのインストールだけでコンテナ系のSELinux関連エラーが解消するはずです。
- 今回はインストールだけで済みましたが、場合によっては追加の設定やカスタムポリシーが必要なケースもあるため注意してください。

---

**参考**  
- [Red Hat公式：Container permission denied: How to diagnose this error](https://www.redhat.com/en/blog/container-permission-denied-errors)  

[1] https://www.redhat.com/en/blog/container-permission-denied-errors
[2] https://github.com/containers/podman/issues/16936
[3] https://github.com/containers/podman/issues/14851
[4] https://bugzilla.redhat.com/show_bug.cgi?id=1897579
[5] https://docs.podman.io/en/v5.0.1/markdown/podman-run.1.html
[6] https://unix.stackexchange.com/questions/756982/podman-fails-with-error-relocating-relro-protection-failed-local-share
[7] https://access.redhat.com/solutions/7072912
[8] https://www.redhat.com/en/blog/user-namespaces-selinux-rootless-containers
[9] https://gitee.com/mgb/Podman/blob/master/troubleshooting.md
[10] https://github.com/containers/libpod/issues/2245
Mac から HTTP Proxy 経由で ssh する方法

# はじめに

Mac から HTTP Proxy 経由で ssh する際に色々とハマったので、結果的にうまく行った方法を備忘録として書いておきます。

# 結論

まず `nmap` をインストール。

```
brew install nmap
```

`.ssh/config` を書く。

```
Host [接続名称]
    Hostname [接続先 IP アドレス]
    User [ssh 先のユーザ名]
    Port [ssh 先のポート]
    ProxyCommand ncat --proxy-type http --proxy [Proxy Host:Proxy Port] %h %p
    
    (以下略) 他色々必要なこと書く、鍵とか
```

これでOK。あとは以下で接続。

```
ssh [接続名称]
```

以上。
Amazon AIF‑C01 exam dumps 裏技テクニック｜合格者が実践したこと

Amazon AIF-C01 exam dumpsとは、AWS Certified AI Practitioner (AIF-C01) 試験の学習をサポートするためのリソースです。試験に含まれる問題の形式や出題傾向を知ることで、受験者は効果的に準備ができます。特にAIと機械学習の基礎知識を問うこの試験では、実践的な理解が求められます。

このexam dumpsは、公式ガイドだけでは補えない部分を補強し、出題パターンを理解するのに役立ちます。大学の授業と同じように、基礎から応用まで段階的に学ぶことが合格のカギです。

Amazon AIF-C01 exam dumps に出る機械学習モデルの種類

AIF-C01試験で頻出するのが、機械学習モデルの基礎理解です。特に以下のようなモデルが問われることが多いです：

*   線形回帰（Linear Regression）
    
*   ロジスティック回帰（Logistic Regression）
    
*   決定木（Decision Trees）
    
*   ニューラルネットワーク（Neural Networks）
    

[Amazon AIF-C01 certificats](https://prepbolt.com/paths/amazon/data/aif-c01) では、これらのモデルの仕組み、使いどころ、メリット・デメリットが詳しく扱われています。難しい理論ではなく、具体的な例やケーススタディが多く、理解しやすいです。

Amazon AIF-C01 exam dumps を活用した試験対策の方法

最近Googleでよく検索されているのが、「どうやってこのexam dumpsを最大限に活用するか」ということです。効率的な使い方のポイントは以下です：

*   最初に模擬問題を解く
    
*   間違えた問題の解説を丁寧に読む
    
*   同じ問題を2〜3回繰り返す
    
*   時間を計って本番に近い形式で練習する
    

[Amazon AIF-C01 exam dumps](https://prepbolt.com/paths/amazon)は、試験対策において非常に有効なツールです。これを活用することで、出題傾向に慣れ、自信を持って本番に臨むことができます。
【Python】osモジュールの関数

現在のディレクトリをpathに設定するのはchdir(path)です。
getcwd()は、現在の作業ディレクトリを返します。

listdir(path='.')はディレクトリだけではなくファイルも返します。

remove(path)はファイルを削除します。
ディレクトリを削除する場合はremovedirs(name)を使用します。

rename(src, dst)は、ファイルまたはディレクトリの名前をsrcからdstに変更します。
Swiftの@Privateについて簡単に説明してみました！

今回はSwiftのprivateについて初心者向けに簡単に解説してみました！

privateってなに？
---
privateはアクセス制御（アクセスレベル）の一つで、
この変数（または関数）はこのファイルの中の、この範囲だけで使える
というルールを決めるためのキーワードです。

何のために使うの？
--
- 他の場所から勝手に使われないようにする

- バグを防ぐ

- コードを安全で分かりやすく保つ

つまり、このクラスの中だけ使う制限をすることで、意図しない使い方を防げます。


```swift
class Counter {
    private var count = 0
    
    func increment() {
        count += 1
    }

    func currentCount() -> Int {
        return count
    }
}

```
- count は private にしてあるので、クラスの外からは直接アクセスできません。

- 代わりに、increment() や currentCount() を通じて、安全に操作・参照できるようにしています。

```swift
let counter = Counter()
// counter.count = 10 ← エラー！外からは見えない
counter.increment() // OK!
print(counter.currentCount()) // 1

```
| ポイント         | 内容                                          |
| ------------ | ------------------------------------------- |
| `private`とは？ | クラスや構造体の内部だけで使えるように制限するキーワード            |
| 何に使うの？       | **設計を安全にするため**、他のコードからの誤操作を防ぐため             |

以上、@Priaveの簡単に解説してみました！ぜひ参考にしてみてください👍