OmniAICreator/Qiita-1.07M huggingface dataset:
理系学生必見！　matplotlibでサクッとグラフ表示

<h1>理系学生必見！　matplotlibでグラフ作成</h1>

<p>まずグラフを描画する領域(figure)を作ります。その中にaxesという座標軸のような物を作ります。複数のグラフを表示させたいときはaxesを複数個用意します。<br>
僕のイメージではfigureという大きい紙を用意して、その上にaxesを貼り付けていくイメージです。</p>

```python:
import matplotlib.pyplot as plt
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
ax4=fig.add_subplot(2,2,4)
```
<p>上のコードではfigureに四つのaxesを貼り付けたというイメージです。<br>add_subplotの中の引数はfigureのどこにaxesを表示させるかを指定しています。<br>グラフを書くときに良く使われるメソッドの種類をまとめたいと思います。</p>

| グラフ名 | メソッド名 |
| --- | --- |
| 折れ線グラフ |plot() | 
| 散布図 | scatter()|
| 棒グラフ | bar()|
| ヒストグラム | hist() |
| 水平線| axline() |
| 垂直線| axvline()|

<p>よく使う見た目の調整などに使うメソッドもまとめておきます。axesで使われる物は「set_～()」の形が多いです。</p>

| メソッド名 | 内容 |
| --- | --- |
|set_title() |グラフのタイトルを設定 | 
| set_xlabel()| x軸の名前を設定|
| set_ylabal() | y軸の名前を設定|
| set_xlim()| 表示させるx軸の範囲を決める|
|set_ylim()| 表示させるy軸の範囲を決める|
| set_xticks()|x軸の目盛りの表示を変更させたいときに使う  |
| set_yticks() |  y軸の目盛りの表示を変更させたいときに使う|
| plt.subplots_adjust()| axesの位置を調節する|
|plt.show() |グラフを表示させる(おそらく必ず必要だと思います) |
| plt.savefig() | 作成したグラフを写真で保存 |

<h1>最後に</h1>
<p>matplotlibを使えば様々なグラフを作成することができ、理系の学生は実験をした結果をグラフで表示する機会も多いと思うので是非matplotlibを活用してみてください。</p>

[ドキュメント](https://matplotlib.org/stable/users/index.html)
歩みは止まらない 〜元気があればなんでもできる〜 🔃


@tamanugi さんと@Mnishiguchi さんが、[Elixir](https://elixir-lang.org/)のたいへん興味深い、そして**元気がでる！**　スニペットを書かれていました。
ご紹介します。

https://qiita.com/nako_sleep_9h/items/97b69132babcb953cf7d

この記事を元に、[elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-1hp6lhosw-m3oiipGw__2AtOSAydseYg) Slackワークスペースの[autoracex](https://autoracex.connpass.com/) チャンネルに書かれていました。


# @tamanugi さん

```elixir
Stream.cycle('元気ですかーーーーッ！ 元気があればなんでもできる')
|> Stream.map(&([IO.ANSI.color(Enum.random(0..255)), &1]))
|> Stream.each(&IO.write/1)
|> Stream.run
```

Thanks!

# @Mnishiguchi さん

```elixir
for c <- Stream.cycle('元気ですかーーーーッ！ 元気があればなんでもできる') do
  IO.write([IO.ANSI.color(Enum.random(0..255)), c])
end
```

ありがとーーーーう！

# Run

<iframe width="1001" height="564" src="https://www.youtube.com/embed/6Nydpx0lL_8" title="アントニオ猪木　名言　道" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

迷わず動かせよ
動かせば分かるさ

歩みは止まりません。
（無限ループします）

![スクリーンショット 2022-10-06 22.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/57f9d458-4c6c-c9d9-245b-29e4f68da7a5.png)

動いている様子は[こちら](https://media.giphy.com/media/lud2iB2KrPX4yDAwcB/giphy.gif)から。

![](https://media.giphy.com/media/lud2iB2KrPX4yDAwcB/giphy.gif)

もしまだ[Elixir](https://elixir-lang.org/)をインストールしていないよ、という方はDockerで動かしてみてください。

```
docker pull hexpm/elixir:1.14.0-erlang-25.1-ubuntu-jammy-20220428

docker run --rm hexpm/elixir:1.14.0-erlang-25.1-ubuntu-jammy-20220428 mix run --no-mix-exs -e "for c <- Stream.cycle('元気ですかーーーーッ！ 元気があればなんでもできる'), do: IO.write([IO.ANSI.color(Enum.random(0..255)), c])"
```


<font color="purple">$\huge{闘魂}$</font>

[note](https://note.com/)に、猪木さんの記事を書きました。
[猪木さんの言葉は四書五経に通ずる ── 語り継がれる言葉の成立過程、是れ即ちブロックチェーン也](https://note.com/awesomey/n/n4d8c355bc8f7)

猪木さんの言葉から力をもらったものとして次代に語り継ぎ、体現するものでありたいとおもいます。
RTK Query を使った ポーリングの実装

## はじめに
React × Redux × (RTK Query) で開発しているチームに参加してから10ヶ月経ちました。
画面からジョブを実行し、その画面にジョブ実行後のステータスを表示したいよねという場面に出くわしました。
まれによく出会う場面ですが、 WebSocket を使うのも大げさだったので、一定時間おきのポーリングで対応することになりました。

ざっとググりましたがいい感じで参考になる記事がなく、結局 RTK Query にポーリングのオプションないか調べたらやっぱりありました。(初めから公式調べようね。)

詳細は [Redux Toolkit 公式の 「Polling」 のページ](https://redux-toolkit.js.org/rtk-query/usage/polling)を見てください。
こんな感じでいつもの RTK Query にオプション渡すだけで簡単にできますよという備忘＆紹介です。

## 結論
`useQuery` で `pollingInterval` オプションを指定しましょう。


## 実装内容
まずは API 側の実装。
普通の RTK Query の使い方通りなので、詳しくは公式を見てください。
そもそも RTK Query の使い方に馴染みないんだけどという場合は、[こちらの記事](https://qiita.com/7tsuno/items/2301a35283db7cd54df9)にざっと目を通すと雰囲気がつかめると思います。
```typescript:API 側
export const jobApi = createApi({
    reducerPath: 'jobApi',
    baseQuery: fetchBaseQuery({ baseUrl: 'https://example.com/api/' }),
    tagTypes: ['Job'],
    endpoints: (build) => {
        readLatestJob: build.query<{item: Job}, void>({
            query: () => {
              return 'job/latest';
            }
        })
    }
})
```

作った api を store に登録します。
こちらの書き方も定型なので詳細は割愛します。
```typescript:store 側
import {jobApi} from 'api'

export const store = configureStore({
    reducer: {
        [jpbApi.reducerPath]: jobApi.reducer
    },
    middleware: (getDefaulktMiddleware) => {
        return getDefaultMiddleware().concat(jobApi.middleware)
    }
})
```

利用側では `ifxJobApi.useReadLatestJobQuery` という感じで呼び出します。
RTK Query に馴染みがないと `useReadLatestJobQuery` どこから出てきたよ？となりますが、`use[endpoints で指定した名前]Query` という形になっています。
第一引数はクエリで利用するパラメータを指定するのですが、エンドポイントにパラメータを渡す必要がない場合は `undefined` を渡せばOKです。
第二引数のオプションのオブジェクトに、 `pollingInterval` を指定するとポーリングされるようになります。

```typescript:利用側
import {jobApi} from 'api'
  const { data } = jobApi.useReadLatestJobQuery(undefined, { pollingInterval: 5000});
```

## 最後に
RTK Query は機能豊富で、api利用側も非常にシンプルに書けます。
React 歴が浅い私でも、決められた書き方に沿って書けばやりたいことが実現できるので、日々楽しく開発できています。

RTK Query の記事はまだまだ少ないので今後増えてくれると嬉しいですね。
bash(WSL2)で作業中のgitブランチ名をプロンプトに表示させる

## ブランチ名をプロンプトに表示させる
以下のサイトを参考にした。
[Ubuntu(Linux)のプロンプトにGitのブランチ名を表示する方法](https://snowsystem.net/other/linux/ubuntu-git-branch/)

~/.bashrc の末尾に以下を追記
```.bashrc
PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w \[\033[01;31m\]$(__git_ps1 "(%s)") \n\[\033[01;34m\]\$\[\033[00m\] '
```

以下を叩く
```
$ source ~/.bashrc
```
before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882988/1975672d-3b74-d41d-9dee-d30bcab2da55.png)
after
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882988/17ccd902-aaf9-fc29-313b-f6526861fcf2.png)

何もわかってないけどとりあえずブランチ名が出るようになった。

## 後で読む
[git :: bash プロンプトにブランチ名と作業ツリーの状態を表示する](https://tm.root-n.com/unix:command:git:bash_prompt)
【Rails】ルーティングについて

## はじめに

ルーティングについて学習した内容をまとめました。

## ルーティングとは

ルーティングとは、HTTPリクエストとURLを元に、どのコントローラーのどのアクションを実行するか結びつけること。

## rootで作成

rootとはドメイン名の後ろに何もついていないトップページのこと。

```app/config/routes.rb
root to: 'articles#index’
```

## ****GET,POST,PATCH,DELETE****で作成

各アクションに対して個別でルーティングを指定。

ただし、記述内容が多くなりミスが起きやすくなる。

```app/config/routes.rb
Rails.application.routes.draw do
	post "articles"         => "articles#create"   
  get "articles/new"      => "articles#new"   
  get "articles/:id/edit" => "articles#edit"   
  get "articles/:id"      => "articles#show"   
  patch "articles/:id"    => "articles#update"   
  delete "articles/:id"   => "articles#destroy"
end
```

## ****resources****で作成

resourcesメソッドでルーティングを作成すると、WebアプリケーションのCRUD機能を実装するために必要なルーティングを全て作成することができる

```app/config/routes.rb
resources :articles
```

```ターミナル
$rake routes

     articles GET /articles(.:format)          articles#index 
              POST /articles(.:format)         articles#create 
 new_articles GET /articles/new(.:format)      articles#new 
edit_articles GET /articles/:id/edit(.:format) articles#edit 
     articles GET /articles/:id(.:format)      articles#show 
              PATCH /articles/:id(.:format)    articles#update 
              PUT /articles/:id(.:format)      articles#update 
              DELETE /articles/:id(.:format)   articles#destroy
```

## ****resource****で作成

resourcesメソッドと異なる点は

　・indexが定義されない

　・Pathにidがない

```app/config/routes.rb
resource :profile
```

```ターミナル
$rake routes

  new_profile   GET    /profile/new(.:format)   profile#new
 edit_profile   GET    /profile/edit(.:format)  profile#edit
      profile   GET    /profile(.:format)       profile#show
                PATCH  /profile(.:format)       profile#update
                PUT    /profile(.:format)       profile#update
                DELETE /profile(.:format)       profile#destroy
                POST   /profile(.:format)       profile#create
```
【MySQL】テーブルのカラムを別のテーブルのカラムの値で更新する方法

使う機会があったのでメモ。

```
// Safe Updates モードを無効化

SET sql_safe_updates = 0;

// table_aのcolumn_nameの値を、対応するtable_bのcolumn_nameの値で上書き

UPDATE table_a, table_b
SET table_a.column_name = table_b.column_name 
WHERE table_a.table_b_id = table_b.id;

// Safe Updates モードを再び有効化

SET sql_safe_updates = 1;
```

参考：

https://itneko.com/mysql-update-other-table/

http://download.nust.na/pub6/mysql/doc/refman/5.1-olh/ja/safe-updates.html

https://mysql.sql55.com/sql/mysql-disable-safe-updates-mode.php
Vue3 Bootstrap インストール

# はじめに
Vue3でBoostrapのインストール方法について紹介する

# インストール手順
1. インストールバージョン確認
   [Bootstrapのnpmパッケージ公開サイト](https://www.npmjs.com/package/bootstrap)よりインストール対象パージョンを確認する

    今回はBootstrap4.6をインストールするのでバージョンを指定してパッケージをインストールする
    バージョン指定なしだと最新バージョンがインストールされる

2. インストールコマンド実行
    インストールコマンド
    ```terminal
    npm install bootstrap@4.6.0
    ```

3. Vueに適応するための設定を追加
    インストール後、Bootstrapを適応するためにmain.jsファイルに以下の内容を追加する
    ```javascript
    import 'bootstrap/dist/css/bootstrap.min.css'
    import 'bootstrap/dist/js/bootstrap.min.js'
    ```

# 確認
1. App.vueに以下のHTMLを追加
    ```html
    <button type="button" class="btn btn-primary">Bootstrap</button>
    ```

2. npm run serveでVueを起動
3. 画面でボタンにBootstrapのスタイルが適応されていることを確認

![Bootstrap-Button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310302/bee3d9bb-4a2c-6e5a-116f-4409437e3b6d.png)
[Unity]com.google.external-dependency-managerのエラー

# 概要
久しぶりに開いてみたプロジェクトがexternal-dependency-managerのエラーを表示していました。
以前AdMobの設定をする関係でこのexternal-dependency-managerの設定をした記憶があるのですが、現在は使えなくなっていてエラーが出てました。
![スクリーンショット 2022-10-06 21.21.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9e39d226-d242-ea24-71d4-cc1c7a687bb8.png)

# 本文
Window > PackageManagerでPackageManagerを開くとcom.google.external-dependencyに警告マークが表示されていました。Removeを押したらエラーは表示されなくなりました。
![スクリーンショット 2022-10-06 21.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4431d510-5dfa-7309-fa47-316512bb4d77.png)

:::note warn
試してみるときは、ご自身の環境に合っているか確認し、バックアップを取った上でお試しください。
:::

検索用キーワード
Project has invalid dependencies:
com.google.external-dependency-manager: Package [com.google.external-dependency-manager@1.2.159] cannot be found
aws_lb_listener_rule の redirect host で InvalidLoadBalancerAction

# 背景

Terraform のリスナールールでリダイレクトを設定しようとしたところ、以下のようなエラーが出た。

```
Error: Error creating LB Listener Rule: InvalidLoadBalancerAction: he Host parameter must be a valid hostname and may contain up to one of each of these placeholders: '#{host}'.
```

# 原因

いくつか考えられるが、ここではリダイレクト先ホスト名にアンダースコアが使われていたのが原因だった。
アンスコの代わりにハイフンを用いたら解消した。

# 備考

https://suu-g.hateblo.jp/entry/2019/09/19/232913

> アンダースコアはホスト名的には NG

RFC 的にも禁止されている模様。

しかし、Route53 レコードを作成することは可能。リソースによってバリデーションが厳しかったり緩かったりしているのかもしれない。

```
  # aws_route53_record.this will be created
  + resource "aws_route53_record" "this" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "foo_bar.baz.com"
      + type            = "A"
      + zone_id         = "***"
            :
    }
  :
aws_route53_record.this: Creation complete after 35s [id=***_A]
```
特定の文字列をファイル名から削除してリネームしたい

## 背景
adobe xdよりpngでweb指定で画像を書き出した際に ```hogehoge@2x.png```となってしまうので```@2x```を削除して```hogehoge.png```としたい


## 今回作成したシェルスクリプト
``` bash
#!/bin/bash
for before_name in `find ./ -type f -name '*@2x*'` ; do
    after_name=`echo ${before_name} | sed -E 's/@2x//g'`
    mv -i "${before_name}" "${after_name}"
done
```

## シェルスクリプトの内容
### !/bin/bash
シェルスクリプトでbashを使う際のおまじない

### ループ式
```bash
for before_name in `find ./ -type f -name '*@2x*'`; 
do
  # ループで処理したい内容
done
```

```in```以降の処理
```bash
find ./ -type f -name '*@2x*'
```
で該当するファイル名がbefore_nameに格納される
ループは上記の処理で該当するファイル数だけ実行される

### ループの中身
```bash
    after_name=`echo ${before_name} | sed -E 's/@2x//g'`
    mv -i "${before_name}" "${after_name}"
```

```echo```で先ほどのループ式で該当したファイル名を出力し、```sed```コマンドによって特定の文字を空文字に置換している

その後、置換した文字列を新しいファイル名として```mv```コマンドによって書き換えを行う
【Bash】インクリメントの方法

## `expr`

```sh:expr
count=0
while [ $count -lt 10 ]; do
	echo $count
	count=`expr $count + 1`
done
```

```bash
$ bash sample.sh
0
1
2
3
4
5
6
7
8
9
```

## `let`
```sh:let
count=0
while [ $count -lt 10 ]; do
	echo $count
	let count=$count+1
done
```
```bash
$ bash sample.sh
0
1
2
3
4
5
6
7
8
9
```



## `((...))`

```sh:((...))
count=0
while [ $count -lt 10 ]; do
	echo $count
    ((count++))
done
```
```bash
$ bash sample.sh
0
1
2
3
4
5
6
7
8
9
```
Power Query の Text.Format 関数


https://blog.crossjoin.co.uk/2015/12/03/the-text-format-function-in-power-bipower-query-m/

# 構文

```text:構文
Text.Format(
    formatString as text, 
    arguments as any, 
    optional culture as nullable text
) as text
```

# 第２引数にリストを使う

```text:例１
Text.Format(
    "#{0}, #{1}, and #{2}.", 
    {17, 7, 22}
) // 17, 7, and 22.
```
　例１は、#{}に０から始まる数値の順番に、第２引数のリストの値が入ります。

```text:例２
Text.Format(
    "The #{0} sat on the #{2}.", 
    {"cat", "mat", "dog"}
)  // The cat sat on the dog.
```

# 第２引数にレコードを使う

```text:例３
Text.Format(
    "The time for the #[distance] km run held in #[city] on #[date] was #[duration].",
    [
        city = "Seattle",
        date = #date(2015, 3, 10),
        duration = #duration(0, 0, 54, 40),
        distance = 10
    ],
    "en-US"
)  // The time for the 10 km run held in Seattle on 3/10/2015 was 00:54:40.
```
　例３では、#[]を使い、第２引数のレコードの値を表示させています。
　以下のように、各行毎に項目名を使ってフォーマットすることもできます。Text.Formatの第２引数の「_」は、１レコードを表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/68e85c88-d971-902f-8055-e901ed23b33f.png)
![g865.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/a4b37f52-fbb1-3b0c-401f-d3c7f344ae56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/cede084f-7481-781e-27fd-b5cb3610d0f2.png)

```text:例４
let
    Source = Table.FromRecords(
        {
            [Animal = "cat",    Furniture = "mat"],
            [Animal = "dog",    Furniture = "chair"],
            [Animal = "dragon", Furniture = "throne"]
        },
        type table [Animal = Text.Type, Furniture = Text.Type]
    ),
    AddColumn = Table.AddColumn(
        Source,
        "Demo",
        each 
            Text.Format(
                "The #[Animal] sat on the #[Furniture].", 
                _
            ),
        Text.Type
    )
in
    AddColumn
```
　Text.Formatの打２引数の「 _ 」は、レコードの値を示しており、[Animal]、[Furniture]を含んでいます。
(参照 「[Power Queryの関数を作成する - eachとアンダースコアー](https://qiita.com/spumoni/items/6841aec922c02ee92a2f#7-each-%E3%81%A8-_%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B9%E3%82%B3%E3%82%A2%E3%83%BC)」

# culture
　Text.Formatの第３引数にcultureを設定することができます。（参照　「[サポートされる言語識別文字列](https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/language-strings?view=msvc-170#supported-language-strings)」）

```text:culture
let
    Source = Table.FromRecords(
        {
            [Currency= 123.4,   Day=#date(2022,1,1)],
            [Currency=1024.45,  Day=#date(2022,2,28)]
        },
        type table[ Currency = Currency.Type, Day = Date.Type]
    ),
    AddColumn = Table.AddColumn(
        Source,
        "Message",
        each 
            Text.Format(
                "You must return #[Currency] by #[Day]", 
                _, 
                "fr_FR"  // cultureをフランスに指定
            ),
        Text.Type
    )
in
    AddColumn
```
![g5349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/3ac7a1b5-f400-9ae0-0bdd-110511b8057b.png)

　上記のように、フランスの書式で小数点は「.」から「,」になり、日付は日・月・年の順に表示されます。ただし、通貨型の区切り記号は適用されず、数値型として扱われています。
Julia でオイラー法を実装してみる

MATLAB によるプログラムを Julia で書いてみた。
若干簡潔に書けるのかな？

https://qiita.com/arcadia13/items/a2baafb2ec2145337eef


```julia
using Plots

# オイラー法
function EulerMethod(func, x, y0)
  # func:微分方程式の関数
  # x：積分範囲
  # y0：初期値
  ncol = length(y0)
  nrow = length(x)
  y = zeros(nrow, ncol);
  y[1, :] .= y0 # 初期値の代入
  h = x[2] - x[1] # 刻み幅
  for k = 1:nrow-1
      y[k+1, :] = y[k, :] .+ h .* func(y[k, :]) # 前進差分
  end
  y;
end
```

```julia
# 微分方程式
func(y) = -2*y

y0 = 1 # 初期値
h = 0.01 # 刻み幅
x = 0:h:10 # 積分範囲
y1 = exp.(-2x); # 真の解
y2 = EulerMethod(func, x, y0) # 近似解
gr(fontfamily="IPAMincho", foreground_color_legend = nothing)
plot(x, y1, label="真の解")
plot!(x, y2, label="近似解")
savefig("a.png")
```




    
![スクリーンショット 2022-10-06 21.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/9a843bca-3282-ee51-e2fe-ba4983ace184.png)
    




```julia
# ファン・デル・ポール方程式
func(y) = [y[2], 2(1 - y[1]^2) * y[2] - y[1]]

y0 = [1, 0] # 初期値
h = 0.01 # 刻み幅
x = 0:h:10 # 積分範囲
y =  EulerMethod(func, x, y0) # 近似解
plot(x, y) # 近似解の描画
savefig("b.png")
```

![スクリーンショット 2022-10-06 21.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/45209f5c-b234-6d13-1aba-bf08a25545f2.png)
AnsibleTower3.8からAnsibleAutomationPlatform2.0へのアップグレード注意点

# 一番伝えたいこと
RHEL7.6上に構築されたAnsibleTower3.8をAnsibleAutomationPlatform2.0(AAP)にアップグレードする際、インプレース形式ではアップグレードはできません。バックアップリストア形式で実施しましょう。

# はじめに
- RHEL7.6のマシン上に構築しているAnsibleTower3.8をAnsible Automation Platform2.0へアップグレードしたい
- Ansible Automation Platform2.0はRHEL8系という要件があるので、OSのバージョンアップが必要
- Ansible Automation Platform2.0へのアップグレード形式は以下の2つ
    - インプレース
    - バックアップリストア

# インプレースとバックアップリストアの違い
## インプレース
現在稼働しているサーバ上でOSのバージョンアップ & AAPのアップグレードを行う。バックアップリストアよりシンプル。
具体的な手順
1. OSをバージョンアップする
1. AAPをアップグレードする

## バックアップリストア
新しくRHEL8系のサーバを立てて、データを引越しさせた上でAAPのアップグレードを行う
具体的な手順
1. RHEL8サーバを構築する
1. RHEL8サーバ上にAnsibleTower3.8をインストールする
1. RHEL7.6サーバ上でバックアップを取り、バックアップデータをRHEL8サーバに転送する
1. RHEL8サーバ上でバックアップデータをリストアする
1. RHEL8サーバ上でAAPをアップグレードする

手順も複雑ですし、さらに言うと、RHEL7.6サーバ上の設定情報とか諸々移行しないといけないので、非常に手間です。

# インプレース形式だとなぜダメか？
RHEL8系へのバージョンアップが完了し、AAP2.0へ上げるぞ～と意気込み`setup.sh`を実行したのですがエラーで先に進みません。
※エラー内容は忘れました

後日RedHatさんに問い合わせて判明したのですが、RHEL7系から8系にバージョンアップする際に[Leapp](https://access.redhat.com/documentation/ja-jp/red_hat_certificate_system/10/html/planning_installation_and_deployment_guide/using_leapp_to_perform_in_place_upgrade)というツールが、AAPでは対応していないとのことです。
また、RedHatさん曰く、今回のようなOSのバージョンアップが伴うアップグレードでは、バックアップリストア形式で実施してくださいとのことでした。

# 最後に
後から調べて分かりましたが、赤帽エンジニアブログさんでもインプレース形式では出来ない、と書かれていました(参考リンク参照)。OSのバージョンアップする前に見つけたかった。。orz


# 参考リンク
- [Ansible Automation Platform 2.1 のご紹介 Part3 - アップグレード編 （その２）](https://rheb.hatenablog.com/entry/aap21-part2_2)
Excel for Macで全シートA1セルに戻し、倍率を100%にする

# 環境

MacOS 12.6
Excel for Mac 16.65

# 参考

https://qiita.com/nekomoff/items/128e8580e726f2f4f4a5

# コード

```vb
Sub Cursor_A1()
' 画面更新をさせない（チカチカするため）
Application.ScreenUpdating = False

Dim ws As Worksheet
' 各シートを順番に見ていく
For Each ws In Worksheets
' カーソルをA1に移動
ws.Activate
ws.Range("A1").Select
' 表示位置を左上端に移動
ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1
' 表示倍率を100%に戻す
ActiveWindow.Zoom = 100
Next ws

' １枚目のシートに移動
Sheets(1).Select
'画面更新を再開させておく
Application.ScreenUpdating = True

End Sub
```

# 変更点

```diff_visual_basic
' カーソルをA1に移動
- ws.Select
- Range("A1").Select
+ ws.Activate
+ ws.Range("A1").Select
```

これをやらないと、画像のエラーがちょくちょく出るんですよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/59ca28ff-855b-7092-899a-00f6abab71bb.png)

VBにはそんなに興味がないので原因の深掘りはしてません。動けばそれでいいや。
【BigQuery】ウィンドウ関数にて日付でソートする方法


ウィンドウ関数のWindowFrame句で日付項目でソートする場合について、[BigQueryのマニュアル](https://cloud.google.com/bigquery/docs/reference/standard-sql/window-function-calls#def_window_frame)には以下のように記載されています。


> :::note info
> ヒント: 日付の範囲を使用する場合は、 `UNIX_DATE()` 関数で `ORDER BY` を使用します。タイムスタンプ付きの範囲を使用する場合は、 `UNIX_SECONDS()` 、`UNIX_MILLIS()` 、または `UNIX_MICROS()` 関数を使用します。
> :::

既に知っている人にとっては何と言うことはないのですが、初学者に上記のマニュアルのページ全体を読んでこれをわかってと言うのは少し酷な気もしたので、記事に起こしました。

## 日付で `ORDER BY` してみる
以下のように、 `ORDER BY` に日付型の項目を設定すると…
```sql
WITH values AS (
  SELECT 
    date
  FROM
    UNNEST(GENERATE_DATE_ARRAY(DATE'2022-01-01', '2022-01-05')) AS date
)

SELECT 
  *,
  MIN(date) OVER (w) AS min,
  MAX(date) OVER (w) AS max
FROM
  values
WINDOW w AS (ORDER BY date RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)

```
こんなエラーが表示されます。

::: note alert
ORDER BY key must be numeric in a RANGE-based window with OFFSET PRECEDING or OFFSET FOLLOWING boundaries, but has type DATE
:::

## `UNIX_DATE()` を利用
上記SQLに `UNIX_DATE()` を追加します。

```sql
WITH dates AS (
  SELECT 
    date
  FROM
    UNNEST(GENERATE_DATE_ARRAY(DATE'2022-01-01', '2022-01-05')) AS date
)

SELECT 
  *,
  UNIX_DATE(date) AS UnixDate,
  MIN(date) OVER (w) AS min,
  MAX(date) OVER (w) AS max
FROM
  dates
WINDOW w AS (ORDER BY UNIX_DATE(date) RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)
```

#### 実行結果
エラーが出ることなく実行できました。
`MIN()` , `MAX()` でそれぞれ1行前、1行後の日付も取れています。

|date|UnixDate|min|max|
|----|-------:|---|---|
|2022-01-01|18993|2022-01-01|2022-01-02|
|2022-01-02|18994|2022-01-01|2022-01-03|
|2022-01-03|18995|2022-01-02|2022-01-04|
|2022-01-04|18996|2022-01-03|2022-01-05|
|2022-01-05|18997|2022-01-04|2022-01-05|
gradle/Windows/java で文字化け解消

長らくWindows上でgradleのjavaビルド時にエラーや注意が文字化けしていたのがやっと解消できたのでメモ。

```
$ export GRADLE_OPTS="-Dfile.encoding=UTF-8"
$ export JAVA_TOOL_OPTIONS="-Duser.language=ja -Dconsole.encoding=UTF-8"

$ ./gradlew -p java/xxx clean war
Picked up JAVA_TOOL_OPTIONS: -Duser.language=ja -Dconsole.encoding=UTF-8
Starting a Gradle Daemon, 2 incompatible and 4 stopped Daemons could not be reused, use --status for details

> Task :xxxx:compileJava
注意:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。


BUILD SUCCESSFUL in 18s
10 actionable tasks: 10 executed

```

`export GRADLE_OPTS="-Dfile.encoding=UTF-8"` か `export _JAVA_OPTIONS=-Dfile.encoding=UTF-8` が必要みたい。

だけど、また文字化けするようになった...

### 2022-10-30 

今日の解決方法

```
export JAVA_TOOL_OPTIONS=-Dconsole.encoding=UTF-8
```
は関係なくて、JAVA_TOOL_OPTIONS、JAVA_OPTIONS、_JAVA__OPTIONS、GRADLE_OPTS 全部 unset した上で、ルートのプロジェクトの build.gradle に以下を追加 すると文字化けしなくなった

```
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }

```
#6 未経験エンジニア〜勉強中に起こったエラーはMySQL関連ばっかりでした〜

ご覧いただきありがとうございます。

現在、エンジニアとして就職するべくWebサービスを作成しています。

作成するWebサービスの実施したいことは
 1. ユーザーの現在地を取得
 1. 現在地によって画面を切り替え
 1. その際、APIを使って画面切り替え
 1. 2・3で表示する際に登録したデータをもとにさらにカスタム（出来たらいいな）
 1. AWSでサーバーアップ

と要件定義をしたうえで9月から勉強しています！

現在10月6日時点で4まで完了。

技術を学び、さらにWebサービスの具体的な実装イメージが固まってきた段階です。

１〜3と4をうまく繋げられるかが自信ないけど・・・一回やってみるか！というような感じです。

そして、技術を勉強していくなかでたくさんのエラーに出会いました。

さらに、そのエラー内容が見事にMySQLばっかりだったので紹介させていただきます。

## お読みいただく対象者
- プログラミングを勉強始めたばかりの方
- 初学者に対して教育を行っている方

## 起こったエラー一覧

長々と書いても読みづらいので、早速エラーの一覧を下記に👇

*tadsan様に3と4をコメントでご教示いただき内容を追記しました(2022.10.7 7時am)*
*本当にありがとうございます:relaxed:*
*追記したところを<font color="OrangeRed">赤く</font>します*

|項目|　　　　　エラー言語　　　　　| エラー原因|
|:-:|:-----------:|:------------:|
|1|MySQL| 空白が入っていた|
|2|〃| カンマがなかった|
|3|PHP|<font color="OrangeRed">syntax error</font>(字下げしていなかった)|
|4|MySQL| カンマがなかった|
|5|PHP|演算子<font color="OrangeRed"> ~~===~~</font>|
|6|Github|emailが間違っていた|
  
ではさらに内容を記載していきます。

### MySQL①:空白が入っていた

事象：`Undefined index`エラーメッセージ表示
原因：文字列の中の空白があった
詳細：'product'が ' product'だった


### MySQL②：カンマがなかった

事象：エラーメッセージ1064が表示
原因：カンマが入っていた
詳細：【正】 `employees`　【誤】`employees,`

### PHP：syntax error(字下げしていなかった)

事象：エラー(番号などを控えてなかった）
原因：syntax error(字下げしていなかった)
詳細：

<font color="OrangeRed">【正】</font>
```
<?php

function query($sql): void
{
    var_dump($sql);
}

query(<<<'EOT'
  SELECT id, name
  FROM users
  WHERE id IN (1, 2, 3)
  EOT);

```

<font color="OrangeRed">【誤】</font>
```
<?php

function query($sql): void
{
    var_dump($sql);
}

query(<<<'EOT'
  SELECT id, name
  FROM users
  WHERE id IN (1, 2, 3)EOT); ←で字下げしていなくsyntax error
```
動作確認: https://3v4l.org/dGtiD#v8.1.11


### MySQL④：カンマがなかった
事象：エラーメッセージ「Column count doesn't match value count at row 1」
原因：カンマがない為、項目が繋がってしまった
詳細：
【正】
```  
... (
)VALUES(
"{...}",
"{...}", ←の","がなかった
```

【誤】
``` 
... (
)VALUES(
"{...}",
"{...}"
```

MySQLのテーブルをみて
1つのセルに2つの値が入っていて気づけた〜

### PHP：演算子

事象：エラー(番号などを控えてなかった）
原因：　submitで送信した先のPHPで演算子で<font color="OrangeRed">大文字小文字区別</font>
詳細：
 -  php→ `<form ... method="post">`
- create.php→ `if ($_SERVER['REQUEST_METHOD'] === 'POST') {}`

<font color="OrangeRed">追記👇</font>
```
<?php

$input = 'POST';

var_dump(
  $input == 'post', // false
    $input == 'POST', // true
    $input === 'post', // false
    $input === 'POST', // true
);
```

動作確認: https://3v4l.org/MbDi4#v8.1.11

<font color="OrangeRed">またコメントによりPHPで`--`と`---`はどちらも小文字大文字を区別することが認識できました！</font>

### Github：メールアドレス
事象：エラー(というかpushしているのに反映されない）
原因：emailが違った
詳細：登録時のアドレスが違った←自分のミス

>【確認方法】
・github： settings > emails 
・githubコマンド：
git config --global -l
git config --local -l

## 振り返り：エラーをメモっていて良かった

- 自分のミスを振り返れる
- 傾向がわかり、対策ができる

現在、毎日Twitterで学んだことをアウトプットしています。

あわせてエラーが発生した際も事象と原因や対策などをアウトプットしています。

現在１ヶ月振り返ってみると、圧倒的にMySQL関連のエラーで立ち止まっていました。

そして、カンマや字下げ、空白など初期的なミスが圧倒的に多いことがわかりました。

もしかしたら初学者は同様のエラーが起こりやすいのかもしれません。

もしくはMySQLに慣れていないから起きているかもしれません。

今後はエラーメッセージ表示もきちんと記録しようと思います。
Linuxでよく使うキーバインドメモ(ショートカット)

- カーソル移動系
    - ctrl + a
        - 行頭へ移動
    - ctrl + e
        - 行末へ移動
    - ctrl + f
        - 一文字次へ移動
    - ctrl + b
        - 一文字前へ移動
- 履歴系
    - ctrl + r
        - 過去のコマンド履歴を検索
- 削除系
    - ctrl + d
        - カーソル部分を１文字削除する
    - ctrl + h
        - カーソルの左を１文字削除する
    - ctrl + u
        - 全部削除する
    - ctrl + k
        - カーソルの位置から行末まで削除
    - ctrl + w
        - カーソル位置の単語を削除（カーソルの前部分）



- 参考書籍
    - [Linux+コマンド入門](https://amzn.to/3REueGv)
    - [新しいLinuxの教科書](https://amzn.to/3SZLvuX)
    - [［改訂第3版］Linuxコマンドポケットリファレンス](https://amzn.to/3EmeTYo)
戻るボタンをStackを使ってシンプルに実装する

# はじめに
シーン遷移する前にフラグを立てて
遷移先で戻るボタンを押した時にそのフラグを見て遷移先を選択していませんか！？（私はしていた）

来た道を簡単に戻る方法を今更ながら知ったのでご紹介します。

使うものはC#のジェネリッククラスであるStackです。
なんでリストではなく、スタックなのかというとスタックや、キューは一時的なストレージ保管に向いている配列とされているからです。出して入れての作業が得意なコレクションです。

# 実装

まず、遷移のルートを保存していなければもとのシーンには帰れないので
遷移する処理と同時にStackに追加していきます
```cs
/// <summary>
/// 来た道を保存しておくためのスタック
/// </summary>
static Stack<string> scenes = new Stack<string>();
    
public static void SceneChange(string str)
{
    // 遷移したいシーン
    SceneManager.LoadScene(str)
    // 毎回保存 
    scenes.Push(str);
}

```

Stackとは**後入れ先出し**を行うため、例えばシーンを

A => B => C

と遷移した場合だと
scenesには{A,B,C}と保存されていきます。

じゃあ今のCシーンからBシーンに帰ります。


``` cs
public static void BackScene()
{
    scenes.Pop();
    SceneManager.LoadScene(scenes.Peek());
}
```

これだけです。ここで何が起きているかというと

スタックは**後入れ先出し**なのでPop()で現在一番最後に入ったシーン、つまり、
Cをscenesから取り除きます。


scenesの中身は{A,B}になりました。

そしたらPeek()で現在の最後尾の要素を返せばBに戻ればいいことが分かりますね。(Peek()には削除機能はありません)


# 最後に
今回ご紹介したコードをもとに2つのシーンを行き来した場合や、シーンに入る前に特別な準備が必要な場合への応用も含めれるかと


参考文献
[Microsoft Ignite Stack<T> クラス](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.stack-1?view=net-6.0)
[C#(.NET)コレクションの使い分けヒント](https://qiita.com/takutoy/items/cb1e94c36296108e5fd7)
【初心者】AWS Amplifyを試してみた

# 背景・目的
AWSサービスの確認など、簡単なWebページが欲しい場合があります。そのような場合に、Amplifyを使用して実現したのでメモしておきます。

# 実践
## 手順
### HTMLを作成
今回は、testと書いたページを用意しました。(BODYタグなど省略しています。)
```
<html>
<B>test</B>
</html>
```

分かりづらいですが、ブラウザで開くとこのように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d84c9864-c92d-28f1-8fdd-2995c1cda08c.png)

### Amplifyにアップロード
1. 使用を開始するをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cdd7bec3-4539-e4b1-68ff-691b2e3e19bc.png)

1. Amplify Hostingの「使用を開始する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/46d96dd8-77b2-bc29-73e7-942f06670cfe.png)

1. リポジトリの指定では、今回は「Gitプロバイダーなしでデプロイ」を選択して、続行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0c4664f9-d847-6c57-e64d-d1a33dfe1de0.png)

1. 以下を入力して「保存してデプロイ」をクリックします。
- アプリケーションの名前
- 環境名
- 方法
    - ファイルの指定。zipにする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fafc3676-d753-a4ad-73a1-fedf81437a3e.png)

1. すぐにデプロイされます。
    - 任意のDomainが割り当てられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/13c0528d-2777-bbdf-7a21-38584d7c65ca.png)

### Webページの確認
1. Domainをクリックし、ファイル名をtest.htmlに書き換えアクセスします。
できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/33a92f39-3794-fb86-27d7-766ebc3aab7d.png)

# 考察
5分程度で、サクッと静的なWebページをデプロイできました。GitHubなどのリポジトリと連携すると楽に開発ができそうです。

# 参考
https://aws.amazon.com/jp/amplify/
【Docker】Cent OS7でlessコマンドが使えなかった件

## 基本コマンドlessが使えない！！！
ある日、dockerでcentOSを操作していたところ、基本コマンドである`lessコマンド`を使用しようとしたら`bash: less: commnd not found`となって使えなかった。。。。

基本的なコマンドなので初めから使えると思ってたのでびっくりしてしまった。

ないのならインストールしてしまえと、`yum`でlessをインストールしたら無事解決！
```
# less
bash: less: command not found

# yum install less
installed:

complete!
```
これは基本的なことだと思いますが、、、、
Laravel Sailをインストールして起動しようとしたらno configuration file provided: not foundで怒られた

# エラー時の状況

Dockerを起動させた後、Laravel Sailをインストールして起動するとエラーが発生しました。

```
$ curl -s https://laravel.build/sample | bash
$ cd sample
$ ./vendor/bin/sail up -d

no configuration file provided: not found
```

# エラーの原因の仮説

とりあえずググって見る。
すると、それっぽいものが見つかりました。

https://laracasts.com/index.php/index.php/discuss/channels/laravel/sail-problem-no-configuration-file-provided-not-found

https://stackoverflow.com/questions/73005587/laravel-sail-problem-no-configuration-file-provided-not-found

それと、Laravel Sailをインストールする前にPHPをインストールしていなかったような…?

エラーの原因はこれらを解決できれば行けそう。

- `php artisan sail:install`してないから?
- PHPインストールしていないのが原因?

## 仮説を検証してみる

とりあえずastisanをインストールしてみる。

```
$ php artisan sail:install
```

しかし、エラーがでてしまう…
(ちなみに、このときのエラーログ残しておくの忘れました…)


### PHPをインストールしてみる

一旦、astisanのことは忘れてPHPをインストールしてみる。

```
$ brew install php
```

完了したら、最初にインストールしたLaravel Sailを削除して再度 
インストールしなおしてみる。

```
$ curl -s https://laravel.build/sample | bash
```

最初のインストールと挙動が違うような…!?
このまま、Laravel Sailを起動してみます。

```
$ cd sample
$ ./vendor/bin/sail up -d
```

すると、Dockerのコンテナが作成されました!

http://localhost/ にアクセスすると…  
ブラウザにLaravelの初期画面が表示されているのを確認できました。

# 原因

PHPがインストールされていない事が原因みたいでした。  
初歩的なミスですね。

万事解決🎉🎉🎉

# Source and Thanks

https://laracasts.com/index.php/index.php/discuss/channels/laravel/sail-problem-no-configuration-file-provided-not-found

https://stackoverflow.com/questions/73005587/laravel-sail-problem-no-configuration-file-provided-not-found
メモ、Tips（2022.10.06）（【Windows】Visual Studio Code で Cloud LaTeX の実行環境を構築する（2022.02.16）@mtk_birdman）

# 当記事の前提となるサイト

[【Windows】Visual Studio Code で Cloud LaTeX の実行環境を構築する（2022.02.16）](https://mtkbirdman.com/windows-visual-studio-code-cloud-latex-install#toc3)
[@mtk_birdman](https://mtkbirdman.com/)

こちらで行う際の注意点やメモの記録の記事となる。本記事以外の現象などがみられる場合はコメントしてください。

# ディレクトリの管理

プロジェクト作成時にはディレクトリの指定があるが、自身でプロジェクトフォルダを作成していないと指定したディレクトリにファイル(.tex,.pdf,.log,figure,.vscode,etc.)が展開されてしまうため、フォルダをプロジェクトごとに作成する必要がある。

ディレクトリの指定をcloudlatexにした場合
~~~tex:directory : cloudlatex
cloudlatex
    |
    |-.tex
    |-.pdf
    |-.log
    |-figure
    |-.vscode
        etc.
~~~

ディレクトリの指定をcloudlatex--project1にした場合、
~~~tex:directory : cloudlatex--project1
cloudlatex
    |
    |-project1
        |
        |-.tex
        |-.pdf
        |-.log
        |-figure
        |-.vscode
            etc.
    |-project2
        |
        |-.tex
        |-.pdf
        |-.log
        |-figure
        |-.vscode
            etc.
~~~

このように（わかりにくいが）プロジェクトごとにファイルを生成することで、ファイルの管理が扱いやすくなる。なお、figureなどの必要なファイルを複数のプロジェクトで使用するなどの関連性のあるプロジェクト等は、ディレクトリを固定し、名前を変えるだけで管理ができやすくなる（例初期に出力されるファイル名はmainとなっているため、mainの名前を変えればよい）

# 不定期にVSCode内のCLの連携が切れる。

数日おいて再度VSCodeを起動するとたまに出てくる。

VSCodeでCLを起動するとログインしろといわれることがあるので、おとなしく上記サイトの連携（mail,client,acces-token）をもう一度行えばよい。

# BulildまたはViewができなくなる。

この現象はプロジェクト作成時に起こりやすい。プロジェクト作成時にCLのProject IDをWebで取得しないといけないが取得後Webを閉じないとBuildまたはViewできなくなる。

これは上記のサイトの設定ができていれば。Web上で開いているCLのタブを閉じれば大体解消される。原因としては、二重ログインや同期、認証関係が影響しているかもしれない。

# jsonの設定

.setting.jsonを書き換える作業があるが、上のディレクトリ構造ならば、cloudlatex下のディレクトリに書き加えるコードを保存しておけば、VSCode上でのいちいちネットで調べたり、別のプロジェクトから持ってくるといった混乱を防げるだろう。ディレクトリ構造としては例としてこうなる。


~~~directory:directory : cloudlatex-setting.jaon.log
cloudlatex
    |
    |-project1
        |
        |-.tex
        |-.pdf
        |-.log
        |-figure
        |-.vscode
            etc.
    |-project2
        |
        |-.tex
        |-.pdf
        |-.log
        |-figure
        |-.vscode
            etc.
    |-setting.json.log
~~~

setting.json.log

~~~log:setting.json.log
{
  "cloudlatex.enabled": true,
  "cloudlatex.projectId": XXXXXX,
  
  "latex-workshop.latex.autoCompile.run": "never",
  "latex-workshop.latex.outDir": "./",
  "[latex]": {
    "editor.formatOnSave": false,
  },
  "latex-workshop.latex.autoBuild.run": "never"
}
~~~

プロジェクトを作成するときにこちらからコピペすればよい。VSCodeの性質上でのファイル名での混乱が防げる。（.logと指定すればどちらのファイルか区別しやすくなる）
Power Queryのインテリセンスで関数名が重なってしまう場合のTips

　Power BIのPower Queryエディタで、エスケープキーを押したら関数名がおかしくなることないですか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b9e1e754-ed82-de23-e0ec-a80d5cf4a97d.png)
　この状態でエスケープを押すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/2dd843f5-136a-f8c1-2f1d-3045807f95e9.png)
　こんな感じに、TextTextと重なってしまいます。

　これ、毎回なおすとなると、かなり面倒です。

　この解決方法があります。**ピリオドを打たないで関数名を選択してからエスケープキーを使う**のです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/17c6ec5b-4918-3693-f99c-fd38a004dabc.png)

　この状態でエスケープキーを押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e9759538-c582-f6d6-e157-f793acd84612.png)

　ほら、この通り。

　**インテリセンスを利かすときには、ピリオドを使わない！**

　覚えておきましょう。
macOS Monterey + Node.js12 + electron-builderでelectronをパッケージングする方法

## 背景
あるプロジェクトで、electron-builderを使ってelectronアプリをパッケージングしています。
このプロジェクトは、訳あってNode.jsのバージョン12からすぐにはアップデートできないプロジェクトです。
macOS向けパッケージを提供するため、macOS上でパッケージングをする必要があります。
macOS Montereyにアップデートしたことで、パッケージングでエラーが発生するようになりました。
備忘録として対処方法を残します。
（本来はNode.jsのバージョンを素直に上げるべきですが、今回は現状維持のままで早急に対策をする必要がありました）

## エラー内容
パッケージング中に以下のエラーが出て、dmgイメージの作成に失敗します。
`(node:4561) UnhandledPromiseRejectionWarning: Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT`

## 原因
macOS Montereyでは、python2の同梱が廃止されたため、/usr/bin/pythonにはpythonがいません。
electron-builderが使用している何かのモジュールが、/usr/bin/python固定でコールしているみたい。
macOSは/usr/bin配下に書き込みができないため詰み。(SIP無効とかリスキーな方法はある)

## 調査して判明したこと
- Node.jsバージョン12をサポートしているelectron-builderのバージョンは22.10までである。
- electron-builderのバージョン22.11以降では、関連モジュールがNode.js標準モジュールのfs/promisesを使用している。fs/promisesはNode.jsバージョン10やバージョン14以降でサポートしているが、バージョン12では非サポートである。このため、Node.jsバージョン12 + electron-builderバージョン22.11以降の組み合わせでは動作しない。
- electron-builderのバージョン22.11から、PYTHON_PATH環境変数をサポートしている。この変数によって、これまで/usr/bin/python固定だったパスを任意に指定できる。

## どうなればいいのか
- electron-builderバージョン22.11以降をNode.jsバージョン12で動作するようにする
- python2をインストールして、PYTHON_PATH環境変数にパスを通す。

## electron-builderバージョン22.11以降をNode.jsバージョン12で動作させるには
これだけわかれば、暫定的な対処ができます。

fs/promisesモジュールはエイリアスであり、
`require("fs/promises");`
と
`require("fs").promises;`
は同義です。
そして、fsモジュールはNode.jsバージョン12でも問題なく使用できます。
よって、すべて置換してあげることで解決します。

electron-builderのバージョンを22.11.11にアップデートします。
node_modules/ディレクトリ内の
`require("fs/promises");`
を検索して、すべて
`require("fs").promises;`
に置換します。
あとは、Python2をインストールして、PYTHON_PATH環境変数を設定すれば解決です。

## 後記
疲れました。
今回はあくまで暫定的な対処であって、ちゃんとNode.jsのバージョンを上げることを検討します。
EC2のドメイン結合ディレクトリ とは

## 勉強前イメージ

EC2の項目で見た。
けど、全然わからん！

## 調査

### ドメイン結合ディレクトリ とは

EC2インスタンスの作成時に「高度な詳細」の箇所に出てくる以下のようなものです。

![2インスタンスを起動 _ EC2 Management Console - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/d8d8719a-cc2f-c629-17e4-d9351db7b9c4.png)

これは英語で Domain join directory と書き、ドメイン参加になります。
これでも良くわからないですが....
内容としてはドメイン結合ディレクトリを使って使用しているActive Directoryのドメインを指定しておくことで
ドメインを参加させることが出来ます。
これはAWS Directory Serviceを利用してる際に選択します。
また、一元管理も可能です。

## 勉強後イメージ

windowsサーバ使うときって感じかな？

## 参考

- [【AWS】EC2インスタンスのあまり触らない設定項目を深掘りしてみる](https://graff-it-i.com/2021/09/20/ec2-configuration/#)
- [AWSでサーバーを構築してみる~インスタンス詳細設定②~](https://zenn.dev/suiudou/articles/51b82a361adb96)
初めてのモニター選び 　〜Dell U2720QM〜


# はじめに
「モニター欲しいな〜」

半年間ずっとこの思いを抱きながら開発してましたが、ようやく購入したので、商品レビューも兼ねて、ちょっとしたモニター知識をここで説明していきます。


# 買った商品
↓↓ 商品は、amazonから購入しました。↓↓
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/b5e6cb11-8075-3823-ed40-64aa18dcdc9d.png)](https://onl.bz/CgxLcyH)

# モデル U2720QMを購入した理由
- **4K**
- **縦横・高さ調整可能**
- **内蔵USBハブ付き**
- **Dell製**
- **姿勢良く開発できる**
- **タイムセール**

自分は今回始めてモニターを購入したので、FullHD画質がどれほどなのかはわかりませんが、**4K**はめちゃくちゃキレイです！

また、ちゃんと**縦横・高さ調整**の3セット機能付きです！モニターを購入するときに、意外とこの機能がついていないものもあったりします。調整できると、この先もう一台モニターを購入した時に便利です！

そしてなんと言っても、このモデルの強みは**内蔵USBハブ**がついているところです！
自分はMacbook Air(Intelチップ)をつないでモニターを使用しているのですが、ポートが2つしかなく、モニターにつないでいる時点で1つ消費しています。こういったとき、残りのポートは1つしかなく、ポート不足に困った時はありませんか？

そんな時に活躍するのが、ハブ機能。今回購入したDell U2720QMでは、ディスプレイにHub機能(USB3.2とTypeCの2つ)がついており、ここにUSBを挿せば、Macbookのポートを消費せずに、USBにアクセスすることができます！以下の写真は、Macbookの残り1つのポートと、モニターのUSB3.2にそれぞれSSDとUSBを挿した様子。しっかりとモニターのHubに挿されたUSBも認識しています！
![IMG_7572 Large.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/1a5b5370-b0d8-11cc-c814-ea3ab5c272e4.jpeg)

また今回は、3年間無輝点交換保証（ドット抜けが見つかったら、無償で交換してくれる）が付いてくる ＋ ディスプレイ周辺の製品として有名であることも含め、Dell製のものにしました！私が見たところ、おそらくどのDell製のモニターもこの保証が付いています！

今回、このモデルを選んだ一番の理由として、タイムセールによる大幅な値下げがされていたことが購入のきっかけとなりました！買った当時の値段は49,980円で、普段より２万円ほどお得に買うことができました。
![スクリーンショット 2022-10-05 14.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/06d5580a-e40d-7702-2f88-5bce71c173c9.png)

上の値段遷移は、キーパというChromeの拡張機能により確認しています。過去のタイムセール時の値段などを見れるなど、賢く買うためのツールです。無料で使用できるので、おすすめです！こちらのリンクから追加できます。
https://chrome.google.com/webstore/detail/keepa-amazon-price-tracke/neebplgakaahbhdphmkckjjcegoiijjo?hl=ja

# 使ってみてわかったこと
口コミでは、初期状態でつなげると、「カクつく」・「重い」といった事例があげられていました。

実際に、MacとTypeCでつなげてみると、24Hzしか出ず、だいぶカクついていました。

この問題は、**Smart HDRがデスクトップになっていないことが原因**です。Smart HDRのモード設定は、モニター右下のボタンから設定することが可能なので、気になるようでしたらここで変更して下さい！
![IMG_7571 Medium.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/93bdeb1d-9463-a144-3880-a4c8a15dae6b.png)


# 他に気になったディスプレイ
 ### 1.**INNOCN 27C1U 4K 27インチ ディスプレイ**
このモニターの強みは、圧倒的なコスパの高さです！Dell U2720QMモデルと性能は大きくは変わりませんが、値段はタイムセールでなくても約5万円という安さです！またタイムセールでは、4万円を切るなど、コスパ重視の人にとっては素晴らしい商品だと思います！
[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/6a45e57d-3335-bc3c-53c4-eb8eb5f6404b.png)](https://amzn.asia/d/5t16Ftc)


 ### 2. Dell S2722QC
この商品の良さは、４K対応していることに加え、スピーカーを搭載しているところです！Dell U2720QMモデルはスピーカー付きではないので、スピーカーも欲しい方は是非！
[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609178/0a0a4102-9f96-d691-48d0-14632c6f967e.png)](https://amzn.asia/d/5t16Ftc)



# 最後に

いかがでしたか？
この記事を参考に、皆さんもモニターを購入して、開発ライフを充実させてみてはいかがでしょうか？
読んでいただき、ありがとうございました！
chroma.jsについて

## はじめに

色を扱うことの出来る、Javascriptライブラリーのchroma.jsについて調べることがありましたので、書きました
内容は公式ドキュメントと大差ありません

## 概要

- Javascriptでの色の扱いが便利になるライブラリー、カラーマップなども手軽に作成出来る

ドキュメント兼ホームページ

https://gka.github.io/chroma.js/

Github

https://github.com/gka/chroma.js/

 ライセンスが若干特殊っぽい

Apache2.0のライセンスを持った色が同梱されてる？
この辺は少し注意した方が良さそうかも

## インストール

- npmの場合

```
npm install chroma-js
```

```
import chroma from "chroma-js";
```

- CDNのURL

```
https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.4.2/chroma.min.js
```

## 基本機能を触ってみる

ドキュメントによると

- さまざまなフォーマットから色を読み取ることが出来る
- 色の解析と操作
- 色をさまざまな形式に変換する
- 異なる色空間での線形およびベジェ補間ができる

とのこと

単純な読み取り/操作/出力のチェーンの例

```
const col = chroma('pink').darken().saturate(2).hex();
console.log(col);
```

```
"#ff6d93"
```

これは、**ピンク色で、暗め、彩度を2くらいの色を16進数で**という命令

また、地図やデータビジュアライゼーションのカラーパレットに使用するために、様々な方法（例えば、[HSVの色が等距離にならないようにする方法](https://www.vis4.net/blog/2011/12/avoid-equidistant-hsv-colors/)）で美しい色を生成することができる

とのこと

```
const cols = chroma.scale(['#fafa6e','#2A4858']).mode('lch').colors(6);
console.log(cols);
```

```
["#fafa6e","#9cdf7c","#4abd8c","#00968e","#106e7c","#2a4858"]
```

これは、**#fafa6eから#2A4858までのカラースケールをLCH色空間で6段階作成する**という命令

LCHについて

https://qiita.com/luncheon/items/937f8a7503421993b258

様々な色空間

https://mocobt.hatenablog.com/entry/2019/07/28/205710

ちなみにざっくりこんな指定もできてしまう

```
const output = document.getElementById('output');

const cols = chroma.scale(['blue', 'green', 'yellow', 'red']).mode('lab');
for( var i = 0; i <=1; i = i + 0.1) {
　　output.innerHTML += 
　　　　　　"<div class='color' style='background-color: " + cols(i) + ";'></div>"
}
```
![スクリーンショット 2022-10-06 8.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/ce645842-27d4-9e30-f41d-0535a80444a5.png)

上記のplayground

https://codepen.io/gschoppe/pen/zVmgEJ?editors=1111

少し触っただけでも、色に関するあらゆる操作ができそうですが

色空間についての知識があるとより使いこなせそうなので、もう少し勉強が必要だなあ。。。

と思いました
Pythonを用いたローカルウェブサーバー実行

# はじめに
ローカルにあるHtmlファイルを勉強や簡単なテストをしたいため、直接にウェブブラウザーで開いてみたことがあるかも思います。

ローカルファイルを直接に開いても、ほとんどの場合は問題なく確認できると思いますが、色んな理由でローカルファイルの実行ができない場合があります。

そのような問題を回避してローカルファイルを実行したい場合、ローカルでウェブサーバーを実行すれば、ローカルファイルのテストができます。

ローカルウェブサーバーを簡単に実行することは、Pythonの```http.server```モジュールを使うことが簡単だと思います。

今回は、Pythonを用いたローカルウェブサーバーの実行を紹介してみたいと思います。

# ローカルウェブサーバーの実行

### 1. Pythonインストール
Pythonホームページ([https://www.python.org/](https://www.python.org/))でPythonをダウンロードし、インストールします。
Pythonがインストールされているかを確認するためには、コマンドプロンプト(Command Prompt)またはターミナル(Terminal)に次のコマンドを入力します。

```
python -V
# または
python --version
```

### 2. ディレクトリに移動
コマンドプロンプト(Command Prompt)/ターミナル(Terminal)で```cd```コマンドを使用して、実行したいファイルがあるディレクトリに移動します。

### 3. ローカルウェブサーバー実行
移動したディレクトリでローカルウェブサーバーを実行します。
Pythonバージョンが3.xの場合は次のコマンドを入力します。
```ruby:Python3
# python -m http.server (ポート番号)
# ポート番号は省略可能
python -m http.server
# または
python -m http.server 8000

```
もし、Pythonバージョンが2.xの場合は次のコマンドを入力します。
```ruby:Python2
# python -m SimpleHTTPServer (ポート番号)
# ポート番号は省略可能
python -m SimpleHTTPServer
# または
python -m SimpleHTTPServer 8000
```
デフォルト設定のポート番号は```8000```でありますが、すでに8000番ポートで何かが動いている場合には、別のポート番号を選択して起動することができます。

### 4. ウェブブラウザーで実行
ウェブブラウザーから```http://localhost:8000```でアクセスできます。

ポート番号を変更した場合、例えば、ポート番号を```8888```に変更してサーバーを実行した場合には、```http://localhost:8888```でアクセスすることができます。

# 参考
[MDN Web Docs : How do you set up a local testing server?](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server)
jestでオブジェクトの配列の値が期待したものかをテストするパターン

NestJSでAPIの開発をしています。
ふと、テストを書くことになりました。

基本的なコードですが、オブジェクトの配列に対してのテストコードの例があまり出てこなかったので、ここに残しておきます。

ポイントは、`objectContaining`と `arrayContaining`です。

ともかく結論のコードから。

## テストコード
```typescript
describe('UserService', () => {
  const validObject = {
    data: [
      { id: 1, name: 'testUser1', description: 'description1' },
      { id: 2, name: 'testUser2', description: 'description2' },
      { id: 3, name: 'testUser3', description: 'description3' },
    ],
    total: 3,
  }

  const invalidObject = {
    data: [
      { id: '1', name: 'testUser1', description: 'description1' },
      { id: '2', name: 'testUser2', description: 'description2' },
      { id: '3', name: 'testUser3', description: 'description3' },
    ],
    total: 3,
  }

  // 説明用にモック関数を用意
  const mockValidFn = jest.fn(() => validObject)
  const mockInvalidFn = jest.fn(() => invalidObject)

  // OK
  it('should get users', async () => {
    // 期待されたレスポンス
    const result = mockValidFn()
    expect(result).toEqual(
      expect.objectContaining({
        total: expect.any(Number),
        data: expect.arrayContaining([
          expect.objectContaining({
            id: expect.any(Number),
            name: expect.any(String),
            description: expect.any(String),
          }),
        ]),
      })
    )
  })

  // NG
  it('should get users', async () => {
    // 誤ったレスポンス
    const result = mockInvalidFn()
    expect(result).toEqual(
      expect.objectContaining({
        total: expect.any(Number),
        data: expect.arrayContaining([
          expect.objectContaining({
            id: expect.any(Number),
            name: expect.any(String),
            description: expect.any(String),
          }),
        ]),
      })
    )
  })
})

```

※ 公式ドキュメントにも記載がありますが、あくまで`objectContaining`オブジェクトに特定のキーがあるかどうかをチェックする関数なので、余分なキーがあった場合でも一致(OK)となります。

オブジェクトの配列を検証するもっといい方法があったら教えてください。

## 参考
https://jestjs.io/ja/docs/expect#expectobjectcontainingobject

https://jestjs.io/ja/docs/expect#expectarraycontainingarray

https://medium.com/@andrei.pfeiffer/jest-matching-objects-in-array-50fe2f4d6b98
Google UXデザイン：インタビューの実施

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3729adea-8dba-b2a3-6127-9b0bf6886e54.png" width="800">

# インタビュー前の準備

インタビューは、対面でもオンラインでも、実際のユーザーと話す前に準備をしておくことが大切です。

### 質問リストを作成する

インタビューの質問は、ユーザー間でほぼ一貫しているのがベストプラクティスとされていますが、この質問リストはあくまで目安です。必要であれば、用意した質問から逸脱して、ユーザーやその悩みについてより深く知ることができます。

### ユーザーについて調べる

インタビューする人について、できる限り時間をかけて勉強してください。

インタビューの前に、インタビューするユーザーが個人情報を提供している場合は、必ずそれをメモしておいてください。この情報には、名前、人口統計情報、設計中の製品に関連する経験、インタビューをどのように知ったかについての詳細が含まれる場合があります。この情報をもとに、インタビュー中の会話を広げ、信頼関係を築くことができます。

また、組織で働く場合は、LinkedInなどのサイトで参加者をスクリーニングして、本人が本人であることを確認することができます。競合他社で働いている人にうっかりインタビューしてしまうのは避けたいものです。

### 練習をする

実際の面接を行う前に、ユーザーに質問する内容を伝える練習をしておくとよいでしょう。鏡の前で、あるいは信頼できる同僚と一緒に、面接の質問をする練習をするとよいでしょう。

# ユーザに会う

第一印象は重要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/e8d5d7af-353a-1214-bf2b-ff4d8923d3e6.png" width="５00">

### 信頼関係を築く

良い信頼関係を築くとは、プロフェッショナルでありながら友好的な交流を築くことです。ユーザーの一日の様子を尋ねるなど、軽い会話をすることで、面接が始まる前に人間関係を築くことができます。簡単な質問と歓迎のジェスチャーでユーザーを安心させ、インタビューが始まったら本音を話してもらうようにします。

### 来てくれたユーザーに感謝する

インタビューが始まる前に、時間を割いて会ってくれて、自分の見解を話してくれたインタビュー対象者に感謝の意を表しましょう。お礼を言うことで、ユーザーと良好な関係を築くことができ、自分の意見が大切にされていると感じてもらうことができます。

# インタビューを行う

ユーザーに心地よく感じてもらうこと、そしてたくさん質問することが大切です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d6216acd-3f28-a6d4-6e70-7f2f95d1180f.png" width="５00">

### インタビューのエチケットを守ること

質問するときは、わかりやすく簡潔に話し、ユーザーがどのように回答しても、プロフェッショナルであることを意識しましょう。うなずいたり、適切なアイコンタクトを取ったり、メモを取ったりして、ユーザーの意見に積極的に耳を傾けていることを示しましょう。

### 自由な質問をする

「イエス」「ノー」という単純な答えにつながるような質問は避けましょう。代わりに、<font color="MediumVioletRed">***"Why"***</font> で始まる質問をする。そうすることで、より詳細な会話が可能になり、設計中の製品に盛り込むべき有益な情報を明らかにすることができるのです。参加者が短い「はい」「いいえ」の答えを出した場合、もっと話してもらうためにフォローアップの質問をする必要があります。

# ノートをとる

インタビュー中は、参加者の話を聞きながら、できるだけ多くのことを書き留めておきましょう。それによって、ユーザーのペインポイントを解決するためのアイデアを思いつくときに役立ちます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ed2a0000-0cb2-3d18-f95d-a44c08997ea0.png" width="５00">

### 興味深い引用をメモする

ユーザーの発言のなかで<font color="MediumVioletRed">***興味深い（説得力のある）引用***</font>は、ユーザーが実際にどう考え、どう感じているかを示す強力な指標となります。エンパシーマップに引用を含めることは、実際のユーザーからの直接の視点を取り上げる素晴らしい方法であり、デザインを始めるときに貴重な洞察を与えてくれます。

### 参加者についての観察を記録する

ユーザーの発言だけでなく、<font color="MediumVioletRed">***気分、表情、ボディランゲージ、行動***</font>も記録することが重要です。これらの観察はすべて、エンパシーマップを作成する際に考慮すべき重要な要素になります。

### インタビューを録音する

インタビューを録音してもよいかどうか、参加者に尋ねてください。参加者が同意した場合、録音されたインタビューは、後で、覚えていないかもしれないインタビューの部分を再検討したり、インタビュー終了後に追加のメモを取ったりするのに非常に役立ちます。

# さいごに

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ace1680f-9ed7-21e3-aca2-2fbad4019067.png" width="５00">

インタビューの質問をすべて終えたら、インタビュー中に議論された項目について、最終的な考えを共有する機会をユーザーに与えてください。参加者の中には、自分の意見を打ち明けてくれたり、先ほどは話さなかったことを明らかにしてくれる人もいるかもしれません。

また、参加者にもう一度お礼を言うことを忘れないでください。参加者には、あなたやあなたの製品、そしてあなたが代表するブランドについて、良い印象を持ってインタビューを終えてもらいたいのです。
CloudFront+S3で画面にアクセスするとエラーになる

# 問題
S3とCloudFrontの構成でWebサイトを構築している中、画面にアクセスできるか確認したところ以下のようなエラーに遭遇しました。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
![l_153713263_416_06aaf8c56405282b890544c6339bcd59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/53fb6e79-ef03-2c67-a646-e25d48526ccd.png)

# 解決方法
キャッシュを削除するか、別のブラウザでアクセスすると確認ができました。

以下の調査を行いましたが、以前に作成したS3へのリダイレクトがキャッシュで残っていることが原因のようでした。
- S3にindex.htmlが存在しているか
- S3のアクセス許可にあるCloudFrontOriginAccessIdentityのディストリビューションは正しいか

# 参考
https://sashihara.jp/cloudfront-s3-accessdenied