OmniAICreator/Qiita-1.07M huggingface dataset:
【合格体験記】Python 3 エンジニア認定データ分析試験

## はじめに
ここ最近のお話ではないのですが、Python 3 エンジニア認定データ分析試験の資格を取得しています。
個人的にとっかかりやすい資格で、使用した教材が非常によかったので共有しようと思います。

## Python 3 エンジニア認定データ分析試験とは
概要は以下となります。

:::note warn
記事投稿時の情報となり、内容が変更される可能性がありますので、受験される際はご自身でもお調べいただくことをおすすめいたします。
:::

| 内容 | 詳細 |
| ---- | ---- |
| 主催 | 一般社団法人Pythonエンジニア育成推進協会 |
| 試験内容 | ・Pythonのライブラリ (NumPy, pandas, Matplotlib, scikit-learn) を中心に出題<br>・Pythonのデータ分析、機械学習や、それらに関係する数学の基礎知識も問われる |
| 試験時間 | 60分 |
| 試験形式 | 選択式 |
| 問題数 | 40問 |
| 合格ライン | 70%（28問以上の正解で合格） |
| 受験料金 | 一般: 11,000円（税込）/ 学生: 5,500円（税込） |
| 試験会場 | 全国のオデッセイコミュニケーションズCBTテストセンター |

また教材が用意されており、その中から出題されます。

[Pythonによるあたらしいデータ分析の教科書 第2版](https://www.amazon.co.jp/dp/4798176613/)
※出題範囲が公開されていますので、チェックしておくと効率よく学習できます。

## 合格するまでの道のり
前提として、以下を先にお伝えしておきます。

・Pythonの実務経験なし
・データ分析系の業務に従事
・プライベートで触ったことがある程度（AIモデル作成など）
・同資格の"基礎試験"はスキップ

実務経験はないものの基礎的な知識は少々あったため、基礎試験はいいやで飛ばしてしまいました。
結果、データ分析試験から受けても問題なかったです。

また、データ分析系の業務に従事していたとしても、試験はかなり数学的な内容だったので経験ありなしは関係なさそうでした。
数学に極端に拒否反応がある方は難しいかもしれません。。

資格勉強としてやったことは主に、

①主教材（[Pythonによるあたらしいデータ分析の教科書 第2版](https://www.amazon.co.jp/dp/4798176613/)）に目を通す
②模擬試験アプリ（[ExamApp](https://python-basic.com)）を9割正解するまでひたすら解く
③②の模擬試験アプリで疑問が残った箇所は①の主教材で補填する
④見慣れてしまったら他サイトの模擬問題を漁ってひたすら解く

基本的に、模擬試験アプリ⇄主教材を行き来してました。

他の資格試験にも共通していますが、①をかるーくやった理由としては②の模擬試験に重きを置き、本番に近い問題を解きながら知識を着実に溜めていきたかったからです。

とてもざっくりとした説明になってしまいましたが、とにかく②の模擬試験アプリが優秀すぎました:clap_tone1:
レベル別に問題が用意されていて、段階を踏んで難易度を上げられたのがよかったです。
制作者様に心から感謝いたします。

## 試験の所感
他の試験ではメモ用紙が配布されることが多いのですが、Pythonはないようです。
頭の中で考えて解く必要があります。

試験時間は60分間でしたが、解き終わるのに約10分程だったと思います。
完全にクオリティの高い模擬試験のおかげでした:metal_tone1:
さすがにこれで終わり、は怖かったので3周くらい見直して制限時間を待たずに試験終了しました。

また冒頭らへんでも述べた通り、"データ分析試験"とはいえ専門的な内容ではなく数学チックだったので、これからデータ分析について学習したい方にもおすすめです。

## 最後に
今回は、Python 3 エンジニア認定データ分析試験についてお話いたしました。
同資格の実践試験にも合格しているのですが、勉強方法はほぼ同じだったような気がするので記事にするかは未定です。。（こちらも過去の記憶を辿ります。）

最後までお読みいただき、ありがとうございました:chart_with_upwards_trend:
FlaskのみでSSL証明書を読み込んでHTTPS化する(2024年版)

# FlaskをSSLに対応させる

ウェブアプリケーションをSSLに対応させる際はnginxなどでリバースプロキシを作ることが一般的ですが、テスト環境でサクッとapiをssl化したいときはFlaskの機能を使ってnginxを通さずにSSL化することができます。

このトピックに関して色々な記事が出回っていますが、使えなくなっているものが大量にあるので2024年8月に使えるコードを共有したいと思います。シンプルすぎてびっくりしました。

index.htmlを表示させるだけのコードは

```python

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=443)


```

これで実行できますが、これに

```python
CERTFILE = "C://ssl/certificate/location"
KEYFILE = "C://ssl/key/location"
context = (CERTFILE, KEYFILE)

....中略....

    app.run(host='0.0.0.0', port=443, ssl_context=context)
```

これを追加するだけです。完成版のコードは

```python

from flask import Flask, render_template

app = Flask(__name__)

CERTFILE = "C://ssl/certificate/location"
KEYFILE = "C://ssl/key/location"
context = (CERTFILE, KEYFILE)

@app.route('/')
def home():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=443, ssl_context=context)

```
こうなります。SSL証明書はLet's Encrypt等でもらったpemファイルをそのまま使えます。

# 余談(もう使えなくなったコードたち)
ここから先は古い情報なので、SSL化する方法だけ知りたい方は読まなくても大丈夫です。
Flaskはwerkzeugというライブラリをもとに作られています。従ってwerkzeugに変更が入ったらFlaskにも変更が入るということです。

数年前の記事を見てみると、大きく二つの方法でSSL化していたようです。

- OpenSSLのライブラリをimportして使う(pyOpenSSL)
- python標準のsslのライブラリを使う

Google検索してみると

```python

import ssl
    ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    ssl_context.load_cert_chain('fullchain.pem', 'privkey.pem')

```
```python

context = SSL.Context(SSL.SSLv23_METHOD)
        context.use_privatekey_file('key.key')
        context.use_certificate_file('cert.crt')
        app.run(host='0.0.0.0', port=80, ssl_context=context, threaded=True, debug=True)
        
```

こんな感じのコードがいっぱい出てきますが、`load_cert_chain` がうまく認識されなかったり(`load_verify_location`もだめでした)、`ssl.PROTOCOL_TLSv1_2` はもうサポートしてないよ！って言われたりしてどれもうまくいきませんでした。なんだかんだStackoverflowの記事を漁っていたら前述の方法でSSL化できたので、ぜひ試してみてください。
PHPで"Fatal error"が表示されない不具合(?)

いくら例外を投げても無反応だったので、原因を徹底調査しました。
すると、`catch`ブロックの中で未定義の関数が見つかり、
その場所で`Fatal error`が発生したものの、
`finally`ブロックの処理がそのエラーの表示より優先され、
最後に表示されるはずだったのに`finally`ブロックにある`die()`のせいでエラー表示が消されてしまっていました。

:::note info

私の環境
●Windows 10
●PHP 8.3.10（8.2.12 でも同様の現象を確認）

:::

まずは、下記のスクリプトを実行してみてください。

```PHP
<?php

// "Fatal error" の発生に気づけないことがあるかもしれません。

try{

	throw new Exception('例外発生!'); // 例外を投げてcatchブロックへ進みます。

}catch (Exception $e){

	undefined_function(); // 未定義の関数 → "Fatal error" を引き起こします。

}finally{

    // finally ブロックの処理は、エラー表示より優先されるようです。

$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div style="margin:15em 1em">
<p>スクリプトの最後の "die()" を削除すれば、
<p>画面の最後に
<p>"Fatal error" のメッセージを見ることは可能ですが、
<p>"finally ブロック" の処理の後にメッセージが表示されるので、
<p>もしも、"finally ブロック" が
<p>ウインドウサイズよりも上下に長いコンテンツを表示する場合、
<p>"Fatal error" が発生していることに気付くことは難しいかもしれません。
</div>
</body>
</html>
HTML;

echo $html;
die(); // エラー表示の直前で処理を打ち切ってしまいます。
}

```


スクリプトの最後の`die()`を削除すると、画面の最後に`Fatal error`の表示が復活します。

![Fatal error 表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/d43c80f6-5a99-45cd-8aa9-fba36b2d5dad.jpeg "Fatal error 表示")

## まとめ

PHP の`finally`ブロックには、`die()`や`exit()`は書かないようにしましょう。
でも、`Fatal error`のエラー表示は何よりも先に表示させて欲しいですよね？
第7章 操作変数

# 操作変数について
操作変数の識別戦略をDAGで確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426482/98dd1750-5fc1-bfee-7c58-70751a7fd00c.png)

DとYの間にバックドアパス D ←　U　→　Y　が存在
さらに、Uは観測されない変数のためバックドアパスが開いたままとなる。

データがないから諦める前に、パスを通じて**Ｖ**がどのように作用しているか確認

**唯一経路**
VはDを通してのみYに影響を与えることが出来ることを唯一経路という。
Vが変化するとき、Dが変化して、それがＹの変化を引き起こす。
（Vが変化した時にYが変化しても、それはDが変化していると解釈）
VはDを除いてYを決める変数とは独立であることを仮定している「除外制約」

変数Dにおいて、一部の人だけがVの影響を受けて行動を変えたと仮定すると、
VがYの変化を引き起こしているのは、母集団の一部となる。
例えば、操作変数Vが女性の行動だけを変えるのであれば、DのYに対する因果効果は、
男性だけじゃなく女性の選択の因果効果だけを反映している。

**強調ポイント**
+ もし、男性と女性ではYに与える影響が異なるのであれば、VにおけるショックはDのYに対する因果効果の一部を識別しただけに過ぎない。
+ Vのショックで変化した人の因果効果なので、全体の一部を見ているということ


**操作変数の良し悪しは、どうすればわかるのか**
+ 事前知識を持つことが重要
事前知識をDAGに書き出して、分析デザインの実現可能性を考える

「除外制約」は検証不可能な仮説なので、理論的に主張できる場合にのみ考える。
理論的な議論が苦手な人は操作変数を使うことを避ける傾向にある。


# 均質な処置効果
操作変数デザインについて、処置が誰に対しても同じ因果効果を持つ場合で説明
(大学卒業が自分の賃金を10%増加させるなら、同様に大学卒業者の賃金を10%あげることを意味する)

教育年数の収入に対する因果効果に興味があるものとする。
教育年数が未観測な能力によって内生的

この問題をDAGで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426482/68d2aaeb-129e-eac4-c65f-1086a543e4af.png)

このDAGは単純な回帰で表現することが可能
収入の真のモデル
```math
Y_i = \alpha + \delta S_i + \gamma A _i + \epsilon_i
```

+ $Y$ : 収入の対数
+ $\delta$ : 均質な処置効果
+ $S$ : 教育年数
+ $A$ : 個人の能力(未観測な効果)
+ $\epsilon$ : 誤差項

欠落しているデータが存在しているので、以下の式となる
```math
Y_i = \alpha + \delta S_i + \eta_i
```
+ $\eta$ : 誤差項

最小二乗法から$\delta$の推定値は
```math
\begin{align}

\hat{\delta} = \frac{C(Y,S)}{V(S)} &= \frac{E[YS]-E[Y]E[S]}{V(S)} \\
&= \frac{E[\alpha + S + S^2\delta + \gamma SA + \epsilon S] - E(S)E[\alpha+\delta S + \gamma A + \epsilon]}{V(S)} \\
&= \frac{\delta E(S^2)-\delta E(S)^2 + \gamma E(AS) - \gamma E(S)E(A) + E(\epsilon S) - E(S)E(\epsilon)}{V(S)}\\
&= \delta + \gamma \frac{C(AS)}{V(S)}

\end{align}
```

教育年数の係数$\hat{\delta}$は上向きのバイアスがかかっていることになる。


教育年数を増減させるが、学生の能力や構造誤差とは独立している操作変数$Z_i$を見つけたとする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426482/a28eea41-7258-b432-d3fd-1e0c14b733d2.png)


この変数を使って$\delta$を推定することが可能
YとZの共分散を求める
```math
\begin{align}

C(Y,Z) &= C(\alpha  + \delta S + \gamma A + \epsilon , Z) \\
&= E[(\alpha + \delta S + \gamma A + \epsilon)Z] + E(Y)E(Z) \\
&= \delta C(S,Z) + \gamma C(A,Z) + C(\epsilon,Z)


\end{align}
```

右側にある$\delta$を切り出すと、以下の式のように推定可能
$\hat{\delta} = \frac{C(Y,Z)}{C(S,Z)}$
※$C(A,Z)=0$かつ$C(\epsilon,Z)=0$である場合に限る

# 2段階最小二乗法
操作変数推定量の一つに2段階最小二乗法がある
独立変数と誤差項が相関している場合、通常の最小二乗法（Ordinary Least Squares, OLS）ではバイアスのある推定量が得られてしまうため、この問題を解決するために操作変数推定法が用いられる
【式変換が長いので教科書で】
ドラッグ&ドロップでDatabricksノートブックへの画像の埋め込みができるようになりました！

これは非常に嬉しいエンハンス。

[ノートブックにおける画像の埋め込みとドラッグ&ドロップ](https://docs.databricks.com/en/release-notes/product/2024/july.html#embed-and-drag--drop-images-in-notebooks)

> マークダウンセルに直接埋め込むことで、画像をノートブックに表示できるようになりました。お使いのデスクトップから直接マークダウンセルに画像をドラッグ&ドロップすることで、画像は自動でアップロードされ表示されます。[画像の表示](https://docs.databricks.com/ja/notebooks/notebooks-code.html#display-images)や画像の[ドラッグ&ドロップ](https://docs.databricks.com/ja/notebooks/notebooks-code.html#drag-and-drop-images)をご覧ください。

こちらのアニメーションを見てもらえれば一目瞭然です。
![](https://docs.databricks.com/ja/_images/drag-and-drop-image.gif)

これまでは、ワークスペースにある画像をノートブックに表示させるには、こちらにあるように`FileStore`というDBFSパスに配置して、そちらを参照するパスに変換したりと非常に面倒でした。あるいは、[こちら](https://qiita.com/taka_yayoi/items/52b5b13ba5874b23c823#%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E3%82%BB%E3%83%AB%E3%81%AB%E7%94%BB%E5%83%8F%E3%82%92%E3%83%8F%E3%83%BC%E3%83%89%E3%82%B3%E3%83%BC%E3%83%89)で説明しているように、base64エンコードした文字列をハードコードするという方法もありましたが、ノートブックのサイズが大きくなってしまいます。

https://qiita.com/taka_yayoi/items/52b5b13ba5874b23c823

こちらのエンハンスによって、まさにQiitaで実装されているような画像のドラッグ&ドロップでの画像埋め込みができるようになったのです。とても嬉しい。

ドラッグ&ドロップした場合には、ノートブックと同じパスに画像が保存されます。それ以外にも[ボリューム](https://docs.databricks.com/ja/notebooks/notebooks-code.html#display-images-stored-in-volumes)や従来の[FileStore](https://docs.databricks.com/ja/notebooks/notebooks-code.html#display-images-stored-in-the-filestore)に保存された画像ファイルも簡単に参照できるようになっています。

是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
VB.net 基本的な文法（宣言編）

この記事は、VB.netでWebアプリ開発を行う **初学者向け** の内容です。
*vb.net 4.7.2で動作検証をしています。
## 本記事では、変数や定数の宣言を述べています。

では、早速変数の宣言を書きます。

```
Dim hoge As Integer = 0
```

hogeという変数を宣言し、型（整数）として、値0を入れています。
vb.netでは、変数の後ろに;（セミコロン）を入力といったことはしません。
他のプログラミング言語との違いです。
また、宣言した変数hogeに対して、

```
hoge = 3
```

といった形で、値を変更することが可能です（ **変数** のため）。

また、
```
Dim hoge1, hoge2 As Integer
```

という記載の通り、同時に同じ型の変数を複数宣言することも可能です。

```
Dim hoge3 As Integer = 0, hoge4 As Integer = 0
```

注意点
下記の宣言は、エラーとなります。
```
Dim hoge5, hoge6 As Integer = 0
```

また、定数の宣言も記載します。
定数と変数の違いは、定数に対しては、一度入れた値を変更できないといった特徴があります。

```
'定数の宣言
const hoge7 As Integer = 10

'エラーとなる命令
hoge7 = 15

```

定数として宣言した場合、 **変更ができない** ということを意識しましょう。

また、配列等の宣言文もサンプルのコードを記載しておきます。
こういう風に書くんだということを意識しておきましょう。

```
'配列の宣言
Dim hoge8() As Integer = {0, 1, 2, 3, 4, 5}
```

```
'リストの宣言
Dim hoge9 As List(Of Integer)
```

といった形です。

## まとめ
今回の記事では、変数や定数の定義の方法を記載しました。
定数は変更できない。複数の変数の宣言方法は、注意をしてください。
現在のコンテキストに '○○' という名前は存在しません

## エラーが出る

「C#コードレシピ集」の「Chapter 18 Zipファイル 276」を試していたところ、エラーが出た。

``` sh
error CS0103: 現在のコンテキストに 'ZipFile' という名前は存在しません
```

``` cs
using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            var src = "./source/example";
            var dst = "./archives/myarchive.zip";

            ZipFile.CreateFromDirectory(src, dst);
        }
    }
}
```

## 対処法

1. プロジェクト→参照の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/9930ddb4-e0e8-5004-e7f0-0ae2c00b6f3f.png)

1. 必要なアセンブリを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/9e1a4295-e24e-8275-66c0-68ae48b0e015.png)
[JSなし] CSSのみで「ページの最上部に戻る」を実装する(最上部ではちゃんとボタンが消えるやつ)

こんにちは、codebydeerです。

https://twitter.com/codebydeer

今回は、CSSのみで「ページの最上部に戻る」のボタンを、下にスクロールしていったときに表示させるやつを実装していこうと思います。
めちゃくちゃ試行錯誤しました。
やっと見つけた...

# 結論

```index.html
<body id="top">
    <nav class="jumpTop">
        <a href="#top">
            <svg stroke-width="0.3" viewBox="0 0 4 4" xmlns="http://www.w3.org/2000/svg">
                <path d="M2,1 v2 m0,-2 l1,1 m-1,-1 l-1,1"></path>
            </svg>
        </a>
    </nav>    
    ...
</body>
```

```index.css
        nav.jumpTop {
            --jtWH: 45px;
            --jtBtm: 80px;
            --jtRight: 10vw;
            padding-top: 1px;
            position: sticky;
            top: calc((var(--jtBtm) + var(--jtWH)) * -1);
        }

        nav.jumpTop>a {
            display: block;
            position: absolute;
            top: 100vh;
            right: var(--jtRight);
            width: var(--jtWH);
            height: var(--jtWH);
            background-color: #ffffcc;
            border-radius: 100%;
            border: 1px solid black;
        }
```

| css変数名 | 説明 |
|:-:|:-:|
| --jtWH | ボタンの大きさ(横幅) |
| --jtBtm | ボタンの下からの距離 |
| --jtRight | ボタンの右からの距離 |

## 解説

- bodyの直下に「上に戻る」ボタンの外枠(nav要素)を置き、その中にボタン(a要素)を置きます

- ボタンのa要素に`position: absolute;`を指定することで、ボタンのa要素がフローから除外され、先程設置した外枠の中身にはなにも入っていない(イメージ的には、高さが０である「ボタンのa要素の基線」のみがある)状態になります

- 外枠のnav要素に`position: sticky;`を指定し、`top`プロパティをビューポートの一番上よりもさらに上、見えていないところ(負の値)に設定することで、しばらくスクロールしてから固定させるようにします

- ボタンのa要素のtopを、ちょうどスクロールして固定された時にいちばん上手く見えるように指定します (基本的には100vhを指定します。そうすることで、一番上ではちょうどぴったりビューポート外に出て、固定される時には`position: sticky;`の要素の`top`プロパティで指定した分のオフセットだけ飛び出て来ます。)

# 感想・できた経緯

最初、`.jumpTop`のボックス自体を`position: fixed;`で浮かせてから、その中を`position: sticky;`で固定させようとしたのですが、
いかんせん親要素が違うために、相対位置指定がうまくいかなかったのです。
というか全体をスクロールさせようとしたときに、ボタンをスクロールさせれないから、一向にボタンが出てこなかったり固定されなかったり...って感じでした。
そして私が出した天才的な最適解はこれだ！！って感じです

どうやったら親要素を一致させつつ、`position: sticky;`の要素を`position: absolute;`のように相対位置指定できるかを考えたとき、`position`の特性上`sticky`の要素を`absolute`の要素よりも下に来させて実現するのは不可能だと思い、最終的にこの方法にたどり着きました。

`position: sticky`は、通常時は`position: static`と同じように動作するため、どうレイアウトを崩さず`position: sticky`をねじ込むかが重要な課題でした。
`position: sticky`の指定位置をマイナスにして、`absolute`の高さ(top)をビューポートにするのはさすがにキレッキレの解決策だと思います。(自画自賛)

ちなみに、`padding`を追加した理由は、marginによってページの一番上の要素がビューポートよりもちょっとだけ下に来ちゃってたから、`padding`入れてページの一番上をそろえたって感じです。

# いいねほしい！

この記事を読んでくれた方々に、とても感謝しています！
そして、皆さんのページでのスマートなコーディングの助けになれたら、幸いです。
いいねをいただけると自己肯定感上がるので、うれしいです！

最後までお読みいただきありがとうございました！では！
VimExcelの使い方

## 1. VimExcelとは

VimExcelとはExcel上の作業を可能な限り、Vimエディタのキーボード操作にて実現させることを目的としたアドインソフトウェアです。

## 2. ライセンス

本アドインは、これまでVimxlsとして、公開させていただいたものを改善したものとなります。
ライセンスの基準はクリエイティブコモンズの「表示（CC BY）」相当とお考えいただければと思います。

## 3. 動作環境および注意事項

作者が利用しているキーボードは、主にHHKB Professional HYBRID Type-S(英語配列)です。ちなみに端末日本語キーボードしかないキーボードについては、ドライバを変更する等して101配列に変更しています。

VBAで利用している関数の変更制限かと思いますが、ツール類でのキー配列の変更では、一部うまく
機能しないものがあります。対応策としては、いまのところ101キー配列のキーボードをご利用いただくか、
本製品で定義しているキー配列を無視して、ご利用いただくほかありません。

現行の開発は、 Microsoft Excel for Microsoft 365 MSO (Version 2310 Build 16.0.16924.20054) 64-bit を主体としており、Windows 11(64bit)での稼働を確認しております。

上記Excelバージョンでの動作は確認しておりますが、Excelのバージョンの差異によって
若干挙動が異なる場合があります。
(Excel2003では、正常に動作しない場合があります。)

また、本バージョンについては、Windows10(64bit)上のExcel2016(32bit)の環境においての
再現性の高い不具合も確認されています。

具体的には、下記4.以降でのインストール後の作業をWindowsの再起動を実施するたびに実施しなければ、
VimExcelが稼働しないというものです。

高い再現性で、現象は確認できているものの、その根本原因についてはいまだ特定できておらず、
本リリースで本不具合の解消は行われていない点について、ご了承ください。

本不具合の原因、解消法等ご存知の方がおられるようでしたら、下記7.の連絡先のいずれかにご連絡いただければ
幸いです。

## 4. インストール方法

- インストール方法(Excel 2016)

Developer -> Excel Add-ins ->　Browse -> Vimexcelを選択 -> [OK]

上記Browseで表示されたAddInsフォルダに、zip解凍後に
VimExcel__(バージョン名).xlaを配置してください。

## 5. 起動・終了方法

Developer -> Excel Add-ins ->　Add-ins available:

インストールしたVimExcelの左側の□をチェックを外して、OK。

[Ctrl + M]で起動となります。
（ブックオープン時に自動起動する仕様となっています。上記不具合のため、正常に起動しない場合が多いです。）

同じく[Ctrl + M]で終了です。

## 6. ヘルプ

VimExcel起動後に、?により、簡便なヘルプが参照可能となっています。
また、ばしゅらさん - https://twitter.com/basyura - に作成いただいた資料を元に
PowerPointによるヘルプ資料を作成いたしました。
またExcelファイルには、ほぼすべてのコマンドが記載されています。

## 7. アンインストール方法(Excel 2013)

Developer -> Excel Add-ins ->　Browse

上記で表示される"Add-ins available:"のVimExcel_(バージョン名)のチェックを外し、
"Browse"で表示されたAddInsフォルダから、VimExcel_(バージョン名).vbaを削除してください。
(Excelが起動しており、削除できない場合には、Excel終了後にAddInsフォルダから削除してください。)

## 8. 開発者

藤原 崇（ふじわら たかし）

ご不明な点は、

https://twitter.com/VimExcel

もしくは、

vimexcel@outlook.com

までご連絡ください。

改修要望や、バグ報告等ご連絡頂ければ、可能な限り対応したいと考えております。

よろしくお願いいたします。

## 9. 関連情報

Vimxls (Vim emulator for Excel files) Vimの操作感をExcel上で実現するアドイン
http://www.vector.co.jp/soft/dl/winnt/business/se494158.html

窓の杜 - 【REVIEW】「Microsoft Excel」に「Vi」「Vim」風の操作をもたらすマクロ「Vimxls」
極力マウスを触りたくない人におすすめ
http://www.forest.impress.co.jp/docs/review/20120322_519415.html
【Python】stringの扱いについて

# はじめに
Pythonのstrのformatメソッドについて記載したいと思います。
Pythonのソースコードは直感的に利用できます。文字列連結については単純に＋演算子で連結可能ですが連結回数が多いほど可読性は低くなります。
一方でformatメソッドを利用することで、文字列連結は不要となるため、可読性が向上します。

Python基本構文については[【Python入門】基礎構文のまとめ](https://qiita.com/atsuuun/items/60e2cec16add7091b109)でまとめてますので、参考にしてください。


# stringの操作
stringモジュールのformatメソッドを用いることで独自の文字列フォーマットとしてカスタマイズ可能となります。

## ポジション指定
ポジション指定のフォーマット例になります。
{0}と記載することで、第１引数を参照します。
{}と記載することで位置引数指定を省略可能となります。
"{0} {1}"は"{} {}"と同じ意味になります。
```python
    # ポジション指定
    print("1:{0}".format("first"))
    print("2:{}".format("first"))
    print("3:{} {}".format("first","second"))
    print("4:{0} {1}".format("first","second"))
```

## keyword指定
keywordを指定のフォーマット例になります。
playersの例は配列要素へのアクセス例となります。
```python
    # keyword指定
    print("5:{name}".format(name="name0"))
    print("6:0.{weight}".format(weight=100))
    print("7:{players[0]}".format(players=["name1", "name2", "name3"]))

```

## 変換
str,repr,asciiへの変換例になります。
\_\_str__、__repr__等の組み込み関数を利用することも可能となります。
3つ目の例については非ascii文字は\uでエスケープします
```python
    # 変換
    print("8:test {0!s}".format(Person("name", 20)))
    print("9:test {!r}".format(Person("name", 20)))
    print("10:test {0!a}".format("テスト"))

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self) -> str:
        return "Str Person(name={0}, age={1})".format(self.name, self.age)

    def __repr__(self) -> str:
        return "Repr Person(name={0}, age={1})".format(self.name, self.age)

```

## 要素へのアクセス
配列の要素指定のフォーマット例となります。

```python
    # 要素へのアクセス
    element = (1, 2, 3)
    print("11:{0[0]}".format(element))

```

## 定数

#をつけることで、プレフィック付き指定のフォーマット例となります。
```python
    # 定数の指定(プレフィックスなし)
    print("12:int:{0},hex:{0:x},bin:{0:b}".format(100))
    # 定数の指定(プレフィックス付き)
    print("13:int:{0},hex:{0:#x},bin:{0:#b}".format(100))

```

## 数字のセパレーター
カンマをつけることで数字のセパレーター付き指定のフォーマット例となります。
```python
    # 数字のセパレーター
    print("14:{0:,}".format(1000000))
```

## 時刻変換
時刻の書式指定のフォーマット例となります。
```python
    # 時刻の変換
    d = datetime.datetime(2019, 1, 2, 23, 5, 8)
    print("15:{:%Y-%m-%d %H:%M:%S}".format(d))
```

# まとめ

string操作についてはコーディング規約には記載しないことが多いため、既存ソースを参照して作成することが多くなると思います。参照したソースがコードレビューを終えている場合、問題ない操作方法と判断されると思います。
単純な文字列連結については問題ないですが、少し複雑なstring操作を行う場合はformatを利用してみてください。
paizaラーニングレベルアップ問題集の「一番小さい値」を色々な言語でやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[一番小さい値](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num)を色々な言語でやってみました。対象は[コードモンスター大図鑑](https://paiza.jp/code_monster)で対応している9言語です。
- - -
###### 方針
主に

- 一つずつ最小値を更新する方法
- 配列に要素を一つずつ格納し、最小値を求める方法
- 配列を一度に作成し、最小値を求める方法

の3種類のうち、各言語1～2種類のコードを書いていきます。
- - -
###### PHP
```php
<?php
	$nums = [];
	for($i = 0; $i < 5; $i++)
		$nums[] = fgets(STDIN);
	echo min($nums);
?>
```
- - -
###### Ruby
```rb
nums = []
5.times do
	nums << gets.to_i
end
p nums.min
```
```rb
p 5.times.map { gets.to_i }.min
```
- - -
###### Java	
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int min = sc.nextInt();
		for (int i = 1; i < 5; i++) {
			int num = sc.nextInt();
			min = Math.min(min, num);
		}
		sc.close();
		System.out.println(min);
	}
}
```
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] nums = new int[5];
		for (int i = 0; i < 5; i++) {
			nums[i] = sc.nextInt();
		}
		sc.close();
		System.out.println(Arrays.stream(nums).min().getAsInt());
	}
}
```
- - -
###### Python
```py
nums = [0] * 5
for i in range(5):
	nums[i] = int(input())
print(min(nums))
```
```py
print(min(int(input()) for _ in range(5)))
```
- - -
###### C言語
```c
#include <stdio.h>

int main(void){
	int min;
	scanf("%d", &min);
	for (int i = 1; i < 5; i++) {
		int num;
		scanf("%d", &num);
		if (num < min)
			min = num;
	}
	printf("%d\n", min);
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	static void Main()
	{
		int min = int.Parse(Console.ReadLine());
		for (int i = 1; i < 5; i++) {
			int num = int.Parse(Console.ReadLine());
			min = Math.Min(min, num);
		}
		Console.WriteLine(min);
	}
}
```
```cs
using System;
using System.Linq;

class Program
{
	static void Main()
	{
		int[] nums = new int[5];
		for (int i = 0; i < 5; i++) {
			nums[i] = int.Parse(Console.ReadLine());
		}
		Console.WriteLine(nums.Min());
	}
}
```
- - -
###### Javascript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
let min = lines[0];
for(var i = 1; i < 5; i++) {
	min = Math.min(min, lines[i]);
}
console.log(min);
```
```js
// 2024-08-25 .trim()を追加
console.log(Math.min(...require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n")));
```
- - -
###### C++
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
	vector<int> nums(5);
	for (int i = 0; i < 5; i++) {
		cin >> nums[i];
	}
	cout << *min_element(nums.begin(), nums.end()) << endl;
	return 0;
}
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	var min = sc.nextInt()
	for (i in 1 until 5) {
		var num = sc.nextInt()
		min = Math.min(min, num)
	}
	sc.close()
	println(min)
}
```
```kotlin
fun main() {
	val nums = List(5) { readLine()!!.toInt() }
	println(nums.min())
}
```
(UNO)センサーの値0...1023を0...約3.3Vに変換してあそぶ(3倍して15.625掛けて16で割り1/10足す)


x 単位は、mV
x 軽量高速化、みやすさ重視
x Arduino UNO互換機


目的
ADCの結果を電圧に変換する。
小マイコン用に容量を減らす

いろいろ
適当にインターネット見ていると、基本は、
電圧変換は、単精度浮動小数を使うみたいな、
利用者の大多数が初心者でmVもシフト演算も
やっていなく、
ボリュームを回して喜ぶレベルだと?(はてな)が付く。

小ネタ

これも、マジックナンバーやーーー

15.625 = 2.5 x 2.5 x 2.5

4000 = 15.625 x 256





結果

![o_coq307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/48c25165-be0f-4e23-43fa-b6586a94f6cc.jpeg)


プログラム

オンラインコンパイラ


```c++

//ADC_0__3_3_x15_UNO_1

//初期化
void setup() {

  //シリアルポート初期化とメッセージ
  Serial.begin(9600);
  Serial.println("START");

  int s; //センサーの値
  unsigned int vo; //電圧

  s = 1024; //センサーの値を1024

  //センサーの値から電圧に変換(x3 x15.625/16 1/10)
  vo = s;
  vo = vo + vo + vo;
  vo = ((vo * 15U) + (vo >> 1) + (vo >> 3)) >> 4;
  vo = vo + (vo / 10);

  //センサーの値と電圧を表示
  Serial.print(s);
  Serial.print(',');
  Serial.print((int)vo);
  Serial.println();

}//setup

//メインループ
void loop() {
}//loop


```
【Unity】TextMeshProで日本語を表示する方法

## まえがき
UnityのTextMeshProを使用する際、日本語を表示させたいときがあると思います。
しかし、デフォルトで用意されているフォントでは日本語を表示しようとすると下の写真のようになってしまい、正しく表示されません。

![スクリーンショット 2024-08-10 205225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/ac24820d-1114-77f8-c6d9-2d6e1ee64ec5.png)

今回は、日本語が対応しているフォントをUnityにImportすることによってこの問題を解決していきます。

## フォントのダウンロード
[Google Fonts](https://fonts.google.com/?subset=japanese&script=Hira)からフォントをダウンロードします。
URLを踏むと様々なフォントがダウンロードできるサイトに移動します。

![スクリーンショット 2024-08-11 015212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/abae47b7-9ece-477c-c373-c0c484402f74.png)

さて、今回は一番上に表示されている[Noto Sans Japanese](https://fonts.google.com/noto/specimen/Noto+Sans+JP?subset=japanese&script=Hira)をダウンロードします。

URLをクリックした後、右上の**Get Font**をクリックして、**Download all**からフォルダをダウンロードできます。zipファイルは解凍しておきましょう。

## 日本語データのダウンロード
[日本語文字コード](https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4#file-japanese_full-txt)から日本語文字コードをダウンロードしていきます。

右上の**Download zip**をクリックするとzipファイルがダウンロードできるので解凍しましょう。

:::note info
解凍したフォルダを開いて、**japanese_full.txt**という名前のテキストファイルが入っていることを確認しましょう。
:::

## Unityへの導入
さて、以上で準備は完了です。Unityで実際に日本語対応フォントを使えるようにしていきましょう。

### フォントの追加

Project内で初めてTextMeshProをUIで生成しようとすると、このようにTMPをImportするように言われるので両方Importしましょう。

![スクリーンショット 2024-08-11 021837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/e3306501-9a24-e8b3-ed24-f5e4c4ec91e7.png)

:::note info
Assetsフォルダ内にTextMesh Proというフォルダが生成されます。
:::

先ほど[Google Fonts](https://fonts.google.com/?subset=japanese&script=Hira)からダウンロードしたNoto_Sans_JPというフォルダの中にある**static**というフォルダを開くと.ttf形式のファイルが複数あります。

これらは、選ぶ種類によって文字の太さや大きさなどが異なります。
[Noto Sans Japanese](https://fonts.google.com/noto/specimen/Noto+Sans+JP?subset=japanese&script=Hira)を開き、下にスクロールすることで実際のフォントを種類ごとに確認できるので、どの種類を使用するか決めましょう。

先ほど生成されたAsset → TextMesh Pro → Fontsフォルダ内に、選んだ種類のフォントの.ttfファイルを追加しましょう。

続いて、Window → TextMeshPro → Font Asset Creatorを選択します。

![スクリーンショット 2024-08-11 022500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/72f25088-5ca2-9f8d-146d-0f1fdb2789ea.png)

すると、下の写真のようなタブが表示されます。

変更する場所は**Source Font File**と**Custom Character List**の2点だけです。

![スクリーンショット 2024-08-11 023231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/a393a408-25ad-ba8f-42e2-506b371b9a1d.png)

**Source Font File**の部分は先ほどFontsフォルダに追加したファイルを選択しましょう。

**Custom Character List**に書いてあるテキストは一度全て削除し、[日本語文字コード](https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4#file-japanese_full-txt)からダウンロードしたフォルダ内にある**japanese_full.txt**の中身をコピペしましょう。

以上の変更ができたら一番下にある**Generate Font Atlas**をクリックして処理の完了を待ちます。少し時間がかかるので気長に待ちましょう。

処理が終了したら下のような画面になるので**Sava**をクリックして適当な場所にデータを保存します。

![スクリーンショット 2024-08-11 030415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/969f1293-c601-98c7-7812-9f208767a9e1.png)

以上で日本語フォントの追加が完了です!

### 動作確認

上手く行っていればInspectorからTextMeshProで、Font Assetから追加したフォントを選択することができます。

![スクリーンショット 2024-08-11 030849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/8bcf78bc-c2e3-7330-9797-c54f6c0a46e0.png)

無事日本語が表示されるようになれば成功です。お疲れ様でした。
限界集落言語XAML入門～0歳児編～

**C＃ちゃんプログラミング言語オブザイヤー2023受賞おめでとう！**
XAMLもようやく日の目を見ることができた―――――――のか？

そんなわけないだろう
だってXAMLだぜ？！

PythonやJavascriptがプログラミング言語の1丁目1番地だとしたら、XAMLは限界集落も良いところです。
それだけにインターネット上に情報が限られてるという由々しき事態。
そんなプレミアム言語であるXAMLの習得を目指す勉強熱心なあなたに私の知っているXAMLのすべてを教えていきたいと思う。

というくだらない前置きは終わりにして、ではXAMLのことを全く知らない0歳児向けの内容から始めていきたいと思います。
何事もステップが肝心ですからね。

# XAMLとは
- XAMLとはXML記法のマークアップ言語である

はい。それ以上でもそれ以下でもありません。
XAMLはUIフレームワークのための～という解説をよく見かけます。それも事実です。
元はWPF(Windows Presentation Foundation)のUIを記述するための言語として産み落とされました。

簡単な例を見てみましょう。
次のコードは画面の中央に「Hello world!」という文字列を表示するためのものです。

```XML:sample.xaml
<Grid>
  <TextBlock Text="Hello world!" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
```

GridというのはUI要素のコンテナの役割を持ちます。
TextBlockはテキスト要素を画面に描画するためのタグです。

少しHTMLを書いたことがある人ならわかると思いますが、画面の中央に文字を表示するということをHTMLでやろうとすると意外と大変だったりします。
**それがXAMLだとこれだけの記述で済んでしまうのですから、XAMLってとっても素晴らしいですね**。

さて、ご覧のとおりXAMLというのはHTMLと同様にXML形式でコードを記述します。
とりあえず0歳児向けとしてはそれだけ覚えて頂けたらと思います。


# 本日のおさらい
- XAMLは**超簡単にUIを記述できる**XML形式のマークアップ言語である

# 次回
### ここまで読めたなんて頑張りましたね！
**あなたならできると信じていましたよ！**
次回も頑張っていきましょう。
次回はUWPプロジェクトを作成してボタンを配置していきたいと思います。
脳を発達させるためには手で触って動くことを感じる必要があります。

それでは、また！
解いてみた。「Dランク：足し算」

# 問題
[「Dランク：足し算」](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nA = sc.nextInt();
        int nB = sc.nextInt();

        int nSum = nA + nB;
        System.out.println(nSum);
    }
}
```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。

## 足し算
標準入力から取得した値 nA と nB を足し、表示しています。
【学習記録　2024-08-11】　　JavaScript

## 教材を使用する
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：0.5h
- 配列を操作するメソッド
#### 学習メモ
pushメソッドを使用すると、配列の末尾に値を追加する。

unshiftを使用することで配列の先頭に追加することができる。

```jsx
let items = [0, 1, 2];
items.push(3); // [0, 1, 2, 3]

------------------------------------

items.unshift(3); // [3, 0, 1, 2]
```

popメソッドを使用すると、配列の末尾を削除する。また、削除した値を戻り値として返す。

shiftを使用することで配列の先頭を削除することができる。

先頭を操作するため先頭以降のプロパティをすべてずらすため処理速度が低下してしまう。
```jsx
let items = [0, 1, 2];
items.pop(); // [0, 1]

-----------------------------

items.shift(); // [1, 2]
```

## 所感
　配列の操作方法は以前学習したことがあったためすんなり理解できました。
 ただ、shiftとunshiftの処理速度は考えたことがなかったため気をつけたいと思います！
Vagrantを利用してLinux検証環境を構築

## 実施すること
ローカルPC上にVirtualBoxでlinux（CentOS）サーバーを立ち上げる。
VirtualBoxの管理にはVagrantを利用。

サーバー系の学習をするにあたって、すぐに手元でコマンドの動きを確認できる環境が欲しかったので構築してみました。
調べてみると真っ先にVirtualBoxがヒットしましたが、それと同時にVirtualBoxを制御するのにVagrantが便利という記事もあったので、ついでにVagrantも使ってみました。

## 前提環境
ローカルOS:windows11
virtual box　(https://www.virtualbox.org/)



## VirtualBoxとは
Oracle社が提供しているフリーソフトで、1台のPC上で既存OSと異なるOSを構築することを可能にしてくれます。

以下のようなイメージです。
WindowsOSの上に1台のWindows、1台のLinux（CentOS)を構築することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/222190af-cde8-6675-671a-bff4a131c961.png)


## Vagrantとは
上でVirtualBoxの説明をしましたが、VagrantはVirtualBox等のソフトウェアからの仮想環境構築をより容易に構築/管理/配布できるソフトウェアとなります。
通常VirtualBoxで仮想環境を構築する際、GUIで1つ1つ手動で構築する、もしくはVBoxManageコマンドを使ってCUIで仮想マシンの起動等を行いますが,
VagrantはVagrantfileという1つの設定ファイルで複数の仮想マシンを管理することができます。

じゃあVirtualBoxは必要ないのでは？と最初勘違いしてしまいましたが、あくまでVagrantはVirtualBoxを代理で操作するソフトウェアですのでVirtualBoxは必要です。
Vagrant自体には仮想化機能は持っていないので、、VMwareやVirtualBoxは別途必要だということですね。

## 構築手順

### 1.virtualboxをPCにインストールします
Vagrant公式ページ
http://www.vagrantup.com/


### 2.vagrantをPCにインストールします
Virtualbox公式ページ
https://www.virtualbox.org/
私はVirtualbox V7を利用します

### 3.boxを選択します
以下からこれから構築したいVMのOSを探し、URLをCopyします。
https://www.vagrantbox.es/
私はCentOS7を利用します
このboxがこれから構築されるゲストOSに相当します。

### 4.PCのCLI操作し3でコピーしたboxをvagrantに追加します。
私はCLI操作はwindowsのvscodeからgit bashを利用します。
```
vagrant box add {title} {url}
```
{title}は任意ですが、OSが分かりやすい名前とすることをお勧めします
{url}は3のURLを利用します。

コマンド例
```
vagrant add box centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
```

### 5.PC環境で仮想環境を生成
PCのCLIから以下コマンドを実行
```
vagrant init
```

しばらくするとVagrantfileファイルがvagrant init実行したディレクトリ内に生成されます。

### 6.Vagrantfileの編集
ここで生成されたVagrantfileがVagrantから構築するVMを管理するファイルとなります。
viコマンド　もしくはvscodeなどで編集します。
私は以下に編集しました.

```
  config.vm.define "vm1" do |vm1|
    vm1.vm.box = "centos/7"
    vm1.vm.hostname = "vm1"
    vm1.vm.network "private_network", ip: "192.168.50.4"
  end
```

それぞれの編集の意図を伝えると
```
config.vm.define "vm1" do |vm1|
```
→vm1の部分は任意の名前になります。
これ以降今回構築するvmのパラメータはvm1.vm.**と定義していくことになります。

```
vm1.vm.box = "centos/7"
```
→"centos/7"は4で出てきた{title}を利用します。

```
vm1.vm.hostname = "vm1"
```
→これから構築するVMのhostnameを定義

```
vm1.vm.network "private_network", ip: "192.168.50.4"
```
→固定のプライベートIPアドレスを定義

### 7.vagrantでデプロイ
Vagrantfileで編集した内容を以下コマンドでデプロイ
```
vagrant up
```

### 8.デプロイしたVMにログイン
```
vagrant ssh vm1
```

vm1にログインが確認出来たらデプロイ成功となります。

## 実際に触ってみて
今回は1台だけ構築しましたが、もう一台VMを構築するとなった場合
Vagrantfileでconfig.vm.define "vm1" do |vm1|～endまでをコピーして
IPアドレスやホスト名などの固有値を変更してvagrant upするだけなので、確かにvirtualboxの手動操作よりかは管理しやすいのかと思います。
今回は私自身初めてということもあり、基本的な機能のみVagrantfileに定義しましたが、実際シェルスクリプトの利用やPCのディレクトリをVMのディレクトリにマウントする事など色々出来るようなので、より機能を理解すると、より便利に感じるかもしれません。
以上です。
proconio::fastoutがfastout: missing expanderとなりVSCodeで警告がでるようになった

## 解決策

- `rustup update`
- VSCodeアップデート

参考にしたissue

https://github.com/rust-lang/rust-analyzer/issues/17777

## コマンド

```
rustup -V    
rustup 1.26.0 (5af9b9484 2023-04-05)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.71.1 (eb26296b5 2023-08-03)`
```

```
rustup update
```

```
rustup -V     
rustup 1.27.1 (54dd3d00f 2024-04-24)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.80.1 (3f5fd8dd4 2024-08-06)`
```
解いてみた。「Dランク：一番小さい値」

# 問題
[「Dランク：一番小さい値」](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        // 最小値を設定（最大値100より大きな値を指定）        
        int nMin = 99999;

        for (int i = 0; i < 5; i++) {
            int nN = sc.nextInt();
            if (nMin > nN) {    // 暫定最小値より値が小さい？
                nMin = nN;  // 暫定最小値を更新
            }
        }        
        
        System.out.println(nMin);
    }
}
```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。

## 最小値の比較
暫定最初値 nMin と、標準入力から取得した値 nN を比較し、nNの方が小さければ、暫定最小値を更新しています。
【Control Tower】AWSでのマルチアカウント運用について調べてみる

# Cotrol Towerとは
一言でいうと、「マルチアカウント環境の自動プロビジョニングを行うマネージドサービス」
Cotrol Towerではマルチアカウント環境のことをランディングゾーンと呼んでおり（Cotrol Tower特有の名称ではないが）実態としては以下の構成となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/7b879b0d-24f6-32f9-d5c1-5ab31e7b70c0.png)
デフォルトで作成される「管理／監査／ログ・アーカイブアカウント」をまとめて共有アカウントと呼んでいる。

# Cotrol Towerで出来ること
<a href='https://www.youtube.com/watch?v=e5yugZZXxW8'>AWS Black Belt AWS Control Tower 基礎編</a>で紹介のある通り、以下5つのカテゴリで"Cotrol Towerで出来ること"を紹介する。

## ログ集約
各アカウントのAWS ConfigとCloudTrailのログをログ・アーカイブアカウント内のS3バケットに集約している。
AWS Control Towerでアカウントを作成したタイミングからログの集約は開始される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/03ffa578-69ed-9ada-2018-b5b27500a9fd.png)
## コントロール適用
コントロール設定にて、マルチアカウントを不適切状態に遷移させない様統制をきかせることができる。
コントールは400を超えるプリセットから選択可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/aee1038c-698d-2b74-155a-5c93485fd351.png)
コントールの動作は以下の３種類。
| 動作の種類 | 詳細 | 実装方法 |
|:-:|:-:|:-:|
|予防コントロール|対象の操作を実施できないようにする|OrganizationsのSCP|
|検出コントロール|望ましくない操作を行った場合に発見する|Config Rules（SecurityHubと連携）|
|プロアクティブコントロール|ルールに沿ったリソースのみを作成可能にする|CloudFormation Hooks|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/c394766d-550d-8922-e4fe-b4c37d350d2e.png)
発見的統制／予防的統制のガードレルを適切に敷く必要があります。

## 通知
AWS Configで把握したAWSリソース変更情報とConfig Rulesの準拠状況をSNSにて通知する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/84176c06-a725-5fdc-168c-987428241d9e.png)

## ID一元管理
IAM Identity Centerと各アカウントを連携することで、各アカウントのユーザ情報をIAM Identity Centerで一元管理する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/93056cb0-c648-d24f-fa9b-a51bb88fbe1b.png)

## AWSアカウント作成とプロビジョニング
Account Factoryにてガバナンスの効いたアカウントを作成する。
アカウント作成時には、Service Catalog、CloudFormation StackSetsを用いてベストプラクティスに沿ったリソース群をデプロイすることで効率的なプロビジョニングを実現する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/766adfe1-d972-a76d-7276-d835db07702e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/d40dbcf7-1f01-f556-d853-ecc02338dc83.png)

# ダッシュボード
Control Towerダッシュボードより、管理アカウント数や、非準拠リソースを参照可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992414/08416f3c-aaf9-4942-a835-24900d8132a4.png)
Pythonで解いたっpaizaのキャンペーン対象問題（RANK D）

https://paiza.jp/pages/campaign/paiza-qiita

paizaコラボ企画ということで。順番はキャンペーン対象問題の順で。

Pythonを始めた人やDランク水準の人はこちらの記事を読むことをお勧めします。

https://zenn.dev/yuhi_ili/articles/c8c6d08c882efb

## 問題を解く前に

### 1.まず、標準入力はできますか？

https://paiza.jp/works/mondai/stdin/problem_index?language_uid=python3

分からないなら上の問題を解きましょう。こちらの[zennの記事](https://zenn.dev/yuhi_ili/articles/c8c6d08c882efb#%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E5%95%8F%E9%A1%8C%E3%82%BB%E3%83%83%E3%83%88)に標準入力の例が載ってあるので分からないなら素直に読みましょう。
あとはQiitaでPythonの標準入力をまとめている記事があるのでそれも読んでおくことをおすすめします。

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785

### 2.問題を解きましょう。

こんな駄文を読むより問題を解きましょう。paizaとQittaコラボ記念に記事を書くのもいいですね。

## 文字の一致

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

```py
# coding: utf-8
a = input()
b = input()
if a == b:
    print("OK")
else:
    print("NG")
```
こんな入力も可能である。
```py
# coding: utf-8
print("OK" if input() == input() else "NG")
```
`==`ではなく`in`を使うとPythonらしく見える。ただし「見える」だけであって、部分一致なので解法としては合ってないが。
```py
# coding: utf-8
print("OK" if input() in input() else "NG")
```


## 一番小さい値

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num

Pythonには関数に最小値を取得するmin()がある。
```py
# coding: utf-8
input_line = [int(input()) for _ in range(5)]
print(min(input_line))
```
min()関数を使わない場合はこうする。
```py
# coding: utf-8
input_line = [int(input()) for _ in range(5)]
s = 100
for i in input_line:
    if i < s:
        s = i
print(s)
```

## 足し算

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition

```py
# coding: utf-8
a,b = map(int,input().split())
print(a + b)
```
こんな解き方でも正解。
```py
# coding: utf-8
print(sum(list(map(int,input().split()))))
```
list型に`sum()`を使うと合計値が出力される。

## Eメールアドレス

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address

```py
# coding: utf-8
s = input()
t = input()
print(s + "@" + t)
```
これだけじゃないぞ！Pythonの標準出力達！
```py
print(s,end="@");print(t)
print(str(s)+"@"+str(t))
print(f"{s}@{t}")
print("{}@{}".format(s,t))
print("%s@%s" % (s,t))
```
こちらの解説は[zennの記事](https://zenn.dev/yuhi_ili/articles/c8c6d08c882efb#2-%E3%81%A4%E3%81%AE%E6%95%B0%E5%80%A4%E3%82%92%E5%87%BA%E5%8A%9B-1)で。

## 【殿堂入りキャンペーン】N倍の文字列

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square

```py
# coding: utf-8
N = int(input())
print("*" * N)
```

ここまで解けたなら簡単な解法ではなくfor文を使って解いてみよう。
```py
N = int(input())
for _ in range(N):
    print("*",end="")
```
ここまでできる人なら解説はいらないと思われるが、一応解説しておくとこんな感じで動いている。
```py
N = int(input())
```
Nにint型の標準入力を代入する。
```py
for _ in range(N):
```
for文を使ってNの回数分繰りかえす。アンダーラインは変数を使わないという明示ができる。
```py
    print("*",end="")
```
アスタリスクを標準出力する。このとき、`print()`だけだと改行を行うので、それを阻止するために`print( ,end="")`とし改行を防ぐ。

## さいごに

ここでしっかりと解説する気力はないので上の[zennの記事](https://zenn.dev/yuhi_ili/articles/c8c6d08c882efb)を読んでください。ぜんぶ載ってます。
しかしこうやって解いてみるとPythonは本当に簡単な言語だな・・・。
SQLSeverクエリチートシート（自分用）

## はじめに
備忘録用です。
## 時間系
### 現在時刻の取得(日本時間)
```sql
DATEADD(hh,9,GETUTCDATE())
```
### テーブル内の日付データの最古のデータと現在の日付差分を取得する
```sql
SELECT
  DATEDIFF(DAY, MIN(tableA.hiduke_data), DATEADD(hh,9,GETUTCDATE())) as '日付差分'
FROM tableA
```
### 日付データを文字列に変換する
```sql
SELECT
  -- CONVERT(変換後のデータ型, 日付データ, format指定数値) 
  CONVERT(NVARCHAR, hiduke_data,121) as 'yyyy-MM-dd hh:mi:ss.mmm'
  , CONVERT(NVARCHAR,hiduke_data,120) as 'yyyy-MM-dd hh:mi:ss'
  , CONVERT(NVARCHAR,hiduke_data, 23) as 'yyyy-MM-dd'
FROM tableA
```

## 文字列操作系
### 数値⇨文字列変換
```sql
CONVERT(nvarchar,1000)
```
### 文字列長算出
```sql
LEN('hogehoge')
```

## 参考
https://learn.microsoft.com/ja-jp/sql/t-sql/functions/getutcdate-transact-sql?view=sql-server-ver16

https://learn.microsoft.com/ja-jp/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16

https://bioscryptome.t-ohashi.info/sql/convert-int-to-string/#str
解いてみた。「Dランク：文字の一致」

# 問題
[「Dランク：文字列の一致」](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String sA = sc.next();
        String sB = sc.next();
        
        if (sA.equals(sB)) {
            System.out.println("OK");
        } else {
            System.out.println("NG");
        }
    }
}
```

# 解説
## 標準入力からの文字列の読み取り
Scanner インスタンスを作り、next()メソッドで文字列を取得しています。

## 文字列の比較
String クラスの equals() メソッドで、文字列が一致するか調べています。
フルスタックプログラマーになりたければ、このロードマップに従うな！

## お前は何がしたいんですか？
**「映画監督になれるやつっていうのは、映画監督になりたいやつじゃなくて、映画を撮りたいやつ」** 昔、たけしがこういう感じの事を言ってたんだけど、これはまさにバスっと的を得ているなあと、頭に残っておりました。

映画監督って、俳優に囲まれて華々しく見えて、なんかクリティブでカッコイイよねって事で、特に撮りたい映画もないのに、映画監督っていう職業になりたいなあっていうのは、なんか筋が外れているよね。
映画っていう表現が三度の飯より好きで、それに取り憑かれ、で、撮り続けた結果、世間的に映画監督という肩書きになっているわけであって。
坂本龍一も、自分はプロのミュージシャンっていう意識がなくて、何となく音楽をずっと作り続けてきただけなんだっていう事を著書に書いていて、通じるものがあるなあと感じました。
Pixerのジョン・ラセターも、芸大を卒業し、ずっとコンピューターで作るアニメに取り憑かれてきて、ジョブスが元々グラフィック用ハードウェアを作るためにLIMのCG部門を買収してPixerを立ち上げた後も、営業用にと言い訳しながら、ジョブスに隠れてずっとアニメーションを作り続け、結局ハードウェア事業はポシャり、アニメがヒットし、いつの間にかPixerはアニメーションの会社として大成功を収めてしまったというストーリーもある。

で、プログラマーである。

## ロードマップに乗って、ロードで野垂れ死にしないように
これからはITの時代で、生活のあらゆるとこにプログラムがあり、派手な株式上場や、成長率が前年比何倍っていうのはほとんどがIT企業で、少し前は仮想通貨、今はAI関連がなんかよく分からんけど凄いことになっている様な気になってくる。

で、今自分のやっている仕事は何の成長も見込めない、このままではアカン、将来野垂れ死にや、これからはプログラマーっていう職業が良いに違いない、その為にはなんかプログラムを勉強せなあかん、となって、始める人はかなり多いんじゃないかと思う。
つまり、**プログラマーっていう職業になりたい人**です。

プログラムを組んで作ってみたいものやイメージも無いのに、職業としてプログラマーになりたいという所がスタート地点になっている。
第一、第二世代くらいの活躍したプログラマーは、中学生とか高校の時にプログラムと出会い、ゲームだったりを作っていた人達が多い。つまり、職業以前に、何か作りたいものがあったわけだ。これって、やっぱり健全だと思う。
特に作りたいものもなく、イメージもなく、プログラマーという職業になりたい場合、一体どこからスタートするのか？どこにモチベーションを求めれば良いのか？これはかなり難しいスタート地点だと思う。それは、才能があるとかないとか、そういうのと別の次元で。
よく、どの言語を勉強すれば良いんですか？みたいな愚問を、エンジニア系のコミュニティーで見かけるけど、そんな事聞いてる時点で、やめた方がええと思ってしまう。
何か作りたいものが先にあれば、どの言語が必要で、どういったステップで習得していけば良いかは、もう歩いていけば自然に見えてくる。

巷のスクールは、そういった初心者迷子プログラマー向けに、とりあえずPHPとかJavaScriptとかを教えてウェブサイトを作るようなコース設定をしている所が多いけど、**そういうパスってもう凄いレッドオーシャン**で、スクール出たところで就職先など無いってなると、心折れへん？だって、就職するっていう目標の為に一生懸命勉強したわけで、それが叶わないと、一体数ヶ月の勉強は何だったのかとなるわけで、元々こういうウェブサイトやオンラインのサービスを作りたいっていうイメージを持っていれば、別に就職に多少失敗しても、その後も自分で作りたいものを作りつつ、腕を磨き、その先に就職っていうパスも見えてくる。

色んなところにロードマップ的なマニュアルがいっぱい出ているけど、そこに書かれている道筋は**１、２年経つと、もうかなり違うものになっている。**
目的地が見えていると、多少道筋が変わっても、対応していけるけど、辿り着きたい場所が分からないのにとりあえずそのロードに乗っちゃうと、**かなり絶望することになる。**
つまり、モチベーションがダダ下がりになり、苦痛を感じる様になり、そのロードの途上で野垂れ死ぬこととなる。

確かに、プログラマーやエンジニアって、他の多くの職業と同様に、一業種であって、その職種に就きたいからスキルを学ぶっていうのは、全然間違っていないし、それで新しい未来が開けることはよくあるし、**間違いなくポジティブなこと。**

ただ、なぜこういう事を書いてるかっていると、ロックダウンで自分自身仕事を失い、貯金も失い、とりあえずオンラインで外人に日本語を、日本人に英語を教えたりしてたんだけど、日本人に英語を教える場合、なんか凄く**勉強**っていう意識なんだよね。
何のために勉強したいのって聞くと、ステップアップとか、転職に生かしたいとか、TOEFLのスコアがとか、本当にそういう仕事の為の動機が多い。漠然としていて、イメージが湧きにくい。
行ってみたい国があって、一人で旅行できる様になりたいとか、海外で彼女を作りたいとか、世界中に友達が欲しいとか、そういうんじゃないんですよ。
外国人が日本語を習いたい理由を聞くと、好きなアニメをオリジナルで見たいとか、日本を旅行して、寿司やラーメンを食べたいとか、日本人の彼女が欲しいとか、そういうモチベーションが多い。すごくイメージしやすいし、その先に何か楽しそうな事が待ち受けてそうな気持ちになる。
勉強っていう意識でやってると、やっぱりつまらないっていうか、言語っていう凄く使えて楽しいツールを学ぶのが辛くなってくるような気がするんだよね。正しい発音とか、正しい文法とか。点数とか個別のスキルじゃなくて、もっと近い将来、海外できれいな彼女と屋台で飯食ってるとか、パリの落ち着いたカフェのテラスでカフェオレを飲んでいるとか、ギリシャの絵本みたいな街で、夜の散歩を楽しんでいるとか、そういうイメージがあった方が、楽しく、かつ上達も速いと思うんだよね。
これはプログラミングにも全然当てはまるなあと思うんですよ。

何の作りたいものも、イメージもなく、職業としてイケてそうイメージだけで、巷に溢れているスクールやロードマップに乗った結果、その途上で野垂れ死にという悲劇は避けて欲しいなあと。
その為には、一度色々と調べてみて、おっ、こんなん作ったら面白いんちゃうか というものを最初の時点で見つけておき、必要なスキルを学習した暁には自分の手で形にしてみるというイメージをしっかり持っておくというのは、ロードマップに乗る前に非常に大切だと思いますよという事を言いたかったのでした。
ABC366回答メモ

# 0.はじめに
　最近前より多くなった気がする素開催。
　B問題に難しいというか面倒な問題が
　最近増えてきている気がします・・・。
　今回は典型的な問題が多かった感じで
　Dまで解けました。
　おかげでレート+20で725まで持ち直しました。


# 1.A - Election 2
　都知事選もあった（といっても1月前か・・・。）ので
　選挙の問題。
　単純に、過半数を求めて、青木さんか高橋さんの
　得票数が肥えているかを判定してYesかNoを出力しました。

　https://atcoder.jp/contests/abc366/submissions/56519356


# 2.B - Vertical Writing
　最初は問題が何を言っているかさっぱりでしたが
　よく見たら横書きを縦書きに。とあり、ようやく理解できました。
　
　理解できたはいいけど、実装はまたなんか面倒な感じで
　こねくり回して回答しました。
　無駄なロジックが多い気がしますが、まぁACは取れました。
　
　【実装】
　　・文字列をリストSに格納
　　　・合わせて文字列の最長数を変数Mに保持
　　例題１の例のリストS
　　abc
　　de
　　fghi
　　・文字列をM文字に合わせ、後ろを*で埋めたリストTを作成
　　例題１の例のリストT
　　abc*
　　de**
　　fghi
　　・リストansにM行Tの行列を入れ替えた文字列を登録
　　例題１の例のリストans
　　fda
　　geb
　　h*c
　　i**
　　・リストansの後ろにある*を除外し
　　　1行ずつ表示して終了
　　例題１の出力例
　　fda
　　geb
　　h*c
　　i

　https://atcoder.jp/contests/abc366/submissions/56539636


# 3.C - Balls and Bag Query
　よくある問題で球の出し入れにより
　種類数が増減する場合に種類数変数を増減させることにより
　種類数をいちいち数えないで済ませるという手法で
　すんなりACでした。
　【考え方】
　　・デフォルト(int)辞書Dにキーx、値xの球の数を保持
　　・種類数変数Sを0で初期化
　　・球を入れる時、辞書D[x]の値が0の時、Sに1加算
　　・球を出す時、辞書D[x]の値が1の時、Sから1減算
　　・表示はSを表示
　Bよりは簡単だった気がしました。

　https://atcoder.jp/contests/abc366/submissions/56543016


# 4.D - Cuboid Sum Query
　こちらも、難しいと言うか面倒な問題。
　累積和で解くのはわかったので、あとは、粛々と
　実装するだけ。
　昔解いた似たような問題から
　ロジックを持ってきてつなぎ合わせた結果ACとなりました。

　https://atcoder.jp/contests/abc366/submissions/56561653


以上
ChromeBookの仮想Linuxに入れたVScodeでLiveサーバーを起動し、同NW内の他端末からアクセスする

やり方を忘れることはないと思うが、念のため備忘録として。
安上がりな開発環境端末としてはchromebook案外良いなと思う。

## 経緯
・11年前のMacbookProがとうとうポンコツになってきた
・Webとsshを使えれば何でもよく、LenovoのN100搭載ChromeBookを買ってみた
・ChromeBookの持ち運びやすさも相まって使用頻度が増え、それ単体で色々やってみたくなった
・ChromeBook内の仮想LinuxにVScodeを入れて単体で言語(JavaScriptなど)の勉強をしてみたくなった
・VScodeのLiveサーバー便利だけど、iPhoneからアクセスしたときのページの見た目とか気になる

## 試したこと
仮想Linux上では`localhost:5500/test/index.html`へアクセスすればLiveサーバーで立ち上げたページを見ることができる状態である。
仮想Linux内のIPアドレスを見つけて、iphoneで`localhost`部分を置き換えてアクセスしようとlinuxで`ip addr show`を叩いたところ、どう見ても家のNWのIPアドレスとは違う。
ChromeOS内で仮想Linuxを立てている関係上、内部で仮想NW作ってブリッジしたりよしなにやっているらしい
また、ChromeOSのブラウザ上でも`localhost:5500/test/index.html`で見ることができるので、iPhoneでChromeOSのIPアドレスで置き換えてアクセスしてみたが、それでもダメ。

## 対処法
ChromeOSと仮想Linuxの間でポートフォワードだけしてあげれば良いらしく、またその設定が簡単にできるようだった。

ChromeOSの「設定」を開く
設定内検索窓で「ポート」と打ち込み検索
ポートフォワード設定があるので、仮想Linuxで使用してた5500番ポートを指定
これだけで、同じNWの別端末から`ChromeOSのIPアドレス:5500/test/index.html`と打つことで接続ができるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190730/c7f4d226-3a45-bea2-621b-de20c5df55dc.png)

testとしか書いていないが、iPhoneからもアクセスができた。
![IMG_7541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190730/aa2c2141-8432-c3c7-0bd5-0a4bcd841f2e.png)
【Swift】ViewControllerの階層をログで確認する【UIKit】

## はじめに
ビューコントローラーの階層構造を追う際にデバッグとしてログ出力したい場面があったので、忘備録として記載します。


## コード解説
以下のメソッドをターゲットクラス内の適当な場所に定義します。

``` swift
func logCurrentViewControllerHierarchy() {
    print("現在のビューコントローラー階層:")
    
    // ナビゲーションスタックのログ
    if let navigationController = self.navigationController {
        print("ナビゲーションスタックのビューコントローラー一覧:")
        for (index, viewController) in navigationController.viewControllers.enumerated() {
            print("Index \(index): \(String(describing: type(of: viewController)))")
        }
    } else {
        print("ナビゲーションコントローラーが見つかりません。")
    }
    
    // モーダルプレゼンテーションチェーンのログ
    var currentVC: UIViewController? = self
    print("モーダルプレゼンテーションチェーンのビューコントローラー一覧:")
    while let presentingVC = currentVC?.presentingViewController {
        print("\(String(describing: type(of: presentingVC)))")
        currentVC = presentingVC
    }
}
```

## 各要素の解説
**navigationController**
現在のビューコントローラーが所属するナビゲーションコントローラーを取得する。

**viewControllers** 
ナビゲーションスタックに含まれるビューコントローラーを配列で取得し、各ビューコントローラーのクラス名をログに出力する。

**presentingViewController**：
現在のビューコントローラーがモーダルとして表示されている場合、その親ビューコントローラーを辿ってログに出力する。


## 使用例
#### 画面ロード完了後
``` swift
override func viewDidAppear() {
    super.viewDidAppear()
    
    // ビューコントローラーが表示されたときに階層をログに出力
    logCurrentViewControllerHierarchy()
}
```

#### ボタンタップ時
``` swift
@IBAction func someButtonTapped(_ sender: Any) {
    // ボタンがタップされたときに階層をログに出力
    logCurrentViewControllerHierarchy()
}
```

#### 特定のイベント後（例：画面遷移時）
``` swift
func transitionToNextScreen() {
    // 次の画面に遷移する
    let nextViewController = NextViewController()
    self.navigationController?.pushViewController(nextViewController, animated: true)
    
    // 遷移後の階層を確認
    logCurrentViewControllerHierarchy()
}
```

## 出力結果例
SettingViewController がナビゲーションスタックに存在しているかつ、AlertControllerがモーダルで表示されている場合の出力例
```
現在のビューコントローラー階層:
ナビゲーションスタックのビューコントローラー一覧:
Index 0: ViewController
Index 1: SettingViewController
モーダルプレゼンテーションチェーンのビューコントローラー一覧:
AlertController
```

## 活用できそうなシーン例
・モーダルが正しく表示されない場合
・意図しないビューコントローラーがスタックに追加されている場合
・インスタンスが正しく破棄されているか確認したい場合
・ナビゲーションとモーダル遷移が絡む複雑なシナリオの場合

## まとめ
今回紹介した方法を使えば、ビューコントローラーの階層がどんな状態かを簡単に把握できるようになります。画面遷移がうまくいかないときや、意図しない動作が発生したときに、ぜひこのコードを活用してみてください。

※デバッグ完了後はログの出力処理を削除するか、必要に応じて開発環境でのみ実行されるようにすることを忘れないように！

## 参考
[【Swift】画面遷移の方法まとめ](https://qiita.com/misakiagata/items/b7f6c2f6c9f988ec38c7)
AtCoder 勉強記録[C++] その47

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Adjacency List
[B - Adjacency List](https://atcoder.jp/contests/abc276/tasks/abc276_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, m;
  cin >> n >> m;
  vector<vector<ll>> g(n+1, vector<ll>(0));
  for(int i = 0; i < m; i++){
    ll a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for(int i = 1; i <= n; i++){
    cout << g[i].size() << " ";
    sort(g[i].begin(), g[i].end());
    for(auto x:g[i]){
      cout << x << " ";
    }
    cout << endl;
  }
}
```
### 解法
問題の`Ai`と`Bi`をグラフとして受け取る。受け取ったグラフの各要素数と、要素を出力する。
## B - Playing Cards Validation
[B - Playing Cards Validation](https://atcoder.jp/contests/abc277/tasks/abc277_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vector<string> s(n);
  rep(i, n) cin >> s[i];
  vector<char> jud1 = {'H','D','C','S'};
  vector<char> jud2 = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
  set<string> st;
  string res = "Yes";
  for(int i = 0; i < n; i++){
    bool j1 = false, j2 = false, j3 = false;
    for(char c: jud1){
      if(s[i][0] == c) j1 = true;
    }
    for(char c: jud2){
      if(s[i][1] == c) j2 = true;
    }
    if(st.count(s[i])==0) j3 = true;
    st.insert(s[i]);
    if(!j1||!j2||!j3) res = "No";
  }
  cout << res << endl;
}
```
### 解法
3つの条件を満たしているかを素直に判定することで結果が求まる。
【GitHub】プルリクエストをコマンドで作成する方法

プルリクエストはGitHub CLIを使用して `gh create` で作成できます。

```terminal
gh pr create 
```

テンプレートを使用する場合には `-T <file>` をつけます。

```terminal
gh pr create -T pull_request_template.md
```

ラベルをつけるには `-l <name>` をつけます。

```terminal
gh pr create -l sample
```

レビューをリクエストするには `-r <handle>`をつけます。

```terminal
gh pr create -r UserName
```

ブラウザを開いて作成するには `-w` をつけます。

```terminal
gh pr create -w
```

https://cli.github.com/manual/gh_pr_create