OmniAICreator/Qiita-1.07M huggingface dataset:
【HackTheBox】つまったところを備忘録的に残す 第3回

１：はじめに
　仕事で忙しくなかなか時間が作れなかったうえ、wslの環境が不安定であったことから、外付けHDDにkali-linuxをインストールしました。
 　kaliくんも安定しているのでよかったです。

２：つまった、というか理解できなかったところ
　→oopsieのbugtrackerでなんでrootがとれるのか。
 　理由：つまるところはまあ山ほどあるのですが、ここの部分だけがすぐにわからなかったです。
　　　bugtrackerを使うところで、なんでrootがとれるのか。
　　　自分なりに調べ、理解したことを書きたいと思います。
   　☆理解ポイントは極論走っているところがあるかもしれませんので、鵜呑み厳禁です。

３：SUIDについて調査
　→bugtrackerの属性調査＝なんや「ｓ」がついている・・・？
　→ちょっと調べてみたところ
  　　『属性にsがついているファイルは、一般のユーザでも所有者と同じふるまいができる』
　　とのこと。
　　　　☆理解ポイント【bugtrackerの所有者（root）と同じ権限になれる】
    
4:bugtrackerの動きについて整理
　→catを使ってユーザが入力したファイルの内容を表示させる機能を利用していることが判明。
　→catの内容を書き換えた偽catを作成、それをbugtrackerで実行すれば偽catの内容を実行
 　させることができるのでは？
　　　　☆理解ポイント【偽catの内容を書き換え、root権限とれるもの】

5:問題点
(1)偽catの内容をどうしたらよいの？
(2)偽catをどうやって実行させるのか？

6:自分なりの回答
(1)について
　→よく「シェルを奪取」という言葉を聞くので、シェルを準備することに。
　→「/bin/sh」が一般的に使われている印象だったので、こちらを偽catに記載。
 　　※上記がシェルのシンボリックであることに初めて気づく。
　→保存先はtmpフォルダに。tmpフォルダ移動後に以下コマンド実行。
 　　　　☆理解ポイント【echo "/bin/sh" | tee cat みたいに記載】
(2)について
　→色々調べてみると、環境PATHをいじることでいけそうな感じ？
　　　※PATH・・・コマンドの実行ファイルを探すためのディレクトリパスのこと。
   　　　　　　　こいつのおかげでフルパスを指定することなくコマンド実行が可能になる。
　　　　　　==>こいつをつかって偽catに誘導することで、bugtrackerで走査しているcat
      　　　　　の内容を変更させることができると理解（いわゆる脆弱性ですな）
　→環境PATH変更のため、exportコマンド利用
 　　　　☆理解ポイント【export PATH=/tmp:$PATH　と記載】
　→上記実施後と通常の比較を下に記載
　　【前】echo $PATH
　　　/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games
　　【後】echo $PATH
  　　　　/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
　　　　※前にtmpが入り込んでいることを確認。

７：最後
・準備後、bugtrackerを実施すると、root権限でシェル起動していることが確認できました。（whoami）
・フラグを見つけても、catコマンドたたいても反応ありませんので注意。
　→フラグを別フォルダに移動、root権限抜けてから確認しました。

 〜以上〜
Windowsでnext devが実行できない時の事前設定

外部リポジトリクローン後（git clone）、起動までに以下のエラーでハマってしまったので
忘れないうちに。

```
C:>yarn dev
yarn run v1.22.21
$ next dev
'next' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

公式サイトを参考に以下のコマンドを実行し起動が出来ました。
https://nextjs.org/docs/getting-started/installation

```
npm install next@latest react@latest react-dom@latest
```

必要コンポーネントが不足していたかなと。
宜しければご参考に！
HTML/CSSで文字をグラデーションにする

### 実行結果
以下の画像のように文字にグラデーションをつける方法をご紹介します。

![文字を透明にしてグラデーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/34402eb2-c68c-19fc-e474-477e0c5902a1.png)

### ソースコード
■htmlファイル
```
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
<title>CSSで遊ぶ</title>
</head>
<body>
<h1>文字のグラデーション</h1>
</body>
</html>
```
■cssファイル
```
h1{
	background:linear-gradient(#ff69b4,#d8bfd8);
	
	-webkit-background-clip:text;
	-webkit-text-fill-color: transparent;
}
```
### CSSについて

<dt>linear-gradient(開始する色,終了する色)</dt>
第1引数の色から第2引数の色に向かって変化していきます。

<dt>background-clip</dt>
背景の適用範囲を指定できます。ここで使用しているtextは、背景を前景のテキストの中に切り取って指定できます。

<dt>text-fill-color</dt>
テキストの塗りつぶしの色を指定できます。ここではtransparentでテキストの色を透過させています。

### HTML5/CSS3の学習に参考となったサイト
https://html5exam.jp/measures/dojo_1_01.html

この記事はここまでです。呼んで
[Google Drive API v3] Javaでユーザーとドライブ、システムに関する情報を取得する

Google Drive API v3（Java）を使用して、
ユーザーとドライブ、システムに関する情報を取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[ユーザー、ドライブ、システム情報の取得](#1-ユーザードライブシステム情報の取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. ユーザー、ドライブ、システム情報の取得

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

DriveScopes.DRIVE
DriveScopes.DRIVE_APPDATA
DriveScopes.DRIVE_FILE
DriveScopes.DRIVE_METADATA
DriveScopes.DRIVE_METADATA_READONLY
DriveScopes.DRIVE_PHOTOS_READONLY
DriveScopes.DRIVE_READONLY

[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

setFieldsで取得したいフィールド（[About](#about)）を指定します。
指定しないとエラーになります。
ここでは「*」(全て取得)を指定しています。

```
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.About about = drive.about();
    
    Drive.About.Get get = about.get();
    get.setFields("*");
    
    About res = get.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/drive/v3/about
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

### 1.3. レスポンスの内容
#### About

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|appInstalled|getAppInstalled|Boolean|ユーザーが要求元のアプリをインストールしているか|
|canCreateDrives|getCanCreateDrives|Boolean|ユーザーが共有ドライブを作成できるか|
|driveThemes|getDriveThemes|List\<[About.DriveThemes](#aboutdrivethemes)\>|共有ドライブでサポートされているテーマ|
|exportFormats|getExportFormats|Map\<String,List\<String\>\>|サポートされているすべてのエクスポートの可能なターゲットへのソース MIME タイプのマップ|
|folderColorPalette|getFolderColorPalette|List\<String\>|現在サポートされているフォルダーの色は RGB 16 進文字列として表示|
|importFormats|getImportFormats|Map\<String,List\<String\>\>|サポートされているすべてのインポートの可能なターゲットへのソース MIME タイプのマップ|
|kind|getKind|String|リソースの種類<br>固定文字列："drive#about"|
|maxImportSizes|getMaxImportSizes|Map\<String,Long\>|MIME タイプ別の最大インポート サイズのマップ (バイト単位)|
|maxUploadSize|getMaxUploadSize|Long|最大アップロード サイズ (バイト単位)|
|storageQuota|getStorageQuota|[About.StorageQuota](#aboutstoragequota)|ユーザーのストレージ割り当て制限と使用量(バイト単位)|
|user|getUser|[User](#user)|認証されたユーザー|

#### About.DriveThemes
|メソッド|戻り値|説明|
|---|---|---|
|getBackgroundImageLink|String|このテーマの背景画像へのリンク|
|getColorRgb|String|RGB 16 進文字列としてのこのテーマの色|
|getId|String|テーマのID|

#### About.StorageQuota
|メソッド|戻り値|説明|
|---|---|---|
|getLimit|Long|使用制限(バイト単位)<br>ユーザーが無制限のストレージを持っている場合は存在しない|
|getUsage|Long|すべてのサービスにわたる合計使用量|
|getUsageInDrive|Long|Google ドライブ内のすべてのファイルの使用状況|
|getUsageInDriveTrash|Long|Google ドライブのゴミ箱ファイルによる使用状況|

#### User
|メソッド|戻り値|説明|
|---|---|---|
|getDisplayName|String|このユーザーのプレーンテキストの表示可能な名前|
|getEmailAddress|String|ユーザーの電子メールアドレス|
|getKind|String|リソースの種類<br>固定文字列："drive#user"|
|getMe|Boolean|このユーザーが要求ユーザーであるか|
|getPermissionId|String|権限リソースに表示されるユーザーのID|
|getPhotoLink|String|利用可能な場合、ユーザーのプロフィール写真へのリンク|

<br>
<br>
おしまい。。
ラズパイのワイファイ非力さについて

# ラズパイをLANで運用することに

ラズパイっていうキーボード一体型のがあり、それをつかってます。
どうもワイファイの捕獲能力がちょっとおとっているようです。
けっこうかなりおそばにハブがあるけど、電波がよわいです。
スマホだと、もっと強くキャッチするんです。

# ものはためしということで

ためしにLANで接続してみました。ケーブルをあしでひっかけそう。
リスキーだけど、背に腹は変えられないということで
ためしております。

# LANでかく技術系ブログ

LANで技術系ブログをかいてます。
このサイトもラズパイ＋ワイファイだとたちあがりがおそくかんじる。
ときどきそうかんじます。


# 家族から苦言を呈され

家族がいうには、ラズパイのワイファイが非力すぎて
旅行宿泊サイからの予約ができないくらい、おそい。
つかいものにならない。そのように苦言を呈されました。

# あとで家族に試してもらう予定

家族に使ってもらいたいです。
LANだと大丈夫っていってくれそうです。
Selenium + pyinstallerで実行後コンソールが閉じない問題の対処

## 概要
Seleniumでブラウザ操作するスクリプトを作成、配布用にpyinstallerでexeファイルにした。

しかし、実行後にコンソールが閉じない。(手動で閉じる必要ありという症状)

## 試したこと
以下全てで改善せず。
```
sys.exit()
quit()
os._exit()
```
## 原因
SeleniumのWebdriverを一切終了していなかったことが原因。
```
driver.quit()
```
で解決。
【cursor】vscodeに代わるエディターが話題らしい

## cursorとは
今話題のIDE。超ザクっと言ってしまえば「chatGPTを標準搭載したvscode」ということらしい

**参考：**
【Cursor】AI搭載の最強コードエディタ！日本語の使い方や料金体系、できることを解説 | WEEL
https://weel.co.jp/media/cursor

## vscodeからの移行しやすいか？
cursorのインストール時に拡張機能などの引継ぎが可能。おそらくはほぼ同じ使用感のまま移行できるかと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071130/28e8d751-6467-4a11-71aa-96468a1bf442.png)
Github Copilotも利用可能。

## 無料？
無料でも使える。
ただし無料だとchatGPTの利用回数制限がかなり厳しい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071130/e7f9b1bb-f337-bf5d-b91b-4a0cbd6b6838.png)
たぶん即行で上限に達しそう。
（しかもGPT-4に関しては「per month」ではないので永久っぽい）

## 有料プラン
月20ドルと40ドルのプランがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071130/9c68096f-048f-40ae-f3ce-a851f844795b.png)

## OpenAI APIが使える
「そんなに頻繁に使わないから月20ドル分も利用しないかも？」って不安な方に朗報。
従量制課金のOpenAI APIが使える。

**参考：**
GPT-4利用： OpenAI APIを使ったCursorの従量制課金
https://note.com/sojin25/n/n6d5f02766906

## 結論
vscodeの代わりにしばらく使ってみようと思う。

従量制課金で月20ドル以下で済むならchatGPT Plusはやめて、
- コードに関することは「cursor + openAI API」
- それ以外のことは「Claude」

でまかなえそう。
【ChatGPT（Web版）】が動かなくなった方へ。その続き。


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

　今回は、ChatGPT（Web版）が動かなくなったその原因である多要素認証機能ほかについてです。

:::note info
本記事は、ChatGPT（無＆有）
で行なっております。あしからず。
:::

　まずは、
　　昨日（2024/03/09）の
　　　記事で、一時的に直ったが
　　　　また入力が送信
　　　　　できなくなった方は
　　　　　　昨日の記事の最後を
　　　　　　　ごらんください。
　　　　　　　　追記してあります。
[【ChatGPT（Web版）】が動かなくなった方へ。試してみて。](https://qiita.com/kabumira/items/c77d0ca2f22029faf15a)
***
　↑の原因となったと思われる
　　多要素認証機能について、
　　　調べました。
***
***Google SGE***
多要素認証（Multi-Factor Authentication・MFA）とは、認証に使用する要素を2つ以上組み合わせて認証を行うセキュリティ手法です。

認証に使用される要素は、パスワードなどの「知識情報」、ICカードなどの「所持情報」、指紋などの「生体情報」の3要素です。
﻿
多要素認証は、インターネット上のサービスやアプリケーションにログインする際に行う本人確認方法の1つです。複数の要素を組み合わせることで、セキュリティを強化することが可能で、第三者からの不正ログインをかなりの確率で防ぐことができます。
﻿
多要素認証の例としては、ATMからお金をおろす際が挙げられます。この場合、所持情報であるキャッシュカードに加え、知識情報である暗証番号が必要となるため、「多要素」な認証をしていると言えます。
﻿
多要素認証を導入することで、不正アクセスを防止し、組織のセキュリティ体制強化を図ることが可能です。﻿﻿
***

　“セキュリティ強化するよ”と
　　言っているわけですね。

　これを有効にすると
　　“アプリをダウンロードしろ”的な
　　　感じになります。

　ダウンロードして
　　認証すると、
　　　六桁の番号が
　　　　割り当てられて
　　　　　ログイン時に
　　　　　　入力することで
　　　　　　　ログインできます。

　この番号割り当ては
　　有効な時間に制限があり
　　　ログイン時に割り当てて
　　　　もらわないとダメです。

　ちなみに、
　　アプリ画面のスクショを
　　　撮ろうとしたら
　　　　ダメでした。

　まぁ、セキュリティの
　　観点からしたら
　　　当然なのかもですが。

　パターン的に
　　SNS認証に近いものですね。

　多要素認証機能を
　　使うかどうかは
　　　みなさんの判断に
　　　　お任せします。
***
　さて、
　　ChatGPT有料版の
　　　設定（Settings）ですが
　　　　多要素認証機能以外にも
　　　　　追加されています。

　・一般タブ
　　・多要素認証
　　・データアナリスト～
　　　　CodeInterpreterのコードを
　　　　　いつも開いておくか、を
　　　　　　指定できます。

　・スピーチタブ
　　音声に、誰を設定するのか。
　　　つまり、音声出力が可能です。
　　　　ChatGPTからの返答に
　　　　　スピーカーマークが
　　　　　　付きますので
　　　　　　　それをタップすれば
　　　　　　　　音声出力して
　　　　　　　　　くれます。

　・ビルダープロフィールタブ
　　内容が多くなっています。
　　　GPTsを作成して
　　　　セーブする際の
　　　　　情報になります。
***
　それとは別に
　　DALL-E3で画像を生成して
　　　ダウンロードしようとした際に
　　　　画像を少しロングタップ
　　　　　していると
　　　　　　アイコンが出てきますね。

　そのアイコンで
　　ダウンロードする方はご注意を！

　アイコンの配列が
　　　変更されています。

　といっても
　　たいしたことは
　　　ありません。

　左側にあった
　　ダウンロードアイコンが
　　　右側に来て、
　　　　左側にはGood/Badアイコンが
　　　　　来ています。

　最初、
　　それに気付かずに
　　　Goodアイコンを押してしまい
　　　　ちょっと焦りましたよw

　みなさんも
　　気を付けて
　　　おきましょう。

　今回は、ここまで。
AWS SCS-C02  合格体験記

## はじめに
記事の内容はAWS Certified Security - Specialtyの合格体験記になります
(2024/3/10合格なのでこの時点での情報)

## 自分について
私は2022年にAWS SAAをギリギリで合格した感じです。
自己啓発と１つ上の資格を取得したくて今回受けました。

## 学習方法
●<strong>問題集</strong>
　・Cloud license
  　・【徹底対策 AWS認定 セキュリティ - 専門知識: 65問×3セット 195問（SCS-C02 対応） クラウド試験徹底対策シリーズ】
   
  後は公式ドキュメントを読むようにしましたが、頭に入っているかは別問題

### <strong>学習期間/どのように学習したか</strong>

<strong>●学習期間</strong>
3か月ぐらい
●<strong>どのように学習したか</strong>
・Cloud licenseの全問題400問ぐらいを
2周/間違えた問題を1周しました


直前に<strong>【徹底対策 AWS認定 セキュリティ - 専門知識: 65問×3セット 195問】</strong>を購入して勉強しました。
この教材おすすめです。解説が間違えた選択肢と正しい選択肢を比較して、こちらの選択肢が適切なんだよ　という風に教えてくれています。解説がとても丁寧で教科書のような問題集です。この教材も購入して学習することを強くおすすめします


## 試験の所感
<strong>(余談)</strong>
自宅で受験したのですが、ここでトラブルがありまして
めちゃくちゃ変な姿勢で座ったまま、これ以降、Webカメラから顔を外さないでと言われてしまいまして…。
変な姿勢で腰がやられ、脚のしびれと戦いながら受験しました(笑)　なので見直しもできないまま、試験は50分ぐらいで解き終わりました。（終わらせたが正しいかも）

<strong>本編</strong>
長文はそこまでなくｻﾗｻﾗと解けました。
選択肢を見て、「あ。これだわ」と確信できるものも多かったです
上で羅列した教材と傾向は同じでした。

## 感想
試験直前じゃなくて<strong>【徹底対策 AWS認定 セキュリティ - 専門知識: 65問×3セット 195問】</strong>を真っ先にやれば理解が早かったと思いました。
それぐらいこの教材すばらしいです
上の教材はYOUTUBEに例題と解説があるので是非覗いてみてください

:::note info
記事の情報は2024/03/10時点となります。これ以降試験や教材に関して変更されることを考慮ください
:::
ABC344回答メモ

# 0.はじめに
　A~Cは順調に解けたものの、DがDP使いそうなのでちょっと避けて
 Eに取り掛かったらTLE1つと絶妙に解けませんでした。
 手法を変えればよかったのですが、元のやり方に固執して
 変に工夫して嵌り、久々にA~Cの3問のみ正解と、惨憺たる成績に。
 レートも-25と急略し941とだんだん下がってきました・・・。


# 1.A - Spoiler
　パイプの間の文字をパイプごと除去する問題。
 インプットを文字毎にリスト化し、頭から見ていき
 回答用変数ansに一文字ずつ入れていき、
 はじめの"｜"から最後の”｜”まではansに入れないことで対応しました。

　https://atcoder.jp/contests/abc344/submissions/51028396


# 2.B - Delimiter
　いつも過剰なまでにリストの件数等教えてくれるアットコーダーが
 急に不親切な感じになった問題。

 まぁ、頭から入力をリストに入れてしていきつつ、インプットが
 0だったらループ終了。
 今度はリストを最後から開業しつつ出力ですんなりACでした。

　https://atcoder.jp/contests/abc344/submissions/51035850


# 3.C - A+B+C
　2個だけ足しとくとか、2分探索駆使とかいろいろよぎりましたが
 制約でA,B,Cそれぞれ100個程度とわかったので、とりあえず
 変数100個ずつで全部足し合わせた場合に時間が間に合うかを
 テスト。
 十分間に合ったので、以下の実装
 【実装】
 　1.各入力読み込み
 　2.リストA,B,Cをそれぞれset化
 　3.セット化したA,B,Cから一つずつ取り出し
  　 全組み合わせの結果を辞書Dに登録
 　4.Xを頭から読んでいき、Dにある場合Yes、無い場合Noを出力して終了

　https://atcoder.jp/contests/abc344/submissions/51044925


（Dは飛ばしました。）

# 4.E - Insert or Erase
　1時間以上なやんでもTLEを外せなかったでした。
 解説を見て、方向性が違いすぎたことを知りやり直したら
 うまくいきました。
 
 【考え方1(TLE1をクリアできず)】
 　・辞書にキーA[i]、値に[str(i+20000000),200000]をセット
  　 値の1つ目は位置、2つ目は自分の後に置かれた人につける番号。
     例）1番目の値が３の時
    　 キー：3、値[”20000000”,200000]
 　・Q回クエリーを読み込む
  　　・クエリー1の時
    　　-辞書Dにキーyを登録、値は、
　　      [D[x]+str(D[x][1]),2000000]
    　　  辞書のxの値を結合した値を値の1つ目、値の二つ目は2000000をセット
    　　-D[x][1]から1をマイナス
     例）1番目の値が３の時、3の後ろに4をセットしたとき
    　 キー：3、値[”20000000”,199999]
    　 キー：4、値[”20000000200000”,200000]
     例）さらに、3の後ろに5をセットしたとき
    　 キー：3、値[”20000000”,199998]
    　 キー：5、値[”20000000199999”,200000]
    　 キー：4、値[”20000000200000”,200000]
 　・クエリー後辞書から、値の1個目とキーを取り出したtupleを
  　 ansリストにセットし昇順ソート。
 　・並び替えたリストからキーを取り出して表示して終了。

  　冷静に考えると、値1個目が長くなりすぎるので
   まぁ、うまくいかない気はしました。
　　解説を読んで、なるほどーと思いつつせこいTLE解消方法の模索
   (コンパイラの変更とかC++に変換とか・・・)ではなく真面目に
   方法の見直しをすればよかったと反省しました・・・。
   
 【実装(解説を読んで作成)】
  1.辞書Dを用意
  　キーに値、値にリスト[前の値,後ろの値]を持たせる
  2.並びの先頭として、値-1、前の値-2、後ろの値A[0]を登録
  3.並びの末尾として、値INF、前の値A[-1]、後ろの値INF+1を登録
  　INFは10**10
　4.リストAの値を辞書に登録(以下i=0～N-1)
 　～前の値を登録
 　-1.iが0の時
  　-DにキーA[i]、値[-1](リスト)を登録
 　-2.iが0以外の時
  　-DにキーA[i]、値[A[i-1]](リスト)を登録
 　～後ろの値を登録
 　-3.iがN-1の時
  　-D[A[i]]の値リストに、INFを追加
 　-4.iがN-1以外の時
  　-D[A[i]]の値リストに、A[i+1]を追加
　5.以下Q回繰り返し
  -1.1行インプット(以下1個目をq、2個目をx3個目をyとする)
  -2.qが1の時
   -1.挿入する位置に今ある数(xの後ろの数)をaftxに保持
   -2.辞書D[x][1](ｘの後ろの数)にｙをセット
   -3.辞書D[aftx][0](ｘの元後ろの前の数)にｙをセット
   -4.辞書D[y]に[x,aftx]を登録
  -3.qが2の時
   -1.削除するxの前の数をprexに、後ろの数をaftxに保持
   -2.辞書D[prex][1](ｘの前の数の後ろの数)にaftxをセット
   -3.辞書D[aftx][0](ｘの後ろの数の前の数)にprexをセット
　6.回答用リストansに[D[-1][1]]先頭の数をセット
　7.チェック用変数chkにD[-1][1](先頭の数)をセット
　8.以下、D[chk][1]がINFになるまで繰り返し
 　(リストの値が1個の時は以下ループを通らない)
  -1.chkにD[chk][1]をセット
  -2.リストansにchkを追加
　9.ansを出力して終了

　https://atcoder.jp/contests/abc344/submissions/51099103


以上
submoduleの使用目的メモ

## はじめに
gitのプロジェクトにsubmoduleというもので管理する方法があります。
操作方法は調べたら色々ありますが、目的がいまいち掴めなかったので理解できるレベルで整理しました。
ここではsubmoduleの使用の仕方ではなく、使用して何がありがたいのかを記載します。

## submoduleのメリット
submodleを使用したプロジェクトの利点は簡単に記載する以下になります。
<b>
・サブモジュールごとのコミット位置を記録できる
・サブモジュール毎に作っていくことができる。
</b>
プロジェクトで、submoduleごとの特定のコミット位置を、プロジェクトにセットできるということです。
バックエンドとフロントエンドを別々のプロジェクトで作っていたとして、<b>それぞれのタイミングでテストして管理したい場合</b>、プロジェクトのsubmoduleとして管理するという使用の仕方ができます。
つまりプロジェクト間でこういうセットで管理するという場合にとても有効だということです。

1. **依存関係の明確化**：プロジェクトが他のリポジトリに依存している場合、その依存関係を明示的に管理できます。これにより、必要な依存リポジトリの正確なバージョンを確保できます。
   
2. **独立した開発**：サブモジュールは独自の開発ライフサイクルを持っています。つまり、サブモジュール（例えばフロントエンドやバックエンドのリポジトリ）は、親プロジェクトから独立して更新やテストを行うことができます。
   
3. **統合管理の容易さ**：親プロジェクトでは、サブモジュールの特定のバージョンに対する参照を管理します。これにより、プロジェクト全体が一貫した状態であることを保証しつつ、各サブモジュールの更新を容易に取り込むことができます。


### submoduleを使用している場合のクローン例
以下は特定位置の状況をプロジェクトよりセットする方法です。
今回操作記載は対象外でいきなり感がありますが、submoduleのコミット位置のセットの趣旨から記載しています。

1. **リポジトリをクローンする**:
    ```bash
    git clone --recurse-submodules <リポジトリURL>
    ```
`git clone` コマンドを実行すると、デフォルトでリモートリポジトリのデフォルトブランチ（多くの場合は `main` または `master`、リポジトリによって設定されている)に依存します。
　
2. **特定のブランチにチェックアウトする**:
リポジトリ内に移動し、希望するブランチにチェックアウトします。

```bash
cd <リポジトリ名>
git checkout <ブランチ名>
```
特定のブランチに切り替えますが、サブモジュールがある場合、この時点でサブモジュールの状態は自動的には更新されません。サブモジュールを更新するには、次のステップが必要です。
　
3. **サブモジュール内の同期**:
以下を行います。
```bash
git submodule update --init --recursive
```
以上のプロセスにより、プロジェクトを特定のブランチやコミットに基づいてクローンし、すべてのサブモジュールを含めて正しくセットアップすることができます。この手順は、開発者がプロジェクトの特定の状態を取得したい場合や、サブモジュールを含む複雑なプロジェクトを扱う際の手段となります。

(3の補足)
サブモジュールも含めたプロジェクト全体を、そのブランチで指定された特定の状態に同期させたい場合、`git submodule update --init --recursive` を実行します。このコマンドは、サブモジュールを含め、すべてのサブモジュールが親プロジェクトの`.gitmodules`ファイルに記載された特定のコミットまたはブランチにチェックアウトされるようにします。これにより、サブモジュール内のサブモジュールも含め、プロジェクト全体が一貫した状態になります。



## おわりに
submoduleは便利そうですが、ただそのメリットを享受するために、gitのsubmoduleの操作に慣れる必要があります。また改めて整理したいと考えています。

## 参考記事
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

https://qiita.com/sotarok/items/0d525e568a6088f6f6bb
Historyオブジェクト

Historyオブジェクトを使用するとブラウザの戻る、進むボタンと同じような動作をさせることができる。
back()メソッドとforward()メソッドをが定義されており、ブラウザ上の閲覧履歴上の1前に戻したり、先に進めたりできる。

```js
history.back(2)    // 2つ前の履歴に戻る
history.forward(1) // 1つ先の履歴に進む
```

go()メソッドは整数値を引数で渡すと履歴リストを前後に移動できる

```js
history.go(4)  // 4つ先の履歴に進む
history.go(-1) // 1つ前の履歴に戻る
history.go(0)  // 現在のページを再読み込みできる
```

#### 参考
https://www.oreilly.co.jp/books/9784873119700/
簡易に画像を表示するだけのクラスをつくる【道具としての OpenCV 画像認識】

# 本記事でできること
![Screenshot from 2024-03-10 11-24-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/ad9e7cdf-2408-07fd-300e-beb8087b6f3a.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 簡易に画像を表示するだけのクラスをつくる
画像認識のプログラムを制作する際、さっとフィルターを試して、結果を表示したい場合があります。一般には、OpenCVであれば`cv::imshow`を使用すると思いますが、デバッグの際に、`cv::imshow`と`cv::waitKey`を記述するのと、`window_name`を定義するのが億劫になることがありました。本記事では、どこでも、いつでも1行だけ書けばその場で画像表示ができるプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
int show_with_pause(const cv::Mat& image) {
    cv::imshow("show_with_pause", image);
    const int wait_time_second = 0;
    return cv::waitKey(wait_time_second);
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

int show_with_pause(const cv::Mat& image) {
    cv::imshow("show_with_pause", image);
    const int wait_time_second = 0;
    return cv::waitKey(wait_time_second);
}

int main(void) {
    std::string file_path = "../data/fuji.jpg";
    const cv::Mat loaded_image = load_image(file_path);
    const int key = show_with_pause(loaded_image);
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
就職活動の記事（シリーズ-02）

- [導入部](#導入部)
- [書類作成](#書類作成のセクション)
- [面接の定番問題](#面接の定番問題セクション)
  - [よく聞かれる質問](#よく聞かれる質問)
  - [各質問に対する効果的な回答戦略](#各質問に対する効果的な回答戦略)
- [面接の技術点](#面接の技術点)
- [联系方式](#联系方式)


# 導入部

<aside>
💡 本記事では、書類作成と面接での定番問題への対策を通じて、自身に役に立ったブログやYoutubeチャネルを紹介いたします。

</aside>

# 書類作成のセクション

<aside>
💡 良質な履歴書や職務経歴書は、求職者が面接の機会を獲得するための「鍵」となります。

</aside>

## 履歴書と職務経歴書の基本的なフォーマット

履歴書は定番な内容ですけど、書くときに、注意すべき点は二つあります。

- 第一点は書類の形式です。
    
    以下のリンクは履歴書テンプレートを提供されます。
    

[履歴書テンプレート～ダウンロードしてすぐに使える～](https://doda.jp/guide/rireki/template/)

- 第二点は学歴、職務、資格の時間です。
    
    私自身は間違いことを書くことがありました。具体的例は、実際の年は令和6年ですが、令和5年と書かれてしまいました。そして、だから、自分にとって有利な点であるにもかかわらず、人に悪い印象を与える逆効果を招いてしまった。
    

## 応募書類を際立たせるための具体的な書き方や表現のコツ

### 書く前に、意識すべき二つ点

- 自分の担当したプロジェクトを明確な認識を持っています。
    - 背景、目標、解決課題
    - 技術スタック（および選んだ理由）
    - 責任（具体的な仕事内容、チームと一緒に連携）
    - 貢献、実績（数字があれば、）
    - 学んだこと、自己の成長
- 過去の仕事経験を踏まえて、重点を置いて二、三百字の要約を形成してください。

私自身に役に立つブログは以下です。採用面接官を務める著者が、効果的な職務経歴書の書き方についてのアドバイスを提供しています。著者は、特にWeb系の大手企業への応募を前提に、技術スキルと人間性（ソフトスキル）の両面からどのように自己をアピールすればよいかを解説しています。

[見たいエンジニアの職務経歴書の書き方 - Qiita](https://qiita.com/newta/items/77eb14b1d67bc7ef1980)

# 面接の定番問題セクション

<aside>
💡 問題では**パーソナル、業務関連、転職関連など領域です**

</aside>

私はよく使う質問集は以下の二つです。これらの質問集に基づいて、ノートソフトウェアで自分の回答を加えて整理します。

[【未経験〜経験浅め向け】エンジニア面接質問集 - Qiita](https://qiita.com/Sho0987/items/9654af77ec9f58222a75#%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB---%E5%AD%A6%E7%BF%92)

[ITエンジニアの面接でされる質問の回答例34選！逆質問例15選！](https://unison-career.com/engineer-media/7328/)

私自身は、外国人ですので、よく聞かれる問題の上で、「いつ日本に来ましたか？」、「日本を選んだ理由は何ですか」、「日本より、なぜ海外の諸国を選びませんか」、「欧米など国はどう」そのような質問から逃げてはいけません。

## 面接でよく聞かれる質問とその質問の意図

## 各質問に対する効果的な回答戦略

# 面接の技術点

# 締めくくり
PHPerKaigi 2024 Day 2 に参加しました

PHPerKaigi 2024 に参加しました。
Day 2 のみ現地参加したので、その感想だけ適当に。

一応 [Qiita](https://qiita.com/yumechi/items/41086fe863dca49917da), [Zenn](https://zenn.dev/yumechi/articles/5333b55fe446e6) 両方に投稿しておきます。

## 聞いたセッション
### [キャッシュと向き合う、キャッシュと共に生きる](https://fortee.jp/phperkaigi-2024/proposal/69621b02-9027-4dc6-b116-2d24209b0c85)

キャッシュ戦略を考えるときに、キャッシュ利用・更新のアルゴリズムパターンが存在することを認識していなかったので、学びになりました。
若干感覚ベースでキャッシュ作成することが多いので、実装パターンをいろいろ試してみて選択肢を増やしていきたいと思います。

またトークの途中で RDBMS の bin log を使った復帰の話が出てきていましたが、これも興味深かったです。
RDBMS のアルゴリズム的なところはあまり意識したことがなかったので、追ってみようかなあという気持ちになりました。

多段キャッシュはやめよう。

### [privateメソッドのテストって書かない方がいいんだっけ？](https://fortee.jp/phperkaigi-2024/proposal/f23f927e-2ac8-498e-a047-6376831cbd07)

private メソッドのテストについてあんまり考えたことがなかったので聞いてみました。
結論としては仕様に対してテストを書くのが大事！（private メソッドにテストが書かれていることが目的ではない）というところでしょうか。

発表の中で書籍「[単体テストの考え方/使い方](https://book.mynavi.jp/ec/products/detail/id=134252)」が紹介されていましたが、自分もこの本には納得するとことが多く、また読み返したくなりました。

## LT

ちょこちょこしか見れていなかったので、記憶に残ったものだけ。

### [MySQL のインデックスの種類をおさらいしよう！](https://fortee.jp/phperkaigi-2024/proposal/a28d42c5-9df5-4c17-bc11-90643425fe25)

FULLTEXT インデックスの AGAINST で書くものとか、複数値インデックス、関数キーパーツは初めて知りました。
奥深いとともに、活用できる手段として頭の片隅に置いておきたいです。

### [とにかくHTTP3をライトニングに話す](https://fortee.jp/phperkaigi-2024/proposal/fc98f957-50b3-417e-85dd-5bc34665126a)

しっかり終えていなかった HTTP/3 の話を聞けてよかったです。
UDP ベースで、QUIC 使っているのは聞いたことありましたが、0-RTT, 1-RTT の通信の話は初めて聞きました。

一意の接続IDを持つことで、接続の再利用ができるとかそのあたりがどういう仕組みになっているのかが気になったので改めて理解を深めようと思います。


## ブース

こちらも記憶に残っているものだけ…（懇親会で飲んだら記憶が飛んでしまい）。

ウェディングパークさんのノベルティ企画で、福利厚生を紹介されていたのですが、どれも魅力的な福利厚生ですごいなと思いました。
自分は1日ハッカソンとか参加してみたいなあと思いました。

ポストマンさんのブースでAPIのシナリオテストや、gRPC のテストもできる話を聞き、知らない機能が多いなあと思いました。負荷テストもできるらしい。
APIテストでざっくりとしか使ったことがなかったので、機能面や無料・有料プランの違いなどを再度調べてみようかなと思います。

Findy さんで PHP系のカンファレンスの参加回数と、PHP経験歴というアンケートボードがあったのですが、実務のPHP経験歴は2年以下ないくらいで、PHPカンファレンスは2016年からずっと参加しているので、左上のほうにシールを張ったのですが、改めて変な参加の仕方してるのかもなあと思いました。

## スライドだけ読んだもの

前日などでリアルタイムに聞けなかったものです。読んだら追記するかも。

### [どうやってWebサービスのページ表示速度を1/3にしたか](https://fortee.jp/phperkaigi-2024/proposal/2c3ccd3d-9630-4bf9-a33b-3b7d40d5be69)

ツールを使って使用を意識した計測が大切で、当たり前だと思っている設定がされていないという落とし穴もあるので、改めて確認することが大事だなと思いました。

インデックスに関しても勘で張るのではなく、パフォーマンス測定結果を見ながらチューニングすることが大切ですね。

### [パフォーマンスを改善するには仕様変更が1番はやい](https://fortee.jp/phperkaigi-2024/proposal/939533ae-f26a-4bd3-a8e4-c88d820943c6)

仕様変更とありますが、内部的な型の取り扱いなどテクニカルな方法や機能で実現したい内容について深く考えられており、興味深かったです。
初期表示で全件表示しないとか、過去三か月の検索のデフォルト値にするとか、確かにあると便利で速度が出るかもしれません。

そういった仕組みの変更をするためには、ビジネスと技術の両方での調整もあります。
一方、ビジネス的な目的を解決するためのソフトウェアの表現としてパフォーマンスを改善するための変更をするという決断は難しいですが、選択肢としておきたいなと思いました。

## ほか

テストコードの話に発展して、会場内で雑に [レガシーソフトウェア改善ガイド](https://www.seshop.com/product/detail/18976) 、[レガシーコード改善ガイド](https://www.shoeisha.co.jp/book/detail/9784798116839) 、 [レガシーコードからの脱却](https://www.oreilly.co.jp//books/9784873118864/) の話をしていたのですが、改めてこの辺りも読み返さなければなと思うなどしました。
最近、いろいろな本を読んだ知識と経験で直感的に判断しすぎているでは？ と思ったので、一度基礎を見直してみようかなと思いました。

あと技術力って何なんだろう？を懇親会で考えさせられたので、改めて自分の言葉で技術力が何かを説明できるようにしておきたいです。

## 感想

PHPerKaigi は2回目の参加でしたが、とても楽しかったです。
今年は最後の日に参加できなかったのですが、可能なら金曜日は参加したかったですね。

Web に関するトピックに関しては PHP 関連のイベントから多く学びを得られるので今後もちょこちょこ参加していこうと思います。
Uipath Automation Ops 編 ガバナンス Robot ポリシー設定

## 初めに
今回はUipath AutomationOps ガバナンスでRobotのポリシー設定を行いたいと思います。

**Uipath AutomationOps ガバナンス Robot ポリシーのドキュメントは下記を参照ください**

https://docs.uipath.com/ja/automation-ops/automation-suite/2023.4/user-guide/settings-for-robot-policies

## ガバナンス Robotのポリシーを作成
ポリシーを追加
![スクリーンショット 2024-03-09 111817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736921/34743ff9-7fbe-ca38-2e5d-49c42c603347.png)

Robotのポリシー名を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736921/2c1d6dfd-923b-32b2-0562-9506078ed874.png)

Robotのポリシー設定画面に移行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736921/635c8b4c-07e3-4b41-a814-30201b2a363e.png)

## ランタイム アナライザー
### (1)ランタイム アナライザー既存設定
ランタイム アナライザーのルールは、ロボットがプロセスを実行する際にそのプロセスが組織ポリシーに準拠していることを確認します。

**RT-UIA-001 (アプリ/URL の制限)**
UI Automation アクティビティ パッケージ内のアクティビティで許可/ブロックされているアプリケーションまたは URL のリストを定義できます。

**RT-OUT-001 (ブロックするメール アドレス リスト)**
GSuite、Mail、Office 365 アクティビティ パッケージのアクティビティでメールを送信できないアドレスを定義できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736921/559fa617-7d97-7544-6fe1-592749d883c1.png)

### (2)ランタイム ルール

**有効化**
ルールを有効化するには、このオプションを選択します。
**アクション**
ルールのアクションを設定します。Error、Warning、Info、または Verbose のいずれかです。既定のアクションは Error です。
**パラメーター**
パラメーターを編集するには、横にある [編集] をクリックし、[既定値を使用] オプションを選択解除して、[値] ボックスで制限を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736921/116e7262-b1c5-9f69-2595-14f23a2adee2.png)

## 関連記事
**Uipath Automation Ops 編 ガバナンス**

Assistantポリシー設定

https://qiita.com/npoif/items/0be7c4af46b291a7794c

Studioポリシー設定

https://qiita.com/npoif/items/f3d82757929ee19e314b

Robotポリシー設定

https://qiita.com/npoif/items/b8ece5e8f3ced4000c4c

デプロイ設定

https://qiita.com/npoif/items/b61a494a82f358ebcd9f

**Uipath AutomationOps ガバナンス Robot ポリシーのドキュメントは下記を参照ください**

https://docs.uipath.com/ja/automation-ops/automation-suite/2023.4/user-guide/settings-for-robot-policies
【Android】TextViewの自動サイズ調整に関する落とし穴

# はじめに
TextViewの自動サイズ調整、テキストが動的に変わる場合や少々長い文言を設定しなければならない場合などにおいて非常に便利ですよね。
ただし、この自動サイズ調整には設定を誤ると予期しない結果が生じる可能性がありますので、今回はその点を備忘録的にまとめておこうと思います。

# 自動サイズ調整の落とし穴
まず、TextViewを以下のように設定しているとします。

```main.xml
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoSizeTextType="uniform"
    android:autoSizeMinTextSize="12sp"
    android:autoSizeMaxTextSize="100sp"
    android:autoSizeStepGranularity="2sp" />
```
一見すると特に問題ないように見えますが、この実装では自動サイズ調整が機能しない可能性があります。
特に動的にテキストが設定される場合において、以前設定したテキストのサイズから変わらないなどの不具合が生じます。

さて、上記実装の問題箇所ですが、layout_heightの設定がwrap_contentになっている点が問題箇所になります。
実は公式には自動サイズ調整においての注意点が以下のように記載されています。

:::note warn
注: XML ファイルで自動サイズ調整を設定した場合、TextView の layout_width 属性または layout_height 属性に値「wrap_content」を使用することはおすすめしません。そのようにすると、予期しない結果が生じる可能性があります。
:::

まさに上記の通りで、予期しない結果というのは、**動的にテキストを変えた場合にテキストサイズが変わらないことがあるよ**、という事を指しています。
TextViewを使用していたら自動サイズ調整は比較的使用頻度の高い設定ですが、Viewのサイズを見誤ると不具合が生じる可能性がありますので注意したいところです。

ご説明は以上になります。

# さいごに
Composeには現状自動サイズ調整機能はないので、今後に期待ですね。
画像内の２点間の角度を測る【道具としての OpenCV 画像認識】

# 本記事でできること
![Screenshot from 2024-03-10 10-54-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/b708493b-9a33-b5f7-657b-f7e223ad216f.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像内の２点間の角度を測る
カメラ画像から、画像内での２点間について、画像の横軸に対しての角度を知りたい場合があります。本記事では、画像内の２点間の角度を測るプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
注意点：角度の計測基点は画像左側からになります。これは、OpenCVの画像の原点が左上にあることが理由です。
```c++
float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }

float get_angle(const cv::Point start, const cv::Point finish) {
    const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
    return RAD2DEG(radian);
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }

float get_angle(const cv::Point start, const cv::Point finish) {
    const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
    return RAD2DEG(radian);
}

int main(void) {
    cv::Point point_1(100, 100);
    cv::Point point_2(850, 770);

    const float result_angle = get_angle(point_1, point_2);
    std::cout << "angle : " << result_angle << std::endl;
}
```

### 実行結果
```terminal
angle : 138.225
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
gRPC と REST の比較

# はじめに
APIは、異なるソフトウェアコンポーネント間でのデータ交換と相互作用を可能にするルールとプロトコルの集合体です。RESTとgRPCは、APIを構築するための2つの異なるアーキテクチャスタイルであり、それぞれ独自の利点と適用ケースがあります。

![DALL·E 2024-01-30 16.13.10 - A visually engaging and conceptual wide image representing the comparison between REST and gRPC for a Japanese audience API blog. The image should dep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/3d4998da-4728-a4ce-2cb8-af5bb8bd7725.png)
# RESTについて
REST (Representational State Transfer):
+ URLを使ってリソース（データ）にアクセス。
+ HTTPメソッド（GET、POSTなど）を利用。
+ テキストベース（JSON、XMLなど）でデータを交換。
+ シンプルで理解しやすいが、大量のデータや高頻度の通信には不向き。

REST（Representational State Transfer）は、リソースをURIで識別し、標準的なHTTPメソッドを使用して操作を行うアーキテクチャスタイルです。JSONやXMLでデータを表現し、HTTPリクエストとレスポンスボディでデータをやり取りします。シンプルさと広範囲の互換性が特徴です。

# gRPCについて
+ Protocol Buffers（バイナリフォーマット）を使ってデータを交換。
+ HTTP/2を利用し、高速な通信が可能。
+ サーバーとクライアント間の関数や手続きの呼び出しに特化。
+ 複雑なアプリケーションやマイクロサービスに適している。

gRPCは、高性能なRPC（Remote Procedure Call）フレームワークで、Protocol BuffersとHTTP/2を利用して効率的な通信を実現します。バイナリ形式のデータエンコーディングと、多様なストリーミングパターンのサポートが特徴です。

# 両者の類似点と相違点
![gRPC-vs-REST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/f5078719-6a31-61f8-2bf6-02ab329d7f12.png)
    https://blog.postman.com/grpc-vs-rest/ より

類似点として、RESTとgRPCはどちらもクライアント/サーバーアーキテクチャを採用し、HTTPを基盤としています。しかし、RESTはHTTP/1.1を、gRPCはHTTP/2を使用します。

主な違いは、データフォーマット、データ検証、通信パターン、設計パターン、コード生成にあります。RESTはテキストベースのデータフォーマット（JSON、XML）を使用し、gRPCはバイナリベースのProtobufを使用します。gRPCはデータの自動検証と、多様な通信パターンをサポートしているのに対し、RESTは一方的なリクエスト/レスポンスモデルに依存します。

# 使用シナリオ
RESTは公開APIやドキュメントが重要な場合に適しています。一方、gRPCはマイクロサービスアーキテクチャや、低遅延と高スループットが求められるアプリケーションに適しています。特に、リアルタイムのチャットやビデオアプリケーションでは、gRPCのストリーミング機能が有利です。

# 結論
RESTとgRPCは、それぞれ異なるニーズと状況に応じて選択してみてください。RESTは一般的で理解しやすく、gRPCは高性能と特定の通信ニーズに焦点を当てています。適切なアーキテクチャスタイルの選択は、アプリケーションの要件と目標に依存します。
Ubuntu 22.04をLenovo IdeaPad MIIX 320-10ICRにインストール

# 概要

Lenovo IdeaPad MIIX 320-10ICRを、これまで普通にWindowsPCとして使用していました。CPUがAtom x5-Z8350ということもありWindows11にアップグレードできないですし、そもそも低スペックすぎて辛いです。

放置していてもなんなので、Ubuntu 22.04を入れておこうと思いました。

# スペック

* CPU: Atom x5-Z8350 (1.44/1.92GHz)
* GPU: Intel HD Graphics 400
* Mem: DDR3L-1600 SDRAM 4GB
* Strage: 64GB eMMC

# 準備

Ubuntu 22.04のISOファイルをダウンロードしておきます。
別のUbuntuマシンでUSBメモリに書き込んでおきます。USB 3.0のメモリを使いましたが、USB 2.0のポートにさして作業しました。USB 3.0ポートならインストールは速かったかもしれません。

# Miix設定

もうこのマシンでWindows使わないし、ストレージは64GBしかないので、デュアルブートにはしませんでした。一応、Windowsで回復ドライブを作っておきました。

BIOSの設定をしておきます。電源を入れたらFn + F2を押します。**Configuration** 画面に切り替え、**Intel Pratform Trust Technology** と **Secure Boot** をDisableにします。Saveして再起動したら、Fn + F12を押して起動メニューからUbuntuインストーラーを選択できます。

![miix_bios.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/bf74efee-7e67-0a22-dd16-97a4c4e301b8.jpeg)

# Ubuntu 22.04 インストール

![miix_ubuntu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/81101365-5a75-2c8a-0306-179180b1905e.jpeg)

このとおり何事もなくインストール完了しました。画面がHiDPIになっています。このままだと画面が狭いので、**設定** の **ディスプレイ** で **任意倍率のスケーリング** をオフにします。画面サイズ200%だったのが100%になり画面が広がりました。ちょっと小さくて見づらいですね。

# インストール後

Chromium、Visual Studio Code、GIMP、Inkscape、FreeCADを追加してみました。問題なく動いているようです。Windowsよりずいぶん快適です。
Windows11初期設定メモ

自宅環境にWindows機を迎えるのは数年ぶり。色々と初期設定を行ったのでその時のメモです。

今は仕事で本格的な開発をすることも無くなったので、自宅は趣味用のMacがあれば十分だったけど、最近ExcelVBAでのツール作りを依頼されることが多くなった。しばらく無料のVMWareで急場をしのいでいたけど、レスポンスがいまいち。ExcelVBA程度ならたいしたスペックも要らないのでコスパのよいDellのノートPCを購入した。

# 初期設定
https://tanweb.net/2022/06/02/46452/

ここのサイトを参考に次の設定を変更

* OneDive と同期されたドキュメントなどの同期解除
* 回復ドライブを作成しよう
* マカフィーリブセーフは試用版なので削除してしまおう
* デスクトップに PC / コントロールパネルのアイコン表示
* プライバシーの設定をしっかりしておこう
* Microsoft からの宣伝や広告が出ないように設定しよう
* 高速スタートアップは無効にしておく方が無難です
* 画面の電源を切る & スリープに入る時間を調整しよう
* 自動で一時データなどのゴミを削除する機能を有効化する
* USB メモリや SD カードを接続後の自動再生の設定をしよう
* ファイルの拡張子が表示されるように設定しておこう
* ファイルやフォルダのチェックボックスを非表示にする
* タスクバーアイコンの位置を調整しよう
* システムフォントが視認しづらい場合は見やすいものへ変更

# 検索ボックスの余計な表示を消す
検索ボックスにニュースやら何やらを表示してくれる機能が邪魔だったので消した。
この機能は「検索ハイライト」と言うのも初めて知った。「検索ハイライト 消す」で検索すると方法が見つかる。

# コンテキストメニューを以前の形にもどす
前のほうが使い慣れているので変更。レジストリの修正がいるんだね。

https://pc-karuma.net/right-click-context-menu-back-on-windows-11/#%E5%B8%B8%E3%81%AB%E3%80%8C%E6%97%A7%E4%BB%95%E6%A7%98%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%80%8D%E3%82%92%E8%A1%A8%E7%A4%BA

# セキュリティソフトのインストール
マカフィーは好きになれないので付いてきたものはアンインソールしたので、別のものを。
ESETのが評判良さそうなのと体験版が使えたのでインストール。サブスク契約するかは、しばらく使ってみてから決める。

https://eset-info.canon-its.jp/home/

以前はカスペルスキーを使ってたんだけどロシア絡みで、ちょっと先行き不安なので

# Macからのリモートデスクトップ
Macからの接続はMS製のMac用リモートデスクトップクライアントを利用。
初期設定で「Command+C,Command+v」でWin側でもコピペできるようになってた。

https://apps.apple.com/jp/app/microsoft-remote-desktop/id1295203466?mt=12

リモートデスクトップが使えれば机が広くつかえるので快適。

## リモートデスクトップでファンクションキーをfnキーなしに使える様にする
Mac側の設定変更。VBAのデバッグでファンクションキーを使うとき、いちいちfnキーを押さないといけないのが、非常にめんどくさいのでfnキーなしでOKな様に変更した。

https://support.apple.com/ja-jp/102439

# 日本語入力
Google日本語入力でメイン機のMacと合わせた。

あと、MSのIMEだとMacからのリモートデスクトップ接続で日本語切り替えのキーバインドがうまくできなかったのも理由。IMEオン、オフに変換（＝かなキー）、無変換（＝英数キー）になるはずが、かなキーが認識されず英数キーを長押しするとIMEオンになる状態だった。

# Macからのリモートデスクトップを使いやすくする
## Windows環境でバックスラッシュが入力できるように

RDP接続したWin環境で円マークがUnicodeで入力されてしまって、コマンドプロンプトやPowerShellのコンソールでディレクトリ移動ができなくてこまったので設定を変更

Mac側はGoogle日本語入力の環境設定で「￥キーで入力する文字」をバックスラッシュに変更

~~Win側はこの記事を参考に
https://blog2.sem-it.com/?p=52
他にもいくつも記事があったけど、とりあえず一番簡単そうな方法で。~~


「Remote DesktopのConnectionsメニュー→Keyboard Mode→Unicode」と設定すると、ブラウザ上での入力にスペースが入力できなくなった。スペースキーを押すと別の半角文字（,とか%とか;とか、色々）が出てくる。原因不明だけど、検索ワードを入力するときものすごく困るので、元のScanmodeに戻した。

Windows側で「¥キーを押されたらバックスラッシュが押されたことにするプログラム」を常駐させる方法で回避しました。簡単。
ここで公開されています。感謝です。
https://qiita.com/stkchp/items/a08b48834d4a43d2acfc

## F11でMacのデスクトップを表示しないように
Win環境でのデバッグのとき、ステップインのF11がMacのデスクトップ表示と被っているので、システム設定→キーボード→キーボードショートカット→Mission Controlでデスクトップ表示（F11）を無効にした

# 雑感
久しぶりにWindows機を使ったけど、初期設定時のクラウドサービスへの誘導が鬱陶しいですね。

近所に、仕事をリタイヤしたおじさん、おばさんたちが多く居て、ちょいちょいPCの使い方をお手伝いするんだけど、クラウドサービスのパスワードを忘れてしまった人が沢山います。この年代の人達は「現役時代に買ったWin7機を最近買い替えた」ケースが多くて、新しいPCのセットアップのとき、訳もわからず、いろんなアカウントを作ってしまってるみたいです。

クラウドサービスを使うとPCとスマホの連携ができたり便利なんだけど、前提知識がなくても自然に使えるほどにサービスや仕組みは成熟がしてないんですね。
画像内の２点間の距離を測る【道具としての OpenCV 画像認識】

# 本記事でできること
![Screenshot from 2024-03-10 10-27-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/2e3746bb-9e79-f1d2-f90c-fd9b82d5569f.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像内の２点間の距離を測る
カメラ画像から、画像内での２点間のピクセル距離を計測したいことがあります。本記事では、画像内の２点間の距離を測るプログラムを掲載します。


# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
float get_distance(const cv::Point start, const cv::Point finish) {
    return static_cast<float>(hypot(static_cast<float>(finish.x - start.x), static_cast<float>(finish.y - start.y)));
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

float get_distance(const cv::Point start, const cv::Point finish) {
    return static_cast<float>(hypot(static_cast<float>(finish.x - start.x), static_cast<float>(finish.y - start.y)));
}

int main(void) {
    cv::Point point_1(100, 100);
    cv::Point point_2(850, 770);

    const float result_distance = get_distance(point_1, point_2);
    std::cout << "distance : " << result_distance << std::endl;
}
```

### 実行結果
```terminal
distance : 1005.68
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
どうしてあなたの共通化は間違っているのか：目次

# はじめに
この連載では共通化とモジュール分割について扱います。この話題においてQiitaで有名な記事のひとつが@MinoDrivenさんの[単一責任原則で無責任な多目的クラスを爆殺する](https://qiita.com/MinoDriven/items/76307b1b066467cbfd6a)でしょう。この記事を未読の方はまずこちらを読むことをお勧めします。本連載では、この記事に書かれているような基礎的な事項については既知であることを前提に、どのようにすれば単一責任原則にそったモジュールの分割を行うことが出来るのかをなるべく **「場合による」という言葉に逃げずに** なるべく **網羅的・理論的に** 解説します。

いいね、ストックをよろしくお願いします。

# 対象読者
- 設計に興味のあるエンジニア
- 基礎的な設計原則について学んだものの、実際の場面でどのように応用すればいいのかが掴めないエンジニア
- ミクロな設計についての知識を増やしたい人

※この記事では、特定のメソッドをどのように作成するべきか、このクラスは複数の処理の間で共有するべきかといったミクロな視点での設計を行います。そのため、アプリケーション全体のマクロな設計については説明しません。例えば、`Clean Architecture`や`MVVM`といったキーワードにはまったく触れません。
※もしもあなたがゲームエンジニアで、マクロな設計に興味がある場合は、[Unity設計入門](https://qiita.com/wolfmagnate/items/cf7081a0352667b12d6a)という連載をぜひ読んでください。

# リンク

- [第1章「単一責任原則の有用性」](https://qiita.com/wolfmagnate/items/6b467cc3c3cf13bd63b0)
- [第2章「抽象度と文脈」](https://qiita.com/wolfmagnate/items/49a18bcb95fcc1b1438d)
- [第3章「サブモジュール呼び出しの分類」](https://qiita.com/wolfmagnate/items/344cabc8fd38e4822217)
- [第4章「依存性逆転の原則」](https://qiita.com/wolfmagnate/items/00ec0d7214bf3bc96bc0)
- [第5章「新・単一責任原則」](https://qiita.com/wolfmagnate/items/2cc028913d33878200f3)
【Ruby】入力の確認とエラー処理（備忘録）

ChatGPTからRubyにおける入力の確認とエラー処理について教えてもらったので、一旦書き留めておく。
いますぐ実践するのは難しいが、早くこのレベルのコードをすらすらかけるようになりたい。
### 私
以下のコードについて解説してください。

array = []
array[0] = gets
array[1] = gets
puts array
### ChatGPT
このコードは、Ruby言語を使用して標準入力からユーザーに2つの入力を求め、それを配列に格納してから、その配列を出力する簡単なプログラムです。

解説を具体的に説明します：

1. `array = []`: 空の配列を作成します。これは後でユーザーの入力を格納するための容器として使用されます。

2. `array[0] = gets`: `gets` メソッドを使用して、ユーザーに対して1つ目の入力を要求します。入力された値は、配列 `array` の最初の要素に代入されます（インデックス0の位置）。

3. `array[1] = gets`: 同様に、`gets` メソッドを使用して、ユーザーに対して2つ目の入力を要求します。この入力も配列 `array` の2番目の要素に代入されます（インデックス1の位置）。

4. `puts array`: 最後に、配列 `array` を出力します。これにより、ユーザーが入力した2つの値が順番に表示されます。

このプログラムは、非常に基本的であるため、エラー処理や入力の検証が不足しています。ユーザーが期待通りの形式で入力することを前提としています。より堅牢なプログラムを作成するには、入力の確認やエラー処理を追加することがお勧めです。

### 私
「入力の確認やエラー処理」とは具体的にはどのようなものですか。

### ChatGPT
「入力の確認やエラー処理」は、プログラムが期待通りのデータを受け取るために、入力データに対する検証と処理を行うことを指します。これにより、不正確な入力やエラーが発生した場合に、プログラムが適切に対処できるようになります。

具体的な手法や検証の例を以下に示します：

1. **型の検証**: 期待されるデータ型と一致するかどうかを確認します。たとえば、ユーザーが数字を入力することが期待される場合、実際に数字が入力されたかどうかを確認します。

    ```ruby
    input_1 = gets.chomp
    input_2 = gets.chomp

    # 数字が入力されたかを確認
    if input_1 =~ /\A\d+\z/ && input_2 =~ /\A\d+\z/
      array[0] = input_1.to_i
      array[1] = input_2.to_i
      puts array
    else
      puts "数字を入力してください。"
    end
    ```

2. **範囲の検証**: 入力された値が期待される範囲内にあるかどうかを確認します。

    ```ruby
    input_1 = gets.chomp.to_i
    input_2 = gets.chomp.to_i

    # 範囲の検証
    if input_1.between?(1, 100) && input_2.between?(1, 100)
      array[0] = input_1
      array[1] = input_2
      puts array
    else
      puts "1から100までの範囲で入力してください。"
    end
    ```

3. **エラーハンドリング**: 例外処理を使用して、予期せぬエラーが発生した場合に備えます。

    ```ruby
    begin
      input_1 = Integer(gets.chomp)
      input_2 = Integer(gets.chomp)

      array[0] = input_1
      array[1] = input_2
      puts array
    rescue ArgumentError
      puts "整数を入力してください。"
    end
    ```

これらの手法を組み合わせることで、プログラムが安定して動作し、予測できない入力に対処できるようになります。
Vitest と Playwright でテスト実行

# はじめに
この記事では、Vitest と Playwright という2つテストを実行するための設定方法について記載します。

# 開発環境
開発環境は以下の通りです。

- Windows11
- VSCode
- Node.js 20.5.0
- yarn 1.22.19
- TypeScript 5.3.3
- React 18.2.0
- Vitest 1.3.1
- Playwright 1.42.1

# 背景
元々 Vitest を利用して、単体テストや結合テストを書いているプロジェクトがありました。そちらに E2E テストとして、Playwright をインストールしました。インストール直後のテストファイルの構成やテスト実行のスクリプト、設定ファイルは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/0a605aea-631d-1ffc-c64f-df3a3db4f37a.png)


```package.json
{
  ...
  "scripts": {
    "test": "vitest",
    ...
  }, 
  ...
}
```

```vite.config.ts
import react from "@vitejs/plugin-react";
import type { UserConfig } from "vite";
import { defineConfig } from "vite";
import type { InlineConfig } from "vitest";

interface VitestConfigExport extends UserConfig {
  test: InlineConfig;
}

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,
    open: true,
  },
  test: {
    globals: true,
    environment: "jsdom",
    setupFiles: "./src/__tests__/setup.ts",
  },
} as VitestConfigExport);
```

この状態でテストを実行すると、以下のように Playwright を利用しているテストファイルでエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/6ca892c7-a34f-1c97-8cf5-12e7d123eebc.png)

そのため、Vitest と Playwright のテストを別々に実行できるようにしていきます。

# Vitest のテスト実行スクリプト
Vitest は ```vite.config.ts``` でテスト実行ファイルを ```unit``` と ```integration``` に限定することで、エラーなく、実行できるようになりました。

```vite.config.ts
import react from "@vitejs/plugin-react";
import type { UserConfig } from "vite";
import { defineConfig } from "vite";
import type { InlineConfig } from "vitest";

interface VitestConfigExport extends UserConfig {
  test: InlineConfig;
}

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,
    open: true,
  },
  test: {
    include: [
      "**/unit/*.{test,spec}.?(c|m)[jt]s?(x)",
      "**/integration/**/*.{test,spec}.?(c|m)[jt]s?(x)",
    ],
    globals: true,
    environment: "jsdom",
    setupFiles: "./src/__tests__/setup.ts",
  },
} as VitestConfigExport);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/70a3f6b4-69bf-ea98-387f-57c2e6074108.png)

# Playwright テスト実行スクリプト
Playwright はテスト実行のコマンドをスクリプトを追加するだけで、エラーなく実行できるようになりました。

```package.json
{
  ...
  "scripts": {
    ...
    "test:playwright": "playwright test",
    ...
  }, 
  ...
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/9a0ae791-d841-9fd7-a014-37322d1d2375.png)

# 参考
- [Configuring Vitest](https://vitest.dev/config/)
- [Running and debugging tests](https://playwright.dev/docs/running-tests)
【データ分析】BIツールってなに？

# はじめに
"<font color="Red">**BIツール**</font>"というワードを聞いたことはありますか？
BIツールを扱う業務を行なっている身から、どのようなものなのかご紹介いたします:information_desk_person_tone1:

**BIツールってこんな感じなんだ！BIツール活用してみたい！** と感じていただけたら幸いです。

# BIツールとは
馴染みがない方もいらっしゃるかと思うので、どういうものかお伝えすると、

"<font color="Red">**データを可視化し、現状の把握と課題解決の手助けをしてくれるツール**</font>"

ざっくりとした説明ではありますが、なんとなくすごそうなツールだと思っていただけたのではないでしょうか。
補足ですが、BIは"**Business Intelligence**"の略です。

利用目的としてイメージしやすいのは、
* 会社の売上利益などの経営管理
* 社員の稼働時間などの労務管理

といったところでしょうか。

蓄積されているデータをグラフ化し、データ分析しやすくしてくれる優れものです。
以下は、元となるデータから実際に"**Power BI**"というBIツールを使用してグラフを作成したイメージ図です。
※わかりやすいように、少量なデータと簡素なグラフであることはご了承ください。

▼ Excelデータ
![スクリーンショット 2024-03-09 223239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/05581b6b-a7a9-abce-bff8-db3c45f50b10.png)

▼ BIツールで作成したグラフ
![スクリーンショット 2024-03-09 230832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/3129c834-13d0-09ab-0147-c94d16de1883.png)

# どのような用途で使用するのか
上記で経営管理を例に挙げましたが、まさに"**データを可視化し、現状の把握と課題解決の手助けをしてくれるツール**"の出番です。

現時点での売上や好調なのか（あるいは低迷なのか）把握したいときに、素早くデータを確認することができます。
データをグラフ化することにより、傾向が見え次のアクションを考えやすくなります。

**「商品Bが売上の5割弱を占めているんだな。最近は欠品になりやすいし生産を増やそう！」**

**「どの日も商品Cの売れ行きが良くないけど一応売上の2割は占めているな。商品Cの改良が必要なのか、他商品に人気が傾いているだけなのか調査しよう。」**

実際にBIツールを活用する際は、大量で複雑なデータかつ複雑な処理でグラフ化することが多いです。
データと向き合うにはデータ分析力が必要になってきますが、今まで見えていなかった実態が浮き彫りになると、データに対して興味や面白さが見出せますよ！

データを素早く確認するのに予めグラフ化しているテンプレートを用意しておくことがありますが、その場でちゃちゃっと作成してデータ可視化・分析することも可能です。
データを分析するまでには要件整理から始まりさまざまな工程があるので、工程ごとの詳細な内容は別記事でご紹介します。

# BIツールの魅力
ここまで読んでくださった方の中には、こう思われた方もいらっしゃるかもしれません。

「そしたらExcelのグラフ作成機能で良くない？」

おっしゃる通りです。
Excelならすでに導入している会社も多いでしょうし、BIツールを導入するにはもちろんお金がかかります。
**※製品によっては無料版もありますが、機能が限られており個人向けのため会社に導入するとなると有料版になるかと思います。**

ではなぜお金をかけてでも導入する人がいるのか、私なりの視点となりますが魅力を挙げます。

* <font color="Red">**さまざまなデータベースからデータを取得できる**</font>
データを保管している場所がOracleとExcelである場合など、ひとつにまとまっていないケースもあります。
導入するBIツールがサポート対象であれば複数のデータベースからデータを抽出でき、見たいデータを可視化できます。
* <font color="Red">**分析結果をレポーティングできる**</font>
例えば会議で配布する資料として出力し、全員で共有することが可能です。
製品によってサーバーやクラウドも用意されており、BIツールと併せて導入するとブラウザ上で閲覧できるようになります。
* <font color="Red">**グラフ遷移など機能の種類が豊富**</font>
データ分析に特化しているツールなので、分析しやすいように多くの機能が備わっています。
例：レポート①の商品Aをクリックすると、レポート②に遷移し商品Aの売上詳細が表示される

かなり簡潔に言ってしまうと、凝ったことをしたいならBIツール、最低限で十分ならExcelとなります。

# BIツール導入を検討するにあたって
BIツールについてつらつらと語っていますが、安易に手を出して無駄になってしまうケースも存在します。

導入する際は、<font color="Red">**"あるデータを可視化して課題解決に繋げたい"という目的が明確化できていることが前提**</font>となります。
"BIツールを導入する"ことが目的となってしまうと、どのように活用したら良いかわからない。。ということに陥ってしまう可能性があります。
あくまで"**手段**"ですので、最終的にどうありたいかを明確にすることでBIツールを導入した方が良いか、Excelなど他の手段で十分か、最適な手段が見出せるかと思います。

# 最後に
今回は、BIツールとはどういうものなのかについてご紹介いたしました。
グラフ作成など実際に触ってみると操作性が良いものの意外と奥深く、知識が必要になってくる場面も多々あるので、次回以降記事にしようと思います。

最後までお読みいただき、ありがとうございました:relaxed:
Windows11 ブルースクリーンで再起動をループの対応方法

## はじめに
デバイスドライバーのアップデートをした際に購入したばかりのノートPCが突然
青色の画面になり再起動をループしました。
その際の対応方法をまとめます。

## 対応手順
ブルースクリーンの詳細オプションをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/b1a221f4-b1ef-5cbd-3f34-b99d5c0a8dd8.png)

システムの復元をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/0f890c99-8458-feda-c85b-a6b4def97034.png)

システムの復元に回復キーを入力を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/39e8d97c-b994-d5b3-e7a1-0b14d588f94e.png)


回復キーはMicrosoftアカウントにログインしていただき以下のサイトから確認してください

以下のサイトにログインして回復キーを確認する
https://account.microsoft.com/devices/recoverykey

https://support.microsoft.com/ja-jp/windows/windows-%E3%81%A7%E3%81%AE-bitlocker-%E5%9B%9E%E5%BE%A9%E3%82%AD%E3%83%BC%E3%81%AE%E6%A4%9C%E7%B4%A2-6b71ad27-0b89-ea08-f143-056f5ab347d6


回復キーを確認して手で入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/89b1578c-bea2-4423-d74e-c3e0c251c180.png)

続行でリストアするファイルを選択して復元します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/5c980f5f-c954-dd5e-2401-d43990734c1c.png)


マクロソフトアカウントに回復キーがない場合　BitLockerを有効にする必要があります。
https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=5511-2896

chatGPT OSが対応していない可能性があります。
BitLockerがシステムに存在しない場合、それはWindowsのエディションやバージョンによる制限の可能性があります。**たとえば、Windows HomeエディションではBitLockerは利用できません。**


**Windows Homeエディション等ではサーフモードで起動して対応する様です。**
https://solutions.vaio.com/4324


## まとめ
**日ごろからブルースクリーンに備えてMicrosoftアカウントに回復キーがあることを確認します。**
ない場合は回復キーを作成する必要があります。

**復元ポイントは日ごろから作成した方が良いです。PCに問題が発生した場合は戻せなくなるため**
以下のサイトを参照してください
https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=3911-1211
Homebrew導入(MacPC)

## 前提
Homebrew未導入の人
MacPC使っている人向け

自分の書いているほかのプログラム関連記事の入門系・セットアップ・環境構築などではインストール物はほぼHomebrew前提で記事を作っているので事前に導入しておきたいのでこの記事で簡単に導入案内

## Homebrewとは？
Homebrewは、MacOS向けのパッケージ管理システムです
パッケージ管理システムとは、コンピューターにソフトウェアやツールを簡単にインストールしたり、アップデートしたり、アンインストールしたりするためのシステムです

QiitaなどではよくHomebrewのことをbrewと省略されていることが多いです

## Homebrewの特徴
・簡単なインストール
Homebrew自体をインストールする手順は非常にシンプルで、コマンドを数行入力するだけで完了します

・豊富なパッケージ
Homebrewを使用することで、ターミナルから様々なソフトウェアやツールをインストールすることができますそのライブラリは非常に豊富で、開発者や一般ユーザーのニーズに合わせた多様なパッケージが提供されています

・アップデートの容易性
インストールしたソフトウェアやツールを最新版に保つことが簡単です、Homebrewを使用すればターミナルから一括でアップデートすることができます

・依存関係の解決
インストールするパッケージが依存するライブラリやツールなどを自動的に解決してくれます、これにより手動で依存関係を解決する必要がなくなります

## ターミナル
導入にはターミナルを使います
ターミナルはAppleのmacOSに標準で付属しているUNIX端末エミュレータです

「Application → ユーティリティー → ターミナル」から起動でます
またはLunchpadで下記画像のような手順で起動できます
![スクリーンショット 2024-03-10 7.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/0539f45b-7ab7-a83e-a73b-d10d7c8b4106.png)
![スクリーンショット 2024-03-10 7.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/5457320a-f718-1b92-076f-4090affec40c.png)

ターミナル起動画面
![スクリーンショット 2024-03-10 7.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/d53f6d05-840c-2f5e-9dcc-2aef6ddc6969.png)


## 公式サイト
https://brew.sh/ja/

## 導入
Homebrewの公式サイトに記載されている、インストールコマンドを実行します
![スクリーンショット 2024-03-10 7.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/03ce691f-6c61-df64-7e71-b56913ce1c10.png)

```zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
※コマンドが更新されることがありえますので公式サイトのコマンドをコピペすると無難です

このコマンドを先ほどのターミナルに貼り付け実行します
![スクリーンショット 2024-03-10 7.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/5d42d634-6ce2-f077-4fe8-a989fb5d9b55.png)

Enterを押して実行すると、下記のようにパスワードの入力を求められますのでmacのログインパスワードを入力して実行
![スクリーンショット 2024-03-10 7.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/c4f06335-5700-23c6-ba18-a53624ba16a0.png)

途中Enterキーの入力が求められるのでEnter押して実行
![スクリーンショット 2024-03-10 7.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/6f2143f2-4f0b-6d72-576c-73ba4a7e8885.png)

その後、下記のようにXcodeのツールインストールが走ります
ここのXcodeのツールインストールは結構長いので気長に待ちましょう
![スクリーンショット 2024-03-10 7.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/2f4c172d-47cb-afcd-c5bc-5b3e8c509738.png)

下記のように「Installation Success」と表示されるところまで進んだらHomebrewの導入は完了です
![スクリーンショット 2024-03-10 7.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/21278f99-1e8a-6e42-aa15-6d0cb651c19c.png)

### 導入の確認
ターミナルで`brew -v`と入力して
このようにHomebrewのバージョンが表示されたら、正常に導入できています
```zsh
% brew -v
Homebrew 4.2.11
```

## おわり
以上でHomebrewの導入は完了です
Homebrewを入れたことで今後は必要なソフトウエアをHomebrewからインストールすることができます

例えばプラグラム言語のpythonをインストールしたい場合は下記のようなコマンドを実行することでインストールが可能になります
```zsh
% brew install python
```

ほかHomebrewを利用した各種インストールなどはここでは紹介しませんが
Homebrewを入れておけば入門系やセットアップなどの記事で困ることはなくなると思います
自分の他の記事では基本Homebrewの導入を前提としています