OmniAICreator/Qiita-1.07M huggingface dataset:
Security Hubのセキュリティチェック不要項目を無効化する

# 内容

Security Hubの仕組みや基礎、用語については過去にまとめた下記記事を参照下さい。

https://qiita.com/infra365/items/050fe084fcbc4f2c3753


今回はAWSアカウント内に大量のオブジェクトを作成した際、セキュリティチェック項目の無効化によるコスト削減方法について記載します。Security Hub有効化後、「AWS 基本的なセキュリティのベストプラクティス」などのコントロールを有効化すると、各ベストプラクティスにより定義されているセキュリティチェックが実行されます。Security Hubの料金ですが、「セキュリティチェックの数」が一つの価格決定要素となっています。そのため、大量にオブジェクトを作成した場合、結構な数のチェック数となりコストに影響してしまいます。例えばS3バケットを1000個作成した場合を考えています。この場合、「S3バケット毎にチェックが実行される項目」×「S3バケット数」のチェック項目が増加します。S3バケット毎のチェック項目が「例）S3.5,S3,9 ・・・・と9個あったとすると」9×1000項目チェック数が増加します。

* [S3.5] S3 general purpose buckets should require requests to use SSL
* [S3.9] S3 general purpose buckets should have server access logging enabled
* ・・・・・・

# Security Hubのセキュリティチェックのタイミング
Security HubのセキュリティチェックはAWS Condfigのルールを使用して実行されます。従ってSecurity Hubを有効化する前にAWS Configを有効化する必要があります。有効化後、セキュリティチェックのタイミングですが下記3パターンがあります。

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-schedule.html

1つ目は「定期的なセキュリティチェック」です。このパターンは一定の周期によって自動的にセキュリティチェックが実行されます。2つ目のパターンは「変更によってトリガーされるセキュリティチェック」でリソースの状態に変更があった際にセキュリティチェックが実行されます。3つ目は上記2つのパターンを組み合わせて実行されます。この様に継続的にチェックが実行されるため、セキュリティチェックの項目数が多いとコストに跳ね返って来るわけです。Security Hubリファレンスの「Schedule type」項目から各セキュリティチェックがどのタイプか確認可能です。下記はS3のリファレンスの例です。

https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html


# セキュリティチェックを無効化する方法

不要なセキュリティチェックの無効化方法についても3パターンあります。1つ目は「AWS 基本的なセキュリティのベストプラクティス」などのコントロール基準自体を無効化する方法です。ただしこの方法では、その他必要な項目も全て無効になってしまいます。2つ目はコントロール基準の中の1つのルールを無効化する方法です。例えば「AWS 基本的なセキュリティのベストプラクティス」の中の「[S3.5] S3 general purpose buckets should require requests to use SSL」という1つのルールを無効化することによって該当ルールのセキュリティチェックを無効化することが可能です。3つ目は該当ルールの中の「コントロールステータス」を抑制する方法です。[Security Hubのセキュリティスコアはどうやって計算されるか](https://qiita.com/infra365/items/050fe084fcbc4f2c3753)でも記載しましたが、失敗したセキュリティチェック項目に関して、設計上問題ないもの、何らかの対処が実施されているものに関しては「抑制対応」を行い、「管理者が項目としてチェックしたか」を管理していく必要があると考えています。コントロールステータスを抑制済みにした項目に関してはチェック対象外となります。ただしこの方法だとルール自体は無効化していないため、ルールのアップデートが行われると再チェックが実行される場合があります。(3つ目の方法だとアラートは抑制されるが、課金対象）
Windowsのpathを誤って削除して、コマンドが全く通らなくなった件

## Windowsのpathを誤って削除して、コマンドが全く通らなくなった件

### 経緯
:sweat_smile:
これは、正直、相当焦りました。
だって、開発中なのにDockerコマンドもnslookupコマンドもpythonコマンドも通らなくなったんですよ！！！
設定していたはずのoh-my-poshも適用されなくなったんです。
なぜ、コマンドがとおらなくなったか最初わからなかったんです。
よく確認したら、お馬鹿な私は昨日「path」を誤って消していたんです。
そこで、忘備録としてここにまとめます。

1. まず、```$Env:PATH```をPowerShellで確認してみたんです。
![スクリーンショット 2025-01-18 105739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967486/1cfa85db-739f-fb71-fd0b-28ec1eff2eeb.png)

普通は、このくらい出てくるんですけど、出てこなかったんです。

どこにCommandの.exeファイルがあるか調べることになりました。

2. 左下のWidowsの🔍マークを押して、pythonとかDockerとか手当たりしだい入力して自分のPCのどのディレクトリにあるのかを調べました。

3. ```.exe```をみつけたディレクトリを中心に「システム環境変数の編集」で片っ端からPathを追加することに
 
4. これで、結局全部は、もとに戻らなかったので、 chatGPTにWindowsのデフォルトのpathを教えてもらって追加し、nvmとかDockerとかは、再インストールする羽目になりました。

### 結論

nvmは再インストールしたんですが、現在もnpmがうまく動きません。
nvmは、アンインストールしてnpmのキャッシュファイルも削除したのですが、npmのエラーが出てしまいます。
pathは絶対に削除しない方が良いです。

### まとめ
**環境変数pathの削除は、絶対にしないこと！！！(語気強めで)**
ペイサービスを作るために必要なドメイン？

## **ペイサービス開発のための主要ドメイン定義**  

### **1. 送金機能**  
#### **🔹 会員 → 会員 (P2P送金)**  
- **単純な前払いチャージ残高の移動トランザクション**。  
- 残高不足の場合、**外部口座から自動チャージ後に送金可能**。  
- 💡 **ビジネス的には会員間送金を優先的に促進**（内部資金循環の効果だそう！）。  

#### **🔹 会員 → 一般銀行口座への送金**  
- **前払いチャージ残高**を使用し、**他行の実際の口座へ送金**。  
- 外部銀行システムとの連携が必要（オープンバンキング/ファームバンキングAPIの活用）。  

---

### **2. 決済機能**  
- ユーザーが加盟店で決済を行う際に**伝票（トランザクションレコード）を作成**。  

---

### **3. 精算機能**  
- **加盟店への支払いを整理し、入金を実行**。  
- 精算サイクルの調整：  
  - **ペイ会社（法人）側:** 精算サイクルが長いほど有利（法人口座に資金が長く留まる）。  
  - **加盟店側:** 精算サイクルが短いほど有利（資金回転が早くなる）。  

---

## **ペイサービスに必要な主要機能(Monolithic)**  

#### **1. 会員管理機能（Membership Service）**  
- 会員登録および情報変更  
- 口座連携機能（外部銀行口座の連携）  

#### **2. 簡単送金機能**  
- **会員 → 会員送金**（残高移動のビジネスロジック）  
- **会員 → 一般銀行口座送金**（外部銀行送金モジュール）  

#### **3. 加盟店決済および精算機能**  
- **加盟店管理システム**（加盟店情報、精算口座管理）  
- **決済システム**（決済リクエスト処理、伝票作成）  
- **精算システム**

---

## **ペイサービスの主要モジュール構造(MicroServices)**  

| モジュール名 | 機能 |
|--------|------|
| **会員管理システム（Membership Service）** | 会員登録、情報変更、口座連携 |
| **外部銀行連携システム（Banking Service）** | ファームバンキング/オープンバンキングAPIを活用し、外部送金を処理 |
| **マネー管理システム（Money Service）** | 残高の照会および管理（前払いチャージ、出金など） |
| **加盟店管理システム（Franchise Service）** | 加盟店情報および精算口座管理 |
| **決済システム（Payment Service）** | 決済処理、伝票作成 |
| **送金システム（Transfer Service, 必要性検討可能）** | 単純なロジックのため、Banking Serviceを呼び出せば対応可能 |
| **精算システム（Settlement Service）** | Cronジョブで処理、伝票データを基に銀行送金を実施 |

💡 **送金機能**と**精算機能**は、それぞれ**Banking Service**と**Cron Job**を活用すれば処理できるため、必ずしも独立したモジュールが必要とは限らない！
Snowflale [AUTO SUSPEND,AUTO RESUME,INITIALLY SUSPENDED]

# AUTO SUSPEND

自動的に一時停止にする設定
停止状態をあらかじめ設定しておくことで、不必要な課金を抑えることができる。

実行しただけの料金が発生するとよく言われているが、実はそれ以外にも料金は発生している。
SUSPENDの時間というのは、クエリから設定した時間はコンピューティングがアイドル状態になるので、その期間も一応料金は発生している。

最低設定時間は60秒となっている

```sql
CREATE WAREHOUSE MY_MED_WH
AUTO_SUSPEND=300
```

不必要なアイドル時間などの料金がなくなるので、一見メリットにも聞こえるかもしれないが
デメリットも存在する

## AUTO SUSPENDのデメリット

おそらく、コンピューティングである内部のEC2などはdockerなどの仮想コンテナ技術などが使われているため、一度立ち上げて、その後一時停止をすることでメモリに保存されていたキャッシュが消えることになる。

そのため、同じクエリを何度か行う場合
分析のパフォーマンスが下がることも考えられる。

仮想ウェアハウスは、専有のディスクが存在しない以上、それも考慮しておくことが必要である。

日次や月次レポートなどで、頻繁にアクセスしないBIレポートなどは
キャッシュを気にする必要はあまりないので、SUSPEND期間は短くても良いかもしれない

一方で、
データサイエンティストなどがストリーミングデータを収集して分析するなどと言った
ウェアハウス要件については、分析パフォーマンス向上も加味して
SUSPEND期間を長くすることも検討する必要があると思います。

# AUTO RESUME

クエリが送信されると、一時停止したウェアハウスを開始する。
基本的にはこれはAUTOにすることが適していると考える。

```sql
CREATE WAREHOUSE MY_MED_WH
AUTO_RESUME=TRUE;
```


# INITIALLY SUSPENDED

これは、ウェアハウスが最初にサスペンド状態で作成されるかどうかを示しています。
ウェアハウスを作成して、CREATE TABLE等しか行わない場合に有効です。

Snowflakeでは メタデータ管理が独立したサービス（Cloud Services Layer）で処理されるため、CREATE TABLEなどのメタデータに関するsqlは、仮想ウェアハウス（コンピュートクレジット）を消費しません。

```sql
CREATE WAREHOUSE MY_MED_WH
INITIALLY_SUSPENDED=TRUE;
```
AtCoder Beginner Contest 392 振り返り

ABC392の振り返りです。

## 結果

ABCの3完でした。今回簡単目だったためか、ratingあまり上がりませんでした

![スクリーンショット 2025-02-09 15.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/06d87f7f-e40a-086a-7fab-f1c9d447b0aa.png)

![スクリーンショット 2025-02-09 15.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/1acc7e63-2a6e-4008-2936-ce13ccb48220.png)


## ふりかえり

### A問題

- 問題
  - https://atcoder.jp/contests/abc392/tasks/abc392_a
- 回答
  - https://atcoder.jp/contests/abc392/submissions/62513911

`permutations`使って全パターン試します

```haskell
main :: IO ()
main = do
  as <- permutations <$> getInts

  let ans = [b3| [b1, b2, b3] <- as, b1 * b2 == b3 ]
  printYN $ not $ null ans
```

### B問題

- 問題
  - https://atcoder.jp/contests/abc392/tasks/abc392_b
- 回答
  - https://atcoder.jp/contests/abc392/submissions/62522404

`[1 .. n]`全てに対して`notElem`使いましょう

```haskell
main :: IO ()
main = do
  [n, _] <- getInts
  as <- getInts

  let ans = [show i | i <- [1 .. n], i `notElem` as]
  print $ length ans
  putStrLn $ unwords ans
```

### C問題

- 問題
  - https://atcoder.jp/contests/abc392/tasks/abc392_c
- 回答
  - https://atcoder.jp/contests/abc392/submissions/62531224

ゼッケンと見つめる先を`IntMap`にして管理します。
見つめる先はVectorとして管理して取得するようにしました。

```haskell
main :: IO ()
main = do
  n <- readLn @Int
  ps <- getInts
  qs <- getInts

  let qps = zip qs ps
      im = IM.fromList qps
      as = map (\i -> fromJust $ IM.lookup i im) [1 .. n]
      v = VU.fromList qs
      ans = map (\a -> show $ v VU.! (a - 1)) as

  putStrLn $ unwords ans
```

## 全体を振り返って

もっとHaskellと仲良くなりたいので引き続き頑張ります！
Linuxディストリビューションあれこれ

# 目的
 こんにちわ．今回の記事はLinuxディストロについてまとめたものです．私は実務経験のないIT技術者を目指しているだけの大学生なので，間違っている部分もあると思いますが，それでもいいという方以外はブラウザバック推奨です．
 この記事は備忘録目的のためのものです．dockerでイメージを決める際にそもそもLinuxディストリビューションって何あるのという疑問から出発しているので，dockerで動かすにはこれ知っていたら便利だろうと予測してまとめています．間違いもあると思います・RedHatやSlackwareなどそもそも使いそうにないことは，生成AIに頼っています．ご注意ください．

# Linuxディストリビューション
# RedHat系

- 商用サポートが充実しており，企業向けに特化したディストリビューションが多い.
- パッケージ管理にはRPM（Red Hat Package Manager）を使用し，.rpm形式のパッケージを扱う.
- Fedoraは最新技術を取り入れた実験的なディストリビューションで，RHELの基盤となることが多い.
### 知らなかったこと
#### パッケージ管理RPM

- 拡張子：`.rpm`
- cpio形式でアーカイブ(複数のフォルダを一つでまとめること)
- 管理データベース：Berkey DB（オラクルがバックにいるらしい...詳細はよくわからん）
- C言語で記載されている．
- 言語バンティング：言語やプログラムの対応関係の有無，
				  (言語バンティングがあるとはその言語で操作可能ということ)

# Slackware系
- 管理が複雑で，初心者には難しいとされるが，安定性とセキュリティを重視.
- パッケージ管理は手動で行うことが多く，他の系統に比べて自動化されていない部分が多い.
- システムのカスタマイズ性が高く，上級者向けのディストリビューション

#### **1. pkgtool**

- **概要**: Slackwareの基本的なパッケージ管理ツールで．インストール．削除．アップグレードなどの操作を行うためのインターフェースを提供.
- **機能**:
    - インストール済みのパッケージの管理
    - パッケージのインストールや削除を簡単に行える
    - ncursesベースのメニューインターフェースを使用しており．視覚的に操作しやすい

#### **2. slackpkg**

- **概要**: Slackwareの公式リポジトリからパッケージを管理するためのツール.APTやyumのように．リモートからパッケージを取得して管理.
- **機能**:
    - オンラインリポジトリとの同期
    - パッケージのインストール．アップグレード．削除を簡単に行える
    - 依存関係の管理は自動では行わないが．便利なインターフェースを提供

#### **3. sbopkg**

- **概要**: SlackBuilds.orgからパッケージを管理するためのツールで．Slackwareのユーザーが自作のパッケージを簡単にインストールできるように設計.
- **機能**:
    - SlackBuildスクリプトを使用して．ソースからパッケージをビルド
    - 依存関係の管理も可能で．ユーザーが必要なパッケージを簡単にインストールできる

#### **4. slpkg**

- **概要**: Slackwareシステム上でパッケージを管理するための強力なツールで．インストール．アップデート．削除を自動化.
- **機能**:
    - パッケージの依存関係を自動的に計算し．管理
    - コマンドラインインターフェースを提供し．スクリプトを使用してパッケージ管理を効率化

# Debian系
- 初心者にも扱いやすい.
- Debian系は，シングルボードコンピュータであるRaspberry Piでも使用されている.
- パッケージ管理にはAPT（Advanced Package Tool）を使用し，.deb形式のパッケージを扱う.
- 安定性が高く，広く普及しているため，サポートや情報が豊富.

### 代表例
#### Ubuntu
- モチベーション：UI重視の代表的なLinuxOS
- パッケージ管理ツール；APT
- 依存関係の管理：APTが自動的に依存関係を解決する
- サポート言語：C, C++, Python, Ruby, Java

#### Linux Mint
- モチベーション：デスクトップ環境の使いやすさを重視しているUbuntuベースのOS
- パッケージ管理ツール；APT
- 依存関係の管理：Ubuntu同様
- サポート言語：Ubuntu同様
#### Debian
- モチベーション：サーバ管理
- パッケージ管理ツール：APTとdpkg（dpgkhは低レイヤー，APTは高レイヤー）
- 依存関係の管理：APTは自動，dpkgは手動
-  サポート言語語： C, C++, Pythonなど


#### Alpine 
- モチベーション：効率，セキュリティを重視する
- パッケージ管理ツール：APK
- その他要項
    - muslとBusyBoxをベースとしたLinuxディストリビューション．
    - APK：ネットワーク経由でパッケージをインストール
    - glibcの互換ライブラリmuslを使用
2025年、いまでも読みたい技術関連書籍10＋1選

自分が過去手にした、読んだ書籍からのピックアップです。時代を越えて読み継がれてほしいなと思います。

※なるべく版元を引用し、電子版があるものは電子版へのリンクを載せるようにしています。

https://www.seshop.com/product/detail/6063

https://www.oreilly.co.jp/books/9784873114798/

https://www.oreilly.co.jp/books/9784873115658/

https://www.seshop.com/product/detail/20690

https://www.pmi-japan.shop/shopdetail/000000000028/

https://gihyo.jp/dp/ebook/2014/978-4-7741-7026-8#

https://www.ohmsha.co.jp/book/9784274226298/

https://www.ohmsha.co.jp/book/9784274068560/

https://www.oreilly.co.jp/books/9784873115894/

https://www.oreilly.co.jp/books/9784873114026/

番外

https://www.diamond.co.jp/book/9784478107409.html

## 仲間を募集しています！
ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。 カジュアル面談、随時受付中です！ ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421
コードは合っているのに、エラーが解除されない時の解決策

# 解決策1：キャッシュ削除
```
php artisan optimize:clear //cache:clear config:clear route:clear view:clear をまとめて実行
composer dump-autoload //クラスのオートロード情報を再生成
```
```
上記の補足
php artisan optimize:clear
↓ 1個で4つをまとめて実行してくれる
php artisan cache:clear //アプリケーションのキャッシュ を削除
php artisan config:clear //設定（config）キャッシュ を削除
php artisan route:clear //ルートキャッシュ を削除
php artisan view:clear //Bladeビューのキャッシュ を削除
```

# 解決策2：サーバー再起動
```
php artisan serve
npm run dev
```
Vue.js の `<script>` 部分の構造解説


Vue.js では、コンポーネントのロジックを `script` セクションに記述します。Vue 3 では `Composition API` を、Vue 2 では `Options API` を使うのが一般的です。本記事では、それぞれの構造について解説し、さらに `data` や `computed` の種類についても詳しく説明します。

---

## 1. Composition API (`<script setup>`)
Vue 3 で推奨される `Composition API` を使うと、よりシンプルなコードを書くことができます。

### 基本構造
```vue
<script setup>
import { ref, computed, onMounted } from 'vue';

// 1. データの定義
const count = ref(0);

// 2. 計算プロパティ
const doubleCount = computed(() => count.value * 2);

// 3. メソッド
const increment = () => {
  count.value++;
};

// 4. ライフサイクルフック
onMounted(() => {
  console.log('コンポーネントがマウントされました');
});
</script>

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>
```

### 各部分の解説
1. **データの定義 (`ref`)**
   - `ref(0)` を使ってリアクティブな変数 `count` を定義。
   - `count.value` で値を取得・更新する。

2. **計算プロパティ (`computed`)**
   - `computed` を使い、`count * 2` の値をリアクティブに計算。

3. **メソッド**
   - `increment` 関数で `count` を増加させる。

4. **ライフサイクルフック (`onMounted`)**
   - `onMounted` を使い、コンポーネントがマウントされたときの処理を実行。

---

## 2. Options API
Vue 2 互換の `Options API` では、オブジェクト形式でコンポーネントの設定を行います。

### 基本構造
```vue
<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  computed: {
    doubleCount() {
      return this.count * 2;
    }
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  mounted() {
    console.log('コンポーネントがマウントされました');
  }
};
</script>

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>
```

### 各部分の解説
1. **`data()`**
   - `data()` メソッドでリアクティブな変数 `count` を定義。

2. **`computed`**
   - 計算プロパティ `doubleCount` を定義。

3. **`methods`**
   - `increment()` メソッドで `count` を増やす。

4. **`mounted`**
   - `mounted()` ライフサイクルフックでログを出力。

---

## 3. `<script>` 内で使用できるブロックの種類
Vue の `script` 部分には、以下のブロックがあります。

### 1. `data`
- コンポーネントの状態を定義する。
- Options API では `data()` メソッドを使い、Composition API では `ref()` や `reactive()` を使用。

### 2. `computed`
- 既存のデータをもとに、新しい値を計算するプロパティ。
- `getter` のみのものと `getter` / `setter` 両方を持つものがある。

### 3. `methods`
- イベント処理などのメソッドを定義。
- Composition API では単なる関数、Options API では `methods` 内に記述。

### 4. `watch`
- 特定のデータの変化を監視し、副作用を実行。
- Composition API では `watch()`、Options API では `watch` オプションを使用。

### 5. `watchEffect`
- `watch` よりも即時に実行され、依存関係を自動収集。

### 6. `props`
- 親コンポーネントから受け取る値を定義。

### 7. `emits`
- 子コンポーネントが親に対して発火するイベントを宣言。

### 8. `setup`
- Composition API でデータやメソッドを定義するための関数。

---

## 4. まとめ
| 比較 | Composition API (`setup`) | Options API (`export default`) |
|------|--------------------------|--------------------------------|
| データ定義 | `ref()` / `reactive()` | `data()` を return |
| 計算プロパティ | `computed()` | `computed` オプション |
| メソッド | ただの関数 | `methods` オプション |
| ライフサイクル | `onMounted()` など | `mounted()` など |
| シンプルさ | 簡潔で直感的 | 記述が長め |

新規プロジェクトでは `Composition API` を使うのが推奨されますが、チームの方針やプロジェクトの要件に応じて選択してください。

Vue.js の `script` 部分の構造について理解が深まったでしょうか？ 質問があればコメントで教えてください！
WSLで VS Code の使用を開始する

[Linux 用 Windows サブシステムで Visual Studio Code の使用を開始する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode)を見ながらVS CodeからWSLで開発をできるようにしました。

# Steps
## 0. 前提
- Windows11 24H2
- WSL-Ubuntu: 22.04.5 LTS
- VS Code: 1.97.0

```powershell: wsl version
> wsl --version
WSL バージョン: 2.4.10.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5716
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26100.3037
```

一応、`wsl --update`で最新にしています。

## 1. Remote Development 拡張機能パックインストール
VS Codeの[Remote Development 拡張機能パック](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)をインストール

## 2. Linux ディストリビューションを更新する
UbuntuでLinux ディストリビューションを更新。

```bash
sudo apt-get update
```

```bash
sudo apt-get install wget ca-certificates
```

## 3. Visual Studio Code で WSL プロジェクトを開く
Ubuntuでプロジェクトのディレクトリを適当に作り、そこをカレントディレクトリにして下記を実行。

```bash
fukuhara@fukuhara-yohei:~/repositories/HelloWorld$ code .
Installing VS Code Server for Linux x64 (33fc5a94a3f99ebe7087e8fe79fbe1d37a251016)
Downloading: 100%
Unpacking: 100%
Unpacked 2064 files and folders to /home/fukuhara/.vscode-server/bin/33fc5a94a3f99ebe7087e8fe79fbe1d37a251016.
Looking for compatibility check script at /home/fukuhara/.vscode-server/bin/33fc5a94a3f99ebe7087e8fe79fbe1d37a251016/bin/helpers/check-requirements.sh
Running compatibility check script
Compatibility check successful (0)
```

UbuntuでのVS Codeのインストールが始まり、インストールが終わると自動でVS Codeが起動。

# 使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/d4a73ae7-00fc-2b8e-2866-485fc3d1ab51.png)  
TERMINALは当然bashになっている。

Extensionもローカル(Windows)とWSLで区別されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/ac55cb4b-e49a-a480-a08a-347521ddc164.png)

VS Codeのコマンド パレットを起動することで、より多くの VS Code の WSL オプションにアクセスすることもできます。 その後「WSL」と入力すると、利用できるオプションの一覧が表示されます。これにより、WSL セッションでフォルダーを開き直したり、開くディストリビューションを指定したりできます。

今回は試していませんがGitをWSLで使う方法のリンクです。

https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-git
未実装の機能が強すぎることに気づいた

　コンパイラを作るために開発した言語UCCScriptのインタープリタの再帰を無くして、高速化を図る機能を実装する前、テストとして

コード：
```ucc
First Test End
$Test In { <o "+-"> <{ ( "+" | "-" ) }> <o "*/"> <{ ( "*" | "/" ) }> }
      Is (If[?[0]][ (For[0 $0+[0] 1 - 1][ @1[0 `] ]) ] Else[])
         (If[?[1]][ (For[0 $0+[1] 1 - 1][ @1[1 `] ]) ] Else[]) End
```
入力：
```
+*-/
```

コードを書いて入力を与えると`+-*/`と返ってきて欲しいのですが、実際には
```
+-+*/
```
と返ってきました（中央の`+`はどこから来たのだろうか…）。そんな致命的なバグを発見したことによって（インタープリタをC#からF#に書き換えていることもあって）、実装していませんでした（未実装の機能が強すぎて、このバグは放棄した）。

--追記
・このバグはUCCScriptの仕様によるもので解決のしようがないものでした（そもそもコードがぐちゃぐちゃで何がどうなっているのかもわからなくなっていた）。

# マッチングの条件分岐
　再帰をできるだけ行わないために、任意のアンカー`'`に飛ぶ機能（それと、結果を返すところからマッチングを要求する機能）の実装を決め、具体的にどのように書こうかを決めている時でした。
```ucc
First Test End
$Test In <( Char )> "|" m"r:0" j' "a" ret ' "b" ret j
    Is j' (
          If[@0[0] Num ~ 2 % 0 =][ (MoveP[0]) ]
          Else[ (MoveP[1]) ]
       )
       Ret j End
```
　
　　　　条件分岐ができるだと……
　
 これは正規表現`[0-9]\|(a|b)`（C#）にマッチする文字列で、最初の一桁の数字が偶数なら`a`で、奇数なら`b`でマッチさせるコードなのです。


--追記
・仕様は変更されましたが、実装しました。[UCCScript](https://github.com/MueLangDeveloper/UCCScript)
Qiita書き方メモ

## 〇コード形式
3バック,形式,タイトル
本文
3バック
※ , は便宜上の書き方である。実際は```html:titleのように書く。
 ```html:コード形式
 code
 ```

## 〇1バックで囲む→網掛け
`網掛け`

## 〇＃→見出し　
＃の個数に応じてHnタグ、＃とテキストの間に半角
### 見出し3

## 〇*で囲む→イタリック
*italic*

## 〇**で囲む→ボールド
**ボールド**

## 〇~~で囲む→打消し線
~~打消し~~

## 〇\<details>で折り畳み
<!-- open属性なし -->
<details open><summary>サンプルコード（openあり）</summary>

↑の行は空行じゃないと形式崩れる可能性あり。
以降は好きに内容書いていい。
</details>

<!-- open属性あり -->
<details><summary>サンプルコード（open属性なし）</summary>
open〇、空行× version
```rb
puts 'Hello, World'
```
</details>

## 〇目を引く見た目（緑、黄色、赤）
\:::note info, warn, alert
本文
\:::


:::note info
インフォメーション
infoは省略可能です。
:::

:::note warn
警告
○○に注意してください。
:::

:::note alert
より強い警告
○○しないでください。
:::


ひとまずここまで
基本的な日本語文法を理解しよう

# ◆この記事の目的
理解しやすい文書構成に必要な、日本語文法ついて理解する

# 目次
▼[文章の構成単位を知ろう](#文章の構成単位を知ろう)
▼[単語分類である品詞を理解しよう](#単語分類である品詞を理解しよう)
▼[文の接続を使いこなそう](#文の接続を使いこなそう)

# ▼文章の構成単位を知ろう
以下は、文章を構成する単位である
### 文
>主語と述語を含む、一つの意味を持つまとまった表現である。文は句読点（句点、読点）を用いて区切られる
### 文章
>複数の文が連続して構成される、全体としてのまとまった内容を持つテキストである
### 段落
>文章の中で一つのテーマやアイデアを表すために、いくつかの文をまとめた単位である。改行やインデント（字下げ）によって区切られる
### 文節
>文をさらに細かく区切った単位であり、一つの意味や機能を持つ部分を指す。文節は主に助詞や助動詞によって区切られる
### 単語
>意味を持つ最小の単位であり、文章や文を構成する要素である。単語は辞書に載っているような、独立して意味を持つ語彙である
### ※文節と単語の違い
    文節：「猫が鳴く」という文では、「猫が」と「鳴く」が文節である
    単語：「猫が鳴く」という文では、「猫」、「が」、「鳴く」のそれぞれが単語である

# ▼単語分類である品詞を理解しよう
以下は、それぞれの品詞についての説明である
### 名詞
>物や事柄の名前を表す単語である。具体的には、人、場所、物、概念などを指す。例として、「犬」、「東京」、「自由」などが名詞に該当する。「名詞＋動詞の語幹」で作った合成語（「本番環境権限保持者」など）も名詞となる。ただ、基本的には使用しないようにする
### 動詞
>動作や状態を表す単語である。文中で主語の行動や状態を示す役割を持つ。例として、「走る」、「食べる」、「ある」などが動詞に該当する
### 助動詞
>動詞に付いて、その意味を補助する役割を持つ単語である。助動詞は、動詞の意味を変化させたり、補足したりする。例として、「〜たい」（希望）、「〜れる」（可能）、「〜ない」（否定）などが助動詞に該当する
### 助詞
>文中の単語や文節の関係を示す単語である。助詞は文の構造を明確にし、意味を補足する役割を持つ。例として、「が」（主格）、「を」（目的格）、「に」（方向）、「と」（並列）などが助詞に該当する
### 形式名詞
>文中で特定の意味を持たず、文法上の役割を果たすだけの名詞を指す。例として、「こと」、「もの」、「ところ」などが形式名詞に該当する
### 補助動詞
>他の動詞や形容詞と組み合わさって、その意味を補助する役割を持つ動詞である。補助動詞は、文中の意味を詳細に伝えるために使われる。例として、「〜ている」（継続）、「〜てある」（結果）、「〜てみる」（試み）などが補助動詞に該当する
### 補助形容詞
>他の形容詞や動詞と組み合わさって、その意味を補助する役割を持つ形容詞である。補助形容詞は、意味のニュアンスを伝えるために使われる。例として、「〜らしい」（推測）、「〜そうだ」（様子）、「〜ない」（否定）などが補助形容詞に該当する

# ▼文の接続を使いこなそう
以下は、接続詞の種類についての説明である
### 順接
>前の文と後の文が原因と結果の関係にある場合に使用される。例として、「だから」、「そのため」、「したがって」などがある。例えば、「雨が降った。だから試合は中止になった。」
### 逆接
>前の文と後の文が対立や矛盾する関係にある場合に使用される。例として、「しかし」、「だが」、「けれども」などがある。例えば、「勉強した。しかし試験に合格しなかった。」
### 並立
>前の文と後の文が同等の関係にある場合に使用される。例として、「そして」、「また」、「ならびに」などがある。例えば、「彼はピアノを弾く。そしてギターも上手だ。」
### 添加
>前の文にさらに情報を追加する場合に使用される。例として、「さらに」、「その上」、「加えて」などがある。例えば、「彼はサッカーが得意だ。さらにバスケットボールも上手だ。」
### 説明
>前の文の内容を詳しく説明する場合に使用される。例として、「つまり」、「すなわち」、「要するに」などがある。例えば、「彼は非常に優秀な学生だ。つまりいつも成績がトップだ。」
### 対比
>前の文と後の文が対照的な内容を持つ場合に使用される。例として、「一方」、「反面」、「対して」などがある。例えば、「兄はスポーツが得意だ。一方弟は勉強が得意だ。」
### 転換
>話題を変更する場合に使用される。例として、「ところで」、「さて」、「ちなみに」などがある。例えば、「今日は良い天気だ。ところで明日の予定はどうする？」

# 参考文献
[日本語スタイルガイド（第3版）](https://jtca.org/learn-tc/publication/guide_jsg/)
【Javascript】なんでconstに関数を格納するの？

## はじめに
Rectなどのライブラリを学習する際、constに関数を格納しているコードをよく見かけます。
普段PHPを書いている身としては、functionで定義しない理由が分からなかったので調べてみました。


**constに格納**
```javascript
const sayHello = () => {
  console.log("Hello!");
}

sayHello(); 
```

**functionに格納**
```javascript
function sayHello() {
  console.log("Hello!");
}

sayHello(); 
```


## constに格納する理由
用途によっていくつかあるようですが、代表的なものを挙げます。
1. 再代入を防ぐ
1. 巻き上げが発生しない

## 例
### 1. 再代入を防ぐ
functionに格納すると、再代入される可能性があります。
プロジェクトの規模が拡大すると見通しが悪くなるので、上書きされていても気づき難いです。
バグの温床になるので、意識して使い分けた方が良さそうです。


**constに格納**
```javascript
const sayHello = () => {
  console.log("Hello!");
};

sayHello(); // "Hello!"

// sayHello = () => { console.log("Hi!"); }; 
// ↑ エラー: "Assignment to constant variable."
```

**functionに格納**
```javascript
function sayHello() {
  console.log("Hello!");
}

sayHello(); // "Hello!"

// 関数を上書きしてしまう
sayHello = function() {
  console.log("Hi!");
};

sayHello(); // "Hi!"
```

### 2. 巻き上げが発生しない
functionで定義すると、巻き上げ（hoisting） によって関数がスコープの先頭に移動します。
constで定義するとスコープ内の定義された順番で実行されるので、実行順がコントロールし易いです。

**constに格納**
```javascript
sayHi(); // エラー（巻き上げがない）
const sayHi = () => {
  console.log("Hi!");
};
```

**functionに格納**
```javascript
sayHello(); // OK（巻き上げが起こる）
function sayHello() {
  console.log("Hello!");
}
```

## 比較表
| 特徴 | 関数宣言 (function foo() {}) | 関数式 (const foo = () => {})|
|-----|-----|-----|
|巻き上げ (Hoisting) | あり（関数の前でも呼べる） | なし（定義前に呼ぶとエラー）|
|スコープ	|関数スコープ	|ブロックスコープ|
再代入|可能（foo = ... で上書きできる）|不可（const の場合）|
可読性・管理|グローバル関数向き|小さい関数向き|
Can't connect to MySQL server on 'localhost:3306' (10061)

管理者ユーザでMySQLサーバーに接続しようとしたら、「Can't connect to MySQL server on 'localhost:3306' (10061)」エラーが出たので、どのように解決をしたかの備忘録


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864216/2f72e3a0-ff21-d7fa-5f30-9e32ab00fda6.png)

## 原因：MySQLサーバーが停止していただけだった。
ということで、ローカルのMySQLサーバーを再起動した。

手順

スタートメニューから「サービス」を開く
↓
サービス一覧から「MySQL」を見つけ、右クリックして「開始」を選択

接続できた！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864216/55ab19da-43ac-f44f-69bc-ef6b53150d57.png)
Android studio: Network Inspectionの基本

# はじめに
Network Inspectorは、Android Studioに組み込まれたツールで、アプリのネットワークトラフィックをリアルタイムで検査できる機能です。以下にNetwork Inspectorの主な特徴と使用方法を説明します。

## 主な特徴

- リアルタイムでネットワークアクティビティを表示
- リクエストとレスポンスの詳細な情報を提供
- HTTPSURLConnectionとOkHttpライブラリをサポート
- JSONデータの表示や解析が可能

## 使用方法

1. Android Studioで[View] > [Tool Windows] > [App Inspection]を選択
2. App Inspectionウィンドウで[Network Inspector]タブを選択
3. アプリをデバイスで実行し、ネットワーク通信を行う

![スクリーンショット 2025-02-09 13.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/918c302e-101f-2b42-e964-89a891f7bc0f.png)


## 表示される情報

- タイムライン：ネットワークアクティビティの概要
- Connection View：送受信されたファイルのリスト
- Thread View：各CPUスレッドのネットワークアクティビティ
- リクエストとレスポンスの詳細：ヘッダー、ボディ、コールスタック

Network Inspectorを使用することで、Log.dなどを使用せずに簡単にAPI通信の内容を確認できます。
これにより、デバッグ作業が効率化され、アプリのネットワーク関連の問題をより迅速に特定し解決することができます。

# 注意と補足
注意点としては、以下の点だ。
「HTTPSURLConnectionとOkHttpライブラリのみサポート」

便利な機能だが、上記以外のAPIやライブラリを使用してAPI通信している場合はNetwork Inspectionは使用できない。

また、ルールを使用するとさまざまなステータス コード、ヘッダー、本文を含むレスポンスを検出したときのアプリの動作をテストすることが可能となる。
この辺りは以下公式HP参照。

参考文献：Android Developers公式

https://developer.android.com/studio/debug/network-profiler?hl=ja


以上
Scribusでトンボ（日本用トリムマーク）を作る方法

# 概要

ScribusというDTPソフトウェアでトンボを作るための方法を記載します。

標準では外国で使われる一般的なものしかなく、日本独自であるトンボは設定できません。
そのためマスターページにトンボを描くことで対応しました。

:::note info
プリントパックというサービスで印刷できるところまで確認済みです
:::

# 環境

- Scribus1.6.3
- Windows11

:::note info
Scribusの操作やトンボの細かい内容を知っている前提で記載します。
:::


# トンボについて

トンボとは日本独自のトリムマークで、印刷したあとの裁断用に使われるマークのことです。

![トンボ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/3b22968c-eb8c-5be8-6605-51e314e61944.png)

これに対応していないDTPが多く、というのも日本でしか使わないからです。
※西洋式では線が一本だけです。

残念ながら印刷所は西洋式のトリムマークではなくトンボを印刷の要件にしている場合が多いので、Scribusでつけられないか考えました。

# トンボをつける方法

方法は単純で図形としてトンボを作り、全ページに反映するだけです。
気をつけるポイントはトンボの分だけ用紙サイズを大きくするところです。

## 用紙サイズ

トンボの分だけ余白を作ります。

たとえばトンボ自体の大きさが3mmだとすると、上下左右それぞれ6mmづつ余白を設けます。

ページサイズは「ページ」ー「ページプロパティを管理」から行います。

![ページプロパティを管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/cff9a409-3d0f-110b-9ea4-e6047cedd1dc.png)

ここは印刷したい用紙サイズに合わせてください。

![ページプロパティを管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/7d76e655-f093-5bda-3258-1fa195ed5d23.png)



## マスターページの設定

「編集」ー「マスターページ」でマスターページを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/9ce1478a-ee00-df2b-1b15-2240c9d6e21e.png)

ツールバー上にある線のボタンを押してトンボ用に線を描きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/7c82f09c-00fe-82b5-2d87-9beccd84f06b.png)

以下のような画像を4隅に描きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/e3a12579-56da-ddb3-6faa-dacc5c6496ad.png)


以上で、すべてのページにトンボが描かれるためPDFへエクスポートして印刷所に持ち込めばOKです。
Supabase のメール認証の URL が localhost:3000 

少し詰まったので備忘として、

Supabase の Authentication を使って、メール認証を実装した場合、サインアップ後に次のような内容のメールが届きます。
![スクリーンショット 2025-02-09 13.38.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/3b76e04e-4c1d-56fc-de22-b188384066db.jpeg)

`Confirm your mail` のリンクのリダイレクト先が `localhost:3000` になっているのですが、それを別のURLに変更する方法です。

1. Supabase の管理コンソールに入ります
1. Authentication のページに移動します
    ![スクリーンショット 2025-02-09 13.41.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/314a0228-5e7a-9c4b-5b03-9e5009375d97.jpeg)
1. URL Configuration に移動して、Site URL を修正します
    ![スクリーンショット 2025-02-09 13.42.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/0bb1c9cc-7577-0702-d987-36bf9232eaa0.jpeg)

以上。
サイトアイコンfavicon.icoの作成と設定

まずは、favicon.icoファイルの作成。
簡単な画像を作成。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/a43a283f-fa79-50cb-3688-817066dce578.png" width="30%">
この画像をfavicon generatorサイトへアップロード＆ダウンロードで、各種サイトアイコンが生成されるので、favicon.icoをサイト直下へアップロードしたら下記のようにheader部分に記述すればブラウザのサイトアイコンとして表示される。
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" 
    rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    下記部分
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <title>Document</title>
</head>
<body>
    <div class="container">
    Line AnimalNote We site!!
    </div>

</body>
</html>
```
ちょっと見にくけれどサイト名の左にアイコンが表示される。
![スクリーンショット 2025-02-09 13.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b2d9df50-bfa9-c4d6-0f23-38267656f479.png)

favicon generatorサイトは下記にて。
https://ao-system.net/favicongenerator/
【ChatGPT＋DALL-E3→Sora】描いた画像とPromptから、Sora用のPromptを作成するPromptです。

    
　どうも、カーブミラーです。

　今回は、ChatGPTで描いた画像とPromptから、Sora用のPromptを作成するPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　ではさっそく、【本題】です。

　今回は、
　　ChatGPTで描いた画像とPromptから
　　　Sora用のPromptを作成する
　　　　Promptです。

　PromptPromptと書いているので
　　ごっちゃになりますね😅

　DALL-E3の画像を
　　Soraに入れて生成すると
　　　それはそれで味があるのですが、
　　　　ガチャ要素が大きいです。

　それで
　　ChatGPTさんに
　　　“Sora用のPromptを作って”と
　　　　作らせると、三段落ほどの
　　　　　Promptを作ってきます。

　　これをSoraに与えて
　　　きれいに出てくれば
　　　　いいのですが、
　　　　　そううまくは行きませんよね｡

　そこで
　　画像とそのPromptから
　　　Sora用のPromptを作成する
　　　　Promptを作成しました。

　ふたつの例を
　　X-Twitterに上げました。
　　　[カーブミラーポスト](https://x.com/kabumira862571/status/1888430945361076226?t=UTqyoBNUkw1EElK9TxzF1Q&s=19)

　　　[カーブミラーポスト](https://x.com/kabumira862571/status/1888441815818477713?t=utskhIvxpRabGWAN6i7GIA&s=19)

　　まぁ、少しおかしいところも
　　　ありますが、いい感じです。
***
　ということで
　　手順をどうぞ。

　❶ChatGPTで画像生成
　❷画像をダウンロード
　　Promptもコピー
　❸新しくセッションを開く
　❹下記Promptを入力
　　（まだ送信しない）
```Text:画像とPrompt→Sora用Prompt作成Prompt
Convert the following DALL-E 3 prompt into a concise Sora-compatible prompt. The new prompt should retain the core visual elements and atmosphere but be optimized for animation. Assume the user has uploaded an image for reference. Keep the description compact while focusing on the overall aesthetic, subtle movement, and mood. Avoid excessive detail and ensure the length is suitable for Sora’s processing capabilities.


```
　❺❷の画像をアップロード
　❻❷の画像Promptを
　　❹のPromptの下にペースト
　❼送信

　これで
　　Sora用のPromptが作成されます。

　Soraに
　　画像とともに
　　　Promptを入力して
　　　　送信すれば、
　　　　　動画生成がはじまります。

　なお、
　　あくまでも
　　　生成された画像のPromptを
　　　　参考にしていますので、
　　　　　そこにアクションがなければ
　　　　　　Soraが勝手な判断を
　　　　　　　する可能性があります。

　まだ、
　　３作品だけのテストですし、
　　　ガチャ要素があります。
　　　　そのへんを考慮に入れて
　　　　　お使いください😅

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
CSVインポートによりチェックボックスフィールドが更新されてしまうケース

NetSuiteを運用する際に、CSVインポート機能によりデータを一括更新するケースがあると思います。本記事ではCSVインポートを実行後、チェックボックスのフィールドが更新されてしまうケースを説明していきます。

前提として既存の顧客レコードが存在しています。
システム・ノートには、単純に顧客作成時のログが記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006258/3f97b79e-de71-c274-5fb1-0ed72a84bdb5.png)

その後、何らかよう改修要件が発生し、その要件のためにチェックボックス形のカスタムフィールドを追加します。例えば、顧客に以下「チェックボックスフィールド」というカスタム・エンティティ・フィールドを追加します。
　・種類：チェックボックス
　・チェック済をデフォルトに設定：いいえ
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006258/ddc52a03-5534-3ebc-1f88-47ebda65b5d2.png)

CSVインポート機能で、上記の顧客を更新します。
更新する対象フィールドは「コメント」のみにします。
つまり、上記「チェックボックスフィールド」は更新対象外フィールドです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006258/fcc00f61-1553-3bee-3254-f3df82965bea.png)

CSVインポート処理が完了したら、「チェックボックスフィールド」が「NULL」から「F（いいえ）」に更新され、更新ログも記録されます。
　・変更前：NULL
　・変更後：F（いいえ）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006258/6b230150-d14f-395e-3514-88e9015d6de1.png)
 
影響としては、以下２つのパターンがあります。
【サンプルデータ】
　顧客A：チェックボックスフィールド＝NULL
　顧客B：チェックボックスフィールド＝F（いいえ）

【パターン①】
保存検索やN/seachモジュールにて「チェックボックスフィールド＝いいえ」の条件で顧客を検索する場合、顧客Aと顧客Bともに、検索結果として表示される。

【パターン②】
N/queryモジュールにて、SQLで顧客を検索する場合
　・where [チェックボックスフィールド] = 'F'　の条件で検索する場合、顧客Bのみ検索結果に表示。
　・where [チェックボックスフィールド] IS NULL　の条件で検索する場合、顧客Aのみ検索結果に表示。

それらにならないような有効な対策としては、以下があげられます。
①チェックボックス形のフィールドを追加した後、何らかの方法（例えば、CSVインポート）でそのフィールドを一括にF（いいえ）へ更新します。
②データを取得する際に、上記影響①と②（他に影響があるかもしれません）を意識する必要があります。

以上のことを注意しつつ対策してカスタムフィールドを追加した後のCSVインポートを実行していきましょう。

----------------------------------------------------
URL：https://www.maruweb.co.jp/
Magento詳細ページ：https://www.maruweb.co.jp/ja/solution/magento/
Oracle NetSuite詳細ページ：https://www.maruweb.co.jp/ja/solution/oracle-netsuite/
中国Webマーケティングソリューション詳細ページ：https://www.maruweb.co.jp/ja/solution/china-webmarketing/
AWS認定ソリューションアーキテクトアソシエイト(AWS SAA)合格体験記

AWS　SAAに合格したため、勉強内容と利用させていただいた教材を紹介します。

勉強期間
1か月半

結果
1回目(12月受験)
707/720
2回目(2月受験)
750/720

教材
AWS認定ソリューションアーキテクト
Udemy
ping-T
CloudLicense

勉強内容
Udemyで半年ほどAWS　SAAの講座のハンズオンをしてました。
AWSの様々なサービスでマネージメントコンソール上で、何があってどう動かせばいいのかを
実際に手を動かして体感するというものでした。
ハンズオンが終わり、対策試験問題に取り組み始めてから1か月半で取得。
ただ、ハンズオンで学んだことが試験に生かされたかはあまり感じていないため、
試験の対策をしてからハンズオンをして学ぶというやり方でもいいと思います。

それ以外にもAWS認定ソリューションアーキテクトの本を読んで、試験対策問題に取り組んだり、Ping-TやCloudLicenseの問題を繰り返し、解きました。
CloudLicenseは無料版のため少量の問題しか解けず、Ping-Tは試験対策問題が２５０問あり、１０問ずつ回答を確認しながら少しずつ行っていました。

実をいうと今回２回目の受験で、１回目は12月に受けており、707点で13点足りず不合格になりました。
12月中に受けたい！(年を越すと1月の後半の予約だったため)と思い、2週間でUdemyとAWS試験の本の試験問題を解いたのですが、短期であったため理解力が足りませんでした。
2回目の受験に備えた資格勉強では、それ以外にもPing-TやCloudLicenseの対策試験を受けたのですが、より幅広い分野の知識が身につき、自信をもって問題を解くことができました。
1週間や2週間といった短期間で集中して勉強するよりも、1か月前からより多くの対策試験問題を解いて幅広い知識を身に着ける必要があるようです。
CCNA合格体験記【3か月】


はじめに
-
昨年の11月にCCNAを取得したので、3か月の学習で感じた点や気を付けるべき点を書き残します。
これからネットワークエンジニアを目指す方の参考になれば幸いです。
※合格体験記としてはありきたりな内容です。

結論
-
Ping -tを死ぬ気で回しました。

筆者スペック
-
22卒、エンジニア三年目(インフラ系)
ネットワーク未経験
基本情報技術者

学習法
-
とにかくPing -tの『最強WEB問題集』を死ぬ気で回しました。
通勤時間、就寝前やトイレまで。
一問でも多く、一分でも多く問題と向き合うことを意識しました。

これは単なる私の感想ですが、
択一問題の試験の学習において重視すべきは、
効率よりも数でありスピードだと思っています。

模擬試験で80%を獲得した時点で、1週間後に試験を予約。
期限を決めて追い込みました。
おかげで集中できたと思います

コマ問はやらなくて大丈夫です。
後述しますが、シミュレーション試験は捨てます。

本番
-
休日の午前中に受験しました。
会場は英検等を受験に来ている中高生で溢れかえっており、
待合室が賑やかで、緊張が解れました。

試験中は問題文を口パクで読み上げながら、
スピード<<<<<<正確性
を意識しました。
Ping -tを回したおかげで、スピードには磨きがかかっていましたので、
問題文を正しく理解し、正しい選択肢を選ぶことに集中しました。
また、Cisco語はあまり気になりませんでした。

シミュレーション試験は部分点を意識しました。
インターフェイスにIPアドレスを設定する等、やれることはあるはずです。
（配点は公開されていませんが何も手を付けないよりはマシでしょう。）
一応、?コマンドやTab補完も使えるので時間に余裕があったら問題を解いてもいいと思います。
自分の場合は三問全て試験中盤に出題されたため、
部分点を狙って迷ったらすぐ捨てました。

次に受験予定の試験
-
CCNP Ent

あとがき
-
資格の取得について、とかく言われるのが、
「知識つかなきゃ資格取っても意味ない」
これは資格を取らない(取りたくない)言い訳だと思っています。

特に若手や未経験者にとって、資格取得は社内評価や転職において大きなメリットであり、
キャリアアップ、キャリアチェンジのチャンスでもあります。

未経験でもCCNAを持っていればネットワークの保守業務にすぐ参画できます。
業務独占資格でもないのにこれほど手に職が付く資格も珍しいと思います。

その他、質問などコメントいただけたらと思います。
【Unity】FPSカメラをCinemachineを使って作成する

# 環境
Unity6
#

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/8daae0a2-ee83-5d58-5db1-af152a8b50d8.png)


:::note 
Position Control：Follow
Rotation Control：Pan Tilt
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/d1ea0b5d-e9b4-4f1d-4dd6-d3e07854e42c.png)

おわり
簡単だね
Pythonで視覚的に理解するボイヤームーア法(Boyer-Moore Algorithm)の実装

# はじめに
こんにちは！今回は文字列検索アルゴリズであるボイヤームーア法(Boyer-Moore Algorithm)をPythonで実装したプログラムを紹介します。ボイヤームーア法は文字列検索の分野で非常に効率的なアルゴリズムであり、特に検索対象が長い場合に力を発揮します。この投稿では。アルゴリズムの動作をステップごとに視覚化し、内部処理を丁寧に説明します。
# ボイヤームーア法とは？
ボイヤームーア法は文字列検索アルゴリズムのひとつであり、テキスト内で特定のパターンを高速に検索するために設計されています。後ろから前に向かって文字を比較するのが特徴で、不一致が見つかった場合に文字の出現位置に基づいて効率的に検索範囲をスキップします。
1. 不一致の際のシフト量を計算するための「不一致処理」
2. パターンの中の文字の最も右の位置を利用する「文字位置テーブル」
# 実装コード
以下のボイヤームーア法の実装です。adjust_position関数で検索位置を調整し、不一致が発生したときの処理を視覚化しています。
```py:BoyerMooreAlgorithm.py
def character_positions(T, pattern):
    # テキストTにおける対象となる各文字に対する位置を格納する辞書を初期化
    L = {char: -1 for char in set(list(T))}

    # パターンの文字ごとの位置を計算
    for j, char in enumerate(pattern):
        L[char] = j  # 複数回現れる場合は最も右の位置が記録される

    return L


def boyer_moore(text, pattern):
    m = len(pattern)
    n = len(text)
    L = character_positions(text, pattern)
    result = []  # 照合結果を保存するリスト

    print(f"\n{'='*50}")
    print(f"テキスト: {text}")
    print(f"パターン: {pattern}")
    print(f"{'='*50}\n")



    k = 0  # テキストの照合開始位置
    trial_count = 0

    while k <= n - m:
        j = m - 1  # パターンの末尾から照合開始
        print(f"\n照合位置 k = {k}")
        print(f"テキスト位置: {text[k:k+m]}")
        print(f"パターン    : {pattern}")

        while j >= 0:
            if text[k + j] != pattern[j]:
                alpha = text[k + j]
                old_k = k
                k = adjust_position(k, j, alpha, L)
                shift = k - old_k

                print(f"不一致: パターン位置 j = {j}, 文字 = {alpha}")
                print(f"右に {shift} 文字ずらします")

                result.append((trial_count, old_k, j, alpha))
                break
            j -= 1
        else:
            print("\nパターンが一致しました！")
            result.append((trial_count, k, j, None))
            break

        trial_count += 1

    return result

def adjust_position(k, j, alpha, L):
    if L[alpha] < j:
        return k + j - L[alpha]
    else:
        return k + 1
```
# 使用例
```py:BoyerMooreAlgorithm.py
#実行例(変更点)
text = "なまなまずなまなまこなまなめこ"
pattern = "こなま"
results = boyer_moore(text, pattern)
```
# 実行結果
```
==================================================
テキスト: なまなまずなまなまこなまなめこ
パターン: こなま
==================================================


照合位置 k = 0
テキスト位置: なまな
パターン    : こなま
不一致: パターン位置 j = 2, 文字 = な
右に 1 文字ずらします

照合位置 k = 1
テキスト位置: まなま
パターン    : こなま
不一致: パターン位置 j = 0, 文字 = ま
右に 1 文字ずらします

照合位置 k = 2
テキスト位置: なまず
パターン    : こなま
不一致: パターン位置 j = 2, 文字 = ず
右に 3 文字ずらします
...
テキスト位置: こなま
パターン    : こなま

パターンが一致しました！
```
# コードの説明
### character_positions(T,pattern)
- テキストT内に含まれる文字に対して、その文字がパターン内で最も右に現れる位置を辞書Lに記録する
- これにより、不一致が発生した際にスキップ量を計算可能になる
### boyer_moore(text,pattern)
- ボイヤームーア法を実行するメイン関数
- パターンに末から比較し、不一致が発生した場合にadjust_position関数を使って検索位置を調整
# まとめ
ボイヤームーア法は効率的な文字列検索アルゴリズムです。不一致が発生したときに文字の出現位置を利用して検索範囲をスキップするため、最悪でもO(mn)、平均O(n/m)の計算量となります。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
HardenedLinux の歩みと未来への挑戦


本記事では、HardenedLinux の始まりから現在に至るまでの歴史と、私たちの目標についてご紹介します。この記事を通じて、私たちがどのようにしてデジタルな自由とプライバシーを守るためのセキュリティ技術に取り組んでいるか、その軌跡を感じ取っていただければ幸いです。

---

## はじめに

HardenedLinux の種は ** 2010 ** 年に蒔かれ、** 2014 ** 年には探求の成果が形となり始めました。** 2014 ** 年、Shawn C （別名 ** citypw ** ）が主導して HardenedLinux コミュニティプロジェクトが立ち上げられ、正式な活動が始まりました。持続的な開発と保守の重要性を認識した Shawn は、必要な資金提供を行い、プロジェクトが専任のフルタイムメンテナーを雇用できるよう支援しました。これにより、** 2015 ** 年から ** 2020 ** 年にかけて、安定した進歩と品質の維持が実現されました。

---

## HardenedLinux とは？

現在の HardenedLinux は、フリーソフトウェア、ファームウェア、ハードウェアに情熱を注ぐハッカーやサイバーセキュリティ研究者たちの集合体です。個人の視点から見ると、現代の技術社会においてプライバシーと便利さが天秤にかけられ、悲劇と喜劇が入り混じる状況とも言えます。私たちはその中で、自分たちのプライバシーと自由を犠牲にしながらも、技術の恩恵を享受している現実に直面しています。

しかし、フリー／リブレ／オープンソースのソフトウェア、ファームウェア、ハードウェアは、デジタル領域におけるプライバシーと自由を取り戻すための代替手段を提供してくれます。この代替手段は、クラッカーによるネットワーク攻撃、大手テック企業間の利権争い、国同士のサイバー戦争といった collateral damage から個人を守る盾となるのです。もし個人が学習曲線を乗り越えるための時間と、必要なデバイスに投資する金銭を惜しまなければ、自己防衛のための個人用「サイバーバンカー」を構築することも可能です。

---

## 私たちの目標

HardenedLinux の目標は、デジタルな自由とプライバシーを守りたい人々のために、フリー／リブレ／オープンソースプロジェクトに基づいた最高のセキュリティプラクティスを確立することです。  
私たちのコミュニティの精神は、「フリー／オープンソースのソフトウェア／ファームウェア／ハードウェアコミュニティがあなたに何をしてくれるかではなく、あなたがコミュニティのために何ができるか」を問うという言葉に象徴されています。  
これは、使徒言行録 20:35 の「受け取るよりも与えることのほうが幸いである」という言葉にも通じるものです。

各メンバーはそれぞれ独自の専門知識を持ち、豊富で多様な知識基盤に貢献しています。この広範な才能は、新しいツールキットの開発や、既存の優れたツール（例：Nexus7 2013 用の PaX／Grsecurity）の移植を通じて、包括的なディフェンス・イン・デプス（多層防御）ソリューションの構築に大いに役立っています。  
私たちはホリスティック・セキュリティの原則に従い、サーバー、モバイル、IoT ゲートウェイなど、あらゆるシナリオにおける GNU/Linux ベースのシステムに統合することを目指しています。

皆さんは日中の仕事で生計を立てながらも、夜間や深夜、そして明け方にこの世界を少しでも安全にするために奮闘しています。私たちは、一つ一つの安全なシステムを構築することで、状況を少しずつでも改善していく決意を固めています。

---

## まとめ

HardenedLinux は、技術的挑戦とコミュニティの熱意によって育まれたプロジェクトです。私たちの取り組みは、個人がデジタルな自由とプライバシーを守るための選択肢を広げ、現代社会の課題に対抗する力となることを目指しています。  
これからも皆さんと共に、より安全で自由なデジタル世界の実現に向けて歩んでいきます。

どうぞよろしくお願いします！

https://hardenedlinux.org

Happy hacking!
Pythonで視覚的に理解するクイックソートの実装

# はじめに
こんにちは！今回はクイックソート(Quick Sort)をPythonで実装し、その過程を再帰の深さを視覚化することで、処理の流れがわかりやすくなる工夫を加えました。
# クイックソートとは？
クイックソートは以下の手順で動作します。
配列の要素を基準値(pivot)に基づいて2つの部分配列に分割し、それぞれの部分配列を再帰的ソートしていきます。
1. 基準値を選択(通常は配列の最初の要素や最大の要素を基準にします)
2. 基準値より小さい値を左側、大きな値を右側に並べる
3. 左右の部分配列を再帰的にソート
# 実装コード
以下は Python でのクイックソートの実装コードです。
再帰の深さに応じてインデントを付けることで、処理の流れをわかりやすくしています。
```py:QuickSort.py
def quicksort(arr, left, right, depth=0):
    """ クイックソートを再帰的に実行し、処理の流れを視覚化する """
    indent = "  " * depth  # 再帰の深さをインデントで表現

    if left < right:
        print(f"\n{indent}【クイックソート開始】 部分配列: {arr[left:right+1]}")

        # 手順1: 基準値の選択
        k = arr[left]
        print(f"{indent}手順1: 基準値として {k} を選択")
        print(f"{indent}現在の配列: {arr}")

        # 手順2: 基準値を右端と交換
        arr[left], arr[right] = arr[right], arr[left]
        print(f"{indent}手順2: 基準値を右端と交換")
        print(f"{indent}交換後の配列: {arr}")

        i, j = 0, right - 1

        while True:
            # 手順3: 左から探索
            while i < right and arr[i] <= k:
                i += 1
            if i < right:
                print(f"{indent}手順3: 基準値以上のデータ {arr[i]} を位置 {i} で発見")

            # 手順4: 右から探索
            while j >= left and arr[j] >= k:
                j -= 1
            if j >= left:
                print(f"{indent}手順4: 基準値未満のデータ {arr[j]} を位置 {j} で発見")

            # 手順5: データの交換
            if i < j:
                print(f"{indent}手順5: データ交換 {arr[i]} ⇔ {arr[j]}")
                arr[i], arr[j] = arr[j], arr[i]
                print(f"{indent}交換後の配列: {arr}")
            else:
                print(f"{indent}手順6: 分割完了 (i={i} > j={j})")
                break

        # 手順7: 基準値を最終位置に配置
        print(f"{indent}手順7: D[i]={arr[i]} と D[right]={arr[right]} のデータを交換")
        arr[i], arr[right] = arr[right], arr[i]
        print(f"{indent}配置後の配列: {arr}")

        # 再帰的に左右の部分配列をソート
        print(f"{indent}左側の部分配列をソート: {arr[left:i]}")
        quicksort(arr, left, i - 1, depth + 1)

        print(f"{indent}右側の部分配列をソート: {arr[i+1:right+1]}")
        quicksort(arr, i + 1, right, depth + 1)
```
# 実行例
テストデータとして以下の配列をソートします。
```py:QuickSort.py
D = [74, 47, 91, 94, 15, 13, 72, 31]
print("【初期配列】:", D)
quicksort(D, 1, len(D) - 1)  # 最初の基準値を D[1] = 47 とする
print("\n【ソート完了】最終結果(解答):", D)
```
# 実行結果
```
【初期配列】: [74, 47, 91, 94, 15, 13, 72, 31]

  【クイックソート開始】 部分配列: [47, 91, 94, 15, 13, 72, 31]
  手順1: 基準値として 47 を選択
  現在の配列: [74, 47, 91, 94, 15, 13, 72, 31]
  手順2: 基準値を右端と交換
  交換後の配列: [74, 31, 91, 94, 15, 13, 72, 47]
  ...
  ・
  ・
  ・
【ソート完了】最終結果(解答): [13, 15, 31, 47, 72, 74, 91, 94]

```
# コードの説明
### quicksort(arr, left, right, depth=0)
再帰的にクイックソートを行う関数です。再帰の深さを引数depthで管理し、深さに応じたインデントを付けて処理の流れを追跡できるようにしています。
- 手順1~7で分割・基準値配置を行い、左右に部分配列をそれぞれ再帰的にソートします
- 再帰の途中経過をコンソールに出力することで、どの部分配列が現在ソートされているか視覚的にわかります
# まとめ
クイックソートは、最悪計算量がO(n^2)である一方で、平均計算量はO(nlogn) という非常に効率的なソートアルゴリズムです。
再帰的な処理の流れがわかりやすくなるように工夫しているので、ぜひ試してみてください。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
Rail8+Devise+Rspecで出るRuntimeErrorを解消する



## Overview
Rails8でRspecとDeviseを使ってテストするとエラーが出るようになった。
それをモンキーパッチ的に解消したので共有しますー。

### エラー
```bash
RuntimeError:
  Could not find a valid mapping for #<User id...
```

### 解決策

```bash
touch config/initializers/devise_rails8_patch.rb
```

`devise_rails8_patch.rb`
```ruby
require 'devise'
Devise # make sure it's already loaded

module Devise
  def self.mappings
    # Starting from Rails 8.0, routes are lazy-loaded by default in test and development environments.
    # However, Devise's mappings are built during the routes loading phase.
    # To ensure it works correctly, we need to load the routes first before accessing @@mappings.
    Rails.application.try(:reload_routes_unless_loaded)
    @@mappings
  end
end
```

```bash
$ bundle exec rspec
```

Deviseの公式リポジトリでも話題に上がってる内容みたいで、早速PRが作成されていてすでにマージされている内容みたいですね。
Devise5がリリースされたら解消されるみたいですが、最新は4.9.4なので、PRの内容を拝借して一時的にエラーを解消してみました。

> Converting this PR to this patch in a config/initializers/devise_rails8_patch.rb file seems to let me get going with Rails 8 and devise 4.9.4.\
> https://github.com/heartcombo/devise/pull/5728#issuecomment-2539418211
PMBOK原理・原則：リーダーシップの発揮


エンジニアの現場で、よく聞く言葉があります。
「技術力も大事だけど、リーダーシップも必要だよね」

でも実際のところ、リーダーシップって何なんでしょう？

リーダーシップの本質は、意外とシンプルでした：
✓ 目標に向かって、みんなの力を引き出すこと
✓ 信頼関係を育てながら、前に進むこと
✓ 状況を見て、適切な判断を下すこと
✓ 問題を放置せず、チームで解決すること✨

![マインドマップ (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b0beadd8-cc4a-a1e2-c146-001b007cbefb.png)

## はじめに：リーダーシップは学べる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a8d2cdb8-f5e5-d720-9157-a24029ae90d8.png)

「リーダー向いてないから...」
「もっと経験積まないと...」

そんな風に思っている方、多いのではないでしょうか。
でも、リーダーシップは特別な才能ではなく、学び育てていけるスキルなんです。

PMBOKにも書かれている通り、リーダーシップは**「チームの成功のために必要な要素」**。
つまり、一朝一夕には身につかないけれど、意識して実践することで必ず成長できるものなんです。

---

## リーダーシップの本質：チームの力を引き出すこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/dbea4229-ca1f-b9af-21f7-7b30b58b0184.png)

リーダーシップの本質は、実はとてもシンプル。
**「チームの一人一人が力を発揮できる環境を作ること」**です。

特に大切なのが：
- メンバーの声に耳を傾けること
- それぞれの強みを活かすこと
- 目標に向かって導くこと

一人で抱え込むのではなく、チーム全体で成長していく。
それこそが、現代のリーダーシップの形なのです。

---

## なぜリーダーシップが重要？：4つの理由

![leadership-importance-svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ea39b49f-965d-b26d-4d93-3f7fd9384880.png)

1. **チームの潜在能力を引き出せる**  
   - 一人一人が主体的に考え、行動する
   - お互いの強みを活かし合える

2. **問題解決力が高まる**  
   - 早期発見・早期対応ができる
   - チームの知恵を集めて解決できる

3. **イノベーションが生まれやすい**  
   - 新しいアイデアが歓迎される
   - 失敗を恐れない文化が育つ

4. **持続的な成長が可能に**  
   - 個人もチームも共に成長
   - 長期的な視点で改善が進む

---

## 実践のためのヒント：4つの視点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/606a31c6-6154-c4ae-e44b-c5ef5f87b978.png)

### 1. 状況に応じたアプローチ
チームや状況に合わせて、柔軟に対応を変える。

- **指導が必要な時**：丁寧に説明、一緒に考える
- **支援が必要な時**：横で見守り、必要に応じてアドバイス
- **任せられる時**：権限委譲して、成長を促す

### 2. 信頼関係の醸成
日々の小さな積み重ねが、大きな信頼を生む。

- **オープンなコミュニケーション**：定期的な1on1、気軽な相談
- **約束を守る**：言ったことは必ず実行
- **失敗から学ぶ文化**：blame gameではなく、改善点を探る

### 3. 適切な意思決定
決断の質と速さのバランスを取る。

- **データと経験のバランス**：客観的な判断
- **チームの意見を活かす**：多様な視点を取り入れる
- **決めたら前に進む**：必要に応じて軌道修正

### 4. 問題解決力の向上
課題を放置せず、着実に解決していく。

- **早期発見・早期対応**：小さな課題も見逃さない
- **チームで解決**：一人で抱え込まない
- **振り返りと改善**：次に活かせる学びを得る

---

## 例①：チーム全体で取り組んだ技術選定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/13472a16-5d34-60d6-3c1a-62186e0c8616.png)

**状況**
- 新規プロジェクトの技術スタック選定
- チーム内で意見が分かれた

**取り組み**
1. オープンな議論の場を設定
2. それぞれの意見の背景を深堀り
3. 客観的な評価軸で比較検討
4. チームとしての最適解を導出

**得られた学び**
- 多様な視点が、より良い判断につながる
- プロセスの透明性が信頼関係を強化する

---

## 例②：大規模システム移行での経験

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e0b4463a-5cb4-da93-c14f-3dc0c23f79b0.png)

**状況**
- 複数チームが関わる大規模移行
- 技術的な課題と時間的な制約

**取り組み**
1. 課題の可視化と共有
2. チーム横断での解決策検討
3. 実践的なリハーサルの実施
4. フィードバックを活かした改善

**得られた学び**
- チーム間の協力が成功の鍵
- 準備と実行の両面が重要

---

## まとめ：リーダーシップの本質

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a9324847-935b-c4f7-16dd-d7a19ae3033a.png)

リーダーシップとは、**「チームの力を最大限に引き出し、目標達成をサポートすること」**。

実践のポイント：
- **状況に応じた柔軟な対応**
- **信頼関係の継続的な構築**
- **バランスの取れた意思決定**
- **着実な問題解決**

---

## 最後に
リーダーシップは、決して特別な人だけのものではありません。
日々の小さな実践の積み重ねが、確実な成長につながります。

この記事が、みなさんのリーダーシップ実践の一助となれば幸いです。
ぜひ、あなたなりのリーダーシップの形を見つけてください！
clang, clang++のAddress SanitizerがWindows 11（24H2）で動かないという話

# Address Sanitizerとは

Address Sanitizer(ASan)とは，配列外参照やUse-After-Freeのようなメモリ周りの実行時エラーを検出してくれるC/C++向けのランタイム機構です．

本来のC/C++にはこういった機構はなく，配列境界を２，３個超え踏み抜いたところでそのまま実行が続いてしまい，メモリ上の隣接するアドレスの変数の値を読み書きしてしまうことがあります．

そこでコンパイル時に，アドレスのアクセス可否情報を表すデータ構造とそのデータ構造を使ってメモリアクセス時にアドレスをチェックするコードを埋め込み，実行時にメモリアクセスの可否をチェックできるようにしたものがAddress Sanitizerです．

これのおかげでC/C++プログラムの動的デバッグがかなり簡単になります．

詳しい原理は以下のページが詳しいです．

https://github.com/google/sanitizers/wiki/AddressSanitizer

https://blog.trailofbits.com/2024/05/16/understanding-addresssanitizer-better-memory-safety-for-your-code/

# 本題

便利なAddress Sanitizerですが，Windowsで利用するには以下の２通りがあります．

1. Visual StudioのC/C++ワークロード
    1. デフォルトでAddress Sanitizerが同梱されているようです
    1. 参考 [AddressSanitizer | Microsoft Learn](https://learn.microsoft.com/ja-jp/cpp/sanitizers/asan?view=msvc-170)
    1. プロプライエタリ（無料版あり）
    1. ストレージ消費量大き目
1. [LLVM MinGW](https://github.com/mstorsjo/llvm-mingw)
    1. LLVMをベースにしたMinGW-w64ツールチェーン
    1. Address Sanitizerも利用可能
    1. 無料
    1. ストレージ消費量小さ目（500～800MB程度）

IDEのVisual Studioが不要であったり，あるいは無料で使えるコンパクトな環境が欲しければLLVM MinGWを使うのがいいでしょう．

## Windows 11（24H2）での問題

LLVM MinGWをWindows 11（24H2）使い，C/C++プログラムをAddress Sanitizer付でコンパイルすると，プログラムの起動後，以下のような表示が出て異常終了します．

なお，確認したときのバージョンは[LLVM MinGW 19.1.6](https://github.com/mstorsjo/llvm-mingw/releases/tag/20241217)です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857903/3d0da9ed-84d6-77e8-f7db-7fc5911f6c88.png)

本来であれば
> hello, world

と表示されますが，ここでは
>==54756==interception_win: unhandled instruction at 0x7ffa31bf31d0: 44 0f b6 1a 4c 8b d2 48
>==54756==interception_win: unhandled instruction at 0x7ffa31bf31d0: 44 0f b6 1a 4c 8b d2 48

と表示されます．

これはプログラム＋プログラムにリンクされた動的ライブラリ内の命令の中にAddress Sanitizerが対応していない命令があるということです．

もう少し具体的に書くと，x86_64の命令セットのオペコードは固定長ではありません．
バイト列から命令のサイズを返す関数を用意して，Address Sanitizerがプログラムのバイト列を解析する際に使用しています．
この関数は [interception_win.cpp](https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/interception/interception_win.cpp)で実装されています [^1] ．


以下が当該関数の冒頭部分のキャプチャです．
勘のいいひとはこれで気づくかもしれませんが，片っ端からオペコードをハードコードしてマッチングしています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857903/8dc95ebd-4d54-9802-a280-f4f19d1c9c43.png)

本題に戻ると，Windows11 24H2では「`44 0f b6 1a 4c 8b d2 48`」というオペコードが対応していないようです．
このファイル内で調べてみましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1857903/cf93d2f1-1644-edec-ad1c-00cf1e367d74.png)

完全一致はしなかったものの，先頭4バイト部分にヒットする箇所がありました．
これは4バイトと認識できているようです．
これはmainブランチの最新コミットなので修正されているようですが[^2]，LLVM 19.x系列ではこの修正はとりこまれていません．

したがって，現行の最新バージョンが19.x系列であれば，前掲のエラーは発生します．

## 対処法
対処法は２通りあります．

1. LLVM 20.xがリリースされるのを待つ
    1. LLVMの[公式ページ](https://llvm.org/)によれば，LLVM 20.xがリリースされるのは3/11の予定
1. プレリリースバージョンを使う
    1. LLVM 20.1.0のプレリリースバージョンはすでに出ています．
    1. LLVM MinGWは公式のLLVMリポジトリに合わせてリリースされており，プレリリース版も出ている

後者のプレリリースバージョンですが，筆者環境で正常に動作し，Address Sanitizer付でコンパイルしたプログラムも無事に動作しました．

[^1]:interception_win.cppという名前からわかるように，Linux，Mac向けの同様のファイルもあります．
[^2]:こちらの[コミット](https://github.com/llvm/llvm-project/commit/ce4618a9c405bd8a9c1e096eb45e9ca83d3891f1)で修正されたようです