OmniAICreator/Qiita-1.07M huggingface dataset:
sourceコマンドは実際には何をしている？

sourceコマンド（または . コマンド）は、シェル環境でスクリプトファイルを現在のシェルセッションに読み込んで実行するコマンドです。sourceはBashやZshなどのシェルに組み込まれている内部コマンドです。

※シェルセッションとは、ユーザーがシェルを起動してから終了するまでの一連の対話的な操作期間のことです。各セッションは独自の環境変数、関数定義、エイリアスなどの状態を持ちます。

## 特徴

通常のシェルスクリプトの実行は、新しい子プロセスを作成して実行されます。一方、sourceコマンドの場合、現在のシェル環境で直接実行されるため、スクリプト内で設定された環境変数、関数定義、エイリアスなどの変更が現在のシェルセッションに保持されます。

この特徴から、sourceコマンドは以下のような用途によく使用されます：
- シェルの起動時の環境設定（~/.bashrcなど）
- プロジェクト固有の環境変数の読み込み
- 共通で使用する関数やエイリアスの定義

子プロセスとは、既存のプロセス（親プロセス）から新たに作成されるプロセスのことです。シェル環境では、通常のスクリプト実行やコマンド実行時に子プロセスが作成されます。

```bash
# 親プロセス（現在のシェル）で変数を設定
message="Hello"

# 新しいシェルを起動（子プロセス）
bash

# 子プロセスで変数を確認してみる
echo $message
# 何も表示されない（空）- 親プロセスの環境変数は継承されない

# 子プロセスを終了
exit

# 親プロセスに戻り、変数を確認
echo $message
# "Hello" と表示される - 元の環境変数が維持されている
```

このような親子プロセスの概念は、実際のアプリケーション開発でも重要です。アプリケーションを起動すると、それは親プロセス（シェル）から見た子プロセスとして動作します。ただし、exportコマンドで設定された環境変数は子プロセスに継承されます。

```bash
# シェル（親プロセス）で環境変数を設定
export API_KEY="secret123"  # exportで設定された変数は子プロセスに継承される

# Node.jsアプリケーション（app.js）の内容
# console.log(process.env.API_KEY);  // "secret123"が出力される

# アプリケーション起動（子プロセスとして実行される）
node app.js  # 環境変数API_KEYを継承して実行される
```

sourceコマンドの一般的な使用例：
```bash
# 設定ファイルの読み込み
source ~/.bashrc

# プロジェクトの環境変数設定
source .env

# 短縮形（.）を使用した場合
. ./setup-env.sh
```
論文読み : DreamLIP: Language-Image Pre-training with Long Captions

今までに読んだ論文の中から吐き出しているので連続の投稿となります．

### 今回の論文
ECCV2024より
https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/02666.pdf

### 概要
この論文では，画像とテキストの事前学習において長いキャプション（10文程度）を活用する新しい手法を提案するモデル（DreamLIP）を提案．既存のデータセットの短いキャプションでは捉えきれない画像の豊かな内容を、詳細なキャプションを生成することで効果的に学習している．

### 先行研究と比べてどこがすごいのか
<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/04a932f4-b2e7-b5aa-e9cb-7cd6fc05a857.png">

Vision-Language Pretrainingで使われるデータセットにはキャプションのような短いテキストのデータセットしかなかったが，事前学習されたMultimodal Large Language Model(MLLM)を使うことで長いテキストのデータセットを構築できるようになり，従来の短いキャプションに比べて画像の詳細な特徴を効果的に捉えることが可能に．CLIPが400Mのペアで訓練された場合と比較して、DreamLIPは30Mペアで同等かそれ以上のパフォーマンスを達成．また，セマンティックセグメンテーションや画像-テキスト検索タスクにおいて、きめ細やかな表現能力を発揮．

### 技術や手法の”キモ”はどこにある？
以下がDreamLIPの概要．
![スクリーンショット 2024-11-16 15.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/c62f70b7-a1e1-0275-127f-02b938a9e521.png)

まず，元のImage-Text PairについてMLLMを用いて、詳細なサブキャプションを生成し，サブキャプションに分割．次にサブキャプションの埋め込みと全体画像の埋め込みとで対照学習をする．さらに，画像をパッチ化し，各サブキャプションとの対照学習もする．このように画像全体とサブキャプション間の特徴を多対多の関係で学習することで、細部のセマンティクスも捉える．

### 評価
![スクリーンショット 2025-01-13 16.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/1f7fc30d-9d9d-64c8-630a-556788a37ae3.png)

様々なタスクにおいて評価していたがここでは画像認識のものだけ抜粋．
上の表は既存モデルとDreamLIPのzero-shot trasfer性能を表している．これを見るとほとんどの学習データセットで，下流データセットでの精度の平均をとったAverageにおいてSOTAを達成している．
JavaScriptのArrayのprototype拡張

## prototype拡張とは
JavaScriptのprototype拡張では、組み込みのオブジェクトにメソッドを新規追加できます。
ここでは、Arrayのprototype拡張を紹介します。
## 実例
### 定義
```js
// 「XXX.prototype.methodName = function(){操作}」の形式でprototype拡張する
Array.prototype.excludeNullish = function(){
    // this(メソッドを呼び出すArray型のオブジェクト）のfilterメソッドを呼び出す
    // Array内部の値から、nullではなく、かつundefined型でもない値のみ残す
    return this.filter(v => v !== null && (typeof v) !== "undefined")
}

```
### 実行
```js
[1,2,null,3,undefined].excludeNullish()
```

### 表示結果
```text
(3)[1, 2, 3]
```
GNSSとIMUを併用した移動ロボットの姿勢推定

# はじめに
ロボットの姿勢推定では,IMUがよく用いられますが,長時間使用するとジャイロのドリフト誤差が蓄積する問題があります.そこで,GNSS座標を用いて,t秒前からの移動量に基づき姿勢角度を推定する方法を紹介します.

# 動作環境
|項目  | バージョン |
|---|---|
|ubuntu  |22.04  |
|ROS  |ROS2 humble  |
|GNSSアンテナ|ANN-MB-00|
|ZED-F9P|AS-RTK2B-F9P-L1L2-NH-02|
|IMU|ADIS16475-2|

# GNSSを用いた姿勢推定
RTKを使用したGNSSは,fix解を得られている場合誤差数センチ単位と高精度で緯度経度を測定することが可能です.GNSSの測定には,ZED-F9Pの評価ボードとu-blox社のGNSSアンテナ(２周波)を使用しました.この測定で取得できた緯度経度の移動量に基づきロボットの姿勢角を推定します.

![スクリーンショット 2025-01-13 13.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480989/6bd9dbad-787b-9cd6-d4c3-55770b014549.png)
上図のように,$(t-1)$時点と$t$時点の２点の座標が測定できれば,以下の式でロボットの進行方向$\theta_t$が求められます.

```math
\begin{align}
  \theta _{t}=\tan ^{-1}\left( \dfrac{\Delta y}{\Delta x}\right)
  =\tan ^{-1}\left( \dfrac{y_t-y_{t-1}}{x_t-x_{t-1}}\right)
\end{align}
```

## GNSSとIMUを併用した姿勢推定
GNSSでロボットの姿勢角を推定できる条件は,以下に限られます.
・RTK測位でfix解を得ていること
・ロボットがある程度の速度で走行していること


しかし,実際の走行環境では,これらの条件が常に満たされるとは限りません.そのため,条件を満たさない場合には,IMUやホイールオドメトリなど,他の手法を用いて姿勢を推定する必要があります.本記事では,短時間の測定では精度良く姿勢角を推定できるIMUを採用し,ロボットの状況に応じてGNSSとIMUを切り替える手法を紹介します.切替条件は,下図のフローチャートの通りです.

![yaw_estimate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480989/c376fb0d-9f18-7386-466f-91b18049e486.png)

また,fix解およびロボットの速度に加え,前回とのGNSS座標の差分や,GNSSで推定した姿勢角の急激な変動を考慮することで,安定した推定を実現できました.

### 実装したソースコード

https://github.com/Arcanain/rtk_judge/blob/feature/test_run_1123/src/judge_rtk_status_origin.cpp

## 実験走行
<iframe width="560" height="315" src="https://www.youtube.com/embed/9lQucho96Dk?si=mcxkbEtvE0aDF1u_" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

つくばチャレンジの実験走行で撮影した,GNSSとIMUを組み合わせた姿勢推定による自律走行の動画です.
走行の約9割はGNSSでの姿勢角を採用していました.以前はホイールオドメトリのみで推定していたため200m程度で大きくズレが生じていましたが,今回の手法でその課題を解消し,安定した走行を実現できました.
今後は,カルマンフィルタを導入し,GNSSとIMUの誤差を推定しながら補正を行うことで,精度をさらに高めることができればと考えています.

## 参考文献
中村勇太, GNSSと2D 地図の位置推定切替機構を備えた クローラロボットナビゲーションシステム, つくばチャレンジ2023参加レポート集, 2023.

## 謝辞
この取り組みは, GxP(グロースエクスパートナーズ)株式会社様のサポートを受けて実施しています. 貴重なアドバイスや, ロボットに必要な機材の支援をいただきました. 
また,アナログ・デバイセズ株式会社様から,IMU-ADIS16475-2をご貸与いただきました.
心より感謝申し上げます.

https://www.gxp.co.jp/

https://qiita.com/organizations/gxp
車を3Dスキャンする方法

3Dスキャン技術の普及に伴い、その実用性は車の設計や部品製造、車体修復や改造デザインなどの分野で大きな役割を果たしています。この記事は3Dスキャンを始めてみたい方や興味をお持ちの方に、車を3Dスキャンする方法や実用的なテクニックをご紹介します。


#### 一、車に3Dスキャンが必要な理由

3Dスキャンの最大の利点は、物体の三次元の形状や表面の詳細を高精度で描写し、高度な正確性を備えたデジタルモデルを生成できることです。車の分野における3Dスキャンの主な実用例は以下の通りです。

1. **部品の反応工学**: 既存部品をスキャンし、デジタルモデルを作成。分析や最適化、再製造に活用します。
2. **車体損傷検出**: 事故車をスキャンし、変形部分を迅速に特定。修理プランを簡単に設計できます。
3. **カスタム改造デザイン**: 車体全体や一部をスキャンし、正確なデータを作成。改造デザインの基盤を提供します。
4. **バーチャル展示やマーケティング**: スキャンした高精度モデルを使用したバーチャル体験やプロモーションに活用できます。

https://www.revopoint3d.com/pages/all-in-one-3d-scanner-miracoplus

https://www.revopoint3d.jp/products/all-in-one-3d-scanner-miracoplus


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/c156db97-9c3e-0dff-1046-075924ef2d33.png)


---

#### 二、車を3Dスキャンする段階

**1. 適切なスキャンデバイスの選定**

スキャンの目的や使用するシーンに対して、適切な3Dスキャンデバイスを選びます。
- **レーザースキャナー**: 高精度が必要な場合に適しています。車体表面の詳細をしっかり描き出せます。
- **構造光スキャナー**: スキャン速度が高く、車体全体や大型の部品に適しています。
- **写真測量**: 多くの写真を撮得した上でソフトウェアで処理を行い、3Dモデルを作成する方法。コストが低く、作業時間が長くなる場合もあります。

**2. スキャン前の準備**

スキャンの実施前には以下の準備を完了します：
- **スキャン環境の最適化**: 光が均一に射される室内環境を選び、強光や反射の影響を避けます。
- **車体表面の処理**: 車体塗装面は滑らかで反射が強いため、消光スプレーや消光シールを使用してスキャンの精度を向上させます。
- **デバイスのキャリブレーション**: スキャナーは使用前に説明書に従ってキャリブレーションを行い、データ取得の正確性を確保します。

**3. スキャンパラメータの設定**

スキャナー性能に基づいてパラメータを調整します：
- **解像度**: 解像度が高いほどスキャン結果は詳細になりますが、処理時間やファイル容量も増加します。
- **露出度**: 車体の詳細を明瞭に捉えつつ、過剰露出にならないよう調整します。

**4. スキャンの実行**

スキャン時には一定の順序に従って作業を進めます：
- **スキャン順序**: 固定された始点から開始し、車体に沿ってデバイスを順次移動し、全ての領域をカバーします。
- **多角度スキャン**: データ欠損を防ぐため、車を複数の角度からスキャンします。特に複雑な部分（車輪、ミラー、内装など）は入念に行います。
- **リアルタイムチェック**: スキャンしながらプレビューを確認し、見逃した領域があれば随時補完します。

![対応していない形式のファイルです。]()

![対応していない形式のファイルです。]()


**5. データ処理**

スキャンが完了したら、データを統合・最適化します：
- **点群データのスティッチング**: 異なる角度から得たデータを整列させ、完全なモデルを生成します。
- **ノイズ処理**: ソフトウェアを使って余分なノイズを除去し、モデル品質を向上させます。
- **テクスチャマッピング**: カラーやテクスチャが必要な場合、モデルに実際の表面のマッピングを施し、より表現力のあるデータを作成します。

![対応していない形式のファイルです。]()


---

#### 三、注意事項と実用的なコツ

1. **表面の反射処理**  
車体表面の高輝度はスキャン精度に影響を与えます。消光スプレーや消光シールを使うことでこの問題を改善できますが、これらの素材は簡単に清掃でき、塗装を傷つけないものを選びましょう。

2. **環境の干渉を避ける**  
スキャン時には強光直射、風塵などの外的干渉を避け、光が均一な室内環境で作業する方が良い結果が得られます。

3. **ファイル管理**  
3Dスキャンで生成されるデータ量は大きいため、十分なストレージを確保し、重要なファイルは迅速にバックアップしましょう。

4. **デバイスの熟練度**  
スキャンデバイスの操作に慣れ、異なるシーンでのパラメータ設定に精通することで、スキャン効率と結果の品質を大幅に向上させることができます。

---

#### 四、実際の応用例

1. **事故車修復**  
損傷した車体をスキャンし、完全なモデルを生成後、変形部分を分析し、修理や交換プランを支援します。

2. **クラシックカーの復刻**  
古い車の部品をスキャンし、正確なデジタルモデルを作成することで、クラシックカーの細部を再現します。

3. **性能の最適化と改造**  
車外部や内部部品をスキャンし、空力特性の最適化やカスタマイズ改造のためのデータを提供します。

4. **デジタルアーカイブ**  
高級車や限定車をスキャンし、デジタルデータとして保存。博物館の展示や商業プロモーションに利用します。

---

#### 五、まとめ

3Dスキャン技術は車の分野に無限の可能性をもたらし、作業効率の向上から高度なカスタマイズの実現まで、業界の構造を変えつつあります。この分野で深く学びたいと思うなら、デバイスの選択、環境の最適化、データ処理などのスキルを習得することが不可欠です。この記事があなたの3Dスキャン作業に役立つ参考となれば幸いです。

コメントであなたの経験や質問を共有し、一緒に学びましょう！
Pythonを最初からはじめる人のための記事 ②【変数】

# はじめに
[前回の記事](https://qiita.com/Cheesecake2960/items/444b5e7c71f5c4bfb1f6)を公開して６日経ちました。
たくさんの方に見ていただきとても嬉しいです。
今回はその続きをやろうと思います！

# 事前準備
前回の「事前準備」を済ませていただければOKです！

https://qiita.com/Cheesecake2960/items/444b5e7c71f5c4bfb1f6#事前準備

# 変数を使ってみよう
変数とは、データを保存するための箱のような物です。
箱の中のデータは、自由に読み取り・書き込みをすることが出来ます。
Pythonでは簡単に変数を作ることが出来るので、実際にやってみましょう
## 変数を宣言する
```python
my_var = "Hello world from my_var!"
# 解説
# my_var :  変数の名前。変数を読み取ったり、書き換えたりするときに使うので、
#           目的に合った名前を付けるといい。
# =      : 「この変数に今からデータを入れますよ〜」という記号。
# "Hello world from my_var!" : 変数に入れるデータ。
```
このようなコードで変数を宣言することができます。
## 変数の中を読み取る
変数を宣言しただけで、使わなければ意味がありません。
変数の中身を読み取ってみましょう。
```python
my_var = "Hello world from my_var!"
print(my_var)
# 出力結果: Hello world from my_var!
```
### 一体何をしているのか？
変数```my_var```の中に入れたデータ```"Hello world from my_var!"```を
printで出力しています。
これで、変数の読み取りができます！
## 変数の中を書き換える
変数の中のデータは、宣言した後からでも変更することができます。
宣言とやり方は同じなので、やってみましょう。
```python
my_var = "Hello world from my_var!"
my_var = "Hello world"
print(my_var)
# 出力結果: Hello world
```
### このコードの動作
- ```my_var```を宣言し、中に```"Hello world from my_var!"```を入れる
- ```my_var```の中を```"Hello world"```に変更する
- ```my_var```の内容をprintで出力する

# 終わりに
変数はプログラミングの中で、かなり重要な物なので、
頑張って覚えましょう！
最後まで読んでいただきありがとうございました。
次回も(出るかわからないけど)Pythonの基本を解説するので、
いいね、コメントなどよろしくお願いします！
【Python】標準入力まとめ　※随時追加

標準入力からの様々な受け取りパターンまとめ。
自分用チートシートのため、表記や説明の荒い箇所があると思われる。
学習の進度に合わせて、内容は随時追加する。

# 1. 1つのデータ
## 1-a. 文字列
:::note info
string = input()
:::

### 入力例
```
abcde
```
### 受け取り方法
``` python
string = input()
# abcde
```

## 1-b. 数値
:::note info
整数　num = int(input())
小数　num = float(input())
:::
int, floatを指定しない場合は、数値であっても自動で文字列での受け取りとなる。

### 入力例
```
123
```
### 受け取り方法
``` python
# 整数で受け取る
num = int(input())
# 123

# 小数で受け取る
num = float(input())
# 123.0
```


# 2. 1行の複数データ（変数で受け取る）
データの個数があらかじめわかっていて、数が少ない場合に向いている。

## 2-a. 文字列
:::note info
a, b, c = input().split()
:::
splitの引数には、データ間の区切り文字を指定する。省略した場合は、半角スペースが区切りとなる。

### 入力例
```
a b c
```
### 受け取り方法
``` python
a, b, c = input().split()
# a
# b
# c
```

## 2-b. 文字列（区切り文字が半角スペース以外）
### 入力例
```
a, b, c
```
### 受け取り方法
``` python
a, b, c = input().split(",")
# a
# b
# c
```

## 2-c. 数値
map関数を用いれば、受け取りと数値への変換が一括で行える。

:::note info
a, b, c = map(int, input().split())
:::

### 入力例
```
1 2 3
```
### 受け取り方法
``` python
a, b, c = map(int, input().split())
# a = 1
# b = 2
# c = 3
```

# 3. 1行の複数データ（リストで受け取る）
データの個数が不明、または多数である場合に向いている。


## 3-a. 文字列
:::note info
li = input().split()
:::

### 入力例
```
a b c
```
### 受け取り方法
``` python
li = input().split()
# ['a', 'b', 'c']
```
各データの区切りが半角スペース以外の場合は、splitの引数で指定する。（変数で受け取る場合と同様）
``` python
# a, b, c
li = input().split(",")
```

## 3-b. 数値
:::note info
li = list(map(int, input().split()))
:::

map関数を使うのは、「2-c. 数値」の頁と同様。
ただしmapオブジェクトからリストへの変換が必要なため、`list()`を追加する。

### 入力例
```
1 2 3
```
### 受け取り方法
``` python
li = list(map(int, input().split()))
# [1, 2, 3]
```


# 4. 複数行のデータを受け取る
リスト内包表記で受け取る。

:::note info
li = [input() for _ in range(入力行数)]
:::

## 4-a. 文字列
### 入力例
```
abc
def
ghi
```
### 受け取り方法
``` python
li = [input() for _ in range(3)]
# ['abc', 'def', 'ghi']
```

## 4-b. 数値
リスト内包表記で、型変換も同時に行う。

:::note info
li = [int(input()) for _ in range(入力行数)]
:::

### 入力例
```
123
456
789
```
### 受け取り方法
``` python
li = [int(input()) for _ in range(3)]
# [123, 456, 789]
```
Macのターミナルでプロンプト表示を変更する

### この記事の概要
ターミナルを使う際に、デフォルトではログインユーザ名、マシン名が表示されてしまうため、キャプチャ取得したりする際にホスト名などを晒さないように、それを固定値に変更します。
bash、zsh、zshenv、zshrc、、、といろいろ混ざり合った結果、少々つまづいたため備忘録として残します。

### 現在のシェルを確認
```
$ echo $SHELL
/bin/zsh
```
Macを使っていて何も変更しないとzshになっているはずです。
合わせて、ターミナルの「開くシェル」も確認します。

![CleanShot 2025-01-12 at 18.44.16@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942074/d141e6dc-d3ff-fffc-5dc6-c7ab6f0dcda2.png)
「デフォルトのログインシェル」＝zshです。
なので、zshで統一されていることを前提として以下記載します。

### zshのプロンプト表示を変更する
プロンプトの表示は環境変数PS1を変更することで変えることができます。
デフォルトは以下の通り。
```
PS1="%n@%m %1~ %# "
```
これは```/etc/zshrc```に定義されています。

|定義|意味|
|:--- |:---|
|%n|ユーザ名（$USERNAMEの値）|
|%m|フルマシン名|
|%1~|現在の作業ディレクトリが $HOMEで始まる場合は~に置換される。<br/>数字の1は表示する階層を意味する。1は現在のディレクトリ名が表示される。2にした場合は現在とその上のディレクトリ名が表示される。|
|%#|root以外は%、rootは#もつく。（厳密ではないがおおかたこの解釈でOK）|

※参照
https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html#Prompt-Expansion

変更するために```~/.zshrc```に以下を記載します。
```
export PS1="k-nabe-o@localhost %# "
```
固定文字列と、rootかそれ以外かを表示しているのみです。
個人的に、pwdで現在のディレクトリを確認する癖がついてるため、ディレクトリ名の表示も不要かなと。

記載したらログインし直すか、読み込みなおせばOK。
再読み込みさせる場合はドットで読み込ませます。
```
$ . ~/.zshrc
```
### つまずきポイント１（定義するファイルに注意）
ポイントは、```.zshenv```ではなく、```.zshrc```に記載することです。
PATHの追加などよく```.zshenv```に記載しますが、どのように記載してもうまく適用されませんでした。
おそらく以下の順に読み込まれているのではないかと予想してます（未確認）。
```
~/.zshenv
　↓
/etc/zshrc
　↓
~/.zshrc
```
### つまずきポイント２（シェルが統一されていない）
bashに変えてると動きがよくわかりませんでした。

![CleanShot 2025-01-12 at 19.28.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942074/3586aff4-fa95-3c7c-8d52-5400390523e6.png)

この状態にしてターミナルを起動して、現在のシェルを確認すると、ターミナル自体はbashで動いているが、内部ではzshが動いているという状態。これが意味わからん。
![CleanShot 2025-01-12 at 19.30.36@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942074/cec8de5f-a028-6234-a499-01359cbc9486.png)

PS1の定義の仕方は、zshとbashでは異なります。
zshは```%```で指定しますが、bashは```¥（バックスラッシュ）```です。
bashのデフォルトは下記の定義です。
```
PS1='\h:\W \u\$ '
```
これを見かけた場合はbashの定義のため、zshではうまく機能しません。
プロンプトの変更がうまく行かない人は、動いているシェルとその定義の仕方が合っているかを再確認すると解決につながるかもしれません。
論文読み : Improving Zero-Shot Generalization for CLIP with Variational Adapter

こんにちは．
大学で画像認識の研究をしていく中で，今まで読んだ論文を自分用にまとめていこうと思います．内容について間違いなどあれば指摘していただければ幸いです．

### 今回の論文
ECCV2024より
https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/03044.pdf

### 概要
この論文では，事前学習されたVision Language Modelをファインチューニングする手法として「Prompt-based Variational Adapter (PVA)」を提案．それぞれのエンコーダにSpherical Variational Autoencoder (SVAE)を接続して，未知クラスと既知クラスの特徴を分離し，未知クラスの予測性能を向上させた．

### 先行研究と比べてどこがすごいのか
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/55d4f428-ca97-c5a2-87e6-a4a90efa0352.png">

上図はt-SNEでクラスごとの画像を視覚化したものであるが，ある程度似ているクラス（bobcatとleopardとtigerなど）は図(a)のように画像特徴がオーバーラップしているためなかなか上手くできない．この論文ではbaseクラスとnovelクラスを分離することで予測バイアスを減少させ，未知クラスの分類精度を向上．Generalized Zero-Shot ClassificationでSOTAを達成した．

### 技術や手法の”キモ”はどこにある？
以下がPVAの概要．
![スクリーンショット 2024-10-19 15.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/a152c23c-2ef4-1bdd-c0de-7ee8560f6686.png)
学習時のロスの説明．
$L^{svae}_{visual}$

$L^{svae}_{text}$
    - SVAEのロス

$L_{dis}$
    - 視覚的潜在分布とテキスト潜在分布を一致させるためのロス

$L_{cr}$
    - 視覚的特徴量とテキスト特徴量の対応するカテゴリを潜在空間においてさらに一致させるためのロス

$L^{pl}_{cls}$

$L^{la}_{cls}$
    - インスタンスレベルと潜在レベルでの制約をすることで特徴混合を減らす

推論時．
テスト画像を入力したときの潜在変数と学習済みクラスラベルを入力したときの潜在変数のコサイン類似度を計算して，ある閾値より大きければbase domainのクラス，ある閾値より小さければnovel domainのクラスとしてグループ分けする．その後，グループ分けされた後はそれぞれのタスク (supervisedとZSL) として分類．さらにオリジナルのCLIPの特徴量を利用して出力を洗練．
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/1cd99a9d-e1ec-5775-93db-f4e7c5517d4d.png">

### 評価
![スクリーンショット 2024-10-19 17.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/0629b793-6588-c2b8-1145-cae5f2dff191.png)
AwA2とSUNの調和平均でベストスコア．CUBではPSVMAに劣るが，人工的に調整しない手法の中では一番精度が良い．また，テキストトークンのみを学習するCoOPと比べるとAwA2で15.3%の向上していることから，予測バイアスの軽減が効果的であることがわかる．

以下はOpen-world settingでの評価．
![スクリーンショット 2024-10-19 17.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835446/a3a63cc5-6db8-2407-f9e2-f88125294524.png)

### 懸念点
追加的な学習コストが高い．
cline+deepseek環境を構築して、適当なアプリを作らせてみる

最近色々とAIコードエディターが流行っているので試しにclineを触ってみる。
LLMも最近出てきてかなりコスパが良いらしいdeepseekを使う。

# clineのインストール
https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev

VSCodeの拡張機能なのでインストール。

マケプレページの画像を見るに、デフォルトでいろんなモデルが使えるようになってるっぽい。

実際に開くとこんな感じで出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/004326fe-76da-32bf-64fc-a2dbd78d2e16.png)

# DeepSeekへの登録
https://platform.deepseek.com/api_keys

アプリキーが必要になるのでDeepSeekに登録する。Googleアカウントで登録した。

API利用用のキャッシュは$2から入れられるみたいなので、とりあえずお試しで$2入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/bb24178e-99a3-ed9f-122f-bab48c97803c.png)

クレカ or Paypalが使えるが、DeepSeekは中国企業ということでちょっぴり警戒してPaypalで支払い。

適当にAPI Keyを発行して完了。

# clineのセットアップ
右上の歯車からProviderが選択できるので、DeepSeekを選択して発行したAPI Keyを入力して完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/cd1b284d-d9b9-2b81-0bbc-3bd8364fee44.png)

auto-approveの設定があるので設定する。clineは勝手にプログラムを書いたりコマンドを実行したりしてくれるエージェントで、都度作業に承認が必要なのだが、ここを設定しておくと全部勝手にやってくれる。

ということでセットアップが完了。

# 使ってみる
試しに、ちょっと考えていたLLMにPC画面を監視させて、事前指定したタスク以外のことをしていたらアラートを出す、みたいな集中力監視のためのアプリを作らせてみる。

簡単にプロンプトを書いて実行してみるとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/808011e8-c01c-1bea-21af-947cfd15a1b7.png)

コストが表示されるのがとても良い。

とりあえず画面スクショを撮ってOpenAI APIに渡すところまで実装してくれた。使ったトークン数は800kトークンだけど、かかったお金は$0.03だった。これは嬉しい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/38850610-33ec-0a88-99cc-a081b7fd6679.png)

# 感想
ここからは使ってみての感想

## 良かったところ
使ってみて快適だったところとして、コンソールコマンドの実行を許可すると、実行結果まで見て次のアクションをしてくれる。こうなってくるとどんどん権限を渡したくなってきてかなり危ないとも思う。でもAIエージェントでここまで出来るんだという感想。自分用のエージェントを頑張って作りたいというモチベーションが湧いてくる。

あと、Deepseekがハチャメチャに安い。性能の割に全然お金がかからない。みんな使いすぎてAPIのレスポンスがかなり遅くなってるのが玉に瑕だけど。

## いまいち
いまいちな部分として、インストールするライブラリの指定が漏れていたり、古い形式でOpenAIライブラリを使っていたりするところがあるが、指摘してくれると健気に直してくれる。（ここの精度はDeepSeekのせいかもしれない）

ただ、Editの権限を渡しているとどんどん書き換えてしまうので、定期的にコミットしておかないと二度と帰ってこれない状況になるので気を付けたい。

本当に出来てるのかな？と思ったらチャットで色々確認すると良さそう。ただし、結構時間がかかるので集中力が続かず、自分で開発するというコーディング体験としては微妙かもしれない。仕事中にクソ長ビルドとかクソ長テストとか待ってる気分。自分で書いた方が速いなという気持ちになるので、現状何かの片手間に自動化とか効率化とかしたい場合にピッタリだと思った。
【プラクティス紹介】1分でさらっと分かる「ストーリーポイント」

## プラクティス名（別名）
ストーリーポイント　（SP、相対見積り、規模見積り、ポイント見積り）

## プラクティスの目的・狙い
* 個々の要件を実現するために必要な作業量（規模感/リスク）を迅速に見積る
* ベロシティ（チームの開発ペース）を計測可能にし、今後の見通しを立てる

## どんな時に使うか
* リリース時期を予測したい時（SP合計とベロシティからスプリント回数を逆算）
* POがPBIの優先順位を決めるために、その機能の実装コストを知りたい時
* DEVが今回のスプリントでどこまでPBIを拾えそうか判断したい時

## 実施手順
前提として、ユーザの要求事項がストーリー形式でまとめられたリスト（スクラムでいうところのプロダクトバックログ）がすでにあるものとします。

1. 見積基準とするPBIを選ぶ（これを「**リファレンスストーリー**」と呼ぶ）
1. リファレンスストーリーがNポイントだとすると、こっちのPBIは何ポイントになりそうか、というサイズ比較によって作業量を見積もってゆく（これを「**相対見積り**」と呼び、それによってつけられる数値が「**ストーリーポイント**」）
1. 要件の粒度が粗すぎてまだ見積れないPBIは、後日詳細化することを前提に大きめの数字を仮で割り当てておく（これを「**エピック**」と呼ぶ）
1. 一通り見積れたら全体のバランスを見て、大小関係に違和感がないか確認する（同サイズのものを並べてみると分かりやすい）
1. 開発の初期段階では不透明なことも多いため、適宜見直すことを前提に、**見積りに時間をかけすぎないことが大切**（精緻に見積ったとしても、前提が変わるとその労力が無駄になってしまう可能性が高い）

:::note info
**ストーリーポイントで使う数字**
* フィボナッチ数（1,2,3,5,8,13,...）を用いることが多い
* 13または21以上をエピックとして扱うケースが多い（エピックにはあえて数字を使わず、「∞」とする場合もある）
* 規模が大きくなるほど見積りのブレも大きくなるため、短時間で迷わず決められるように後にいくほどスケールを広げている
:::

:::note info
**リファレンスストーリーの選択**
* 最初はDEV全員が具体的に作業をイメージできる中規模のものを選ぶとよい
* 3spの場合はコレ、5spは～、8spは～と各規模に応じて設定しておけるとなおよい
:::

:::note info
**相対見積りを使う利点**
* 人間の特性上、絶対評価よりも相対評価の方が正確に見積ることができる
* 工数/時間などで見積る場合、誰がその作業をやるか（DEVの習熟度）を考慮する必要があるが、相対見積もりはタスク同士のサイズ比較であるため、その必要がない
* 開発初期と後期ではチームのパフォーマンス（ベロシティ）が変わってくるが、その場合でもsp見積りはやり直す必要がない（タスク規模自体は変わっていないため）
:::

## アレンジ例
* spの数値としてフィボナッチ数ではなく、2の乗数（1,2,4,8,16,...）を用いる
* spの数値の代わりにサイズ表記（XS,S,M,L,XL）を用いる（＝Tシャツ見積り）
* 目安として以下のようなストーリーポイントマトリクスを作成する

| SP | リファレンスストーリー | 複雑性・リスク |
|:-:|:-:|:-:|
|  1 | PBIxxx（文言修正等）  | 無し| 
|  2 | PBIxxx（設定変更等）  | 低い  | 
|  3 | PBIxxx（機能改善等）  | 低い  | 
|  5 | PBIxxx（簡単な機能）  | 中  |
|  8 | PBIxxx（普通の機能）  | 中  |
| 13 | PBIxxx（複雑な機能）  | 高い  |
| 21 | エピック（要分割）  | 不明  |


## アンチパターン
* 実際に開発を行うDEVが見積りに参加していない
* 「相対見積りの値」を時間/工数などの「絶対見積りの値」に変換しようとする
（→例えば、5sp＝10hとする、といった換算は原則として行わない。なぜなら5spは3よりは大きいが8よりは小さいという幅のある数字であり、かつ、作業者によっても実所要時間は変わってくるため）
* 別チームのspやベロシティと比較する（そもそも基準が違うため比較できない）

## 参考情報

https://www.agile-studio.jp/post/apm-relative-estimation

https://www.ryuzee.com/contents/blog/14570

## こぼれ話（私的コメント）
ストーリーポイントを見積もるための手法として「[プランニングポーカー](https://qiita.com/kakashi_h5/items/35c5846b1ee815d42668)」や「[Tシャツ見積り](https://qiita.com/kakashi_h5/items/53319b06c20497ad0d3f)」などがありますが、具体的なやり方は別記事で紹介することとし、本稿ではまずストーリーポイントの概念と相対見積りの考え方にスポットしてみました。

sp見積りする際に、やや困るのが最初に選んだリファレンスストーリーのポイントをいくつにするか？　前回と同じメンバーで臨む追加開発とかであれば、前回踏襲でよいし、皆の1spってこれぐらいという肌感覚もほぼ揃っているのですが、まったくの新チーム/新プロダクトだと、そうもいきません。まぁ、単純に決めの問題ではあるので、エイヤで決めて、あとは走りながら実績見て、適宜整えていくしかないんですけどね。

また、開発初期と後期でなんか3spの重みが違うなぁ、と感じる時、基準がブレているのか、チームの成長でそう感じるのか判断に迷うこともあったり。絶対見積りから相対見積りに変わっても、見積りに関する悩みはいつの時代も尽きないものだなぁと、常々思います。

余談ですが、この記事を何時間ぐらいで書けそうか、という見積りは6割ほど超過しました。見積りって難しい。(^^;)

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
AI-900　試験対策

Microsoft AI-900試験の用語をまとめた記事です。公式のLearnを参考にしています。

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

# 試験範囲と配点
* Artificial Intelligence のワークロードと考慮事項について説明する (15 から 20%)
* Azure での機械学習の基本原則について説明する (20 から 25%)
* Azure の Computer Vision ワークロードの機能について説明する (15 から 20%)
* Azure の自然言語処理 (NLP) ワークロードの機能について説明する (15 から 20%)
* Azure 上の生成系 AI ワークロードの特徴について説明する (15 から 20%)

# AI基礎
## 人工知能の種類
* 機械学習
* 画像分析（Computer Vision）
* 自然言語処理
* ドキュメントインテリジェンス
* ナレッジマイニング
* 生成

## 機械学習のフロー
### ①データの前処理
* 欠損値処理
* 正規化
* 特徴選択

### ②トレーニング
説明変数（特徴量）：予想するための値
目的変数（ラベル）：予想したい値

* 回帰：数値を予想する（教師あり）
* 分類：カテゴリを予想する（教師あり）二項分類とマルチクラス分類がある
* クラスタリング：いくつかのグループに分類する（教師なし）

### ③パフォーマンス評価
すべてのデータをトレーニングに使うのではなく、評価用のデータを行を分けて残しておく

回帰のメトリック
* 平均絶対誤差
* 平均平方二乗誤差
* R2スコア

分類のメトリック
* 適合率：真予想の数のうち、本当に真だった予想の割合
* 再現率：真データのうち、正しく真だと予想できた割合

### デプロイ
モデルをデプロイすることで、利用できるようになる

## AzureのAIサービス
### Azure Machine Jearning
* 自動ML：データをアップロードすることで、自動でモデル作成
* デザイナー：GUIで推論パイプラインにコンポーネントを配置（例：データの分割はSplit）
* Notebooks：コードでの実行が可能

### Azure AI Service
構築済みのAIモデルを利用可能（自然言語解釈、画像分析など）

### Azure Open AI Service
OpenAI（GPT）が使用可能

## 責任あるAI
6つの原則
* 公平性：偏見や差別があってはいけない
* 信頼性と安全性：フェールセーフで実行される
* プライバシーとセキュリティ：個人情報の取り扱いに注意
* 包括性：アクセシビリティがあること
* 透明性：仕組みが理解しやすいこと
* アカウンタビリティ：AIの挙動について責任を持つこと

# Computer Vision（画像分析）
## Azureのサービス
* Vision：画像解析、OCR、空間分析
* Face：顔検出、顔認識

### Azure AI Vision
* 画像の説明
* オブジェクト検出：オブジェクトの位置を示す境界ボックスを生成
* セマンティックセグメンテーション：オブジェクトの位置をピクセル単位で検出
* OCR
* ブランド検出
* 顔検出、顔認証（顔認証には事前の申請と承認が必要）

### Azure AI Custom vision
* 画像分類
* オブジェクト検出

# 自然言語処理
## 自然言語処理のステップ
* 形態素解析
* 構文解析
* 意味解析
* 文脈解析

## テキストマイニング
* トークン化：テキスト内の単語をトークンに置き換え
* 頻度解析：単語の数をカウントし、出現頻度順に整理
* ベクトル化：単語の意味をベクトル化、類似度を指数化

## Azureのサービス
* Lamguage：言語検出、キーフレーズ抽出、エンティティ認識、感情分析など
* Speech：テキスト読み上げ、音声テキスト変換
* Translator：テキスト翻訳、ドキュメント翻訳

### Azure AI Language
* エンティティ認識：テキスト内のワードを"人、数値、日付"などのタイプ別に一覧化
* 言語判別：言語を判別（あいまいな場合NaNが返される）
* 感情分析、オピニオンマイニング：ドキュメントが肯定的か否定的かを判別
* キーフレーズ抽出：主要な要点を抽出


### Azure AI Bot Service
Azureでボットを作成できる

# ドキュメントインテリジェンス
## Azureのサービス
Azure AI Document Intelligence：レシートから商品名、短歌、合計などの情報を読み取る
事前構築モデルが処理できるもの：
* 請求書に記載されている顧客とベンダーの詳細
* 領収書に記載されている売上とトランザクションの詳細
* ID ドキュメントに記載されている識別と検証の詳細
* 健康保険の詳細
* ビジネス連絡先の詳細
* コントラクトに記載されている契約とパーティの詳細
* 課税補償
* 住宅ローン利息、学生ローンの詳細など金融サービスと法的事項、米国の税、米国の住宅ローン、個人識別の各ドキュメント

# ナレッジマイニング
## Azureのサービス
Azure AI Search：ナレッジを作成可能
* インデックス作成：インデクサーによって、ドキュメントや画像データからインデックスを作成（JSON）
* クエリの実行：インデックスの内容を参照

# 生成AI
従来AI：インプットに対して、モデルが学習した内容に沿ってアウトプット
生成AI：インプットに対して、大量の学習データに沿ってアウトプット

Transformer：テキスト生成に使われるアーキテクチャ
* ①トークン化：テキストをトークン化
* ②埋め込み：コンテキストベクトルを定義
* ③アテンション：関係の強さを定義

## モデルの例
* GPT
* BERT
* LLaMA

* 大規模言語モデル：広い範囲の一般的な主題を表す膨大な量のテキストでトレーニング
* 小規模言語モデル：小規模の、特定の分野にフォーカスしたテキストでトレーニング

## Azureのサービス
### Azure OpenAI Service
利用可能なモデル
* o1,o1-mini：優れた推論能力を持つ最新モデル（2025/1現在）
* GPT4：自然言語とコードを理解し、生成できるモデル
* Embeddings：テキストを数値ベクトル形式に変換して、テキストの類似性を確認可能
* DALL-E：画像生成
* Wisper：音声をテキストに
* Text to Speech：テキストを音声に

入力パラメータ
* 過去のメッセージを含む
* 最大応答
* 温度
* 上位P
* プレゼンスのペナルティ

### Copilot
マイクロソフトのサービスと連携したAI

### Azure AI Foundry
AzureのAIサービスを1つにまとめたワークスペース（旧名称：Azure AI Studio）

## 責任のある生成AI
潜在的な有害性を事前に排除する
* コンテンツフィルター
* 段階的な配信
数式をきれいに表示する方法１（統計）

## 目的：
主に数字分析、統計分析で使う数式をきれいに表示させる方法について説明します。


## 理由：
Webページで数式がきれいに表示させる方法はTeX(「テフ」と読む)、またはLaTeX（「ラテフ」と読む）があります。
統計、分析を説明するとき、特化したページがあれば便利だと思い紹介します。

$ ※ $ Tex（テフ）はギリシャ語の
「τέχνη（テクネ）」から由来するそうです。
意味は、「（技術、芸術など）わざ」全般を指すようです。

## 表示説明
### 足し算
$ 1 + 1 = 2 $

```
$ 1 + 1 = 2 $
```
コピー用
```
$  +  = $
```


### 引き算
$ 5 - 1 = 4 $
```
$ 5 - 1 = 4 $
```

コピー用
```
$  -  = $
```

### 割り算
$  3 \div 5=0.6　$
```
$  3 \div 5=0.6　$
```
\div　を挿入します。

コピー用
```
$  \div  = $
```

### 分数
$  \dfrac {21}{45}　$
```
$  \dfrac {21}{45}　$
```
\dfrac　を挿入します。

コピー用
```
$  \dfrac  = $
```

### 小カッコ,丸カッコ( )
$  \left( a + b \right)　$
```
$ \left( a + b \right)　　$
```
左側の「(」 が \left(、右側の「)」が\right) になります。

コピー用
```
$  \left(   \right) $
```

### 中カッコ、波カッコ　{ }
$  \\{  \left(a + b \right)\left(c + d \right) \\}　$
```
$  \\{  \left(a + b \right)\left(c + d \right) \\}　$
```
左側の「{」 が \\{、右側の「}」が\right) \\} になります。

コピー用
```
$  \\{    \\} $
```


### 大カッコ、角カッコ　[ ]
$  \[  a + b  \]　$
$  \lbrack  a + b \rbrack　$
```
$  \[  a + b  \]　　$
$  \lbrack  a + b \rbrack　$
```
左側の「[」 が \[、右側の「]」が\] になります。
または、
左側の「[」 が \lbrack、右側の「]」が\rbrack になります。

コピー用
```
$  \[      \] $
```


## 上付き文字，下付き文字

上付き文字は、例えば、指数を表示させるときによく使うと思います。
$ x^{2} $ 
```
$ x^{2} $ 
```
コピー用
```
$  ^{} $
```


下付き文字は、例えば、文字の添字に使うことが多いと思います。
$a_{1}, a_{2}$

```
$a_{1}, a_{2}$
```
コピー用
```
$  _{} $
```

## 総和（シグマ）
$ \displaystyle \sum_{i = 1}^{n} $

```
$ \displaystyle \sum_{i = 1}^{n} $
```
$  \sum $
```
$  \sum $
```
## 平方根
$ \sqrt {x} $

```
$  \sqrt {x} $
```

コピー用
```
$  \sqrt {} $
```

## 三乗根
$ \sqrt [3\]{x} $

```
$ \sqrt [3\]{x} $
```



## 積分
$ \displaystyle \int_{a}^{b}  $

```
$ \displaystyle \int_{a}^{b}  $
```

コピー用
```
$   \displaystyle \int_{}^{} $
```


統計の教科書で紹介される数式も紹介する予定でしたが
内容が多くなってしまったため、次に紹介したいと思います。







## 参考
■はてなブログで記事中に数式を書く方法【TeXの簡単な使い方と支援サイト】
<a href="https://www.sunsunfine.com/entry/tex-on-hatenablog" target="_blank">https://www.sunsunfine.com/entry/tex-on-hatenablog</a>

■Texによる数式表現6～確率・統計
<a href="https://atatat.hatenablog.com/entry/2020/05/01/230319" target="_blank">https://atatat.hatenablog.com/entry/2020/05/01/230319</a>
メモ Microsoft SQLコマンド


SQL構文でよく使うものの自分用メモ

参考ページ https://qiita.com/leomaro7/items/4e90f802d0ae7edf6b23

# 基本コマンド
SELECT文：レコード検索
INSERT文：レコード挿入
UPDATE文：レコード更新
DELETE文：レコード削除

# テキストファイルからデータ登録
参考：https://yomikakiexcel.com/sql_server_setup_for_excel/#google_vignette

```
※ 例 DMS ←データベースは事前に手動で作っておく
※ 例 TEST_TABLE ←テーブルは事前に手動で作っておく

USE [DMS]

BULK INSERT TEST_TABLE
FROM 'C:\temp\Sample_Data.txt'
WITH (
    FIELDTERMINATOR = '\t',  -- ファイル内のフィールドの区切り文字
    ROWTERMINATOR = '\n',    -- 行の終わりを示す文字
    FIRSTROW = 2,            -- ヘッダー行を無視するための指定 (1行目はヘッダーならば2行目からデータと見なす)
    TABLOCK                -- バルクインサートでテーブルロックを行う
);
```


# 抽出表示
  ※カラム名は []で囲む　ただし、囲まなくても動作することもある
  SELECT [カラム名], [カラム名]  FROM テーブル名

# 条件指定して抽出表示 

SELECT - FROM - WHERE

```
■ 抽出　条件値に一致する
USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] = 100;
```

```
■ 抽出　条件値ではない
USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] <> 50;
```

```
■ 抽出　条件値の範囲内 BETWEEN
  例：50未満　または　100を超える
  
USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] BETWEEN 50 AND 100;
```

```
■ 抽出　条件値の範囲内ではない　NOT BETWEEN
USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] NOT BETWEEN 50 AND 100;
```

```
■ 抽出　条件リストの中にある IN
例： AかBに一致したら表示
※ IN( のようにスペースは空けない
※ 条件は ' で囲う　"では構文エラーになってしまう

USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] IN('A', 'B');
```

```
■ 抽出　条件リストの中にない NOT IN
例： AかBに一致しないものを表示

USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] NOT IN('A', 'B');
```

```
■ 抽出　複数条件 AND, OR
USE [データベース名]

SELECT 
  [カラム名], [カラム名]
FROM テーブル名
WHERE
  [カラム名] >=100
  AND ([カラム名] = 'A2' OR [カラム名]='A3')
```

```
■ ソート ORDER BY
ASC=昇順1,2,3,4,5  DESC=降順 5,4,3,2,1  指定なしならASC

USE [データベース名]

SELECT * FROM テーブル名 ORDER BY [カラム名] ASC;
SELECT * FROM テーブル名 ORDER BY [カラム名] DESC;
```


```
■ 指定件数表示　TOP  (MySQLとかでは LIMIT)
USE [データベース名]

SELECT TOP 10 * FROM テーブル名
  ↑最初の10件表示
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423803/1b37ac45-02a8-1ea2-05c1-726b9ca0a535.png)


# 複数テーブルの結合　JOIN 
　JOIN　 = INNER JOIN 
    ※↑　INNERは省略可能　
    ※↑　両方のテーブルにあるキーだけを表示
    
  LEFT JOIN = LEFT OUTER JOIN
  RIGHT JOIN = RIGHT OUTER JOIN
    ※↑　OUTERは省略可能　
    ※↑　両方のテーブルにない場合は 片側NULL として表示

# グループにするGROUP BY, グループ条件 HAVING 
    
  <!--
  以下は書きかけなのでコメントアウト
　BETWEEN

 -->
VS CodeでGitHub Copilotを活用してコーディング規約や設計思想を反映させる方法


# はじめに

VS CodeからGitHub Copilotを利用する際に，事前情報を与える方法について調べた内容を整理したものです．  
筆者はこれらの機能を検証中で十分使いこなせていませんが，ご容赦ください．


## GitHub Copilotの基本設定

まずは，VS CodeでGitHub Copilotを設定する方法について説明します．

### 1. GitHub Copilot拡張機能のインストール
1. VS Codeを開きます．
2. 拡張機能マーケットプレイスで「GitHub Copilot」を検索し，インストールします．

### 2. `settings.json`ファイルの編集
コーディング規約を設定するために，以下のように`settings.json`ファイルを編集します．

```json
{
  "github.copilot.codeCompletion": true,
  "github.copilot.codeStyle": {
    "conventions": "your_convention_file_path"
  }
}
```

ここで，`your_convention_file_path`はコーディング規約ファイルのパスを指します．  
この方法で指定した`your_convention_file_path`の内容は全ファイル共通で反映されます．

本記事の執筆時点では，拡張子別に独自のコーディング規約を指定することはできず，下記のように`settings.json`ファイルに記述することでコーディング規約を指定することができる．

```json
{
    "github.copilot.codeStyle": {
        "*.js": "eslint",
        "*.ts": "typescript",
        "*.py": "python"
    }
}
```

#### JavaScript (`*.js`)
- **eslint**: ESLintはJavaScriptのコード品質を向上させるためのツールで，Airbnb，Google，Standardなどのスタイルガイドを使用することができます
- **prettier**: Prettierはコードフォーマッターで，スタイルの一貫性を保つために使います

#### TypeScript (`*.ts`)
- **typescript**: TypeScriptの公式ガイドラインに従います
- **tslint**: TSLintはTypeScript用の静的解析ツールですが，現在はESLintとの統合が進んでいます
- **prettier**: JavaScriptと同様に，Prettierを使ってコードフォーマットを統一します

#### Python (`*.py`)
- **python**: PythonのPEP 8スタイルガイドに従います
- **pylint**: PylintはPythonコードの品質を向上させるためのツールです
- **black**: BlackはPythonコードフォーマッターで，コードスタイルの一貫性を保つために使用されます

#### HTML (`*.html`)
- **html**: HTMLの標準的なコーディングスタイルに従います
- **prettier**: PrettierはHTMLのコードフォーマットにも対応しています

#### CSS (`*.css`)
- **stylelint**: StylelintはCSSのコード品質を向上させるためのツールです
- **prettier**: PrettierはCSSのコードフォーマットにも対応しています

#### JSON (`*.json`)
- **json**: JSONのフォーマットに関する標準的な規約に従います
- **prettier**: JSONのフォーマットにもPrettierを使用できます

#### Markdown (`*.md`)
- **markdownlint**: MarkdownlintはMarkdownファイルの品質を向上させるためのツールです
- **prettier**: MarkdownファイルのフォーマットにもPrettierを使用できます

## ソフトウェアの設計思想を反映させる方法

GitHub Copilotにソフトウェアの設計思想を理解させるために，以下の手順を実行します．

### 1. コメントを活用する
コード内に設計思想やアーキテクチャに関するコメントを追加します．

```python
def example_function(param1, param2):
    """
    この関数はparam1とparam2を使って特定の処理を行います．
    設計思想としては，シンプルで再利用可能な関数を目指しています．

    Args:
        param1 (type): 説明
        param2 (type): 説明

    Returns:
        type: 説明
    """
    pass
```

### 2. ドキュメントの参照
プロジェクトリポジトリに設計思想やアーキテクチャに関するドキュメントを追加します．特に，README.mdやその他のMarkdownファイルに設計情報を記載します．

### 3. GitHubのWikiやプロジェクトサイトの利用
GitHubのWiki機能やプロジェクトサイトを使って，詳細な設計ドキュメントやガイドラインを提供します．

### 4. コードレビューやペアプログラミングの活用
設計思想を共有するために，コードレビューやペアプログラミングを行い，その結果をドキュメント化しておきます．

## GitHub Copilotのコンテキスト理解

GitHub Copilotは，VS Code拡張機能として以下の方法でプロジェクト全体のコンテキストを把握します：
- 現在のファイルの内容を基に補完を提案
- プロジェクト内の他のファイルを参照
- コード内のコメントやドキュメントコメントを考慮

これらの内容をプロンプトに明示することで，GitHub Copilotがより適切なコード提案を行うようになります．
失敗は成功の第一歩！エンジニア1年目が知るべき自己分析術

# 自分を責めすぎていませんか？

この記事を読んでいる皆さんの中に、次のようなことで悩んでいる方はいませんか？

- ミスをすべて自分のせいだと思い込んでしまう  
- WBS（作業分解構成図）通りに仕事が進まない  
- 上司や先輩に迷惑をかけているのではないかと心配している  

これらは、私がエンジニア1年目だった頃、まさに感じていたことです。

## 1年目のエンジニアが抱える課題
1年目のエンジニアが直面する課題は多岐にわたります。その中には、自分に原因があるものもあれば、自分以外に原因があるものもあります。しかし、多くの人は「自分のせいだ」と思い込んでしまいがちです。

その一方で、上司や先輩社員も、自分のミスを認めたくないために責任を新入社員に押し付けることがあります。こうした環境では、1年目のエンジニアが自分自身を振り返る余裕を持つのは難しいでしょう。

そこで、自分を責めすぎないために、自分のメンタルを守るために、失敗の原因と対策を次のように分類する方法を試してみてください。



## 失敗の原因と対策を分類する方法

何か失敗したと感じたとき、以下のように原因を振り分けてみましょう：

1. **原因が自分にあるもの**  
2. **原因が自分以外にあるもの**  
3. **すぐに実践できるもの**  
4. **時間をかけて解決する必要があるもの**

これを行うことで、自分が何に取り組むべきかが明確になります。

以下は、私自身が1年目の時に経験した「スケジュール通りに画面を製造できなかった」ケースを例にした分類です。

---

### 例：スケジュール通りに画面を製造できなかった場合

#### 原因が自分にあるもの
- 技術力が足りなかった  
- 調べるのに時間がかかりすぎた  

#### 原因が自分以外にあるもの
- そもそもスケジュールに無理があった  
- OJTでついている先輩の態度が悪く、質問する気になれなかった  

#### すぐに実践できるもの
- 雑談ベースで先輩社員に調べ方を尋ねる  
- 予定に無理があると感じたタイミングで相談する  

#### 時間をかけて解決する必要があるもの
- プログラミング言語に関する勉強時間を週に10時間確保する  
- マネジメントを学び、WBSや工数見積もりの精度を向上させる  


## まとめ

失敗に直面したとき、自分を責める前に冷静に原因を分析し、できることから取り組む姿勢が大切です。
失敗の原因を自分以外にも目を向けて分類することで、新たな気づきが得られるはずです。1年目は誰にでも失敗がつきものですが、次に活かせる失敗は成功への第一歩です。
Funtionsに関数をデプロイしたらなぜか認識されなかった問題

## 前提
以下で作成した関数をAzureにのせたときに起きた話。
なかなか、原因がわからず２～３週間悩んだので

https://qiita.com/molty_/items/6ecb9aed28fd57bf2226


## 事象
Azureに作成したHTTPトリガー関数をデプロイしたところ、認識されなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/9552ca06-c36d-add7-017f-f1f16171c7e1.png)

## 切り分け
### デプロイ失敗？
デプロイはvscodeの拡張機能を使って手動で実施している
ちゃんと`completed.`とでている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/38e6dbee-cb3d-2cd3-c052-27c9ad15d62b.png)

### ストレージアカウントにはどう？
ちゃんとZIPファイルはアップロードできている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/a15255bc-9258-5f06-c8ae-9a3528cf914b.png)

### Functionsの設定不備？
`WEBSITE_RUN_FROM_PACKAGE`はちゃんとZIPファイルを向いている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/39db9eef-1ebb-166b-7d8f-9f9f7ba93f36.png)

### Functionsの設定不備_その他
Bicepでリソース管理しているので、バージョンによる差異や指定の不足などの可能性を考慮してAzurePortalから作成したFunctionsに対して、動作を確認する
結果：なぜか認識できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/f088a811-c91f-07cb-8922-4e5e2a0c6f5a.png)

## 考察
ソースコードはデプロイができていて、FunctionsはちゃんとデプロイしたZIPファイルを見ている。
しかし、なぜか関数を認識できていない。

間違った方針に進んでしまったのが、手動で作成したFunctionsでは認識できているのでBicepの差異だと考えてしまったこと
ここからARMテンプレート出力したりやAzurePortalの環境変数を見たりして、両社の差分を調べていくことに時間を使ってしまった。

## 結論
ここでは突然思いついたことを試したらできたので、過程は省いて結論のみ
OpentelemetryとAzureMonitorの統合に使っていた`useAzureMonitor`が悪さをしていた。
`useAzureMonitor`で定義されている環境変数は、なぜかリソース側で先に定義されていないと認識されないらしい。
通常、環境変数として外にだしている値は、関数起動時に読み取られるはずなのでデプロイ時には気にする必要はない。

今回のケースではカスタムメトリックの送信先として、ApplicationInsightsの接続文字列を先に設定する必要があった。
使っていたBicepでは、接続文字列への移行対応はまだ対応しておらず、インストルメンテーションキーを使っていたので、手動作成との差異がでていた。
```
useAzureMonitor({
  azureMonitorExporterOptions: {
    connectionString: APPINSIGHTS_CONNECTION_STRING,
  },
  enableLiveMetrics: true,
});
```

## 環境変数を修正
インストルメンテーションキーから接続文字列`APPINSIGHTS_CONNECTION_STRING`に変更する
認識されるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956153/6e88c829-0f65-fbcf-9803-1a27920cf58c.png)
LaravelにてSupervisorでschedulerを動作させる際にCloudwatchLogsにログ出力させる

## はじめに

Laravelにてscheduler利用する際に、CloudwatchLogsにログ出力させるためには以下のようにログ出力先に`/proc/1/fd/1`を指定する必要があります。

```php
 $schedule->command('test')->everyMinute()->appendOutputTo('/proc/1/fd/1');
```

しかし、Supervisorを利用した構成にした場合、この設定ではCloudwatchLogsにログ出力されず、少し工夫が必要だったため、ひとつの対処方法について本記事で記載します。

## 設定

### Laravel kernel.php 設定

```php
$logFile = '/app/storage/logs/laravel-scheduler.log';
$schedule->command('test')->everyMinute()->appendOutputTo($logFile);
```

#### 解説
Laravelではコンテナ内の `/app/storage/logs/laravel-scheduler.log` にログ出力させるようにします。

### supervisord.conf 設定

```conf
[supervisord]
pidfile=/var/supervisord_run/supervisord.pid
nodaemon=true

[program:laravel-scheduler]
command = sh -c 'php artisan schedule:run && sleep 60'
autorestart = true
redirect_stderr = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0

[program:laravel-scheduler-log]
command=tail -F /app/storage/logs/laravel-scheduler.log
stdout_logfile=/proc/1/fd/1
stdout_logfile_maxbytes=0
autorestart=true

[program:laravel-scheduler-log-rotate]
command=/bin/bash /usr/local/bin/scheduler_log_rotate.sh
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
autorestart=true
```


####  解説
[program:laravel-scheduler]
Laravelのschedule:run を実行する設定です。

[program:laravel-scheduler-log]
`/app/storage/logs/laravel-scheduler.log` のファイルに出力されたログをtailし、 `/proc/1/fd/1` つまり、CloudwatchLogsに出力させるようにします。
-F のオプションを利用しているのは、後述のログローテート時にtailし続けるためです。


[program:laravel-scheduler-log-rotate]
scheduler_log_rotate.sh というシェルスクリプトを指定します。
Laravel側はコンテナ上にそのままログ出力するため、コンテナ内に保存できるストレージの容量を気にする必要があります。
そのため、一定間隔でファイルを削除し再作成することで、ファイルサイズをリセットします。


シェルスクリプト内容は以下の通りです。

```bash
#!/bin/bash

LOG_FILE=/app/storage/logs/laravel-scheduler.log

while true
do
  until [ "$(date '+%H%M')" -eq "2200" ] # 1日1回、22:00のタイミングでログファイルを再作成する
  do
    sleep 60
  done

  rm $LOG_FILE
  touch $LOG_FILE
  chown www-data:www-data $LOG_FILE # laravelが読み込み可能な権限を指定する
  sleep 60
done
```


## まとめ
supervisord.conf の設定のみで上手く `/proc/1/fd/1` の指定でCloudwatchLogsにログ出力できなかったため、今回ご紹介した方法で対処しました。

supervisord.conf のみで設定できたほうが簡潔だと思いますので、参考情報あればご教示いただけると幸いです。
Lattice Diamondで.gtiignore設定

# 概要
Lattice Diamond開発環境をGit管理する際にcommit対象を最小限にするための設定です。

# 必要なファイル

Diamondで合成実行するために絶対必要なファイルは以下のとおり2つです、あとは当然ながらRTLファイル(`.vhd`とは`.v`とか`.sv`)は必要です。
拡張子 |説明
----|---
*.lpf |ピンの設定ファイル
*.ldf |プロジェクトファイルで合成対象とするソースファイルの指定


# 設定ファイル
ついでにModelSimのデータもgitignoreに書いていますが、これをDiamondの開発フォルダにいれて使っています。
```bash:.gitignore
#---------------------------------
# Lattice Diamond
#---------------------------------
## UIの作業状態記録なのでmustではない
.floorplanner.ini
.run_manager.ini
.setting.ini
.spread_sheet.ini
.spreadsheet_view.ini
## 合成時に生成されるので追跡不要
*_tcr.dir/
impl*/
*.ccl
*_tcl.html
*.sty
promote.xml
reportview.xml
#---------------------------------
# ModelSim
#---------------------------------
## HDLコンパイル結果なのでmustではない
*/work/
## シミュレーション結果の波形で重いのでcommitしない
*/*.wlf
```

# 必要に応じてGITで追跡した方がいいファイル

ファイル |拡張子 |説明
--------|--------|--------
書き込みファイル|.jed　 .bgn|FPGAに書き込むファイルなので書き込みデータ<br>再合成しないでとりあえず書き込みしたい場合は追跡した方がよいです。
書込み設定ファイル|.xcf|書き込むときの設定ファイル
配置配線データ|impli1/|タイミングがシビアな回路、インクリメンタルコンパイルしたいような回路は中間ファイルもとっておいた方がよいです。
Vitisでhw_serverにつながらないときの対処法

# 問題

Vitis2024.2でhw_serverに接続できません。

私は、WSL2でVitisを動作させていて、WSL2からUSB接続のJTAGに接続できないので、Windowsホスト側で動作させたhw_serverに接続を試みました。

WSL2上の、Vivadoからは接続できたのですが、Vitisの場合、hw_serverに接続できませんでした。

# 解決策

接続元（WSL2）から接続先（windows Host）のIPに対して、pingの応答が返るようにすれば、解決します。

私の場合、Windowsホスト側で、ping応答を返すようにWindows Defenderのファイアウォールの設定を変更しました。

この問題は、WSL2固有の問題でないと思われます。

# おまけ

WSL2は、Windowsホストのネットワークを共有しています。この影響を受けないように（素のLinuxの場合と同じように）してみたかったので、
WindowsホストのネットワークとWSL2のネットワークを独立させるために、WSL2のネットワークをbridgeモードに変更しました。

hw_serverの接続については、接続先は、localhostではなく、WindowsホストのIPアドレスに接続する必要があります。
このような対策をしてみたのですが、これでもVitisからの接続はできませんでした。
Windowsに付与しているIPアドレスにPingが通るようにして、接続できるようにしました。

Bridgeモードではない場合（WSL2のデフォルトのネットワーク）の場合は、localhostへのpingで応答ががるようにすれば、接続できると思います。
この問題に遭遇した方は、参考にしてみてください。

# 参考

https://adaptivesupport.amd.com/s/question/0D54U00008YzAVuSAN/unable-to-connect-to-remote-hwserver-with-vitis-20241?language=en_US
Codewars 8kyu Do you speak "english"?

https://www.codewars.com/kata/58dbdccee5ee8fa2f9000058/train/python

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/07d42d3e-d88e-c71b-ad08-c595d9beb2ea.png)

Hmm...It seems I also need to think about numbers and signs..
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/8d1da0d9-5a1f-f3da-ac08-5ace2ac9a332.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/c1686886-d157-3603-1d62-32a6e1d2126d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/e2d82ce5-f642-5add-cf36-cc7293caf92f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/1f66613e-61ee-8676-66a3-8813c0ffbbac.png)

It seems I mistook the meaning of this question and though too complicated.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/25f9a386-cf22-d80e-e6ca-a3e7c7fdb2ec.png)


I made it!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/821ba620-8999-6e94-f367-24eb9bd64d21.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/244ebad2-a9ed-e26e-388e-97ef35325316.png)


That's cool answer:scream_cat:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/dabf4a31-ba6d-cbd4-078f-88a813caba35.png)
Yamada UIでダークモードを有効化する方法

viteでReactのプロジェクトを作成後、ダークモードを有効化する方法がわからなかったので記事にします。

## 結論

`<ColorModeScript />`をコード内に追加すればうまくいきました。

公式ドキュメントの、[カラーモード](https://yamada-ui.com/ja/styled-system/color-mode)ページに記述されていましたが、vite（もしくは自分の環境）の場合、「Create React Appの場合」のやり方ではなく、「Next.jsの場合」のやり方の方でないとうまくいきませんでした。
緑によるABC388振り返り

# はじめに
> ユーザ名	hidehico
> コンテスト名	HHKBプログラミングコンテスト2025(AtCoder Beginner Contest 388)
> 順位	2438th / 11601 (top 2.04%)
> パフォーマンス	1114
> レーティング	840 → 872 (+32) Highest更新！
> 段級位	6 級

よっしゃー、5完 6ペナ???
えーはいE問題でやらかして6ペナ食ったアホです
ランダムチェッカー使ってやっとEを通しました

### コンテストの流れ
#### 開始3秒
acc newを実行し、テストケースを取得する

#### 開始60秒
vimでgolfできそうと思ったけど、普通にAをpythonで通す

#### 開始3分
問題文を読むのに時間がかかったけどBを通す

#### 開始8分
二分探索でCを通す ライブラリ作っといてよかった

#### 開始20分
imos法でDを通す

#### 開始50分
Eのロジックが完成
ここから6ペナが始まる

#### 開始75分
すでに6ペナを食っている
パフォもあまり変らないだろうと思いつつも、ランダムチェッカーを作成した

#### 開始80分
パラメータをイジってやっとEを通す

こんなかんじでした
そんじゃ1問ずつ感想書きますか

### 使っているライブラリ
[github](https://github.com/hidehic0/library)
ファイル分割したんでよかったら、見てください

#### 二分探索ライブラリ
今回の記事で使っているので紹介します
```py
def binary_search(fn: Callable[[int], bool], right: int = 0, left: int = -1) -> int:
    """
    二分探索の抽象的なライブラリ
    評価関数の結果に応じて、二分探索する
    最終的にはleftを出力します

    関数のテンプレート
    def check(mid:int):
        if A[mid] > x:
            return True
        else:
            return False

    midは必須です。それ以外はご自由にどうぞ
    """
    while right - left > 1:
        mid = (left + right) // 2

        if fn(mid):
            left = mid
        else:
            right = mid

    return left
```

### 筆者のdotfiles(宣伝)
[github](https://github.com/hidehic0/dotfiles)
neovimの設定を書きなおしたら、結構プラグインの数が減らせました

# [A問題](https://atcoder.jp/contests/abc388/tasks/abc388_a)
普通に実装した

ACコード(あとで書いた)
escapeが消えてますがご了承
```vim
a DaUPCZZ
```

# [B問題](https://atcoder.jp/contests/abc388/tasks/abc388_b)
全探索しました

ACコード(ライブラリ抜粋)
```py
N, D = il()
L = li(N, il)

for k in range(1, D + 1):
    ans = 0

    for t, l in L:
        ans = max(ans, (l + k) * t)

    print(ans)
```

# [C問題](https://atcoder.jp/contests/abc388/tasks/abc388_c)
パッと見 にぶたんだと思って実装しました
ライブラリ作っといたので、実装の手間が大幅に軽減しました(オススメです)

ACコード(ライブラリ抜粋)
```py
N = ii()
A = il()
ans = 0

for a in A:

    def c(mi):
        if A[mi] <= a // 2:
            return True
        else:
            return False

    ans += binary_search(c, N, -1)

print(ans)
```

# [D問題](https://atcoder.jp/contests/abc388/tasks/abc388_d)
imos法を使って実装しました

親に説明しろと言われて、どうしようか迷ってます
まずimos法から解説しないとなので大変

ACコード(ライブラリ抜粋)
```py
N = ii()
A = il()
dp = [0] * (N + 1)
ans = [0] * N
cur = 0

for i in range(N):
    cur += dp[i]
    A[i] += cur

    if i + A[i] + 1 >= N:
        ans[i] = A[i] - (N - i - 1)
        dp[i + 1] += 1
        continue

    if A[i] == 0:
        continue

    dp[i + 1] += 1
    dp[i + A[i] + 1] -= 1

print(*ans)
```

# [E問題](https://atcoder.jp/contests/abc388/tasks/abc388_e)
二分探索を使って実装しました
上に置くモチは、一番小さいとこからK番目まで、下に置くモチは、$N-K$番目から$N$番目までを、使えばOK
それができるか、できないかを判定関数にして二分探索すればよかった

だけどKの上限と下限の設定をミスって案の定6ペナ食らいました
ランダムチェッカー使ったら一瞬でした

ACコード(ライブラリ抜粋)
```py
N = ii()
A = il()


def c(mid):
    a = A[:mid]
    b = A[N - mid :]

    for i in range(mid):
        if a[i] <= b[i] // 2:
            continue
        else:
            return False

    return True


ans = binary_search(c, N // 2 + 1, -1)
print(ans)
```

# 最後に

やはりペナの効果は大きいですね
来週はAHCなので楽しみです。(ていうかABCの結果が心配)

最後まで見ていただいて、ありがとうございます。
ローカル環境にWordPressを構築してみる


<!--

## 技術記事のタイトル

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## はじめに
<!--
何についての記事なのか、誰に向けた記事なのかを簡単に説明しましょう。
-->

### この記事でわかる・できること
<!--
読んだら何がわかるようになるのか、何ができるようになるのかを書きましょう。
-->

- Localアプリを使ったWordPressのローカル環境の構築方法

### この記事の対象者
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
-->

- WordPressのローカル環境を構築したい人


### 動作環境・使用するツールや言語
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
環境を書くと分かりやすいです。
- OS バージョン
    - 例 Windows11 23H2
- ツール
    - 例 VSCode 1.86.2
- 言語
    - 例 Python 3.12.2
- フレームワーク
    - 例 flask 3.0.2
-->

- MacOS M3Pro バージョン15.1.1（24B91）


## 導入方法
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->

### ①ダウンロード
公式サイトからLocalアプリをダウンロードします。
※ダウンロードの際にはOSの指定・メールアドレス・名前の入力が必要になります。
私の環境ではOSはMac AppleSiliconを指定しました。

https://localwp.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/6030c1a7-d79e-9a72-2f47-10d17889f6ac.png)

### ②インストール
ダウンロードしたLocalアプリをアプリケーションフォルダに移行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/430cc7bb-d2c4-dc91-470b-e8c118eba1f5.png)


### ③LocalアプリにWordPressを構築する。

アプリを起動し、WordPressのローカル環境を構築します。
まずは下記画面のcreate a new siteボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/396cb18a-6f7b-9724-a959-d8e4df0f4b26.png)

「Create a new site」欄を選択し、Continueボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/473a237b-768d-c2c2-96d6-32d879f99406.png)

WordPressのサイト名に任意の名前を入力して、Continueボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/78b6d982-9b04-b411-2209-99cea281a0b5.png)

PHPやSQLServerのバージョンを指定します。
※特にこだわりがなければPrefrredを選択していただいて大丈夫です。
指定後Continueボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/e98e3518-cbe0-0b0c-13e9-5fe53da2fdf1.png)

WordPressにアクセスするためのユーザー名とパスワードを設定します。
※管理画面にアクセスする際、必要となります。
設定後AddSiteボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/d8ae78ac-5456-79b1-8950-812057b8522e.png)

以上でローカルサイトの構築が完了です。
WpAdminを押下するとWordPressの管理画面に飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/010ab3cc-5f08-e263-081e-50d6d5fa308b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960815/4424371d-3cb7-f368-6cd5-95bc4dba7c9f.png)







## まとめ
<!--
どちらかを書きます。あってもなくても良いです。
-->

Localアプリを使えば、環境構築の知識がなくても簡単に構築できるので
とても便利なアプリだと思いました。

次回はローカル環境でWordPressの自作テーマを作ってみようと思っています。
Apache・PHP でShift JIS がなぜ文字化けする

この間仕事で検証をしていた時にApache とPHP で構成されているサーバーでなぜかShift JIS で作られているサイトで文字化けしたのでその作業の備忘録として残したいと思います。

OS とミドルウェアのざっくりとした情報です。

■ OS 
Alma linux 9 

■ ミドルウェア
Apache 2.4.x 系統
PHP 8.X 系統


# Shift JIS とは？？

日本語を表現するための文字コードの一種です。最近は少なくなってきている気はしますが、日本語を例えばLinux とかで使用していて文字化けをするときのあれです。あれは日本語の文字コードが上手く変換されなくて、意味わからない漢字ばかりが並ぶ文字化けが起こってしまっています。


# 文字化けしてしまった原因は？
Shift JIS 自体をあんまり意識しないためか、Apache やPHP 側でその設定も意識したことがなかったです。でも実はApache でもDefault のcharacter を指定する設定があるらしく、その設定がデフォルトでUTF-8 などを設定していると文字化けが発生してしまいます。

### apache の場合
httpd.conf の設定をみてください。
```

AddDefaultCharset utf-8
```

### PHP の場合
php.ini の設定を確認してみてください。
```
default_charset = UTF-8
```

上のような設定になっていると思います。

```
curl -I https://hogehoge.com

=> UTF-8 のheader 情報も返ってくると思います
```

# 設定を変更してみる


### apache の場合
httpd.conf の設定変更します。
```

AddDefaultCharset Off
```

### PHP の場合
php.ini の設定を変更します。
```
# 空にする
default_charset = ''
```

今回はプログラム側で設定が難しそうだったのか、ミドルウェア単位で設定変更することになりましたが、default_charset を空にすることは公式では推奨していないらしいので、他のやり方があるならば、そのやり方やった方がいいですね。

もちろん、apache の設定反映のために、apache のrestart もしくはreload が必要なので、お忘れなく実施してみてください。

# 参考サイト

https://zenn.dev/satoshi256kbyte/articles/a5ace1e40b8e93

https://www.php.net/manual/en/ini.core.php#ini.default-charset