OmniAICreator/Qiita-1.07M huggingface dataset:
カラム幅と余白を算出してくれる「Gridulator」

# はじめに
デザインをする際に複数個のコンテンツや写真を並べて配置したい時が頻繁にあります。
全体の幅とカラム数は決まっているけど...余白とカラム幅はどれくらいがいいかな？となり、単純に計算すればいいのですが小数点が出ない数値を自分で算出するのが結構めんどうです。
グリッドレイアウトのジェネレーターは色々ありますが、等分するだけでいい！という場合は「[Gridulator](https://gridulator.com/)」をおすすめしたいです。
使い方はすごくシンプルで全体の幅とカラム数を入力するだけ、カラム幅と余白を算出してくれます。ウェブデザインに限らず、印刷物などのデザインや資料作りなどにも活用できます。

https://gridulator.com/
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301853/f8759ad9-54dc-dfc5-b38e-c4cab1b37668.png)

# 「Gridulator」の使い方
**Overall Width**に全体の幅の数値を入力
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301853/0bd306f1-f4ea-270b-83df-b9badc9faeeb.png">

**# of Columns**にカラム数を入力
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301853/519b32ea-9ae2-fa74-1c12-9bb3a8929687.png">

カラム幅と余白が一覧で表示されます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301853/a2822db6-0967-a6ba-db9f-054dcc449e6b.png)

「Preview」ボタンを押すと実際にレイアウトした時の印象も見られて便利です。「Make SVG」からプレビュー画像もダウンロードできます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301853/f6599627-1b9b-2a2c-5af8-5b88f996c0b4.png)
MMDPluginを用いたMMDのプラグイン開発のための環境構築 #0

# はじめに
MMDPlugin を前提としたMMDプラグインの作り方を書いていこうと思います。
今日はそのための前提知識みたいなのを記載していこうと思います。

## 前提
あくまで推奨ですが、この記事では以下を前提として書き進めます。

- Git を導入していること
- Visual Studio などのC++用IDEをインストールしていること

## MMDPlugin とは
MMDPlugin は 複数のMMDプラグインを併用するためのプラグイン、または開発のためのライブラリでもあります。
oigami さんが開発しているプラグインでMMEやMMPlusなどのプラグインと併用することができます。

### MMDPlugin

https://bowlroll.net/file/121761

### 開発用

https://bowlroll.net/file/135503

## MMDのプラグインの仕組み
どのようにしてdllでフックしているのか気になる方は以下の記事がオススメです。

https://qiita.com/khsk/items/c5ae73732dbad135cf35

## 開発環境
私の開発環境は以下の通りです。
- OS: Windows 11 23H2
- MMD: MikuMikuDance 9.32
- MMDPlugin: MMDPlugin 1.9.1

# 開発のための準備
## テンプレ
ExamplePlugin というテンプレを用意しているでこれをクローンしてセットアップします。

https://github.com/PTOM76/mmdplugin-ExamplePlugin

### 1. mmdplugin-ExamplePlugin をクローン
任意の場所で私が用意したExamplePluginのリポジトリをクローンします。
```sh
git clone https://github.com/PTOM76/mmdplugin-ExamplePlugin.git
```

### 2. lib/MMDPlugin.lib の準備
ビルドするために `MMDPlugin.lib` を入手して `lib/` に入れます。

- https://bowlroll.net/file/135503

上記サイトから、`mmdplugin_dev_ver0.41_x64.zip` をダウンロードし、解凍します。
解凍後のフォルダから`MMDPlugin.lib` を取り出し、1でクローンしたリポジトリ(のフォルダ)の`lib/`に配置します。

### 3. デバッグ用MMD の準備 (任意)
デバッグ用にMMDとMMDPluginを `MikuMikuDance/` へ入れます。

https://sites.google.com/view/vpvp/

- MikuMikuDance/
    - Data/*
    - UserFile/*
    - MikuMikuDance.exe
    - MMDPlugin.dll (MMDPluginに含む)
    - d3d9.dll (MMDPluginに含む)
    - d3dx9_43.dll (MMDPluginに含む)
    - Plugin/
        - MMDPlugin/* (MMDPluginに含む)
        - ExamplePlugin/ (プラグイン名のフォルダを作成する)

## 新規作成 (テンプレを使わない場合)
1. Visual Studio 2022 で 新規プロジェクトを作成する
2. 開発者用MMDPluginを下記のリンクからダウンロードする<br />
   https://bowlroll.net/file/135503
3. ダウンロードした`mmdplugin_dev_ver0.41_x64.zip`を解凍する
4. MMDPlugin.lib と mmd_plugin.h を プロジェクト内のlib/mmd_plugin.h にコピーする (libフォルダは作成しておく)
5. プロジェクトのプロパティを開き、以下の設定を行う
   - VC++ディレクトリ -> インクルードディレクトリに `lib` を追加
   - VC++ディレクトリ -> ライブラリディレクトリに `lib` を追加
   - リンカー -> 入力 -> 追加の依存ファイルに `mmd_plugin.lib` を追加
6. デバッグ用のMMDを用意しておく (任意)
   - デバッグ用のMMDにはMMDPluginを導入しておく
   - デバッグボタンを押すとデバッグ用のMMDが起動するように設定しておくとよい
      - vcxprojファイルを編集して以下のように設定する
```xml
<?xml version="1.0" encoding="utf-8" ?>
<Project ...>
  [以下略...]
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
    <IncludePath>$(ProjectDIr)mmdplugin;$(IncludePath)</IncludePath>
    <LibraryWPath>$(ProjectDIr)mmdplugin;$(LibraryWPath)</LibraryWPath>
    <OutDir>MikuMikuDance\Plugin\ExamplePlugin\</OutDir>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
    <IncludePath>$(ProjectDIr)mmdplugin;$(IncludePath)</IncludePath>
    <LibraryWPath>$(ProjectDIr)mmdplugin;$(LibraryWPath)</LibraryWPath>
    <OutDir>MikuMikuDance\Plugin\ExamplePlugin\</OutDir>
  </PropertyGroup>
  [以下略...]
</Project>
```

# さいごに
以上がMMDPluginを前提としたMMDプラグインの作り方の前提知識でした。
次回は実際にプラグインを作成していきます。

## Visual Studio で開いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/98b8bf5f-d74d-fc1d-88b3-b0a2bb89a01a.png)

名前などは各自で変更してください。
FreeBSD のソースコードを git 経由でよっこいしょする時に、ブランチを指定する

忘備録

```shell
git clone --depth 1 --branch releng/13.4 ssh://anongit@git.FreeBSD.org/src.git /usr/src
```
この場合、13.4-RELEASE のセキュリティパッチが当たっている最新のんを持ってくる👏

普段から使わんコマンドは、スイッチも含めて覚えきらん💦
よく使うExcelコマンドまとめ

# よく使うExcelコマンド

## 基本操作
- **Ctrl + S**: ファイルを保存
- **Ctrl + Z**: 操作を元に戻す
- **Ctrl + Y**: 操作をやり直す
- **Ctrl + C**: コピー
- **Ctrl + X**: カット
- **Ctrl + V**: ペースト
- **Ctrl + A**: すべて選択

## セルの編集
- **F2**: セルを編集モードにする
- **Alt + Enter**: セル内で改行
- **Ctrl + D**: 上のセルをコピー
- **Ctrl + R**: 左のセルをコピー

## 検索・置換
- **Ctrl + F**: 検索
- **Ctrl + H**: 置換

## 書式設定
- **Ctrl + 1**: セルの書式設定
- **Ctrl + B**: 太字
- **Ctrl + I**: 斜体
- **Ctrl + U**: 下線

## ワークシートの操作
- **Ctrl + N**: 新しいワークブックを作成
- **Ctrl + P**: 印刷
- **Ctrl + Page Up**: 前のシートに移動
- **Ctrl + Page Down**: 次のシートに移動

## データの操作
- **Alt + A + T**: フィルターを設定
- **Alt + A + C**: フィルターをクリア
- **Alt + E + S + V**: 値のみを貼り付け
- **Ctrl + Shift + L**: フィルターのオン/オフ切り替え

## ショートカットキーの組み合わせ
- **Ctrl + Shift + +**: 行または列を挿入
- **Ctrl + -**: 行または列を削除
- **Ctrl + Space**: 列全体を選択
- **Shift + Space**: 行全体を選択

## ナビゲーション
- **Ctrl + ↑/↓/←/→**: データの終端に移動
- **Ctrl + Home**: ワークシートの先頭セル（A1）に移動
- **Ctrl + End**: ワークシートの最後のセルに移動
- **F5 または Ctrl + G**: 指定したセルに移動

## グラフ
- **Alt + F1**: 選択範囲で標準グラフを作成
- **F11**: グラフを新しいシートに作成

# よく使うExcel関数・計算

## 基本的な関数
- **=SUM(A1:A10)**  
  指定した範囲の合計を計算する。
  
- **=AVERAGE(A1:A10)**  
  指定した範囲の平均値を計算する。
  
- **=MAX(A1:A10)**  
  指定した範囲の最大値を取得する。
  
- **=MIN(A1:A10)**  
  指定した範囲の最小値を取得する。
  
- **=COUNT(A1:A10)**  
  指定した範囲内の数値の個数を数える。

## 条件を指定する関数
- **=IF(A1>10, "OK", "NG")**  
  条件に応じて異なる値を返す。  
  （例：A1が10より大きければ"OK"、そうでなければ"NG"）

- **=COUNTIF(A1:A10, ">10")**  
  範囲内で指定した条件（例：10より大きい）を満たすセルの個数を数える。

- **=SUMIF(A1:A10, ">10")**  
  範囲内で条件を満たすセルの合計を計算する。

- **=IFS(A1=1, "A", A1=2, "B", TRUE, "その他")**  
  複数条件に応じた値を返す。

## テキスト操作
- **=CONCAT(A1, B1)**  
  複数のセルの値を結合する。  

- **=TEXT(A1, "yyyy/mm/dd")**  
  セルの値を指定した形式にフォーマットする。

- **=LEN(A1)**  
  セル内の文字数を数える。

- **=LEFT(A1, 5)**  
  セルの左から指定した文字数（例：5文字）を抽出する。

- **=RIGHT(A1, 3)**  
  セルの右から指定した文字数（例：3文字）を抽出する。

- **=MID(A1, 2, 4)**  
  セル内の指定した位置から文字を抽出する（例：2文字目から4文字）。

- **=SEARCH("文字列", A1)**  
  セル内で特定の文字列の位置を探す。

## 日付・時間
- **=TODAY()**  
  現在の日付を取得する。

- **=NOW()**  
  現在の日付と時刻を取得する。

- **=DATE(2024, 12, 20)**  
  指定した年月日の日付を作成する。

- **=DATEDIF(A1, A2, "D")**  
  2つの日付の差を計算する。  
  （例：日数差を"D"、月数差を"M"、年数差を"Y"で指定）

- **=TEXT(A1, "hh:mm")**  
  時間をフォーマットして表示する。

## 検索・参照
- **=VLOOKUP(値, 範囲, 列番号, [検索方法])**  
  指定した範囲から値を検索し、該当する列を返す。  
  （例：=VLOOKUP(101, A1:C10, 2, FALSE)）

- **=HLOOKUP(値, 範囲, 行番号, [検索方法])**  
  指定した範囲から値を横方向に検索する。

- **=INDEX(A1:C10, 2, 3)**  
  指定した行と列の交差するセルの値を取得する。

- **=MATCH(50, A1:A10, 0)**  
  指定した値が範囲内で何番目にあるかを返す。

## 論理演算
- **=AND(A1>10, B1<20)**  
  すべての条件が満たされている場合にTRUEを返す。

- **=OR(A1>10, B1<20)**  
  いずれかの条件が満たされている場合にTRUEを返す。

- **=NOT(A1>10)**  
  条件の結果を逆にする。

## 統計・分析
- **=RANK(A1, A$1:A$10, 0)**  
  範囲内の順位を計算する（0は降順、1は昇順）。

- **=ROUND(A1, 2)**  
  数値を指定した桁数に丸める。

- **=ROUNDUP(A1, 2)**  
  数値を指定した桁数で切り上げる。

- **=ROUNDDOWN(A1, 2)**  
  数値を指定した桁数で切り捨てる。
手の動きでコントロールするブロック崩しゲームの実装

## はじめに
本記事では、MediaPipeを使用して手の動きを認識し、その動きでコントロールするブロック崩しゲームについて説明します

[Kaijo Physics Club Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kaijo-physics-club "Kaijo Physics Club Advent Calendar 2024")に投稿する記事です

## 技術スタック
- Pygame (ゲーム開発ライブラリ)
- MediaPipe (手の認識用ライブラリ)

## システム概要
このゲームは以下の2つの主要な機能で構成されています：

1. **ブロック崩しゲームの基本機能**
   - 画面上部に配置された青いブロック
   - 落下する赤い球
   - プレイヤーが操作する白いバー
   - 衝突判定と跳ね返り処理

2. **手の認識による操作**
   - MediaPipeによる手のランドマーク検出
   - 検出された座標に基づくバーの移動

## 実装

### 1. 必要なライブラリのインポート
```python
import pygame
import time
import cv2
import mediapipe as mp
from multiprocessing import Process, Value
import math
```

### 2. 手を検出するモデルを作成する
```python
mp_hands = mp.solutions.hands
mp_draw = mp.solutions.drawing_utils
hands = mp_hands.Hands()
```

### 3. メインゲームループ
画面設定や、壁やブロックに当たったときの跳ね返りなどの処理を行います

## 動作の仕組み

### 基本メカニズム
- ボールは画面の端に当たると跳ね返ります
- 上部のブロックに当たると、そのブロックが消滅し、ボールが跳ね返ります
- 下部に落ちるとゲームオーバーとなります

### 手の認識とバーの制御
1. MediaPipeが手のランドマーク（21個の特徴点）を検出
2. 21個から、x座標・y座標の最小値・最大値を求め、それらの平均値の座標を計算する
3. 計算された座標値でバーの位置を決定

```python
if results.multi_hand_landmarks:  # 手が検出された場合
                # 検出された手を2つに絞る
                hand_landmarks = results.multi_hand_landmarks[:2]  # 最初の1つの手のみ処理

                for hand_lms in hand_landmarks:
                    landmarks = []
                    landmark = []
                    for index, lm in enumerate(hand_lms.landmark):
                        ih, iw, _ = img.shape
                        x, y = int(lm.x * iw), int(lm.y * ih)
                        landmark.append([x, y])
                    landmarks.append(landmark)

                    x_list = []
                    y_list = []
                    for i in range(21):
                        x_list.append(landmarks[0][i][0])
                        y_list.append(landmarks[0][i][1])

                    most_right_x = max(x_list)

                    most_left_x = min(x_list)

                    most_up_y = max(y_list)

                    most_down_y = min(y_list)

                    color = (0, 0, 255)  # 囲む線(赤)

                    average_x_value = (most_left_x + most_right_x) // 2
                    average_x.value = average_x_value
                    print(average_x.value)
```

## まとめ
課題としては、複数の手が画面上にあると、検出する手が変わってしまうことが挙げられます
現状MediaPipeには同じ手を追える機能はなく、ID付与などができないので難しい状態です

## 参考リンク
- [MediaPipe公式ドキュメント](https://ai.google.dev/edge/mediapipe/solutions/guide?hl=ja)
- [Pygame公式ドキュメント](https://www.pygame.org/docs/)
数十秒の工夫で改善するリモートワークにおけるコミュニケーション術

# はじめに
リモートワークが当たり前になった現在、対面でのやり取りが減る中で、円滑なコミュニケーションを取ることがますます重要になっています。
特にテキストベースでのやり取りが主流になると、意図が伝わりにくくなったり、認識のズレが発生しやすくなるものです。

本記事では、私がプロジェクトマネージャーとしてリモート環境で実践している、チャットツールやWeb会議を活用したコミュニケーション術をご紹介します。

# チャットツールでのコミュニケーション術

### 1. 確認依頼にはリンクを添える
チャットツールで何かを確認してもらいたいとき、関連資料や画面のリンクを添付しています。

**例**：
- ✗「先日発生したバグのチケットを確認してください」
- ✓「先日発生したバグの[チケット]()を確認してください」

このようにリンクを添付することで、依頼を受けた側がすぐに確認できるようになります。
また、確認対象に対する認識のズレを防ぐことにも繋がります。

### 2. 操作説明は具体的に記載する
特定の操作を説明するときは、画面名などの名称を具体的に伝えています。

**例**：  
- ✗「ユーザーの削除がうまく動きません」  
- ✓「「[管理画面-ユーザー一覧]()」画面の「削除」ボタンを押してもユーザーが削除されません」

これは開発チームだけでなく、Biz側とのコミュニケーションでも同様です。
Biz側は顧客への説明で使用する名称を、開発側はソースコードや内部の名称を用いることが多く、用語が統一されていない場合があります。
そのため、画面に表示されている画面名やボタン名を明確に伝えることで、認識のズレを防ぐことができます。

### 3. 確認すべきポイントを明示する
資料を共有する際は、確認すべきポイントや見なくてよい箇所も一緒に伝えています。

**例**：  
- ✗「〇〇にアップロードした資料を確認してください。」  
- ✓「[〇〇]()にアップロードした資料を確認してください。3ページ目の『課題一覧』は重要なので、特に確認しておいてほしいです。5ページ目以降は情報が古いので確認不要です。」

このように確認すべきポイントを明示することで、依頼を受けた側が効率よく作業に取り掛かることができ、不要な確認作業を省くことができます。

### 4. トーンを和らげる語尾を意識する
バグや課題を指摘するときは、怒っているように思われないよう語尾を工夫しています。

**実践例**：  
- ✗「〇〇のプルリクでコンフリクトが発生しているので、修正してください。」
- ✓「[〇〇]()のプルリクでコンフリクトが発生しているので、修正をお願いします！」

このような小さな言い回しの違いで、指摘を受ける側の心理的負担を軽減できます。

### 5. チャットで会話が噛み合わない場合はWeb会議を提案する  
チャットだけでは詳細が伝わりにくい場合や、会話が堂々巡りしてしまう場合は、積極的にWeb会議を提案しています。
顔を合わせて話すことで、誤解や余計な時間の浪費を防げます。

# Web会議でのコミュニケーション術

### 1. 画面共有で認識のズレを防ぐ  
Web会議では、画面共有をしながら議論を進めています。
資料やUIの説明を口頭だけで行うと、認識がズレることが少なくありません。
画面を共有しながら説明することで、チーム全員の理解が一致し、議論をスムーズに進めることができます。

## 4. おわりに  
これらは数十秒の工夫でできる簡単な方法ばかりなので、ぜひ皆さんのチームでも活用してみてください！
また、皆さんの現場での改善例も教えていただけると嬉しいです！
ローコードツールWebPerformer

1.初めに
弊社では、プログラミングレスでシステムを作る画期的なツール(ローコードツール)をいくつか採用しています。
今回は、その中で、私が業務で使用しているWebPerformerというツールを紹介したいと思います。

2.WebPerformerとは
キャノンITソリューションズ株式会社が開発したWebやモバイルアプリ開発に特化したローコードツールです。JavaやPythonで開発する際に使用する統合開発環境のeclipseに、プラグインとしてインストールすることで使う事ができます。

3.特徴
・一つ目は、システムの構築速度が高速であることです。
部品をドラッグ＆ドロップしたり、少々関数を書いたり、データベース定義情報をそのまま入力したりすることで、アプリケーションを作成できます。基本設計工程で定義した事に従って項目を定義していくとほとんどシステムが出来上がるので、詳細設計工程という工程を一つ省略できます。
また、画面を定義するのに、htmlなどのようなコードを記述する必要もないので、
見積でお客様にご提案する際に使用する画面イメージやプロトタイプの作成にも向いています。
![WebPドラッグアンドドロップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962435/8f2a7353-88e5-c32b-bac2-b609b5fe3eaf.png)
・二つ目は、作られるシステムは高品質なことです。
Javaのコードを100%自動生成するので、属人的なバグがないです。
当たり前ですが、普通にプログラミングする際は、人間がコードを書くので、バグが出るようなロジックを書いてしまうリスクがあります。
しかし、このツールは、効率的かつバグが出ないコーディングをする事が保証されているので、
ヒューマンエラーによるバグが発生しにくいです。

4.WebPerformerを使った感想
ローコードツールを使うメリットとして、開発スキルの有無に関わらずアプリケーションを作れるといった謳い文句がありますが、個人的には、開発スキルがあれば、さらに性能を発揮できるだろうと感じました。

理由
・WebPerformerの標準機能だけでは、単純な仕様のシステムしか作れないというデメリットもありますが、Javaのプログラミングスキルを持っていれば、拡張機能が使えて、複雑な要望にも応えることができます。

・WebPerformerの構成はMVCに似ているので、MVCを理解していると、正しい作法で製造することができます。MVCとはデータベースの定義情報やSQLを書く場所(Model)、画面の入出力を担当する場所(View)、ModelとViewの仲介役(Controller)のように役割によって処理を分ける方法のことを言います。
WebPerformerも、MVCのように物事を分けて考える作法があるので、MVCでプログラミングをした経験がある人にとっては、ツールの覚えも早く、正しく使いこなすことができると思います。

![mvc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962435/27aa8649-9429-e0ff-9b00-c107e88fb526.png)

5.最後に
弊社では、高度な開発スキルに加え、WebPerformerのような開発効率を上げるツールやナレッジを保有しているので、短い納期のご要望にも柔軟に対応し、高品質なシステムをお客様の元へお届けいたします。
システムの構築をお考えなら、お気軽にお問合せください。
【Xcode】輸出コンプライアンス情報をInfo.plistで設定し暗号化の質問を飛ばす

# 輸出コンプライアンスとは

https://developer.apple.com/help/app-store-connect/manage-app-information/overview-of-export-compliance

アプリに暗号化技術を使用している場合、米国および配信先各国の輸出入規制に従う必要がある。
そのためApp Store Connectでアプリを提出する際、暗号化の使用状況に関する質問に回答し、必要に応じて輸出コンプライアンス書類を提出することが求められ、
新しいバイナリをアップロードするたびにコンプライアンス要件を満たしているか毎回確認される。

# 現状
以下のようにステータス部分に「コンプライアンスがありません」と表示される。
![スクリーンショット 2024-12-20 10.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/018f553f-1a72-50b2-180e-a4f804cc18b3.png)

「管理」を押下すると、ダイアログが表示される。
![スクリーンショット-2022-11-15-15.51.44-768x528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/cafeafbd-cb9d-34be-b87d-003014637ea0.png)

最後にフランスへの配信についても聞かれる。
![スクリーンショット-2022-11-15-16.19.54-768x448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/fd3f4629-ed41-1c0e-3ff3-d1f904669d33.png)

# Info.plistにキーを追加しこれらの質問を飛ばす

- 標準的な暗号化のみ使用している場合
- 暗号化を使用していない場合

アプリが上記のいずれかの場合は、Info.plistにキー `App Uses Non-Exempt Encryption`を追加し、値をNOとする。
![スクリーンショット 2024-12-20 10.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/e6af3b17-1eb6-f8ae-67a0-c43b1ada0b93.png)

こうすることでApp Store上で毎回暗号化の質問が問われなくなる。

https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations

# 注意点
- 万が一暗号化技術を独自のもので使用することになる場合は変更する必要がある。
- フランスで暗号化技術を使用したアプリを配信する場合には、別途暗号化申告申請書のアップロードが必要。
掃除当番通知を自動化した話

## 緒言
うちの職場では共同で使う部屋の掃除を使用課輪番で週1回やってます。これが頻繁に課が変わるからメンテナンスがめんどくさい！通知を自動化したいだけならSharePointリストで名簿作ってPowerAutomateでスケジュールフローを回せば良いですが、メンバーや課そのものがちょこちょこ変わるのでExcelで輪番表を管理したい！でも通知は自動化したい！ということでした。

## やりたいこと
Excel掃除当番表に基づいてPower Automateクラウドフローで当番通知を自動化

## 方法
### 1.問題のExcel
部署の列があって当番日に”〇”が書かれている伝統的なやつ。”上長”列に〇がついてる部署に対応したその部署の上司のメールアドレスが数式で表示されるようにしてます[^1]。
Excelメンテナンス担当者は部署の変更や増減があったら列を修正して〇をつけなおすのと、上長リスト更新。
![0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/a02e1c26-dac2-eb52-cb68-a3f3f6e033b9.png)
[^1]: 上司のメールアドレスをKeyに部下のリストを自動抽出するため

### 2. Power Automateフロー
#### 全体
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/13197eb1-2d5b-75b0-c183-1524254072f1.png)
・ 当番曜日に繰り返しスケジュールトリガー
・ 日付をExcelで検索できるように変換
・ Excelで日付列を検索して該当レコードを参照
・ 該当行の上司に紐づく部下を取得
・ メールアドレスを結合して通知

#### 日付変換
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/92b50df2-2e86-879f-e0fa-b6b93936b872.png)
Excelの日付列の**シリアル値**と比較するため、フロー実行日をシリアル値に変換。
まずは最初の`Compose`で**起点日の1899/12/30**[^2]を標準フォーマットへ
```
perseDateTime('18991230','ja-JP','yyyyMMdd')
```
次の`Compose2`で起点日と今日の日数差を取得
```
dateDifference(outputs('Compose'),body('Convert_time_zone'))
```
最後の`Compose3`で整数部分だけ抽出してシリアル値へ
```
int(split(outputs('Compose_2'),'.')[0])
```
#### Excelで該当レコードを取得
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/b41a723a-1030-33b8-bb9f-bbadb7d2082d.png)
日付列を前述のシリアル値をKeyに検索して取得

#### メールアドレスの結合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/96f93cdd-d1ba-e358-0a5a-cb67187969c3.png)
部下の中に除外する人がいたりしたらフィルター処理。

[^2]: [こちら](https://qiita.com/mizukyf/items/df3d9ac2cde34a6cf20f)の記事参照

## 結言
シリアル値の取り扱いだけ注意したらExcelからの自動かもサクッとつくれますね！
Nuitkaでexe化のススメ

# はじめに

Pythonを使っている皆さん、アプリを作ってexe化する際には何を使っていますか？
[Python exe化](https://www.google.com/search?q=python+exe%E5%8C%96&oq=python+exe%E5%8C%96&gs_lcrp=EgZjaHJvbWUqCQgAEEUYOxiABDIJCAAQRRg7GIAEMgcIARAAGIAEMgcIAhAAGIAEMgcIAxAAGIAEMgcIBBAAGIAEMgYIBRBFGD0yBggGEEUYPTIGCAcQRRg90gEINDgxOWowajeoAgiwAgE&sourceid=chrome&ie=UTF-8)で検索すると多くのサイトで**PyInstaller**をお勧めされるかと思います。
しかも一部サイトでは、ご丁寧にコマンド付きで解説されています。

「コマンドを覚えられない💦」という人は、**auto-py-to-exe**というGUIツールを使えば、簡単にexe化できます😁
便利ですね👍

参考  

https://qiita.com/osorezugoing/items/4ea5249c43c0ba8b89aa

---

## PyInstallerは便利だけど…

PyInstaller系は簡単にexe化ができる便利なツールだけど…
技術力のある先人たちは
> 「Pythonおよび関連するファイル一式をまとめて実行ファイル形式に変換し、実行時にフォルダに展開している」



つまり、何が言いたいかと言うと
**>>>>起動が遅い！<<<<**  

(実際に比較してくださってる記事)

https://qiita.com/HALBAL/items/7d030e2e6647200b9d77

---

## Nuitkaでexe起動の高速化を！

Nuitkaは一度C言語に変換してからexe化するから起動が早い(らしい)。
インストール方法は公式ドキュメントをご覧ください  

https://nuitka.net/user-documentation/user-manual.html

日本語で書いてくださっている記事もっ！！

https://qiita.com/yulily/items/b97dc34615eac2be7157

![感謝](https://assets.st-note.com/production/uploads/images/53897497/picture_pc_a35b097d5fd967473a4389e2bd53d35f.jpg?width=4000&height=4000&fit=bounds&format=jpg&quality=90)

---

## 試しにインストールしたけど…
PyInstallerには先述の通りauto-py-to-exeがあります。
**Nuitkaにauto-py-to-exeみたいなGUIはないし、コマンドが覚えられない**という声もあると思います。  
残念ながらNuitkaにはそのようなツールがありませんでした。（筆者調べ）。

---

## ないなら作ればいいじゃない！

~~https://github.com/KMASTERgit/Build_Python_To_exe_for_Clung~~
→pipで入れられるように、コードやフォルダを再構成しましたので、クローズとしました。

(2024/12/24更新)
(pipで入れられるようにしました。)
>$ pip install py_nui_exe


開発コードも公開しております。

https://github.com/KMASTERgit/py_nui_exe

コマンド生成を助けるツールとして作りました。
**(開発中なので不具合があるかもしれません。)**

MIT-Licenseとしていますので、ご自由にお使いください。

---

## 使い方の前に…

1. Nuitkaをインストールしてください。  
   （ここまで読んでいるということは、既にインストール済みかと思いますが…）
2. **Pathは半角英数字のみ**にしてください。  
   （Nuitkaの仕様上、日本語が含まれるとビルド時にエラーが発生するっぽいです…筆者も何度その仕様に敗北したことか...）

3. ~~[Build_Python_To_exe_for_Clung](https://github.com/KMASTERgit/Build_Python_To_exe_for_Clung)をクローンしてください。~~

~~（iconファイルもexe化させたいPythonフォルダと同じところに入れておくことをお勧めします。）~~

[py_nui_exe](https://github.com/KMASTERgit/py_nui_exe)を見て、インストールしてください。


---

## ツールの使い方
* 初期画面
![初期画面](https://imgur.com/NPeRCH9.jpg)

* Pythonファイルを選択
![選択画面](https://i.imgur.com/wP9Zlkk.png)

* オプションを選択
![オプション](https://imgur.com/SwVdaVR.jpg)
onefile→PythonのClassファイルなどをひとまとめに
standalone→PythonのないPCでもexeが使える設定
windows-console-mode→黒い画面を出さないよう設定
オプションライブラリ→tkinterやPyTorch,Numpyとかライブラリもexeへまとめる設定
表示のライブラリを使っている場合✅入れるとまとめてexeに入れてくれます。
(公式ドキュメントを見て、ライブラリを書き起こしただけなので、不足分は[issues](https://github.com/KMASTERgit/py_nui_exe/issues)に報告お願いいたします)

* 「プロンプト送信」ボタンを押してNuitka実行！！
(ビルドはPython→C言語→exe化という工程になるので、時間がかかります。)
![実行](https://imgur.com/i0yEaxj.jpg)
Nuitka入れてへんやんけ!!と返されてますね🤣
→実際入れてませんでしたw

---

# 最後に

頭の中空っぽで書いた駄文を
お読みいただきありがとうございます。

ツールにバグなどがありましたら、[issues](https://github.com/KMASTERgit/py_nui_exe/issues)までご報告いただけると幸いです。
ApplicationController  と ActionController の違い

## `Application`Controller  と `Action`Controller

#### 1. `Application`Controller 
- app/controllers/application_controller.rb
- すべてのコントローラの親クラスとして機能し、共通の機能やフィルタを定義する場所。
コントローラの先頭に「**○○Controller < ApplicationController**」という形で書かれる。
    ```users_controller.rb
    class UsersController < ApplicationController
    end
    ```
    ```posts_controller.rb
    class PostsController < ApplicationController
    end
    ```
- アプリケーション固有のフィルタやヘルパーメソッドを定義する場所。
例：ログイン、ログアウトした時、どこにリダイレクトするかなどは、共通なのでapplication_controller.rbに書く。
    ```application_controller.rb
    class ApplicationController < ActionController::Base
      # メアドではなく、名前でログイン
      def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
      end
    
      # ログアウトしたら、ルートにリダイレクト
      def after_sign_out_path_for(resource_or_scope)
        root_path 
      end
    
      # ログインしたら、ユーザページにリダイレクト
      def after_sign_in_path_for(resource)
        user_path(current_user)  
      end
    
      # ログインしているユーザーは、ルートに入らず、ユーザーページにリダイレクト
      def redirect_if_logged_in
        if user_signed_in? && request.path == root_path
          redirect_to user_path(current_user)  
        end
      end
    end
    ```
---

#### 2. `Action`Controller 
- Railsフレームワークの一部であり、コントローラの機能を提供するモジュールやクラスのセット。
- ActionController::BaseがApplicationControllerのスーパークラス。
    ```application_controller.rb
    class ApplicationController < ActionController::Base
    end
    ```
- HTTPリクエストの処理、レスポンスの生成、セッション管理などの低レベルの処理を担当。
- RailsのMVCアーキテクチャにおいて「C（コントローラ）」の振る舞いを定義している。

---

![ActionController.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3905096/225d97f9-4b5d-62e2-2471-e8be22d24d0c.png)

---


**公式ガイド読む箇所：**
- [Action Controller の概要](https://railsguides.jp/action_controller_overview.html)

---
Photonを使うならParrelSyncでデバッグを

UnityでPhotonなどを使ってマルチプレイ開発するときに、毎回毎回ビルドして実機でデバッグはかなり面倒だと思います。[VeriorPies/ParrelSync](https://github.com/VeriorPies/ParrelSync)というOSSがその面倒な世界からの脱出をさせてくれて、UnityEditorだけで簡単にデバッグできるようになります。
下の動画はParrelSync（とPhoton）を使い、右のUnityEditorのSceneでCubeを動かし、もう一方のUnityEditorのほうが同期されていて動いているというものです。
![ParrelSync_demo_trim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/41a20b5d-e79c-5360-c62b-3ce5c62eb4cb.gif)

# メリット
- ビルド不要で簡単に繰り返し実行できます
- 修正した内容が他のUnityプロジェクトにも自動で反映されます
- PUN2でもFusionでも使えます
- WindowsでもMacでも使えます

# 前提
- Unity 2023.2.0f1
- Photon Fusion 2.0.3-sstable-858
- ParrelSync v1.5.2
    - 制限事項などは都度更新されると思うので[本家](https://github.com/VeriorPies/ParrelSync)を参照ください

# 手順

1. Package ManagerからParrelSyncをインストールします。ここではgit URLを利用していますが、unitypackageのダウンロードや、manifest.jsonの修正でも可能です
    ![2024-12-18_21h56_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/10a72acd-1e07-9c49-bee1-d75a224bb96c.png)    
2. インストールが成功しているとメニューにParrelSync（①）が追加されているので、Clone Manager（②）を選択します
    ![2024-12-18_21h58_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/0219abf2-700b-b380-21b0-a2b9ebe02c31.png)
3. Create new cloneボタンを押します。Unityプロジェクトを保存してあるディレクトリと同じところに、プロジェクトがcloneされます    
    ![2024-12-18_21h59_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/850de38e-a79b-adae-47f4-1200ac74ef68.png)    
4. Open in New Editorボタンを押して、もう一つUnityEditorを開きます    
    ![2024-12-18_22h01_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/899ac93f-3f09-647f-87d2-7a2afabbf0e7.png)    
5. 新しく開いたUnityEdtiorでも、もともと開いていたUnityEditorでも実行して、ゲームをプレイすれば、マルチプレイできます。    
    ![ParrelSync_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/22c33ac3-66d1-07fb-10c5-5540b8c0f5a4.gif)    

# 参考
- https://github.com/machidyo/ParrelSync-demoにデモプロジェクトをアップロードしてあります
【Excel】便利な最強関数「FILTER」⚠️バージョン注意!

# やりたかった事
シートAにある表から、条件にあったデータが存在する行の、特定の範囲のデータを表示させたい。
その後、下方向へオートフィルして、シートBの表に、存在する個数分表示させたい。
なおシートAのデータは更新する度に変わる。

![やりたいこと１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/3589c148-def9-814a-c5d1-6c50c442df24.png)
※実際のExcelではなく、デモです。

# Story
ある時、Excelでとある表を作成していました。
そこで、上記のやりたかった事に直面しました。
初めに思い浮かんだのは、VLOOKUP、INDEX、MATCHこのあたりでした。
確かに実装できそうな気がします。
「VLOOKUP」...今回の条件下では、最初の値しか取ってこないし、シートAのデータが更新されるので無理。
「INDEX,MATCH」...できるけども、多少複雑な数式になる。メンテナンスもしづらい。
「INDEX,MATCH」で実装するかぁ～？と思っていながら調べた所、「FILTER」という関数がある事を知りました。
早速使ってみよう！と思って`=FILTER`とすると、予測変換に出てきません。
さらに調べると...**Excel2021**からじゃないですか！！！！拙者Excel2019で絶望しました。
別に2019を使う必要性もなかったので、早速バージョンを変えて、FILTER関数を使いました。
とても短い数式で、こんな事ができるなんて！！感動しました。
これだけに飽き足らず、他者の話では、**レスポンスもとっても早い**とのこと。(確証もないし調べてもないです）
この関数は便利かつ最強なんだな..。と思いました。

# INDEX,MATCHとFILTERの差
シートBのセルA3にいれる事を想定しています。
### INDEX,MATCHの場合
なんとか考えたのですが、どうもうまく出来ず挫折しました。。
章を作っておいて申し訳有りません...
コメントお待ちしております...

### FILTERの場合
```microsoftshell
=FILTER(シートA!A2:D12,シートA!A2:A12=シートB!A1,"")
```
# まとめと雑記
以上、FILTER関数を取り上げさせて頂きました。
8割完成して、下書きで置いていたので、いい加減投稿しようと思い、更新しました。
もし、同じような境遇に出会った方は、本記事でFILTERを使ってみて頂けると光栄です。
もっと、「効率的なやり方がある！！」という方は是非教えて頂けますと嬉しいです！
本記事が参考になったり、興味あるという方は、**いいね**をお願い致します！
更新のモチベとして、大変糧になります！ありがとうごいました！

# ■付録■
## 書式／基本構文
```microsoftshell
=FILTER(配列,含む,[空の場合])
```
### 第一引数 ：配列
一言でわかりやすく言うと、**出力する範囲**です。

Yさん「列Aから列Cを出したいからA1:C10まで指定しよっと！」
`=FILTER(A1:C10,含む)`
### 第二引数 ：含む
一言でわかりやすく言うと、**フィルターしたい条件**です。

Yさん「B列にある[りんご]がある範囲を取得したいから...B1:B10="りんご"を指定しよっと！」
`=FILTER(A1:C10,B1:B10="りんご")`

### 第三引数 ：[空の場合]　※任意
一言でわかりやすく言うと、**フィルター条件に１つも一致しない場合の処理**を記載します。
Yさん「もし、フィルターした時、データが１つもなかったらエラーが出ちゃうから、その場合は、対象なしを出力しよっと！」
`=FILTER(A1:C10,B1:B10="りんご","対象なし")`

:::note info
第三引数は必須項目ではありません。省略が可能です。
指定しない場合に発生すると`#CALC!`が返却されます。
:::

:::note warn 
Excel2021以降のバージョンから本関数は利用が可能です。
:::
MacでVSCodeが更新できない

## 環境
* MacBookpro(Apple M4 Pro)
* OS Sequoia バージョン15.1.1（24B2091）

## エラー内容
VSCode左下設定より更新の確認をクリックすると以下のエラーメッセージが表示される

![スクリーンショット 2024-12-20 10.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532738/d08d47b3-1349-ba07-4c97-f031d1e201e0.png)

#### エラーメッセージ
```
Cannot update while running on a read-only volume. 
The application is on a read-only volume. 
Please move the application and try again. 
If you're on macOS Sierra or later, you'll need to move the application out of the Downloads directory. 
This might mean the application was put on quarantine by macOS. 
See this link for more information.
```
読み取り専用ボリュームで実行中は更新できません。 
アプリケーションは読み取り専用ボリューム上にあります。 
アプリケーションを移動して、もう一度お試しください。 
macOS Sierra 以降を使用している場合は、アプリケーションをダウンロード ディレクトリから移動する必要があります。 
これは、アプリケーションが macOS によって隔離されたことを意味する可能性があります。 
詳細については、このリンクを参照してください。

## 原因
本来アプリケーションディレクトリ配下にVSCodeアプリがあるはずなのですが、
インストールの時になぜかダウンロードフォルダに配置している事で発生しているみたい。

## 対応
1. VSCodeのアプリをダウンロードフォルダから探して、アプリケーションフォルダに移動
1. DockからVSCodeを削除(フォルダ変わったので次回起動時エラーになるので)
1. アプリケーションフォルダからVSCodeを起動
1. 更新の確認を実施
1. 必要に応じてDockに残す

これで解決しました:ok_hand:
Spring Batchのジョブ管理テーブル

Spring Batchを使用すると、ジョブやステップの実行状況を管理するために、いくつかのメタデータ用のテーブルが自動生成されます。これらのテーブルは、Spring Batchがジョブの状態を追跡し、再実行やエラー処理を可能にするために使用されます。

以下に、Spring Batchが自動生成するテーブルとその役割を説明します。

## 1. 自動生成されるテーブル一覧
Spring Batchがデフォルトで生成するテーブルは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/5cc65469-fb90-1233-ca59-24210c7c655c.png)
## 2. 各テーブルの詳細
### 2.1 BATCH_JOB_INSTANCE
役割: ジョブインスタンス（ジョブの実行単位）を管理します。
主なカラム:
JOB_INSTANCE_ID: ジョブインスタンスの一意なID。
JOB_NAME: ジョブの名前。
JOB_KEY: ジョブインスタンスを一意に識別するためのキー。
### 2.2 BATCH_JOB_EXECUTION
役割: ジョブの実行履歴を管理します。
主なカラム:
JOB_EXECUTION_ID: ジョブ実行の一意なID。
JOB_INSTANCE_ID: 対応するジョブインスタンスのID。
START_TIME: ジョブの開始時刻。
END_TIME: ジョブの終了時刻。
STATUS: ジョブの実行ステータス（例: COMPLETED, FAILED）。
EXIT_CODE: ジョブの終了コード。
EXIT_MESSAGE: ジョブの終了メッセージ。
### 2.3 BATCH_JOB_EXECUTION_PARAMS
役割: ジョブ実行時に渡されたパラメータを管理します。
主なカラム:
JOB_EXECUTION_ID: 対応するジョブ実行のID。
KEY_NAME: パラメータのキー。
TYPE_CD: パラメータの型（例: STRING, LONG）。
STRING_VAL: パラメータの値（文字列の場合）。
### 2.4 BATCH_JOB_EXECUTION_CONTEXT
役割: ジョブ実行時のコンテキスト情報を管理します。
主なカラム:
JOB_EXECUTION_ID: 対応するジョブ実行のID。
SERIALIZED_CONTEXT: コンテキスト情報をシリアライズしたデータ。
### 2.5 BATCH_STEP_EXECUTION
役割: ステップの実行履歴を管理します。
主なカラム:
STEP_EXECUTION_ID: ステップ実行の一意なID。
JOB_EXECUTION_ID: 対応するジョブ実行のID。
STEP_NAME: ステップの名前。
START_TIME: ステップの開始時刻。
END_TIME: ステップの終了時刻。
STATUS: ステップの実行ステータス（例: COMPLETED, FAILED）。
READ_COUNT: 読み取ったアイテムの数。
WRITE_COUNT: 書き込んだアイテムの数。
EXIT_CODE: ステップの終了コード。
EXIT_MESSAGE: ステップの終了メッセージ。
### 2.6 BATCH_STEP_EXECUTION_CONTEXT
役割: ステップ実行時のコンテキスト情報を管理します。
主なカラム:
STEP_EXECUTION_ID: 対応するステップ実行のID。
SERIALIZED_CONTEXT: コンテキスト情報をシリアライズしたデータ。
### 2.7 BATCH_STEP_EXECUTION_SEQ
役割: ステップ実行のシーケンス番号を管理します。
主なカラム:
ID: ステップ実行のシーケンス番号。
### 2.8 BATCH_JOB_EXECUTION_SEQ
役割: ジョブ実行のシーケンス番号を管理します。
主なカラム:
ID: ジョブ実行のシーケンス番号。
### 2.9 BATCH_JOB_SEQ
役割: ジョブインスタンスのシーケンス番号を管理します。
主なカラム:
ID: ジョブインスタンスのシーケンス番号。
## 3. テーブルの自動生成について
Spring Batchは、デフォルトでこれらのテーブルを自動生成します。ただし、以下の条件が必要です。

### データベース接続の設定:

application.propertiesまたはapplication.ymlでデータベース接続を設定する必要があります。
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/spring_batch_db
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.batch.initialize-schema=always
```
spring.batch.initialize-schema=alwaysを設定すると、アプリケーション起動時にテーブルが自動生成されます。
### デフォルトのスキーマ:

Spring Batchは、デフォルトでorg/springframework/batch/core/schema-*.sqlに定義されたスキーマを使用してテーブルを生成します。
データベースに応じたスキーマ（例: MySQL、PostgreSQL、H2など）が用意されています。
## 4. カスタマイズ方法
Spring Batchのデフォルトのテーブル名やスキーマをカスタマイズすることも可能です。

### 4.1 テーブル名の変更
BatchConfigurerを実装して、カスタムテーブル名を指定できます。
### 4.2 スキーマファイルの変更
独自のスキーマファイルを作成し、Spring Batchに読み込ませることができます。
## 5. まとめ
Spring Batchが自動生成するテーブルは、ジョブやステップの実行状況を管理するために重要な役割を果たします。これらのテーブルを使用することで、以下のような機能が実現できます。

- ジョブの実行履歴の追跡
- ジョブやステップの再実行
- エラー発生時のリカバリ
- 実行状況の監視

デフォルトの設定を使用するだけで、これらのテーブルが自動生成されるため、開発者はバッチ処理のロジックに集中できます。また、必要に応じてテーブル名やスキーマをカスタマイズすることも可能です。
Proj #002 取引先コード申請のオンライン化をするゾ～第2回 ファイナルアンサー？を実装しよう～

https://qiita.com/Novskiiiiiiiiii/items/f8c66d18e741998468c2

フォームに「戻る」ボタンと「申請」ボタンがありまして、まあよくある話ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c011e28a-c6f6-d2fc-a664-122c02b9bb05.png)

「戻る」をクリックした際にポップアップが出るようにしました。
「無論」をクリックすると入力内容を初期化してメインメニューに戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/2f111d71-76b7-ab1b-6165-9ccc85058c90.png)

「申請」をクリックすると、申請前の確認にメッセージが変わります。
これは「申請」のOnSelectで変数を使って実現しています。

「ファイナルアンサー」をクリックすると、Patch関数が発動してリストにアイテムが登録されます。
変更、削除申請の場合はリストのIDをキーにアイテムを更新する予定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/1a8fb76c-b6eb-45a4-400f-0904965eb318.png)

ポップアップ画面は「戻る」「申請」それぞれのOnSelectで変数にTrueをセットして、
ポップアップ用のラベルのVisibleに変数をセットする事で実現しています。

ポップアップに表示されているボタンのOnSelectで変数をFalseにする事で、
ポップアップを非表示にしています。

キャンバスアプリを触り始めて２か月くらいですが、
もうだいたい理解してきたので、あとはこういうユーザビリティ向上のアイデアの引き出しを増やしていきたいと思います。

今回は時間がないのでプロパティの設定までは紹介しないですが、
こんな事も出来ますね、という紹介でした。

それではまた次回！

https://qiita.com/Novskiiiiiiiiii/items/32871191d906c9f938d0
picoCTF 2024 wirteup WebDecode

## WebDecode (Web Exploitation)

Do you know how to use the web inspector? 
Start searching [here](http://titan.picoctf.net:59625/) to find the flag

記載のリンク先に遷移する。
web inspector を使ってフラグを探せば良いらしい。
web inspectorは`Ctrl+Shift+C`で開ける。
HOME画面に謎文字列は見つからなかった。
ABOUT画面に遷移すると、"Try inspecting the page!! You might find it there"というメッセージが表示された。
bodyのsectionのところに謎文字列を発見。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/b17d914f-59da-b9d3-e835-d747b19c0c83.png)
おそらく`cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfZjZmNmI3OGF9`はBase64であると推測できる。
CyberChefを使ってBase64 Decodeを行う。

フラグが得られた。
`picoCTF{web_succ3ssfully_d3c0ded_f6f6b78a}`
Application Load Balancerの固定レスポンス機能でSorryサーバを構築してみた


この記事は[NTTコムウェア AdventCalendar 2024](https://qiita.com/advent-calendar/2024/nttcomware)の22日目の記事です。



# はじめに
NTTコムウェアの望月と申します！
クラウドの構築・構成管理に便利なプロダクト「[SmartCloud®オーケストレータ](https://sc.nttcom.co.jp/orchestrator/)」を活用し、パブリッククラウド構築・運用の提案や実際のクラウドマイグレーション案件でのAWS設計構築を担当しています。



今回は実際の構築で苦戦した、AWS上でのSorryサーバ構築について紹介できればと思います。


# Sorryサーバについて
Sorryサーバとは、何らかの影響でサービスを提供しているサーバが応答できなくなった際に、利用者に対して停止原因や再開に関するアナウンス等を伝えるサーバです。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945804/e086d291-7cea-0f92-dc9e-69fb444af64b.png)

Sorryページの例
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945804/098b8d22-6107-de8b-e337-a2b2b15b5d0d.png)



# やりたかったこと
複数のWebサイトのSorryページを、1つのS3バケットで表示できる構成を考えていました。下記イメージ図のような想定です。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945804/621e866f-d7ae-427f-0952-3cfd04fd63ba.png)


# 躓いたポイント
S3バケットでの静的サイトホスティングにはいくつかの制約事項があります。
そのうちの一つに、**静的コンテンツをホスティングするバケット名は、
ドメイン名と厳密に一致している必要がある**というものがあります。

どういうことかと言うと、「サイトA.com」のSorryページを作るには、
**「サイトA.com」という名称でS3バケットを作成しなければならないということです。**

翻って、SorryページをS3バケットの静的ホスティングで実装しようとすると、
**サイト個別にS3バケットを用意しなければなりません**。目論見崩れる・・・
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945804/1b39e288-fb79-8d6b-e79e-e4581bb7ee3e.png)




https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#root-domain-walkthrough-create-buckets

# 解決策
Application Load Balancer(ALB)の**固定レスポンス機能**を用いて、Sorryサーバを構築しました。構成図は下記のとおりです。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945804/008aece4-c9ee-9ffb-3972-b24774ff8605.png)


固定レスポンス機能を用いると、クライアントリクエストを削除し、カスタムHTTPレスポンスを返すことが可能になります。

固定レスポンスでは下記項目を設定可能です。

**レスポンスコード**：任意のコードを設定可能です。今回は200としました。
**コンテンツタイプ**：メッセージの形式を選択可能です。今回はtext/htmlを選択し、html形式でSorryページを返すようにしました。
**レスポンス本文**：**1024文字**以下で入力が可能です。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html
# 留意点
ALBでのSorryサーバ構築は、とても便利なのですがいくつか留意点がありますので、そちらも紹介しておきます。
1. **固定レスポンスとして設定可能なのは文字列のみ。**
画像などは設定不可なのでご注意ください。
2. **固定レスポンスで返信する際、レスポンスヘッダの詳細な設定を行えない**
Keep-AliveをOFFにする設定がALBだと行えず、一度Sorry画面につないだ後にサーバへのアクセスが復活してもSorry画面に繋がってしまう事象が発生しました。こちらはLB側でALBから受信するレスポンスヘッダのKeep-AliveをConnection:Closeに変換することで対応できました
3. **ALBを作成する際に、空のターゲットグループを作成・指定する必要がある**
AWSコンソールからALBを作成する際は、ターゲットグループの指定が必須となるので、ターゲットに何も指定しないターゲットグループを作成しなければならない。

# 終わりに
いかがでしたでしょうか？ALBを用いると、簡易&お安くSorryサーバを構築できるので静的コンテンツでSorryページを構築する場合はぜひ検討してみてください！


関連リンク

https://sc.nttcom.co.jp/orchestrator/

「SmartCloud®（スマートクラウド）」は、NTTコムウェア株式会社の登録商標です。その他、記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。
Microsoft Purviewとは

# はじめに
今後の業務にMicrosoft Purviewというツールが関わってくるという事で、今回はPurviewについて調べつつ、ざっくりまとめていきたいと思います。
詳しい部分については、実際に業務を行いながら学習していく予定です。

# 1.Microsoft Purviewの概要
Microsoft Purviewは、様々な環境(クラウド/オンプレミス/SaaS)に分散している組織のデータを一元管理したり、データの漏洩や紛失を防ぎセキュリティ保護を行うツールとなります。
Microsoft社の公式youtubeでは、情報セキュリティガバナンス(情報資産を管理し、セキュリティリスクを最小限に抑えるための組織の取り組み)を以下の3ステップで紹介していますが、その各ステップでこのツールは役立ちます。

**STEP1：データの把握**
データの所在や利用状況の可視化
データカタログ

**STEP2：データの保護**
データの分類
データの暗号化
データへのタグ付け

**STEP3：データ損失防止**
情報流出の防止
内部不正リスクの可視化

# 2.Microsoft Purviewの機能
以下の項目では、Purviewの一部の機能について学習したいと思います。

### 【2-1】Data Map機能
どこにどういったデータがあるのか、組織の保有データをツリー構造のデータマップで管理します。
データマップ上では、組織の体制などを「コレクション」という論理的な管理単位で定義し、各データを対応するコレクションにマッピング(関連付け)します。

なお、様々なデータソースに対応していますので、ハイブリット環境でも問題なく使用できます。(対応するデータソース例：クラウド⇒Azure/AWS/Google、オンプレミス⇒SAP/Oracle、SaaS⇒PowerBI/LookerStudioなど...他にもニッチなものにも対応しているそうです)

また、本ツールでは、一括管理しているデータに対してスキャンをかけてデータを自動分類することができます。
スキャンを行う際に使用する分類ルールは、既定の分類ルール(自動分類/システム分類)と、自身で定義する独自の分類ルール(カスタム分類)の2パターンがあります。
<br>

### 【2-2】Data Catalog機能
データの利用者が、どこにどういったデータがあるのか検索窓で検索することができるカタログ機能です。
この機能を利用することによって、データの検索/分類/説明や関連情報の追加ができます。

なお、【2-1】で出てきた「コレクション」とMicrosoft Entra IDやAzure AD(どちらもクラウドベースのアイデンティティ管理サービス)を対応させることによって、データカタログ検索時に各利用者が検索できる範囲を指定することができます。(部署/役職/個人など、ユーザやユーザグループ毎にアクセス制限ができます)

他にも、データに関する確認が必要となった際のコンタクト先(担当者などの連絡先)を登録することもでき、データの管理がより容易になります。
<br>

### 【2-3】Data Sharing機能
組織内外でデータを共有したい時に簡単で安全にデータ共有/管理ができる仕組みです。

他の人にデータ共有したい時に、データのアクセス制御を操作するだけで共有ができますので、データの複製が発生しません(インプレース共有(AさんからBさんにデータを共有したとして、データコピペでの共有ではないので、AさんとBさんがどちらも同じファイルを一つずつ持っているような状況にならない))。

共有期限や共有条件の設定も可能ですので、データ共有が不要になった後のトラブルも防ぐ事ができます。
<br>

### 【2-4】Data Loss Prevention(DLP/データ損失防止)機能
DLPとは、重要データ(個人情報/財務データ/知的財産など)の漏洩や紛失を防ぐセキュリティ対策システムです。
設定したDLPポリシーを基に組織のデータをスキャン(走査)して重要データを自動で識別/監視し、重要データの流出を検知し警告したりブロックしたりします。

このツール1つで100%のセキュリティ対策を行うことができる訳ではないですが、この機能が監視役として存在しているだけでも組織全体のセキュリティに関する意識レベルの向上が見込まれます。

#### エンドポイントDLP
この機能を使用すると、WindowsOS/MacOS(の対応している各バージョン)を実行しているデバイスに物理的に保存されている重要データに対しても監視&管理ができます。

例えば、teamsのチャット内容/webブラウザやUSBデバイスへのコピペ内容の監視などなど、様々な範囲(メール/チャット/ファイル共有/デバイス上の操作/ファイルサーバ/SaaSアプリ)のセキュリティ対策を行ってくれます。

**↓詳しい監視対象の操作内容とWinOS/MacOSでのサポート/非サポート設定についての参考ページ↓**

https://learn.microsoft.com/ja-jp/purview/endpoint-dlp-learn-about


# 3.お役立ちリンク一覧
本記事がかなり簡素なので、今回勉強していた中で参考になったページを本項に記録しておきたいと思います。
細かい機能の説明や動画解説、Purviewのポータル画面を用いての検証などが載っていてとても分かりやすいです。

**★Microsoft Purviewについて**
「データガバナンスにおける課題と最新トレンド - Microsoft Purview だからこそ実現できる最新のデータガバナンス- secbc2023-05」

https://www.youtube.com/watch?v=hFj1FOnWXhg&t=145s

<br>

**★DLP機能について**
「データ損失防止について」

https://learn.microsoft.com/ja-jp/purview/dlp-learn-about-dlp

「Microsoft 365 Purview データ損失防止(DLP)１」

https://elmgrn.hatenablog.com/entry/purview-dlp1

「Microsoft Purview リスクマネジメント編」

https://youtu.be/WfZeV-9-hss?si=3KX-C1VbphUVXDIe&t=88

<br>

**★データカタログ機能について**
「Microsoft Purviewのデータカタログ・データリネージ機能を検証してみる」

https://cloud.sojitz-ti.com/blog/microsoft-purview/


# おわり
Youtubeで期間指定検索をしよう

今日はYoutubeの期間指定検索です

# 困ってました
Youtubeの検索フィルタでの期間指定の選択肢が少なかったんですよね。
僕はこの期間の動画を見たいのにできないじゃないか😡と何度か思ったことがあります。
なので探してきました。

# 期間指定検索
結論から言うとGoogleの検索用コマンドは全部使えるようです。とりあえず期間指定のみ紹介します。
これは何年何月何日~何年何月何日までの動画だけを表示するというものです。
やりかた(例: 2017/01/01~2017/12/31のGoogleに関する動画の検索)↓
```
after:2017-01-01 before:2017-12-31 Google
```
検索結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/c4f6774f-da76-ef8c-da41-c618152af61b.png)

ちゃんと7年前..7年前...だと..?(死)
..,,7年前(2017年)のものだけでてますね😭
これをafter側だけにすると2017以降の動画がすべて表示対象に、before側だけにすると2017以前の動画すべてが対象になります

# まとめ
短いけどこれで終わりです。先程も言ったようにGoogleの検索コマンドはYoutubeでも対応してたので気になる人は調べてみてもいいかもしれないです。
覚えてたら便利ですよ

わからないことがあればコメントしてください。わかる範囲で答えます

**Discord荒らしの情報や対策方法の共有をしている自鯖です**
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
LeetCodeを1日1題解いてみる (day46)

46日目に取り組んだ問題はこちら！

# 595. Big Countries

https:

## 問題文
Table: `World`
```
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
| area        | int     |
| population  | int     |
| gdp         | bigint  |
+-------------+---------+
```
name is the primary key (column with unique values) for this table.
Each row of this table gives information about the name of a country, the continent to which it belongs, its area, the population, and its GDP value.
 
A country is big if:

it has an area of at least three million (i.e., 3000000 km2), or
it has a population of at least twenty-five million (i.e., 25000000).
Write a solution to find the name, population, and area of the big countries.

Return the result table in any order.

## 僕の回答
```py
import pandas as pd

def big_countries(world: pd.DataFrame) -> pd.DataFrame:
    result = world[(world["area"] >= 3000000) | (world["population"] >= 25000000)]
    return result[["name", "population", "area"]]
```

## より効率の良い回答例
特になし

## 学んだこと
- フィルターや複数カラムを指定する方法などの復習を行えた
- 複数の条件でフィルターをかけるときは、`or`ではなく、`|`で区切る必要があることを忘れていた
- `or`について
    - 短絡評価を行い、左側のオペランドが真の場合、右側は評価されない
    - 任意のデータ型に適用可能
- `|`について
    - ビットごとのOR操作、集合の和集合、辞書のマージなどに使用
    - 短絡評価を行わず、常に両方のオペランドを評価する
- world["area"] >= 3000000 は、world データフレームの各行がこの条件を満たすかどうかを示すブール値のシリーズ（例: [True, True, False, ...]）を生成する。複数の条件を組み合わせてフィルタリングを行う場合、それぞれの条件が独自のブールシリーズを作成する。そのため、これらのシリーズを要素ごとに論理的に結合するために`|`が使用される。

## コメント
`or`と`|`の違いについて理解できていなかったから今回の問題を通して理解できてよかった。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/3f1d1decea3c0c64c36b
IPアドレスについて

## IPアドレスとは
インターネットやネットワークに接続されている機器（パソコン、スマホ、ルーターなど）を見分けるための**住所**のようなもの。データを送ったり受け取ったりする際に「どこからどこへ送るか」を指定するために使われる

## 目次
- [IPアドレスの構成](IPアドレスの構成)
- [IPアドレスの種類](#IPアドレスの種類)
- [固定と変わるアドレス](#固定と変わるアドレス)
- [特徴](#特徴)

## IPアドレスの構成
192.168.1.1というIPアドレスがあったら
**左：ネットワーク部**
**右：ホスト部**
と呼ばれている。
どこからどこまでを区切るかは
アドレスクラスによって違う

## IPアドレスの種類
> ①グローバルIPアドレス

世界中で使える「本当の住所」
インターネットに直接繋げるとき使う
主にインターネットサービスプロバイダー（ISP）から割り当てられる

> ②プライベートIPアドレス

家や会社の中だけで使う「内側の住所」
ローカルネットワーク内で使用されるアドレス
特定の範囲内で自由に割り当て可能
（例:192.168.0.0〜192.168.255.255）
インターネットには直接出られない


## 固定と変わるアドレス
> 固定IPアドレス

住所がいつも同じ、サーバーなどで使う。

> 動的IPアドレス

住所が毎回変わる、家庭用インターネットでよく使われる。

## 特徴

> IPv4

昔から使われている形式。
32ビットのアドレス形式で
数字を4つを「.」で区切る（例:192.168.1.1）
約43億個のアドレスが利用可能ですが
インターネットの普及により枯渇
使える数が足りなくなってきた

> IPv6

新しい形式。
128ビットのアドレス形式で
数字とアルファベットをコロンで区切る
（例:2001:dbd8::1）
IPv4に比べ膨大なアドレス空間を提供されている

---

**簡単に言うとIPアドレスは「ネットの中の住所」でデータの送り先や送り元を間違えないようにするためのもの！**
新人がコードレビューを受ける時に気を付けていること

未経験新卒エンジニアのパン派です。
最近ちょこちょこレビューを受ける機会があり、緊張しつつもそれなりに有意義な時間にできている気がするので、やってよかったなと思うことを書いておきます。

# 先輩のレビューに出席する
先輩から助言頂いて何度か自分以外のレビューに出席しましたが、超効果ありでした。
百聞は一見に如かずとは言いますが、なんとなくああいうことやるんだなとわかっているだけで流れがスムーズになります。
あと、**先輩も結構がっつり指摘食らうしそれが普通なんだな**というのがわかるのがかなり大きいです。もちろん指摘事項は少ないに越したことはないですが、「指摘のない完璧なものを発表する」ことが目的なのではなく、「指摘を受けてより良い状態にしていく」ことが目的なんですから、メスを入れてもらうつもりで臨むくらいでいいんだな。となります。

# 慣れないうちは発表の練習を1回でいいからやっておく
これも助言頂いてやったことです。
**「学生のうちから口頭即興プレゼンなんて何度もやったことあるから大丈夫」って人ほどやった方がいいです。**
なぜならそういうプレゼンの目的は大抵「プレゼンで紹介する内容を良いと思ってもらうこと」なので、話がちょっと不正確だったりごまかしたりしても、プレゼン相手が「良い」と思ってもらえればokになります。
しかし、当たり前ですがコードレビューでは不正確やごまかしはご法度です。不具合の要因になります。
そういうわけで、**今まで適当に乗り切れていたものがコードレビューでは乗り切れない**といった事態が起きかねません。
自分で説明していて引っかかったところは間違いなく他の人も引っかかります。慣れないうちは事前にそれを把握して潰しておく方がいいでしょう。

# リスケの可能性も視野に入れた連絡をする
::: note warn
当然ながら、組織の方針や納品の期日にもよります
:::
リスケは当然無い方がいいですね。でも思いのほかバグ改修に手こずったり、あるいはレビューの予定入れないといけない時期だけど工数が読めなかったりということはあると思います。
絶対に間に合わないとわかっている場合にレビューの予定を入れるのは悪手ですが、多分いけるけど不確実だなくらいの時には、**リスケの可能性ありますと前置きして潔く予定を入れてしまう**のがいいと思っています。
その後も日次で逐一「ちょっと怪しくなってきました」など報告すればばレビュー出席者も「リスケになりそうだな」などとわかります。
そういった流れがあった上で「すみませんやっぱりリスケにします」と言えば、「そういう報告受けてたな。了解」となるだけではないでしょうか。
**予定の変動はないに越したことはないですが、開発に不確実性はつきものですから、「予定通りに進める」というより「予定の変動の報連相を徹底する」方向で動いた方が自他ともにストレスが低くなる気がします。**

# 「良く見せよう」という意識を捨てる
コードレビューでは実態より良く見えてしまってはダメです。不具合の見落としにつながります。
**どんなに不備だらけ穴だらけのコードのレビューだったとしても、不備や穴をうまいことごまかしたコードのレビューよりは100億倍マシ**の気持ちを持って、潔く当たって砕けましょう。
レビューは「良く見せるプレゼンの会」ではなく、「（必要な）指摘をもらう会」ですので。

# わからないことには「わかりません」と言う
「良く見せよう」という意識を捨てることの一つです。
「○○ってどうなってるんですか？」とか、「○○にも影響ないですか？」とか言われたとき、つい人は「（多分）大丈夫です！」とか「（おそらく）影響ないです！」などと答えたくなってしまいます。
しかしそれで後々苦しむのは自分です。もっと言うなら自分以外も不具合対応に追わせる可能性があります。そうなると、「調査不足なので持ち帰って再度調べます」の方が互いにとって有益です。

# 大筋に影響のない不備は最初に補足する
レビューの直前になって細かいミスに気付くことがあります。
よほど致命的なミスならリスケもありですが、後から修正すればいいかな、くらいの内容であれば、「○○について、△△への影響の調査が足りていないためのちほど対応します」と最初に補足すればいいでしょう。
もしそれが思いのほかとんでもない見落としで「後ほど対応します」では済まされないレベルであればおそらくツッコミが入りますし、その点が不安なら「後ほど対応するという方針なのですが問題ないでしょうか？」と最初に聞いてしまえばokです。
**「完成した！」と思っていても絶対にどこかしらに不備はあるものなので、直前に見つけても焦らず規模感を確かめましょう。**

# 質問の意味がわからなければしつこく聞く
質問されるとなんだか焦ってしまって、質問の意味がよくわかっていないのにそれらしいことを言ってしまうこと、ありませんか。
**焦らずに、「すみません、どういう意味ですか？ よくわからず…」と聞いてしまった方がいいです。相手もこちらがどれだけ理解しているのかなんて知らないので、無意識のうちに省いている前提を補って説明してくださるかもしれません。**
１回意味を聞いてもわからなかった場合もう一度聞き直すのには勇気がいりますが、2,3回聞いてやっとわかることも結構あります。まず怒られることはないので聞きまくりましょう。

# 終わりに
この辺りを意識してから、あんまりレビューが怖くなくなってきたなという気がします。
使えそうなものがあれば是非。
未経験から学んだLinuxの基本と学びのまとめ

## はじめに
下記アドベントカレンダーに参加したので「Linux」に関する内容の記事を書きたいと思います

https://qiita.com/advent-calendar/2024/linux

## はじめに
私は未経験からプログラミングスクールでRuby on Railsを中心に9か月間学習してきました。その過程でWeb開発を進めるうえで避けて通れない存在だったのが **Linux** です。サーバーや開発環境の構築など、学びを深める中で何度もLinuxに触れる機会がありました。  

今回は、初心者の私がLinuxについて調べたことや実際に使ってみて感じたことをまとめていきます。同じようにLinux初心者の方が第一歩を踏み出すきっかけになれば嬉しいです！


## Linuxとは？
**Linux** は、世界中で利用されているオープンソースのOS（オペレーティングシステム）です。スマートフォン、サーバー、組み込み機器など、さまざまなデバイスで動作しており、特に開発者にとって重要な基盤となっています。

私がLinuxについて調べて理解したポイントを以下にまとめます

1. **オープンソース**  
   誰でも無料で使えて、カスタマイズ可能！

2. **サーバー運用の基盤**  
   Webアプリやデータベースなど、多くのサーバーがLinuxで動作している。

3. **シェル（コマンドライン）操作が基本**  
   マウスを使うGUIよりも、コマンドを入力するターミナルが主流。

4. **なぜペンギン？**

https://blog.nowhere.co.jp/archives/20180329-25061.html



## Linuxを学ぶための第一歩
### 1. ディストリビューションを知る
Linuxにはさまざまな「ディストリビューション（通称：ディストロ）」があります。これはLinuxのカスタマイズ版のようなもので、用途に応じて選ぶことができます。

- **Ubuntu**  
  初心者におすすめ。使いやすいデスクトップ環境を持つ。
- **CentOS / Rocky Linux**  
  サーバー運用に適したディストロ。
- **Debian**  
  安定性が高く、幅広く利用されている。

※私自身、学習環境として **Ubuntu** を使用しています。（プログラミングスクールにて最初こちらの設定を行うよう指定があったため。）


### 2. 基本コマンドを覚える

Linuxでは、ターミナルでコマンドを使って操作を行います。以下は、私がまず覚えた基本的なコマンドです
```bash
# 現在のディレクトリを確認
pwd

# ファイルやディレクトリを表示
ls

# ディレクトリを移動
cd ディレクトリ名

# 新しいディレクトリを作成
mkdir ディレクトリ名

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

# ファイルを削除
rm ファイル名

# ディレクトリを削除（中身が空の場合）
rmdir ディレクトリ名
これらのコマンドを使うことで、ファイルやフォルダを簡単に管理できるようになりました。
```

### 3. 権限とユーザー管理
Linuxでは、セキュリティの観点から「権限（Permission）」が非常に重要です。以下のコマンドを学び、権限の概念を理解しました：
```bash
# ファイルの権限を確認
ls -l

# ファイルの権限を変更
chmod 権限 ファイル名

# ファイルの所有者を変更
chown ユーザー名 ファイル名
```

特に `chmod` を使って権限を管理する際、初心者には「数字の意味」が分かりにくかったです💦



## 実際に使ってみて感じたこと
### 1. シンプルな操作で強力な機能
コマンドラインは初めは怖かったですが、使い始めるとGUIよりも効率的に操作できることに気づきました。

### 2. オープンソースの魅力を実感
Linuxはオープンソースであり、多くの人が自由に利用・カスタマイズできることを学びました。特に、オンラインで豊富なドキュメントやコミュニティサポートがあり、初心者でも学びやすい環境が整っている点が心強く感じました。

### 3. 基本操作が他の技術にも応用できる
Linuxで学んだコマンドライン操作やファイル管理の基礎は、GitやDocker、サーバー操作など他の技術にも応用が利くことに気づきました。特に、単純なコマンドの積み重ねが後の学習につながるという点で、基礎を身につける重要性を感じました。



## Linuxを学ぶためのおすすめリソース
- **公式ドキュメント**
    [Linux Documentation Project](https://docs.kernel.org/translations/ja_JP/index.html)
    
- **初心者向けチュートリアル**
    [Progate Linux学習コース](https://prog-8.com/)
    初心者に優しい解説が魅力です。
    
- **Qiita記事(沢山あるので一部紹介）**

https://qiita.com/ycoda/items/87d23b818cb06ba1c348

https://qiita.com/k5n/items/2212b87feac5ebc33ecb

https://qiita.com/shobooon/items/7a30f29091a6f8198f43



## さいごに
　Linuxは、初めて触れるときは難しく感じるかもしれません。しかし、基本的な操作から少しずつ学んでいくことで、効率的に作業できるツールとして活用できるようになります。
　この記事が、Linuxを学び始めたばかりの方にとって、最初の一歩を踏み出す助けになれば幸いです！
Crystalのコード整形は標準コマンドのformatでOK

こんにちは。アドベントカレンダーが埋まらないので、Crystal新規向けに小ネタを書こうと思います。

Crystalのコードを自動整形したい場合は、`crystal` コマンドに標準装備されているフォーマッタを利用することができます。

プロジェクトのディレクトリに移動して

```
cd your_project
```

次のコマンドを実行するだけです。

```
crystal tool format
```

僕はこのフォーマッターで困ったことはありませんが、Rubocop ほどは賢くないので、工夫してあちこち技巧的にスペースを入れて見やすくしている場合は詰められてしまうことが多いです。あきらめましょう。

それから、Windowsであっても改行コードはすべてLRに修正されます。Crystalのプロジェクトでは、EditorConfigを利用して改行コードは（Windowsであっても）LRを指定する習慣が推奨されているようです。

この記事は以上です。
ODPでのLOデータソースのテーブルセットアップ

## 1．今までのセットアップテーブルの作成手順
LO(ロジスティクス)データソースはデータを抽出する為にデータソースを有効化した後にセットアップテーブルなるものを作るのですがS/4HANAになってから今までの手順だとうまくいきません(というかできない)

今までの手順だと

1. 使用するデータソースをビジネスコンテンツからのデータソースインストール(トランザクション：RSA5)でインストール
2. LOデータ抽出：カスタマイジングコックピット(トランザクション：LBWE)で使用するデータソースの有効化
3. 対象のセットアップテーブルを作成するカスタマイジングからプログラムを実行

で使用できるようになっていましたが、これをS/4HANAでやろうとすると……
(ビジネスコンテンツからのインストールは省略)

使用したいデータソースを探して「更新」の「無効」部分をクリックして
![LOコックピット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/b20eedbc-a2c4-7853-65e4-641fc24b5519.png)

「有効」に変更する
![LOコックピット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/601b19db-e438-5be1-eb1d-73a14592fb75.png)

次にセットアップテーブルを作成するためにカスタマイジングからプログラムを実行
![カスタマイジング1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/17f20615-ce2e-18b6-1086-a1c24b17262d.png)

すると有効化したにもかかわらず「有効な抽出構造がないか、あるいはBWが接続されていません」と表示されて実行が出来ない……
![カスタマイジング2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/5ab9c9ea-f593-168c-1db4-3b694ccf5323.png)

S/4HANA以前ならこれで完了なはずなんですが何かが足らない様子。

## ２．S/4HANAでのセットアップテーブルの作成手順
調べてみるとNOTEがありました。

https://me.sap.com/notes/0002386514

どうやらデータ抽出の仕組みがODPになったことでODQ関連テーブルを見に行っているようでエラーとなっている感じ。

というわけで手順を整理してみると
1. 使用するデータソースをビジネスコンテンツからのデータソースインストール(トランザクション：RSA5)でインストール
2. LOデータ抽出：カスタマイジングコックピット(トランザクション：LBWE)で使用するデータソースの有効化(※ここまでは同じ)
1. プログラム：RODPS_REPL_TESTを実行して、使用するデータソースのデルタ初期を行う
1. 対象のセットアップテーブルを作成するカスタマイジングからプログラムを実行

実際やってみると(1～2は省略)

ABAPエディタ(トランザクション：SE38)からプログラム：RODPS_REPL_TESTを実行
![プログラム1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/d494f79c-4a69-2def-7116-15fd88b92bea.png)

ODP Contextは「DataSource/Extractors」を選択
ODP名にインストールと有効化したデータソースを入力(ここでは「2LIS_12_VCITM」を入力)
Replicationモードは「最新デルタの抽出」を選択して実行
![プログラム3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/169b2044-b91e-8ee3-b8f0-d9a01e7767ee.png)

セットアップテーブルの作成前なのでデータは何も表示されないでプログラムが終了する
![プログラム2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/eea738e5-6517-16b9-b8b6-dc4a31f53cc5.png)


セットアップテーブルを作成するためにカスタマイジングからプログラムを実行すると
![カスタマイジング1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/4fd04a18-64de-911f-63ce-95592d429c73.png)

![カスタマイジング3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/e0d4cffe-7fcb-62b8-2773-1a890fc5237e.png)
無事、セットアップテーブルを作成するプログラムが起動しました。

## ３．最後に
この作業LOデータソースを使用する際に行うのですが、ほどんどはBW導入時にやる作業なので頻繁にやることは無いので忘れがちになります。私もいつも通り(以前通り)やって躓きました。
セットアップテーブルを作成する前にデルタ初期をローカルで実行するってどうなの？って感じですが…
最後に途中で行ったデルタ初期化は削除しておくのがいいようです。
![リセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/32d5abbd-cf67-149c-180c-8a783767f583.png)