OmniAICreator/Qiita-1.07M huggingface dataset:
Python初めて学習 簡易備忘録

#### コンソール出力
```python:
print('Hello world')
```
#### コメントアウト
```python
# コメントアウト
```
#### if文
```python:
if 条件1:
  # 処理1
elif 条件2:
  # 処理2
else:
  # else処理
```
#### list
```python:
hoge = ['fuga1', 'fuga2', 'fuga3', 1, 2, 3]
```
#### 辞書
```python
hoge = {'fuga': 'フガ', 'number': 1}
        # キー :  値
```
#### for文
```python
for 変数名 in リスト:
  # 繰り返し処理
```
#### 
※辞書に対して for 文を使用すると、デフォルトではキーが反復されます。これは、辞書オブジェクトが iter() メソッドでキーのイテレータを返すためです。
#### 関数
```python
# 関数定義
def hoge():
  # 処理

# 関数の呼び出し
hoge()

# 引数を受け取る関数
def hoge(name):
  # 処理

# 関数に引数を渡す
hoge('ほげ')
```
#### モジュールの読み込み
```python
import hoge
# ファイル名は拡張子(.py)を取り除く
```
#### クラス
```python
# クラス定義
class HogeFuga:
  # 処理
# クラス名は大文字から始まり、キャメルケース

# インスタンスの生成
hoge_item = HogeFuga()

# クラスの中でメソッド(関数)を定義
class HogeFuga:
  def hoge(self):
    # 処理
    # 必ず第一引数にselfを追加する

# クラスで定義したメソッドの呼び出し
hoge_item = HogeFuga()
hoge_item.hoge()

# selfの正体
class HogeFuga:
  def hoge(self):
    print(self.name)
    # インスタンスメソッドの第一引数に指定した"self"には、そのメソッドを呼び出したインスタンス自身が代入される

hoge_item = HogeFuga()
hoge_item.name = 'ホゲ'
hoge_item.hoge()
```

#### __init__メソッド
```python
# classのインスタンスが呼び出された後に__init__メソッドが呼び出される
class HogeFuga:
  def __init__(self):
    # 処理
hoge_item = HogeFuga()
# インスタンスが生成されると自動で__init__メソッドが呼び出される

# __init__メソッドでインスタンス変数を扱う
class HogeFuga:
  def __init__(self):
    self.name = 'ほげ' 

hoge_item = HogeFuga()

# __init__に引数を渡す場合
class HogeFuga:
  def __init__(self, name):
    self.name = name

hoge_item = HogeFuga('ほげ')
```

#### クラスの読み込み
```python
from hoge import HogeFuga

hoge_item = HogeFuga()
```

#### 継承
```python
from hoge import HogeFuga
class FugaHoge(HogeFuga):
       #子クラス  #親クラス
    # 処理

# 継承すると親クラスのメソッドを子クラスで使用することができる
hoge_item = HogeFuga('ほげ')
print(hoge_item.hoge())
                  ↑
            #親クラス内のメソッド
```

#### オーバーライド
```python
# メソッドを上書きすることができます。これをメソッドの「オーバーライド」と呼びます。

# 親クラス
class HogeFuga:
  def hoge(self):
    return 'ほげ'

# 子クラス
from hoge import HogeFuga
class FugaHoge(HogeFuga)
  def hoge(self):
    return 'ふが'

print(hoge_item.hoge())
# 出力結果 => ふが

# 子クラスでは子クラスのメソッドが優先される
# 子クラスと親クラスに同名のメソッドがある場合、メソッドの内容が上書きされる
```
【VC#】DataGridViewのInsertとRemoveAtメソッドは処理が遅い

VisualStudioのDataGridViewでデータをソートしたり、行の順番を入れ替えたりする場合、Insertで空白行を追加して内容をコピーしたり、RemoveAtでコピー元の行を消したりしてしまうと、処理時間がめちゃくちゃかかる（おそらく内部的に行がズレた分のコピペを繰り返しているのだろう・・・）

そんな時の対応策を歴2カ月の素人が作ってみたので、自分用にメモ

＜手順＞
１）行を消すのは全消しであるdataGridView.Rows.Clear()が圧倒的に早いのでこれを活用する

２）最初に全消しできないので、とある列の内容に従って並び替えするとして、内容と行インデックスを紐付けて並び替える必要がある。以下リンクを参考にしました。

https://ni4muraano.hatenablog.com/entry/2019/11/16/154218

３）並び替え後のインデックスをQueue<T>に格納する
　（わざわざ新しいインデックスを付ける必要がなくなる）

４）２次元配列のような入れ子型のlist<T>で、並び替え後の行列の内容を全て変数に格納する
以下リンクを参考にしました。

https://qiita.com/mamoru_moriai/items/4ec54638735920d87864

５）Rows.Clearで全消しして、入れ子型のlistから1行ずつRows.Addで登録していく

        private void button7_Click_2(object sender, EventArgs e)
        {
            全工程表示btn.PerformClick();

            //OP_NoとOP追番の合計が最も小さい行のインデックスを探す
            List<int> list = new List<int>();
            for (int i = 0;  i < processGridView.Rows.Count; i++)
            {
                string OP1 = processGridView[7, i].Value.ToString();
                string OP2 = processGridView[8, i].Value.ToString();

                int intOP1 = 0;
                int.TryParse(OP1, out intOP1);

                int intOP2 = 0;
                int.TryParse(OP2, out intOP2);

                int No = intOP1 * 100 + intOP2;
                list.Add(No);
            }

            //listの数値が小さい順に、そのインデックスをキューに格納
            Queue<int> queue = new Queue<int>();
            var sorted = list.Select((x, i) => new KeyValuePair<int, int>(x, i)).OrderBy(x => x.Key);
            foreach (KeyValuePair<int, int> kv in sorted)
            {
                queue.Enqueue(kv.Value);
            }

            //元の小さい順のグリッドの内容を２次元リストに保存
            List<List<string>> Col = new List<List<string>>();
            while (queue.Count > 0)
            {
                List<string> Row = new List<string>();
                int rowIndex = queue.Dequeue();
                for (int i = 0; i < processGridView.ColumnCount; i++)
                {
                    Row.Add(processGridView[i, rowIndex].Value.ToString());
                }

                Col.Add(Row);
            }

            //表示されている全行を削除
            processGridView.Rows.Clear();    

            //格納した入れ子listを1行ずつAdd
            for(int i = 0; i < Col.Count; i++)
            {
                processGridView.Rows.Add(Col[i].ToArray());
            }

            processGridViewReadOnly();

        }
Unicode正規化について調べてみた ２

個人的「質はともかく継続する」9日目です

前回の続きで、Unicode正規化の４種類について調べてみた記録です。
前回はこちら

[Unicode正規化について調べてみた](https://qiita.com/moonWalf/items/bd4b2ccdf5a2eec6a0fd)

## NFC (Normalization Form Canonical Composition)
NFCは、文字を正準等価性によって分解した後、再度合成する正規化形式。

結合文字列を合成済み文字に変換する。
文字数のバイト数を減らせる可能性がある。
Windowsのキーボード入力や、Windows、Microsoft アプリケーション、および .NET Frameworkは
NFCなんだそう。

例えば、
"が" という文字は、NFCでは合成済み文字
「が」　(\xe3\x81\x8c)　となる。

## NFD (Normalization Form Canonical Decomposition)
NFDは、文字を正準等価性によって分解する正規化形式。

合成済み文字を結合文字列に変換する。
文字列の比較や検索が容易になる。
macOSのファイルシステムHFS+では、NFDの変種が用いられいるそう。
文字列の比較や検索を行う場合に適している。

例えば、
"が" という文字は、NFDでは結合文字列
「か」 (\xe3\x81\x8b) +「 ゙」 (\xe3\x82\x99)」となる。

## NFKD (Normalization Form Compatibility Decomposition)
NFKDは、文字を互換等価性によって分解する正規化形式。

視覚的に異なる文字であっても、同じ意味を持つと判断される場合は、同一の文字に変換される。
互換等価性による分解は、正準等価性に比べて文字の同一視条件が緩いため、
より多くの文字が同一視される可能性がある。
文字列の比較処理を簡略化したい場合に適している。

例えば、
全角の "ｶﾞ" は、NFKDでは 
「カ」 (\xe3\x82\xab) +「 ゙」 (\xe3\x82\x99)" となる。
"①"、"1"、"１"は、NFKDではすべて "1" となる。

## NFKC (Normalization Form Compatibility Composition)
NFKCは、文字を互換等価性によって分解した後、正準等価性によって再度合成する正規化形式。

NFKDと同様に、視覚的に異なる文字を同一視するため、文字列の比較処理を簡略化できる。
NFCと同様に、結合文字列を合成済み文字に変換するため、文字列のバイト数を減らせる可能性がある。
文字列の比較を簡単にしつつ、ファイルサイズも小さくする場合に使われる。
また、自然言語処理の分野で、文字列の正規化処理としてよく利用される。

例えば、
"①"、"1"、"１"は、NFKCではすべて "1" に変換される。


## Unicode正規化の注意点

正規化を行うと、元の文字列の表現に戻せない場合がある。
NFKCとNFKDは、互換性のために情報を損失する可能性がある。

## まとめ

普段の開発ではあまり意識する場面がなかったのですが、
改めて勉強してみると意識しておいたほうがいいことばかりでした。
文字コード、また改めて勉強しなおしたいな。


参考：

[Unicode 正規化を使用して文字列を表す](https://learn.microsoft.com/ja-jp/windows/win32/intl/using-unicode-normalization-to-represent-strings)

[Unicode正規化](https://qiita.com/fury00812/items/b98a7f9428d1395fc230)
Docked Rails CLI With PostgreSQLでRailsコマンドをDocker化する

# はじめに
僕は普段Docker環境で開発しています。
でも、Rails newでサクッと試したいときに環境作るのめんどくさいなーと思ってました.
Railsのリポジトリを見てるとDocked Rails CLIなるものを見つけてコレ使えるんじゃね？と思ったので試してみます:smile: 

https://github.com/rails/docked

# 前提
Docker環境がセットアップ済み

# 使い方
使い方は至って簡単:relaxed:
READMEにあるように、aliasを登録したり時前のシェルスクリプトを作ったりするだです。
Railsのコマンドを開発PCのホスト環境のセットアップなしに実行できるようになります！

```bash
docker volume create ruby-bundle-cache
alias docked='docker run --rm -it -v ${PWD}:/rails -u $(id -u):$(id -g) -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli'
```

ただ、MySQLやPostgreSQLの環境では依存パッケージがあるので使えません...:cry: 

# With PostgreSQL
個人的にPostgreSQLでRailsアプリを開発することが多いので、それ用のイメージも作ってみました。

やったことは単純で、PostgreSQLのクライントをインストールしただけです。

## 使い方
```bash
docker volume create ruby-bundle-cache
alias docked='docker run --rm -it -v ${PWD}:/rails -u $(id -u):$(id -g) -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/murajun1978/docked-with-postgresql:main'
```

あとはRailsのコマンドをお好きなように
```bash
docked rails server
```

## 既存のプロダクトの場合
```bash
cd <product_dir>
docked rails server
```

こんな感じで、ローカルのRails appを簡単にDocker化できます！

僕が作ったリポジトリはこちら ↓

https://github.com/murajun1978/docked-with-postgresql

# まとめ
Docked Rails CLIでサクッとできるようになりましたね！
最近まで知らなかった...
時前でDockerfileを作らなくていいので、圧倒的に楽ですw

RubyやPostgreSQLのバージョンなどは、Dockerのargsで指定できるので試してください！
既存のプロダクトやインターン、Rails Follow-upとかで積極的に使っていきたいと思います:laughing:

では、よきRails Lifeを！
G検定-1.1.人工知能(AI)とは

## ジョン・マッカーシー(John McCarthy)
1956年にアメリカで開催されたダートマス会議において、初めて「人工知能(Artificial Intelligence」という言葉を使った。

https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%9E%E3%83%83%E3%82%AB%E3%83%BC%E3%82%B7%E3%83%BC


## 人工知能とは
推論、認識、判断など、**人間と同じ知的な処理能力**(※)を持つ機械（情報処理システム)
※人間と同じ知的な処理能力」の解釈が、研究者によってい異なる
例：
1. 京都大学 長尾真：人間の頭脳活動を極限までシミュレートするシステム
1. 東京大学 松尾豊: 人工的に作られた人間のような知能、ないしはそれを作る技術


## 分類(1.2のブームの主役)
分類の基準： 周囲の状況(入力)によって行動(出力)を変えるエージェント(プログラム)をレベル別に分ける

### レベル1:シンプルな制御プログラム
全ての振る舞いが予め決められており、その通りに動くだけです。
例：洗濯機の水量調整、エアコンの温度調整など

### レベル2:古典的な人工知能
検索・推論、知識データを利用することで状況に応じて極めて複雑な振る舞いをする
例：掃除ロボット、診断プログラム

### レベル3: 機械学習を取り入れた人工知能ービッグデータ時代
非常に多くのサンプルデータをもとに入力と出力の関係を勉強した製品
例：検索エンジン、交通渋滞予測

### レベル4:ディープラーニングを取り入れた人工知能
機械学習では学習対象となるデータのどのような特徴が学習結果に大きく影響するかを知る事はとても重要です。
これを特徴量(変数)と呼びます。
例：画像認識、音声認識、自動翻訳


## AI効果（AI effect）
「最新のAI（人工知能）」として話題になった技術が、一般社会に受け入れられて普通に使われるようなるにつれて、「AI」とは呼ばれなくなる現象のことである。つまりAIが実用で成功すると、「AI」とは呼ばれなくなる、というパラドックスが存在するということだ。
例えば、かつての第1次AIブームの時代（1950～1970年代）、探索木アルゴリズムによって迷路を解く技術は「AI」と呼ばれていた。また第2次AIブームの時代（1980～1990年代）、医療など特定分野の知識を蓄積しておき質問に答えるエキスパートシステムは「AI」と呼ばれていた。しかし今では、これらを「AI」と呼ぶ人は少ないだろう。

## 人工知能とロボットの違い
![截屏2024-06-16 22.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/6894b712-28c6-5890-0567-e7cf2b8cf908.png)

###AI搭載ロボット
例：RoBoHoN(ロボホン)
LOVOT(ラボット)
Romi(ロミ)
Qoobo(クーボ)
Palro(パルロ)
BOCCO emo(ボッコエモ)
freeコマンドの読み方

# 概要
freeコマンドの出力の読み方をよく忘れるので簡易表を作りました。自分用なのであしからず。

# 読み方
| 項目      | 説明 |
|:---------|:-|
|total     |搭載されている物理メモリの容量|
|used      |使用されているメモリ (total - free - buffers - cached)|
|free      |使用されていないメモリ   |
|shared    |共有メモリとして使用されているメモリ|
|buffers   |ディスク読み書きのバッファ|
|cache     |ディスク読み書きのキャッシュ|
|buff/cache|buffersとcacheの合計|
|available |free, buff/cacheのうち、スワップせずに利用可能なメモリ|

# 雑多なメモ
* freeコマンドは`/proc/meminfo`から収集した内容を加工して出力している
* buffers, cacheの違いはちゃんと調べていない。「ディスクのキャッシュである」程度の理解とどめる
* `-h (-human)`オプションをつけると読みやすくなる
ABC358回答メモ

# 0.はじめに
　緑コーダに戻って初めてのコンテスト。
　久々にD問題まですらっと解けましたが
　E以降は無理でした。
　D問題までは配点的にも易しい問題だったので
　レートは+5と微増で783となりました。


# 1.A - Welcome to AtCoder Land
　特にひねることもなくインプットを指定文字と比較して
　結果を出力して終了

　https://atcoder.jp/contests/abc358/submissions/54556739


# 2.B - Ticket Counter
　B問題らしい難易度の問題（あくまで個人の感想です）
　前の客が購入が終わった時間を変数pre(最初は0)に保持。
　i番目の客が購入が終わる時間は
　preとT[i]の大きい方+A
　それを表示してpreに格納して次の人をチェック
　と、繰り返して終了

　https://atcoder.jp/contests/abc358/submissions/54564292


# 3.C - Popcorn
　制限がゆるいので、素直に全部試してもいけるかもと思い
　まずは実装
　【実装】
　　・配列LにSを格納
　　・itertools.permutationsを全順序の組み合わせに対して
　　　全種類のポップコーンが何店舗目で変えるかをチェック
　　・一番少ない店数で買える組み合わせを表示
　　
　→例題は問題なくクリア
　　→10種類のポップコーンが10個の店でそれぞれ一個ずつ売られている
　　　一番時間のかかりそうなパターンを試す
　　　　→4秒とテスト自体は終了するけど、問題の制限はオーバー
　と、微妙な感じだったので順序の組み合わせに対するチェック部分を
　bit演算に変更することによって300ms以下に実行時間を減らすことができました。

　https://atcoder.jp/contests/abc358/submissions/54586627


# 4.D - Souvenirs
　C問題よりも簡単な気がしました。
　”1 人に 2 個以上の箱を渡すことや同じ箱を複数人に渡すことはできないことに注意してください。”
　という注意書きから、考えがだいぶ簡単になるなと思いました。
　【考え方】
　　・AとBを昇順に並べる。
　　・A用のINDEX”j”と回答用変数ansを0で初期化
　　・Bを先頭から見ていき（INDEX　i）
　　  jをB[i]>A[j]（人B[i]が満足するお土産）まで
　　  jに1を加算していく
　　  この際、jがNを超えたら-1を出力して終了
　　・超える前にB[i]<=A[j]を満たすjが見つかったら
　　  ansにA[j]を加算し、jに1加算(同じお土産を違う人に渡せない為)
　　  →この際、jがNを超えかつ、iがM未満(まだお土産渡していない人がいる)の時
　　  　-1を出力して終了
　　・Bを無事見終わったらansを出力して終了
　
　マッチング的な考え方で解決できました。

　https://atcoder.jp/contests/abc358/submissions/54591192


以上
ApacheShiro：Spring Securityとの比較

# 導入
前回、過去のプロジェクトで触ったApacheShiroの概要について記事にしました。
一方、SpringにはSpring Securityという極めて有名なセキュリティフレームワークが存在します。

そのSpring Securityと比較した際のApacheShiroのメリデメを整理してみました。

# 比較

## メリット

1. **シンプルなAPI**
    - ShiroはシンプルなAPI設計で知られており、導入と設定が比較的簡単です。
    - 特に小規模なプロジェクトや単純なセキュリティ要件のアプリケーションには適しているかと思われます。
      　
2. **軽量**
    - Shiroは軽量であり、必要最低限の機能を持つため、パフォーマンスが良いとされています。
    - ただし、私は実際にパフォーマンスの比較は行なっておりません。
      　
3.  **柔軟なセッション管理**
    - Shiroは、Webセッションに加えて非Web環境のセッション管理もサポートしており、より広範なアプリケーションで利用できます。

## デメリット

1. **コミュニティとサポート**
    - Spring Securityは非常に広範で活発なコミュニティを持ち、豊富なドキュメントやサポートが存在します。
    - Shiroのコミュニティは比較的規模が小さく、サポートリソースが限られており、特に中国語の情報が多い印象です。
      　
2. **多機能さ**
    - Spring Securityは非常に多機能であり、包括的なセキュリティ機能を提供します。
    - 特にエンタープライズレベルの高度なセキュリティ要件に対応するための機能が豊富です。
      　
3. **Springとの統合**
    - Spring SecurityはSpringフレームワークと密接に統合されているため、Springベースのアプリケーションにおいてはシームレスに利用できます。Spring Bootと組み合わせた場合の自動設定や拡張性も優れています。

# 終わりに

Apache Shiroは、シンプルで使いやすいセキュリティフレームワークであり、小規模から中規模のアプリケーションや特定のセキュリティ要件に対しては非常に有効です。
一方、Spring Securityはエンタープライズレベルのアプリケーションや複雑なセキュリティ要件に対応するための豊富な機能と強力なサポートを提供します。
どちらを選択するかは、プロジェクトの規模、要件、および既存の技術スタックによって決めるべきですが、散々Apache Shiroについて書いてきましたが、
**正直、情報量を考えてもSpring Securityを選択すべきであると個人的に思います。**:zzz:
AzureSamples: azure-search-openai-demo での応答における`引用`の実装方法メモ

# 概要

Bing copilot でいうところの以下の部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/db5719a5-2192-0c1a-cf93-5ece1658616f.png)

上記について、[azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) ではどうしているか？という点についての備忘録

日本語版デモである以下でも同様

https://github.com/Azure-Samples/jp-azureopenai-samples

# backend

- [approach class](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main/app/backend/approaches) を継承した各approachクラス内で生成
- 最終的な応答としては、以下になる筈
    - <code>run_without_streaming()</code>
    - <code>run_with_streaming()</code>
        - stream の場合は、[delta] が基本
- で、メッセージ内にて追加しておくように、プロンプトで指示
- 形式としては <code>[filename]</code>
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/80387afa-5105-b1a6-7fa1-d118e56ff234.png)


```python: stream 時の応答例
yield {"delta": {"role": "assistant"}, "context": extra_info, "session_state": session_state}
```

https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/app/backend/approaches/chatapproach.py#L112

# frontend

- 応答内容は、[Answer](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main/app/frontend/src/components/Answer) にて解釈
- 今回の肝である、<code>suggestedResponses</code> は、[AnswerParser](https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/app/frontend/src/components/Answer/AnswerParser.tsx) にて解析
- <code>[</code>, <code>]</code>で囲われた部分を抜き出して、citations として切り出している。
- [filename] として backend から /content 取得したら、あとは表示するだけ

```typescript: Parser 2024/6/16 現在の Parser をコピペ記録
export function parseAnswerToHtml(answer: string, isStreaming: boolean, onCitationClicked: (citationFilePath: string) => void): HtmlParsedAnswer {
    const citations: string[] = [];

    // (Stream 用とかなので省略)

    const parts = parsedAnswer.split(/\[([^\]]+)\]/g);

    const fragments: string[] = parts.map((part, index) => {
        if (index % 2 === 0) {
            return part;
        } else {
            let citationIndex: number;
            if (citations.indexOf(part) !== -1) {
                citationIndex = citations.indexOf(part) + 1;
            } else {
                citations.push(part);
                citationIndex = citations.length;
            }

            const path = getCitationFilePath(part);

            return renderToStaticMarkup(
                <a className="supContainer" title={part} onClick={() => onCitationClicked(path)}>
                    <sup>{citationIndex}</sup>
                </a>
            );
        }
    });

    return {
        answerHtml: fragments.join(""),
        citations
    };
}
```

https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/app/frontend/src/components/Answer/AnswerParser.tsx

# あとがき

日本語デモや、最初の頃のデモだと、オーバーラッピングチャンクの影響で、表示させたページに目的としたコンテンツが無い、とかあったけど、最新のデモだと pdf#page= を利用して前後を直ぐにみられるようになっていてとても便利 :yum:
URLで送信した変数の受け取り方

```
@app.route('/EmployeeSystem/<int:id>', methods=['POST'])
def register(id):
    data = request.get_json()
    name = data.get('name')
    

    data = {
        "id":id,"名前":name
    }
    
    return jsonify(data), 200
```

URLの<int:id>の部分でデータ型と変数名を決める
この時点で既にidには社員IDが格納されている

関数に対しての受け渡し
```
def fetch_employee(employee_id=1):
    # 関数の中でemployee_idを使う
    print(f"Fetching employee with ID: {employee_id}")

デフォルト値を使用して関数を呼び出す
fetch_employee()  # 出力: Fetching employee with ID: 1
fetch_employee(5)  # 出力: Fetching employee with ID: 5
```

fetch_employee(employee_id=1):で関数に渡す変数はデフォルトが1であると定義する
そしてもしfetch_employee(5)としたら
employee_id=５という情報となる
備忘録 GOの開発環境構築 @VScode

# はじめに
今回自宅用のPCをMacbook airに変更したため、VScodeの環境もはじめから作り直すことにしました。
さらに転職も行うなど、また同じようなことを行わないといけないので、自分用のメモとして本記事を作っておきます。

# VScodeのインストール
下記公式HPから使用環境にあったインストーラーをダウンロード。
[VScodeのダウンロードリンク](https://code.visualstudio.com/)
![](https://storage.googleapis.com/zenn-user-upload/75d765883bfc-20240308.png)

ダウンロード後は、インストーラーを起動し、手順に従ってポチポチする。

# Goのインストール
Homebrewを使ってGoをインストールする（公式HPのインストーラーを使ってもOKだが、せっかくなので今回はHomebrewを利用する。Windowsの場合は公式HPからインストーラーを持ってきてインストールする形になる。）
※Homebrewのインストール方法は下記。
https://zenn.dev/uz_jp/articles/afdcba5c97d8b2

```
brew install go
```
その後、下記コマンドで正常にGoがインストールされたかどうかを確認する
```
# インストールされているGoのバージョン確認コマンド
go version

# 出力結果
go version go1.22.1 darwin/arm64
```

# VScodeの拡張機能設定
VScodeを立ち上げて、サイドバーにある「拡張機能」アイコンをクリック。
その後、検索バーに「go」と入力し、下記画像の「Go」という機能をインストールする
![](https://storage.googleapis.com/zenn-user-upload/dc942d70de37-20240308.png)

次に、サイドバーの左下にある歯車アイコンをクリックして、「設定」をクリック
※以下の設定は、goファイル保存時に自動的にフォーマットを整えてくれる設定になります。
![](https://storage.googleapis.com/zenn-user-upload/5e60ba6482a6-20240308.png)

右上にある「設定(JSON)を開く」をクリック
![](https://storage.googleapis.com/zenn-user-upload/87a15456ce92-20240308.png)

下記コードをコピー&ペーストする
```json
"[go]": {
    "editor.defaultFormatter": "golang.go",
    "editor.formatOnSave": true
}
```
![](https://storage.googleapis.com/zenn-user-upload/5acaecd0a66b-20240308.png)

# 終わりに
以上でホントの初期設定は完了です。後は自分で手を動かしながら必要に応じて拡張機能をインストールしたり設定を変更したりしていく感じになります。

# 備考
Zennにも同じ記事を掲載しています。
https://zenn.dev/uz_jp/articles/001dcb5f11db70
ExcelのVBAを使ってガントチャート（超簡易版）を作成したい...！

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約3分程度で読めるので最後まで読んでもらえると幸いです。

# はじめに
案件でプロジェクト管理のサポートをしております。
Excelを使った進捗管理があり、その資料の一部で **「VBA」** を使ってガントチャートが作成されていました。
今までは最低限の関数・ショートカットを覚えてExcelを使っていましたが、まだまだ知らない機能や関数の存在があることを痛感しております。
せっかくExcelに触れる機会が多くなっているので再学習しようと思い、その第一弾としてVBAを触ってみることにしました。

「もっとこうした方が良いよ！」 や 「うちの会社ではこの様な考えで取り組んでます！」 があれば、ぜひぜひコメントで教えていただけますと幸いです。

# VBAとは

> **Visual Basic for Applications** の略。
主にマイクロソフト製のMicrosoft Officeシリーズに搭載されているプログラミング言語である。
引用先：Wikipedia

# VBAとマクロの関連性について

>VBAはプログラミング言語であるのに対して、マクロは機能です。マクロを作成するためには、アプリケーションごとに異なるプログラミング言語を用います。そしてOfficeアプリケーションであるExcelのマクロ機能を使うために、必要になるプログラミング言語というのがVBAなのです。
引用先：https://www.hitachi-solutions.co.jp/rpa/sp/column/rpa_vol26/

# ガントチャートを作成してみる（超簡易版）

## ステップ1 ： WBSの基本的な設定

#### Excelを開く

- 新しいワークブックを作成
- セルに「タスク名」「予定開始日」「予定終了日」を入力

## ステップ2 ： マクロの準備

#### VBAエディタを開く

- リボンにある **「開発」** をクリック
- **Visual Basic** をクリック

![スクリーンショット 2024-06-16 19.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/bd2b8755-6fb3-6326-6764-50d61444a80d.png)

Microsoft Visual Basicの画面が開きます。

#### マクロを入力する

- 「挿入」 > 「標準モジュール」 を選択して、新しいモジュールを追加
- マクロを入力
- マクロ入力後、Microsoft Visual Basicを閉じると保存される

![スクリーンショット 2024-06-16 19.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/e299ed4b-a5f3-38db-e304-5be2f5f01c76.png)



以下のコードをMojule1に貼り付けます。
```vb
Sub CreateGanttChart()
    Dim ws As Worksheet
    Dim i As Integer
    Dim startDate As Date
    Dim endDate As Date
    Dim daysDuration As Integer
    Dim cell As Range

    ' WBSが含まれるシートを指定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' データの開始行を指定（ヘッダー行の次から）
    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        startDate = ws.Cells(i, 2).Value
        endDate = ws.Cells(i, 3).Value
        daysDuration = endDate - startDate
        
        ' Gantt Chartの開始列を指定（ここでは列Dから）
        Set cell = ws.Cells(i, 4 + (startDate - ws.Cells(2, 2).Value))
        
        ' Gantt Chartを描画
        cell.Resize(1, daysDuration + 1).Interior.Color = RGB(0, 102, 255)
    Next i
End Sub
```

## ステップ3 ： マクロの実行

- リボンにある「マクロ」を選択
- 作成したモジュールを選択・実行

![20240616.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/b62f197f-3024-ea35-7f4a-9e16b6cf66b3.gif)


タスクリストの右側に横棒（ガントチャート）が表示されました！
開始日と終了日に合わせて、横棒が可変で対応できていることが分かります。

# さいごに

想像以上の手軽さでVBAを実行できました。かなり感動ですw
今後はコードを拡張しながら以下の困りごとに対して1クリックで解決できる様に出来れば最高だなと考えます！

#### WBSを活用するにあたっての困りごと
- 予定終了日の期限が近づいているタスクを一目で把握できない
- Backlog（開発者向けの詳細タスクが含まれているもの）との二重管理が煩わしい
- WBS作成後、タスクが複数追加された時の追加作業が手間
- 予実の実績管理が手間

# おまけ
弊社のご紹介になります。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を、日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！
SELECT文でデッドロックするパターン

# SELECT文でデッドロックになるパターン
PostgreSQL+Springを使用しているシステムにて、いくつかの特殊な状況が重なりデッドロックが発生した。
ざっくり言うと以下の順序で処理が発生した結果、デッドロックが発生。

+ トランザクションAがSELECT * FROM user_attr;
+ トランザクションBがTRUNCATE user_attr;
+ トランザクションAを発生させたJavaプログラムが別のトランザクションCを発生させ、SELECT * FROM user_attr;

## PostgreSQLのTRUNCATE周りの仕様
PostgreSQLのTRUNCATEはOracle/MySQLと違いロールバックが可能。
ただし、TRUNCATEの実行によりAccessExclusiveLockを獲得し、TRUNCATE実行中のSELECT文をブロックする。

## PostgreSQLのSELECT仕様
SELECT文を実行すると、AccessShareLockを獲得する。
これはAccessExclusiveLock（=TRUNCATE）をブロックし、ブロックされるもの。
AccessShareLockは（ほかのロックもだけど）トランザクション終了まで保持し続ける。

## Springにより１リクエスト当たり複数のトランザクションを発行するケース
TransactionalアノテーションのオプションであるPropagationの設定により、１リクエストの中で複数のトランザクションを発行する場合がある。

例えば業務処理Aと、ログ記録処理Bがあった場合、Aの結果に関わらずBをコミットした場合等に利用される。

今回はPropagation.REQUIRES_NEWを使用し、ログ記録処理を行っていた。

## 起こったこと
TRUNCATE実行時に、TRUNCATEが完了せず待ち状態に。
上記で言うところの業務処理A実行後、ログ記録処理B実行前にTRUNCATEが差し込まれた状態となり、デッドロック。
ロックの一端をJavaが握っている関係で、PostgreSQLのdeadlock_timeoutの検知が効かず、全てのリクエストがログ記録待ちでストップ。

## 対策

+ そもそも運用中にTRUNCATEを使わない
+ Propagation.REQUIRES_NEWを濫用しない。使う場合は通常のデッドロックにも注意が必要
基本情報技術者試験の勉強方法

## 概要
2024年5月30日に基本情報技術者試験を3回目で合格しました。

これから基本情報を受けられる方の力になればと思い、勉強のやり方などを書いていきます。

## 参考物

### サイト
* [【基本情報技術者試験YouTuber】すーさん](https://www.youtube.com/@kihonzyouhou/featured)
* [基本情報技術者試験ドットコム](https://www.fe-siken.com/fekakomon.php)

### 問題集
* [令和05年【下期】基本情報技術者 パーフェクトラーニング過去問題集](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C05%E5%B9%B4%E3%80%90%E4%B8%8B%E6%9C%9F%E3%80%91%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%B1%B1%E6%9C%AC%E4%B8%89%E9%9B%84/dp/429713523X)
* [かんたん合格 基本情報技術者過去問題集 令和6年度](https://www.amazon.co.jp/%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93%E5%90%88%E6%A0%BC-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E4%BB%A4%E5%92%8C6%E5%B9%B4%E5%BA%A6-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%8E%E3%83%9E%E3%83%89%E3%83%BB%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4295018163/ref=asc_df_4295018163/?tag=jpgo-22&linkCode=df0&hvadid=676036410708&hvpos=&hvnetw=g&hvrand=9315290225632235229&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009540&hvtargid=pla-2247804170838&psc=1&mcid=2f41f76ad3bd3759b95f47d29485cedd&th=1&psc=1&gad_source=1)

## 勉強方法
### 科目A
すーさんの動画を一通り見て、その後過去問道場で過去問５年分を３周しました。周ごとの取り組み方は以下の通りです。

１周目：
動画を見ただけで解けるわけないので学習したところが問題としてどう出るのかをなんとなく掴む程度で。

２周目：
特に重要な分野であるセキュリティの動画を再視聴し、その範囲の問題から解き、次はネットワーク…といった感じで分野ごとに優先順位を設け、その分野ごとに絞った。

３周目：
得意な分野と苦手な分野がはっきりしてくるので苦手な部分を重点的に取り組んだ。

その中で３周しても解けなかった問題は、重要であるなら４周目に突入して解き、そうでないと判断した場合は捨てました。

**あくまで目的は合格なので、全問正解にこだわらず、無理なところは諦めた方が精神的にも楽です。**

よく出る単語などは単語帳を作って通勤や暇な時間に見返して暗記してました。

科目Aは上記のやり方で３回とも基準点は取れました。

### 科目B
すーさんの３時間越えの動画を２周。
公開問題と問題集の問題を３周しました。

合格の決め手は**とにかく問題に慣れること。**
公開問題２６問だけでは足りないので、問題集を２冊購入し、とにかく数をこなしました。

他に大事な要素として
+ 処理の全体像の理解
+ トレース
+ 時間配分

この３つを意識するべきと思います。
処理の全体像の理解とは処理が何をしているのかざっくり言語化することで、これをせずとにかくトレースしてたら時間が足りませんでした。
他に時間を意識する上でA科目でも言いましたが、無理と判断した問題はきっぱり捨て、次の問題に切り替えたほうがいいです。

## まとめ
A科目は最初は膨大な範囲に圧倒されると思いますが、全部が出るわけではなく、過去問を解いてると大体この辺が出るなと分かるようになります。まずは軽い気持ちで１周してみてください。

B科目はとにかく沢山問題を解いた方がいいです。公開問題だけでは明らかに足りません。しかも本番の問題は公開問題よりずっと難しいです。ひたすら解いてください。
２周目以降は解き方や時間を意識し、本番を想定しながら取り組んでください。
<br>
ここまで読んで頂きありがとうございます。少しでも読んでくださった方の助けになれたなら幸いです。
melosに登録しているscriptのヘルプコマンドを作ってみた

## はじめに

Flutterプロジェクトのコマンドはgrinderを使っていたのだが、マルチパッケージも考慮するとmelosに統一したくなった。
grinderはgrind -hで使えるタスクを表示できるのだが、melosのscriptsにはヘルプのような機能がなさそうなので簡単に作ってみた。

## コード
以下のdartのコードを用意する
grinderの便利関数が使いたかったので、grinderをターミナルからは叩かないが利用している。
```dart:scripts/help.dart
import 'dart:io';

import 'package:grinder/grinder.dart';
import 'package:yaml/yaml.dart';

Future<void> main() async {
  final melosFile = File('melos.yaml');
  if (!melosFile.existsSync()) {
    fail('Required files not found.');
  }

  final melosFileString = melosFile.readAsStringSync();

  final yaml = loadYaml(melosFileString) as YamlMap;
  final scripts = yaml['scripts'] as YamlMap;

  log('Available scripts:');
  for (final script in scripts.entries) {
    log('${script.key}');
    final scriptValue = script.value as YamlMap;
    if (scriptValue['description'] != null) {
      log('  ${scriptValue['description']}');
    }
  }
}

```

melos.yamlのscriptsから使えるようにする

```yaml:melos.yaml
scripts:
  h:
    description: Show help
    run: dart run scripts/help.dart
```

## 実行
```zsh
melos run h
〜略
Available scripts:
h
  Show help
build
  build_runner build
watch
  build_runner watch
yumemi_lints_update
  Update yumemi_lints configuration
```

## まとめ
melos.yaml見たほうが早い…

実装はこちら

https://github.com/K9i-0/riverpod_paging_utils
Salesforceレポートの項目表示を項目の表示ラベルと異なるようにする方法

本橋孝昭です

今回はSalesforceのレポートで項目の表示ラベルとは異なる文字をレポート項目に表示させる方法をご紹介します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8bd52af9-782b-7e6d-2246-855814e8d1ac.png)



例として、商談の項目「金額」があります

こちらはレコード上では、そのまま「金額」として表示させたいが、レポート上では（他システムとの連携のためデータエクスポート、インポートのため）「金額」以外の項目を表示させたい。とします


この場合、標準レポートでは「項目表示名と同じ表示しかさせない」というルールがありますが、カスタムレポートタイプであれば「項目の表示ラベルと異なる表示ラベルをレポート上で表示」が可能です

それでは表示ラベル変更方法を見ていきましょう


## ステップ1 カスタムレポートタイプを作成しよう

まずはカスタムレポートタイプを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/00a47dea-5cd4-2743-441c-76d32ae60093.png)

## ステップ2 カスタムレポートタイプを編集

下記画像の「レイアウト編集」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/63763246-1934-1b54-9903-4cdab8e38dce.png)

その後　変更させたい表示ラベルの項目をクリックして表示名を変更してOKをクリックし保存をクリックしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4319d47f-eb1a-bd2d-07e7-1d8ca7a39454.png)



以上で設定は完了です

　項目の表示ラベルが変更されていることが分かりますね

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e2acef44-bdf9-8d62-e712-bbf47d77ddb1.png)
Azure AI Engineer Associate(AI-102)合格体験記

# はじめに
:::note warn
警告
本記事は 【**2024年6月**】 に受験した際の内容をもとに記載しています。皆さまが受験される際には最新の情報をチェックいただくようお願いします
特にAI分野はサービス内容の進化に伴うテスト範囲の変更が激しい分野です。実際に数か月前に作成された記事でも様子が変わっているケースをよく目にしました。皆様もお気をつけて！
:::

https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-102

# 動機
- AIを活用する業務が増えそうだったため
- Azure Fundamentals(AZ-900)を取得しもう一つ上の上位資格を取得しておきたかったため
- 無料で受験できるバウチャーを手に入れたため（**2万円浮くというお得！**）

https://qiita.com/HimatsubushiNiHitsubabushi/items/0489d066d7a7f92b041b

ちなみに無料バウチャーは「AI Skills Challenge」により手に入れたもの。Learn内のチャレンジを最後まで実施するとAI系の資格を無料で受けられるといった内容のものでした

https://www.microsoft.com/ja-jp/cloudskillschallenge/ai/registration/2024?ocid=aisc23_CSC_skillsforaiblog_cnl

# 前提知識
- 普段からIT部門で業務しているがAI業務はほとんどない
- AZ-900レベルのAzure基礎知識
- Azure OpenAIを呼ぶAzure Function(Python)を作成した経験が一度。Azure実践経験は総じて少ない

# 結果
準備期間は土日中心ですが約1.5か月
無事一度目のチャレンジで合格でした
700点が合格ボーダーのところ約850点

# 所感
AZ-900（おそらくAI-900も？）は「**やりたいこと**」と「**それを実現するサービス名**」が一致すれば十分合格できます。
一方、AI-102はそれに加えて「**それを実現するにはどのような実装が必要か**」という実践的な知識が必要な印象です。ただ、試験中はLearn内ドキュメントを参照できるためすべて丸暗記する必要はありません。

# 当日の問題構成（あくまで一例）
通常の問題(9割程度) → ケーススタディ(1割程度)の順でした。他記事を見ていると逆順のパターンもあるとのこと。
通常問題の見直しを終えるとケーススタディが表示されるという形式のため、ケーススタディに進むと通常問題に戻ることはできません。
また、通常問題の中にも見直しのできない問題が数問ありました。

ケーススタディは長めのシステム・業務要件が与えられ、それをもとに回答するようなものです。
問題数が少ないとはいえ、読まなくてはいけない文章量は多いので余裕をもって進めるとよいと思います。
自分はこの問題数ならそんなに時間いらないだろうと高を括ってしまいケーススタディの見直しができませんでした。20分程度は残しておいた方がいいかなと思います。

# やったこと①：Udemy動画講座（おすすめ度★）
「AI-102 Microsoft Azure AI Solution Complete Exam Prep 2024」

自分はAIサービスをほとんど触ったことがなかったのでなんとなく動画でイメージを掴もう（あわよくば実際にAzure触らずとも合格しないかなというスケベ心）と思ったのですが…

https://www.udemy.com/course/ai102-azure/

# やったこと②：Udemy問題集（おすすめ度★★★）
「Practice Exams | Microsoft Azure AI-102 | Azure AI Solution」

動画みて一通りのサービス概要を知った状態で模擬試験を受けて愕然としました。
正解率50％程度、知らない言葉の嵐…
後ほど改めて解きなおしたのですが、内容はよかったです。評価が高く、最終更新日が新しく、問題数が多いものを選びましょう。

https://www.udemy.com/course/practice-exams-microsoft-azure-ai-100-azure-ai-engineer

# やったこと③：Microsoft Learning（おすすめ度★★★★★）
これは圧倒的に経験が足りないと感じ、AI-102向けに公開されている公式のトレーニングに取り組み、ワークも実際に試しました。初めての方であればトライアル用のライセンスを取得できます。
これを一通りこなすと②の問題集で7割程度取れるようになりました。
習うより慣れろ、を改めて感じました。自戒…

https://learn.microsoft.com/ja-jp/training/courses/ai-102t00

# やったこと④：過去問(おすすめ度★★★★)
あとは問題数をこなしていきましょう。
ネットに落ちている大量の過去問くんたちのコスパ最強。

https://www.examtopics.com/exams/microsoft/ai-102/view/

https://www.jpnshiken.com/exam/AI-102-designing-and-implementing-a-microsoft-azure-ai-solution-12420.html

# 最後に
AZ-900が簡単で歯応えなかったので中上級者向けの資格にしようと軽はずみに受験を決めたAI-102でしたが、やはりそれ相応の苦労をした印象です。

さて次ですが、AI-102はAzure AIサービスの話に終始してしまったため、もっと広くAI基礎知識が欲しいなと思っています。そのため、G検定を検討していますが、それより先に受験したいSalesforce資格もあるし…と考え中です。
jetpack composeでcameraxとmlkitをつかってバーコード読み取り画面を実装するPart2

# はじめに
今回も前回に引き続きJetpackComposeでのバーコード読み取り機能を実装していきます。
### 本文
下記のコードはカメラから取得した画像を加工している処理です
```kotlin
class BarCodeScanner(
    private val onBarCodeDetected: (Barcode) -> Unit,
) : ImageAnalysis.Analyzer {
    private val qrScannerOptions = BarcodeScannerOptions.Builder()
        .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
        .build()
    private val barCodeScanner = BarcodeScanning.getClient(qrScannerOptions)

    @SuppressLint("UnsafeOptInUsageError")
    override fun analyze(image: ImageProxy) {
        val mediaImage = image.image
        // カメラから画像を取得できてるかチェック
        if (mediaImage != null) {
            // Cameraから取得したInputImage形式に変換する
            val adjustedImage =
                InputImage.fromMediaImage(mediaImage, image.imageInfo.rotationDegrees)

            barCodeScanner.process(adjustedImage)
                .addOnSuccessListener {
                    if (it.isNotEmpty()) {
                        onBarCodeDetected(it.first())
                    }
                }
                .addOnCompleteListener { image.close() }
        }
    }
}
```
### 最後に
次のパートを書き次第下記に追加していきます
どなたかのお役に立てれば幸いです
俺的Cocoa Pods導入方法

# はじめに
Macの開発環境を整えるたびに出てくるのがCocoa Pods。
でも毎回めっちゃ苦労してインストールしている気がするので、まとめてみる

# 概要
１）Homebrewのインストール
２）rbenvのインストール
３）最新版のRubyのインストール
４）CocoaPodsのインストール

前提とする環境は以下の通り
・Mac OS Sonoma 14.5
・Xcode 15.4
・使用言語 Swift (バージョンは5)

## なんで４つもツールをインストールしなければいけないのよ？
CocoaPodsはRuby2.7.0以上が必要。
だけどデフォルトでインストールされているRubyは2.7.0未満なのでRubyのインストールが必要

でも、RubyはRubyバージョン管理ツールであるrbenvを入れるのが楽ちん。
でもでも、rbenvはHomebrewが必要なんだぜ。。

相澤先生が見たら卒倒しそうなくらい非合理なように見えますが、上記順番でインストールが必要ということになります。
さあ、やっていきましょー
 
# Homebrew
ビールのアイコンでお馴染みHomebrewをインストール。
　参照：https://brew.sh
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

でも、Warning発生
![スクリーンショット 2024-06-16 20.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/5fdaa2fe-fe91-f975-0a30-4b54abb76ec9.png)

素直に言われた通りに設定
```
export PATH="$PATH:/opt/homebrew/bin"
```

※但し、上記設定だとTerminalを再起動するたびにコマンド実行する必要があるため、以下を行う
```
// zshrcファイルをvim起動
vi ~/.zshrc
```
→で　zshrcファイルを　```export PATH="$PATH:/opt/homebrew/bin"```　を記載し、
→ESCキーでノーマルモードへ切り替えを行い、
→":wq"でvim終了
→```source ~/.zshrc```で再度読み込み

次にbrewが正常にインストールされているか確認
```
brew -v
```

# Ruby最新版をインストール
MacにはデフォルトでRubyがインストールされているが、
Cocoa Podsは2.7.0以上のRubyでないとインストールできないので最新版をインストールする必要がある。


まずは、Rubyのバージョンを管理するライブラリrbenvをインストール
```
brew install rbenv
```

インストール可能なRubyのバージョンをチェック
```
rbenv install -l
```

バージョンをチェックしたら、対象バージョンのRubyをインストール！
```
rbenv install [バージョン]
```

インストール完了してもsystemのRubyが書き換わるわけじゃなくて、追加でインストールされているだけで、
参照されているRubyはsystemの古いバージョンのまま。
そのため、先ほどインストールした最新版を使えるように設定する。
```
rbenv global [バージョン]
```

設定後、バージョンチェック！
```
ruby -v
```

※rbenv versions　でバージョンチェックしても安心してはいけません。
　以下のようになっているかもしれませんが、ruby -vで確認すると古い可能性があります。
```
$ rbenv versions
  system
* 3.3.3 (set by /Users/xxx/.rbenv/version)
```

バージョンがsystemのままの場合は、以下対応を行いましょう。
以下コマンドで
```
rbenv init
```
出力されたeval``` "$(rbenv init - zsh)”```をコピーして、
bash_profileに記載（ESCキー　→　```:wq```で保存）
```
vi ~/.bash_profile
```

以下で設定反映し、
```
source ~/.bash_profile
```

再度、バージョンチェック！
```
ruby -v
```

# ラスト：本命のCoco Podsをインストール
初めて以下実行すると、30-40分くらいかかります。
しかも、いっっっっさいログが出力されずに30-40分かかります。成功しても失敗しても。
ビールでも飲みながら気長に待ってください。
```
sudo gem install cocoapods
```

正常にインストールされていれば、以下でpodコマンドが通るはず
```
pod --version
```

# 所感
こういうCocoa Pods系のライブラリ管理ツールは必要なのは理解しているが、導入が面倒。。

SPM(Swift Package Manager)が使える要件であればこっちの方が良い気がするが、
SPMにそもそも使用したいライブラリが無いとか、使えるけど一部制限があるとかがあった気がする。。

以上、お疲れ様でした。
Nuxt3のplaygroundをローカルで起動しようとしたら「ERROR: Cannot find module @nuxt/kit」が発生

# はじめに
Nuxt3の中身をいじって確認したいことがあったので、クローンしてplaygroundを起動しようとしたら少し詰まりました。戒めの備忘録です。

# 発生したエラー
[contributionのガイド](https://nuxt.com/docs/community/contribution)を見つつ、
`pnpm install`を終え、playgroundを起動しようとしたら下記のエラーが発生。
```:shell
sample@MacBook-Air-3 nuxt % pnpm dev       

> nuxt-framework@ dev /Users/sample/nuxt
> pnpm play


> nuxt-framework@ play /Users/sample/nuxt
> nuxi dev playground

Nuxt 3.12.1 with Nitro 2.9.6                                                                                                                                                                          18:12:34

[18:12:34]  ERROR  Cannot find module @nuxt/kit imported from file:///Users/sample/nuxt/playground, file:///Users/sample/nuxt/, file:///Users/sample/nuxt/playground/_index.js, file:///Users/sample/nuxt/node_modules

  at _resolve (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.b4f7d829.mjs:7998:19)
  at resolveSync (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.b4f7d829.mjs:8007:10)
  at resolvePathSync (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.b4f7d829.mjs:8010:24)
  at resolvePath (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.b4f7d829.mjs:8014:28)
  at importModule (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.b4f7d829.mjs:8055:30)
  at loadKit (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.a5b1f4d1.mjs:2430:21)
  at async Object.run (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/chunks/dev.mjs:166:32)
  at async runCommand$1 (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.6aad497e.mjs:1648:16)
  at async runCommand$1 (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.6aad497e.mjs:1639:11)
  at async runMain$1 (node_modules/.pnpm/nuxi@3.12.0/node_modules/nuxi/dist/shared/nuxi.6aad497e.mjs:1777:7) 



[18:12:34]  ERROR  Cannot find module @nuxt/kit imported from file:///Users/sample/nuxt/playground, file:///Users/sample/nuxt/, file:///Users/sample/nuxt/playground/_index.js, file:///Users/sample/nuxt/node_modules

 ELIFECYCLE  Command failed with exit code 1.
 ELIFECYCLE  Command failed with exit code 1.
```

# 解決策
ちゃんとplayground用のドキュメントがありました。
(https://nuxt.com/docs/community/framework-contribution)

下記コマンドの実行が足りていなかったので、実行したらエラーは解消されました。
```
sample@MacBook-Air-3 nuxt % pnpm dev:prepare
```
[ExcelVBA]動的配列変数の使い方のまとめ

# はじめに
VBAで動的配列を扱う際、変数に括弧を付けて動的配列変数を宣言するパターンと、括弧を付けない変数に配列を代入するパターンがあり、その違いが気になっていたので、調べてみました。

# 変数の宣言
#### 変数に括弧を付けて動的配列変数を宣言するパターン
~~~VB
Dim 括弧付き変数_A() As 型
~~~
- 型はString型、Long型、Object型、Variant型など、任意の型を選ぶことができる。
- ただし、セル範囲から値を取り出して格納する場合は、必ずVariant型で宣言しておく必要がある。（セル範囲から取り出す値が文字列型だからといって、String型で宣言することはできない）

#### 括弧を付けない変数に配列を代入するパターン
~~~VB
Dim 括弧無し変数_B As Variant
~~~
- 配列を代入するには、**必ずVariant型で宣言**する必要がある。
- この時点ではまだ配列変数ではない。単一の値も、オブジェクトも、配列も、何でも代入することができる、代入前の変数、というイメージ。

# ReDimステートメント
~~~VB
ReDim 括弧付き変数_A(1 To 3)

ReDim 括弧無し変数_B(1 To 3)
~~~
- ReDimステートメントで「括弧付き変数_A」のサイズを変更できる。
- 「括弧無し変数_B」はReDimステートメントによって配列変数になる。

# セル範囲の値を配列に格納する
取り出す値（A1:E1）
![0616-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816680/26272365-ae12-9945-5c65-d9a89297e9e2.png)

#### 括弧付き変数の場合
~~~VB
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
~~~
- 変数名の後ろの括弧は省略可能
~~~VB
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
~~~
- .Valueの記述を省略することはできない
~~~VB
'↓これはエラー
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1")
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1")
~~~

#### 括弧無し変数の場合
~~~VB
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
~~~
- .Valueの記述は省略可能
~~~VB
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1")
~~~
- "変数名（）"のように、括弧を付けるとエラーになる。
~~~VB
'↓これはエラー
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1")
~~~

# Eraseステートメント
「括弧付き変数」も「括弧無し変数」も、Eraseステートメントで初期化できる。
~~~VB
Erase 括弧付き変数_A

Erase 括弧無し変数_B
~~~

# 変数に単一の値やオブジェクトを再代入する
- 括弧付き変数には、単一の値（文字列、数値、日付）やオブジェクトを再代入することは出来ない。
- 括弧無し変数には、単一の値（文字列、数値、日付）やオブジェクトを再代入することが出来る。その際、配列変数ではなくなる。
~~~VB
'括弧付き変数_A = 1000　←エラー

括弧無し変数_B = "XYZ"

Set 括弧無し変数_B = ThisWorkbook
~~~

# まとめ
動的配列変数は、変数宣言時に括弧が付いているかどうかによって、扱い方に細かな違いや注意点がある。特に、セル範囲の値を配列に格納する際の記述の違いがややこしく感じた。

# 今回検証のために使ったコード
~~~VB
Option Explicit

Sub 配列変数テストマクロ()

    Dim 括弧付き変数_A() As Variant
    
    Dim 括弧無し変数_B As Variant

Stop

    ReDim 括弧付き変数_A(1 To 3)

    ReDim 括弧無し変数_B(1 To 3)

Stop

    括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value

    括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value

Stop

    Erase 括弧付き変数_A

    Erase 括弧無し変数_B

Stop

   '括弧付き変数_A = 1000　←エラー

    括弧無し変数_B = "XYZ"
    
    Stop
    
    Set 括弧無し変数_B = ThisWorkbook

Stop

End Sub
~~~
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（9/100）

【9日目】
トピック2：SAPS/4HANA生産計画の概要（3/5）

≪問題9≫
SAPのデジタルバリューネットワークのポートフォリオにおけるサプライヤエリアは、どのSAPソリューションによってサポートされますか。
（３つ選択）
□SAP Concur
□SAP Hybris
□SAP Ariba
□SAP Fieldglass
□SAP Success Factors

≪解答≫
■SAP Concur
□SAP Hybris
■SAP Ariba
■SAP Fieldglass
□SAP Success Factors

≪解説≫
◆デジタルバリューネットワークは、バリューネットワークのあらゆる側面をリアルタイムで相互接続し、ビジネス成果を推進するデジタルコアから始まります。このデジタルコアは、消費財企業に対し、コアビジネスプロセスを再プラットフォーム化し、リアルタイムの分析を活用してビジネスプロセスを一体化する機会を提供します。これにより、企業はより効率的で迅速かつシンプルに運営され、内部のあらゆる作業が接続され、リアルタイムのプロセスが可能となります。デジタルコアを含むバリューチェーン全体がデジタル化され、イノベーションおよびビジネスプロセスの自動化のためのプラットフォームとして機能します。
◆SAPのデジタルバリューネットワークのポートフォリオにおいて、各エリアをサポートするソリューションは以下の通りです。
（1）カスタマエリア⇒SAP Cloud for Customer（C4C）、SAP Hybris 
（2）サプライヤエリア⇒SAP Concur、SAP Ariba、SAP Fieldglass
（3）要員エリア⇒SAP Fiori、SAP Fieldglass、SAP Success Factors
（4）資産エリア⇒SAP HANA Cloud Platform
CSSを素早く書く方法 (Emmet)

## はじめに
この記事は先日投稿した記事のCSS版です。
Emmetについてご存知ない方や、HTMLでの使用例にご興味のある方は、
以下の記事も併せて参照していただけると嬉しいです。

https://qiita.com/ameRese/items/b62a80dc03673a44ec5d

今回も私がよく使うものに絞って紹介します。
詳しく知りたい方は以下のチートシートを参照してください。

https://docs.emmet.io/cheat-sheet/

## 使い方
HTMLと同様、キーワードを入力してTabキーまたはEnterキーを押すだけです

## よく使うキーワード

:::note
### () 付きのプロパティ値に付いて
コードブロックで () を付けているものは初期値で、変換後に続けて値を入力することで変更可能です。
複数ある場合はTabキーで次の入力欄に飛びます。
↓こんな感じです↓
![Emmet Sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362317/41d22885-2ed0-5445-3354-b309c4db4fd9.gif "Emmet Sample")
:::

### top, right, bottom, left
```css
/* tをr, b, lに変えればそれぞれright, bottom, leftに */

/* t */
top: ;

/* t10 */
top: 10px;
```

### display
```css
/* d */
display: (block);

/* df */
display: flex;
```

### margin, padding
```css
/* mをpに変えればpaddingに */

/* m */
margin: ;

/* m5 */
margin: 5px;

/* m10px20px */
margin: 10px 20px;

/* mb2r */
margin-bottom: 2rem;
```

### box sizing
```css
/* wをhに変えればheightに

/* w */
width: ;

/* wa */
width: auto;

/* w50p */
width: 50%;

/* maw */
max-width: ;

/* miw */
min-width: ;
```

### font
```css
/* fw */
font-weight: (normal);

/* fz */
font-size: ;

/* fz16 */
font-size: 16px;
```

### text
```css
/* ta */
text-align: (left);

/* tac */
text-align: center;

/* td */
text-decoration: none;
```

### background
```css
/* bc */
background-color: (#fff);

/* bc#333 */
background-color: #333;
```

### color
```css
/* c */
color: #000;

/* c#eee */
color: #eee;
```

### border
```css
/* tをr, b, lに変えればそれぞれright, bottom, leftに

/* bd */
border: (1px) (solid) (#000);

/* bdn */
border: none;

/* bdt */
border-top: (1px) (solid) (#000);
```

### lists
```css
/* lis */
list-style: ;

/* lisn */
list-style: none;
```

### flexbox
```css
/* fxd */
flex-direction: (row);

/* fxw */
flex-wrap: (nowrap);

/* jc */
justify-content: (start);

/* ai */
align-items: (start);
```

## おわりに
CSSはプロパティが多くEmmetであいまい検索が働くこともあって、書き方は多種多様です。
チートシートや当記事以外のものでも、それらしい書き方をすれば変換できたりしますので、
ぜひいろいろ試してみてください。
Kotlin Fest 2024で個人的に気になる項目紹介



# はじめに

「Kotlin Fest 2024」が　2024年6月22日 (土)に開催するそうで、その中のタイムテーブルから個人的に気になった内容をいくつか記事にしたいと思います。

今回は５年ぶりのオフライン開催で、配信もなく　一般チケットは完売済みのようなので当日リアルタイムでみる方法はありませんが、過去のKotlin Festではアーカイブ動画や資料などが残っているので今回も後から確認することができると思います。
（私も当日は不参加なので、後から観られることを願っていますw）

この記事では　タイムテーブルを見て気になった記事を詳細URLとなぜ気になっているのか一言を添えて紹介したいと思います。



KotlinFest２０２４ホームページ↓

https://www.kotlinfest.dev/kotlin-fest-2024

タイムテーブル↓

https://www.kotlinfest.dev/timetable

以下から記事の紹介です。
順不同

# 今こそ始めたい！Compose Multiplatform
https://fortee.jp/kotlin-fest-2024/proposal/eb074789-3f26-4175-ab2a-0b1dd727d7c2

将来的にAndroid/iOSどちらの開発もできるようになりたいと思っているので、Jetpack Composeを身につけつつある今　身につけたい**ComposeのMultiplatform対応**についての流れが学べる


# あらゆるアプリをCompose Multiplatformで書きたい！ -ネイティブアプリの「あの機能」を私たちはどう作るか-

https://fortee.jp/kotlin-fest-2024/proposal/94b36113-107b-4ea7-a06a-f7c4ca23aad7

上の項目と同じくComposeのMultiplatformについての内容で、もっと細かい機能についてに話をしてくれそうです。


# Kotlinで愉しむクリエイティブコーディング


https://fortee.jp/kotlin-fest-2024/proposal/30765f6f-bb2f-412c-866a-a7c332e22e9f

楽しくコーディングをすることをテーマにしている内容で、仕事をしていく中でやはり「楽しい」を大事にしたいと思っているので、今後の知見としてこの「中高生や大学生にプログラミングの講義をする機会に恵まれてきました」と言っている登壇者さんの考え方を知りたいと思っています。
一番上の項目ではエンジニアとして引き出しを広げるための内容でしたが、こちらは組織や人間力的な意味での引き出しを増やすために、管理職や新人の教育係になった際 役に立つのではないかと思っています。

# まだ JUnit を使ってるの？ kotest を使って快適にテストを書こう by 川田裕貴


https://fortee.jp/kotlin-fest-2024/proposal/9973bf7a-aa1a-44f5-a3de-bd5382eac87b

テストについて知ってからは実装だけでなく、品質のことも少しずつ気にし始めたこの頃。
まだまだ、テストコードについては知らないことだらけなので解説付きでデスとコードについて知れる機会は是非見ておきたいと思いました。
EC2 Amazon Linux 2 のVirtualHost 設定手順

## はじめに
EC2でAmazon Linux 2 のVirtualHostの構築をしてみた。
今回はドメインについてはローカルPCのhostsを直接変更する手順にします。

※今回ドメイン名は例のexample.comを使用します。

example.comとは
https://wa3.i-3-i.info/1minute/word11843.html#:~:text=%E3%80%8C%E3%81%93%E3%82%8C%E3%81%AF%E4%BE%8B%E3%81%A7%E3%81%99%E3%82%88.com%E3%80%8D%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

手順はchatGPTに聞いたものです。

### 前提条件
EC2を構築済みであること

## 手順
サーバーにSSH接続する

rootに昇格する
```
$ sudo su -
```
yum updateを実施する
今回はupdateするパッケージがありませんでした。
```
# yum update
No packages marked for update
```
apacheのパッケージをインストールする
```
# yum install httpd
```
apacheのサービスを起動する
```
# systemctl start httpd
```
apacheのサービスの自動起動を有効かする
```
# systemctl enable httpd
```
example.comのディレクトリを作成する
```
# mkdir -p /var/www/example.com/public_html
```
フォルダの権限を変更する
```
# chmod -R 755 /var/www
```
仮のHTMLファイルを作成する
```
# echo "<html><body><h1>example.com</h1></body></html>" | sudo tee /var/www/example.com/public_html/index.html
```
ディレクトリの所有ユーザー:所有グループを変更する
```
# chown -R apache:apache /var/www/example.com/public_html
```

example.comのapacheの設定ファイルを作成する
```
# vi /etc/httpd/conf.d/example.com.conf
```
```
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog /var/log/httpd/example.com-error.log
    CustomLog /var/log/httpd/example.com-access.log combined
</VirtualHost>
```
apacheの文法チェックをする。
```
# httpd -t
Syntax OK
```
apacheのサービス再起動をする
```
# systemctl restart httpd
```
hostsファイルを編集する
```
# vi /etc/hosts
```
10.0.11.196は私の環境のEC2プライベートIPアドレスです
```
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6

10.0.11.196 example.com  
```
自分のPCのhostsファイルを変更する
C:\Windows\System32\drivers\etc移動してhostsファイルをコピーして
別フォルダにhostsを格納して赤枠の部分「EC2のグローバルIPアドレス　ドメイン」を追加する。
上書きでC:\Windows\System32\drivers\etc配下のhostsファイルを変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/9c16c0d9-3b40-7f20-bbea-4804feabcead.png)


apacheのサービスを再起動する
```
# systemctl restart httpd 
```

ブラウザで以下のURLでアクセスしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/a0e938db-66d2-2a6f-56f8-cc3d1d734a63.png)

apacheのログファイルが出力されていることを確認した
```
# cd /var/log/httpd
[root@ip-10-0-11-196 httpd]# ls -tlr
total 12
-rw-r--r-- 1 root root  429 Jun 16 11:25 access_log
-rw-r--r-- 1 root root    0 Jun 16 11:25 example.com-error.log
-rw-r--r-- 1 root root 1845 Jun 16 11:25 error_log
-rw-r--r-- 1 root root  397 Jun 16 11:25 example.com-access.log
```
```
# cat example.com-access.log

[root@ip-10-0-11-196 httpd]# cat example.com-access.log
自分のIPアドレス - - [16/Jun/2024:11:25:23 +0000] "GET /index.html HTTP/1.1" 200 47 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
```


## まとめ
仮にサーバーを立てる際に本番環境のため、Route53にてドメインの登録ができない場合に
自分のPCのC:\Windows\System32\drivers\etc配下のhostsファイルにIPアドレスとドメインを設定してアクセスできるようにする方法があります。
ドメイン登録できない環境の方はぜひこのやり方があることを頭に入れてください。
最小努力と最短時間でMS-900合格記

前回(PL-900)に引き続きMS-900も無事一回で合格しました。
こちらも怠け者のほぼ当日詰め込みショートカット勉強法なので、きちんと正攻法で勉強することをお勧めします。

## 前提

あくまでも一般ユーザーとして、社会人生活始まってからOffice製品を利用中。
情シスや管理者経験などはしたことないです。

## 参考にした勉強法

https://qiita.com/kana87/items/235706e3f1a5be5e63a9

こちらを参考にしました。
PL-900同様、まずは最新の試験範囲を確認しました。

https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ms-900

試験範囲を確認すると…(2024/6/16現在)
> スキルの概要
> クラウドの概念について説明する (5–10%)
> Microsoft 365 Apps とサービスについて説明する (45–50%)
> Microsoft 365 のセキュリティ、コンプライアンス、プライバシー、信頼について説明する (25–30%)
> Microsoft 365 の価格、ライセンス、サポートについて説明する (10–15%)

ふむふむセキュリティ以降の部分から全くわからん。まぁでも前半はなんとなくわかりそう。

## 実際の勉強でやったこと

### ①まずは模擬試験を受けてみる(20分程度)

https://learn.microsoft.com/ja-jp/credentials/certifications/microsoft-365-fundamentals/practice/assessment?assessment-type=practice&assessmentId=50&practice-assessment-type=certification

資格のページから公式の模擬試験が受けられます。わりと本番形式。
まずはLearnとかテキストも全く読まずにノー勉でトライしました。

ノー勉のため当たり前のように知らん単語がたくさんでてきますが、一喜一憂せず無視してとりあえず完遂。
全て回答し終わると何分かかったかと、正誤が出てきます。カテゴリごとの得点も出てくるのでどこが弱いかすぐにわかります。

半分くらい正解していましたが、案の定セキュリティやコンプラ、ライセンスの部分はほぼできませんでした。。知らん単語はメモして、あとでググりまくりまくっておきます（死語）

### ②「MCP教科書 Microsoft 365 Fundamentals（試験番号:MS-900）」を購入し読む(5時間程度)

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

PL-900は書籍がありませんが、MS-900は受験人口が多いのか出版されています。
テキストの最初にも記載がありますが、MSの資格で難しいところは新旧の名称・機能が入り混じっているところ。
こちらの書籍についても昨年の出版になりますが、「あれ？古くない？」と思うところがあるので要注意です。

今回は時間がなかったため、Learn等は手を付けず、読み物系はこちらのテキスト一本で勉強しました（賭けすぎ）。
知っているところは斜め読みしながら、知らないところ（特にEntra ID、セキュリティ、コンプライアンス、ライセンス関連）は2－3周読みました。
始めるのが遅すぎて（前日から始めた…）試験1時間前にやっと書籍全体を1周し終わりました…が、、、良いはマネしないでね。

### 試験の感想

PL-900同様、試験時間45分ですが、今回は謎の余裕で20分程度で最後まで到達。
あとは終わりの時間まで見直しました。

私の当たった試験は謎にViva推しでVivaだけで5問くらい出てた気がします。（しかもViva、昔のやつなパターン）

…というわけで、今回も超最低限勉強法で無事合格！
帰りに②と同じ赤本シリーズのSC-900のテキストを立ち読みしたのですが、MS-900とめちゃくちゃかぶってんじゃーんと思って、記憶があるうちに、来週あたり受験しようか悩み中。

また月末にも別の試験が控えているので今度はもうちょっと勉強しよう（まだ始めていない）。。。
統計検定準1級 勉強メモ

自分用メモ。

統計検定準1級の公式ワークブックは、すでに学習を終えた人視点では「よくまとまっている」、初学者視点では「何を言っているのか全く分からない」という評価が大半だと思う。範囲がとにかく膨大で、行間が異常に広く、執筆者も章ごとにバラバラで全体として統一性がない。
検定試験のテキストとしては「初学者が勉強しにくい時点であかんやろ」って感じだが、いかんせん統計検定準1級の範囲はべらぼうに広いため、ページ数との兼ね合いでこのような形態を取らざるを得なかったのだろう。数式の導出や行間をすべて埋めようとすると、1章につき本が数冊書ける。それが32章あるのだから、もう恐ろしい。

2級とは違って線形代数が至る所で顔を出すようになるため、数学弱者の独学ではめちゃくちゃ勉強しにくいが、数学的厳密性をかなぐり捨てて何とかお気持ちだけで乗り切りたい。

## 勉強する上での全般的な心構え
### 具体と抽象の往来
統計検定準1級を勉強する上で、具体と抽象を行き来しながら関連づけた方が理解しやすい概念は多い。

例として2変量正規分布を挙げる。2変量正規分布の同時確率密度関数は、
```math
f(x_1, x_2)=\frac{1}{2 \pi \sigma_1 \sigma_2 \sqrt{1-\rho^2}} \times \exp \left[- \frac{1}{2 (1 - \rho^2)} \left( \left( \frac{x_1 - \mu_1} {\sigma_1}\right)^2 - 2 \rho \left(\frac{x_1 - \mu_1}{\sigma_1}\right)\left(\frac{x_2 - \mu_2}{\sigma_2}\right) + \left( \frac{x_2 - \mu_2} {\sigma_2}\right)^2 \right) \right]
```

だが、ちょっと見た目が仰々しい。
こういうのは、行列による多変量正規分布の一般的表記である
```math
f(\boldsymbol{x})=\frac{1}{\left(2 \pi\right)^\frac{p}{2} \left(\det \Sigma\right)^\frac{1}{2}} \times \exp \left(- \frac{1}{2}  \left(\boldsymbol{x} - \boldsymbol{\mu}\right)^\top \Sigma^{-1} \left(\boldsymbol{x} - \boldsymbol{\mu}\right)  \right)
```
と関連付けて覚えたほうが良い。次数の間違いも避けられるし、万が一 $\exp$の中身を忘れても、行列表記から気合で復元できる。

一般的な形と具体的な式に書き下した形を関連付けて覚えることで、定着がしやすくなり、片方を忘れたときのリスクヘッジにもなる。

### 字数を下げて実験
統計検定に限らず、数学では鉄板。人間は高次元のものをなかなか知覚しにくい。ワークブックで何を言っているのか分からなくなったら、とりあえず行列を2次元で書き下す。

### 式か図か
図を描いてお気持ちでイメージするのも大事だし、数式をこねくり回すのも大事。

例えば重回帰分析で、総変動を回帰変動と残差変動に分解する式
```math
\displaylines{
\| \boldsymbol{Y} - \boldsymbol{1} \bar{y}\|^2 = \| \boldsymbol{X} \hat{\boldsymbol{\beta}}-((1, \bar{\boldsymbol{x}}^\top) \hat{\boldsymbol{\beta}})\boldsymbol{1} \|^2 + \| \boldsymbol{e}\|^2\\
\Longleftrightarrow \sum_{i=1}^n \left(y_i-\bar{y}\right)^2 = \sum_{i=1}^n \left((\boldsymbol{x_i}-\bar{\boldsymbol{x}})^\top \hat{\boldsymbol{\beta}}_{1:d} \right)^2 +  \sum_{i=1}^n e_i^2
}
```
があるが、これは幾何学的に解釈するとお気持ち的にはただの三平方の定理。被説明変数 $\boldsymbol{Y}$ を $\boldsymbol{X} \hat{\boldsymbol{\beta}}$が張る超平面に射影してるのだから、そこの直角三角形に着目すると二乗和に分解できるのが直感的に説明できる（参考：[幾何学でみる重回帰の性質 | 有意に無意味な話](https://starpentagon.net/analytics/multi_linear_regression_projection/)）。

## 個別論点
### 1～6章
工事中。

### 7・8章
工事中。

### 9～13章
工事中。

### 14・15章
工事中。

### 16～19章
工事中。

### 20・21章
工事中。

### 22～26章
工事中。

### 27章
工事中。

### 28章
工事中。

### 29・30章
工事中。

### 31・32章
工事中。