OmniAICreator/Qiita-1.07M huggingface dataset:
楽天モバイルのテザリングでハマった話 - AI時代に必要なトラブルシューティングスキルとは？

# 楽天モバイルのテザリングでハマった話 - AI時代に必要なトラブルシューティングスキルとは？

先日、楽天モバイルに乗り換えてからテザリングをよく使うようになりました。

そこで、テザリングのパスワードを短く、覚えやすいものに変更しようとしたら、**思わぬ落とし穴**にハマってしまいました。

設定画面上では4文字のパスワードでも変更できたので、軽い気持ちで設定したのですが、実際には**8文字以上必要**だったようで、テザリングが全く繋がりませんでした。

「パスワードは合っているのに、なぜ繋がらないんだ？」と、途方に暮れてしまいました。

## AIに聞いても解決しない... 焦る気持ちと無駄な時間

焦る気持ちで、まずはAIに聞いてみました。しかし、明確な答えは得られず。

次に、ネットで検索してみましたが、やはり原因が分からず。エラーメッセージも表示されないので、本当に困り果てました。

WPAなどのセキュリティ設定も変更していたので、そちらが原因ではないかと疑って時間を費やしましたが、結局は**パスワードの長さが問題**だったというオチでした。

本当に無駄な時間を過ごしてしまいました…。

## 思考停止に陥るな！AI時代こそ必要なトラブルシューティング能力

この経験から、AI時代における効率的なトラブルシューティングについて、改めて考えさせられました。

コーディングでもそうですが、AIは非常に便利で、もはや使わないという選択肢はありません。しかし、AIに聞いても解決しない場合は、**自分で仮説を立てて調べる**ことが重要です。

エラーメッセージをコピペして検索するだけで解決しようとする人もいますが、それは非常に非効率です。

AIで解決できることは積極的に時短し、AIにできないことに集中すべきです。AIに聞いてみて、それがダメだと分かれば、他の原因や選択肢を検討することができます。

自分で切り口となる仮説を持ってAIに質問すれば、漠然と質問するよりも正しい回答を得られる可能性が高くなります。

### 私のケースでの反省点

今回の私のケースでは、以下のようにすれば、より早く解決できたかもしれません。

1.  **エラーメッセージがないことに着目する**:  エラーメッセージが表示されないということは、システム的には問題なく、設定上の問題である可能性が高いと推測できます。
2.  **変更した設定を洗い出す**: パスワード以外にもWPAなどの設定を変更していたことを思い出し、それぞれの設定項目について個別に調べる。
3.  **AIに具体的な質問をする**:  「楽天モバイル テザリング パスワード 文字数 制限」のように、より具体的なキーワードでAIに質問する。
4.  **公式ドキュメントを参照する**: 楽天モバイルの公式サイトで、テザリングに関するヘルプやFAQを確認する。

## まとめ：AIと人間の知恵で最強のタッグを組もう！

AIは強力なツールですが、万能ではありません。AIを効果的に活用するためには、**人間の思考力と組み合わせる**ことが重要です。

今回の経験を教訓に、AI時代を生き抜くための問題解決能力を further 磨いていきたいと思います。

## 参考情報

  * [楽天モバイル 公式サイト](https://network.mobile.rakuten.co.jp/)

## タグ

`#楽天モバイル #テザリング #トラブルシューティング #AI #問題解決`
Rubyのbenchmarkについて学んでみた

Railsチュートリアルにてbenchmarkを知り、理解を深めるためにアウトプット。

## benchmarkとは

辞書によれば
① 測量で，高低の基準となる水準点。計測指標。
② ものごとの基準となるもの。

プログラミングでは、ある特定の機能を果たすプログラムを書くときに複数の手法が存在した場合、どの手法が最も効率的かを知ることで、「ベンチマークをとる」という表現をする。

Rubyのbenchmarkはプログラム実行時の処理速度を計測できる。

## サンプルコード
リファレンスの例となっていたコードが以下のコード。
これは、for、times、uptoの繰り返し処理の速度の速さをそれぞれ調べている。

```ruby
require 'benchmark'

n = 50000 # 何回実行するか

Benchmark.benchmark(" "*7 + Benchmark::CAPTION,
                    7,
                    Benchmark::FORMAT,
                    ">total:",
                    ">avg:") do |x|

    tf = x.report("for:")   { for i in 1..n; a = "1"; end }
    tf = x.report("times:") { n.times do   ; a = "1"; end }
    tu = x.report("upto:")  { 1.upto(n) do ; a = "1"; end }

    [tf+tt+tu, (tf+tt+tu)/3]
end

#=>
#
#              user     system      total        real
# for:     1.016667   0.016667   1.033333 (  0.485749)
# times:   1.450000   0.016667   1.466667 (  0.681367)
# upto:    1.533333   0.000000   1.533333 (  0.722166)
# >total:  4.000000   0.033333   4.033333 (  1.889282)
# >avg:    1.333333   0.011111   1.344444 (  0.629761)
```

Benchmark.benchmarkでBenchmark::Reportオブジェクトが作られる。
（Benchmark::Reportは計測結果を管理し、出力するための仕組みを持っているRubyのクラス）

Benchmark.benchmarkの引数は結果の表示を見やすく整えるための細かいフォーマット指定の役割。

第一引数について
```ruby
(" "*7 + Benchmark::CAPTION,
```
Benchmark::CAPTIONには出力時のヘッダーである以下の文字列を指定してる。
```
user     system      total        real
```
" "*7によってヘッダーの先頭にスペースが7つ入るため出力結果が以下のように成形されている。
```
              user     system      total        real
```

第二引数はラベル(forやtimesなど)の幅を7文字分のスペースをとるように指定。

第三引数は計測結果を出力する際のフォーマット指定でデフォルトは

user: ユーザーCPU時間
system: システムCPU時間
total: 合計CPU時間
real: 実行時間

となっている。

第四引数、第五引数は出力結果のラベルを追加している。
サンプルコードではtotalとavgの計測も行っているため。

ブロック内について
|x|はBenchmark::Reportのオブジェクト
reportはBenchmark::Reportのインスタンスメソッドで、x.reportはブロック内{ for i in 1..n; a = "1"; end }の処理を実行し、その処理にかかった時間を計測している。
実行時間を出力する結果はbenchmark::Tmsオブジェクトとして記録される。
(Benchmark::Tmsは計測結果を保持するオブジェクトで以下のデータを格納する)

utime: User CPU time
stime: System CPU time
cutime: 子プロセスの User CPU time
cstime: 子プロセスの Sytem CPU time
real: 実経過時間
label: ラベル

```ruby
[tf+tt+tu, (tf+tt+tu)/3]
```
はtf,tt,tuを合計と平均を計算した新しいBenchmark::Tmsオブジェクト。
Benchmark.benchmarkのブロックは実行後、戻り値をチェックし、戻り値が配列の場合、各要素が計測結果に追加される。

## まとめ
今日はここまで。
処理内容がわかったところで結果と使い方はまた別記事で記載。
Google Cloud Speech-to-Text の利用料金

---

Google Cloud Speech-to-Text を使って、24時間ウェイクワードを検出し続ける場合の料金を計算しました。また、無音時に API を停止することでコストを削減する方法についても解説します。音声認識のリアルタイム処理が必要な場合、どのように効率化できるのか？この記事で詳しく説明します。

---

## **料金体系**

### **基本料金**
- **1分あたり $0.016**（リアルタイム、標準料金）
- 追加割引や特殊な設定（バッチ処理やボリュームティアなど）が適用される場合はさらに安くなることもあります。

---

## **料金計算例**

以下の条件でコストを計算しています：

- 1分あたりの基本料金：$0.016
- 稼働時間：**8時間**、**24時間**（1日）、**30日間（1か月）**
- 為替レート：**1ドル = 158円**

### **計算結果**
- **8時間のコスト**  
  8時間 = 480分  
  $0.016 × 480分 = **$7.68**  
  日本円換算：**約 1,213円**

- **24時間（1日）のコスト**  
  24時間 = 1440分  
  $0.016 × 1440分 = **$23.04**  
  日本円換算：**約 3,639円**

- **1か月（30日・24時間稼働）のコスト**  
  $23.04 × 30日 = **$691.20**  
  日本円換算：**約 109,210円**

---

## **まとめ表**

| 稼働時間       | コスト (USD) | コスト (JPY)       |
|----------------|-------------|-------------------|
| **8時間**      | **$7.68**   | **約 1,213円**    |
| **24時間**     | **$23.04**  | **約 3,639円**    |
| **1か月 (30日)** | **$691.20** | **約 109,210円**  |

---

## **無音時に API を停止して料金を削減する方法**

24時間 API を使い続けるとコストが高額になるため、無音時には API を停止する工夫をすることで料金を軽減できます。以下に、具体的な手法を示します。

### **1. 無音検出を導入する**
音声入力の前段階に「無音検出」処理を設け、無音かどうかを判定します。

- **オープンソースツールの利用**  
  無音検出には以下のツールが便利です：
  - **`pyaudio`** や **`webrtcvad`**（Python 用）
  - 音声信号処理ライブラリ（例: FFmpeg）

- **閾値設定**  
  騒音レベルや環境に応じて、無音と判定するための閾値を設定します。  
  （例：音量レベルが一定以下、または音声のエネルギーが低い場合）

---

### **2. 無音検出と Speech-to-Text API の連携**
無音検出を常時行い、以下の条件で API を操作します：

- **無音検出** → API 呼び出しを停止
- **音声検出** → API 呼び出しを再開

#### **Python のサンプルコード**
```python
import pyaudio
import webrtcvad

vad = webrtcvad.Vad()
vad.set_mode(3)  # 高感度モード

def is_speech(frame):
    return vad.is_speech(frame, 16000)

def start_api_call():
    print("API started")

def stop_api_call():
    print("API stopped")

while True:
    frame = get_audio_frame()  # マイクからフレームを取得
    if is_speech(frame):
        start_api_call()
    else:
        stop_api_call()
```

---

### **3. 無音検出の注意点**
- **処理の軽量化**  
  無音検出の処理負荷が高いと、システム全体のパフォーマンスに影響を与えるため、軽量な方法を選択することが重要です。

- **再接続の遅延**  
  無音から音声に切り替わったときに、API 再接続の遅延を最小化する設計が必要です。

---

## **期待される効果**
無音時の API 呼び出しを停止することで、トータルの利用時間を大幅に削減できます。  
例えば、1日あたり音声が発生している時間が全体の 50% の場合、コストは **半額以下** に削減される可能性があります。

---

## **補足**
- **バッチ処理の活用**  
  音声認識のリアルタイム性が不要であれば、音声を蓄積しバッチ処理で Google Cloud Speech-to-Text を使用することで、さらなるコスト削減が可能です。

- **Google のエンハンス機能の活用**  
  Google Cloud Speech-to-Text には効率化を支援するオプションがあるため、それらも検討する価値があります。

---

## **まとめ**

Google Cloud Speech-to-Text を利用する際、料金を最適化するには「無音検出」と「API 呼び出しの動的制御」が鍵になります。特に、無音時に API を停止する仕組みを取り入れることで、コストを大幅に軽減できます。

これから音声認識を活用したシステムを設計する方は、ぜひ参考にしてみてください。

---

**参考リンク**  
- [Google Cloud Speech-to-Text 公式料金ページ](https://cloud.google.com/speech-to-text/pricing)

---

以上
Zoomのようなビデオ会議Webアプリを UIKit で構築する | Node.js

[ビデオ会議](https://trtc.io/demo/homepage#/detail?scene=roomkit)は、企業や個人の日常的なコミュニケーションに欠かせないツールとなっています。リモートワーク、オンライン教育、友人や家族との連絡など、Zoomのようなビデオ会議アプリケーションは重要な役割を果たしています。では、強力で使いやすいビデオ会議アプリケーションをどのように開発すればよいでしょうか？

[このチュートリアル](https://trtc.io/document/60441?platform=web&product=conference&menulabel=overview)では、Zoomに似たビデオ会議アプリケーションを段階的に構築していきます。最新の技術スタックとTencent Real-time Audio and Video (TRTC)などの強力なツールを使用して、高品質の音声・映像、複数人での対話、画面共有などの機能を備えた会議アプリケーションを作成します。初心者でも、ある程度の開発経験がある方でも、このチュートリアルは包括的なガイダンスと実践的な機会を提供します。

アプリケーションの構築を始める前に、まずビデオ会議アプリケーションの主要機能と技術的ポイントを理解しましょう：

1. リアルタイムの音声・映像通信：WebRTCなどの技術を使用して、低遅延・高品質の音声・映像伝送を実現します。

2. 複数人での対話：複数の参加者が同時に会議に参加し、リアルタイムの音声・映像対話を提供します。

3. 画面共有：参加者が自分の画面を共有できるようにし、プレゼンテーションやコラボレーションを容易にします。

4. 会議管理：会議の作成、参加、招待などの機能を提供し、ユーザーが会議を組織し参加しやすくします。

5. ユーザーインターフェース：シンプルで直感的なユーザーインターフェースを設計し、良好なユーザー体験を提供します。

# **前提条件**

Node.jsバージョン：Node.js ≥ 16.19.1

モダンブラウザ、[WebRTC APIをサポートしていること](https://trtc.io/document/41664)。

# **ステップ1. デモのダウンロード**

1. ターミナルを開き、サンプルコマンドをコピーしてリポジトリをクローンします。

```jsx
git clone https://github.com/Tencent-RTC/TUIRoomKit.git
```

2. 依存関係のインストール

Vue3

```jsx
cd ./TUIRoomKit/Web/example/vite-vue3-ts
```

Vue2

```jsx
cd ./TUIRoomKit/Web/example/webpack-vue2.7-ts
```

```jsx
npm install
```

# **ステップ2. デモの設定**

1. ﻿[TUIRoomKitサービスを有効化し](https://trtc.io/document/59973?platform=web&product=conference)、**SDKAppID**と**SDKSecretKey**を取得します。

2. **TUIRoomKit/Web/example/vite-vue3-ts/src/config/basic-info-config.js**ファイルを開き、サービス有効化時に取得した**SDKAppID**と**SDKSecretKey**を入力します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957687/167087d8-fe91-6411-38d2-21f216df8ae5.png)

**注意：**

Vue2プロジェクトの場合、**TUIRoomKit/Web/example/webpack-vue2.7-ts/src/config/basic-info-config.js**ファイルを開き、サービス有効化時に取得した**SDKAppID**と**SDKSecretKey**を入力します。

# **ステップ3. デモの実行**

1. ターミナルにコマンドを入力してデモを実行します。

Vue3

```jsx
# cd TUIRoomKit/Web/example/vite-vue3-ts
npm run dev
```

Vue2

```jsx
# cd TUIRoomKit/Web/example/webpack-vue2.7-ts
npm run serve
```

**注意：**

ローカル環境の場合は、localhostプロトコルでアクセスしてください。[ネットワークアクセスプロトコルの説明](https://web.sdk.qcloud.com/trtc/webrtc/doc/en/tutorial-05-info-browser.html#h2-3)を参照してください。

2. ブラウザページを開き、対応するURLを入力します。

# **ステップ4. 最初の会議を作成する**

新規ルームボタンをクリックして、最初の会議室を作成します。ルームタイプは**登壇型スピーキングルーム**と**フリースピーチルーム**があります。

参加者は、会議主催者が作成した会議に対応する`RoomId`を入力して参加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957687/f51659b7-9e54-2aba-8bf8-376ee220f958.png)

# **結論**

結論として、[このチュートリアル](https://trtc.io/document/60441?platform=web&product=conference&menulabel=overview)では、TUIRoomKitサンプルプロジェクトを使用して高品質な複数人[ビデオ会議](https://trtc.io/products/conference)をすぐにセットアップし体験する方法について包括的なガイドを提供しました。段階的な指示に従うことで、数分以内にデモを確実に実行し、TUIRoomKitの強力な機能を探索できるようになりました。
デレステのノーツを再現してみた #2

:::note info
著作権情報　THE IDOLM@STER™& ©Bandai Namco Entertainment Inc.
:::

この記事は[デレステのノーツを再現してみた。](https://qiita.com/Magiqych/items/971efd61c7df7e7e7930)の続編です。

![画面録画 2025-01-10 203412.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8f1b19a0-651f-f88d-d550-c0d41275bf80.gif)
* 3倍速の動作動画である。

## 無駄を省きシンプルにする
![画面録画 2025-01-10 113821.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/a227c04f-5268-1be0-49b8-07694cbd8408.gif)

前回はデレステのノーツ表現空間を3Dとして捉え、実際にノーツを大砲の玉と捉えて速度成分と、加速度を個々に計算していた。大きな計算量の無駄が生じていることに気がついた。

![20250110_133947.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8725f9c6-276e-5602-4593-30b19e736a7b.jpeg)

そうノーツ速度はレベルに置いて固定値なので加速度も変化することはない。つまり、ノーツのZY成分における軌道はすべて同一なのである。一回何らかの配列に計算結果を入れてやれば、いちいち再計算する必要はないのだ。

![スクリーンショット 2025-01-09 204902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/1c66d1f9-c5e0-df0e-869a-53bd67a884df.png)

あと、加速度をよしなに計算してタップの領域にいれる手法を取る場合、誤差の話が必ずつきまとう。極端な話、ノーツ速度を凄まじく大きくした場合、Z成分の加速度はtが小さくなる方向に移動するので正の無限に発散する。
HSPに関して触り始めて数日なのでどのくらいの精度を持って演算できるのかは、まだ把握しきれていないが、これは何もHSPに限ったことではなく別の言語で実装した場合も同じ話である。

## 3次元は2次元より複雑である
これは言わずもがな、次元が一つ増えるのであるから当然の話しである。
あとレベル作成ツールにおいて実装はシンプルな方が良い。当然3Dより2Dの方が良いのだ。

![20250110_133616.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8a947693-ff49-0472-e208-287b07f68aed.jpeg)

そう、やはりレベル作成ツールに置いても3次元よりもこのように2次元の配置にしたほうがレベル作成者も、実装としてもシンプルでわかりやすいものになる。
しかし実際にプレイする画面においてはノーツは擬似的であっても3次元空間である。さてどうするか？

## 次元を上げる

![20250110_133706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/7ba6bc66-6739-9ded-9191-3a41df3eed9b.jpeg)

この場合のYZ曲線は円になるが曲線であれば何でも構わない、手元にペットボトルしかなかったので

![20250110_133747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8ce47a28-5bde-fc1c-c75f-e9e1b02e3bd1.jpeg)

こうしてやれば良い。
この手法の良いところは、前回の手法ではXYZ成分の座標をtを変数として計算していたが、Unityにおいて適当な円柱でも何でも用意して、そこにテキスチャとして譜面を貼り付ける。
ノーツ速度を2倍にする場合はテキスチャをY方向に2倍して貼り付け回転速度なりスクロール速度を2倍にすればいいだけになることである。座標変換が適切にさえ行われればレベル作成ツールでは2次元のデータとして扱い、プレイ時に3次元の奥行きを表現することが可能になるのだ。レベル作成ツールもプレイアプリの実装もよりシンプルになる。

ちなみにこれに似た構造を持つおもちゃを貴方は人生の中で一度は見ているはずだ。

![music-box-7293463_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/be7e4eaa-05b8-6195-4de1-0389a8c3ecb4.jpeg)

## しかしHSPでの実装では苦労した
理由としては単純でYZ軸に円でも楕円でも何でも良いが曲線になっている物体(円柱とか)にテクスチャを貼り付ける機能が見当たらなかったからである。直方体なら貼れるよということで、ここでティンと来た人は鋭い。

![20250110_213936.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/111bd959-e7d0-1b03-8b12-eeb79611a217.jpeg)

要は階段状に直方体を積み上げていく方式になる。この手法を取らざるを得なかったために見てくれは非常に悪くなってしまった。ただUnityに置いてXZ曲線をX軸の有限範囲で定義した取った物体(例えば円柱)にテクスチャが貼れないとかはありえねえと思うのでこれはモックの段階で言語の仕様上仕方ないことであり、本番ではこの手法でレベル作成ツールやプレヤーを作成しようと思う。

![画面録画 2025-01-10 203412.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8f1b19a0-651f-f88d-d550-c0d41275bf80.gif)

## モックとしてはある程度の完成度かな

https://github.com/Magiqych/Gnuderella

一応、考えつくアイデアとしてはこんなもんで行けそうだなという感覚ではある。
ということで一応mainにマージしておいた。寝ればまた何か思いつくかもしれないので寝ることにする。
Ruby on railsにtailwindcssを導入時につまづいた

Ruby on railsにtailwindcssを導入時につまづいたので
解決方法を残します。

基本は公式docでOKです。
https://tailwindcss.com/docs/guides/ruby-on-rails

しかし、"./bin/dev"でエラーが出てしましました。

```:エラー
% ./bin/dev
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
      stringio (>= 0)
      Available/installed versions of this gem:
      - 3.1.2
      - 3.0.4
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
Please report a bug if this causes problems.
bin/dev: line 16: exec: foreman: not found
```

## 解決
下記を実行で治りまし。
```
gem cleanup stringio
```



```
gem install foreman
```
個人的メモ：i3-wmの設定

個人的なメモです。
Lenovoの古いノートにLinux mint + i3で運用してます。

# 作業前
個人設定にするため、設定ファイルを自分のhomeディレクトリにコピーする。
```
cp /etc/i3/config ~/.config/i3/config
mkdir ~/.config/i3status/
cp /etc/i3status.conf ~/.config/i3status/config
```

# ~/.config/i3/config 関連設定
### Mod+PageUp/Mod+PageDownでワークスペースを移動。
```
bindsym $mod+Prior workspace prev
bindsym $mod+Next workspace next
```

### レイアウトモードをstackingにする。
デフォルトだと、新規アプリを開くとタイルのように展開するのですが、
ノートパソコンのため画面が小さいため、stackingにしました。
```
Syntax:
workspace_layout default|stacking|tabbed

設定した内容:
workspace_layout stacking
```

# ~/.config/i3status/config 関連設定
### 安いノートパソコンなのでLANがないので、無効にする。ついでにipv6も・・
```
order += "ipv6"
order += "wireless _first_"
order += "ethernet _first_"
order += "battery all"
order += "disk /"
order += "load"
order += "memory"
order += "tztime local"

↓

# order += "ipv6"
order += "wireless _first_"
# order += "ethernet _first_"
order += "battery all"
order += "disk /"
order += "load"
order += "memory"
order += "tztime local"
```

参考にしたサイト
https://qiita.com/gyu-don/items/d61b03e0222a7f1ce9f7
https://hobochuritsu.hateblo.jp/entry/2018/12/05/235651
https://i3wm.org/docs/userguide.html
https://ja.linux-console.net/?p=10190
【AIエージェント紹介】Company Researcher Agent(GitHub)


## はじめに

近年、人工知能（AI）や機械学習（ML）の発展は、ソフトウェア開発やデータ分析の分野で革命的な変化をもたらしています。特に、Company Researcher Agentのようなツールは、開発者や研究者にとっての強力なパートナーとなっています。本記事では、これらのツールの機能、利用方法、そしてそれらがもたらすメリットについて詳細に解説します。


## Company Researcher Agentの概要

Company Researcher Agentは、特定の企業に関する情報を収集・整理するためのエージェントです。このエージェントは、ウェブリサーチとスキーマ抽出を分離したマルチステップのワークフローに基づいています。以下に、主な機能と利用方法を解説します。

https://github.com/langchain-ai/company-researcher


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606425/47329b52-da56-d9ab-06bd-0a0ea9275180.png)

```
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/langchain-ai/company-researcher.git
cd company-researcher
uvx --refresh --from "langgraph-cli[inmem]" --with-editable . --python 3.11 langgraph dev
```


### 研究フェーズ

- **ターゲット検索クエリの生成**: ユーザーが提供するスキーマに基づいて、関連する検索クエリを生成します。
- **並列検索の実行**: Tavily APIを利用して、複数の検索を同時に行い、最大の検索結果を取得します。

### 抽出フェーズ

- **情報の整理**: 収集した情報を整理し、ユーザーが指定したスキーマに従ってフォーマットします。
- **構造化データの返却**: 抽出した情報を、ユーザーが求める形式で返却します。

### 評価フェーズ

- **情報の質の評価**: 抽出した情報が求められるフィールドを満たしているかを評価し、必要に応じて追加の検索を行います。

## Company Researcher Agentの設定と使用方法

### 設定ファイル

Company Researcher Agentの設定は、`src/agent/configuration.py`ファイルで行います。以下のパラメータを設定可能です。

- `max_search_queries`: 各企業に対して最大で行う検索クエリの数。
- `max_search_results`: 各クエリに対して取得する最大検索結果数。
- `max_reflection_steps`: 情報の評価における最大ステップ数。

### ユーザー入力

ユーザーは以下の情報を入力する必要があります。

- `company`: 調査対象の企業名。
- `extraction_schema`: 出力形式のJSONスキーマ（オプション）。
- `user_notes`: 企業に関する追加のメモ（オプション）。

### スキーマの重要性

スキーマは、抽出される情報の形式を定義します。例えば、企業名、設立年、製品説明などのフィールドを含めることができます。また、JSONスキーマには、必ず`title`と`description`フィールドを含める必要があります。

## まとめ

Company Researcher Agentは企業に関する情報の収集と整理を支援します。これらのツールを活用することで、開発プロセスの効率化やデータ収集の精度向上が期待できます。今後ますます進化するこれらの技術を積極的に取り入れて、より良い成果を上げていきましょう。"
Google Kubernetes Engine + Gateway APIを用いてHTTPS対応のWebサービスをデプロイする

# 目標
Google Kubernetes Engineにクラスタを立て、そこにHTTPSに対応したWebサービスを立ち上げる。簡単のため、NginxのオフィシャルDockerイメージを用いてウェルカムページを立ち上げるのみとする。
ルーティングにはGateway APIを用いる。ドメインおよびSSL証明書は他サービスにて取得するものとする。
執筆にあたっては、以下のサイトを参考にした。

https://cloud.google.com/kubernetes-engine/docs/how-to/deploying-gateways?hl=ja

## クラスタの作成
GCPのコンソールやgcloudなどを用いてクラスタを立ち上げる。以下のセクションを参考にするとよい。

https://cloud.google.com/kubernetes-engine/docs/how-to/deploying-gateways?hl=ja#enable-gateway

## SSL証明書の登録
GCPではGoogleマネージド証明書とセルフマネージド証明書をサポートしている。筆者は他サービスにて取得したセルフマネージド証明書を用いてSSLを設定することとした。SSL証明書と秘密鍵を取得したのち、[このセクション](https://cloud.google.com/kubernetes-engine/docs/how-to/deploying-gateways?hl=ja#deploy_a_global_external_gateway)を参考にしてCertificateMapEntryを作成するところまで行う。

## マニフェストの登録
kubectlのコンテキストがGKE上のクラスタを指していることを確認してから、`kubectl apply -f <FileName>`などのコマンドを用いて以下のファイルをアップロードする。
```yaml:apps.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx-label
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    name: nginx-label

```
```yaml:gateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: external-http
  annotations:
    networking.gke.io/certmap: <CertMapName>
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
  - name: https
    protocol: HTTPS
    port: 443
    
```
```yaml:route.yaml
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: route-external
spec:
  parentRefs:
  - kind: Gateway
    name: external-http
  hostnames:
  - "<DomainName>"
  rules:
  - backendRefs:
    - name: nginx-service
      port: 80
      
```
その後、external-httpに割り当てられたIPアドレス（コンソールで確認するのが簡単、`kubectl describe gateway external-http`などでも可能）をDNSのAテーブルに登録する。ブラウザでアクセスしたり、`curl https://<DomainName>`などと打ち込めばNginxのウェルカムページ(あるいは元のHTML)が表示される。
Pythonで分散分析の事後検定（ANOVA post hoc test）～テューキーの範囲検定

## はじめに
前回の記事 [^1] で一元配置分散分析を行いました。その結論として「ダイヤモンドの価格の平均は色のグレードによって異なる」を得ました。分散分析で有意差があった場合には、対比較（2群間の多重比較）を実施することで、どの群とどの群に差があるかを確認することが出来ます。今回はそれをPythonで実施しようと思います。

## 分散分析の事後検定
さっそくテューキーの範囲検定（Tukey's HSD (honestly significantly different) test）を用いて分散分析の事後検定を行います。

```python
# statsmodels パッケージから pairwise_tukeyhsd() 関数をインポート
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# テューキーの範囲検定を一元配置分散分析に対して実施
tukey_oneway = pairwise_tukeyhsd(endog = diamonds["log_price"], groups = diamonds["color"], alpha = 0.05)

# 結果の表示
print(tukey_oneway.summary())
```
```markdown:出力例
Multiple Comparison of Means - Tukey HSD, FWER=0.05
===================================================
group1 group2 meandiff p-adj   lower  upper  reject
---------------------------------------------------
     D      E  -0.0375 0.2115 -0.0842 0.0092  False
     D      F   0.1455    0.0  0.0986 0.1924   True
     D      G   0.1727    0.0  0.1273 0.2181   True
     D      H   0.3015    0.0  0.2532 0.3499   True
     D      I   0.4061    0.0  0.3522 0.4599   True
     D      J   0.5291    0.0  0.4628 0.5953   True
     E      F    0.183    0.0  0.1406 0.2255   True
     E      G   0.2102    0.0  0.1694  0.251   True
     E      H    0.339    0.0   0.295 0.3831   True
     E      I   0.4436    0.0  0.3936 0.4935   True
     E      J   0.5666    0.0  0.5034 0.6298   True
     F      G   0.0271 0.4477 -0.0139 0.0682  False
     F      H    0.156    0.0  0.1117 0.2003   True
     F      I   0.2605    0.0  0.2103 0.3107   True
     F      J   0.3835    0.0  0.3201 0.4469   True
     G      H   0.1289    0.0  0.0862 0.1716   True
     G      I   0.2334    0.0  0.1846 0.2822   True
     G      J   0.3564    0.0  0.2941 0.4187   True
     H      I   0.1045    0.0   0.053 0.1561   True
     H      J   0.2275    0.0  0.1631  0.292   True
     I      J    0.123    0.0  0.0544 0.1917   True
---------------------------------------------------
```

## 結果の解釈
事後検定は使用可能なすべてのグループ間でペア比較を実行するので、結果の一部だけを解釈します。

### Test 1: D vs. E
まずは帰無仮説($H_0$)と対立仮説($H_1$)を確認しておく。

帰無仮説($H_0$)：色のグレードがDと色のグレードがEのダイヤモンドの価格は同じである。
```math
H_0 : 𝑝𝑟𝑖𝑐𝑒_d = 𝑝𝑟𝑖𝑐𝑒_e
```

対立仮説($H_1$)：色のグレードがDと色のグレードがEのダイヤモンドの価格は同じでない。
```math
H_1 : 𝑝𝑟𝑖𝑐𝑒_d ≠ 𝑝𝑟𝑖𝑐𝑒_e
```
#### 解釈
p-adjが0.2115であり、rejectがFalseとなっていることから、「色のグレードがDと色のグレードがEのダイヤモンドの価格は同じである」という帰無仮説を有意水準5%で棄却できない。つまり、「色のグレードがDと色のグレードがEのダイヤモンドの価格に（統計的に有意な）差はない」と言えます。

### Test 2: D vs. F
ここでも先に帰無仮説($H_0$)と対立仮説($H_1$)を確認しておく。

帰無仮説($H_0$)：色のグレードがDと色のグレードがFのダイヤモンドの価格は同じである。
```math
H_0 : 𝑝𝑟𝑖𝑐𝑒_D = 𝑝𝑟𝑖𝑐𝑒_F
```

対立仮説($H_1$)：色のグレードがDと色のグレードがFのダイヤモンドの価格は同じでない。
```math
H_1 : 𝑝𝑟𝑖𝑐𝑒_D ≠ 𝑝𝑟𝑖𝑐𝑒_F
```
#### 解釈
p-adjが0.0であり、rejectがTrueとなっていることから、「色のグレードがDと色のグレードがFのダイヤモンドの価格は同じである」という帰無仮説を有意水準5%で棄却する。つまり、「色のグレードがDと色のグレードがFのダイヤモンドの価格に（統計的に有意な）差がある」と言えます。

### 以下略

## 結論
帰無仮説を棄却できないのはDとE、それとFとGになります。従って（このデータ分析に従うのであれば）ダイヤモンドを買う時に色のグレードがDとE、FとGで迷った場合は色のグレードが良い方（DとF）を買っても価格に差はないのでお得、ということになります。


[^1]: Pythonで一元配置分散分析（One-way ANOVA）を実施する - Qiita https://qiita.com/tatsu_sekine/items/d0e4ff35289b7c48ba7e
UbuntuのCockpitでネットワークを管理できるようにする方法

Ubuntu24.04で固定IPを設定しているマシンのcockpit上でネットワークを扱えるようになるまでに苦労したので備忘録を書いておく．IPアドレスやファイル名などは環境に合わせて読み替えてください．
# 前提条件
 - Ubuntu24.04にCockpitを導入していること．
# 固定IPの設定
/etc/netplan/99_config.yaml 等のファイルを作成し，下記の様にIPアドレスなどを設定する．
```
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s31f6:
      addresses:
      - "192.168.10.102/24" #ノードのIPアドレス，ネットマスク
      nameservers:
        addresses:
        - 127.0.0.1 #このノード自体がDNSなのでこうなる(環境に合わせて変えてください)
      routes:
       - to: default
         via: 192.168.10.1 #いわゆるデフォルトゲートウェイ
```
このファイルはセキュリティ上 `$ sudo chmod 600 /etc/netplan/99_config.yaml `すること．

# NetworkManagerでの管理に変更

```
$ sudo netplan generate
$ sudo netplan apply
$ sudo systemctl start NetworkManager
$ sudo systemctl enable NetworkManager
```
を実行する．記憶が怪しく間違っているかもしれません．もしそうなら指摘願います．
paizaラーニングレベルアップ問題集の「1つのデータの入力」と「1行のデータの入力」をやってみた。

paizaラーニングレベルアップ問題集の[1つのデータの入力](https://paiza.jp/works/mondai/stdin/stdin_1)と[1行のデータの入力](https://paiza.jp/works/mondai/stdin/stdin_1_line)をやってみました。をやってみました。
- - -
##### 問題
###### 1つのデータの入力
https://paiza.jp/works/mondai/stdin/stdin_1
###### 1行のデータの入力
https://paiza.jp/works/mondai/stdin/stdin_1_line
- - -
:::note info
コードが1つの言語は2問共通のコードです。
:::
- - -
##### C
###### 1つのデータの入力
```c
#include <stdio.h>

int main() {
	char s[101];
	scanf("%s", s);
	printf("%s\n", s);
	return 0;
}
```
- - -
###### 1行のデータの入力
```c
#include <stdio.h>

int main() {
	char s[102];
	printf("%s", fgets(s, sizeof(s), stdin));
	return 0;
}
```
- - -
##### C++
###### 1つのデータの入力
```cpp
#include <iostream>
using namespace std;

int main() {
	string s;
	cin >> s;
	cout << s << endl;
	return 0;
}
```
- - -
###### 1行のデータの入力
```cpp
#include <iostream>
using namespace std;

int main() {
	string s;
	getline(cin, s);
	cout << s << endl;
	return 0;
}
```
- - -
##### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		Console.WriteLine(Console.ReadLine());
	}
}
```
- - -
##### Go
###### 1つのデータの入力
```go
package main
import "fmt"

func main() {
	var s string
	fmt.Scan(&s)
	fmt.Println(s)
}
```
- - -
###### 1行のデータの入力
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	if scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}
```
- - -
##### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println(sc.nextLine());
		sc.close();
	}
}
```
- - -
###### 1つのデータの入力
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println(sc.next());
		sc.close();
	}
}
```
- - -
##### JavaScript
```js
console.log(require("fs").readFileSync("/dev/stdin", "utf8").trim());
```
- - -
##### Kotlin
```kotlin
fun main() {
	println(readLine())
}
```
- - -
###### 1つのデータの入力
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	println(sc.next())
	sc.close()
}
```
- - -
##### PHP
```php
<?php
	echo trim(fgets(STDIN)) . PHP_EOL;
?>
```
- - -
##### Perl
```pl
chomp(my $s = <STDIN>);
print "$s\n";
```
- - -
##### Python3
```py
print(input())
```
- - -
##### Ruby
```rb
puts gets
```
- - -
##### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	println(readLine())
}
```
- - -
##### Swift
```swift
print(readLine()!)
```
PostgreSQLでSELECTする時はORDER BYを付けよう

PostgreSQLに慣れるため基本的なクエリをいくつか実行していたときのこと。
```SELECT```を実行したときの結果と、```SELECT DISTINCT```を実行したときの結果で、表示順が違いました。

## 実行環境
```
❯ psql --version
psql (PostgreSQL) 14.15 (Homebrew)
```

## ```SELECT```実行結果
```
sample_sql_crud=# SELECT  first_name, last_name, sex, enrolled_at FROM users;
 first_name | last_name | sex | enrolled_at 
------------+-----------+-----+-------------
 James      | Smith     |   1 | 2019-10-01
 Robert     | Johnson   |   1 | 2019-10-01
 Linda      | Brown     |   2 | 2019-12-01
 William    | Miller    |   1 | 2019-12-01
 Elizabeth  | Taylor    |   2 | 2020-02-01
 Maria      | Davis     |   2 | 2020-02-01
 Richard    | Jones     |   1 | 2020-04-01
 Jennipher  | Moore     |   2 | 2020-04-01
 Richard    | Jones     |   1 | 2020-04-01
(9 rows)
```

## ```SELECT DISTINCT```実行結果
```
sample_sql_crud=# SELECT DISTINCT first_name, last_name, sex, enrolled_at FROM users;
 first_name | last_name | sex | enrolled_at 
------------+-----------+-----+-------------
 James      | Smith     |   1 | 2019-10-01
 Jennipher  | Moore     |   2 | 2020-04-01
 Robert     | Johnson   |   1 | 2019-10-01
 Elizabeth  | Taylor    |   2 | 2020-02-01
 Richard    | Jones     |   1 | 2020-04-01
 William    | Miller    |   1 | 2019-12-01
 Linda      | Brown     |   2 | 2019-12-01
 Maria      | Davis     |   2 | 2020-02-01
(8 rows)
```

この結果を見て疑問が湧いてきました。
- なぜDISTINCTをすると表示順序が変わるのだろう？
- そもそもSELECTでは表示順序は毎回同じなのだろうか？

## 公式ドキュメントを見よう！
疑問が湧いたら公式ドキュメントを見よう！
ということで見てみました。
https://www.postgresql.org/docs/14/sql-select.html#SQL-ORDERBY

> If the ORDER BY clause is specified, the returned rows are sorted in the specified order. If ORDER BY is not given, the rows are returned in whatever order the system finds fastest to produce. (See ORDER BY Clause below.)

```ORDER BY``` 句がない場合は、システムが最速で生成できると判断した順序で表示する。としか書かれていません。
```SELECT```を複数回実行するとき、各回において表示順の一貫性は保証されないようです。
また、```SELECT DISTINCT```の結果が```SELECT```の結果と違う順序で表示されるのは、2つのクエリが内部的に異なるプロセスで計算されているため、最速で生成できる順序も異なるからだと思われます。

## 結論: SELECTでは表示順は保証されない
結論としては、PostgreSQLのSELECTでは**表示順は保証されない／表示順を保証したければORDER BYを付ける必要がある**ということでした。

PostgreSQLの公式ドキュメントは比較的読みやすくてありがたいです！
MM_T-Code集合

SE11:查看数据的结构
SE16N:查看完整的表
SE38: 程序的创建、修改和执行

✅ 1. 采购相关（采购申请、采购订单等）
ME21N	创建采购订单（Create Purchase Order）。
ME22N	修改采购订单（Change Purchase Order）。
ME23N	显示采购订单（Display Purchase Order）。
ME51N	创建采购申请（Create Purchase Requisition）。
ME52N	修改采购申请（Change Purchase Requisition）。
ME53N	显示采购申请（Display Purchase Requisition）。
ME59N	自动从采购申请创建采购订单

✅ 2. 收货与发票处理
MIGO	货物移动（包括收货、转储、退货等）
MIRO	输入供应商发票（Invoice Verification）
MRBR	释放阻塞的发票

✅ 3. 主数据管理（物料、供应商）
MM01	创建物料主数据
MM02	更改物料主数据
MM03	查看物料主数据
ME11	创建采购信息记录（Info Record）
ME12	更改采购信息记录
ME13	查看采购信息记录
MK01	创建供应商主数据（基于采购组织）
MK02	更改供应商主数据
MK03	查看供应商主数据

✅ 4. 库存管理 / 库存查看
MB51	查看物料凭证清单（Material Doc List）
MB1C	初始库存创建
MB5B	截止日期库存
MB52	库存数量查看（按存储位置）
MMBE	库存明细查看（分层结构）

✅ 5. 报表 / 分析
ME2N	查询采购订单（按采购文档）
ME2L	查询采购订单（按供应商）
ME2M	查询采购订单（按物料）
ME80FN	综合采购订单分析报表

✅ 6. 其他常用事务码
ME41~ME43	询价单（RFQ）创建/更改/显示
ME51~ME53	老版采购申请创建/更改/显示
SE16N	查看表数据（如EKPO、EKKO等）
SE93	查询事务码对应程序名

【第1阶段】主数据基础（必学！）
一切操作的基础是：物料主数据、供应商主数据、采购信息记录
| 操作内容     | T-code  | 说明                   |
| -------- | ------- | -------------------- |
| 创建物料主数据  | `MM01`  | 创建物料（定义品目）           |
| 查看物料主数据  | `MM03`  | 检查已有物料数据             |
| 创建供应商主数据 | `MK01`  | 为某个采购组织创建供应商         |
| 创建采购信息记录 | `ME11`  | 连接物料 + 供应商 +条件信息     |
| 表数据查看    | `SE16N` | 查表如 MARA、EINA、LFA1 等 |
📌 建议目标：了解品目的“品目组”、“评估类”、“基本单位”等字段含义

【第2阶段】采购申请（PR）
新采购需求产生后，需先做“采购申请”（内部需求）
| 操作内容      | T-code            | 说明            |
| --------- | ----------------- | ------------- |
| 创建采购申请    | `ME51N`           | 由用户或系统自动创建 PR |
| 更改/查看采购申请 | `ME52N` / `ME53N` | 更改或查看 PR      |
| 查询采购申请状态  | `ME5A`            | 按创建人或物料查询 PR  |
📌 建议目标：理解“需求日期”、“数量”、“账户分配”等字段含义

【第3阶段】采购订单（PO）
采购员根据 PR 创建正式采购订单，交由供应商执行
| 操作内容      | T-code            | 说明                 |
| --------- | ----------------- | ------------------ |
| 创建采购订单    | `ME21N`           | 手动或从 PR 转化创建 PO    |
| 更改/查看采购订单 | `ME22N` / `ME23N` | 核对 PO 内容，如价格/交货日等  |
| 自动生成 PO   | `ME59N`           | 批量将 PR 转为 PO（自动采购） |
📌 建议目标：理解 PO 的“凭证类型”、“行项目”、“条件”等内容

【第4阶段】收货入库（GR）
收到货物后需在系统中登记入库，更新库存
| 操作内容   | T-code | 说明               |
| ------ | ------ | ---------------- |
| 物料收货   | `MIGO` | 收货、转储、退货等都用 MIGO |
| 查看物料凭证 | `MB51` | 查看历史收货记录         |
| 查看库存明细 | `MMBE` | 查看各存储地点库存（很常用）   |
📌 建议目标：熟悉 MIGO 界面、Movement Type（101、122 等）

【第5阶段】发票处理（IR）
收到供应商发票后，需在 SAP 中登记，用于财务付款
| 操作内容       | T-code | 说明             |
| ---------- | ------ | -------------- |
| 输入发票（三方匹配） | `MIRO` | 发票匹配 PO 与收货    |
| 释放阻塞发票     | `MRBR` | 当价格或数量差异导致系统阻塞 |
📌 建议目标：理解“GR/IR清账原理”、“三方匹配”

【第6阶段】采购报表分析（查询）
日常工作中需要查各种采购数据、库存信息
| 操作内容         | T-code   | 说明         |
| ------------ | -------- | ---------- |
| 查看PO列表（按供应商） | `ME2L`   | 查询供应商的采购订单 |
| 查看PO列表（按物料）  | `ME2M`   | 查询物料相关订单   |
| 综合采购报表       | `ME80FN` | 一网打尽，强力推荐  |
| 截止库存查看       | `MB5B`   | 某日期的库存快照   |
| 存储地点库存       | `MB52`   | 按存储地点查看库存  |

📌 建议学习顺序总结（行动路径）
コピーする
編集する
主数据 → 采购申请 → 采购订单 → 收货 → 发票处理 → 报表查询
每个阶段掌握基本操作（如 ME21N + MIGO + MIRO）后再深入字段逻辑和表结构。
【Laravel】Webアプリの開発について③

前回に引き続きWebアプリの開発について、記載していきます。

今回は、ルーティングの続きからやっていきます。
<a href="https://qiita.com/ai-aiaika/items/ce8f0ea438f2966d7e96">前回の記事はこちら</a>


ルーティングのroutes/web.phpから記載が完了したら、「app/Http/ContactFormController.php」に返すものが必要なので、return viewを記載していきます。
「`contacts.index`」フォルダ名ドットファイル名と記載します。
```app/Http/ContactFormController.php
public function index
{
    return view(`contacts.index`);
}
```

次に、viewsのフォルダの中に、「contacts」のフォルダを作り、「index.blade.php」のファイルを作成します。
```views/contacts/index.blade.php
contacts.index
```
「php artisan serve」と簡易サーバーを立ち上げます。
Viewが返されているかサイトで確認するため、「https://127.0.0.1:8000/contacts」
とアクセスします。
すると、上記のファイルに記載されていました
```views/contacts/index.blade.php
contacts.index
```
がViewとして表示されているかと思われます。

# Laravelのログイン画面について

下記のログイン画面はどのように表示されているか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/cbc57a02-9f49-d022-6d4b-263441c342f9.png)

コードの場所は「resources/views/auth/login.blade.php」
<x-guest-layout> 
頭にx-とつくのはBladeコンポーネント(部品) 
クラスをつかうパターン 
 app/View/Components/配下 
 使わないパターン 
resources/views/components/配下

先にresources側を見て、なかったらクラス側も見てみましょう！


# スロットについて
ヘッダー・フッターなど 共通の箇所をまとめたり 
一部だけ他の表示に差し替えたりできる機能となります。
```layouts/guest.blade.php 
{{ $slot }}　
<x-auth-card> 
 <x-slot name="logo"> //名前付きスロット 
</x-auth-card> 
x-auth-card.blade.php 
15
 {{ $logo }} //名前付きスロット
 ```
PythonでExcelワークシートにピボットグラフを作成する

ピボットグラフは、ピボットテーブルに基づいて作成されるExcelグラフであり、複雑なデータセットから有益な情報を抽出し、直感的で分かりやすいデータの可視化を提供します。頻繁に更新が必要な場合や大量のデータを処理する必要がある方、データに基づいて意思決定を行う方にとって、Pythonを使用してExcelでピボットグラフを作成することで、最新データに基づいた分析グラフを迅速に調整・生成でき、業務効率の向上やデータ分析の柔軟性を高めることが可能です。この記事では、**PythonでExcelワークシートにピボットグラフを作成する方法**を紹介します。

- **[PythonでExcelワークシートにピボットグラフを作成する](#pythonでexcelワークシートにピボットグラフを作成する)**

この記事で使用する方法では、[Spire.XLS for Python](https://jp.e-iceblue.com/introduce/spire-xls-for-python.html)が必要です。PyPIからインストールしてください：`pip install spire.xls`

## PythonでExcelワークシートにピボットグラフを作成する
まず、`Worksheet.PivotTables.get_Item()`メソッドを使用してExcelワークシートからピボットテーブルを取得します。その後、取得したピボットテーブルをもとに`Worksheet.Charts.Add()`メソッドを使用してピボットグラフを作成し、必要に応じてフォーマット設定を行います。以下に具体的な手順を示します：

1. `Workbook`クラスと`ExcelChartType`をインポートします。
2. `Workbook`クラスのインスタンスを作成します。
3. `Workbook.LoadFromFile`メソッドを使用してExcelファイルをロードします。
4. `Workbook.Worksheets.get_Item()`メソッドを使用してピボットテーブルが存在するワークシートを取得します。
5. `Worksheet.PivotTables.get_Item()`メソッドを使用してピボットテーブルを取得します。
6. `Worksheet.Charts.Add`メソッドを使用して、選択したピボットテーブルを基にグラフを作成します。
7. 新しく作成したピボットグラフの位置を設定します：`Chart`クラスの`TopRow`、`LeftColumn`、`BottomRow`、`RightColumn`プロパティを設定して、グラフの位置をワークシート上で指定します。
8. `Chart.ChartTitle`プロパティを設定して、グラフのタイトルを設定します。
9. `Workbook.SaveToFile`メソッドを使用して、変更を加えたワークブックを保存します。
10. リソースを解放します。

**コード例**
```python
from spire.xls import Workbook, ExcelChartType

# Workbookオブジェクトを作成
workbook = Workbook()

# Excelファイルを読み込む
workbook.LoadFromFile("Sample.xlsx")

# ピボットテーブルが含まれるワークシートを取得
sheet = workbook.Worksheets.get_Item(0)

# ピボットテーブルを取得
pivotTable = sheet.PivotTables.get_Item(0)

# ピボットチャートを作成
pivotChart = sheet.Charts.Add(ExcelChartType.BarStacked, pivotTable)

# グラフの位置を設定
pivotChart.TopRow = 2
pivotChart.LeftColumn = 8
pivotChart.BottomRow = 25
pivotChart.RightColumn = 16

# グラフのタイトルを設定
pivotChart.ChartTitle = ""

# ワークブックを保存
workbook.SaveToFile("output/Excelピボットグラフ.xlsx")
workbook.Dispose()
```

結果
![PythonでExcelワークシートにピボットグラフを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/1078c458-f98f-7ec1-d64d-70f05c67b29d.png)

この記事では、Pythonを使用してExcelワークシートにピボットグラフを作成する方法を解説し、具体的な手順とコード例を提供します。

[無料ライセンス申請](https://www.e-iceblue.com/TemLicense.html)
CLIとGUIの違いを初心者向けに解説！どっちを使うべき？

コンピュータやソフトウェアを操作するとき、私たちが使う方法は主に2つあります。それが **CLI（コマンドラインインターフェース）** と **GUI（グラフィカルユーザーインターフェース）** です。この2つにはそれぞれ特徴があり、用途や使い方によって向き不向きがあります。この記事では、初心者でもわかりやすいようにCLIとGUIの違いを解説します！
※この記事は、ChatGPTの出力を基に作成しています。

---

## CLIとは？
**CLI（Command Line Interface）** は、キーボードを使ってコマンドを入力して操作する方法です。黒い画面にテキストを打ち込むシンプルな操作が特徴です。

### CLIの特徴
- **操作方法**: キーボードでコマンドを入力。
  - 例: フォルダを作る → `mkdir 新しいフォルダ`
- **柔軟性**: 複雑な設定や操作も簡単にできる。
- **速さ**: コマンドを覚えればGUIよりも素早く操作可能。
- **学習のハードル**: 初心者にはコマンドを覚えるのが難しく感じることも。

### CLIのメリット・デメリット
#### メリット
- システムの深い部分まで操作できる。
- 作業を自動化（スクリプト）するのに便利。
#### デメリット
- 覚えることが多く、最初は慣れるまで時間がかかる。
- タイプミスでエラーが出やすい。

---

## GUIとは？
**GUI（Graphical User Interface）** は、画面上のアイコンやボタンをクリックして操作する方法です。WindowsやMacのデスクトップ画面、スマートフォンのアプリなど、ほとんどの人が日常的に使っています。

### GUIの特徴
- **操作方法**: マウスやタッチパネルで直感的に操作。
  - 例: フォルダを作る → 右クリック → 「新規作成」をクリック。
- **直感的**: 初心者でもすぐに操作できる。
- **柔軟性**: 一部の細かい設定はCLIほど簡単にはできない場合も。
- **学習のハードル**: ボタンやアイコンの意味さえ分かれば簡単。

### GUIのメリット・デメリット
#### メリット
- 視覚的でわかりやすい。
- 誰でもすぐに使える。
#### デメリット
- CLIに比べて細かい設定がしにくいことがある。
- 複雑な操作はかえって時間がかかることも。

---

## CLIとGUIの違いを具体例で比較
| 操作内容          | CLIの方法                       | GUIの方法                        |
|-------------------|--------------------------------|---------------------------------|
| **フォルダを作成** | `mkdir 新しいフォルダ`          | 右クリック → 「新規作成」        |
| **ファイルを削除** | `rm ファイル名`                 | ファイルを右クリック → 「削除」 |

CLIはキーボードでのコマンド入力が中心ですが、GUIは視覚的に分かりやすいボタン操作で進められます。

---

## CLIとGUI、どちらを使うべき？
- **初心者の場合**: 最初はGUIがおすすめです。視覚的に操作できるので学習コストが低く、直感的に使えます。
- **効率を求める場合**: CLIを学ぶと、特定の操作を高速にこなしたり、作業を自動化したりできるようになります。

---

## 結論
CLIとGUIはどちらも長所と短所がありますが、**必要に応じて使い分ける**ことが大切です。例えば、日常の簡単な操作にはGUIを、効率が求められる専門的な操作にはCLIを使うと良いでしょう。少しずつCLIを学んでいくことで、より便利にコンピュータを活用できるようになりますよ！

あなたもぜひ、自分に合った方法を見つけてみてください！
行政事務標準文字GJ002503・GJ002718・GJ002719はGJ002720と同じ字なのか

![GJforU+5C58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/26d0c491-0249-c990-0e64-0deaf9b737c4.png)

[行政事務標準文字](https://www.digital.go.jp/policies/local_governments#character)をざっと眺めていて、上記の4字の扱いに悩みこんでしまった。戦前の台湾では、この漢字(末っ子を意味するらしい)が普通に使われていたので、この漢字が日本の戸籍に現れてくること自体は何の不思議もない。ただし[『標準漢字表』](https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/sisaku/enkaku/pdf/11_big_05.pdf)(昭和17年6月)には、この漢字は含まれておらず、どの字体で書くべきかハッキリしていなかった。中華民國教育部『次常用國字標準字體表』(1982年12月20日)は、00732「屘」をGJ002720の字体で示したが、[日本の法務省はこの漢字のデジタル化を全て拒否する態度に出た](https://qiita.com/KoichiYasuoka/items/27e542438cf3099805a2)ため、私(安岡孝一)個人としては、かなり困ったことになっている。戦前の台湾は日本の一部だったし、日本国籍を選択した人たちもたくさんいたんだけどなあ。
【2024最新】これからの時代はAIアバター必須！？AIアバターと使用例についてわかりやすく解説！

はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/40742d8c-f412-ab3c-e7e0-a05256bea034.png)
近年、AI技術の進化により、私たちの日常生活やビジネス環境が大きく変化しています。
その中でも注目を集めているのが「ＡＩアバター」です。
主にＳＮＳやビジネスシーンで使われるAIアバターは、効率的かつ個性的なコミュニケーション手段として広がりを見せています。
本記事では、AIアバターの概要から具体的な活用例、メリットや課題、さらにおすすめのサービスまで詳しく解説します！
「AIアバターとは何なのか」「どんな活用方法があるのか」を知りたい方にびったりの内容です！

AIアバターとは？
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/f2f29be0-8985-37f9-a654-a2bfb881c564.png)
ＡＩアバターとは、人工知能を活用してつくられたデジタルキャラクターを指します。
これらはＳＮＳやウェブサイト、ビジネスツールで使われ、個人や企業の顔として重要な役割を果たします。
ＡＩアバターの特徴は、そのカスタマイズ性です。
ＡＩアバターは、ユーザーの好みに応じて外見や声、性格などを細かく設定可能であり、ご自身の用途や目的に合ったアバターを作成することができます。
さらに、ＡＩによる会話機能が搭載されている場合、リアルタイムでのやり取りが可能な点も特徴のひとつです。

AIアバターの使用例
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/8d2efb9a-d174-6e9b-5351-d71d6501f36f.png)
ＳＮＳや動画配信
ＡＩアバターは、ＳＮＳや動画配信において顔出しを避けたい方に便利です。
オリジナルのＡＩアバターをプロフィール画像や動画に使用することができます。
学習支援
さらに、ＡＩアバターがオンライン家庭教師として、生徒にマンツーマンで学習支援を行うツールも増加しています。
カスタマーサービス
ビジネスの面では、顧客対応用に設計されたＡＩアバターの使用例があります。
２４時間体制で問い合わせに対応することができるため、人件費削減や社員の負担を減らす効果があります。
エンターテイメント
また、人間と区別がつかないほどのリアルなＡＩアバターがアイドルとしてデビューしたり、映画ゲームに登場する例も普及しています。

AIアバターのメリットとこれからの課題
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/982f9d18-fe1b-a1af-0aa8-5e1f08064783.png)
ＡＩアバターのメリットとして、まずコスト削減が挙げられます。
カスタマーサービスやプロモーション活動を効率化できる点は、ＡＩアバターを利用する大きなメリットとなります。
さらに、多言語対応もメリットのひとつとして挙げることができます。
ＡＩによる自動翻訳機能が搭載されることで、グローバルな場面での活用や展開に役立てることができます。
最後に、24時間での対応が可能な点は、ＡＩアバターのもっとも大きなメリットの一つといえるでしょう。
深夜や休日でも対応可能なため、ＡＩアバターが普及することで、私たちの働き方が大きく変わっていく可能性があります。
しかし同時に、ＡＩアバターには課題もあります。
ます、ＡＩアバターには初期購入コストがかかります。
特に高品質なアバターには時間と費用が掛かる場合があるため、ＡＩアバターの品質には個体によって大きな差があります。
つぎに、個人情報を扱うＡＩアバターは、プライバシーの侵害を行わないことや個人情報の保護が喫緊の課題とされています。

おすすめのAIアバターサービス3選
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/0d847f0b-3a24-f281-5117-67cc09c87f60.png)
1.	Synthesia
Synthesiaは、ビデオ制作に特化したAIアバター作成ツールです。
商品紹介や商品説明ビデオに登場するバーチャルプレゼンターとして、企業向けの研修動画や商品説明用のAIアバターを作成するのに最適なツールといえるでしょう。
2.	Ready Player Me
Ready Player Meは、ゲームやめたバース用の３Dアバターを簡単に作成することができます。
作成したAIアバターをゲーム内キャラクターとして使用することで、バーチャルイベントやオンラインゲームなどで活用することができます。
3.	Zepeto
Zepetoは、個人でも簡単にAIアバターを作成することができるSNS向けのアプリです。
自分専用のキャラクターを作成して友達や周囲の人と共有することができ、個人利用やSNSアイコンなどに最適なアプリといえます。

まとめ
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/a7e57568-6615-56f1-5f4b-ee5631fe4adb.png)
AIアバターは、日常生活からビジネスまで、私たちの未来を大きく変える可能性を秘めているツールです。
SNSやマーケティング活動を効率化したり、よりリアルなオンライン体験を提供したりと、その用途は無限大です。
AIアバターに興味が湧いた方は、まずは無料で利用できるツールを試してみるのはいかがでしょうか？
これからの未来にAIアバターを導入することで、日常生活や仕事がさらに豊かになるかもしれません！

おわりに
いかがでしたでしょうか？
少しでも楽しんで記事をお読みいただけたら幸いです！
また、AIと関連して、私は動画の手ぶれ補正を行うことができるAIツールも使っているので、最後に少しだけそちらもご紹介します。
UniFab オールインワンというAI動画編集ツールなのですが、このソフトひとつで動画のノイズ除去や動画の高画質化、HDRとSDRの変換などまで行うことができるので、本当に便利です！
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982439/c8257af0-711a-c203-4fdb-4513b117f22b.png)
（出典: UniFab オールインワン）
少しでも気になる！という方は、公式サイトから製品情報をながめてみるのもいいかもしれませんね！
では、またお会いしましょう！
最善の書き込み方法について（主に速度）②※注意

前回の記事
https://qiita.com/sionnct/items/05ac79a839c50f3f4f13#comment-191cf61e22eb8bd0c721
ではコレクションとデータベースの両方を書き込むと言うことでしたが
削除するときには順番に注意が必要です。
もちろんConcurrentを使って下記の様にしたいのですが
ギャラリーのItemをコレクションにした想定で
```
Concurrent(
    Remove(速度テスト,LookUp(速度テスト,ID=Gallery.Selected.ID)),
    Remove(col速度テスト,Gallery.Selected)
)
```
としたくなるのですがConcurrentを利用するとどちらが先に実行されるかわかりません。
そのため
```
Remove(col速度テスト,Gallery.Selected)
```
こちらが先に実行された場合
```
Remove(速度テスト,LookUp(速度テスト,ID=Gallery.Selected.ID))
```
この結果が変わる、もしくはエラーとなる可能性があるので
おとなしく
```
Remove(速度テスト,LookUp(速度テスト,ID=Gallery.Selected.ID));
Remove(col速度テスト,Gallery.Selected)
```
とするのが良いです。
FMRを開発していた頃のはなし③

# 割り当てられたパソコン
配属して最初に割り当てられたパソコンは、FMR-60HXだった。コードネームは「Raman」(だったと思う)。上位機種にFMR-70HX「Morgan」があった。FMRの2世代目で、初代はFMR-60FD/HD「Compton」、フロッピーディスクドライブのみのモデルとハードディスクドライブ搭載モデルだった。少し遅れてFMR-70FD/HD「Alder」が登場。FMR-60のCPUはIntel 80286、FMR-70は80386だったと記憶している。この頃の開発コード名はノーベル賞物理学者で、FM-TOWNSのタウンズもレーザーで賞を取った「Townes」から来ている。
第二設計課で最初に担当したプロジェクトは「A/C/R」と呼称される、FMR-50HE「Astec」、FMR-60HE「Caro」、FMR-70HE「Ribot」、CPUはFMR-70HEが80386DX、それ以外は80386SXで、どれも32ビットになっていた。80386SXは、80386DXのFPU(浮動小数点演算機能)を省いた廉価版である。当時、浮動小数点演算は必要ならオプションでコプロセッサを外付けするのが一般的だった。FMR-50とFMR-60/70の違いは画面の解像度で、FMR-50の方は640×400、FMR-60/70は1120×750の解像度を持ち、前者は漢字フォント1文字を16x16ピクセルで、後者は24×24ピクセルで表現していた。
同じころ、第一設計課では「Venture」FMR-80HLを開発していた。CPUは最新のIntel 80486DX。A/C/RとVentureには共通のコンセプトがあって、筐体(シャーシ)構造に特徴があった。横置きの筐体で、前面からアクセスできる5インチベイが横並びに2つ、下に3.5インチベイが2つあり、5インチベイには、5インチのフロッピーディスクドライブ(FDD)かハードディスクドライブ(HDD)、3.5インチベイには3.5インチFDDかHDDがオプションで用意され、ユーザーが自由に脱着することができた。本体とのインターフェイスは、SCSIとFDDインターフェイス。CD-ROMドライブやMO(光磁気ディスク)ドライブのオプションもあったと思う。ICカードリーダーもあって、PCMCIA規格のICカードに対応していた。FMRのSCSIは、PC-9801と違って「ちゃんとした」SCSIだ、と先輩が自慢げに語っていた。モジュール式になったこれらの補助記憶装置ユニットは自由に脱着できるが、ホットスワップ機構があったわけではないので、抜き差しの際は必ず電源を切る必要があった。フロッピーディスクが入っていると優先的にそちらから起動しようとするが、FMRのMS-DOSには便利なコマンドがあって、「REIPL X:」と打つとHDDが何台つながっていても、任意の(X:)ドライブから起動することができた。
これはのちのちMS-DOSの3.0、3.1、5.0、6.0とバージョン違いや、バージョンが同じでもconfig.sysを変えた違う環境で起動させたいときに便利だったが、一番使ったのは、FM-OASYS、ワープロのFMR版を起動するときだ。そう、FM-OASYSはMS-DOSからコマンドで起動するのではなく、独自OSの上で動作していたのでFM-OASYSのディスクから起動する必要があったのだ。ディスク上のデータ形式も違うので、MS-DOSからはFM-OASYSのデータは参照できなかった。後年、FM-OASYSのWindows版が登場するまでは、MS-DOSの世界とFM-OASYSの世界は全く途絶されていた。しかし、いったんFM-OASYSを起動すると、キーボードはもちろん親指シフトキーボードだったので、ワープロ専用機そのものになるという「すごさ」があった。この快適さを知ってしまうと、他のパソコン用ワープロソフトはとてもじゃないが使えなかった。
# 開発チーム
ぼくが配属されたときのチームメンバーは4人、1つ先輩のN村さんがぼくの教育係でRibotの担当、彼は子会社富士通パーソナルシステムズ(FPS)から出向で来ていた。FPSは長野県松本市に開発拠点があってFM-TOWNSの開発はソフトもハードもここの社員が多く関わっていた。もう一人1つ先輩のK藤さんはAstec担当、富士通高専卒で若く、一時期アムウェイにハマって周りを困らせていた(笑)。全体のとりまとめをしつつCaroを担当するT中さんの下についてこの機種をサブで担当することになった。非常に優秀な人で、穏やかだけど怒るとおっかない。この4人で机を並べていた。隣の列にK高さんとM口さん、製造現場との調整や設計データの管理、法規制対応などを担当していた。課長はK多さん。採用の時面接でぼくをここに引っ張ってきた人。のちに仲人もお願いすることになる。
LinuxコマンドとWindows Serverコマンド対応表 - これで君も両刀使い！⚔️


こんにちは！

**Linux** と **Windows Server**、どちらも **サーバー管理** には欠かせない **OS** ですが、 **コマンド** が全然違うので、 **両方** 使うとなると **混乱** しますよね？

そこで今回は、 **Linuxコマンド** と **Windows Serverコマンド** の **対応表** を作ってみました！

この対応表を見れば、 **Linux** と **Windows Server** の **コマンド** を **簡単** に **比較** することができます。

**どちらかのOS** に **慣れている方** は、 **もう一方のOS** の **コマンド** を **覚える** のに **役立つ** と思います。

**両方のOS** を **使っている方** は、 **コマンド** を **間違える** ことなく、 **スムーズに作業** を進めることができるようになるでしょう。

### この記事の目的

この記事では、 **よく使うコマンド** を中心に、 **Linux** と **Windows Server** の **コマンド対応表** を作成しました。この対応表を **活用** することで、 **どちらのOS** でも **スムーズにコマンド操作** ができるようになり、 **業務効率** を **アップ** させることができます。


### 対応表

| 操作 | Linuxコマンド | Windows Serverコマンド | 補足 |
|---|---|---|---|
| **ファイル・ディレクトリ操作** |  |  |  |
| ファイル一覧を表示 (詳細) | `ls -l` | `dir /l` | `/l`オプションで詳細表示 |
| ディレクトリを作成 | `mkdir ディレクトリ名` | `mkdir ディレクトリ名` |  |
| ディレクトリを削除 (空) | `rmdir ディレクトリ名` | `rmdir ディレクトリ名` |  |
| ディレクトリを削除 (中身ごと) | `rm -r ディレクトリ名` | `rmdir /s /q ディレクトリ名` | `/s`でサブディレクトリも削除、`/q`で確認なし |
| ファイルをコピー | `cp コピー元 コピー先` | `copy コピー元 コピー先` |  |
| ファイルを移動 | `mv 移動元 移動先` | `move 移動元 移動先` |  |
| ファイルを削除 | `rm ファイル名` | `del ファイル名` |  |
| ファイルの内容を表示 | `cat ファイル名` | `type ファイル名` | `more ファイル名`でページ送り表示 |
| ファイルを検索 | `find . -name "ファイル名"` | `dir /s /b ファイル名` | `/s`でサブディレクトリも検索、`/b`でファイル名のみ表示 |
| |  |  |  |
| **ネットワーク** |  |  |  |
| IPアドレスを表示 | `ip a` (または `ifconfig`) | `ipconfig /all` | `/all`で詳細表示 |
| ネットワーク接続を確認 | `ping ホスト名` | `ping ホスト名` |  |
| ネットワーク経路を表示 | `traceroute ホスト名` | `tracert ホスト名` |  |
| |  |  |  |
| **ユーザー管理** |  |  |  |
| ユーザーを追加 | `useradd ユーザー名` | `net user ユーザー名 パスワード /add` | 管理者権限が必要 |
| ユーザーを削除 | `userdel ユーザー名` | `net user ユーザー名 /delete` | 管理者権限が必要 |
| ユーザーのパスワードを変更 | `passwd ユーザー名` | `net user ユーザー名 新しいパスワード` | 管理者権限が必要 |
| |  |  |  |
| **システム情報** |  |  |  |
| システム情報を表示 | `uname -a` | `systeminfo` |  |
| 稼働時間を表示 | `uptime` | `systeminfo \| findstr "システム稼働時間"` |  |
| ディスク容量を確認 | `df -h` | `wmic logicaldisk get size,freespace` | PowerShellでは`Get-PSDrive` |
| メモリ使用量を確認 | `free -h` | `systeminfo \| findstr "物理メモリ"` | PowerShellでは`Get-WmiObject Win32_OperatingSystem \| Select-Object TotalVisibleMemorySize,FreePhysicalMemory` |
| プロセスを表示 | `ps aux` | `tasklist` | PowerShellでは`Get-Process` |
| |  |  |  |
| **その他** |  |  |  |
| コマンドのヘルプを表示 | `man コマンド名` | `help コマンド名` または `コマンド名 /?` |  |
| 現在の日時を表示 | `date` | `date /t` |  |

### まとめ

今回は、 **Linuxコマンド** と **Windows Serverコマンド** の **対応表** を紹介しました。この対応表を **活用** することで、 **どちらのOS** でも **スムーズにコマンド操作** ができるようになり、 **業務効率** を **アップ** させることができます。 **Linux** と **Windows Server** の **コマンド** は **異なる** 部分も **多い** ですが、 **基本的な操作** は **共通** している部分も **あります** 。 **両方のOS** の **コマンド** を **理解** することで、 **より幅広い** **システム管理** に **対応** できるようになるでしょう。

**参考資料**

*   [LinuxコマンドとWindows Serverコマンド対応表 - これで君も両刀使い！⚔️ - Qiita](https://qiita.com/josephmonch/items/d6bd468525bc9e5eae20)
*   [LinuxとWindowsの違いを比較｜両者のメリットや特徴も知っておこう - Midworks](https://mid-works.com/columns/engineer/infrastructure/1139596)
*   [LinuxコマンドとWindowsコマンドの違い - DENET 技術ブログ](https://blog.denet.co.jp/linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8windows%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E9%81%95%E3%81%84/)
【VScode拡張機能】別バージョンのVSIXを、プラットフォームを指定してダウンロード

# 解決方法
`https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-toolsai/vsextensions/jupyter/（バージョン）/vspackage?targetPlatform=（プラットフォーム）`からダウンロードできる。

# 通信内容を覗いてみる

　Firefoxの右上のメニューから、「その他のツール > ウェブ開発ツール > ネットワーク」のタブを出しておくと、通信履歴を見ることができる。ここの「ドメイン名」の欄をクリックすることで、どのドメインからファイルを受け取ったのか、などがわかる。
 　例として、阿部寛のホームページにアクセスしたときのGETメソッドの呼び出し履歴を見てみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735823/aadd5bbf-9616-d85a-56a5-775e8f4c4a31.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735823/07b08c28-cf77-0218-e184-d457504a6bd2.png)
　「http://abehiroshi.la.coocan.jp/top.htm 」というドメインからHTMLファイルを受信していることが分かった。

　次に、[Jupyterの拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)のVSIXファイルをダウンロードするときにどのドメインにアクセスしているか見てみる。なお、執筆時点（2025年1月10日）での最新版は、v2025.1.2025010601である。Linux x64向けのものをダウンロードしてみる。写真の中の、「Linux x64」というボタンからダウンロードできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735823/e4fb4510-45ed-73cf-5473-f49a73195f59.png)
　通信履歴を見てみると、次のようなドメインからファイルを受け取っていることが分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735823/a77aa2c9-cc24-6410-94e0-e1b5599bd01d.png)
　以上のことから、冒頭で示したような方法で別バージョンのVSIXファイルを得ることができる。

# 参考

https://stackoverflow.com/questions/69398500/vscode-download-older-version-of-an-extension
SAP BASIS 担当者必見！ よく使うトランザクションコード集 ⚡️

こんにちは！😊

SAP BASIS のお仕事って、 **トランザクションコード** (TCODE) を覚えるのが大変ですよね？😥

「あれ？あの画面を開くTCODEは何だっけ？ 🤔」

なんて、 **毎日格闘** している方もいるのではないでしょうか？ 😅

そこで今回は、 **SAP BASIS 担当者** なら **知っておくべき** **重要** な **トランザクションコード** を **厳選** して、 **分かりやすく** まとめてみました！

**業務** 別に **分類** しているので、 **「あのTCODEなんだっけ？」** となったときに、 **すぐに** 探せるようになっています。😉

この記事が、 **日々の業務** の **効率化** に少しでも役立てれば嬉しいです！😄


### 対象読者

* SAP BASIS 初心者🔰
* SAP BASIS の TCODE を覚えたい方
* SAP BASIS の業務で効率化を目指したい方


### 記事の目的

* SAP BASIS の学習を始めたばかりで、 **TCODE が多すぎて** 困っていませんか？
* そこで、 **私と同じように SAP BASIS 初心者🔰** の方が、 **スムーズに業務を覚えられるように** 、 **重要** な **TCODE** を **分かりやすく** まとめてみました！


### 用語解説

#### トランザクションコード (TCODE) とは？ 🤔

トランザクションコード (TCODE) とは、 **SAP システム** の **特定の画面** や **機能** を **起動** するための **コマンド** のことです。

TCODE を入力することで、 **メニュー** を **たどることなく** 、 **目的の画面** に **直接アクセス** することができます。

**例えるなら、** **ウェブサイト** の **URL** みたいなものかな？ 🤔

URL を入力すれば、 **目的のページ** に **直接アクセス** できますよね？

TCODE も同じように、 **SAP システム** の **特定の画面** に **直接アクセス** するためのものなんです。


### よく使うトランザクションコード集

#### システム管理 ⚙️

| TCODE | 説明 |
|---|---|
| **SM04** | 現在のSAPシステムにログインしているユーザーを表示 |
| **AL08** | システムログを表示 |
| **ST06** | システムのパフォーマンスを監視 |
| **DB02** | データベースの情報を表示 |
| **RZ10** | システムパラメータを表示・変更 |
| **RZ11** | システムパラメータを表示 |
| **SMLG** | ログファイルを管理 |
| **SP01** | スプール (印刷データ) を管理 |


#### ユーザー管理 🧑‍💼

| TCODE | 説明 |
|---|---|
| **SU01** | ユーザーを登録・変更・削除 |
| **SU02** | ユーザーのパスワードを変更 |
| **SU03** | ユーザーの権限を表示 |
| **PFCG** | ロール (権限のセット) を作成・変更・削除 |


#### トランスポート管理 🔄

| TCODE | 説明 |
|---|---|
| **STMS** | 移送 (トランスポート) を管理 |
| **SE01** | 移送オーガナイザを表示 |
| **SE09** | 移送依頼を表示 |
| **SE10** | 移送依頼を作成・変更・リリース |


#### ワークプロセス管理 ⚙️

| TCODE | 説明 |
|---|---|
| **SM50** | ワークプロセスを表示・管理 |
| **SM66** | すべてのアプリケーションサーバーのワークプロセスを表示 |


#### バックアップとリカバリ 💾

| TCODE | 説明 |
|---|---|
| **DB13** | データベースのバックアップをスケジュール |
| **BRTOOLS** | データベースのバックアップとリカバリを行うためのツール |


#### その他

| TCODE | 説明 |
|---|---|
| **SE38** | ABAPエディタ (ABAPプログラムを作成・編集するためのツール) |
| **SE11** | ABAPディクショナリ (データベースのテーブルや構造を定義するためのツール) |
| **SE80** | オブジェクトナビゲータ (ABAPプログラムやテーブルなどを管理するためのツール) |
| **SM37** | バックグラウンドジョブ (バッチ処理) をスケジュール・監視 |


---

**まとめ**

今回は、 **SAP BASIS** で **よく使う** **トランザクションコード** を **30個** 厳選して解説しました。

これらの **TCODE** を **覚える** ことで、 **日々の業務** を **より効率的に** 行うことができます。

**SAP BASIS** の **学習** を **続ける** ことで、 **もっと** **SAP BASIS** の **世界** を **理解** できるようになると思います。

**頑張って** ください！💪


**もっと詳しく知りたい人は…**

* SAPの公式ウェブサイトを見てみよう！👀
    * [https://www.sap.com/japan/index.html](https://www.sap.com/japan/index.html)
* SAP関連書籍を読んでみよう！📖
    * 図解即戦力 SAP S/4HANAの導入と運用がこれ1冊でしっかりわかる教科書


**参考資料**

* SAP Basisとは何か｜基本から応用までを詳しく解説 - エイジレス
* SAP Basisエンジニアとは？仕事の魅力やキャリアの可能性を徹底解説！
* SAP Basisの運用業務と構築業務の違いを徹底解説！
* SAP Basisの具体的な業務内容と8つの必要スキルを徹底解説！