OmniAICreator/Qiita-1.07M huggingface dataset:
【Ubuntu-GPD Micro】Ubuntu 20.04 LTS『システムプログラムの問題が見つかりました』の対処法

# この記事はこの端末を使っている方へのお話です
この端末を使ってないですか？
端末を使ってなくてもubuntu20.04 LTSをお使いの方なら参考になるかもしれません！

 ![IMG_3152 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/979bafdf-f78e-ea77-ce7e-c2af61b5acb9.png)


# どんな人に参考になるか
- Ubuntu 20.04 LTSを使っている人
- GPD Microを使っている人
- 『システムプログラムの問題が見つかりました』というエラーが表示される方

# この記事の流れ
1. どんなエラーかの説明
2. 最終的にどうなるかの説明
3. エラー解消までの手順を解説

# どんなエラーか
下の画像のように電源を入れると『システムプログラムの問題が見つかりました』というエラーが出てきます。
『問題を報告する』ボタンを押しても、何も起こらないのでどうやって解消すればいいのかわかりませんでした。
PCをシャットダウンして電源を入れる度に出てくるので、さすがに対処しないとと思って色々調べてみました。
![IMG_3173.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/8d24aa14-dde9-70bd-e788-9509e4ba7955.jpeg)

# 最終的にエラーは表示されなくなったけど、ログイン画面が横向きになった

最終的には、エラーは表示されなくなりました。
しかし、ログイン画面は横のままです！
特に支障はないのでこのままにしようと思っています。

![IMG_3176.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/e3cbe67c-d267-7d2c-53b0-ce56b1a89fd4.jpeg)

# 対処法

【注意】クリティカルな処理なのでコマンドの実行は自己責任でお願いします。

## まずはググって参考になりそうな記事を発見
いろいろな記事を読ませていただいたのですが、こちらの記事を参考にさせていただきました。
【pc.casey.jp(Ubuntu 12.04 LTS 「システムプログラムの問題が見つかりました」)】:
https://pc.casey.jp/archives/153902330

## 原因の特定

記事を参考させていただき、クラッシュファイルが関係しているのかな？と思ったので自分のファイルパスも調べてみました。

すると、/var/crash/というディレクトリ内に
『_usr_sbin_lightdm.0.crash』というファイルがありました。

中を見てみると下の画像のようになっていました。
1 ProblemType: Crush
と書いてあってExecutablePathがlightdmとなっていたのでlightdmがcrushしているのかな？
と想像がつきました。

記事に書いてあるコマンドはそのまま打ってません！！！

![IMG_3175.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/daec59b8-ae19-bd17-564d-659ca2ba0404.jpeg)

## ligthdm crushでググる

すると、この記事がヒットしました。
【askubuntu】:
https://askubuntu.com/questions/1363611/lightdm-crash-once-thereafter-login-screen-shows-failed-to-authenticate
どうやら参考になりそうと読んでいくと、以下のようなコマンドが。
lightdmを一回、削除して
aptをupdateして、lightdmを再インストールして
設定を反映する。
みたいなコマンドでした。
このコマンドを打ってみたところ、無事エラーは表示されなくなりました

```
apt purge lightdm
apt update
apt install lightdm
dpkg-reconfigure lightdm
reboot
```

## しかし！画面が反転した！！！

エラーは解決したのですが画面が反転しました。
lightdmの設定がリセットされてしまったのが原因だと思います。

『ディスプレイ設定＞回転』で画面を回転させることで元通りになりました！

![IMG_3178.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/f6298cf1-9fb8-3919-5d44-7b0fb10cf8c5.jpeg)

【ubuntu help(画面の向きを変える)】：
https://sicklylife.jp/ubuntu/1804/help/look-resolution.html

# 最後に
無事直ってよかった！！
今後も文鎮化しないように気をつけようと思います！
Tableau Ord2 振り返り

備忘録として残しておきます。
ポエムに近いかもしれない。

〇ビジュアライゼーションの導入
・数字の裏に何があるかを視覚的に見せる
・Taskを達成するためにビジュアル化する
・チャートは理解するためのツール
　→文字だけで伝える、理解するには時間がかかる。
　 上司にもよく言われることだが限られた時間でパッと理解してもらうためには　
　 絵（≒グラフ）でちゃんと説得力を持たせないといけない

　※ただしクロス集計も特定の値を観たいときに便利なので
　　適切なグラフの組み合わせを行うと良い。　　　　　

〇人の記憶
・センサメモリ…本能的、潜在的
・短期記憶…１度に７つ程度
・長期記憶…個々人の能力による
　→センサメモリを有効なものにして（直感的にわかるビジュアル）
　　短期記憶を有意義な領域へもっていく
　　上の話に通じる。要は一瞬で理解・判断してもらうためには
　　ごちゃついて絵ではダメ。必要な情報を必要なだけ出す。

〇ビジュアライゼーションを作る際にまず
　質問から始める
　→目的から入らず形から入ろうとすると時間を浪費するだけとなる。
　 最初からどのようなイメージを求めているか理解を合わせておくと良い。

ヒトが認知しやすいPreattentive Attributesはどれか？

位置　＞　色　＞　サイズ　＞　形状

・形状
　向き、幅、長さ、囲い、サイズ、形状
・色　※省スペース
　色相、彩度
・位置　
　空間グループ、位置

　→シーンに応じて必要な属性を取捨選択することでより効果的な絵となる。
　 属性ごとに強弱はあるが、表現したい内容と使い方１つで強力な武器になる
　 スペースとの相談もあるので色による表現というものに頼ることが多いが
　 色も多ければよいというものではない　※後述

〇データタイプと相性
・分類的な名義：形状・色相　※つまり相関性や連続性がないデータ
　（例：トヨタ、ダイハツ、日産）
・量的：位置・長さ・サイズ・色の彩度
・順序的な名義：位置・サイズ・色の彩度・色相・形状
・経時的な傾向：折れ線グラフ、面、棒グラフ
・比較とランク付け：棒グラフ
・相関性：散布図・複数の折れ線グラフ
・分布：箱ひげ図、ヒストグラム
　→あくまで一例。表現したいものに応じて使い分けること。
　 個人的に円グラフを毛嫌いする理由はそこまでないと思うので
　 構成比を出す場面では利用するのもよいと思う。　 

〇人がイメージしやすい組み合わせ
・場所：地図
・時間：線グラフ
・比較値：棒グラフ
　※データ数が多い場合は横向きの方がわかりやすい
・相対的割合：ツリーマップ
・関連性：縦横軸グラフ
　→おおむね同意。ただ比率を見る場合においては
　 円グラフも強力なツールだと思っているので利用してよいと思う。

〇なぜ円グラフはおすすめされないのか？
・人の視覚系はパイの見積もりに不向き
・すぐ隣りのパイ同士でしか比較できない
　→つまり比較したいデータ数が多い場合には不向きだと言っている。
　 DataSaberプログラムで分析している内容は
　 最低でも5、多い時には数千のデータの比較なので確かにその場合には不向き。
　 個人的にはデータが3,4程度の比較であればまだ許容範囲かなという印象。

〇色
・不用意にたくさんの色を使用しない
　→１つのビューデは7~10種類程度に制限する(P.20)
　→色ごとの分別や不用意な関連付けが生まれてしまう
・既に位置で視覚化がなされているなら彩度で特徴づけする
・背景色との組み合わせにも注意する
　→色使いに関してはデザインセンス、デザインの知識を多少入れておくべきだが
　 上記のポイントだけでも抑えておくだけで視認性はだいぶ改善される。
　 ※幹部層に説明を入れた際に適当な色遣いをしたスライドに対して
　　 そのデータ同志は何か関連があるのかというツッコミを受けたこともありだいぶ冷や汗をかいた。
　　 意図せぬ意味づけが発生しないよう予め回避しておくべき。
　

〇地図
空間的な質問があるときに利用する
→位置情報持ってるからただ利用するというのはムダ
 地理的意味（距離の近さ、エリア範囲の大小、緯度経度など）が
 データの因果関係に結びつきそうなら積極的に採用してもよいと思う

〇コンテキスト
全員共通なコンテキストを利用すること
　→社会一般の共通認識や特定の集団での共通認識（社内の文化、常識など）を理解すること
　 特定の色や形状が持つ意味を考えて利用すること
　 ※正直何が一般的かというのは難しいと思う…ので
　　 個人的には凡例もちゃんと表示してその色、形状が何を表しているのかは
　　 ちゃんと示しておく方が良いと思っている
　

〇比較値
データを強化してあげるためには比較対象を用意する
棒グラフは非常に効果的
　→先のPreattentive Attributesの強弱にもつながるが
　 棒グラフは位置という強力な属性を持っている。
　 点のプロットでも似たようなことができるが
　 点だと点のサイズが逆に邪魔をして位置をわかりにくくさせることがある。
　 

〇ダッシュボード
・探索型（データの中立性に基づく）
・説明型（意見が明確、ストーリーテリング）
　-ビューの数は3，4程度に制限すべき
　-強調すべき点を整理して、伝わりやすくする
　-データから情報を抽出
→自分の経験上の話で、探索型ダッシュボードを作成していて思うのだが
 提示するデータ量が大きくなりがちなことが多い。
 分析対象となるあらゆるデータをある程度網羅しつつ
 Viewerが探索できるようにする、となると殊更。
 おそらくここでServerの要否というのが出てくるのかなと思っている。

〇ツールヒントを効果的に活用するには
・必要な情報に絞り、わかりやすい文言とフォントに変更する
　→ツールヒントも便利機能だがスペースが限られていることと
　 あまりにたくさん詰め込むと肝心なVizにかぶさってしまう。
　 最低限に絞りつつ、個人的にはViz上にちゃんと表現する方法を選びたい。

【デザインについて】
考えなくてもわかる自然なデザインを目指す
　→最初の話に戻るがTaskのための理解・判断に時間を取らせてはいけない
　 一目で観て、一瞬で判断してもらうようなVizづくりのためにも
　 Viz作成の経験値、ならびに表現方法をため込んでいくのが良い。
　 ※のちに出てくるデータは見られると美しくなるに通じる。
cscの作法 その395

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
directshowlibでmp3ファイルを再生せよ。

# サンプルコード

```

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;

namespace App
{
	class Program {
		static void Main(string[] args) {
			Console.WriteLine("start");
			IGraphBuilder pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph();
			IMediaControl pMediaControl = (DirectShowLib.IMediaControl) pGraphBuilder;
			IMediaEvent pMediaEvent = (DirectShowLib.IMediaEvent) pGraphBuilder;
			pMediaControl.RenderFile(@"test1.mp3");
			IVideoWindow pVideoWindow = (DirectShowLib.IVideoWindow) pGraphBuilder;
			pVideoWindow.put_FullScreenMode(OABool.True);
			pMediaControl.Run();
			EventCode code;
			pMediaEvent.WaitForCompletion(1000, out code);
			pVideoWindow.put_FullScreenMode(OABool.False);
			Marshal.ReleaseComObject(pGraphBuilder);
			pGraphBuilder = null;
			Marshal.ReleaseComObject(pMediaControl);
			pMediaControl = null;
			Marshal.ReleaseComObject(pMediaEvent);
			pMediaEvent = null;
			Console.WriteLine("end");
		}
	}
}
```


以上。
cscの作法 その394

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
directshowlibでwavファイルを再生せよ。

# サンプルコード

```

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;

namespace App
{
	class Program {
		static void Main(string[] args) {
			Console.WriteLine("start");
			IGraphBuilder pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph();
			IMediaControl pMediaControl = (DirectShowLib.IMediaControl) pGraphBuilder;
			IMediaEvent pMediaEvent = (DirectShowLib.IMediaEvent) pGraphBuilder;
			pMediaControl.RenderFile(@"test1.wav");
			IVideoWindow pVideoWindow = (DirectShowLib.IVideoWindow) pGraphBuilder;
			pVideoWindow.put_FullScreenMode(OABool.True);
			pMediaControl.Run();
			EventCode code;
			pMediaEvent.WaitForCompletion(1000, out code);
			pVideoWindow.put_FullScreenMode(OABool.False);
			Marshal.ReleaseComObject(pGraphBuilder);
			pGraphBuilder = null;
			Marshal.ReleaseComObject(pMediaControl);
			pMediaControl = null;
			Marshal.ReleaseComObject(pMediaEvent);
			pMediaEvent = null;
			Console.WriteLine("end");
		}
	}
}
```


以上。
ChatGPTでPowerPointのスライドを作成する方法

## 準備するもの
### ChatGPT-4のベータ版の機能を使います
この機能は、ChatGPT-4が必要です。（ChatGPTの「Code Interpreter」というベータ版の機能を使います）

※GPT-4は月額20$の有料課金バージョンとなります。

![スクリーンショット 2023-07-09 9.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/234dcd6e-864d-0deb-468b-58e3cdcc0af0.png)
ChatGPTの「Code Interpreter」機能を使うには、「Settings」> 「Beta features」> 「Code Interpreter」をオンにするだけです。

### 「Code Interpreter」とは？
OpenAIによる公式のドキュメントは、[コチラ](https://openai.com/blog/chatgpt-plugins#code-interpreter)をご覧ください。
この内容を一言で言うと…「ChatGPTでPythonでの処理が行えるようになり、ファイルのアップロードやダウンロード機能も使えます」というもの。

「へぇ〜…」という内容ですが、使ってみるとこれが意外とすごかったんです。
※指示の仕方によっては、「指示に従って、Markdown形式のテキストからPowerPointのスライドファイルを作成することは、現在のChatGPTの能力では直接行うことができません。」と返ってきてしまいます。ChatGPTへの指示をわかりやすくするなど、根気強く付き合いましょう。

## ChatGPTからPowerPointが出来上がる仕組み
難しい内容を省いて、簡単に説明すると…

【Input】
Markdown形式のテキスト（Markdown形式の書き方は、[コチラ](https://qiita.com/Rekt-Order/items/99816c0739875004721b)をご覧ください）

【処理内容】
・Markdown形式のテキストを解析する
・Pythonの「python-pptxライブラリ」を使って、Markdown形式のテキストから、PowerPointのプレゼンテーションを作成
・ダウンロードリンクを生成する

【Output】
PowerPoint形式の「pptx」ファイル
※pptxファイルのダウンロードリンクが表示されます。

## 実際に指示を出してみよう
今回は、[「Threadsの使い方〜Twitterとの比較とはじめかた〜」](https://qiita.com/Rekt-Order/items/8a824160c57dc9ad33f2)の内容を抜粋して、PowerPointにしてみたいと思います。

![スクリーンショット 2023-07-09 9.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/ae85044c-f943-443a-2f29-ed39ad2645dc.png)


※ChatGPTの「Code Interpreter」では、ファイルのアップロードにも対応をしていますので、理論上はMarkdown形式のファイルをアップロードして作ってもらうことも可能です。しかし、今回の実験では、プロンプト本文に記載をすることで作成テストを行っています。

### プロンプトはコチラ

![本文を追加 (1920 × 500 px) (950 × 500 px).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/8dcdd51c-d8f1-1541-9c1b-b701ff52a0b3.png)


#### 実際に利用したプロンプト
下記のMarkdown形式のテキストを、下記の指示に従って、PowerPoint形式のスライドファイルとして出力して、最後にダウンロードリンクを示してください。

○指示
・Markdown形式のテキストを解析し、Pythonの「python-pptxライブラリ」を使用する
・出力は、「pptx」形式のファイルとする
・「##」がスライドの単位です
・「###」はスライド内の見出しです
・「##」「###」以降のテキストは、そのままスライドへ貼付してください

○Markdown形式のテキストは下記
(こちらにMarkdown形式のテキストを貼付する)

※貼り付けたMarDown形式のテキストはコチラ
![スクリーンショット 2023-07-09 10.57.55（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/4226a533-c78c-1911-04cb-40a141f23516.png)


#### アウトプット
上記のプロンプトによって、以下のスライドが出来上がりました。

![スクリーンショット 2023-07-09 11.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/8b9ca78e-9c2c-7ccb-2f6f-e1a552c8c961.png)


## やってみた感想
もちろん、このままスライドに使えるわけではありません。また、今回インプットに使ったMarkdown形式のテキストも、ブログ記事のために作成したものなので、スライド向きではなかったことも考慮する必要があると思います。

スライドの雛形としては使えそうな気配がしていますので、「スライドの雛形を作るには…？」という視点で、活用方法を考えたいと思います。

そこで、以下のフローで作業を行うことで、うまく活用できるのでは…？と考えました。

- Markdown形式で「##」「###」を意識して、テキストベースで資料を作成する
- ChatGPTへの指示で、ここで作成したMarkdown形式を、箇条書きへ要約してもらう（特に、本文にあたる「###」内のテキスト）
- 要約版のMarkdown形式をインプットにして、今回紹介した流れに従って、PowerPoint形式に変換
- できあがったPowwrPointファイルを雛形にして、自分でブラッシュアップする

この流れで再トライした結果を、近々またアップしようと思います。


この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/07/09/prompt-003/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
cscの作法 その393

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
directshowlibでwmvファイルを再生せよ。

# サンプルコード

```
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;

namespace App
{
	class Program {
		static void Main(string[] args) {
			Console.WriteLine("start");
			IGraphBuilder pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph();
			IMediaControl pMediaControl = (DirectShowLib.IMediaControl) pGraphBuilder;
			IMediaEvent pMediaEvent = (DirectShowLib.IMediaEvent) pGraphBuilder;
			pMediaControl.RenderFile(@"test1.wmv");
			IVideoWindow pVideoWindow = (DirectShowLib.IVideoWindow) pGraphBuilder;
			pVideoWindow.put_FullScreenMode(OABool.True);
			pMediaControl.Run();
			EventCode code;
			pMediaEvent.WaitForCompletion(1000, out code);
			pVideoWindow.put_FullScreenMode(OABool.False);
			Marshal.ReleaseComObject(pGraphBuilder);
			pGraphBuilder = null;
			Marshal.ReleaseComObject(pMediaControl);
			pMediaControl = null;
			Marshal.ReleaseComObject(pMediaEvent);
			pMediaEvent = null;
			Console.WriteLine("end");
		}
	}
}

```

以上。
Excel のワークシート関数だけでビンゴカードを作る方法

# ビンゴカードの仕様
[ビンゴ - Wikipedia の記事](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%B3%E3%82%B4#%E3%83%AB%E3%83%BC%E3%83%AB) を参考にするとビンゴカードは以下の仕様を満たす必要があります。
 - ５ｘ５マスのカード
 - 現れる数字の範囲は１～７５
 - 列によって番号の範囲が設定されている

|列番号|第１列|第２列|第３列|第４列|第５列|
|---|:-:|:-:|:-:|:-:|:-:|
|番号の範囲|1-15|16-30|31-45|46-60|61-75|

[^1]:https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%B3%E3%82%B4#%E3%83%AB%E3%83%BC%E3%83%AB

# ワークシートの数式

方針としては、15個のランダムに並べられた数列を5列用意して、そこから5行切り出すことで1枚のビンゴカードを作成します。

重複のない乱数列を作る方法の定番としては、`RAND`を並べたセル範囲に対して`RANK`を使って各セルの順位を計算する方法があります。
しかし今回は`CHOOSECOLS`を使って、取り出した配列に対して、順位を計算させたいため、セル範囲を引数にとる`RANK`は使えません。
代わりに`SUM`と不等号計算を用いて順位を求める方法を使います。

```Excel:[A1]5行15列の乱数マトリクス
=MAKEARRAY(15, 5, LAMBDA(r, c, RAND()))
```

```Excel:[G1]列ごとにランク付けして、列ごとにオフセットを加算する
=LET(
    nrow, ROWS(A1#),
    ncol, COLUMNS(A1#),
    MAKEARRAY(
        nrow,
        ncol,
        LAMBDA(row_i, col_i,
            LET(
                ary, CHOOSECOLS(
                    A1#,
                    col_i
                ),
                x, OFFSET(
                    A1,
                    row_i - 1,
                    col_i - 1
                ),
                SUM((ary > x) * 1) + 1
            )
        )
    ) + {0, 15, 30, 45, 60}
)
```

```Excel:[M1]5行5列を切り抜いて、真ん中をFREEスポットにする
=MAKEARRAY(
    5,
    5,
    LAMBDA(r, c,
        IF(
            r & c = "33",
            "FREE",
            OFFSET(G1, r - 1, c - 1)
        )
    )
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/054c0d45-6354-5f99-8872-9b0d46a57528.png)
cscの作法 その392

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
directshowlibでaviファイルを再生せよ。

# サンプルコード

```

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;

namespace App
{
	class Program {
		static void Main(string[] args) {
			Console.WriteLine("start");
			IGraphBuilder pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph();
			IMediaControl pMediaControl = (DirectShowLib.IMediaControl) pGraphBuilder;
			IMediaEvent pMediaEvent = (DirectShowLib.IMediaEvent) pGraphBuilder;
			pMediaControl.RenderFile(@"test1.avi");
			IVideoWindow pVideoWindow = (DirectShowLib.IVideoWindow) pGraphBuilder;
			pVideoWindow.put_FullScreenMode(OABool.True);
			pMediaControl.Run();
			EventCode code;
			pMediaEvent.WaitForCompletion(1000, out code);
			pVideoWindow.put_FullScreenMode(OABool.False);
			Marshal.ReleaseComObject(pGraphBuilder);
			pGraphBuilder = null;
			Marshal.ReleaseComObject(pMediaControl);
			pMediaControl = null;
			Marshal.ReleaseComObject(pMediaEvent);
			pMediaEvent = null;
			Console.WriteLine("end");
		}
	}
}



```

以上。
cscの作法 その391

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
directshowlibでカメラとマイクを列挙せよ。

# サンプルコード

```

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;

namespace App
{
	class Program {
		static void Main(string[] args) {
			Console.WriteLine("Video:");
			foreach (DsDevice ds in DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice))
			{
				Console.WriteLine(ds.Name);
			}
			Console.WriteLine("Audio:");
			foreach (DsDevice ds in DsDevice.GetDevicesOfCat(FilterCategory.AudioInputDevice))
			{
				Console.WriteLine(ds.Name);
			}
		}
	}
}



```

# 実行結果

```
>cat1
Video:
USB2.0 VGA UVC WebCam
Audio:
Microphone (Realtek High Definition Audio)

```

以上。
【PL-900】Microsoft Power Automateフローの分類

## Microsoft Power Automateのフローの種類
1. クラウドフロー
1. デスクトップフロー
1. ビジネスプロセスフロー

## クラウドフローとは
オートメーションを下記のいずれかでトリガーする場合はクラウドフローを使用する
- 何かのアクションで自動的に開始
- 即座に開始
- スケジュールに従って開始

#### クラウドフローの種類
- 自動フロー
    - 特定のイベントトリガー
    - 特定の人からメール受信やSNSでの自分のアカウントの参照投稿など
    - クラウドサービスやオンプレのコネクタを使用してアカウントを接続することで他サービスと相互にやりとり可能

- インスタントフロー
    - ボタンをクリックしてオートメーションを開始する
    - 承認の要求やTeamsでのアクションなどに対応

- スケジュールフロー
    - スケジュールに従って自動化する必要があるタスクを処理
    - SharePointやDBへの日次のデータアップロードなどの自動化処理

## デスクトップフローとは
- 既存のRPA機能を拡張したもので、webまたはデスクトップ上のタスクを自動化する

## ビジネスプロセスフローとは
- **PowerAppsのアプリ**にて、ビジネスプロセスを自動化することが可能
- データの一貫した入力や実行ステップを可能にする

## 参考サイト
【公式サイト】[フローの異な種類の概要](https://learn.microsoft.com/ja-jp/power-automate/flow-types)
CodeInterpreterプラグインを用いた小説原稿のインポートと加工のハウツー

# CodeInterpreterプラグインを用いた小説原稿のインポートと加工のハウツー

## 1. ChatGPTとCodeInterpreterプラグインのセットアップ
- OpenAIのウェブサイトにアクセスし、ChatGPTのインターフェースを開きます。
- 左下にある設定（Settings）をクリックします。
- 「Beta Features」カテゴリーの下にある「Plugins」オプションを有効にします。

## 2. CodeInterpreterプラグインのアクセス
- ChatGPTインターフェースを開き、「Plugins」タブに移動します。
- 「Code Interpreter」プラグインを見つけて選択します。

## 3. コードの入力と実行
- CodeInterpreterプラグイン内の指定されたエリアにコードを入力します。
- CodeInterpreterはあなたのコードを解析し、貴重なフィードバック、説明、デバッグのヒント、さらにはデータの視覚化を提供します。

## 4. 小説原稿のインポートと加工
- まず、小説原稿をテキストファイルとして準備します。このファイルをPythonのコードを使って読み込むことができます。例えば、以下のようなコードを使用することができます。
    ```python
    with open('your_novel.txt', 'r') as file:
        novel_text = file.read()
    ```
- 次に、原稿のテキストを解析するためのPythonのコードを書きます。例えば、以下のようなコードを使用して、キャラクターの出現頻度を計算することができます。
    ```python
    character_counts = {}
    for character in ['Alice', 'Bob', 'Charlie']:
        character_counts[character] = novel_text.count(character)
    ```
- また、原稿のテキストをAIに読み込ませて新しい章を生成させることも可能です。例えば、以下のようなコードを使用して、ChatGPTに新しい章を生成させることができます。
    ```python
    new_chapter_prompt = novel_text[-100:] + '\n\nChapter 2\n'
    new_chapter = chatgpt.generate(new_chapter_prompt)
    ```
NGINXでリクエストの振り分け

# はじめに
以前の記事でマルチプロジェクト構成のSpringBootアプリを作成しました。  
次にNGINXをエンドポイントとし、各SpringBootアプリにリクエストを振り分けるように実装してみます。

# 環境
Java:17  
SpringBoot：3.1.1  
Gradle：8.1.1  
NGINX：1.25.1
プロジェクト：[multi-project（以前の記事のプロジェクト）](https://qiita.com/kaburankattara/items/1c0833143eef3a575493)  

# 1.全体像
下図のようにDocker関連のソースを配置します。

```
multi-project（ルートプロジェクト）
│
├── docker
│   ├── nginx/volumes/etc/nginx/conf.d
│   │   └── nginx.conf
│   │
│   ├── docker-compose.yml
│   └── docker-up.sh
│       
├── multi-project-A（サブモジュールプロジェクト）
│       
└── multi-project-B（サブモジュールプロジェクト）
```

# 2.NGINXのコンテナを立ち上げる
## docker-compose.ymlを作成
NGINXのコンテナを立ち上げるため、docker-compose.ymlを作成します。
設定ファイルの配置先とNGINXをリッスンさせるポートに合わせて設定します。

```docker-compose.yml
version: "3"

services:

  nginx:
    image: nginx:1.25.1
    container_name: nginx-container
    ports:
      - "80:80"
    volumes:
      - ./nginx/volumes/etc/nginx/conf.d:/etc/nginx/conf.d
```

## nginx.confを作成
次に設定ファイルとして「nginx.conf」を作成します。
80番ポートでリッスンさせ、URLの内容でアプリへの振り分けを決定します。

```nginx.conf
server {
    listen 80;

    location /multi-project-A {
        rewrite /multi-project-A/(.*) /$1 break;
        proxy_pass http://host.docker.internal:60;
    }

    location /multi-project-B {
        rewrite /multi-project-B/(.*) /$1 break;
        proxy_pass http://host.docker.internal:70;
    }
}
```

振り分けするときは、rewriteを使って
http://localhost/multi-project-A/sampleA
↓
http://localhost:60/sampleA
といった具合に書き換えてアプリ側にリクエストを投げます。

## コンテナを立ち上げる
docker-composeでdockerコンテナを立ち上げます。

```docker-up.sh
echo 作業ディレクトリに移動
cd ~/workspace/multi-project/docker/

echo dockerを起動
docker-compose -f docker-compose.yml -p multi-project up --build -d
```

# 3.SpringBootアプリを立ち上げる
## ポートを設定
今回はSpringBootアプリをホスト側で実行しているので、ポートをそれぞれ被らないように設定します。

multi-project-A

```application.yml
server:
  port: 60
```

multi-project-B

```application.yml
server:
  port: 70
```

## アプリ起動
GradleタスクのbootRunでSpringBootアプリを実行します。

```shell
% ./gradlew :multi-project-A:bootRun
% ./gradlew :multi-project-B:bootRun
```

# 4.動作確認
いよいよNGINXに向けてリクエストを投げてみます。
URLのパターンで各サーバに振り分けられることを確認します。

```shell
% curl http://localhost/multi-project-A/sampleA
hello worldA
% curl http://localhost/multi-project-B/sampleB
hello worldB
```

無事、振り分けられて返却値が取得できました。

# 参考文献
https://hub.docker.com/_/nginx

https://docs.nginx.com/nginx/admin-guide/web-server/web-server/

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
AWS初心者がSOA-C02に合格した話

このたび、AWS Certified SysOps Administrator - Associate（SOA-C02）試験に無事合格したので、その経緯について書いていきます。

これから受験する方々に参考になるものがあれば幸いです。

今まで取得したAWS資格はこちらです。

- [AWS実務未経験者が18日でSAA-C03に合格した話](https://qiita.com/ryuken/items/aafe762bb6e3e7d78088)
- [AWS初心者がDVA-C02に合格した話](https://qiita.com/ryuken/items/7bf999eff697399c5ebf)

## AWS SOA-C02とは
AWS資格のうち、システム運用・管理者向けアソシエイト資格の一つです。
![aws-cirtified-soa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/af207d1d-803c-4899-bb19-822c538e51ea.png)
出典元：[AWS 認定](https://aws.amazon.com/jp/certification/)

## 受験を決めた経緯
スキルアップやら偉いことを言いたいところですが、シンプルに惰性です。

これまでに取得したAWS資格SAA、DVA勉強で世話になっていた[TechStock](https://techstock.jp/)。すでに課金しており、その購読期間が二ヶ月弱余っていたので、３つ目のアソシエイトも取得しようと思い、SOA-C02勉強を始めました。

## 勉強方法
TechStockのみで勉強しています。問題セットは#1~#100まで異常に多かったです。今回は忘却理論を活用した、同じ問題セットを何度も復習するスタイルを取り入れてみました。

- [AWS認定資格 SAA試験に落ちたくない人は必見！試験テクニックを無料で伝授します！【ソリューションアーキテクトアソシエイト試験】](https://www.youtube.com/watch?v=lJTh8n_q3Zw)(YouTube)

一つの問題セットを一日に２回解き、その後は１日後・２日後・３日後・５日後・８日後・１２日後・１７日後・・・とだんだんと間を空けながら何回も復習しなおす方法です。同じ問題を何度も復習するので、簡単な問題なら二回目以降は軽く問題を見るだけで正解を思い出すことができます。複雑な問題はもっと回数が必要ですけどね。

その代わり、とんでもなく時間がかかるように思えました。100セットある問題がなかなか進みません。簡単な問題だけならまだいいですが、後半はまったく分からない問題が増えてきて、一日新規で進められるのはせいぜい2~3セットくらいです。

定着度は確実に上がるので、できれば最後までこのスタイルをやり通したかったです。が、TechStockの購読期限も決まっており、このままじゃ期限内に勉強が終わらないなと思いました。結局後半の数十セットは一通り解いてみて不正解になった問題のみ復習する従来のスタイルで進めました。それでなんとか購読期間内に勉強を終えることができました。

## 勉強時間
朝のもくもく会だけでした。平日に一日1時間30分ほど勉強するようにしていましたが、トータルで77時間勉強していました。
![スクリーンショット 2023-07-09 10.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/fe6db524-e8e1-27f3-d6ab-5e9e775a1399.png)

## 受験
前回自宅でオンライン受験をしてみて悪くないなと思い、今回も自宅で受験しようと思いました。しかし、希望日間近になると受験枠がいっぱいで選べませんでした。しかたなく会場で受験することにしました。自宅にせよ会場にせよ、予約は早めがいいですね。

問題パターンはこれまで受験したもの同様、TechStockで解いたことのある問題に似ている問題が多い印象です。ただ個人的な所管ですが、SAAとDVAと比べて初めて目にする問題の割合が若干多い気がしました。

- ほぼ同じ問題：5割
- なんとなく二択まで絞れる問題：3割
- 初見の問題：2割

初見でまったく分からない問題を5問くらいスキップし、60/65回答完了。すでに110分経過していました。その後残りの問題を解いて受験完了。130分の時間をほぼ使い切ってしまいました。

夕方になってもメールが届かず、ドキドキしながらAWS認定サイトにアクセスしてみたら、合格でした。
![スクリーンショット 2023-07-09 10.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/16a20bde-79d3-dbff-54bf-a60e3a62e8b0.png)

「1000点満点中、720点以上で合格」のところ、745点で合格でした。

## 感想
受験後の感想は、SAA・DVAよりはすこし難しい感じがしました。時間もほぼ使い切っていました。

TechStockで練習問題数も多い分、勉強にも時間がかかりました。出題範囲も多岐に渡り、初めて目にする問題も多かったです。ただし、TechStockのみでも合格できました。

余談ですが、TechStock有料プランが切れる翌日に受験できたので、TechStockは最大限活用できたと思います。そして、TechStockの有料プラン期限が「2023/07/07」で、この日まで復習できるかと思ったら、なんと朝ログインできませんでした。どうやら、フリープランに変更されるのは期限切れ日の任意の時間になるそうです。
![スクリーンショット 2023-07-09 10.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/3ec4e99c-63f1-5d85-46ea-10e1aec1ce4a.png)
出典元：[Tech Stock FAQ](https://techstock.jp/faqp/)
GASを触る

仕事で何回かGASを触って社内用のプログラムを作成することがあったのでバラバラとしている知識を整理するためにGASについてまとめます。

# GASとは

> Apps Script は、Google Workspace の統合、自動化、拡張のためのビジネス ソリューションをすばやく簡単に構築するための唯一のローコード プラットフォームです。Apps Script を使えば、ビジネス ユーザーは本格的なソフトウェア開発の経験がなくても、Google Workspace 上にカスタム ソリューションを構築できます。Apps Script は、Gmail アカウントをお持ちであればどなたでもご利用いただけます。

（公式サイトから引用： https://workspace.google.co.jp/intl/ja/products/apps-script/）

# GASの特徴

1. Gmailアカウントがあれば誰でも無料で使える
2. 開発環境のセットアップが不要で、すぐに始められる
3. JavaScript互換で覚えやすい
4. マクロ機能でノンコード開発ができる

（引用： https://satori.marketing/marketing-blog/gas-introduction/）

# 外部ライブラリを追加する

> GASでは、作成した関数を他のプロジェクトから利用できる仕組みが用意されていて、それをライブラリと言います。

（引用： https://tonari-it.com/gas-library/#:~:text=GAS%E3%81%A7%E3%81%AF%E3%80%81%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E9%96%A2%E6%95%B0,%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%82%8F%E3%81%91%E3%81%A7%E3%81%99%E3%80%82）

# スプレッドシートでの利用

1. chromeでスプレッドシートを作成
2. スプレッドシートのメニュー > [拡張機能] > [Apps Script]を選択
3. Apps ScriptのIDEが開かれるので、プロジェクト名を入力

## ログに「Hello, World!」を出力してみる

```js
function test_log() {
  Logger.log('Hello, World!');
}
```

## スプレッドシートの特定のセルから値を取得する

```js
function getValueFromCell() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getRange("A1");
  var value = cell.getValue();
  Logger.log("セルの値は: " + value);
}
```

## スプレッドシートに値を入力する

```js
function setTextInCell() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getRange("A1");
  cell.setValue("Hello, World!");
}
```

## URLを指定してサイトの情報を取得する

```js
function fetchSourceCode(url) {
    var response = UrlFetchApp.fetch(url)
    var html = response.getContentText();
    var statusCode = response.getResponseCode()
    Logger.log(html)
    Logger.log(statusCode)
    return html
}
```

## HTMLをパースする

```js
function parseHtml(html) {
  var data = Parser.data(html).from('<h1>').to('</h1>').build();
  Logger.log(data)
}
```

## １列のデータをすべて取得する

```js
function getOneColumnValues() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getRange("A1:A");
  var values = range.getValues();

  for (var i = 0; i < values.length; i++) {
    var value = values[i][0];
    Logger.log("A列の値は: " + value);
  }
}
```
useHydrateAtomsの使い方

# jotaiライブラリーのuseHydrateAtomsを勉強した
## 自己紹介
私は41歳から独学でプログラミングをはじめ現在45歳。
最近やっと自分でアプリをく作れるようになってきました。

この記事はuseHydrateAtomsの使い方の備忘録です。
間違いあるかもしれませんので、ご了承ください。

## 概要
フルスタックで自作アプリを作成した時に
フロントエンドとバックエンドを状態が初期状態で不一致していて困ったことがありました。
それを解消するために、
ブラウザ起動後、すぐにバックエンドのデータをフェッチする方法で動作的には問題なくなりました。
でも、フェッチ完了するまでの間に古い状態（フロントが持っている初期状態）が一瞬チラ見えするのが
美しくないなあと思って、いろいろ調べた結果、
useHydrateAtomを見つけました。


## 下準備

まずは普通に書くと以下３つのコード。
「hoge hoge]が一瞬チラ見えします。


```javascript:App.jsx
import './App.css';
import { User } from './components/User';

function App() {
  return (
    <>
      <User/>
    </>
  );
}

export default App;
```

```javascript
import { atom } from 'jotai';

export const userAtom = atom([
  {
    id: 100,
    name: 'hogo hoge',
    username: 'foo',
    email: 'aaa@aaa.com',
  }
]);
```



```javascript:User.jsx(修正前)
import React, {useEffect} from 'react';
import { useAtom } from 'jotai';
import { userAtom } from '../atoms/usersAtom';
import axios from 'axios';

export const User = () => {
  const url = 'https://jsonplaceholder.typicode.com/users';
  const [userData, setUserData] = useAtom(userAtom);
  useEffect(() => {
    const fetchData = async (url) => {
      const response = await axios.get(url);
      setUserData(() => [...response.data]);
    };
    fetchData(url);
  }, []);
  return (
    <div>
      {userData.map((user) => {
        return <li key={user.id}>{user.name}</li>;
      })}
    </div>
  );
};

```
## useHydrateAtomsを使って修正
こちらに書き換えるとチラ見えがなくなりました。


```javascript:User.jsx(修正後)
import React from 'react';
import { useAtom } from 'jotai';
import { useHydrateAtoms } from 'jotai/utils';
import { userAtom } from '../atoms/usersAtom';
import axios from 'axios';

export const User = () => {
  const url = 'https://jsonplaceholder.typicode.com/users';
  const fetchData = async (url) => {
    const response = await axios.get(url);
    return response.data;
  };
  useHydrateAtoms([[userAtom, fetchData(url)]]);
  const [userData] = useAtom(userAtom)
  return (
    <div>
      {userData.map((user) => {
        return <li key={user.id}>{user.name}</li>;
      })}
    </div>
  );
};
```

## コードの特徴
### 修正前
- useAtomを使ってデータ呼び出し
- useEffectを使う
fetchしてAtomを書き換える非同期関数を宣言して実行

### 修正後
- useAtomを使ってデータ呼び出しは後で。
- useEffectは使わない
- fetchしてデータを返す関数を宣言
- useHydrateAtomsを実行
リストを引数に入れる
アトムとデータを入れる
- ここでuseAtomを使ってデータを呼び出し。

# 感想
修正前のコードの書き方に慣れていたので、修正後のコードの書き方にはなかなか慣れませんでした。
でもコード量もそんなに変わらないので、慣れていこうかと思います。
ReactとFlaskを連携させてみる part2

# 目的

前に書いた記事ではFlask→Reactは実施しても、React→Flask→Reactは実施できていなかったのでやってみる

記事はこちら↓

https://qiita.com/Suntory_N_Water/items/03ea848848cdc434181f


# 実際にやってみた

## フロー

Reactでエディットに値を入力し、ボタン押下でFlaskに値を渡します。
渡された値を計算し、Reactに計算結果を返すアプリにしてみます。

``` tsx
import { useState } from 'react';
import './App.css';
import axios from "axios";

interface Data {
  value: number;
}

function App() {
  const [value, setValue] = useState<string>('');
  const [result, setResult] = useState<number | null>(null);

  const handleSubmit = () => {
    const data: Data = {
      value: parseInt(value),
    };

    axios.post('api/data', data)
      .then((response) => {
        setResult(response.data.result);
      })
      .catch((error) => console.error(error));
  };

  return (
    <div className='App'>
      <header className='App-header'>
        <input
          type="number"
          value={value}
          onChange={(e) => setValue(e.target.value)}
        />
        <button onClick={handleSubmit}>おす</button>
        {result && <p>けっか: {result}</p>}
      </header>
    </div>
  );
};

export default App;
```

Flaskでは受け取った値を2倍し、計算結果を返します。

``` python
from flask import Flask, jsonify, request
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/', methods=['get'])
def get_data():
    return "Hello World"

@app.route('/api/data', methods=['POST'])
def post_data():
    data = request.get_json()
    double_value = data['value'] * 2
    return jsonify({'result': double_value})

if __name__ == '__main__':
    app.run(port=5000, debug=True)
```

## 実際に動かしてみる

しっかり反映されました。

![google-chrome-2023-07-09-10-09-38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837411/c324a761-08a4-3315-0838-897a3e6420b8.gif)
EVM(アーンドバリューマネジメント)の各指標の意味を理解する

# 内容
コスト、スケジュールの観点からプロジェクトの進捗管理する手法でEVM(アーンドバリューマネジメント)という手法があります。実際業務の中でも使用しているのですが本質を理解していない（この値がプラスならOK、この指標が1以上ならOKくらいの理解）。またプロジェクトマネジメント系の勉強をすると必ず出てきますが、毎回良く理解しないまま進んでしまいました。プロジェクトマネージャー試験を受けるにあたっては避けては通れないため、今回はなぜそうなるか、本質を理解出来るまで自分なりにかみ砕いて学習して内容をまとめました。

# 言葉の定義
* 予定タスク数：計画段階で定義したタスク数
* 完了タスク数：その時点で完了したタスク数
* 標準工数：計画段階で定義した工数
* 実際工数：実際にかかった工数

# 基本構成要素
## PV（計画価値）
その時点までの計画予算(予定タスク数×標準工数)

## AC（実コスト）
その時点までに実際に発生したコスト(完了タスク数×実際工数)

## EV（達成価値）
その時点までの出来高(完了タスク数×標準工数)

# 予算管理の指標

![EVM1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/8e6acb38-74df-58cc-4228-6d9f406e15e9.png)


## SV(スケジュール差異)
①の箇所でEV-PVで求める。
EV(完了タスク数×標準工数)-PV(予定タスク数×標準工数)=(完了タスク数-予定タスク数)×標準工数となる。
(完了タスク数-予定タスク数)の箇所に着目すると完了タスク数の方が多い場合は正の値に、少ない場合は負の値となる。従ってこの値が正の値であればスケジュール通り進んでいる。

## CV(コスト差異)
②の箇所でEV-ACで求める。
EV(完了タスク数×標準工数)-AC(完了タスク数×実際工数)=(標準工数-実際工数)×完了タスク数となる。
(標準工数-実際工数)の箇所に着目すると標準工数の方が多い場合は正の値に、少ない場合は負の値となる。従ってこの値が正であれば計画より少ないコストで収まっている。

## SPI(スケジュール効率指標)
EV/PVで求める。
(完了タスク数×標準工数)/(予定タスク数×標準工数)=完了タスク数/予定タスク数となる。
従ってこの値が1より大きければ予定より完了タスクの方が多いため、スケジュール通り進んでいるとなる。

## CPI(コスト効率指標)
EV/ACで求める。
(完了タスク数×標準工数)/(完了タスク数×実際工数)=標準工数/実際工数となる。従ってこの値が1より大きければ実際工数が予定していた工数を超えておらず想定通りのコストである。

# プロジェクト予測の指標
![EVM2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b24ffb3d-f693-d354-02f6-6149074cff4b.png)

例）期間Aの時点での予測
## BAC(完成時総予算)
完成時の予算の合計なのでPVの合計値となり③で表される。

## EAC(完成時総コスト見積)
ある時点での完成時の予算の合計見積でAC＋(BAC-EV)/CPIとなる。まずAの時点のAC(実コスト)は実績として算出可能、これにこの時点から完了までのコスト見積((BAC-EV)/CPI)を追加する。

### (BAC-EV)
BAC(完成時のPV)から現時点のEVを引く。すなわち現時点で残りの予算を表している。④で表される。

### ((BAC-EV)/CPI)
現時点での残りの予算をCPIで割っている。CPIはコスト効率指標で標準工数に対して実際どの位工数がかかっているかを表す。
* 1より大きい場合は標準工数>実際工数
* 1の場合は標準工数=実際工数
* 1より小さい場合は標準工数<実際工数

従って、現在までコスト効率指標で進んだ場合を前提として、残りのコスト見積をしている。

### (AC＋(BAC-EV)/CPI)
現在までの実績(AC)に残りのコスト見積((BAC-EV)/CPI)を足して、現時点での完成時総コスト見積を算出している。

## VAC(完成時差異)
EAC-BACで求める。この値が正の場合現時点でのEAC(完成時の予算見積)がBAC(完成時の総予算)を超えており、現時点で予算を超過している。


## TCPI(残作業効率指数)
BACやEACを達成するために必要なコスト効率(CPI)でTCPI=(BAC-EV)/(BAC-AC)で表す。
(BAC-EV)は(予定タスク数×標準工数)-(完了タスク数×標準工数)=(予定タスク数-完了タスク数)×標準工数となり残り作業を表す。(BAC-AC)は(予定タスク数×標準工数)-(完了タスク数×実際工数)となり残り予算を表す。残り作業を残り予算で割ることでどの位のコスト効率が必要かを算出する。
ITILもとにインシデント対応フロー作成しました

## はじめに
先日社外で初LTをしました
テーマも自由だったので、共通の話題になるものがいいなと思い、
インシデント周りで作成してみたので、今回はその共有です。

## ITILを取り扱った背景
昨年末〜今年にかけて、CTOに教えていただきITILを勉強し始めました。
進めていく中で、特にインシデント管理に対して
**これはうちのチームでもと入れられるのでは**と思い、
作成させてくれい！とCTOにお願いし、レビューいただきながら進めることに。

## そもそもITILとは何か？
ITIL（Information Technology Infrastructure Library）とは、
**ITサービスの運用に関するベストプラクティス**がぎゅっと集まったもので、
以下の3つのカテゴリーに分けられます。

1. 一般的マネジメントプラクティス
2. サービスマネジメントプラクティス
3. 技術的マネジメントプラクティス

更に、サービスマネジメントプラクティスには、以下の10の要素が含まれています。
1. モニタリングおよびイベント管理
2. インシデント管理
3. 問題管理
4. サービス要求管理
5. 変更実現
6. リリース管理
7. サービス構成管理
8. IT資産管理
9. サービスデスク
10. サービスレベル管理

これらの中から、「モニタリングおよびイベント管理」「インシデント管理」「問題管理」に
焦点を当て、インシデントのフロー作成しました。

## フロー作成のビフォーアフター

### Before:気づいた人がそれぞれのやり方で進めている状態
* 認識が揃っていない
→そもそもインシデントとはの認識が揃っていないので、
人によって報告する/しないが発生していたり
* 報告の粒度や仕方が属人化
→基本Slackで投稿してもらうというルールのみで、エンジニアが調査のために必要な情報を
何往復もラリーをすることもあったり
* 優先順位が分からない
→インシデントが複数発生した場合に、何から手をつければいいか分からない

### After:　誰でも一定できる状態
* 属人化を排除
→取り組みでも共有しますが、様々定義やフローを整えること、まずは認識をあわせること
* 後は調査〜復旧対応するだけ
→エンジニアが後は調査し復旧まで対応するだけの状態

### 具体的な取り組み
主な取り組みは以下の通りです
1. **ステークホルダーの洗い出し**
2. **優先度の定義付け**
3. **フロー図の作成**
4. **チーム横断の説明会**


------------------------------
1. **ステークホルダーの洗い出し**
これまでそれぞれの判断で進めていたところをビジネスサイドも含め、
インシデントの関与頻度や誰がどの意思決定をするのかを整理しました。
![](https://storage.googleapis.com/zenn-user-upload/7e5c3471ef3f-20230706.png)

2. **優先度の定義付け**
こちらは完全にITILに沿って策定しました。
**・優先度=緊急度×インパクト**
緊急度=事業にとってどれだけ早く解決する必要があるか
インパクト=ビジネスへの影響

緊急度、インパクトを高・中・小に分け、優先度としては1~4の4段階としました。
![](https://storage.googleapis.com/zenn-user-upload/13aef18e6859-20230706.png)

こちらについては、↓の記事で詳細を書いているので読んでいただければと思います。

https://qiita.com/makky/items/a53b10aec3eef3d5a7e5


3. **フロー図の作成**
2で決まった優先度をもとに、具体的なフローを書き出しました。
![](https://storage.googleapis.com/zenn-user-upload/5a33d842e066-20230706.png)
ここで意識をしたのは、**インシデントのcloseの定義は何か**ということ。
というのも、これまでは
復旧はしたけど、**インシデントとしてはcloseでいいんだっけ、、？** となっていたり
**誰がボール持っているんだっけ**といったことがあったので、定義を明確にすることで
浮いているボールがないようにしようとしたかったという背景です。

4.**チーム横断の説明会**
1~3で決まったことをエンジニア以外も含めてチーム横断で説明会を行いました。
そもそもこのプロダクトにおけるインシデントとは何を指すのかの認識統一から
報告するときのフォーマット、具体の事例など、1つずつ説明させていただきました。



## 作成して実際どうだった？
既に運用開始して3ヶ月ほど経過していますが、
**チームを横断して認識をあわせられた**ことは大きな一歩になったと思います。
とはいえ、運用面での課題は既に出ているのでこちらは引き続き改善です。


## 終わりに
社外で初めてLTを経験させていただき、とても貴重な経験になりました。
LT後もいろんな方とお話する機会になり、
**これうちで取り入れてみようかな**　だったり、**どこでもあるあるなんだな〜** だったり。
また機会あれば参加させてもらえたらと思います

LT資料はこちら

https://speakerdeck.com/makky_1995/itilwomotoniinsidentohurozuo-cheng-simasita
typescript: File is a CommonJS module; it may be converted to an ES module. の解決方法

CommonJSの記法で書かれたファイルに対し、TypeScriptが次のようなメッセージを表示する場合があります

```bash
File is a CommonJS module; it may be converted to an ES module.
```

このメッセージはエラーでも警告でもなく、TypeScriptがCommonJSで書かれたファイルをESの記法に変換するかもしれません、と伝えているだけです。

よって修正する必要はないのですが、見たいものでもありません。

どうすれば、非表示に、あるいは根本解決できるのでしょうか？

手順を説明します。

- VSCode
    - CJS から ES へ変換する
        - ３つのドットの箇所にマウスを持っていくと、次のQuickFixが表示されるはずです。
        
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/803f8583-2482-2f00-6e5c-8d78e73e6209.png)

        
        - 💡マークをクリックするとES記法へ変換されます。
        
        ```bash
        //-- CommonJS --//
        module.exports = {
          plugins: {
            tailwindcss: {},
            autoprefixer: {},
          },
        }
        
        //-- ES --//
        export const plugins = {
          tailwindcss: {},
          autoprefixer: {},
        };
        ```
        
        - 注意点
            - ES記法へ変換したことでコードが動かなくなるかもしれません。
            - 例えば、`next.config.js` というファイルはES記法だとNextの開発サーバーが起動しません。
            - [公式の説明を御覧ください](https://nextjs.org/docs/messages/next-config-error)
    - 機能を無効にする
        - とりあえず非表示にしたい、であれば次の設定を`False` にしてください。[Stackoverflowより](https://stackoverflow.com/a/49693760/18116695)。
        
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/3a508443-ea2c-8ed3-45af-88a2f9b3e10b.png)
        
- Neovim
    - CJS から ES へ変換する
        - LSPのcode actionを使ってください。次の図は私が使っている環境のものです。
        
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/39ae5dc6-1376-b00e-dbf4-b7cc1e772dd7.png)

        
        - CommonJSからESへ変換されます。
        
        ```bash
        //-- CommonJS --//
        module.exports = {
          plugins: {
            tailwindcss: {},
            autoprefixer: {},
          },
        }
        
        //-- ES --//
        export const plugins = {
          tailwindcss: {},
          autoprefixer: {},
        };
        ```
        
        - 変換した場合の注意点
            - ES記法へ変換したことでコードが動かなくなるかもしれません。
            - 例えば、`next.config.js` というファイルはES記法だとNextの開発サーバーが起動しません。
            - [公式の説明を御覧ください](https://nextjs.org/docs/messages/next-config-error)
    - 機能を無効にする
        - VSCodeのようにメッセージを無効にする機能があるのかはわかりませんでした。
    
- まとめ
    - `typescript: File is a CommonJS module; it may be converted to an ES module.` の解決方法について説明しました。
    - 解決方法は２つあります。
        - CommonJSからESへ変換する
        - メッセージを非表示設定にする。（VSCodeのみ）
    - ただ、エラーなどかならず対処しないといけないメッセージではないので、無視して進めるのが結局は良いかと思います。
ABC309回答メモ

0.はじめに
　先週入緑したので、今回最低でもDまでは行きたかったのですが
　残念ながらCまでで精一杯でした・・・。

　レート更新の結果、791で、茶色に逆戻りでした。
　短い天下（というほどでもないけど）でした。
 

1.A - Nine
　スタイリッシュな回答をしたかったですが
　まぁ回答時間優先で、隣り合うABの組み合わせをすべて
　IF文で指定して愚直な実装となりました。

　https://atcoder.jp/contests/abc309/submissions/43342535

2.B - Rotate
　なかなかややこしいな・・・と飛ばしかけましたが
　よく考えたら1行目と最後の行とその他の行の場合分けで
　すっきり解けました。

　https://atcoder.jp/contests/abc309/submissions/43351658

3.C - Medicine
　高橋君何年生きるねん！とか、ご飯食べれなくなるのでは・・・とか
　雑念が浮かぶ中回答。
　TLEをよける工夫が必要なんだろうなと考察。

　最初に、a,bを読み込む際に
　a,bはリストに保持し
　bを集計し、MAXの飲む個数を保持。
　a,bのリストは昇順にソートし
　先頭から読みつつ、bの個数をMAX個数から引いていく
　K個以下になった際のaの日数に1を足した日が
　飲む個数がK個以下になる日なので、その日を出力して終了。
　最後までK個を下回らなかった場合は、最後のaの値に1を足して出力。
　と、意外とすんなり解けました。

　https://atcoder.jp/contests/abc309/submissions/43360744

4.D - Add One Edge
　40分苦戦して終了間際ぎりぎりに何とか提出したものの
　AC25　RE11　TLE15と、玉砕でした。
　N1グループは頂点１から最大の距離を選びN2グループはN1+N2の頂点から
　最大の距離を選び、それに1を足して出力という考え方自体は
　間違っていなさそうなので、細かい詰めと、冗長な経路算出部分を
　整理して出直したいと思います。

　


以上
よく使う便利なコマンドセット

## メモリ
### メモリの使用量と空きを確認
```
free -m
```
＃## プロセス毎のメモリ使用量を確認
```
top
```



## add -> commit
```
git add . && git commit -m''
```


## SSHで毎回パスワード入れなくて良くなる
```
eval `ssh-agent` && ssh-add
```
Azure Logic Apps を Bicep でデプロイしてみた

Azure Logic Apps は Azure ポータル上の GUI でローコード開発ができて便利です。便利な反面、ソースコード管理がやり辛かったり、開発環境で開発した Azure Logic Apps を検証環境や本番環境にきちんとデプロイするのが面倒だったりします。そこで今回は Bicep を使って、インフラとしての Azure Logic Apps　と Azure Logic Apps コードの開発環境へのデプロイを試してみました。

これらの動作が確認できれば、後は環境ごとのパラメーターを Bicep に持たせ、Git リポジトリのブランチやタグで環境へのデプロイ時にパラメーターを自動付与する Azure Pipelines を作成するなどして、各環境へ簡単にデプロイする事も可能になります。

## 検証用の Bicep ファイルを準備

https://learn.microsoft.com/ja-jp/azure/logic-apps/quickstart-create-deploy-bicep?toc=%2Fazure%2Fazure-resource-manager%2Fbicep%2Ftoc.json&tabs=CLI

こちらを参考に下記の Bicep ファイルをローカルに保存します。

```bash:logicapps.bicep
@description('The name of the logic app to create.')
param logicAppName string

@description('A test URI')
param testUri string = 'https://azure.status.microsoft/status/'

@description('Location for all resources.')
param location string = resourceGroup().location

var frequency = 'Hour'
var interval = '1'
var type = 'Recurrence'
var actionType = 'Http'
var method = 'GET'
var workflowSchema = 'https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#'

resource stg 'Microsoft.Logic/workflows@2019-05-01' = {
  name: logicAppName
  location: location
  tags: {
    displayName: logicAppName
  }
  properties: {
    state: 'Enabled'
    definition: {
      '$schema': workflowSchema
      contentVersion: '1.0.0.0'
      parameters: {
        testUri: {
          type: 'String'
          defaultValue: testUri
        }
      }
      triggers: {
        recurrence: {
          type: type
          recurrence: {
            frequency: frequency
            interval: interval
          }
          evaluatedRecurrence: {
            frequency: frequency
            interval: interval
          }
        }
      }
      actions: {
        actionType: {
          type: actionType
          inputs: {
            method: method
            uri: testUri
          }
        }
      }
    }
  }
}
```

## 開発環境でデプロイ検証

```bash:bash
# リソースグループを作成します
az group create \
  --name mnrlga-rg \
  --location japaneast

# デプロイをすると何が変わるのかを確認します
az deployment group what-if \
  --resource-group mnrlga-rg \
  --template-file logicapps.bicep \
  --parameters logicAppName=mnrlga-app

# デプロイします
az deployment group create \
  --resource-group mnrlga-rg \
  --template-file logicapps.bicep \
  --parameters logicAppName=mnrlga-app

# 変更箇所が無い事を確認します
az deployment group what-if \
  --resource-group mnrlga-rg \
  --template-file logicapps.bicep \
  --parameters logicAppName=mnrlga-app

# 検証が終わったらリソースグループを削除して後片付けをします
az group delete \
  --name mnrlga-rg \
  --yes
```

## 参考

https://learn.microsoft.com/ja-jp/cli/azure/deployment/group?view=azure-cli-latest#az-deployment-group-what-if

https://learn.microsoft.com/ja-jp/training/paths/fundamentals-bicep/
Qiskit初学者向け導入

# Pythonのベクトル表現について

    [0.+0.j 1.+0.j]


と記載されても、学習の順番によっては、いきなり出てくる表現に面食らってしまいます。
ここでは、Python特有のベクトル表現について端的に解説します。

# 量子コンピュータで扱う、ベクトル表現の種類


# Pythonでの表現解説
Vim 9.0 patchダイジェスト (2023/06)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.0.1596](https://github.com/vim/vim/commit/eb43b7f0531bd13d15580b5c262a25d6a52a0823) ～ [9.0.1671](https://github.com/vim/vim/commit/e7d9ca2b3bf99b0b759be8952e02c77110a354c1))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**

* [9.0.1629](https://github.com/vim/vim/commit/95707037afa1aeae4f3494dc623a721ceed7fc4e): `utf16idx()`の第2引数{idx}がUTF-8シーケンスの途中だった場合、次の文字ではなく、当該文字のUTF-16コードインデックスを返すようにしました。
* [9.0.1627](https://github.com/vim/vim/commit/46acad7284cba7842b5e505fa3d07e99806d246f): :alien: syntaxプラグインをテストするメカニズムを追加しました。(関連patch: [9.0.1628](https://github.com/vim/vim/commit/d5b952a871835b057176fd37fc91b971e8e3f300), [9.0.1647](https://github.com/vim/vim/commit/1aa5f1c21fea60fe64cdcdf6990bf43ea5cc78a0), [9.0.1648](https://github.com/vim/vim/commit/031d6321885c15c054d28e3a434de743c1b3193d), [9.0.1649](https://github.com/vim/vim/commit/c6530c9d6860fcc5074371f84768be82bae597f6), ...)
* [runtimeファイル更新](https://github.com/vim/vim/commit/10e8ff9b26078994cae57c2422b145d37aaf714e): [Todo](https://github.com/vim/vim/commit/10e8ff9b26078994cae57c2422b145d37aaf714e#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [9.0.1598](https://github.com/vim/vim/commit/47eec6716b8621fd43bac8ecc9c19089df26705e): `'encoding'`が DBCSエンコーディングの場合に、`screenchar()`、`screenchars()` および `screenstring()`が正しく動かない件を修正しました。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
Usecase使う？使わない？

# まずはじめに

この記事では、私が、ユースケース(Usecase)を
「使った方が良さそう」や「使わなくても良さそう」
を判断するときのポイントを書かせていただこうと思います。

当たり前だろ！と思うことかもしれませんが、
現場で「どういう時に使い分けてますか？」と聞かれることが多々あるので、
今回その内容をアウトプットできたらなと思います。

(ユースケースを "**使う**" という表現が正しいかは怪しいですが、文脈で汲み取っていただけると嬉しいです）

# Usecaseとは

まず、ユースケースの基本的な定義から説明します。
chat-GPT先生に聞いてみた結果がこちら

```
ユースケースは、ビジネス要件やシステムの機能を実現するためのシナリオや振る舞いを表現する概念であり、
システムのユーザー（エンドユーザーや他のシステム）が実現したい目標や操作を捉えます。
ただし、ユースケースを必ずしも作成する必要はありませんし、
プロジェクトの規模や複雑さ、開発チームの特性などによって、ユースケースの使用や定義の程度は異なる場合があります。
```
これをみていただいてわかるように、ユースケースはそもそも使わなくても
「なんとかなりそう！」
っていう場面があります。

ただ、使っておくと後々改修時に
「このユースケース呼び出せば改修終わりじゃん！ラッキー」
となる場合もあります。

そこで、いよいよ本題です。
そんな「ラッキー」となる場面を増やすためのユースケースの
使った方が良さそうなケースをいくつか挙げさせていただきます。

# ケース1: ユーザーごとに処理を分岐させる場合
ユーザーの特定の属性やステータスに基づいて、処理を個別に分岐させる場合は迷わずユースケースを使うことが多いです。
例えば、下記のような場合です。
　「ユーザー階級ごとに購入時のポイント還元率を変える」
　「ユーザーの登録経路によって送信するメール内容を変更する」

実際のソースコードだとこんな感じで書いてます。
```PHP
<?php declare(strict_types=1);

namespace App\UseCases\User;

use App\Enums\UserType;

class PointUseCase
{
    /**
     * [UseCase] 会員ごとの還元ポイントを計算
     *
     * @param  User  $user
     * @return int
     */
    public function run(User $user): int
    {
        switch ($user->type) {
            case UserType::NOMAL:
                return $this->normal($user);
            case UserType::PREMIUM:
                return $this->premium($user);
        }

        return 0;
    }


    /**
     * 通常会員
     *
     * @param  User  $user
     * @return int
     */
    private function normal(User $user): int
    {
        $point = 0;
        // ここで色々Serviceから取得したり、計算したりする
        return $point;
    }


    /**
     * プレミアム会員
     *
     * @param  User  $user
     * @return int
     */
    private function premium(User $user): int
    {
        $point = 0;
        // ここで色々Serviceから取得したり、計算したりする
        return $point;
    }
```

(現状、私がジョインしている案件ではそれぞれのユーザータイプごとにする処理がそこまで大きくないので一つのユースケースの中で分岐するような感じで書いてますが、今後ユースケース膨らみそうであればユーザータイプごとにさらにユースケース使うのもありだなーとは思ってます...)

### ケース2: 複数の処理をまとめて実行する場合
ある処理の中で、複数のステップや操作を連続して行う必要がある場合があります。
こういう時も複数の処理内容を一つのブロックとしてまとめるという意味合いでユースケースを使ったりすることが多いです。
例えば、下記のような場合です。
　「ユーザーテーブルにレコードを追加し、追加したユーザーのメールアドレス宛にメールを送信する」
　「ユーザーの商品購入テーブルにレコードを追加し、商品在庫テーブルのレコードを更新する」

### ケース3: 将来的な再利用性を考慮する場合
ケース1やケース2に当てはまらない内容でも、
「将来的に分岐していきそう。」
「将来的に他の機能でも同じことしていきそうだな。」
と感じたらユースケースを使うようにしています。


# 最後に

色々書きましたが、冒頭でも記述した通り、ユースケース自体は必ずしも使わなきゃいけないものではありません。
ただ、使っておくと将来的に自分やメンバーを助けることになるものでもあるかなと思っています。

みんながハッピーになるコードを私はこれからも書き続けたいし、
そういうコードがどんどん増えてほしいなとも思っています。

まだまだ、試行錯誤中ではありますが、
少しでも誰かの役に立てれば嬉しいです。

（そして、「もっとこうするといいよ！」ってことあればコメントでそっと教えてくれると嬉しいです。）
cscの作法 その390

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
aforgeでカメラをキャプチャしてaviファイルを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/bec75a5f-b1dc-a047-c096-fe07089df3d7.png)

# サンプルコード

```
using System.Drawing.Imaging;
using System.IO;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.VFW;

public partial class MainForm: Form {
	AVIWriter writer = new AVIWriter();
	Bitmap img = new Bitmap(640, 480);
	VideoCaptureDevice videoSource;
	public MainForm() {
		Text = "Capture";
		ClientSize = new Size(200, 200);
		Load += new EventHandler(MainForm_Load);
		FormClosed += new FormClosedEventHandler(MainForm_FormClosed);
	}
	private void MainForm_Load(object sender, EventArgs e) {
		FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
		videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
		videoSource.NewFrame += new NewFrameEventHandler(this.video_NewFrame);
		videoSource.DesiredFrameSize = new Size(640, 480);
		videoSource.Start();
		writer.Open(@"cap2.avi", 640, 480);
	}
	private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) {
		img = eventArgs.Frame;
		writer.AddFrame(img);
	}
	private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
		videoSource.Stop();
		writer.Close();
	}
	[STAThread]
	public static void Main(string[] args) {
		Application.Run(new MainForm());
	}
}





```

以上。
cscの作法 その389

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
aforgeでカメラを列挙せよ。

# サンプルコード

```


using System;
using System.Drawing;
using AForge.Video;
using AForge.Video.DirectShow;

class Avi {
	[STAThread]
	static void Main(string[] args) {
		FilterInfoCollection videoDevices;
		videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
		if (videoDevices.Count == 0)
		{
			return;
		}
		for (int i = 1, n = videoDevices.Count; i <= n; i++)
		{
			string cameraName = i + " : " + videoDevices[i - 1].Name;
			Console.WriteLine(cameraName);
		}
	}
}


```

# 実行結果

```
>cap0
1 : USB2.0 VGA UVC WebCam

```

以上。
エンジニアの市場価値診断サービスおすすめ比較ランキング7選！

自分の市場価値を知ることは、就活や転職活動をするときには大事ですよね。

「わたしの年収は妥当な金額なのか？」

１つの企業に長く勤めている方だと、特に分からなくなるはずです。

本来は、もっと高い年収なのに低い金額・間違った評価がされないために、自分の市場価値はしっかり把握しましょう！

そこで今回は、ITエンジニアの市場価値が診断できるおすすめサービスを解説します。[エンジニアの市場価値診断サービスおすすめ比較ランキング7選！](https://yakiimosan.com/engineer-market-value-test/)
Laravel Debugbarを使ってみた

### はじめに
「Laravel Debugbar」を使用することで、Laravelアプリケーションのデバッグ作業が簡単に行えます。
開発効率を高めたい方には必見のツールです。開発中に知りたい情報を簡単に確認できます。
開発効率が上がると思うのでまだ使っていない方は試してみてください。

次のような役立つ情報がたくさん含まれています。
- タブクエリ: データベースへのすべてのクエリを表示
- タブ ビュー: 現在のページを構成するビューを表示
- タブルート: 現在のルートの情報を表示
- [セッション] タブ: 保存されているすべてのセッションを表示
- タブリクエスト：リクエストに関する情報を表示
- ...

#### インストール

まず、Laravel プロジェクトに移動します。
```php
cd C:/xampp/htdocs/laravel-project
```

次に次のコマンドを実行します。
```php
composer require barryvdh/laravel-debugbar --dev
```

config/app.phpファイルを開き、[providers]を見つけて、次のコマンドを追加します。
```php
Barryvdh\Debugbar\ServiceProvider::class
```

Laravel デバッグバー ファサードを使用したい場合は、config/app.php ファイルのエイリアスに以下を追加する必要があります。
```php
'Debugbar' => Barryvdh\Debugbar\Facades\Debugbar::class
```

次のコマンドを使用してパブリック構成ファイルを作成します。
```php
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
```

インストールが成功した後、Web サイトにアクセスすると、Web の下部にデバッグ バーが表示されることがわかります。
このバーをクリックするとその機能が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/19d53c4a-a82f-a636-75b5-a4fbb6cc1b24.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/aab704e6-c802-0820-12e0-7864b7302f14.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/74f09dfd-a65c-0f50-0af9-bbdb8f1274eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/890af669-92d4-d102-3aab-4fcc69b55091.png)
__※注意__
Debugbarは、APP_DEBUGがtrueに設定されているのみ有効になります。