OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudioCodeでreferenceが変数上につかなくなった件

### VscodeのC#で変数の上にreferenceがつかなくなった件

解決策：C#拡張機能の1.X.X系のバージョンに変更する。

**もし入れていたら削除するもの**：

VisualStudioCode側
・拡張機能：Unity、C# Dev kit　を削除。 -> C#拡張機能の1.X.X系に対応していないため

**バージョン変更するもの**：
・拡張機能、C#をVer.1.2X.xに戻す（アンインストール→別のバージョンをインストール）
　∟　2.X.X以上のバージョンが問題有

PackageManager側などは特にいじらず問題ありません。

### 最後に

こんにちわ、最近Microsoftが「Unity」や「C# DevKit」という新しい拡張機能を出しましたね。
内容を確認すると、Mac勢のUnity開発が捗りそうな内容だったので入れてみました。
https://forest.watch.impress.co.jp/docs/news/1521609.html

すると、参照していない関数や変数には青い線のようなものが表示され、また変数の上にreferenceが表示されなくなりました。

vscodeが本当に使えないものと化したので元に戻そうかと思ったら思いのほか沼にハマり直すのに物凄い時間がかかりました。

新しいバージョンや拡張機能が出てもしばらくは使わないように心がけよう。。。
LINE Bot SDKとLangChain.jsでGPT入りLINE Bot Serverを作ってみる

# はじめに

ChatGPTはもちろんのことOpenAI APIもたくさん活用されていますね。LINE Bot + OpenAIというネタもまったく目新しさがない昨今ですが、[JS版のLangChain](https://github.com/hwchase17/langchainjs/tree/main)を使ってみたことがなかったので試用がてらLINE Bot Serverに組み込んでみました。せっかくなのでその手順を記載しておきます。

# どんなBot?

できたものはこちらです。

https://github.com/bathtimefish/line-bot-server-langchain-example

PromptTemplateを利用して料理名を送信すると必要な材料を返してくれます。ご飯の材料を買い物に行くときに便利かもしれません。

![Screenshot_20230813-191110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/d404eefe-6dea-dfd1-83a8-0884a95c6bb6.png)


# 仕組み

[[LINE Bot 開発入門] LINE Bot Serverを作ってみる その1](https://qiita.com/bathtimefish/items/34e128cb2578c4db0845) で作ったBot Serverをベースにしています。

ベースは送信したメッセージをそのまま返信するオウム返しサーバでしたが、今回はメッセージをOpenAI APIにリクエストした結果を返します。`lib/event.ts` [38行目](https://github.com/bathtimefish/line-bot-server-langchain-example/blob/main/src/lib/event.ts#L38)の`getMessageFromAI`を実装します。

```lib/event.ts
case 'text':
    textEventMessage = {
      type: 'text',
      id: event.message.id,
      text: await getMessageFromAI(event.message.text),
    };
```

getMessageFromAIのコードは`lib/langchain.ts`にあります。

```lib/langchain.ts
import { LLMChain } from 'langchain/chains';
import { OpenAI } from 'langchain/llms/openai';
import { PromptTemplate } from 'langchain/prompts';

const template = `
あなたは優秀な家庭料理の研究家です。忙しい主婦のために簡単においしくできる料理を研究し、情報配信しています。
「今日作りたい料理」に対して、購入すべき材料のリストをすべて示してください。
---
今日作りたい料理: {cooking}
`;

export const getMessageFromAI = async (message: string): Promise<string> => {
  process.env.OPENAI_API_KEY = '[YOUR OPENAI API KEY]';
  console.log("getMessageFromAI", message);
  const llm = new OpenAI({ temperature: 0.9 });
  const prompt = new PromptTemplate({
    template,
    inputVariables: ["cooking"],
  });
  const chain = new LLMChain({llm: llm, prompt, verbose: true});
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
  const result = await chain.call({ cooking: message });
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
  const res: string = result["text"].toString();
  return res;
};
```

`process.env.OPENAI_API_KEY = '[YOUR OPENAI API KEY]';`を`[YOUR OPENAI API KEY]`にOpenAIのAPI KEYに変更してください。

PromptTemplateを利用してGPTに入力するプロンプトを生成しています。LINEクライアントから送信されたText Massageが`カレーライス`だった場合、

```
あなたは優秀な家庭料理の研究家です。忙しい主婦のために簡単においしくできる料理を研究し、情報配信しています。
「今日作りたい料理」に対して、購入すべき材料のリストをすべて示してください。
---
今日作りたい料理: カレーライス
```

というプロンプトに変換されてGPTに送信されます。

# おわりに

LangChainはLLMをエージェント化するための様々な機能を提供しています。現在非常に活発に開発されていてどんどん新しい機能が追加されていってます。

このようなAI Application Frameworkと言えるようなツールは今後も様々リリースされてくると思います。多くのユーザーに対話型UXを提供しているLINEアプリとAIを繋ぐインターフェースとしてLINE Bot + LangChainのようなシステム構成は有益かもしれないなと思います。
Qiitaの投稿ボタンの場所

スマホでQiitaに記事を投稿しようとしたら、投稿ボタンが見つからず詰みかけたので、書いておきます。

![Screenshot_20230813_204602_Brave.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527582/99c5a7f1-b315-82f3-ba2d-2448f3125913.jpeg)

↑ここです。
この「公開設定」の文字をタップすると出てきます。
↓
![Screenshot_20230813_204823_Brave.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527582/347c8e7a-0dfc-53a2-eaa2-d1c643744d28.jpeg)


分かりづらくて気が狂いそうでした…。
古いUnityでgradleを新しくしたら Gradle install not valid と言われた

必要があって古いUnity(2018.3.1f1)のgradleを新しくしたところ、
Gradle install not valid
というエラーを吐きました。

・バージョン情報
Unity:2018.3.1f1
gradle:8.2.1

・事前にしていたこと
もともとあったgradleフォルダを新しくダウンロードしたものに置き換えたところ、エラーが発生。

→unity2018.4.24f1以後のUnityでは
Preferences>ExternalTools>Android>Gradle lnstalled with Unity.でパスを指定すれば良いのですが、今回Unity のバージョンが古かったので、置き換える方法を取りました。


・解決した方法
gradleフォルダの名前を書き換えました。

①
コンピュータ→Windows(C:)→Program Files →Unity →Editor →Data→PlaybackEngines →Android Player→Tools 
を開く。

②置き換えておいた「gradle-8.2.1」の名前から「-8.2.1」を削除し、「gradle」という名前に変更する。

以上で、無事ビルドが通りました。
【flutter】Textを表示するには？

こんにちは。
今回は、文字を反映させる方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/14255693-24d1-b6c0-4b0e-cdba2da8829e.png)

Textの引数「""」の中に入れたい文字を入力します。

# 使用例
```dart
body: const Text("文字が反映されます")
```

# 実行例
![スクリーンショット 2023-08-13 20.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/53287069-8f33-d8fd-068a-15daa4815ae5.png)

appbarの実装については前回の記事で説明しているので、こちらを覗いてみてください！
https://qiita.com/kominato_slj/items/cf8fc3d7d29da0053159
Laravel Sailで「このサイトにアクセスできません localhostで接続が拒否されました」

## 環境
- Laravel 10 + Sail + React
- MacOS

## 起こったこと
[こちら](https://www.webopixel.net/javascript/1815.html)を参考に、「Hello React !」と表示されるか確認しようとすると http://localhost/:8000 で以下のようになりました。

> このサイトにアクセスできません
> localhost で接続が拒否されました。

コンソールには以下のwarningが出ました。
> crbug/1173575, non-JS module files deprecated.

## 試したこと
- VSCodeのデバッグボタンからlaunch.jsonを作成したが変わらず
- 本当に8000ポートは開いているのか確認→下記で説明

### 本当にコンテナ内で8000ポートは開いているのか確認する方法
##### 1.Docker コンテナ内でシェルにアクセスし、ポート番号を確認する
```sh
$ sail shell
```
<br>

##### 2.コンテナ内で、netstat や ss コマンドを使用してポート番号を確認
```sh
$ netstat -tuln | grep 8000
```
もしくは
```sh
$ ss -tuln | grep 8000
```
<br>

<font color="red">ここでエラー</font>
> bash: netstat: command not found
> bash: ss: command not found

`ss` コマンドも利用できない場合、おそらく `ss` コマンドが含まれているツールがインストールされていない可能性があります。

Laravel Sail コンテナ内で `ss` コマンドを使用できるようにするには、コンテナ内で必要なツールをインストールする必要があります。
コンテナ内でシェルを起動して、以下のコマンドで必要なツールをインストールしてみてください。
```sh
$ apt-get update
$ apt-get install -y iproute2
```
もしくは
```sh
$ apk update
$ apk add iproute2
```
<br>

<font color="red">ここでエラー</font>
> E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)

これは、`apt-get` コマンドが実行されたときにパーミッションの問題が発生していることを示しています。
通常、このエラーメッセージは`root`権限がないユーザーが `apt-get`を実行しようとしたときに表示されることがあります。

Dockerコンテナ内では、多くの場合、デフォルトで`root`権限が必要です。
問題の解決には、コンテナ内で`root`権限でコマンドを実行するか、適切な権限を付与する必要があります。

**コンテナ内で`root`ユーザーになる**
コンテナ内で`root`ユーザーになってから `apt-get` コマンドを実行してみてください。
```sh
sudo su
apt-get update
```
<br>

<font color="red">ここでエラー</font>
> bash: sudo: command not found

**まず自分がどのユーザーか調べる**
```sh
whoami
```
`root`ユーザーではないことがわかりました。

[Laravel公式](https://readouble.com/laravel/10.x/ja/sail.html)より
```sh
sail root-shell
```
上記コマンドで`root`ユーザーでコンテナ内に入ることができました。

そして下記のようにして `sudo` コマンドを使えるようにします。
```sh
apt-get update
apt-get install -y sudo
```

次に `ss` コマンドを使えるようにします。
```sh
apt-get install -y iproute2
```

これでようやく `ss` コマンドが使えるようになりました。
```sh
ss -tuln
```

私の環境では以下のようになっていました。
```
Netid        State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port        Process        
udp          UNCONN        0             0                       127.0.0.11:44566                    0.0.0.0:*                          
tcp          LISTEN        0             4096                    127.0.0.11:44221                    0.0.0.0:*                          
tcp          LISTEN        0             4096                       0.0.0.0:80                       0.0.0.0:*                          
tcp          LISTEN        0             511                        0.0.0.0:5173                     0.0.0.0:*                          
```
<br>

## 解決方法
目的の8000ポートはありませんでしたが、80の文字があったので試しに下記のように `docker-compose.yaml` を書き換え、念の為 `.env`ファイルにも追記してみました。

<br>

**Before**
```docker:docker-compose.yaml
services:
    laravel.test:
        ports:
            - '${APP_PORT:-80}:80'
```
<br>

**After**
```docker:docker-compose.yaml
services:
    laravel.test:
        ports:
            - '${APP_PORT:-8000}:80'
```

```.env
APP_PORT=8000
```
【flutter】appBarのタイトルと背景色を実装するには？

こんにちは。
今回は、スマホアプリでよく見るappbarに背景色とタイトルを実装する方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

appbarにタイトルをつけるには、AppBarの引数に「title」を使います。
appbarに背景色をつけるには、AppBarの引数に「backgroundColor」を使います。



# 使用例
```dart
appBar: AppBar(
        backgroundColor: Colors.pink,//背景の色を選択
        title: const Text("Flutter!!!!"),//タイトルを表示
      )
```

# 実行例
![スクリーンショット 2023-08-13 19.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/bdb2577f-7ffe-aa35-5b1b-915f199200b2.png)
SwiftUiでSegmentの実装方法

現在SwiftUIを勉強中なので、さまざまなUIを実装しています。
今回は、SwiftUIでPickerでSegmentedPickerStyleの実装をしてみました。

Xcode Version 14.2


```SegmentView.swift
struct SegmentView: View {
    
    enum SegmentType: CaseIterable {
        case one
        case two
    }
    
    @State var selectedLayout: SegmentType = .one
    
    var body: some View {
        ZStack{
            Picker("Layout", selection: $selectedLayout) {
                ForEach(SegmentType.allCases, id: \.self) {
                    type in
                    switch type {
                    case .one:
                        Text("１つ目")
                    case .two:
                        Text("２つ目")
                    }
                }
            }.pickerStyle(SegmentedPickerStyle())
                .padding()
        }
    }
}
```

こんな感じになりました。

![スクリーンショット 2023-08-13 19.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/596261a3-3150-901f-08a7-884b32feb2f4.png)

Pickerを使用してpickerStyleを設定することによってSegmentの見た目になりました。

``.pickerStyle(SegmentedPickerStyle())``
こちらを設定すると画像のような表示になります。
AWS Direct Connectについて

「AWS Direct Connect」について学習をしたので自分なりにまとめて自身の理解・復習また文章力の向上のためアウトプットさせていただきます。


# AWS Direct Connect とは

「AWS Direct Connect」は「ユーザー(オンプレミス)のネットワーク」と「AWS側のネットワーク」をプライベート接続で結ぶことができるサービスです。これによりインターネットを介さずにAWSと接続することができます。

### メリット

・低コストのデータの転送送信料金：`AWS Direct Connectを使用することで、アウトバウンドのデータの転送送信料金を削減できる。`

・高品質なネットワーク：`専用線を利用するので、高スループットで低遅延の通信が可能。`

・高いセキュリティレベルの保持：`インターネットを介さずに独立した専用ネットワークで通信するのでセキュリティリスクが低減する。`

・安定性と信頼性：`インターネットを経由しないので回線の状況に影響されずに安定した通信が確保できる。`


### デメリット

・回線の準備の手間：`ユーザー拠点から「AWS Direct Connecロケーション」までの回線やセキュリティに関しては「サービス範囲外」になるのでユーザー自身で用意する必要があります。`

# AWS Direct Connect利用でかかるコスト

・初期費用：`「AWS Direct Connect」自体には初期費用なありませんが「AWS Direct Connect パートナー」との契約の際は費用がかかります。`

「AWS Direct Connect パートナー」については<a href="https://aws.amazon.com/jp/directconnect/partners/" target="_blank">こちら</a>をご確認ください。

・データ転送料金：`アウトバウンドのデータの転送送信料金がかかります。`

・ポート時間料金：`「専用接続」or「ホスト型接続」の接続タイプや容量によって変動します。`

「データ転送料金」と「ポート時間料金」については<a href="https://aws.amazon.com/jp/directconnect/pricing/" target="_blank">こちら</a>をご確認ください。

# AWS Direct Connectの構成図
![Direct Connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523101/f0a6e520-7163-ed6a-689f-942e273fb603.png)

VGW：`仮想プライベートゲートウェイ (Virtual Private Gateway)`
<font color="red">**←→**</font>：`サービス範囲外`
<font color="blue">**←→**</font>：`AWS Direct Connectのサービス範囲`


# Direct Connect Gateway

### Direct Connect Gatewayとは

「仮想プライベートゲートウェイ (VGW)」と「プライベート仮想インターフェイス (VIF)」をグループ化する機能です。
「AWS Direct Connect Gateway」は「リージョンに属さない」グローバルなサービスなので海外リージョンのVPCとの接続可能になります。また、任意のリージョン内で作成でき、他のあらゆるリージョンからアクセスすることができます。 
「Direct Connect Gateway」については<a href="https://aws.amazon.com/jp/directconnect/faqs/#Definitions" target="_blank">こちら</a>を参照しました。

# Direct Connect Gateway導入の構成図
![Direct Connect Gateway導入.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523101/6ac52a89-2318-5eda-dd14-1727a59cd011.png)

VGW：`仮想プライベートゲートウェイ (Virtual Private Gateway)`
<font color="red">**←→**</font>：`サービス範囲外`
<font color="blue">**←→**</font>：`AWS Direct Connectのサービス範囲`

# さいごに

「AWS Direct Connect」について学習し自分なりに整理しまとめた内容を図も作成し書かせていただきました。

「Direct Connect Gateway」は`海外リージョンのVPCとの接続が可能`や`複数のVPCを利用できる`など「AWS Direct Connect」を利用するにあたって導入をするととても便利だなと思いました。

今回の学習で「AWS Direct Connect」はどのようなサービスで利用にあたってどのようなメリット・デメリットがあるのか全体は理解は出来たのかなと思います。ですが知識・理解はまだまだですのでこれからも深掘りして学習をしていき知識・理解を深めたいと思います。

最後まで読んでいただいた方、ありがとうございました。
ABC314 C - Rotate Colored Subsequence 自己解法

# 問題

https://atcoder.jp/contests/abc314/tasks/abc314_c

# 考察
各色ごとで文字列を右に1つ巡回シフトするとどのような文字列になるかという問題です。もし、仮に全ての文字が1色だった場合、答えとなる文字列の$i$文字目は下記のようになるはずです。($n\\%m$はnをmで割った余り)
$$(S_i - 1 + N) \\% N$$
上記の式は、下記の式に言い換えることもできます。
$$(S_{色1の出現回数} - 1 + (色1の個数)) \\% (色1の個数)$$
このことから、もし1色だった場合、下記のことが分かれば$i$番目の文字が分かります。
- 色1が何回出現したか
- 色1が全部で何個あるか

もし色が複数ある場合でも、色毎に分けて考えればいいです。
そこで下記のような配列を用意しておきます。
$$V_{x,y} :文字列Sに対して、色xがy回出現した時の文字$$
上記の配列は文字列$S$とその時の色を順番に調べれば作成できます。

これを作成できれば、$i$番目の色が$x$だった場合、下記の式でその文字が分かります。
$$V_{x, ((色xの出現回数) - 1 + (色xの個数)) \\% (色xの個数)}$$

つまり、下記の2点を求めることができれば答えが出せます。
- 色$x$が何回出現したか
- 色$x$が全部で何個あるか

色$x$の個数は、$V_x$のサイズを調べれば求めることができます。出現回数も各色毎の出現回数を管理する配列を事前に用意しておけば求められます。

結果として$i$番目の文字を求めることができるため、答えを出力することができます。計算量も$O(N)$と、十分に間に合います。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc314/submissions/44544848

ご不明点などがあれば教えていただけると幸いです。
FolderBrowserDialogが変わってた？？？

# はじめに
フォルダを選択するダイアログはどんな物をイメージするか？
大体はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331961/30b322ea-5889-d729-d364-3d95d9855754.png)
だと・・・ずっと思っていた、ついさっきまでは

# 環境
:::note info
実施環境
・Windows 10 Professional
・Visual Studio 2022 Community Ver.17.7.0
・Visual Studio 2019 Community Ver.16.11.21
・C#
:::

# 下記サイトのコードをそのまま使用
https://dobon.net/vb/dotnet/form/folderdialog.html

# .NET Framework 4.X(4.8.1で確認)
冒頭の画像と同様の為、省略
※Win32APIのSHBrowseForFolderで表示される物

# .NET5以降？(確認自体は.NET5/6/7それぞれ実施)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331961/100d2a23-204b-79b0-d085-556ef516a6ad.png)
！？いつの間に・・・

<a href="https://github.com/dotnet/winforms/blob/main/src/System.Windows.Forms/src/System/Windows/Forms/FolderBrowserDialog.cs">FolderBrowserDialog.cs</a>のソースを覗く限り、PInvoke.SHBrowseForFolderを呼んでいるのは間違い無い様子だがこの差は何だろう？？？

見てる場所が悪い？間違い無い？方針転換した？仕様変更
~~情報求む~~
@radian-jp さん
@Ktouth さん
情報ありがとうございました

# 2024/02/24　追記/編集
編集箇所：FolderBrowserDialog.csのリンク先(格納先)が移動した事により編集
旧：https://github.com/dotnet/winforms/blob/main/src/System.Windows.Forms/src/System/Windows/Forms/FolderBrowserDialog.cs
新：https://github.com/dotnet/winforms/blob/main/src/System.Windows.Forms/src/System/Windows/Forms/Dialogs/CommonDialogs/FolderBrowserDialog.cs
※見返しで飛んだら404になってて焦ったわ…
二次元dpの復元

個人的なメモなので間違ってたらすみません。

## 問題
N枚のカードが一列に並べられており、左からi番目のカードには整数A_iが書かれています。カードの中からいくつかを選んで書かれた整数の合計がSとなるようにする方法は存在しますか。
### input
> N S
A_1, A_2,,,A_N

### output
> 選び方が存在すればyes + 使うカードの表示。 存在しなければno。

## 解法

まずは普通の二次元dpをする
二次元dpをした後にdpの行列から逆戻りして使うカードを拾う

前半のdpで答えが出ている場合のみ処理を行うため合計値と行を最後尾のところからスタートして表の左上に逆戻りしていくことを考える。
tmp_rowをチェックする行番号(=カード番号) ,　tmp_numを選択したカードを差し引いた合計値とする。

もしdp[tmp_row-1][tmp_num]が1だった場合、その行に対応するカードは使用しなくてもよいということになる。また、dp[tmp_row-1][tmp_num-A[tmp_row]]が1だった場合はそのカードを選択したということになる。
選択した場合はtmpに追加していく

```python
#input
N,S = map(int, input().split())
A = list(map(int, input().split()))
A = [0] + A

#dp
dp = [[0 for i in range(S+1)] for _ in range(N+1) ]

for i in range(N+1):
  for j in range(S+1):

    if i == 0:
      dp[0][0] = 1

    if dp[i-1][j] == 1:
      dp[i][j] = 1
    
    if dp[i-1][j-A[i]] == 1 and j-A[i] >= 0:
      dp[i][j] = 1

#結果の出力
if dp[N][S] == 1:
    print('Yes')
else:
    print('No')
    exit()
 
#yesの場合答えから逆戻りして必要なカードを拾う
tmp = []
tmp_num = S
tmp_row = N

while tmp_num > 0:
  print(tmp_num,tmp_row)
  if dp[tmp_row-1][tmp_num] == 1:
    tmp_row -= 1
    #print(f'throw{A[tmp_row+1]}')
  
  elif dp[tmp_row-1][tmp_num - A[tmp_row]] == 1 and tmp_num-A[tmp_row]>= 0:
    tmp.append(A[tmp_row])
    tmp_num -= A[tmp_row]
    tmp_row -= 1
    #print(f'take{A[tmp_row+1]}')

#アンラップしてプリント
print(*tmp)
```
クラスの継承

##  継承とは
継承はクラスを拡張するための手段です。
`class 子クラス extends 親クラス` 
と記述することで、子クラス内で親クラスのメソッドやプロパティを利用できるようになります。
```php
<?php
//親クラス
class Country 
{
    $name = "";
    $language = "";
    
    public function setName($name)
    {
      $this->$name = $name;
    }
    
    public function getName()
    {
      return this->$name;
    }

    public function setLanguage($language)
    {
      $this->$language = $language;
    }
    
    public function getLanguage()
    { 
      return this->$language;
    }
}

```

```php
//子クラス
class Japan extends Country 
{
    public function speak()
    {
      echo "日本語";
    }
}
```

ここから継承していきます。
```php
<?php
require_once("Country.php");
require_once("Japan.php");

$hoge = new Japan();
$hoge->setName("しんたろう");
$hoge->setLanguage("Japanese");
```
上記のようにJapanクラスはsetName()やsetLanguage()は記述されていませんが、クラスを継承しているためクラスをコピーして作られた$hogeもまたこれらのメソッドが使えるわけです。

## 継承とprotected 
クラスを継承することで親クラスのプロパティやメソッドを利用できることはわかりました。では親クラスではこのプロパティはどのように定義するべきなのでしょうか。
大規模なプログラムでは変数の修飾子として、三つの修飾子が出てきます。これを使い分けることが、アプリケーションを作る上で肝となってきそうです。まずこの３つの役割を確認します。

```
public  どこからでもアクセス可能
protected 定義されているクラス自身と継承しているクラス内でアクセス可能
private そのクラス内でのみアクセス可能
```
下に行くほどアクセスが厳しくなっていきます。なぜ上記のようにアクセス制限する必要があるかというと、オブジェクト指向の大切な考え方として、「カプセル化」があります。カプセル化は変数や関数の呼び出しを制御することを指します。カプセル化の目的は「想定しないクラスからのアクセスを防ぐ」ことにあります。

大規模なプログラムであるほど、クラス、変数、関数の量が膨大になり管理が難しくなっていきます。プログラムを無闇にpublicを使ってデータを定義すると、万が一障害が起きた際に呼び出されている箇所を全て調査し修正しなければいけなくなります。
なので関数や変数は極力クラス外で呼び出さないようにする→そのほうが保守性の高いクラスということになります。    
では修飾子はどのような基準で決めていけばいいのでしょうか。基本の考え方としてはprivateで定義し、必要に応じてアクセス権を広げていくべきです。具体的には他のクラスでも継承して、利用することが考えられるプロパティはprotectedで定義してあげます。また外部で関係のないクラスから呼び出す場合はpublicを利用してあげるべきです。


-----
記事を書くうえで下記を参考にさせていただきました。
https://tech-blog.rakus.co.jp/entry/20211217/php#%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96
【Flutter】【AndroidStudio】gradleビルドログの文字化け対処、-Xlint:unchecked詳細の出し方

## はじめに

google_mlkitで遊んでいた際に、Windows ＆ AndroidStudio ＆ Emulator(Android)でTextRecognizerを呼び出すとExceptionになることを調査した際の
**gradleビルドログの文字化け対処、-Xlint:unchecked詳細の出し方について**

（執筆時点では、TextRecognizerがExceptionになる問題は同環境では解決していないので、その対処を記載するものではない）

## Gradleのビルドログが文字化け

### 事象発生時のログ

```console
Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...
Running Gradle task 'assembleDebug'...
�m�[�g:～\pub.dev\google_mlkit_commons-0.5.0\android\src\main\java\com\google_mlkit_commons\InputImageConverter.java�̑���́A���`�F�b�N�܂��͈��S�ł͂���܂���B
�m�[�g:�ڍׂ́A-Xlint:unchecked�I�v�V�������w�肵�čăR���p�C�����Ă��������B
�m�[�g:～\pub.dev\google_mlkit_text_recognition-0.10.0\android\src\main\java\com\google_mlkit_text_recognition\TextRecognizer.java�̑���́A���`�F�b�N�܂��͈��S�ł͂���܂���B
�m�[�g:�ڍׂ́A-Xlint:unchecked�I�v�V�������w�肵�čăR���p�C�����Ă��������B
√  Built build\app\outputs\flutter-apk\app-debug.apk.
Debug service listening on ws://127.0.0.1:55500/zxXMtuhofhk=/ws
Syncing files to device sdk gphone64 x86 64...
```

### 対処

環境変数にJAVA_TOOL_OPTIONSを設定
`JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8`

- 参考：gradleでJavaのerrorが文字化けする。（https://qiita.com/yonaimineakio/items/5a7cbec9d21c60890c1e）

### 対処後のログ

```Console
ノート:～\pub.dev\google_mlkit_commons-0.5.0\android\src\main\java\com\google_mlkit_commons\InputImageConverter.javaの操作は、未チェックまたは安全ではありません。
ノート:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
ノート:～\pub.dev\google_mlkit_text_recognition-0.10.0\android\src\main\java\com\google_mlkit_text_recognition\TextRecognizer.javaの操作は、未チェックまたは安全ではありません。
ノート:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
```

## Javaのビルド警告（-Xlint:unchecked）の詳細出力

前項のログ

```Console
ノート:～\pub.dev\google_mlkit_commons-0.5.0\android\src\main\java\com\google_mlkit_commons\InputImageConverter.javaの操作は、未チェックまたは安全ではありません。
ノート:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
```

### 対処：gradleのビルドオプションで詳細を出力するよう設定

```./android/build.gradle
...
allprojects {
    repositories {
        google()
        mavenCentral()
    }
    // add lines
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }

}
...
```

- 参考：Gradle で「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と表示されたときの対処（https://qiita.com/niwasawa/items/65134c280ed381e03855）

### 対処後のログ

```Console
～\pub.dev\google_mlkit_commons-0.5.0\android\src\main\java\com\google_mlkit_commons\InputImageConverter.java:35: 警告:[unchecked] 無検査キャスト
            Map<String, Object> metaData = (Map<String, Object>) imageData.get("metadata");
                                                                              ^
  期待値: Map<String,Object>
  検出値:    Object
警告1個
～\google_mlkit_text_recognition-0.10.0\android\src\main\java\com\google_mlkit_text_recognition\TextRecognizer.java:74: 警告:[unchecked] 無検査キャスト
        Map<String, Object> imageData = (Map<String, Object>) call.argument("imageData");
                                                                           ^
  期待値: Map<String,Object>
  検出値:    Object
警告1個
```
Stable Diffusion WebUI Docker で InvokeAI と ComfyUI を起動する

:::note warn
2024年6月現在、筆者は以下のエラーによりStableDiffusion WebUI Docker は起動ができなくなり、[Docker版ではないWebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui)を利用しています。

``No device found``
または
``Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 500: named symbol not found: str``
:::

# 前置き
Stable Diffusion WebUI(AUTOMATIC1111) のDockerでのインストール方法は以下のサイトを参考にしてできた。
https://zenn.dev/isi00141/articles/2fc745b11e8796

インストールする本体の[githubサイト](https://github.com/AbdBarho/stable-diffusion-webui-docker)を見に行くと、AUTOMATIC1111 の StableDiffusionWebUI だけでなく、InvokeAI と ComfyUI も導入できるらしい。

:::note info
環境
・Windows11Pro
・GPU NVIDIA GeForce RTX 3060 12G
・CPU Intel(R)Core(TM) i7-13700 2.10GHz
・RAM 32GB
:::

# HowTo
https://github.com/AbdBarho/stable-diffusion-webui-docker/wiki/Setup

こちらにある通り、AUTOMATIC1111版を起動した際の "auto" のところを変更して実行する。

### ComfyUI
ComfyUIは単純に以下で実行できた。
```
docker compose --profile comfy up --build
```

### InvokeAI
InvokeAIも実行するが、以下のようにエラーになった。
```
docker compose --profile invoke up --build
...
webui-docker-invoke-1  | ImportError: cannot import name '_compare_version' from 'torchmetrics.utilities.imports' (/opt/conda/lib/python3.10/site-packages/torchmetrics/utilities/imports.py)
webui-docker-invoke-1 exited with code 1
```
これはtorchmetricsのバージョンに関する問題のよう。invoke\Dockerfileに1行追加した。
````diff:\stable-diffusion-webui-docker\services\invoke\Dockerfile
WORKDIR ${ROOT}

+ RUN pip install torchmetrics==0.11.4

RUN --mount=type=cache,target=/root/.cache/pip \
  git reset --hard f3b2e02921927d9317255b1c3811f47bd40a2bf9 && \
  pip install -e .
````
これで実行できた。
Nuxt3でvue-selectを入れたときのメモ

初心者エンジニアの僕がnuxt3の練習中にvue-selectを使おうと思ったが、苦戦したので調べて動いた結果をメモ。


`nuxt.js => 3.6.5`
`vue-select => 4.0.0-beta.6`



## 追加したファイル・コード

### Pluginディレクトリ
Plugins/vue-select.js 　を作る

```javascript:Plugins/vue-select.js 　
import vSelect from 'vue-select';

export default defineNuxtPlugin((nuxtApp) => {
    nuxtApp.vueApp.component('v-select', vSelect);
})
```

### nuxt.config.ts



```typescript:nuxt.config.ts
export default defineNuxtConfig({
    css: ['vue-select/dist/vue-select.css'],
})
```
※cssがもとからある場合は、[]の中に`,`区切りで`'vue-select/dist/vue-select.css'`を追加する。



### app.vue

```vuejs:app.vue
<template>
    <v-select :options="['a', 'b', 'c']"></v-select>
</template>
```

vue-select自体の書き方はこちらを参考
[▶参考](https://vue-select.org/guide/options.html#options-prop)
paizaの標準入力問題でつまいづいた

<h1>はじめに</h1>

paizaの標準入力の問題集を解いていて軽くつまづいたことがあったので、備忘録的に書いておきます。

<h2>どういう問題？</h2>

こんな問題でした。

>1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, ... , a_N が半角スペース区切りで与えられます。
a_1, ... , a_N を改行区切りで出力してください。[^1]

[^1]:2 行目で与えられる N 個の整数の入力 (paizaランク D 相当)
     https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_number_step2

入力の例は次の通りです、
>入力例1
6
6561 3785 6338 9568 4956 557
<h2>どこでつまづいた？</h2>

自分は下記のような回答を書いたのですが...

```python
num =int(input())

for i in range(num):
    print(input().replace(' ','\n'))
```

しかしこんなエラーが出ました。
```
Traceback (most recent call last):
  File "Main.py", line 5, in <module>
    print(input().replace(' ','\n'))
EOFError: EOF when reading a line
```

<h2>調べてみたところ</h2>

>EOFError: EOF when reading a line

EOFはEnd Of File のことで、エラーをそのまま読むと、行を読んでいるときに最後の行に到達してしまったよと教えてくれているみたいです。

つまり今回の原因は、最初に
>1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, ... , a_N が半角スペース区切りで与えられます。


と書かれているように、与えられる入力は<b>2行</b>であるのにも関わらず、私が書いた下記のコードでは、最初の行で与えられた整数N(今回は6)をnumという変数に代入した後に、その回数分input()をループさせてしまったために起きたエラーだったんですね。当然、2行しか入力がないのにそれ以上input()を回してどうするのという話でした。
```Python
num =int(input())

for i in range(num):
    print(input().replace(' ','\n'))
```

<h2>解答</h2>

標準入力の2行目をリストにしてから、1行目で与えられた整数分を出力してあげることで解決しました。
（模範解答はmap関数をしようしていたのですが、ひとまずここでは触れません）

```python
num = int(input())
a = list(input().split(" "))
for i in range(num):
    print(int(a[i])))
```
複数の装置から構成されるシステムの稼働率

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/f0fa35f8-f46d-9d38-7f75-44a1ae1faaf7.png)
　コンピュータシステムは、複数の装置が組み合わさって構成されていますから、装置単体の以下同率だけでなく、組み合わさった時のシステムの稼働率がどうなるのかも重要です。システム全体としての稼働率を求めるためには、システムを構成している各装置が直列になっているか、並列になっているかが重要になります。

１：直列システムの稼働率
　直列システムは、システムを構成する複数の装置がすべて正常に動作していると、システム全体が正常に動作できるシステムです。直列システムの稼働率は、各装置の稼働率をかけた値です。

２：並列システムの稼働率
　並列システムは、システムの構成する複数の装置のうち何台かが正常に動作していればシステム全体が正常に動作できるシステムです。

３：直列システムと並列システムの組み合わせ
　直列システムと並列システムが組み合わされている場合には、段階を追って各部分ごとに稼働率を求めていきます。
ラズパイ ピコ互換品で外部電圧をターミナル風に表示

# はじめに
ラズパイピコと同じSoC、RP2040と約1インチのLEDを搭載した「RP2040-LCD-0.96」で、電圧表示する仕掛けを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048586/2b91c0a9-c646-a888-27be-d1a1d69ff2ff.png)


# 結果

https://youtu.be/woJGDI2UilA

入力電圧14Vから10Vの範囲において、0.1Vの誤差範囲で電圧を計測できました。

| 入力電圧 [V]  | 出力電圧 [V] | 電圧差 [V] |
|-------------:|------------:|---------:|
| 12.05 (約12) | 12.06       | +0.01     |
| 13.99 (約14) | 14.01       | +0.02     |
| 13.00 (約13) | 12.93       | -0.07     |
| 12.06 (約12) | 12.07       | +0.01     |
| 11.08 (約11) | 11.06       | -0.02     |
| 9.97  (約10) | 9.93        | -0.06     |
| 12.12 (約12) | 12.14       | +0.02     |

LCDは横20文字・8行です。
1行は、「０から9を繰り返すカウンタ、月日、時分秒、電圧」で構成されています。

# ソースコードと使用した部品

・ソースコードはこちら。
| 種類 | リンク |
|-|-|
| メインのコード | https://gist.github.com/AbeMarkn/ba4eb4fb97eec497d590080c8db07d78 |
| Waveshareのサンプルを拡張したコード | https://gist.github.com/AbeMarkn/c8f1660487594a794a2859eab017a507 |

表示は1秒ごとに更新しています。電圧入力は0.1秒ごとに取得し、10回分を平均しています。1秒に1回の電圧入力だと、結果がばらつきました。

・部品の一覧はこちら。
| 品名  | 個数 | 価格(税込) | 補足 |
|-------------|------------|---------:|---------|
| Waveshare RP2040-LCD-0.96 | 1       | 1,903円     | スイッチサイエンス, ラズパイ ピコ互換品 |
| 連結ピンソケット　２×２０（４０Ｐ）　ラズパイ用スタッキングコネクタ| 1 | 150円 | 秋月電子通商 【C-10702】　|
| 入出力２．５Ｖ～１５Ｖ　最大１．５Ａ　同期整流式昇降圧型スイッチング電源モジュールキット　ＬＴＣ３１１１使用 | 1 | 1,380円| 秋月電子通商 【K-11212】　 |
| ブレッドボード　ＥＩＣ－８０１| 1 | 370円| 秋月電子通商 【P-00315】 |
| その他 | 一式 |100円程度| 赤色LED, 抵抗・コネクタ|

# デザイン

電圧入力方法のメモです。抵抗で分圧して入力しています。1bitあたり4mV相当。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048586/159f7d05-1298-d18b-5839-ce8b22730a34.png)

ターミナル風に表示をスクロールさせる方法のメモです。
検討しているときは8行でなく、3行でスクロールするイメージで作りました。 T1, T2, T3と行を追加していき、T4を追加したときにT1が消えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048586/e9ce9f40-df5c-0348-b799-662c01b85874.png)

ブレッドボードの配線の様子です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048586/79bafb4d-034d-89b1-bfa2-129a05062d6e.png)


# おわりに
・今後、この電圧入力機能に無線機能を組み合わせて、離れた場所においてあるバイクの電圧をモニタする計画です。
・ラズパイ用スタッキングコネクタがすごく便利です。文字と色で機能を表現してくれるので間違え防止にすごく役立ちます。
データ×AI人材キャリア大全 読書メモ

データサイエンティスト、データエンジニア、機械学習エンジニアなど、
データやAIにかかわるキャリアに興味あり手に取った一冊。
理解を深めるため、読み進めながら適宜更新します。

https://www.amazon.co.jp/dp/4798172340

## 第1部　データ×AI業界の全体像
- [ITSS+](https://www.ipa.go.jp/jinzai/skill-standard/plus-it-ui/itssplus/data_science.html)でデータサイエンティスト領域のタスク構造が示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228134/6971e485-c814-c92b-ddc4-fa4324cd1ba5.png)


- データ×AI人材：2010年頃から流行り始めたビッグデータ、クラウド、AI関連の専門職。役職としてはデータサイエンティスト、機械学習エンジニア、データエンジニア、BIエンジニア、データアナリストなどがある。

- 課題例：商品のおすすめ、売上予測、画像識別、業務プロセスの自動化など。

- データ活用の利点：機械学習による業務の自動化、データ分析からの新しい知見の発掘、データを基にした戦略的な経営判断が可能。

- AIモデルの開発フロー：データサイエンティストがモデルの設計を行い、機械学習エンジニアがそれを実装。
 
- AutoML：事前に訓練されたAIモデルを提供するサービス。オリジナルのAIモデルの開発が不要で、データさえ用意すれば利用できる。

- データ×AIの登場人物メモ
    - コンサル: ビジネスのニーズとテクノロジーを結びつける役割を果たし、データやAIの導入・適用のアドバイスを提供します。
    - データエンジニア: ビッグデータのインフラやパイプラインを構築・運用する専門家です。彼らはデータの収集、保存、アクセス、変換を効率的に行うためのシステムを作成します。
    - データサイエンティスト: データを使用して意味のある情報や洞察を導き出す役割を持つ専門家です。彼らは統計学、機械学習、データ解析を駆使して、ビジネスの問題を解決します。

- KGI (Key Goal Indicator)
KGIは、目標達成のためのキーとなる指標を意味します。これは、組織の戦略的目標を達成するためにどれだけ進捗しているかを示す指標です。

- インサイト
データや情報から得られる新しい知識や理解を指します。データ分析の結果として、ビジネス上の有益な発見や洞察を「インサイト」と呼びます。

## 第2部 データ×AIプロジェクトの全体像と各職種の果たす役割
未整理


## 第3部　データ×AI人材になるために必要なこと
- 必要な[スキル](https://view.officeapps.live.com/op/view.aspx?src=https%3A%2F%2Fwww.datascientist.or.jp%2Fcommon%2Fdocs%2Fskillcheck_ver4.00_simple.xlsx&wdOrigin=BROWSELINK)
    - データサイエンス力：基礎数学や予測、推定・検定、グルーピング、サンプリングなどのスキル。
    - データエンジニアンリング力：環境構築やデータ収取～データ共有などデータマネジメント的スキル。
    - ビジネス力：行動規範、契約・権利保護、論理的思考、マネジメントや調整力などのビジネススキル全般。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228134/88cfab29-9f8f-f1a2-f4ca-f4a279553045.png)
- ポートフォリオ：自身のスキルセットを示す具体的な成果物と、それを作成する過程の思考を表現する方法。
- ポートフォリオの内容例：作成した予測モデル、ダッシュボード、学習過程の記録、モデルの説明資料。
- スキルセット：ハードスキルはもちろん、ソフトスキルも非常に重要。新しいツールや技術の出現が速いため、常に学び続け、自ら考えて行動する能力が求められる。
量子情報科学入門 - memo #1

### オラクル
https://dojo.qulacs.org/ja/latest/notebooks/8.1_oracle.html

https://learn.microsoft.com/en-us/azure/quantum/concepts-oracles

### エルミート行列とユニタリ行列は兄弟みたいなもの
https://blueqat.com/645de8a7-f218-4ba0-96f6-f2e5acaa1d66/bde1bce8-5940-412e-9380-6d2e929127b3

https://blueqat.com/645de8a7-f218-4ba0-96f6-f2e5acaa1d66/81a61e6a-828d-4489-9919-458848352154

### 時間発展演算子
閉じた系の場合、時刻$t$での状態$|\psi(t)\rangle$は時刻$t=0$での状態$|\psi(0)\rangle$をユニタリ変換したものである。つまりベクトルの長さや内積は時間が経っても変わらない（これは時間発展の基礎方程式、たとえばシュレーディンガー方程式などからも当然導かれる）。

https://ja.wikipedia.org/wiki/%E6%99%82%E9%96%93%E7%99%BA%E5%B1%95

### 計量同型、直交変換、ユニタリ変換
https://w.atwiki.jp/linearalgebra/pages/33.html

### 準同型写像・同型写像
https://mathlandscape.com/homomorphism/
知らない場所に行った際に活躍！？駅の情報を取得するLINEbotを作成

 # デジタル初心者がLINEbot作成に挑戦
こんにちは。LINEBotなどこれまで一度も触れたことのない超初心者です。

ある日ふと、業務の効率改善や私生活の何かしらの効率化にITが活用できないかと考えました。
でも何からやったら良いのか。。プログラミング言語を一つ覚える？それとも資格取得の勉強をする？
色々考えましたが、今回は身近なところで使用するLINEを使った何かしらができないかと思い、LINEBotのことを知り、何か使えるものを作ってみたいと色々試行錯誤し自分で実際に動くものを作ってみることにしました。

 # 使用ツール
 - Make https://www.make.com/en/login?response_type=code&client_id=eu2.make.com&redirect_uri=https%3A%2F%2Feu2.make.com%2Fsso%2Foauth&state=a1d171c935fdfeade6b3&scope=zone%3Alogin
 - LINE

 # 何を実装しようか
まずは、世の中に存在するAPIを色々調べてみたり、自分の普段の行動を振り返り、こんなのがあったらいいなみたいなものは何かないか？色々と模索。

そこで駅の情報について様々扱っているAPIを発見。そして、知らないところに行った際に、
 - 「〇〇駅」行きといったバスがあるけれどどの路線に接続する駅なのか？
 - 前後の駅は何なのか？
 
 など分からないことがあったことから、
 ***「駅名を入れたら、駅の簡単な情報を返すLINEbot」***　
を作成することに決定！

 # 実装開始
 ### 使用API
・駅情報取得API（http://express.heartrails.com/api.html)
 ### Makeシナリオ
条件分岐等々さまざまなことができることは分かりましたが、動作時にエラーを起こした際に解決に莫大に時間がかかり、挫折しそうなため比較的シンプルに以下の4つのモジュールにて実装することとしました。
 - LINE(Watch Events)・・・ラインのメッセージを受け取るためのモジュール
 - HTTP(Make a request)・・・APIの呼び出し
 - Json(Parse Json)・・・API情報から必要な項目を取り出すために必要
 - Line(Send a reply Message)・・・Line上で返すメッセージ等の設定

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491090/9da1703a-a0f7-a227-2f86-e39a2a39f0fe.png)

 ### 色々と詰まりながらも何とか・・・
調べたり手を動かしたりを数時間ほど実施
 - HTTPモジュール
 - JSONモジュール
 - LINE(Send a reply Message)
 
の設定上では特に試行錯誤しました。
![2023-08-13 14.55のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491090/2e4872b5-45bc-5331-0ca2-5d22af3df4c3.jpeg)
 #### HTTPモジュールで悩んだ一例
 - URLってどの範囲まで入れる？
 - Query Stringの各項目って何を入れるの？

等々、他のモジュールでもこのレベルのことで詰まり調べたり何度もBotを動かしたりしながら何とか完成

 #### JSONモジュールの設定
![2023-08-13 17.13のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491090/cefc4188-b470-abb4-6050-383dff0d572b.jpeg)
サンプルデータの設定、Json stringには何を入れるの？この辺も難儀しながらも何とか完了。

 #### LINE(Send a reply Message)の設定
![2023-08-13 17.13のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491090/16d96e28-9e55-6cf1-88c1-cbda3703f521.jpeg)
ここでもどうやったら必要な情報だけをLINEで返してくれるのか？どの変数が何の情報を持っているのかで色々調べてどうにか設定完了。
初心者の私にとっては、1つ1つにどうしても時間がかかってしまいます。

 ### LINE上での動作結果
駅名を入力し、下記の項目を返してくれるようになりました。
 ***・駅名*** 
 ***・所在県*** 
 ***・前駅*** 
 ***・次駅*** 
![GIF版課題用動画3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491090/e7195523-8ef8-5a2b-f830-110e24193d93.gif)

 # あとがき
早速この記事を書く前日に、とある音楽フェスに行った際に帰りのシャトルバスの行き先に記載のある駅の路線（情報）を調べるのに使ってみました！
早速使う機会ができて嬉しい限りです。

今回は、ここまでの作成となりますが、今後は時刻表を返したり、現在地から近い駅のリストを返したりとより実用性があるbotに成長させていきたいと思います。
VBAにてMicrosoft Excelブックが開かれているか確認する

　VBAからMicrosoftExcelのブックが更新可能かを判断する場合、ブックをファイルとしてAppendモードで開いて、エラーコードを確認するというのが定番のテクニックだそうだ。単なるファイルとして開くのでパフォーマンスが良いらしい。　
　しかしながら、そのブックがネットワーク上にある場合、ほかの人が使用中でもAppendモードで開けてしまうようである。
　これでは使えない。そもそも更新可能かを確かめるときは、いずれにせよMicrosoftExcelから開くことになる。そうであれば、「だれかが開いている事がむしろ多いです」という事が前提でなければ、ワークブックとしてきっちりと開いて確認したほうがむしろ速いかもしれない。なのでそうするよう作り直した。

　開いてみて[読み取り専用]モードであったなら書込み不能と判断し、戻り値としてFalseをセットして、開いたブックは閉じる。そうでなければ、Trueを返し、ブックは開いたままとする。

　関数名は"OpenBookWritable”とし、開こうとするブックのフルパスで引数として渡すこととする。

```
Function OpenBookWritable(フルパス名) As Boolean

    Application.DisplayAlerts = False
    '↑ ブックをほかの人が開いていたとき、「編集可能となった際に
        '通知しますか」のメッセージが出ないように抑止
    Workbooks.Open Filename:=フルパス名, Notify:=False
    '↑ 「読み取り専用で開きますか」の メッセージが出ないように抑止
    
    If ActiveWorkbook.ReadOnly Then
    '↑ 開いたブックが [読み取り専用]になっていたら
        ActiveWorkbook.Close
        '↑ ブックを閉じます。 開いた直後なので必ずActiveになる。
        OpenBookWritable = False '<= ブックは開かれてますよ、と返す。
    Else
        OpenBookWritable = True '<= ブックは開かれてませんよ、と返す。
    End If

    Application.DisplayAlerts = True
    '↑「編集可能となった際に通知しますか」のメッセージ抑止解除

End Function
```

  より丁寧には､目的のブックが存在するかどうかを確認してからブックを開くことが望ましく､その場合は関数冒頭に次のような処理を追加するのもいいかな｡
```
If Not CreateObject("Scripting.FileSystemObject").FileExists(フルパス名) Then
    OpenBookWritable = False
    Exit Function
End If
```
　おそらく問題とならないことが多いが、上のチェックを追加で入れた場合、「ブックがなくてFalseなのか、ブックがあるが誰かがつかんでいるのでFalseなのか」区別がつかないので、全体を関数として紹介するのは保留とする。ファイルが開かれていればスルー、というパターンは多いが、ファイルがなくてもスルー、というのは抵抗があるかも。

　なのでこの関数のテスト用に書いたドライバ。呼び出しはダイアログボックスから読み込みブックを指定するようにして「ブックがない場合はどうしよう」は考えずに済むようにした。
```
Sub OpenBookWritableドライバ()

Dim フルパス名 As String
Dim ブック名 As String

    '<ダイアログボックスを出して、 開くブックを選択する。 >
    フルパス名 = Application.GetOpenFilename("Microsoft Excel ブック,*.xls*")

    If フルパス名 = "False" Then
        MsgBox "キャンセルされました"
       Exit Sub
    End If

    If Not OpenBookWritable(フルパス名) Then
        MsgBox "ファイルが使用できません"
    Else
        DoEvents '何か処理
        
        '<FileSystemObject を利用して、ブック名を取り出す>
        ブック名 = CreateObject("Scripting.FileSystemObject").GetFileName(フルパス名)
        
        Application.DisplayAlerts = False
        Workbooks(ブック名).Save
        Workbooks(ブック名).Close
        Application.DisplayAlerts = True
    End If
End Sub
```
VSCodeを基本からまとめてみた【Macショートカット】

1. command + X : 選択箇所の切り取り

2. command + shift : １つ前に戻したい

3. command + shift + Z : １つ前に戻したものを先に進む

4. command + W : 現在開いているタブを閉じる

5. command + shift + T : 以前消したタブを再度、開く

6. command + D : ファイル内の同じ文字の選択

7. shift + option + 複数選択 : 対象箇所にカーソルを当てる

8.  command + f : 開いているファイル内の特定の文言検索

9.  command + shift　+ f : 全てのファイル内の特定の文字から検索

10. command + p : ファイル名検索

11. ファイル選択 + command + C command + V : ファイルの複製

12. command + [.] : モジュールのインポート

13. タグ名タイプ後 "tab"で閉じタグを自動補完

14. タグ + / + tab : 閉じタグのタグになる

15. ファイル選択後 "Enter" でファイル名変更

16. option + ← / → : 単語単位でポインタを移動

17. command + O : フォルダを開く

18. command + B : 左のサイドバーを閉じる

19. command + J : 下のパレットの展開

20. command + Enter : ポインターだけの改行

21. shift + option + ← / → : 単語選択

22. command + [-] : 文字を小さくする

23. command + shift + [+] : 文字を大きくする

24. command + shift + [U] : 全部の文字を大文字にする

25. command + shift + [L] : 全部の文字を小文字にする

26. command + ← / → : カーソルを行末や先頭に持ってくる

27. shift + option + [^] : 新規でターミナルを開く

## 参考サイト
[【神回】現役フロントエンドエンジニアが使う VSCodeのショートカット厳選34選](https://www.youtube.com/watch?v=dhK1VilYG1U&t=1884s)
Try Hack Me を毎日やってみよう

はじめまして
某機関でセキュリティ関連業務の末席に身を置いているkaoと申します

この記事はこれからセキュリティの勉強をしようという人向けに
Try Hack Meのおすすめのルームを記述したものです。

特に「毎日ログインして連続30日ログインのバッジを手に入れる」という目的のためのおすすめルームを列挙いたします。

現在キャンペーン中です！みんなも記事を書いたり紹介したりしよう

https://tryhackme.com
https://tryhackme.com/path/outline/security-engineer-training



参考にした記事はこちらです

https://yawaraka-sec.com/tryhackme-continues-for-30-days/


https://tryhackme.com/r/resources/blog/free_path

上の記事に刺激を受けてこの記事を作成しました。
ちなみに最初に参考にしてほしいのは下の記事です。
課金なしでTry hack Meするなら必須な感じの内容になっています

さて、これだけの良記事がありながらあえて紹介するのは下の記事は結構重い…時間のかかる
ルームが中心になっており、連続ログインを途切れさせないために簡単ログインには向いていないためです

ちなみに、Try Hack Meでは「Learning Paths」という形で複数のルームをまとめており、
必須のルームを終わらせることで「ジュニアペネトレーションテスター」「サイバーデフェンス」「プレセキュリティ」などの称号を得ることがでゲーミフィケーションとして効果があるのですが、課金なしではほとんどが手に入らないようになっています。
そんななか無課金でも手に入る栄光のバッジが連続ログインとなってますのでまずはそこを目指しましょう

ちなみに、先日値上げして一か月１４ドルというこの円安時代にはなかなかのお値段になってますので課金についてはある程度定着してから、という意味でもとりあえずこのバッジを目指してみてください。
基本的には仮想マシンを用いるルームは除外していますが、分割画面を使ってタスクをこなすものがあるので
スマホでやるのは難しいと思います

さて、ではルームの紹介です

https://tryhackme.com/room/beginnerpathintro

Webアプリケーションに対する簡単なハッキング手順を示したルーム。
所要時間15分くらいで、手元にパソコンがあればすぐに終わると思います

https://tryhackme.com/room/startingoutincybersec

サイバーセキュリティのキャリアパスの説明という２問しか設問がないルームです


https://tryhackme.com/room/securityawarenessintro

セキュリティ意識に関わる一般的な問題です。問題数が少なくてやりやすいのと、知識としてはいいかも

https://tryhackme.com/room/introtocontainerisation

じつは自分もよくわかっていないコンテナに関する解説です

https://tryhackme.com/room/introtopipelineautomation

開発に関するわかりやすい解説です


今回はとりあえずdefficulty が　info の記事から調べてお送りしました。
すみませんが、すでに課金してまして、ひょっとしたら課金していない方には入れないルームも
あると思いますが参考にしてください


#THMSecEng
#TryHackMe
【プラクティス紹介】1分でさらっと分かる「究極のプラクティス」

## プラクティス名（別名）
究極のプラクティス　（自作プラクティス、オリジナルプラクティス）

## プラクティスの目的・狙い
* 目の前の課題を解決する

## どんな時に使うか
* チームが既存のプラクティスで解決できない課題に出会った時

## 実施手順
究極のプラクティスとはチームで自分たちの状況にあったオリジナルのプラクティスを考えること。

1. 「これ、どうにかしませんか？」とチームに問題提起する
1. 現状の問題点と最終的にどんな状態にしたいのかチーム内の認識を合わせる
1. 解決策についてみんなで話し合う（最初はブレインストーミングなどから入るとよい）
1. 方向性が見えてきたら「車輪の再発明」にならないよう、すでに同じプラクティスがないか調べる
1. やることを決めたら最初から完璧を求めず、やりながら定期的に見直し、手法を洗練させる
1. ある程度こなれてきたらノウハウをまとめ、**名前をつけ**、新しいプラクティスとして発表する

発表は社内発表/社外発表/WEB掲載などやり方を問わず。
素敵な名前をつけて世に送り出してあげて下さい。
いつの日かそのプラクティスが広まったら、自慢できるようになるかもしれません。

:::note warn
手順3.と4.は逆の方がよいという意見もあるかもしれません。ただ、自分たちの欲しいものがイメージできていない段階で既存の方法を探しても「あ、これだ！」とはならないので、この順番がよいと思います。また4.の時点でチーム外の有識者に聞いてみるというのも有効だと思います。
:::

## アレンジ例
* ゼロベースで考えるのが難しい場合は「パターン」を参考にしてみる
* 既存のプラクティスをいくつか組み合わせてみたり、大胆にカスタマイズしてみる

## アンチパターン
* １から考えるのが面倒なので、目的が異なるプラクティスを流用する
* 関係者が腹を割って対話すれば解決できる問題なのにプラクティスで解決しようとしている

## こぼれ話（私的コメント）
思えばこれができるようになりたくて、プラクティスを収集を始めたのかもしれません。自分の知識の引き出しが多ければそれだけ解決に向けたアイデアも出しやすくなるだろうという単純な発想です。確かにそれも大事なのですが、最近はそれ以上に大事なものがあるな、と思うようになりました。状況を打開するには知識よりも、この状況を何とか変えたいという「想い」が重要な気がします。そういった意味では手順1．のあくしょんが最も大切なのかもしれません。

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
サーバー構築~Apache導入~

VPSにLinuxを入れた状態という前提のもとから始めます。
下記↓参照
https://knowledge.sakura.ad.jp/8218/

１. パッケージ管理ソフトyumをアップデートする
```
$ sudo yum -y update
```

２. yumを使ったシステムアップデートを自動で処理してくれるyum-cronというパッケージをインストールする
```
$ sudo yum -y install yum-cron
```
３. エディタで/etc/yum/yum-cron.confを編集
```
apply_updates = no　← ここを
apply_updates =　yes　← に変更
``` 
４.　yum-cronサービスを起動し、自動起動も有効化する
```
$ sudo systemctl start yum-cron.service
$ sudo systemctl enable yum-cron.service
```
５. Apacheのインストール
```
$ sudo yum -y install httpd
```
６. 設定の変更
httpd.confを編集する
```
$ sudo nano /etc/httpd/conf/httpd.conf
```
エディタで以下の内容を編集する
```
(変更前) #ServerName www.example.com:80
(変更後)　ServerName www.example.com
```
変更後には構文チェックを行う
```
$ httpd -t
```
Syntax OKと表示されればOK。
７. Apacheの起動
```
$ sudo systemctl start httpd.service
```
システム起動時に自動で起動するように設定する
```
$ sudo systemctl enable httpd.service
```
８. firewallの設定
80番ポートへのアクセスを許可する
```
$ sudo firewall-cmd --permanent --add-service=http
success
$ sudo firewall-cmd --reload
success
```
設定がうまくいっていれば、「 http://VPSのIPアドレス/ 」で以下のようなテストページが表示される。
![スクリーンショット 2023-08-13 16.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/e19c20a0-b724-c133-4ac8-ac4ca89ef877.png)
Linux: ファイルの文字コードやタブ文字、改行等の特殊文字を確認する方法

たまに必要となるのでメモ。

###### 実施環境：

```Linux:Linux
[testuser@testhost ~]$ uname -a
Linux testhost 4.18.0-147.8.1.el8_1.x86_64 #1 SMP Thu Apr 9 13:49:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[testuser@testhost ~]$ echo $SHELL
/bin/bash
```

バッチで上手くコンフィグが読み込めない時等、
不具合が起こった時に実は文字コードや改行文字が原因だった、というのは
しばしば発生する事象です。
今回はそのような時に使用するコマンドをまとめます。

###### 文字コード：

文字コードを確認したい場合は、fileコマンドを使用します。

```Linux:Linux
file ファイル名
```

以下、実行例です。対象のファイルの文字コードがASCIIであることがわかります。

```Linux:Linux
[testuser@testhost ~]$ file test.txt
test.txt: ASCII text
```

###### タブ文字や改行文字等の特殊文字：

特殊文字について確認したい場合は、odコマンドを使用します。

```Linux:Linux
od -c ファイル名
```

以下、実行例です。改行文字がLF(\n)であること、タブ文字(\t)が含まれていることがわかります。

```Linux:Linux
[testuser@testhost ~]$ cat test.txt
        1
        2
[testuser@testhost ~]$ od -c test.txt
0000000                            1  \n  \t   2  \n
0000015
```
NestJSをAPI Gateway + AWS Lambdaで構成する（その６）インターセプター

#
- [その１ NestJSやLambdaでのnode.jsの話し](https://qiita.com/ssugimoto/items/988320d34022555401fb)
- [その２ NestJSのサンプルを動かす、Hello World.](https://qiita.com/ssugimoto/items/557e7a7cce5111bf5de7)
- [その３ コントローラーを追加する](https://qiita.com/ssugimoto/items/fcfbc9a176bcf41d7b45)
- [その４ ControllersコントローラーでDTO (Data Transfer Object)を使う](https://qiita.com/ssugimoto/items/613b8ab54bd6f8de043c)
- [その５ CRUD generatorを使い modules,controller, service, dto を生成する](https://qiita.com/ssugimoto/items/64a9c3cd5cb33e06f4c9)
- その６ インターセプター
- [その７ ORMでRDBデータベースを扱う](https://qiita.com/ssugimoto/items/45e23d1b2879b083267c)
- [その８ NestJSをAPI Gateway＋AWS Lambdaとしてデプロイ](https://qiita.com/ssugimoto/items/74c26a8219a944d4acc4)
## ドキュメント
- 公式 https://docs.nestjs.com/interceptors
-  Aspect Oriented Programming
     - ロジックの前、後に共通で実行する
     - result, return を変える
     - 例外処理する
     - 基本動作を拡張する
     - 関数をオーバーライドする


## loggerを作成してみる

- nest cli コマンド実行
```
nest g interceptor common/interceptor/logging
```

```
   └─src
      └──common
         └──interceptor
              └──logging
                   ├─logging.interceptor.ts
                   └─logging.interceptor.spec.ts

```

```src/common/interceptor/logging/logging.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle();
  }
}
```

```src/users/users.controller.ts
// 略
import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors } from '@nestjs/common';
import { LoggingInterceptor } from '../common/interceptor/logging/logging.interceptor';


@Controller('users')
@UseInterceptors(LoggingInterceptor)
export class UsersController {
  constructor(private readonly usersService: UsersService) { }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }
// 略
}

```


## 寄り道、インターセプタという便利な仕掛けがある
- 何かの処理前に共通の処理を挟む、2007～2010年頃にちょくちょく耳にした「横断的な関心事」。JavaのフレームワークSeasar2を思い出すくらいだった
     - ログ出力、処理時間出力
     - トランザクション管理、コネクションを新規取得するのか、既にあるコネクションを使いつづけるのか、コミットするのか、ロールバックするのか 等
- 用途は、ログ出力機能、認証と認可チェック機能等を挟む
- ビジネスロジックは挟まない
システムの信頼性（フェールセーフ、フェールソフト等）の考え方を整理してみた

## はじめに
基本情報技術者や応用情報技術者を勉強していると登場するシステムの信頼性の考え方。
「フェールセーフ」「フェールソフト」「フォールトトレランス」...とにかく色んな考え方がたくさんあって忘れがちになるので代表的な考え方を自分なりに整理してみました。

## システムの信頼性の種類

### フェールセーフ
　英語で書くと「**Fail-Safe**」、日本語では「**失敗時の安全**」という意味になります。
　つまり、**システムに障害が発生したら、安全性を第一優先してシステムを停止する**という考え方です。
　例えば、故障すると赤信号に切り替える信号機、倒れたら火が消えるストーブなどです。

### フェールソフト
　英語で書くと「**Fail-Soft**」、日本語では「**失敗時の安全**」という意味になります。
　つまり、**システムに障害が発生したら、システム全体を止めずに一部の機能を切り離して稼働させ続ける**という考え方です。
　例えば、停電が発生した際にバッテリに切り替わるUPSを使用して、一部の機能だけを優先してシステムを継続し続けるのがフェールソフトです。

　ちなみに、類似用語に「**フォールバック**」という言葉がありますが、こちらは考え方ではなくフェールソフトという考え方に基づいて**実際に行う操作**のことを意味します。

### フォールトトレランス
　英語で書くと「**Fault-Torelance**」、日本語では「**故障に耐える**」という意味になります。
　つまり、**システムが故障しても　正常に稼働し続ける**という考え方です。
　例えば、予備の電源系統やバックアップ用のサーバーなどが当てはまります。サーバーが突然故障してもシステムの中断を防ぐことができます。
　前述した「フェールソフト」と設計思想が似ていますが、**一部の機能を制限**してシステムを継続するフェールソフトに対して、フォールトトレランスは機能を切り離さずに**全てのシステムを正常に稼働**し続けるという点で異なります。

### フォールトアボイダンス
　英語で書くと「**Fault-Avoidance**」、日本語では「**故障を回避する**」という意味になります。
　つまり、**故障そのものを回避するために障害自体が起きにくいように設計する**という考え方です。
　具体的な例は、故障によって大事故を招く恐れのある自動車や宇宙船、人命に関わる医療機器などです。　

### フールプルーフ
　英語で書くと「**Fool-Proof**」、日本語では「**愚か者に耐える**」という意味になります。ここでの愚か者はシステムを操作する人、オペレーターを指します。
　つまり、**使用者が誤った操作をしても重大な事故や問題が発生しないように設計する**という考え方です。
　身近な例でいうと、ドアを閉めないと起動しない電子レンジ、蓋を閉めないと回らない洗濯機などがあります。

## さいごに
システムの信頼性という大きな括りで見るとどれも似たような考え方だと思います。しかし、１つ１つの設計思想はどれも異なる考え方で。今後のシステム開発を進めていく上でも重要な考え方になると思いました。
Laravel データ作成 データ表示編(json)

## はじめに

今回は前回までに対応したSeederのテストでーたをもとにVueによるデータ取得までの準備を記載する。


## Vueによるデータ取得までの準備
### 環境について
以下で環境を作っている前提とする。

https://qiita.com/kenji123/items/15c7fe0910c706d495cc

### api.phpを使用
一旦jsonデータを表示させる。
フロントがVueなのでweb.phpではなく、api.phpを使用する。

routes/api.php
```bash
Route::get('user/{id}', [ApiController::class, 'show']);
```

urlは以下となる
http://127.0.0.1:8000/api/user/1

routes/api.phpに記述されているルートは基本的に`http://127.0.0.1:8000/api/`から始まるURLにマッチするようになっている。

### コントローラ
実行するコントローラを以下のようにする。
```ApiController.php
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class ApiController extends Controller
{
    public function show($id)
    {
        $user = User::with('projects.tasks')->find($id);

        if (!$user) {
            return response()->json(['message' => 'User not found'], 404);
        }

        return $user;
    }
}
```
with()メソッドのあるUser::with('projects.tasks')->find($id);の行は、指定したIDのユーザを取得し、同時にそのユーザが所有するプロジェクトと、各プロジェクトが所有するタスクも一緒に取得する。
with()メソッドはLaravelのEloquent ORMにおける「イーガーロード」を行うためのもの。
「イーガーロード」とは、関連するデータを事前にロードすることで、後続の操作で必要なSQLクエリの数を減らすためのテクニック。
例えば、ユーザが所有するプロジェクトを取得し、それぞれのプロジェクトが所有するタスクを取得する場合を考える。これらを通常の方法で取得すると、まずユーザを取得、次にそのユーザのプロジェクトを一つずつ取得、さらに各プロジェクトが持つタスクを一つずつ取得というように、必要なデータの量に応じて多くのSQLクエリが発生する。これは大量のデータを扱う場合にパフォーマンスに影響を及ぼす可能性がある。
それに対しwith('projects.tasks')を使うと、ユーザ、プロジェクト、タスクのデータをそれぞれ1回のクエリで一括して取得する。これによりSQLクエリの数が大幅に減り、パフォーマンスが向上する。
なお、このメソッドを使うためには、関連するモデル間にリレーションシップが定義されている必要があります。この例ではUserモデルはProjectモデルと、ProjectモデルはTaskモデルとそれぞれリレーションシップを持っている必要がある。

### jsonデータ表示
http://127.0.0.1:8000/api/user/1
![スクリーンショット 2023-08-13 15.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176603/a24609a4-428c-4fdd-fdcb-1a5933c0dca4.png)


## 終わりに
今回は大したテーマではないが、長くなったので４回に分けて実施した。
次の開発のステップに進みたい。
PyCharmでgoogleスタイルのdocstring形式を変更する

Pycharmでdocstringの形式をgoogleスタイルを変更したい場合があると思うので、その方法をまとめました  
[Pycharmの公式](https://pleiades.io/help/pycharm/using-docstrings-to-specify-types.html)

1. Settingsを開く
Tools > Python Intergrated Toolsを開く
![docstring_google_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/240a68d2-95b3-bf3f-8bbf-60b40732e8e2.png)

2. formatからGoogleを選択
Docstring formatのプルダウンで**Google**を選択する  
最後に「OK」ボタンを押下
![docstring_google_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/8fb7ab7f-c691-292f-b489-4a0cf7b79e10.png)  
Google以外の形式も選択できるので、好みのdocstirg形式にしてみてください!!