OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel 9】HTTPクライアント「Guzzle」の使用方法メモ

実務で、外部のAPIを呼び出すのにGuzzleを使用したのでメモ:writing_hand:

## 仕様書

[Laravel 9.x HTTPクライアント](https://readouble.com/laravel/9.x/ja/http-client.html)

## 使い方メモ:writing_hand:
パッケージはデフォルトでインストールされているのでこのまま使える。

### GETリクエスト
```php
use Illuminate\Support\Facades\Http; // これを追加！

// GETリクエストするサンプルコード
public function get()
{
    // ヘッダ
    $headers = [
    	'key1' => 'value1',
    	'key2' => 'value2',
    	'key3' => 'value3'
    ];

    // オプション
	$options = [ 'verify' => false ]; // 証明書の検証を外す

    $response = Http::withHeaders($headers)
		->acceptJson()
		->withOptions($options)
		->get('https://www.xxxxxx.com/api/blogs')
		->json();
}
```

### POSTリクエスト
```php
use Illuminate\Support\Facades\Http; // これを追加！

// POSTリクエストするサンプルコード
public function post()
{
    // オプション
	$options = [ 'verify' => false ]; // 証明書の検証を外す
    
    // リクエストパラメータ
    $param = [
        'key1' => 'value1',
    	'key2' => 'value2',
    	'key3' => 'value3'
    ];

	$response = Http::asForm()
		->withOptions($options)
		->post('https://www.xxxxxx.com/api/blogs', $param)
		->json();
}
```
[Python]ファイル関連の処理でよく使うスニペット（個人用）

# はじめに

最近作業をしていて、自分がよく使う処理があるのですが、いちいちネットで調べるのが面倒なので、スニペット集として残しておきます。



- JSONファイルを読み込む
- JSONファイルを保存する
- 所定のディレクトリに格納されているファイル名一覧を取得したい
- ディレクトリを作成する

## コード

```python
import os
import json

def mkdir(dir_path: str):
  if (not os.path.isdir(dir_path)):
    os.mkdir(dir_path)

def load_json(json_path: str):
  json_data = None
  with open(f'{json_path}', 'r') as f:
    json_data = json.load(f)
  return json_data

def save_json(json_path: str, data):
  with open(f'{json_path}', 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

def get_file_list(dir_path: str, extension=''):
  file_list = []
  for file_name in os.listdir(dir_path):
    if (extension in file_name):
      file_list.append(file_name)
      # フルパスにしたいときにはこっち
      # return_list.append(os.path.join(dir_name, file_name))
  return file_list
```
plunkerでdeck.gl その4

# 概要
plunkerでdeck.glやってみた。
tripslayer、使ってみた。

# 参考にしたページ

https://qiita.com/kkdd/items/d96602c19564ae9bd1ef

# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/302d3a25-66d2-ed26-8072-0043cae1b36d.png)


# 成果物

https://embed.plnkr.co/plunk/36tDMbjXsNvAFCk0

以上。
PHP：改めて、型宣言も徹底する

# ネット上のコードは、そのほとんどで型宣言されていない

永遠に個人開発し続けるのなら自分さえ良ければ良いかもしれないが、そうでない限り複数のエンジニアが開発に関わる。よって、型を宣言するのが当たり前である。
ネット上のコードは圧倒的に宣言しておらず、省略しているのだろうが非常に違和感を覚える。
バグ・不具合の温床になるため、型を宣言しないコードは「動くからひとまず良い」という、PHPの仕様に依存した不完全なコードと思う。
動的型付けができる仕様の言語であろうが、それに依存することはしない。
静的型付け言語を扱う思想でコーディングする。

# 改めて、種類
array, bool, int, float, string, object(オブジェクト名)
union, mixed, null許容, void

declareしていく。
paiza.ioでperl その7

# 概要

paiza.ioでperlやってみた。
練習問題やってみた。

# 練習問題
qiita apiを叩いて、jsonをパースせよ。

# サンプルコード

```
use Encode;
use JSON::PP ();
use LWP::UserAgent;
use URI;

$url = URI->new("https://qiita.com/api/v2/items");
$url->query_form("query", "neosvr");
my $ua = LWP::UserAgent->new;
$ua->agent("Dummy User Agent");
my $response = $ua->get($url);
if ($response->is_success) 
{
    my $items = JSON::PP::decode_json($response->content);
    for my $item (@$items) 
    {
       print("$item->{url} $item->{title}\n");
    }
} 
else 
{
    print 'failed';
}

#'title', 'id', 'created_at', 'updated_at','likes_count', 
#'comments_count', 'tags_str', 'user_id', 'user_permanent_id', 'url'


my $in_json = '[{"name":"Perlテキスト処理プログラミング入門","author_name":"木本裕紀","price":3190,"issued_date":"2021-01-03","id":1},{"id":2,"issued_date":"2021-01-03","name":"Web開発をやるぜPerl","author_name":"木本裕紀","price":2200},{"id":3,"issued_date":"2019-03-06","author_name":"田中太郎","name":"データベース入門","price":2090}]';
my $books = JSON::PP::decode_json($in_json);
for my $book (@$books) 
{
    my $id = $book->{id};
    my $name = $book->{name};
    my $price = $book->{price};
    my $issued_date = $book->{issued_date};
    my $price_zeikomi = $price * 1.1;
    $book->{price} = $price_zeikomi;
    print ("$id, $name, $price\n");
}


```

# 実行結果

```
https://qiita.com/ohisama@github/items/87ebaaff87383b611e67 neosでlogix その116
https://qiita.com/ohisama@github/items/c169ebfc77fe4557cad8 neosでlogix その115
https://qiita.com/ohisama@github/items/4466c74caf0e97421b3e neosでlogix その114
https://qiita.com/ohisama@github/items/53d3b0539cb37e828fe6 neosでlogix その113
https://qiita.com/ohisama@github/items/a6707afb09ae3fba7303 neosでlogix その112
https://qiita.com/ohisama@github/items/4d9057da8c197af6fce7 Keian wizbook KZG14X128BK 買ってみた。その2
https://qiita.com/ohisama@github/items/8bb4106b9f9ea1914c13 neosでlogix その111
https://qiita.com/ohisama@github/items/09c63827c9934944f56a neosでlogix その110
https://qiita.com/ohisama@github/items/bba84bc489a2753c9cc8 neosでlogix その108
https://qiita.com/ohisama@github/items/09bcd4296c00a9009815 neosでlogix その107
https://qiita.com/ohisama@github/items/8e7b92b1d22f2795bee4 neosでlogix その106
https://qiita.com/ohisama@github/items/2a89e3f37a48d5eb6f50 neosでlogix その105
https://qiita.com/ohisama@github/items/601df91891a390762951 neosでlogix その104
https://qiita.com/ohisama@github/items/00e91baad8d7e4dabff4 neosでlogix その103
https://qiita.com/ohisama@github/items/8686ae508c321fc05aa8 neosでlogix その102
https://qiita.com/ohisama@github/items/14fafeec2b5bc1251748 neosでlogix その101
https://qiita.com/ohisama@github/items/0ccfe30795664375c811 neosでlogix その100
https://qiita.com/ohisama@github/items/db9b63324eded0751f9b neosでlogix その99
https://qiita.com/ohisama@github/items/2a54291b387dbd7fff01 neosでlogix その98
https://qiita.com/ohisama@github/items/22c10e8cced8d6315371 neosでlogix その97
1, Perlテキスト処理プログラミング入門, 3190
2, Web開発をやるぜPerl, 2200
3, データベース入門, 2090
```

# 成果物

https://paiza.io/projects/ttLz-vyqV-Xn_VPspJrnfw


以上。
Docker for Windows + SQLite3の環境でUnable to execute statement: disk I/O error が発生する

# 概要

Docker for Windowsのコンテナ内で動いているPHP + SQLite3の環境において、Insert・Update・Delete時に高頻度で「Unable to execute statement: disk I/O error」が発生する。
再度実行するとエラーなく実行ができたりし、一貫性がない。

同じコンテナをLinux系のサーバー上で動かした場合は同エラーが発生しない。

# 解決
SQLiteのジャーナルモードが「delete」だと本現象が発生し、「wal」だと発生しない。

次のコマンドでSQLiteのジャーナルモードをwalに変更した。

~~~
PRAGMA journal_mode=wal
~~~

## 注意点
当然のことながら、ジャーナルモードを変更することでDBへの書き込み動作が変更される。

デフォルトのdeleteモードではcommitごとにDBファイルへ内容が反映されるが、walモードではDBとの接続をクローズするタイミングでの反映となるため、それまでの間にトラブルがあった場合情報が失われる可能性がある。

システムの要件に応じて対応する必要がある。

なんかもっと根本的な解決策がある気がする…
全体のレイアウト

#### レイアウトの基本について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123154/9f824a95-5ad0-6eb3-fea1-a7b8c2446b55.png)

div要素

- div は「division」の略で、要素をグループ化するために使用される。「header」、「main」、「footer」というclass名を持った3つのdiv 要素でレイアウトを分割している。
```html
 <div class="header"></div>
  
 <div class="main"></div>
    
 <div class="footer"></div>
```
PHPで比較を行う場合、基本的には厳密な比較であるトリプルイコールのタイプを使う

# 教材やネット上の情報ではダブルイコールタイプのコードが圧倒的に多い

バグの温床になるはずなのに。省略している場合と、よくわかっていない場合が混在していると思われる。
しかし、今、改めてダブルイコールタイプは真似しないことを明確にする。


# 今後は、トリプルイコールである「===」、「!===」で統一する
※例外を除いて

学習中の時から徹底することである。
仕事になってプロダクションコードを扱う場面になってから徹底しようとするようでは間違いなくミスを犯す。
もっともそのような手腕ではプロダクションコードを任されることはないだろうが、何事にも隙間というものはある。
いかに安全なコーディングをするか？非常に重要。バクが発生し、最悪の場合最終的に発注者が被害を被る。
CSSの読み込み方

##### 読み込み方法

- HTMLからCSSを読み込むためには、link rel="stylesheet"を用いる。
- link rel="stylesheet" href="stylesheet.css"のように、href属性で読み込むCSSファイルを指定すること。

```html
 <link rel="stylesheet" href="stylesheet.css">
```

- stylesheet→CSSファイルを読み込む
- stylesheet.cs→読み込むCSSのファイル名

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
~主コメント~

qiitaでの色付けを教わったのでとても見やすくなりました！感謝です（汗
WindowsにFilebeatをインストール

# WindowsにFilebeatをインストール

ネットの記事や公式ドキュメントを見るとFilebeatをインストールする手順として、
ZipファイルをダウンロードしてからPowerShellにパスを通す手順で設定を行っています。
しかしながら下記のサイトを見る限り、べーたばんであるもののmsiのパッケージで提供されています。

https://www.elastic.co/jp/downloads/beats/filebeat

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/528a4432-22f6-30fe-c0da-0df54910de8c.png)

ダウンロードして画面の通りのままインストールをすると自動的にパスも通り、
面倒な手順は必要なく、またexeを指定することなく、
fileBeatのコマンドを実行できるようになりました。

# 注意点
注意点としては、ここでインストールするFileBeatと送り先のElasticSearchやlogStashのバージョンが合わなくて、
データが送れなくなってしまうことです。
このmsiで入れると最新のものが入ってしまうみたいです。
そんなときは、filebeat.ymlの設定ファイルで下記の設定を追記します。

```
output.elasticsearch:
  hosts: ["http://URL"]
  allow_older_versions: true
```
PHP：型：「コールバック」とは「関数を引数で取るための擬似的な型」

# コールバックという型とは？

関数を引数で取るための擬似的な型で、呼び出し可能な関数かをチェックする。
引数として受け取れる関数

関数を変数に入れるだなんて奇妙な感触を覚えたもの。

```php
$divideBy10 = function ($int) {
    return $int / 10;
};

$nums2 = array_map($divideBy10, [10, 50, 700]);
var_dump(implode(', ', $nums2)); // string(8) 1, 5, 70
var_dump(is_callable($divideBy10)); // bool(true)
```
PHP：型：「リソース」：外部リソースえのリファレンスを保持しているデータ型

# リソースとは？

外部リソースへのリファレンスを保持しているデータ型

外部とのやりとりを伴うとき。
外部へ接続するときはエラーがつきもの。そんな時にも使える。データベース接続とか。
「異常系」を扱ったりできる。

```
$fileOpen = fopen("data.txt", "W"); // 外部ファイルを書き込む
echo getttype($fileOpen); // resource
fclose($fileOpen); // ファイルを閉じる
```
変数hashを作成するためのコード

初心に返り復習、備忘としてアウトプットします！


```ruby:問題
# 下記のメソッドを実行した時に実行結果のように表示されるような変数hashを作成せよ。
puts puts hash.keys
puts hash.values

# 実行結果
one
two
three
1
2
3
```


```diff_ruby:解答
# 自身の解答
- hash{"one":1, "two":2, "three":3}
# 模範解答
+ hash = { one: 1, two: 2, three: 3 }
```

あーやってしまってる。。
＝忘れてる。。。

ダブルクォーテーションは文字列に使用しているのであっても実行結果は同じに。
```ruby:実行結果
irb(main):009:0> hash={"one":1, "two":2, "three":3}
=> {:one=>1, :two=>2, :three=>3}
irb(main):010:0>  puts hash.keys
one
two
three
=> nil
irb(main):011:0> puts hash.values
1
2
3
=> nil
```

このレベルのものは間違えないようにしていきたいところ！！
頑張れ自分！！
ChromeでHTMLソースコードを表示し、その情報をSeleniumの要素指定に利用する

# はじめに
Seleniumでは、対象ページのHTMLソースコードの情報を利用して要素を指定し、クリックや文字入力などの操作を行います。
今回はChromeでHTMLソースコードを表示する方法と、表示したHTMLソースコードをSeleniumで利用する例を紹介いたします。

# ChromeでHTMLソースコードを表示する
まず、HTMLソースコードを表示したいページを開いた状態で右クリックします。![コメント 2023-02-14 200549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/b2042cce-567b-f938-7563-839e70ac05e8.png)

表示されたメニューから「検証」をクリックします。![コメント 2023-02-14 200550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/3c250442-d764-703d-7dc1-da1868bfcc33.png)

ブラウザの右側に検証画面が表示されます。
赤枠で囲っている部分がHTMLソースコードになります。![コメント 2023-02-14 201513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/9b41970b-221a-11ab-dc02-130b7179824d.png)

また、赤丸で囲っているアイコンをクリック後HTMLソースコード上でどこにあるか確認したい部分をクリックすると、HTMLソースコードがハイライトされます。
画像は[Googleのトップページ](https://www.google.com)にて、「Google 検索」の部分を確認しようとした場合のものになります。![コメント 2023-02-14 202842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/fb91fcef-07ff-6693-7a8c-e1a8c2ade0bd.png)![コメント 2023-02-14 203351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/59e3aa8d-df78-ad4c-461b-50d1c9b718dd.png)
![コメント 2023-02-14 203414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/212ea47e-f6de-0ad7-3738-24323f86b770.png)

# 表示したHTMLソースコードをSeleniumで利用する例
今回は前章を参考に、「Google 検索」をクリックする操作をPython + Seleniumで実装するコード例を記載します。

まずクリックする要素について、XPATHの情報を取得します。
前章でハイライトされた部分で右クリックし、「Copy > Copy XPath」をクリックします。
ちなみに「Copy full XPath」の方でも問題ないです。![コメント 2023-02-16 185537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/8ce3fdc1-c172-a3bb-8aef-584af816ed7a.png)
上記操作で得たXPATH情報がこちらになります。
```
/html/body/div[1]/div[3]/form/div[1]/div[1]/div[4]/center/input[1]
```

SeleniumにてXPATH情報から要素を取得するためには、`find_element_by_xpath`を利用します。
そのため、今回は要素取得のコードが以下のようになります。
```python:
driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[4]/center/input[1]")
```

後はシンプルに、取得した要素の後ろに`.click()`をつけることで、要素に対してクリックする動作をさせることができます。
```python:
driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[4]/center/input[1]").click()
```

# サンプルコード
前章で紹介した例を使用しているサンプルコードを載せておきます。
動作内容は、Googleのトップページにて検索欄で「chrome」と入力後「Google 検索」ボタンをクリックする、というものになっております。
```python:サンプルコード
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.google.com")
sleep(3)
driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input").send_keys("chrome")
sleep(3)
driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[4]/center/input[1]").click()
sleep(3)
driver.quit()
```

# 最後に
Seleniumで自動ブラウザ操作を実装する際に、HTMLソースコードから情報を取得することはほぼ必須で行う作業になると思いますので、ぜひ活用してください。

また今回はXPATH情報を取得した例を挙げてますが、他にもIDやNAME情報を利用して要素を取得することもできます。
他の情報を利用した要素取得については[こちらのサイト](https://web-tweets.com/python/selenium-findelement/)が参考になると思います。

最後まで読んでいただき、ありがとうございました。
顧客分析の手順 分析フォーマットの適用例: パターン検出分析 - 特定イベント後の行動パターン把握

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第23回： 特定イベント後の行動パターン把握
分析フォーマットの 5つ目として、今回からパターン検出分析の分析例をご紹介します。パターン検出分析は、前回まででご紹介してきた関連性分析同様、特定事象に関連して他の事象がどれほど発生したかを理解するための分析です。関連性分析との違いは、これを時系列で把握することによって、その事象間の因果関係をより明確にすることが可能な点にあります。

### 分析の前提
今回は、海外旅行用途でクレジットカードを申し込んだ顧客の、その後の定着状況を分析します。分析結果を示したのが図34A ですが、ここでは横軸にカードの利用先カテゴリーを、縦軸に時間軸を置いています。分析の対象セグメントとしては、昨年度、旅行用途で入会した顧客群を対象とし、指標値としては顧客数を用いています。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/2447aa75-a216-ec27-4bdc-7c6f177bd602.png">


ここでは、基準となる対象セグメントとして、昨年度、旅行用途で入会した顧客群を対象としていますが、これ以外に基準となる顧客行動として、5月に海外旅行先でカードを利用した顧客群に分析の対象を絞り込んでいます。つまり、縦軸で [0（5月）] 、横軸で [トラベル] で示されている 10,034名が実質的な分析の対象です。これらの顧客が、他の月でどのようなカード利用を行なったかを示しています。

そして縦軸に期間として示している [0（5月）] は、基準期間である 0 が 5月に設定されていることを意味し、以降1ヶ月単位で、基準期間からの相対期間数を示しています。例えば一番下の行 [5（10月）] は、10月が 5月を基準としたときに 5ヵ月後の顧客行動がどの程度発生していたかを示しています。

### 入会後のカード利用傾向
このグリッドをグラフで表示したのが、図34B です。全体傾向としては一旦次の月に利用顧客数が減少し、その後徐々に増加していることが見受けられます。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/13c1cec1-af50-18bb-d63f-2888d8a5be22.png">

また、個別の傾向を見ていくと、当然ながら毎月トラベル用途で利用している顧客は少なく、多くの顧客にとっては少なくとも数ヶ月先まで次の旅行は発生しないことが分かります。一方、直後に増加しているのはレストランでの利用です。実際になぜこのような因果関係が発生したのか分かりませんが、単純な想像としては旅行仲間で食事会を開催するような需要があったのかもしれません。いずれにしてもレストラン利用が、トラベル利用後にあるということが分かりました。

また、ショッピング需要としては、トラベル利用の直後が低調で、その後徐々に増加していることが分かります。これに関しても想像の域を出ませんが、旅行先での支出からお財布の紐がきつくなり、しばらくは余裕が無くてお買物をしないと決めているのかもしれません。少なくとも 3ヵ月後の 8月まで需要が低調であることが分かりました。


### アプローチの方向性

ここまでの知識で、5月に海外旅行用途で入会した顧客群に対するアプローチは、ある程度方向付けできます。まず、帰ってきてからの利用促進策としては、レストランの利用をご案内すること、ショッピング利用の促進策としては 3ヶ月待つこと、トラベル利用としては 5ヶ月以降の休みタイミングを利用することです。

もちろんこれは基本的なアプローチで、個別に考えなければならないこともあります。5月に旅行といっても、ゴールデンウィークに旅行をしたのか、それともオフシーズンに旅行をしたのかによってもパターンは異なるはずです。会社員でゴールデンウィーク旅行であれば、5ヶ月先の 10月にトラベル利用の案内をしても余り反応を期待できません。それよりは年末年始の旅行を早めに確定したほうがよさそうですし、いっそ前倒して夏休みの利用を促したほうが良いかもしれません。これに関しては職業に関する情報、それまでの旅行頻度やインターバルに関する情報を参考にしたうえで、7月案内顧客（8月需要）、9月案内顧客（10月需要）、11月案内顧客（年末年始需要）に分けたほうが良いと思われます。

そして、レストラン利用の案内に関しての個別化も検討候補です。海外旅行先がスペインへの旅行であれば、スペイン料理の案内が好ましいかもしれません。旅行仲間で集まるのであれば、個室や大テーブルの用意できるレストランを求めるかもしれません。またショッピング用途に関しては 3ヶ月待つだけでなく、前述の旅行需要の前段階で旅行関連商品を購入できるショッピング関連加盟店をご案内するのもアイデアです。旅行後は買物を控えるかもしれませんが、旅行前にはいろいろと物入りで、準備のためのショッピング需要が想定されるためです。

このような案内は、通常請求書に同封する形で実施されるか、旅行会社等と提携して別個のダイレクトメールで案内されるかと思います。前者の場合には、請求書に同封するパンフレットやリーフレットの掲載スペースの中で、前述してきたプッシュすべき案内をトップに持ってくる、もしくはより多くの掲載スペースを割く等して、利用を促します。

このように、パターン検出分析を利用して、特定顧客行動の後に、どのような顧客行動の発生する可能性が高いかを理解することが可能となります。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
AIと同じ戦略でG検定合格を目指す！

G検定まであと２週間・・・
社会人になって闇雲に勉強してても効率が悪く、全然頭に入らないということが多々あり、
当初は昨年の11月に受験予定でしたが、インプットが間に合わずでした。
3月の受験に向けて、学習を進めていたところ、ん、私たちの学習の過程ってAIと同じじゃないか！
と思い、AI的視点で対策したことをまとめました。

# 訓練データの学習（基礎的な内容のインプット）
**「ディープラーニングG検定(ジェネラリスト)最強の合格テキスト[明瞭解説+良質問題]」**
受験者の間では「緑本」と呼ばれていて信頼も高いこのテキストをまず一周しました。
テキストを読めばなんとなく理解しているつもりでしたが、章末問題を解くとイマイチ理解できていなかったため、重要事項はノートにまとめて理解を深めました。こちらは最後に模擬試験もついており、自分の理解度を確かめることが出来ます。

https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E6%9C%80%E5%BC%B7%E3%81%AE%E5%90%88%E6%A0%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E6%98%8E%E7%9E%AD%E8%A7%A3%E8%AA%AC-%E8%89%AF%E8%B3%AA%E5%95%8F%E9%A1%8C/dp/481561167X

```:自分の理解度
train(章末問題)の 正解率：90%
test(模擬試験)の正解率：70%
```
むむ。過学習ですね。単元ごとの章末問題ならイケると思ったのに、見たことない問題に出会ったとたん全然解けなくなってしまいました。模擬試験では合格ラインぎりぎりで不安しかありません。汎化性能を高める必要があります。

# 過学習への対策
**①最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版** 
こちらの本も受験者の間では有名で、メルカリでは売り切れていました。
この本は問題が数多く掲載されている他、問題の難易度も載っているので、自分が間違えた問題はどれくらいのレベルだったのか知ることができます。

https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%AC%AC2%E7%89%88/dp/4297129264/ref=asc_df_4297129264/?tag=jpgo-22&linkCode=df0&hvadid=589021407104&hvpos=&hvnetw=g&hvrand=8150681665374512759&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009797&hvtargid=pla-1691017011052&psc=1&th=1&psc=1

**②これで完璧 ディープラーニングG検定(ジェネラリスト)最強の「合格」問題集**
緑本を執筆されているヤン・ジャクリン先生が最近、新しい問題集を出版したとのことですぐ購入し解いてみました。こちらも解説が詳しく、中でもAI関連の法律の部分や基本的な統計・計算問題まで網羅されていたのが非常にいいなと思いました。
さらに、模擬試験（192問）をダウンロードすることができます。（解答・解説は購入者特典です）

https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%A7%E5%AE%8C%E7%92%A7-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E6%9C%80%E5%BC%B7%E3%81%AE%E3%80%8C%E5%90%88%E6%A0%BC%E3%80%8D%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%82%B8%E3%83%A3%E3%82%AF%E3%83%AA%E3%83%B3/dp/4815617767

▼模擬試験PDFダウンロードページ
https://www.sbcr.jp/support/4815617719/

この本を一周して私の汎化性能は上がったのでしょうか？
```:自分の理解度
train(各章の問題)の 正解率：85%
test(模擬試験)の正解率：92%
```
おおーいい感じ！このままあと2週間この性能を維持できれば良さそうですが、心配なので残りの2週間は下記をトライしてみようと思います。

①STUDY AI　模擬試験
300問以上の模擬試験を無料でチャレンジできます。

https://study-ai.com/generalist/

②AVILENスキルチェックテスト
良質な20問にトライできます。

https://avilen.co.jp/test/g-certificate/

③ヤン・ジャクリン先生の勉強会動画
G検定の問題を一緒に解きながら解説してくださる動画です。とても分かりやすく、書籍ではイメージが付かないような問題も理解しやすくなりました。また、どの分野を中心に勉強すべきかアドバイスもあり、とてもタメになりました。勉強会が2回あり、1回は参加したのですが、もう一方は参加できなかったため、そちらをチェックしたいと思います。

https://www.youtube.com/live/e1Y7x8Z9cVc?feature=share

https://www.youtube.com/live/5lwx0d6pZ_8?feature=share

④頻出ワードの確認
神たちが頻出ワードをまとめてくださっています！！

https://scrapbox.io/gyarasu/G%E6%A4%9C%E5%AE%9A%E5%AD%A6%E7%BF%92%E3%83%A1%E3%83%A2

https://qiita.com/highno_RQ/items/5f4aa73c362477d90169

あと、余談ですが根詰めて勉強しても、なかなか結果に結びつかないということがありました。
そんなときはビールでも飲んで、一旦ドロップアウト。
そうすると、新たな脳内のネットワークができるのか、翌日から元気になって、学習も意欲的に取り組むことができました。

果たしてAI的戦略で合格できるのか・・・！？　結果は後日まとめます！
Visualforce Basics > Use Static Resources


+ [Visualforce Basics > Use Static Resources](https://trailhead.salesforce.com/content/learn/modules/visualforce_fundamentals/visualforce_static_resources)

+ [jQuery のダウンロード リンクが機能しない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NPqtz)

:::note
Try using this

https://code.jquery.com/jquery-3.6.3.min.js

https://developer.salesforce.com/forums/?id=9060G000000XeaeQAC
:::

+ [Visualforce Basics - Use Static Resources - Create and Upload a Zipped Static Resource](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7SlR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c54f96a-6b97-733d-d20e-b764a225d24c.png)

:::note
I resolved the same error by compressing the zip folder before uploading as mentioned in the trailhead.

from trailhead:

1. Open the zip file and remove the /demos/ directory and its contents.
2. Compress the folder and rename it jquery.zip.
:::
GoLandにPlantUMLを導入する

## PlanutUMLとは
PlantUMLはオープンソースのUML描画ツールです。ドメインモデル図やER図など様々なUMLを書くことができるツールで、コードベースで記述できることが特徴です。もちろん無料。

ずっとPlantUMLを使っていたのですが、最近プロジェクトの関係で少しLucidCartでUMLを作成していました。

ただ、Lucidだと

- ドキュメントをバージョン管理できない（履歴機能はあるけど重すぎて使い物にならない）
- 図の一部を消してしまったり、不注意によるミスが起こりやすい
- 動作が重い

などの問題があり、再びPlantUMLに戻ってきました。笑

最近サブスクで登録したGoLandにもPlantUMLを導入したかったので、その手順を解説していきます。

## 導入手順

それでは早速手順を解説していきます。

まずGoLandを開き、「GoLand」→「Settings...」をクリックします。

さらに「Plugin」をクリックし、検索欄で「PLantUML」と入力すると、下記添付写真のようにPLantUML Integrationというプラグインが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/01c1382a-20cd-efc7-151e-81b2fdcd4718.png)

Installをクリックし、実行します。

続いて、Homebrewを用いてgraphvizをインストールしていきます。こちらのインストールはしばらく時間がかかるため一旦待機します。

```bash
$ brew install graphviz
```
Homebrewでインストールできたら、dotのパスをGoLandに設定していきます。
再び「GoLand」→「Settings...」から設定を開き、左上の検索欄で「PlantUML」と検索し、PlantUMLの設定画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/12764343-d545-147c-e12d-883c52ab399e.png)
添付写真内に赤枠で囲っている「Graphviz executable:」に「/opt/homebrew/bin/dot」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/0ec73c19-aec1-ccc6-9b54-d4b13a14ee1d.png)
「OK」ボタンをクリックして、最後にGoLandを再起動させれば完了です。

## 動作確認
いつも通り右クリックをして、「New」にカーソルを当てると、下記写真のように「PlantUML File」というものが新たに作成されているので、こちらをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/120f766b-00ed-366a-9f39-65de7abe60dc.png)
ファイル名を尋ねられるので、適当名前をつけて作成します。

最後に作成したファイルをクリックし、画面右半分にUMLが表示されていることを確認できれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/eafcf7ce-4e83-48b5-3917-5310954de1e1.png)

あとはドキュメントを見ながら適宜UMLを作成していきましょう。

https://plantuml.com/ja/
C-1033 エラー


VS Codeのエラーかと思っていますが、よく分かりません。

There are several answers to this problem on SO. Your problem is caused by having the project on a shared folder. VS likely having problems accessing the file.

+ [Running visual studio 2015 on parallels c1033 error](https://stackoverflow.com/questions/33899943/running-visual-studio-2015-on-parallels-c1033-error)

The VSP1033 error could mean a few different things, but it is indicating that our tools cannot read the binary. The VSP2005 warning with “The object must be rebuilt with approved tools” means that the libs are missing some debug information that is required for you to be able to link to source lines after instrumentation.

+ [VSP 1033 error with a C++ exe referencing other libraries](https://developercommunity.visualstudio.com/t/vsp-1033-error-with-a-c-exe-referencing-other-libr/677642)


-----------------------------------

+ [Error creating a scratch org C-1033](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NHCyI)

これでは

The outage was because of this https://status.salesforce.com/incidents/10793 

とインスタンスの問題らしいけど

こっちは時期が少し違うんだけどなぁ

+ [The request to create a scratch org failed with error code: C-1033.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000EAlNR)
serverless frameworkで.envを使う

# はじめに

* `serverless.yml`内に`api`の情報や認証情報を載せたくない
* `local`, `dev`, `production`で値を変えたい

そんな時は`.env`ファイルに変数を格納することが多いと思うので、
`ServerlessFramework`で`.env`を使うときのメモ。


# 導入方法

1. `serverless.[yml, ts]`ファイルにpluginの記載

    ```yaml:serverless.yml
    plugins:
      - ...
      - serverless-dotenv-plugin
    ```
    
    ```typescript:serverless.ts
      plugins: [..., 'serverless-dotenv-plugin'],
    ```

1. `serverless.[yml, ts]`ファイルの修正(すでに書いてあればSKIP)
    
    ```yaml:serverless.yml
    provider:
      environment:
      # ここに.envを読み込んだ環境変数が入るようになります
    ```

    ```typescript:serverless.ts
    provider: {
      environment: {
        // ここに.envを読み込んだ環境変数が入るようになります
      }
    },
    ```

1. `serverless-dotenv-plugin`のインストール
    
    ```bash
    # npm
    $ npm i --save-dev serverless-dotenv-plugin
    
    # yarn
    $ yarn add --dev serverless-dotenv-plugin
    
    # pnpm
    $ pnpm i --save-dev serverless-dotenv-plugin
    ```
    
1. .envの作成

    `serverless.[yml, ts]`と同じディレクトリに`.env`ファイルを作成する

    ```bash
    $ ls
    ...
    serverless.[yaml, ts]
    ...
    
    $ touch .env
    ```

# 動かしてみる

まずは`.env`に適当な変数を入れてみる

```.env
QIITA=hoge
```

`sls print`で実際にデプロイされる変数が入った後のファイルを見てみる。

```bash
$ sls print

・・・・省略
  environment:
    QIITA: hoge
・・・・省略
```

`serverless.yml`には`QIITA`の記載はしていないですが、
ちゃんと`.env`から変数が入りましたね👍

# .env.{env}について

#### <font color="red">`.env.*.local` にはシークレット情報が載るため、git管理はやめましょう</font>

### .env

* デフォルトで呼ばれます。
* 例) 環境に依存しないデフォルト値の設定などで使います。

### .env.local

* 環境に依存しないが、シークレットにしたいものを入れます。
* 例) 個人のアカウント情報など

### .env.development

* `NODE_ENV`や`--env`や`--stage`が指定されない場合に呼ばれます
* 例) 開発環境で使われるデフォルト値を入れます。

### .env.development.local

* `NODE_ENV`や`--env`や`--stage`が指定されない場合のシークレット情報。
* 例) 開発環境で使われるAPI_KEY情報など

### .env.{env}

* `NODE_ENV`や`--env`や`--stage`が指定されている場合に使われるデフォルト値。
* 例) `sls deploy --env production`時には`.env.production`が呼ばれます。

### env.{ENV}.local

* `NODE_ENV`や`--env`や`--stage`が指定されている場合のシークレット情報。
* 例) `sls deploy --env production`時には`.env.production.local`が呼ばれます。

#### <font color="red">`.env.*.local` にはシークレット情報が載るため、git管理はやめましょう(大事なことなので２回...)</font>


# オプション

rootディレクトリの設定ができたり、色々できそうです。
デフォルトのままでも十分使えますが、プロジェクトによって設定してみても良いと思います。
気になる方は公式サイトを確認してみてください

```yaml:serverless.yml
custom:
  dotenv:
    # default: project root
    path: path/to/my/dotenvfiles
```

# 参考

https://www.serverless.com/plugins/serverless-dotenv-plugin
日々の作業の進め方について

作業の進め方について、職場で色々教えて貰ったので、そのことを記事に書きます。

## 前提
作業を進める前の「やるべきことの洗い出し」を、以下手順で分割します。

　１．タスクの洗い出しと、優先順位を決める
　２．１で洗い出したタスクの見積
　３．２をINPUTに、何をいつまでにやるかを決める（マストと目標の設定）

手順１は、業務の全体像を把握できている人や、実務経験がある人でないと、
中々難しいです。なので、今回は手順２と３をメインに説明します。
また、対象プロジェクトは従来のウォータフォール型とします。

## １．タスクの洗い出しと、優先順位を決める
　タスクの洗い出しは、WBS、TODOリスト、メールやチャット等の履歴、個人メモ等をINPUTに、洗い出します。
そして、洗い出したINPUTに優先順位をつけます。
優先順位は、洗い出したINPUTを意思決定のフレームワークに当てはめてたりして決めるといいかも？

◆意思決定のフレームワークの例
　・MoSCoW法
　・Kano Model
　・意思決定マトリクス
　・緊急度・重要度のマトリクス

https://qiita.com/nile_mt/items/59791aa49ca7ace8244d

自分は、優先順位の付け方はまだ慣れていないので、有識者とすり合わせを行い
問題ないか見て、優先順位を決めます。

## ２．１で洗い出したタスクの見積
#### タスクを細かい作業に分割する
洗い出したタスクを、見積のために、更に細かい作業に分割します。
各作業は、WBSのワークパッケージ、もしくはアクティビティレベルを
さらに細かい粒度に分解したイメージになります。
例として、『メンバの一人が、今日は単体テストのタスクを予定している』
という場合、以下のように整理できます。

例）WBSのアクティビティが『機能Aのテスト設計書作成』の場合
　１．　テストの目的を整理するためのINPUT集め
　２．　テストの目的とゴールを設定
　３．　テストの観点の整理
　４．　★チーム内の有識者と、２・３で整理した内容を認識合わせ
　５．　テストケースの洗い出し
　６．　テストデータの設計
　７．　★チーム内の有識者と、５・６で整理した内容を認識合わせ
　８．　テスト設計書作成①（観点用のシートを一部作成）
　９．　テスト設計書作成②（テストケース用のシートを一部作成）
　１０．★チーム内の有識者と、８・９の内容を認識合わせ
　１１．テスト設計書作成③（①、②の内容で他も作成していく）
　１２．自己レビュー
　１３．内部レビュー
　１４．★チーム内の有識者と、内部指摘の内容を認識合わせ
　１５．内部レビュー指摘対応
　１６．顧客レビュー
　１５．★チーム内の有識者と、顧客指摘の内容を認識合わせ
　１６．顧客レビュー指摘対応
　１７．顧客提出

補足：
※上記『機能Aのテスト設計書作成』は、スコープを設計書作成〜顧客提出までとしています。
　各アクティビティのスコープは、作業前に有識者としっかり認識合わせします。
※自分は、まだ作業に慣れていないので、★印であるチームメンバとの認識合わせを
　意識的に入れて、作業の手戻りを少なくするようにしています。

#### 見積もりの際のコツ
##### ◆定量化を意識する
見積は、定量的な見積もりを意識して、客観的に見積もりの合計がわかる様に作成します。
例１：単体テスト設計書の定量化
　　成果物：〇〇〇設計書.xlsx
　　　・観点シート
　　　　　概要：テスト全体の観点をまとめたシート。
　　　　　要素：観点と機能の対応がわかる１０×５のテストマップ表が１つ。
　　　・テストケースシート
　　　　　概要：観点をもとに出したケース一覧シート。
　　　　　要素：観点/ケース番号/ケース名称/ケース詳細 をヘッダーに持つ一覧表が３つ。
　　　・補足シート
　　　　　概要：特殊ケースの説明を行うシート。
　　　　　要素：補足説明の図が４つ。

例２：単体テスト結果の定量化
　　成果物：〇〇〇結果.xlsx
　　　・ケースNo.1のシート
　　　　　概要：ケースNo.1のテスト結果をまとめたシート。
　　　　　要素：■■■機能の画面のキャプチャが１０〜２０枚。
　　・テーブルデータシート
　　　　　概要：テストで使った生データの表
　　　　　要素：▲▲テーブル、●●テーブル、✗✗ビューのSELECT結果

##### ◆バッファを入れる
各作業にはバッファを入れます。大体作業時間の15%の時間を見積もりに追加します。

##### ◆休日・祝日、その他休業日を意識する
見落としがちですが、有識者やレビュー担当者が休みで、作業が進まないパターンも考えられます。
自分の作業に関わる人の休暇情報を、事前に確認しておきます。

## ３．２をINPUTに、何をいつまでにやるかを決める（マストと目標の設定）
一日または、半日単位で、『今日何をやるべきか、どこまで終わらせるか』のラインを明確にします。
上司への報告は、このラインを達成したか否か、または、達成できそうか否かの形式で報告します。

もし遅延した/している場合、以下の内容を上司に報告します。
　・現在どのタスクをやっているか
　・今朝に決めたマストの作業は完了できそうか
　・どのタスクで遅れているか
　・何が原因で遅れているか
　・遅れによる他への影響はないか（後工程はどうなるか、調整は必要か）
　　また、遅れによるリカバリーをどうするか

## その他補足とか
##### ◆ペース配分を意識する
手順３について、一日単位や半日単位でラインを設けていますが、遅れが積み重なった場合、
上司に報告しづらくなります。
また、何が原因で遅れたのかも忘れてしまったり、色々大変なので、遅れが出たらすぐに検知できるようにします。
具体的な方法として、今からやる作業が、15〜30分単位のペース配分がどれくらいか確認する方法です。
作業の見積は手順２で出しているので、それをベースに、「半分の時間ならここまで進んでいる。」
「そのさらに半分はここまで進んでいる」と、具体的にイメージしてから作業に入ります。

ペースが遅れそうな場合は、その時点で上司に報告して、遅延を最小限に抑えます。
その際の遅延報告は、手順３で挙げた形式で行います。

##### ◆作業に時間がかかった箇所はマーカーする
作業する中で、時間がかかったものは、資料上に色を付けたり、別途メモ帳に残します。
朝会や夕会・進捗報告会などの、まとめて報告する場では、これを使ってスムーズに報告できるようにします。

##### ◆マイルストーンを意識する
手順３の『今日何をやるべきか、どこまで終わらせるか』をさらに意識付けるために、
各案件のマイルストーンを確認します。
マイルストーンについては、以下の記事が参考になった（面白かった？）ので紹介します。

https://qiita.com/_Nanagin/items/45ab0ed0185a35737da5

##### ◆慣れないうちは、型に沿って進める
自分自身もまだこの方法に慣れていないので、まずは型に沿って進めます。
慣れてきたら、効率化で無駄なところを省いたりします。
最終的には、この手順を見ずに作業できるようにします。

## まとめ
この手順書通り動けたら理想ですが、自分自身も、まだまだ出来ていないところが沢山あります。
まずは、この基本の型をしっかり身につけることを目標に日々仕事をしていきたいと思います。
インフラ専門用語

最近インフラエンジニアとして仕事を始めましたが、先輩の会話や会議でもまったく分からない専門用語が沢山あるので、まとめてみました。

# AD
active dirctoryと呼ばれるもので、WindowsServerの機能の一つ。管理するネットワーク上に存在する様々な資源やその利用者の情報や権限などを一元管理することができるもの。とあるサイトにアクセスするときに一度だけ認証すれば、他のページにアクセスする度に認証を聞かれることはない。

# AADC
Azure AD Connectと呼ばれる。オンプレミスとクラウド両方のシステムを運用する際のアカウント管理に使えるツール。オンプレのアカウント管理にはAD、クラウドではAzureActiveDirectory。それぞれ異なるアカウント情報が存在すると管理の手間が掛かるため、AADCはこれら二つの間でアカウント情報を同期し、一つのID・パスワードで各情報システムにアクセスを可能にする。
ユーザーをグループ単位で管理、アプリを割り当ても行える。

# LGWAN
LocalGovermentWideAreaNetwork。日本語では統合行政ネットワーク。私たちが通常利用している公的なネットワークとは切り離されている閉鎖的なネットワークで地方公共団体が庁内LANを互いに接続するための通信基盤。

# NetFlow
cisco社が開発したトラフィックの詳細情報を収集するための技術。ルーターやスイッチなどのネットワーク機器に搭載されており、ネットワーク機器を通る通信のパケットから、いくつかの情報を取り出し`フローデータ`を生成。

# ApexOne
先進技術と実績ある技術を融合したXGen(クロスジェネレーションズ)のセキュリティアプローチにより、さまざまな脅威に対して広範は保護を提供する、`クライアント/サーバー向けの統合セキュリティ対策ソフト`。

# X-Forwarded-For(XFF)
HTTPヘッダのフィールド(項目)の一つで、プロキシやロードバランサがWebサーバに対して本当のクライアントのIPアドレスを通知するためのもの。プロキシサーバやロードバランサなどの中継を利用するとWebサーバ側から見たHTTPリクエストの送信元アドレスがそれら中継機器のものとなるので、実際のWebクライアントのIPアドレスが分からない。

# IceWall
事前に不当アクセスを防ぐファイアウォールとは逆に、不当アクセス自体を探知するために発案されたシステム。
端末自体の認証ではなく、業務システムやクラウドサービスなどネットワーク経由で提供されるサービスを認証強化することを目的とした製品です。業務システムやクラウドサービスなどをアプリケーションの修正なしで多要素認証化することが可能。

# Opmaneger
オーピーマネージャー。ネットワーク、システム、アプリケーションを包括的に監視するソフトウェア。

# Nutanix
プライベートクラウド、パブリッククラウド、ディストリビューテッドクラウドの各オペレーティング環境を統合し、あらゆる規模のITインフラストラクチャーとアプリケーションを単一で管理する機能を提供しています。
　Nutanixによる五つの課題解決
　・ハイパーバイザーに依存しない、マルチハイパーバイザーのサポート
　・ワンクリックでのセキュリティアップデート
　・好きな時にオンラインでのシステムの拡張/縮小が可
　・ローカルストレージによる圧倒的なIOPS性能
　・サーバとストレージの管理UIが一つになっており、運用管理者の負担を軽減
Ubuntu22.04 にArcMenu をインストールする方法

# はじめに

アプリ管理の拡張機能である ArchMenu は Gnome のページのものはバージョンの関係で使えない。


# インストール方法

依存関係のインストール

```sh
sudo apt install gir1.2-gmenu-3.0 gnome-menus libgettextpo-dev gettext -y
```

インストール

```sh
git clone https://gitlab.com/arcmenu/ArcMenu.git
cd ArcMenu
make install
```

Ubuntu Software で拡張機能のアプリをインストールして開き、ArchMenu を有効化する。

![Screenshot from 2023-02-16 21-12-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/98ee1ba3-9b01-8c8a-42a8-61ca483b2880.png)

---

https://gitlab.com/arcmenu/ArcMenu/-/wikis/Install-From-Source-Guide

https://gitlab.com/arcmenu/ArcMenu/-/wikis/ArcMenu-Dependencies

https://gitlab.com/arcmenu/ArcMenu.git
PowerApps ポータルから実行するクラウドフローをシンプルにする方法

# はじめに
PowerApps ポータルで試したことを備忘録として残していきたいと思います。
今回はポータル画面からのクラウドフローの実行についてです。

ポータル画面から送信したあとにクラウドフローを実行することは良くあります。この場合、送信したレコードの作成・更新のタイミングをトリガーとするクラウドフローを作成することが多いと思います。しかし、レコードの更新のタイミングは目的のポータル画面以外の場合もあるのでステータスなどの属性を見て処理する必要がありクラウドフローが複雑化してしまう課題がありました。
このようなことを避けシンプルに特定のポータル画面で送信したタイミングだけで特定のクラウドフローを動かしクラウドフローを分割管理するのが今回の方法です。クラウドフローが複雑化している場合に有効なテクニックになります。

# 方法
特定のポータル画面の送信時に値を更新する属性を作成してその属性を現在時刻で更新することでクラウドフローを動かすという考え方です。複数の画面がある場合、画面の数だけ属性を定義し対応するクラウドフローを作成します。

+ 該当ポータル画面の送信時間を記録する属性をテーブルに定義する
+ 該当ポータル画面の基本フォームのメタ情報に定義したテーブルを追加して「保存時に値を設定する」を有効にして「種類」を「今日の日付」に設定する
+ 対応するクラウドフローの開始条件を以下のようにする


| 項目 | 設定 |
|---|----|
| テーブル名 | 該当テーブル名 |
| 列を選択する | 送信時間を記録する属性 |
| 行のフィルター | 送信時間を記録する属性 ne null |

行のフィルターは開始条件の設定の「トリガーの条件」に書き方は少し変わりますが記載することも可能です。この方法を使うと行のフィルターに設定している場合は、条件に該当しない場合でもクラウドフローが起動しすぐに終了するような動作をしますが、トリガーの条件に記載すると起動自体を抑制できるのでクォータ消費の抑制ができます。
```
@not(equals(triggerOutputs()?['body/送信時間を記録する属性'], null))
```

# おわりに
今回は特定のポータル画面から特定のクラウドフローは実行する小技の紹介でした。ただ、たまにテーブル更新を１つのクラウドフローにしたい言われる場合ありこの場合はこの小技は使えません。クラウドフローは複雑になると保守性が悪くなるためできる限り小分けにする方が良いと思ってますが実際に保守する方の希望なので対応していますが、なかなかこのあたりは説明しても伝わらないことが多いです。
意外にしらないデータベースの機能：ロールバック

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能　ロールバックについて更に詳しく調べてみましょう！

![インスタスライド_202302023.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/0de1d47a-7a7c-c129-5023-f74f28e449ab.gif)

# ロールバックとは
データベースの異常時やプログラムの異常時にデータの一貫性を保証するための機能

# ロールバックイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e4e34576-46d4-bf91-b82b-816b6a5c6f8f.png)

・トランザクション１ 
　-- トランザクションログにて処理をロールバック
・トランザクション２ 
　-- トランザクションログにて処理をロールバック
・トランザクション３ 
　-- 処理は、終了しているため、影響なし

# ロールバックの種類
ロールバックには

１．データベースの障害により
データ整合性のために自動的に行われるロールバック

２．プログラムのエラーにより
プログラムから明示的に発行されるロールバック

の２つのロールバックが存在する

# まとめ
ーロールバックは、データの一貫性を保証するための機能

ーデータベースの異常時のロールバック

ープログラムのエラー時のロールバック

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
adobe air と　printmagic と　ChatGPT例



![IMG_20230217_045835.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/19c2f57c-91f3-2eb5-2af5-3f820fcc097c.jpeg)


printmagicはここです
http://www.print-magic.net/


問題は adebe air で

https://github.com/airsdk/Adobe-Runtime-Support/issues/1742

で

The shared AIR runtime can be found at:
https://airsdk.harman.com/runtime

を教えてもらいました
感謝です


https://www.youtube.com/watch?v=fkN2U2knYHw
でも同じこといってました

------


昔　白雪姫で女王は　鏡に向かって
「鏡よ鏡　世界で一番美しいのはだあれ？」と
語りかけました

https://www.youtube.com/watch?v=mQVKs8htd-A


今やそれを我々は
chatGTP に向かってします

「ChatGPTよChatGPT　PlayStation 5に対する Linux のインストール方法はなあに」
です

今までのGoogle では何百何千という情報が出てはきます
しかしそのたくさんの石ころの中から宝石を見つけるのは
自分に負わされます
ところがAIそのもののchat GPT では 結果はひとつだけです
楽は楽です
でも掘り出し物を見つけるチャンスは全くないですー

## 2023/2/17 時点で

![chaGTP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/b715d05e-0f7b-09f8-8b90-0084ce98fc76.jpeg)


![スクリーンショット_2023-02-18_02-35-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/65b1d991-26aa-f4b9-4432-cb28503eca61.png)

しかし　このchatGTでPの答えは　実に役にたたない


```
使ってみて

問題は　chatGPT みたいなものができると
そのchatGPTの原料のページを
極端に言えば誰も書かなくなるのではないかと思います

というのは
chatGPTは　原文の出典はいわないからです

そして
chatGPTは　追い込んでつかわないと　単なる確率の高いが役に立たない答えしかでません

議論があって実りの多いForum(qiitaを含む)は残るでしょう


```


むしろ簡単なプログラムを書くのに便利です

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/3ff79f86-a148-2b43-806b-03c383ce4294.png)

./comment-out.bat countdown60.py  
------                                       
import time
timer_seconds = 60 * 60
while timer_seconds > 0:
    if timer_seconds % (5 * 60) == 0:
        print(f"{timer_seconds // 60} 分経過")
    time.sleep(1)
    timer_seconds -= 1
print("時間になりました！")
------

きちんと動きます
Buca Satılık Daire

 İzmir ve Buca’ da en iyi gayrimenkul emlak şirketi olan Konsept Gayrimenkul uzman danışmanları ve tecrübesinden destek alabilirsiniz. İzmirin en iyi ve en prestijli emlak firması Konsept Gayrimenkul Buca emlak ilanları sitesi <a href="https://konseptgayrimenkul.com/">konseptgayrimenkul.com</a> da <a href="https://www.konseptgayrimenkul.com/buca-satilik-daire">Buca Satılık Daire</a> ve <a href="https://www.konseptgayrimenkul.com/buca-1-1-satilik-daire">Buca 1+1 Satılık Daire</a> fiyatlarını inceleyebilir hayalinizdeki <a href="https://www.konseptgayrimenkul.com/">Buca Satılık Daire</a> yada eve sahip olabilirsiniz. KONSEPT ‘ den emlak ilanları ; Buca 1+1 & 2+1 & 3+1 Satılık Daireler | İzmir Satılık Daire ve Fiyatları | Sahibinden Acele Satılık & Kiralık Evler


![dddphotoAid-removed-background-min-depositphotos-bgremover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171182/165ddfe4-fc8a-d93f-5a26-e9b9fbd3a6c2.png)
Buca’nın en iyi ve en güvenilir emlak firması Konsept Gayrimenkul Buca emlak ilanları sitesi ile  <a href="https://www.konseptgayrimenkul.com/buca-satilik-daire">Buca Satılık Daire</a> ilanları bu sayfada ! Buca’da aradığınız daireyi hemen bulun
意識のデータ化に関してAIと議論してみました

### 私: 意識のデータ化はできますか

### ChatGPT: 
現在の科学的知見では、意識そのものをデータ化することはできていません。意識は、個人が自己の経験、感覚、思考、感情などを自覚する状態であり、脳の神経活動によって生じるとされています。ただし、脳の神経活動を測定する技術が発展しており、脳波やMRIなどの検査によって、意識と関連する脳の活動を測定することは可能です。また、脳の神経活動や身体反応などから、ある程度の予測ができることが報告されています。しかし、現在の技術では、個人の意識そのものを直接的にデータ化することはできていません。

### 私: 意識は物理世界の外側にあるのではないでしょうか

### ChatGPT: 
意識が物理世界の外側にあるかどうかについては、科学的には明確な回答はありません。一部の哲学者やスピリチュアルな信念の中では、意識は物理世界の外側に存在すると主張されることがあります。しかし、科学的な見地からは、意識は脳の神経活動によって生じると考えられています。
意識は、脳の特定の領域の神経細胞の活動によって生じるという説が有力です。脳の神経細胞の活動は、電気信号や化学信号などの物理的な現象であり、これらの現象は物理世界に存在します。したがって、意識は物理現象として説明される可能性が高いとされています。
ただし、脳の神経細胞の活動によって生じる意識の本質的な性質やメカニズムについては、未だに解明されていない部分が多いため、今後の研究によって新たな発見があるかもしれません。

### 私: 物理世界ができる前に意識があり、意識が経験をするために物理世界が作られたと聞きました

### ChatGPT: 
このような考え方は、一部の哲学者やスピリチュアリストによって提唱されるものですが、科学的な観点からは支持されることはありません。現代の科学的理解では、宇宙はビッグバンという初期爆発的現象によって始まり、その後、時間とともに宇宙が膨張して物理現象が発生するようになりました。したがって、宇宙の物理的な存在は、時間的に先行して存在する意識によって作られたという考え方は、科学的な立場からは説明できません。
また、意識が物理世界に先立つものであるとする仮説は、意識が物理的なメカニズムによって生じるという科学的な見解とは矛盾しています。意識が物理世界に先立つという仮説が正しい場合、意識の本質的な性質やメカニズムを説明するために、新しい科学理論が必要になる可能性があります。
したがって、現代の科学的理解においては、物理世界は意識によって作られたものではなく、物理現象が存在してから意識が生じると考えられています。

### 私: もし意識が物理世界に先立つものであるとすれば、意識をデータ化することはできませんよね

### ChatGPT: 
もし意識が物理世界に先立つものであるとする仮説が正しい場合、現代の科学技術では意識をデータ化することはできないと考えられます。なぜなら、意識が物理世界に先立つ場合、意識自体が物理的な存在ではないため、物理的な測定器具を用いてデータ化することができないからです。
ただし、現代の科学的理解では、意識は脳の神経活動によって生じるとされています。したがって、脳の神経活動に関する情報を収集し、解析することによって、意識に関する情報を得ることは可能です。具体的には、脳波やMRIなどの検査によって、脳の神経活動を測定することができます。また、脳の神経活動によって生じる身体反応を観察することによって、ある程度の予測ができることが報告されています。ただし、これらの手法では、意識そのものを直接的にデータ化することはできません。

### 私: 有意義な議論ができました。ありがとうございました。

### ChatGPT: 
こちらこそ、有意義な議論をありがとうございました。何か他に質問や疑問がある場合は、いつでもお聞きください。お力になれるよう努めます。
Windows上でVScodeを使ってDockerをイジイジしたけど壁が多すぎな件

# この記事がおすすめな人
Windows10でDockerを触る準備をしたいあなた（結論に書きますがお勧めしないです）
仕事はMacプライベートはWindowsなあなた
ついでにVScodeで統括的に触れたらな～というあなた

# セットアップの全体的な流れ
- VScodeインストール
- dockerdesktopインストール
- gitbashインストール
- wsl2インストール
- /c/Users/{username}/.wslconfigの作成

# attention
先駆者の方をとても頼りにした個人的なメモでもあります。
まとめ記事のようになっておりますがあしからず。
ネット上にナレッジが沢山あるものに関しては割愛してますのであしからず。


# 手順
## 1.VScodeインストール
割愛

## 2.dockerdesktopインストール
割愛

## 3.gitbashインストール
割愛

## 4.wsl2インストール
DcokerDesktop起動時にwsl2が入ってないとエラーが出ることがあります。
以下参考にさせていただきました。感謝です。

https://qiita.com/zembutsu/items/22a5cae1d13df0d04e7b

少し補足しておくとwsl2のインストールはかなり長いです。
インジケータが止まっていてインストールできているか不安になりますが気長に待ちましょう。

## 5./c/Users/{username}/.wslconfigの作成

VScodeを起動してCtrl+@でターミナルを開き以下実行してください。

```
vim /c/Users/{username}/.wslconfig

--ここから--
[wsl2]
kernelCommandLine = vsyscall=emulate
--ここまでを記載して保存--
```
PC再起動して設定を適用する
  ※これをやらないとdockerrunしたあとコンテナが即死する。

以下参考にさせていただきました。感謝です。

https://cartman0.hatenablog.com/entry/2022/03/07/Docker%E3%81%A7Exited%28139%29%E3%81%8C%E5%87%BA%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6

# さいごに
dockerに慣れてない人からすると障壁が多くdockerのエラーなのかWindowsが原因なのか迷いそうであまりオススメはできないです。
ただ自分のPCあるけどWindowsなんだ・・・会社のPCは業務時間外では使いたくないし・・・
みたいな人にはおすすめできそうです。

それではよきコンテナライフを:relaxed:

# おまけ
## stat C:/Program Files/Git/usr/bin/bash: no such file or directory": unknown 問題
linuxの要領で以下のようにrunさせますが/bin/bashが見当たらんとエラーが出ます。
`docker run -it test:1.0 /bin/bash`

以下参考にさせていただきました。感謝です。

https://qiita.com/nannany_stores/items/52c471d7b13bff9b285e

## 8080:80でコンテナを起動させて localhost:8080 が表示できない問題
8080が別のプロセスで利用されていない場合、Windowsのファイアーウォールが問題である可能性が高いです。

以下参考にさせていただきました。感謝です。

https://arkgame.com/2022/06/01/post-308603/
引数、戻り値について

javascriptの勉強を進めている中で私が初めてぶつかった壁である引数と、戻り値についてメモとして残します。

## まず意識したいこと３つ

* 引数は、値を渡す側と値を受け取り処理をする側があるということ。
* 戻り値は、受け取った引数を使って完了した処理を、呼び出し元へ返す値ということ。
* 処理を呼び出す際に、引数の受け取る側に値をセットすること。


``` javascript:例文
function greeting(name) {
    return 'ようこそ、' + name + 'さん'; 
} 
console.log( greeting('佐藤') );  // 結果＝＞　ようこそ佐藤さん 
```

こちらのコードでは、greetingという関数があり、４行目のconsole.logで呼び出しています。

**引数の渡す側となるのは4行目の('佐藤')です。**

4行目のgreeting関数呼び出しの際にセットしていますね。
この佐藤がgreetin関数の(name)に置き換わるイメージです。

**なのでgreeting(name)は値を受け取る側になります。**

戻り値ですが、受け取った佐藤をgreeting関数の処理に当てはめると
結果は　'ようこそ佐藤さん'　ですね。

**この　'ようこそ佐藤さん'　が戻り値となってコンソールされます。**

戻り値の処理は必ずしも return の記述があるわけではなく、計算式や真偽値、メッセージなどを返すこともできます。
処理の内容がどうであれ、戻り値は関数などで処理されて返される値だと覚えましょう。
Windows 11の右クリックメニューが使いにくいという人へ

Qiitaにこの記事が必要なのかは疑問なところですが、とりあえず。

Windows 11の右クリックメニュー（コンテキストメニュー）が使いにくいという人をちらほら見かけます。
確かにWindows 10までのものと比べると使いにくいです。
必要なメニューは一度展開しないといけない。

どうにかならないのか。
既出かもしれませんが、まとめてみました。

## Shiftキーを押しながら右クリック

Windows 10のときにも使っていたのですが、この方法を使うとWindows 11でも従来のメニューに加えて、いくつかの項目が増えた状態のメニューが表示されます。
自分的には、「Open PowerShell window here」をよく使うので、Windows 11の右クリックメニューが使いにくいことを忘れてました。


## アプリケーションキーを使う

キーボードで操作することが多いので、アプリケーションキーをよく使います。
右クリックメニューがでるキーです。

https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%BC

このキーは従来のコンテキストメニューが表示されます（なぜ？）。


## Shift+F10を使う

キーボードで操作することが多いのですが、操作するマシンにアプリケーションキーがついていないことがあります。
これらのキーは大抵のWindows用のキーボードにはあるのでこれを使う場面もあります。


## それでも右クリックメニューを以前の状態にしたい場合

Windowsのレジストリをいじるしかありません。

https://smartasw.com/archives/13479

個人的にはあまりこの部分を変更するのは過剰なカスタマイズかなと思っているので、素直に慣れるか代替の方法に切り替えるほうがいいと思っています。


## いや自分もやっぱり最初は戸惑いましたけど

自分はよく、テキストファイルを右クリック、キーボードのVを押下、Enterを押下でVimを立ち上げることが多いんですが、その右クリックメニューにすでにVにマッピングされたメニューが存在しているんで、もう使えないんですけどね。
Windows 7ぐらいまでは使えてたかな。

![20230217_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/74a90f5e-0bf7-b5d5-8ea3-6a973a0d93dd.png)
ESP32 で microPython を導入してみた

今まで ESP32 では Arduino 開発環境で使ってましたが、 microPython を使ってみました。
以下のページを元に試してみます。


https://docs.micropython.org/en/latest/esp32/quickref.html

# 環境

母艦

- Ubuntu 22.04
- python 3.10.6

デバイス

- ESP32 / Lolin WEMOS 32

# 母艦の準備


esptool が必要らしい。
```
$ sudo pip install esptool
```
動作確認を兼ねて、デバイスの消去


```

$ esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
```


タイミングよくリセットするとこのようになりました。
```
esptool.py v4.5
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-D0WDQ6 (revision v1.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 7c:9e:bd:e3:19:c8
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 13.1s
Hard resetting via RTS pin...

```

うまく動いているみたいです。

# ファームウェアの書き込み

https://micropython.org/download/esp32/
こちらから、v1.19.1 (2022-06-18) .bin  をダウンロードしました。

以下のようにして書き込みをします。

```
$ esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 esp32-20220618-v1.19.1.bin 

```


# REPL で操作

母艦から、picocom でアクセスしてみます。

```
$ picocom /dev/ttyUSB0 -b115200
```

エンターすると REPL のプロンプトが現れました。

```
>>>
```

計算を行わせてみました。普通の Python と同様にインタープリタが動作するようです。

```
>>> 1+2
3
```
Python構文もOKでした。

```
>>> print("a")
a
```
ESP32 ぽく GPIO を操作してみます。
```
>>> import machine
```
として、
```
>>> pin = machine.Pin(5, machine.Pin.OUT)
```
これを実行したらボード上のLEDが点灯。

```
>>> pin.on()
```

これで、LEDが消灯。
```
>>> pin.off()
```

これで、LEDが点灯しました。

WEMOS LOLIN32 のLEDは負論理かな?
【VBA】Splitを使って"100-103" を "100 101 102 103" に分割！！

このような文字列を分割するには、VBAのSplit関数を使用することができます。Split関数は、指定した区切り文字で文字列を分割し、配列として返します。例えば、"100-103" をハイフン（-）で分割する場合は、以下のように記述することができます。
```
Dim str As String
Dim arr() As String

str = "100-103"
arr = Split(str, "-")

For i = 0 To UBound(arr)
    Debug.Print arr(i)
Next i
```
このコードを実行すると、"100-103" が "-" で分割され、配列 arr に "100", "103" の2つの要素が含まれることになります。配列の各要素を取得するには、For文を使用して配列をループ処理することができます。

次に、ハイフンで区切られた範囲内の数値をすべて含む文字列を作成するために、配列内の数値をループ処理して新しい文字列を作成します。例えば、以下のように記述することができます。
```
Dim str As String
Dim arr() As String
Dim i As Long
Dim result As String

str = "100-103"
arr = Split(str, "-")

For i = CLng(arr(0)) To CLng(arr(1))
    result = result & " " & CStr(i)
Next i

result = Trim(result)

MsgBox result
```
このコードでは、配列 arr の最初の要素を開始値、最後の要素を終了値として、For文を使用して数値をループ処理しています。ループ内では、result変数に数値を追加していき、最後にTrim関数を使用して不要な空白を削除しています。結果として、"100 101 102 103" という文字列が得られます。
AWS EC2インスタンスで、OSのテンプレートに入れておくと便利なもの②

[前回](https://qiita.com/If_it_bleeds-we_can_kill_it/items/9280b6aa74263963d552)の続き。

前回はRHELにSSM-AgentとCloudwatchAgentをインストールした。
このあとはIAMロールの設定を行う。

IAMよりロールを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/47dbe788-30a1-5c15-29fa-295b00f2e864.png)

AWSサービスを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/9321e71c-49ce-0989-fb07-0ff86fa314de.png)

ユースケースとしてEC2を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/97747bb7-bc7b-2e28-1d21-a0144b611122.png)

今回SSMとCWAの許可をしたいため、AmazonSSMManagedInstanceCore　で検索。

AmazonSSMManagedInstanceCore　を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/ce11281b-d61b-fd61-f259-63c41e16ff5f.png)


適当なロール名を決める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/33cb463c-fe7c-e541-e776-8b792d95d0e3.png)

ロールを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/99e3f8c6-52dc-c16e-b197-ce9fb01146d2.png)

EC2より対象インスタンスを選択して、IAMロールを変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/f1a2eb21-8dc5-adb8-d9a0-2085b955eb9c.png)


さっき作ったIAMロールを選択して割り当て。Updateを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/15797aba-9fa6-ec8d-6baa-aec347d2e038.png)

SystemManagerに進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/cbb8d566-067c-2788-2d80-ab274f447cac.png)


SessionManagerを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/319a7f7f-397a-b8c8-4840-9225ac5eba02.png)

ターゲットインスタンスから接続すると、Linuxのコンソールシェルに遷移。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/091c0f36-1045-0bf7-3ffa-efdc22bd3353.png)

こんな感じで、マネコンからLinuxのセッションを見ることが可能。
ちなみにWindowsServerでは、SessionManagerが既定で入っていたようで、IAMロールをつけるのみで、GUIデスクトップもAWSマネコン（SessionManager）から参照ができた。

便利な世の中になったものです。
画像ファイルの送信テストを行うときのごまかし方

今回は、`HttpClient`を使ってテストを行うときに、本物の画像ファイルを用意しないで`MultiPartData`を送信する方法について紹介します。

まず最初に、Ktorに画像や動画を送信するとき、Ktor側では`call.receiveMultipart()`を使って、`MultiPartData`を受け取ると思われます。

このとき、`MultiPartData`インスタンスの中**multipart data stream**を表しています。
Kotlinでは、1つ以上の`PartData`によって`MultiPartData`が構成されています。この`PartData`の種類には、`PartData.FormItem`や`PartData.FileItem`などがあります。これらは、`MultiPartData`に対して`forEachPart`を使うことで、順番に取り出すことができます。

```kotlin
multipart.forEachPart { partData ->
    when(partData){
        is PartData.FormItem -> {
            // ...
        }
        is PartData.FileItem -> {
            // ...
        }
        is PartData.BinaryItem -> {
            // ...
        }
        is PartData.BinaryChannelItem -> {
            // ...
        }
    }
}
```

それでは本題です。`PartData.FileItem`を使って、テストコードから画像を送信する方法を紹介しますが、テストのためだけに画像ファイルを用意する必要があるのでしょうか？
それはとても大変であり、面倒なことだと思います。

ではどのようにして**画像を送ったこと**を表現すれば良いのでしょうか？

ここで答えを言ってしまうと、`byteArrayOf()`を使うことで、画像というよりは画像データを送ったことをテストの中で表現することができます。

```kotlin
val response = client.post("/post") {
    setBody(MultiPartFormDataContent(
        formData {
            append("text", "こんにちわ")
            append("image", byteArrayOf(1, 2, 3), Headers.build {
                append("Content-Type", "image/jpeg")
                append("Content-Disposition", "form-data; name=\"image\"; filename=\"image.jpg\"")
            })
        },
    ))
    header("Authorization", "Bearer $token")
}
```

この時、一番大事なのは`Content-Disposition`の部分です。これを設定することで、`PartData.FileItem`として受け取ることができます。

:::note warn
余談ですが、`append("Content-Type", "image/jpeg")`を指定しなくても、`PartData.FileItem`として受け取ることができます。
:::
Nuxt3 ホットリロードで使用するポートの番号をデフォルトの24678から変更する

# はじめに
`Nuxt3`のプロジェクトが複数ある場合などに、デフォルトで設定されたホットリロード用のポート番号が被ってしまうため変更する必要があると思います。
タイトル通りですが、この記事はその変更方法について書いています。

# 環境
* Nuxt：3.0.0
* Vue：3.2.45
* Vuetify：3.0.2


# nuxt.config.tsを修正する
変更は簡単で`nuxt.config.ts`に下記のように設定を追加します。
```nuxt.config.ts
export default defineNuxtConfig({
  vite: {
    server: {
      hmr: {
           port: 24600
      }
    }
  }
})
```
上記のように設定するとホットリロード用のポート番号が`24678`から`24600`に変更されます。

`Docker`を使用している方は`docker-compose.yml`ファイルなどからポートの設定を変更してください。

# 参考

https://www.astucesmobiles.com/en/fix-hot-module-reloading-in-nuxt-3/

https://ja.vitejs.dev/config/server-options.html#server-hmr
Mac：vscode：HTMLで指定の領域の最外側に新たにdivタグを簡単に生成する方法

# divタグで囲みたいHTMLの領域を選択する

# Cmd + Shift + P で、入力ボックスが表示されるのでその窓で wrap と入力

# 「Emmet ラップ変換」という項目が出るので選択

# 選択後、wrapと入力していた入力ボックスが空になるので、そこにdivと入力し、Enter

これで選択したHTMLの領域を囲む形でdivタグが生成される。
非常に便利。