OmniAICreator/Qiita-1.07M huggingface dataset:
SyntaxError: This experimental syntax requires enabling one of the following parser plugin(s): decorators-legacy, decorators.

# はじめに

prettierの設定をして実行したところ、タイトル通りの以下のエラーがでました。

```
 SyntaxError: This experimental syntax requires enabling one of the following parser plugin(s): "decorators-legacy", "decorators".
```

## .prettierrc

importの並び替えを行いたかったため、[prettier-plugin-sort-imports](https://github.com/trivago/prettier-plugin-sort-imports)を入れています。

```json
{
  "printWidth": 100,
  "singleQuote": true,
  "useTabs": false,
  "tabWidth": 2,
  "semi": true,
  "bracketSpacing": true,
  "bracketSameLine": false,
  "importOrder": [
    "^@angular/(.*)$",
    "^primeng/(.*)$",
    "<THIRD_PARTY_MODULES>",
    "^@global/(.*)$",
    "^[./]"
  ],
  "importOrderSeparation": true,
  "importOrderParserPlugins": ["typescript", "decorators-legacy"],
  "importOrderSortSpecifiers": true
}
```

## Note

関係あるかわかりませんが、tsconfigに以下のようにパスのエイリアスを入れています。

```
"paths": {
  "@global/*": ["./app/global/*"]
}
```

# 解決方法

`.prettierrc` に以下の一文を追加します。

```json
{
  "importOrderParserPlugins": ["typescript", "decorators-legacy"],
}
```

## 解説

エラーにある通り、`decorators-legacy` を `importOrderParserPlugins` に追加します。
ただ、これだけだと以下のような構文由来のエラーが出ます。

- `SyntaxError: Missing semicolon.`
- `SyntaxError: Unexpected token, expected "{"`
- `SyntaxError: Missing initializer in const declaration.`

意味が分かりませんね。
そこでもう一度ドキュメントを見てみると、

```
default value: ["typescript", "jsx"]
```

なるほど。TypeScriptが足りなかったのですね。
ReactやNext.jsで開発している方はjsxも追加したほうがよさそうです！

# おわりに

prettierはhuskyと組み合わせるとむっちゃいい感じになります。
私もhuskyと合わせて使っていたので、この問題に直面したとき最初huskyを疑いました。関係なかったですが。
同じようにhuskyを疑った方のためにここで言及しておきます。
以上です。終わりだよ～(o・∇・o)
コマンドプロンプトで実行するPythonスクリプトにおけるANSIカラーの出力

WindowsのコマンドプロンプトでPythonのスクリプトを実行し, コンソールへの出力に色を付けたり太字にしたりする方法です．

# 短いサンプルコード

```py
import os
os.system('')
print('\033[31mRed\033[0m')
```

コンソールへの出力は次のとおりです（サンプルコードをmain.pyとして実行）：
![foo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425475/46333304-4d9e-344b-c139-9a825bb0ff36.png)

# 解説
サンプルコード2行目の`os.system('')`は引数のコマンドをサブシェルにて実行します[1]．Windowsの場合通常はコマンドプロンプトです．引数が`''`のため単にサンプルコードのプロセス上で機能し始めるだけです．PythonインタプリタはANSIエスケープシーケンスの処理を有効にしないので`os.system('')`を使用してください[2][3]．
サンプルコード3行目の`print`関数の引数における`\033[31m`は以降に出力する文字の色を赤にし, `\033[0m`はリセットします．`\033[`にくっつける数字などを変えることで他の文字色に変えたりすることができます．詳細は, 補足で紹介した記事に挙げられています．



# 補足
以下の記事では出力文字の変更や出力色の変更方法が紹介されており, 他の出力などが紹介されています．ただし, Pythonで実行する場合は当該記事における`\e`はPythonでは使用できないので`\033`または`\x1b`に置換してください．

https://qiita.com/PruneMazui/items/8a023347772620025ad6

# References
[1] https://docs.python.org/3/library/os.html?highlight=os#os.system
[2] https://code-examples.net/ja/q/230ea3f
[3] https://stackoverflow.com/questions/57733862/ansi-escape-code-wont-work-on-python-interpreter
文章を縦書きにすることをElixirで楽しむ

```
元気ですかーーーーッ！
元気があればなんでもできる
迷わず行けよ
行けばわかるさ
```

文章を縦書きにしてみます。
[Elixir](https://elixir-lang.org/)で楽しみます。

```elixir
s = """
元気ですかーーーーッ！
元気があればなんでもできる
迷わず行けよ
行けばわかるさ
"""

list_of_lists = s |> String.split("\n") |> Enum.map(&String.codepoints/1)
cnt = list_of_lists |> Enum.max_by(&Enum.count/1) |> Enum.count |> Kernel.-(1)

(for j <- 0..cnt,
  do: list_of_lists
      |> Enum.map(fn list -> Enum.at(list, j, "　") end)
      |> Enum.reverse()
      |> Enum.join())
|> Enum.each(&IO.puts/1)
```

## 実行結果

![スクリーンショット 2022-10-03 22.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/adc8b81f-81b2-5386-3739-733e814f81fc.png)



# 入力を細工

```elixir
s = """
元気ですか｜｜｜｜ッ！
元気があればなんでもできる
迷わず行けよ
行けばわかるさ
"""

# あとは上記と同じ
```

## 実行結果

![スクリーンショット 2022-10-03 22.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/21de92fd-20fa-16d6-cf56-78b6086aef03.png)

---

# 追記

[autoracex](https://autoracex.connpass.com/)にて、@t-yamanashiさん、@Mnishiguchiさん、@tamanugiさんの検討会が行われていました。

@tamanugi さんが関数型っぽい書き方を紹介してくださいました。
感謝いたします。
感激の興奮冷めやらぬうちに追記いたしておきます。

[Enum.zip/1](https://hexdocs.pm/elixir/1.12/Enum.html#zip/1)を使う解法です。

```elixir
["ドットコム", "どこが混むのと", "聞く上司"]
|> Enum.reduce({[], 0}, fn i, {a, b} -> {[i | a], max(String.length(i), b)} end)
|> then(fn {texts, l} -> Enum.map(texts, &String.pad_trailing(&1, l, "　")) end)
|> Enum.map(&to_charlist/1)
|> Enum.zip()
|> Enum.map(&Tuple.to_list/1)
|> Enum.each(&IO.puts/1)
```

![スクリーンショット 2022-10-15 8.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/58d8b05b-f038-761c-9b2c-016d992635f4.png)

---

猪木さん風の言葉を再掲。

```elixir
"""
元気ですか｜｜｜｜ッ！
元気があればなんでもできる
迷わず行けよ
行けばわかるさ
"""
|> String.split("\n")
|> Enum.reduce({[], 0}, fn i, {a, b} -> {[i | a], max(String.length(i), b)} end)
|> then(fn {texts, l} -> Enum.map(texts, &String.pad_trailing(&1, l, "　")) end)
|> Enum.map(&to_charlist/1)
|> Enum.zip()
|> Enum.map(&Tuple.to_list/1)
|> Enum.each(&IO.puts/1)
```

![スクリーンショット 2022-10-03 22.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/21de92fd-20fa-16d6-cf56-78b6086aef03.png)
iframeタグ

iframeタグを使用すれば特定のファイルをページの一部を表示することができる。
```
<iframe>~</iframe>
``` 
iframe: インラインフレーム(アイフレーム)

# iframeタグ構成
- src属性: 画像や文書など、表示させるファイルの場所を指定
- width属性: iframeの幅を指定
- height: iframeの高さを指定

### 例
```
<iframe src="/image/iframe.html width="200" height="500"></iframe>
```


# 参照
- [HTMLでiframeを使う方法【初心者向け】](https://magazine.techacademy.jp/magazine/5839)
- [iframe（インラインフレーム）とは？使い方や高さの調整方法など徹底解説！](https://seolaboratory.jp/52748/)
[SQLServer] チューニング備忘録

## はじめに
業務で本格的にSQLに携わりましたが、人から聞いただけの知識で理解が曖昧な内容があったため、自分で検証して理解を深めその備忘録として当記事を残します。


## 1. パーティション化

#### 1-1.パーティション化とは

データのパーティション化とは、データの格納場所を分割する機能です。
これに伴い、データアクセス速度の向上につながります。

カレンダ年月という項目に対してパーティションを設定した例を説明します。
すべての期間のデータを保持した全体のテーブルを1つの箱としたとき、パーティションを設定することでカレンダ年月ごとの引き出しが作られます。
カレンダ年月を条件に絞り込みをしたときに、箱の中を全て見ていくわけではなく、対象の引き出しのみを開けてデータを取り出すイメージです。
上記の例で考えても、アクセス速度が向上することがわかると思います。

参考：https://qiita.com/fuk101/items/603ddb445070aebbfcfa


#### 1-2.パーティション化したテーブルへのアクセス速度の検証

パーティション化による影響を調査するため、以下条件のクエリを実行する。
1．INSERT INTO \[パーティションなし挿入先テーブル\](項目～) SELECT (項目～) FROM \[パーティションなし元テーブル\]
2．INSERT INTO \[パーティションあり挿入先テーブル\](項目～) SELECT (項目～) FROM \[パーティションあり元テーブル\]
　  ※パーティションは「カレンダ年月」の項目に設定


###### 1．の実行計画
|StmtText  |TotalSubtreeCost  |TotalSubtreeCost(行程ごと)|
|---|---|---|
|INSERT INTO [パーティションなし挿入先テーブル] (項目～) SELECT (項目～) FROM [パーティションなし元テーブル] |49  |98 (INSERT)  |
|\|--Clustered Index Insert(Object: ([パーティションあり挿入先テーブル].[PKのインデックス]), SET (項目～))  |49  |↑  |
|　\|--Compute Scalar|28  |106 (SELECT)  |
|　　\|--Sort(ORDER BY:(項目～)|28  |↑  |
|　　　\|--Compute Scalar|25  |↑  |
|　　　　\|--Clustered Index Scan(OBJECT:(Object: ([パーティションあり元テーブル].[PKのインデックス]), WHERE:([CALMONTH]の条件式)|25  |↑  |

###### 2．の実行計画
|StmtText  |TotalSubtreeCost  |TotalSubtreeCost(行程ごと)|
|---|---|---|
|INSERT INTO [パーティションあり挿入先テーブル] (項目～) SELECT (項目～) FROM [パーティションあり元テーブル] |6028  |12056 (INSERT)  |
|\|--Clustered Index Insert(Object: ([パーティションあり挿入先テーブル].[PKのインデックス]), SET (項目～))  |6028  |↑  |
|　\|--Compute Scalar|3  |9 (SELECT)  |
|　　\|--Compute Scalar|3  |↑  |
|　　　\|--Clustered Index Scan(OBJECT:(Object: ([パーティションあり元テーブル].[PKのインデックス]), SEEK:([PtnId1003]>=RangePartitonNew([@CalMonthFrom],(0),(201110.),(201111.),(~パーティションが作成された他のカレンダ年月 ...))|3  |↑  |

上記クエリの実行結果を比較し、パフォーマンスへの影響について確認します。

元テーブルへのSELECT句については、パーティション有のテーブルのほうがコストが小さいことがわかります。
どちらのクエリもClustered Index ScanでPKのインデックスを参照していますが、データの絞り込み方法がWHEREとSEEKで異なり、インデックス有の方はパーティション毎にデータを探索しており、パフォーマンスの向上につながっております。

逆に、挿入先テーブルへのINSERT句については、パーティションなしのテーブルのほうがコストが格段に小さいことがわかります。


#### 1-3.パーティションの使い場所

INSERT・SELECTそれぞれの時間を計測しましたが、パーティションの有無によって大きな違いが生まれました。
もし、INSERT・SELECTそれぞれにリアルタイム性を持たせる必要がある場合は、本番想定のデータ量でクエリを実行した結果によって、パーティション化によるパフォーマンスへの影響が良いか悪いかを総合的に判断する必要があります。
ただし、INSERT処理は夜間ジョブなどで実施し、SELECTにのみリアルタイム性が必要な場合などには、パーティション化がパフォーマンスへ好影響をもたらす可能性が高いと感じました。


## 2. インデックスとパーティション化の違い（未検証）

表題の通りですが、インデックスを設定したとしてもパーティションを設定したとしても、設定した項目を条件にした時にアクセス速度が向上するという点は同じのため違いはあるのかということを疑問に思ってしまいました。
参考(インデックス)：https://use-the-index-luke.com/ja/sql/anatomy/the-leaf-nodes

しかし、現時点では検証できませんでした。。。
パーティション化ありのテーブルとインデックスありのテーブルで比較しましたが、私の環境ではテストデータの性質上インデックスを参照してデータを取得できなかったため、検証用の専用データを作成して来期に持ち越して検証予定です。

#### おわりに

今回、初めて自分で実行計画を見ながらパフォーマンスを確認しましたが、想像以上にチューニングが難しかったです。
基本的は、テーブルへの参照やWHERE句の条件などが影響することが多いと思っていましたが、SELECTで指定している列やデータ量も関係しているようで、想像していた結果が返ってきませんでした。
今回の期間の検証では十分な成果が得られなかったので、検証用のデータベースを構築して来期にリベンジしたいです。
Blender奮闘記⑩

# 初めに
今回はyukiさんのハートの作り方を元にやっていきます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/KWJ7sHZ_t-w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 作成途中
![0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/c89658f9-adbb-fd26-a941-124b6a9b628e.png)

今回のは簡単でした。前に行った初心者マークを回すものに加えて回転が入ったくらいで特に問題なくできました。
全体の作成+アニメーションの作成含めて10分程度だと思います。
復習も簡単に終わりました。

# 終わりに
今回の動画で学べたのは複数選択の状態でCtrl + Jを押すことによって一つの図形にまとめることができるという点です。これを使えば前に作成したモンブランをアニメーションで回すことも可能なのではないかと思います。
【Python】numpyで空の配列を生成する方法

## 背景
- 最終的な要素数がわからない場合に、空の配列を作成しておいて、要素を追加して配列を作成したい時があります。
- listでは、`l = []`という形式で空の配列を作り、`l.append(1)`という形で簡単に要素を追加できます。
- ただ、おそらくlistで行うよりもnumpyで同様の処理を行なった方が、処理速度が速いので、今回numpyでの方法を調べてみました。

## 目標
- numpyで空の配列を作れるようになる。

## numpyで空の配列を生成する方法
- numpyで空の配列を作成するには、`np.empty()`を使用すればできます。

```python:numpyでの空の配列の作り方
#1次元の空の配列を作る
1d_empty = np.empty([0])

#2次元の空の配列を作る
2d_empty = np.empty([0, 0])

#3次元の空の配列を作る
3d_empty = np.empty([0, 0, 0])
```

## 補足
- 速度検証もそのうち行いたい。

## 参考資料

https://helve-blog.com/posts/python/numpy-empty-array/

https://numpy.org/doc/stable/reference/generated/numpy.empty.html

## 個人ブログ

https://takuma-tech.com/2022/10/03/305/
同じ数値が2つ以上含まれている場合、その数値は合計しないプログラム

今日も学んだことを忘れない為にメモします。

## プログラムの内容
・配列に格納された数値の合計値を算出する
・ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

## 記述内容
```
def lone_sum(ary)
  
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

lone_sum([1, 2, 3])
lone_sum([3, 2, 3])
lone_sum([3, 3, 3])

=> 6
=> 2
=> 0
```
uniq_nums = [] は重複していない要素を取り出して保管する配列 
まずは配列から、重複しない数字のみをeach doで取り出していく。
count = 0　　　　はお馴染みのcountを0からスタートするために記述

lone_sum([3, 2, 3])でメソッドを呼び出した場合で考える
```
if num == i
  count += 1
end
```
とりだした数字とが同じかの確認　する（3,2,3） == (3)、
同じであれば、何個同じか数える　count += 1  
```
if count < 2
  uniq_nums << num
end
```
重複した値が1つのときだけ　uniq_nums配列に値を追加する
num=3のときはcount=2となるので、uniq_nums配列に値は追加されない

```
sum = 0
uniq_nums.each do |unique_num|
  sum += unique_num
end
```
上記で作成したuniq_nums配列の合計を求めるための記述。
sum = sum + 2、つまりsum = 0 + 2となるので「２」が出力される

以上になります。
プレイリストシステム③

## 初めに
[前回](https://qiita.com/wawon1111/items/19777c4cf25df6c1770e)はプレイリストシステムの要件を決めました。今回はシステムの方式設計を行っていきたいと思います。

## 方式設計とは
まず私がここで言っている方式設計とはいろんなサイトを見ていると基本設計とも表現されています。というか、基本設計と書かれている方が多そうですが、私の馴染み的に方式設計と記載させていただきます。

システム方式設計とは、情報システム開発の設計工程の一部で、システムに必要とされる各要件をハードウェア、ソフトウェア、利用者による手作業のいずれによって実現するかを確定し、全体の構成や構造を決定すること。

https://e-words.jp/w/システム方式設計.html

ここから方式設計を行っていきたいのですが、すべての項目を網羅しようとすると時間がかかってしまうのでここでは自分が思いつく範囲の方式を決めていきたいと思います。

### 構成図
構成図は様々な書き方がありますが、今回はブラウザからも使用できる[diagrams.net](https://www.diagrams.net/)を使用しました。使用方法は[こちら](https://aws.taf-jp.com/blog/61489)のページを参考にしました。

作成した図は画像や、PDF形式で出力できるだけでなく、URLを発行することでページを閉じても後から編集することもできました。

![スクリーンショット 2022-11-22 230734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/cfe59ea3-16e0-1d12-de2a-63862ee83511.png)


### ネットワーク
|AWSサービス|方式|
|---|---|
|リージョン|リージョンはグローバル展開や特定のリージョンのみで使用できるサービス等は使用しないので東京リージョンを選択|
|VPC|東京リージョン内にVPCを1つ用意。CIDRは172.16.0.0/12を使用する。|
|アベイラビリティゾーン|今回はサーバー等の冗長化を行うのでaz-1a,az-1cを準備する。|
|サブネット|インターネットに直接つながるパブリックサブネット。サブネットからインターネットに出れるProtectedサブネット。インターネットと切り離されたプライベートサブネットを準備。CIDRは、10.0.0.0/24,10.0.1.0/24・・・と割り当てていく。|
|NATゲートウェイ|サーバーのパッチ適用などを考慮し、NATゲートウェイを用意し、Web・アプリサーバーからインターネットに接続できるようにする。|
|ALB|Webサーバーの負荷分散としてALBを使用する。|
|Route53|Route53でドメインを取得し、FQDNでシステムにアクセスできるようにする。|

### サーバー
|AWSサービス|方式|
|---|---|
|EC2|Web・アプリサーバー用にEC2をそれぞれ用意する。OSはAmazonLinux2を使用する。インスタンスタイプはt2.microを使用する（無料なので）。|
|RDS|データベースサーバーとしてRDSを使用する。|

### セキュリティ
|AWSサービス|方式|
|---|---|
|セキュリティグループ|セキュリティグループを使用して、トラフィックを制御する。インターネットからはHTTPS通信のみに制御する。ALB以外のAWSリソースは可能な限りIPアドレス等でも制御をかける。|
|WAF|WebACLを使用してセキュリティ対策を行う。ルールはAWSのマネージドルールを使用する。|
|ACM|パブリック証明書を取得し、HHTPSで通信できるようにする。|

### 構築時接続方法
|AWSサービス|方式|
|---|---|
|System Manager|System Managerを使用してEC2へ接続を行う。System Managerを使用することでRDP等のポートを開放せずにOSログインが可能になる。|


### MW以上

|項目|方式|
|---|---|
|Webサーバー|Apache|
|アプリサーバー|Tomcat|
|データベースエンジン|MySQL|

## まとめ
大雑把ですが、このシステムでの方式設計を決めました。主にインフラ部分でアプリの部分はやったことがないので実際に設定、構築を行いながらどんなものにするか決めていきたいと思います。次回は実際にインフラリソースの構築を行っていきます。※詳細パラメータは作りながら決めていきます。
新しいMacへ今のMacの設定をなるべく楽に連れていく

ありがたいことに会社から新しく Mac M1 を支給いただけることになったので、古いPCから新しいPCへ開発環境を移行してみました。

ここではバイナリなどのデータは対象外として、開発ツールのみに焦点を当てて話していきます。

## Terminalのテーマ

実は Export, Inport が可能です。
なので今のPCでお気に入りのテーマを書き出し、新しいPCでお気に入りのテーマを読み込めばいけます。
ただしフォント周りについては注意です（自分は [yuru7/HackGen: Hack と源柔ゴシックを合成したプログラミングフォント 白源 (はくげん／HackGen)](https://github.com/yuru7/HackGen) をよく使っているので、初手で必ず入れるようにしています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253330/cad8415f-34e5-ffa9-59ae-e3b86c952e37.png)


## Brewでインストールしたもの

こちらの記事を参考にしました。
[Brewfile で Homebrew のライブラリを管理しよう！ - kakakakakku blog](https://kakakakakku.hatenablog.com/entry/2020/09/17/124653)

まず今のPCで `brew bundle dump` を実行し、 `Brewfile` を生成します。
その後、何らかの方法で `Brewfile` を新しいPCに移行し、　`Brewfile` が配置されたパスで `brew bundle` を実行します。

そうすると `Brewfile` をもとに新しいPCに開発用ツールがダウンロードされます

## 各種設定値

gitのコンフィグなどの移行についてです。
こちらは会社で使っている　GitHub Enterprise　の個人プライベートリポジトリで元々管理していたので、新しいPCでそのリポジトリだけ持ってきたところ、楽にできました。

鍵の移行は難しそうな感じだったので、鍵は再生成して GitHub Enterprise に登録して `ghq get 対象リポジトリ` しています（ssh, gpg共に）。

管理対象としていたのは下記でした。

- .zshrc
- .vimrc
- .tool-versions
    - [asdf](https://asdf-vm.com/) 用のファイル
- .tmux.conf
- .p10k.zsh
    - [romkatv/powerlevel10k: A Zsh theme](https://github.com/romkatv/powerlevel10k) を使っているため
- .config/gh 配下
- .config/git 配下
    - config, ignore, .commit_template など

git　の　config については　gpg キーの再発行を行なったので、 config ファイル中のキーの差し替えを行いました。

## VSCode extention

[How can you export the Visual Studio Code extension list? - Stack Overflow](https://stackoverflow.com/questions/35773299/how-can-you-export-the-visual-studio-code-extension-list)

を参考に下記の手順としました。

- 今のPCで `code --list-extensions > extensions.list` を実行し、拡張のリストを作成する
- 何らかの方法で　`extensions.list` を新しいPCに入れる
- 新しいPCで `cat vscode-extensions.list | xargs -L 1 code --install-extension` を実行する

これによってリストベースで VSCode extention がインストールされます。
なお、何かエラーになったものもあった記憶なので、念のため全て入ったかどうかは確認したほうがいいかもしれません。
（メモだけ残してたのでスクショ撮ってませんでした）

通信系でうまくいかない場合は下記設定も有効かもしれません。

[proxy - unable to get local issuer certificate vscode - Stack Overflow](https://stackoverflow.com/questions/34921875/unable-to-get-local-issuer-certificate-vscode)

## 他、手作業系

- .zshrc の一部スクリプトがおかしい問題
    - パスがおかしくなっていたなど
- `ghq` で必要なリポジトリを引っ張ってくる
    - （必要でないものもいくつか混じっていたのでついでに整理）
- tmuxプラグインをインストールする
- 必要なファイルをいろいろ持ってくる
- DockerなどGUIで提供されているツールのインストール
    - 仕方なし

これらをやって1日ちょっとで開発しているプロダクトが動き、開発できる状態となりました。

## まとめ

PCや開発環境の移行は何度かやっているのですが、毎回苦労するのでまとめてみました。
特にVSCode extentionの移行ってこんなに楽にできるんですね（なんか同期するとかもあった気がするんですが、調べていないので活用できていません）。

本当は ansible みたいなもので apply するだけで使えるとかも理想的だなーとは思っていますが、毎回面倒になって完遂できていません。
次回 Mac を移行するタイミングがあれば検討してみようと思います。
【AWS】Account Factory for Terraformを実装してみた （はじめに）




こんにちは。


私は業務上月2－3回は組織内でAWSアカウントを発行しています。
一々手動でポチポチ作業していたため何かで自動化できるといいなーと思っていたところ、**AWS Control TowerのAccount Factory for Terraform（以下AFT）** というものを耳にしました。

名前の通り、アカウントを発行してくれる工場なのかな・・？（＾＾）；；
今までTerraformは1回も触ったことがなかったので、とりあえず公式ドキュメントをメインに参考して勉強しました。

私が一番参考になったドキュメントはこちらです。 ⇣
- **Terraformで提供している公式手順**：https://learn.hashicorp.com/tutorials/terraform/aws-control-tower-aft
アカウントカスタマイズの書き方は書いてないですが、全体的にAFTをどうデプロイすれば良いか具体的に書いています。
- **AWSブログ**：https://aws.amazon.com/jp/blogs/news/new-aws-control-tower-account-factory-for-terraform/
AFTは、複数のAWSのサービスが複合的に繋がって動作しています。（Control Tower、S3、Lambda、CodeBuild、CodePipeLine、Service Catalog、など）裏側の構成を理解しやすかった記事です。また、AFTの基礎を理解するのに良かったです。
- **ClassMethod記事**：https://dev.classmethod.jp/articles/ct-account-factory-for-terraform/
AWSとTerraform（Hashicorp）の公式ドキュメントと同じレベルで全体的なデプロイの流れをとても分かりやすく書いた記事だと思います。

ところで、なぜか、上記以外はあまり参考になる記事がありませんでした。（私のググり力が足りないかもしれませんが）
特に、一番情報が欲しかった**アカウントのカスタマイズに関しては、どうコードを書けば良いか、どう実装すれば良いか全く記事が見つからなかった**ため、結構大変でした。

ということで、今回AFTの実装作業とテストがようやく完了しましたので、私がまとめて投稿いたします！
出来る限り詳しく、私が経験したエラーや苦労したところも全部書くようにしますのでご参考になれば幸いです。

こちらの投稿は現在もアップデート中です。（Last Updated：2022/10/03）
また、AFTに関してほしい情報や上手く解決できないエラーがありましたらコメントでお願いします。一緒に解決しましょう！

#### 以下の一覧をご参考ください。（まだ作成中です！）

## カスタマイズ系
- **[AFT-GLOBAL-CUSTOMIZATIONSの書き方](https://qiita.com/Soojin/items/ed62650388fbed34b69f)**
：上記の公式手順に追ってAFTを実装するとアカウント発行の自動化はできますが、アカウントをカスタマイズするには自分でコードを書かないといけません。（例：Security Hubを開始させたい、XXXのロールとポリシーを作成したい、IAMのユーザーを作成したい、など何でも）AFTにて発行するすべてのアカウントに対して統一して適用したいカスタマイズがあればGlobal Customizationsリポジトリにコードを書きますが、どういう風に書けばいいかをこちらの記事で紹介します。
- To be continued...


## デプロイ系
- **AFT VCS Providerの選択**
：AFTはコードのバージョンコントロールのため、Github、Github Enterprise、AWS CodeCommit（デフォルト）、BitBucketのVCS Providerの選択肢を選択できます。私は最初Githubでデプロイしましたが、予想していた動きと違ったため最終的にはデフォルトのAWS CodeCommitでデプロイしました。それぞれの設定の違うところは何があるか、VCSを変えるためにTerraformコードのどこをいじればいいか、などを紹介します。



## エラー系
- To be continued...
Kindleの文字部分のみを自動で切り取って画像で保存していくPGM

<h3>Kindleの文字部分のみを自動で切り取って画像で保存していくPGM</h3>
Kindleの文字部分のみを自動で切り取って画像で保存していくPGMをpythonで作りました

<hr>
githubURL: https://github.com/NanjoMiyako/KindoleTextTyusyutu

<hr>
使い方<br>
github上のTextTyusyutu-KoukaiYou.pyの各変数の値をscn1, scn2, scn3に基づいて設定して
から、kindleのページを文字画像をとる位置に設定し、取得する位置ページ数を
positionCountの変数を適宜変えます。そして、画面を右半分:Kindle画面、
左半分：paint画面にしてから、TextTyusyutu-KoukaiYou.pyを実行します。
なお、ペイントは「名前を付けて保存」で予め保存場所を適宜設定しておきます。

<hr>
参考にしたサイト<br>
<a href="https://chappy88.hatenablog.com/entry/2020/08/26/004527#typewrite">【Python】pyautoguiを使ったキーボード操作、マウス操作 - プログラミング勉強の備忘録</a>
AWS　EC2からS3参照

# 前提条件
この記事は、最初の一歩用となっております。
わかりやすくするため、説明不足な点がありますので、
詳しくは、他の記事を参照してください。
# EC2からS3を参照する方法
1.EC2から直接S3を参照
2.EC2からゲートウェイVPCエンドポイント経由でS3を参照
3.EC2からインターフェイスVPCエンドポイント経由でS3を参照

# 1.EC2から直接S3を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883811/0397f8f6-da4e-bc81-16e6-78577b16d773.png)
普通にInternet gateway経由でS3にアクセス。

# 2.EC2からゲートウェイVPCエンドポイント経由でS3を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883811/039baa88-fdf0-7c26-cdcd-586c48367782.png)
サブネットに設定された「Route table」によってS3向け通信は「Endpoints」にルーティングされる。
「Endpoints」はパブリックIPを持っているため、S3とアクセス可能。

# 3.EC2からインターフェイスVPCエンドポイント経由でS3を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883811/01a91c45-f4e3-3946-526f-a8302fe288fe.png)
Private linkにより、インターネットに出ることなくS3にアクセスできる。
Laravel + Vue3 + Inertia のconst, config定義を極めた

自動補完されたいからちゃんと class hoge に const FUGA = 1; として実装したいし
でもconfig('hoge.FUGA')で取得したいし
でもvueでも使わないといけない、雑にぐぐるとvueはvueでjsに定義してたりする
すざけるな＾＾

昔は全部DBでマスタ管理してたなぁ懐かしい

```Model/Hoge.php
class Hoge extends Model
{
    const FUGA = 1;
    const PIYO = 2;
    const POKO = 3;
    const METAVARS = [
        self::FUGA = 'ふが',
        self::PIYO = 'ぴよ',
        self::POKO = 'ぽこ',
    ];
}
```

```config/const.php
return [
    'hoge' => (new ReflectionClass(Hoge::class))->getConstants(),
];
```

```Http/Middleware/HandleInertiaRequests.php
public function share(Request $request)
{
    return array_merge(parent::share($request), [
        'const' => config('const'),
    ]);
}
```

```resources/js/Pages/Hoge.vue
<template>
    <select>
        <option v-for="(label, id) in const.hoge.METAVARS" :value="id">{{ label }}</option>
    </select>
</template>
<script>
export default {
    computed: {
        const(){ return this.$attrs.const; }
    }
}
</script>
```

少なくとも、自分が雑に検索して出てきた色々な定数定義ハウツーよりもシンプルでマシだと思うんだけど
もっといい方法あったら教えてください

あと vue3 の setup がまだよくわかってないのでまたこれから勉強します
SourceTreeでクローンがうまくできなかった時の対応

Githubで個人リポジトリ用意して
ゴリゴリやってくぞー!
SourceTreeあまり使ったことないから使ってみよーー!
と意気込んだのは良いものの



クローンで詰んだ....

仕事ではFORK Git clientで作業していて
SourceTreeを使うことは滅多になかっただけに
どこから確認するんだと...


とはいえGit GUIでやっていることは大体同じなので
試したことと、最終的にできた方法を備忘録としてまとめてみる。

## 結論

Githubのアカウント用意したらトークンも一緒に準備する。
そうすればクローンの時面倒なことにならない。


## 最初のやらかし〜やったこと1
クローンした時に「Password Required」が出てきて
「あ、トークン用意するの忘れた」

となりキャンセル押したこと...

そしてそのままゴリ押した結果

```
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'リポジトリURL'
```

このエラー文を見て何故だか
「あ!そういえば同期がSourceTreeの設定で確かGitアカウント連携してたはず!それやってない!」
と華麗に斜め上の発想に。

githubのOAuth認証方法を設定する。
もちろんクローンはできないし、後々これが面倒なことになる...

▼その時見ていた記事
[sourcetree/githubのOAuth認証方法](https://www.gigas-jp.com/appnews/archives/10231)


## 次にやったこと

OAuth認証方法設定したものの相変わらずクローンできない。
エラーの内容が変わったけど。


```
remote: Write access to repository not granted.
fatal: unable to access 'リポジトリURL': The requested URL returned error: 403
```

今度はやんわりエラーを読む。
どうやら権限まわりっぽい雰囲気。

トークンの準備もこの段階でようやくする。
だけど「Password Required」が出てこない....

キーチェーンから「Github.com」で検索をかけ
ヒットしたものを削除していったが相変わらず変わらない。

▼この時見ていたページ
[キーチェーンからの削除方法](https://docs.github.com/ja/get-started/getting-started-with-git/updating-credentials-from-the-macos-keychain)


## 最終的な対応
検索の仕方を変えた。
クローン時の画面で「有効なパス/URLではありません」というワードが気になったので、SourceTree　, 有効なパス/URLではありません で確認したところ

>Githubの連携を外して再度やり直したらできました。

という記事を発見。

まさかな...と思い
OAuth認証を削除
↓
クローンし直すと....

「Password Required」が出てきた!!

うおおおおこれは勝つる!!!
と勢いに乗って先ほど作ったトークンを入れ込む....

<br><br><br>

┗('o'≡'o')┛ウワアアアアアアアアアアアアア！！！！！！！！

クローンできた!!
つまり、私の問題はGithubの連携でもなく、キーチェーンでもなく
単純にトークンを用意せず先走ったがために起きた事象だったのです笑

いまだに初心者な私でした

▼この時見ていたページ
[GitHubとの連携の際にリポジトリのクローンで「有効なパス/URLではありません」と表示される
](https://community.atlassian.com/t5/Sourcetree-questions/GitHub%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E3%81%AE%E9%9A%9B%E3%81%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%81%A7-%E6%9C%89%E5%8A%B9%E3%81%AA%E3%83%91%E3%82%B9-URL%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93-%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B/qaq-p/1875426)
[Githubの個人アクセストークンをSourceTreeで使用する](https://cly7796.net/blog/other/use-github-personal-access-tokens-in-sourcetree/)
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolutionエラーが出た

今まで問題なく立ち上がっていたDockerがなぜか立ち上がらない・・・
```
 SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: select * from information_schema.tables where table_schema = テーブル名 and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:692
    688▕         // If an exception occurs when attempting to run a query, we'll format the error
    689▕         // message to include the bindings with SQL, which will make this exception a
    690▕         // lot more helpful to the developer instead of just the database's errors.
    691▕         catch (Exception $e) {
  ➜ 692▕             throw new QueryException(
    693▕                 $query, $this->prepareBindings($bindings), $e
    694▕             );
    695▕         }
    696▕     }

      +36 vendor frames
  37  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

# 原因
.envで定義していたホスト名が違っていた
```php:database.php
'host' => env('DB_HOST', '127.0.0.1'),
```
```:.env
DB_HOST=dbp //dbpではなくdb
```
```yaml:docker-compose.yaml
services:
(略)
  db:
```
なぜかpが紛れ込んでいたというオチ
【Linux】コマンドの実行結果を画面とパイプの両方に渡す方法

## はじめに
コマンドの結果をパイプで渡すと以下のようになります。

```zsh
$ ls -a | grep .env
.env
```

上記の`ls -a`の実行結果も画面に表示させる方法について記載します。

## 画面にも表示させる方法
 
コマンドの実行結果を画面とパイプの両方に渡すには以下のように実行します。

```zsh:zsh
$ ls -a >&2 | grep .env
.
..
.DS_Store
.env
.git
.env
```

上記の実行結果の内上から`.git`までが`ls -a`の実行結果です。
最後に再度`.env`と表示されているのが`grep .env`の実行結果になります。

上記の方法はshやbashでは使用できません。

```bash:bash
$ ls -a >&2 | grep .env
.           
..
.DS_Store
.env
.git

$ echo $?
1
```

以下の方法はzshとbashで使用することができます。

```zsh:zshまたはbash
$ ls -a | tee >(grep .env)
.
..
.DS_Store
.env
.git
.env
```
shで実行すると以下のようにエラーとなります。

```sh :sh
$ ls -a | tee >(grep .env)
sh: 1: Syntax error: "(" unexpected
```

以下の方法であればshでも使用可能です。

```
$ ls -a | tee -a /dev/stderr | grep .env
.
..
.DS_Store
.env
.git
.env
```
chromebook(linux)でdockerを手間ゼロでインストール

# スクリプトファイルにインストールの流れをまとめました
chromebooにサクッとdocker環境を構築したい方向けの記事です。
## 概要
dockerをchromebook(linux)にインストールする方法は[公式ドキュメント](https://docs.docker.com/engine/install/debian/#install-from-a-package)に載っています。

本記事の目的は、インストールする作業を面倒くさいから1つのスクリプトファイルにまとめて、実行したらインストールが完了するようすることです。
chromebookのlinux開発環境はたぶん同じだという前提の下に執筆しています。


## 手順
 - chromebookのlinux開発環境を有効にする。[参考記事](https://support.google.com/chromebook/answer/9145439?hl=ja)
 - 本記事に掲載されているscriptを実行する

## installのスクリプト
linux開発環境を有効にすることができたら、以下のファイルをlinuxの環境下で実行します。
内容をコピーして、vimでファイルを作成するなどしてください。

```docker_install.sh
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo apt-get update
sudo apt-get install docker-compose-plugin
```

```
$ bash docekr_install.sh
```
でスクリプトファイルを実行できます。
`docker`と`docker compsoe`が使用できるかと思います。

疑問等あれば、コメントください。
この記事でdocker環境を構築できる手助けができることを願っております。
Select2の代替にTom Selectを使ってみる

## 概要
インクリメンタルでドロップダウンの選択肢を絞り込める[select2-rails](https://github.com/argerim/select2-rails)のgemはとても便利なんだけど、jQueryに依存しているので、Rails 7 + StimulusなどのjQueryを使わないモダンな環境では使用をためらってしまうかと思います。

![スクリーンショット 2022-10-03 19.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176427/4514fe7a-5489-2f75-7401-378a01879d7f.png "Select2")

Select2の代わりに使える[Tom Select](https://github.com/orchidjs/tom-select/)がSelect2同様に簡単で便利だったので紹介します。

## 環境
- Rails 7.0.3
- stimulus-rails
- jsbundling-rails（importmap-railsでもいけるはず）
- Bootstrap 5（なくてもいけます）

## コマンド
### 1. yarnでライブラリをTom Selectを追加する
これでTom SelectのJavaScriptがコンパイルされるようになります。
```shell
yarn add tom-select
```

### 2. Tom SelectのCSSをインポートする
これをやらないとスタイルが適用されず、崩れたドロップダウンが2つ表示される感じになります。[公式ドキュメント](https://tom-select.js.org/docs/)では見つけにくくて、はまりました。

プロジェクトでBootstrapを使っている場合は、以下のようになります。
```app/assets/stylesheets/application.scss
@import "tom-select/dist/css/tom-select.bootstrap5";
```

Bootstrapを使っていない場合は、以下のようになります。
```app/assets/stylesheets/application.scss
@import 'tom-select/dist/css/tom-select';
```


### 3. JavaScriptをインポートする

まず、Stimulusのコントローラーを作成します。
```shell
bin/rails g stimulus SelectController
```

作成されたファイルで、TomSelectをimportして使います。
```app/javascript/controllers/select_controller.js
import { Controller } from "@hotwired/stimulus"
import TomSelect from "tom-select"

// Connects to data-controller="select"
export default class extends Controller {
  connect() {
    // 初期化処理を書く
    const config = {};
    new TomSelect(this.element, config);
  }
}
```

以下の記述はimportmap-railsでは不要です。jsbundling-railsでは自動で追加されます。

```app/javascript/controllers/index.js
import { application } from "./application"
...
import SelectController from "./select_controller"
application.register("select", SelectController)
```

### 4. viewsにselectを追加する
Shopモデルにareaというプロパティーがあるとすると、こんな感じになります。
```erb
<%= bootstrap_form_with(model: @shop, url: shops_path) do |form| %>
  <div class="col-6">
    <%= form.select :area, Area.all.pluck(:name, :id), { include_blank: 'エリアを選択' }, data: { controller: "select" } %>
  </div>
<% end %>
```

Bootstrapなしのform_withでもいけるし、selectの代わりにcollection_selectでもいけます。
```erb
<%= form_with(model: @shop, url: shops_path) do |form| %>
  <div class="col-6">
    <%= form.collection_select :area_id, Area.all, :id, :name, { include_blank: 'エリアを選択' }, data: { controller: "select" } %>
  </div>
<% end %>
```

## できたもの
![スクリーンショット 2022-10-03 19.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176427/1ecca9a7-bfd1-6c66-a9f2-ca51a3caa198.png)

この例では、ドロップダウンの選択肢を静的に取得していますが、動的に取得する方法もあります。[公式のサンプル](https://tom-select.js.org/examples/)を見てみてください！

## 参考
https://blog.corsego.com/select-or-create-with-tom-select

https://github.com/CoolRequest/tom-select-demo

https://github.com/orchidjs/tom-select/
【基礎】CSSプロパティ備忘録

# CSSの学習中頻出プロパティ一覧
cssを学習していてこれよく見るし使うなーというプロパティを個人的にまとめてみた
## 文字の装飾系
<dl>
<dt>color</dt>
<dd>文字色変更</dd>
<dt>font-size</dt>
<dd>文字のサイズ変更</dd>
<dt>font-width</dt>
<dd>文字の太さ変更</dd>
<dt>font-family</dt>
<dd>文字の表示フォント設定、メイリオ/sans-serif/ヒラギノ角ゴの３つを設定しておけば、どんなOSでもブラウザでも大体カバーできる</dd>
<dt>list-style</dt>
<dd>文字ではないがliタグで囲んだリストの先頭の点とか消したりできる</dd>
</dl>

## HTML要素の大きさ・配置系
<dl>
<dt>height</dt>
<dd>要素の高さ指定</dd>
<dt>width</dt>
<dd>要素の横幅指定</dd>
<dt>position</dt>
<dd>絶対位置をrelativeで決めて、相対的な位置をabsoluteで指定する事が多い</dd>
<dt>display</dt>
<dd>flexboxを学習してるとめちゃめちゃ出てくる、表示形式の指定、とりあえずflex指定しとけば何とかなる</dd>
<dt>background-color</dt>
<dd>背景色の指定、要素の大きさが検証使わなくてもわかるため重宝する</dd>
</dl>

## 余白系
<dl>
<dt>margin</dt>
<dd>要素の一番外側の余白を指定できる</dd>
<dt>padding</dt>
<dd>要素の中の余白を指定できる</dd>
<dt>border</dt>
<dd>marginとpaddingの間の領域を指定できる、要素に枠線引いたりするのに便利</dd>
<dt>top,right,bottom,left</dt>
<dd>プロパティで使うこともあるが（positionとか）、余白系であれば余白を取りたい方向の指定に各プロパティの後に付けて使う</dd>
</dl>
順序回路の作法 その9

# 概要
順序回路を理解する。
gtkwaveのvcdファイルを利用する。
練習問題やってみた。

# 練習問題
フリップフロップをシミュレートして、vcdファイルを作れ。

# 方針
plunkerでやる。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6cf8d3d3-e1ce-7eac-22ee-e1b9ec885e41.png)


# サンプルコード

```


function wave(i, w) {
  out.value += "#" + i + "\n";
  out.value += w[0] + "!\n";
  out.value += w[1] + "\"\n";
  out.value += w[2] + "#\n";
  out.value += w[3] + "$\n";
}

class B {
	constructor(n) {
	  this.n = n;
		this.w = [0, 0, 0, 0];
		this.p0 = [];
		this.p1 = [];
		this.p2 = [];
		this.p3 = [];
		this.op = 0;
	}
	in0(a) {
	  this.w[0] = a;
	}
	in1(a) {
	  this.w[1] = a;
	}
	nor(a, b, c) {
	  this.p0[this.op] = 4;
	  this.p1[this.op] = a;
	  this.p2[this.op] = b;
	  this.p3[this.op] = c;
	  this.op++;
	}
	exec() {
	  var i;
	  var j = this.op;
	  while (j > 0)
	  {
  	  for (i = 0; i < j; i++)
      {
        if (this.p0[i] == 4) 
        {
          var s = this.w[this.p1[i]] | this.w[this.p2[i]];
          if (s == 0)
          {
            this.w[this.p3[i]] = 1;
          }
          else
          {
            this.w[this.p3[i]] = 0;
          }
        }
      }
      j--;
	  }
	  return this.w;
	}
}

var src = document.getElementById("src");
var out = document.getElementById("out");
var c0;

function run() {
  var str = src.value;
  var codes = str.split("\n");  
  var len = codes.length;
  var i;
  for (i = 0; i < len; i++)
  {
    var code = codes[i].split(" ");
    switch (code[0])
    {
    case "":
    break;
    case "out":
    break;
    case "make":
      var a = parseInt(code[1]);
      c0 = new B(a);
    break;
    case "in":
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
    break;
    case "nor":  
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      var c = parseInt(code[3]);
      c0.nor(a, b, c);
    break;
    default:
      alert(code[0]);
    break;
    }
  }
  var s = [];
  var t = [0, 1, 0, 0, 0, 0, 0, 1, 0];
	var u = [0, 0, 0, 1, 0, 1, 0, 0, 0];
  for (i = 0; i < 9; i++)
  {
    c0.in0(t[i]);
    c0.in1(u[i]);
    var c = c0.exec();
    s.push([c[0], c[1], c[2], c[3]]);
  }
  var v = [];
  for (i = 1; i < 9; i++)
  {
    wave(i, s[i]);
  }
  out.value += "#" + 9;
}






```


# 成果物

https://embed.plnkr.co/plunk/cf7WUPa3FXQdpqVx

以上。
初心者エンジニアによる備忘録　環境構築編

　今日は環境構築について書いていこうと思います。環境構築とは、コーディングを行う際に必要な環境を整えることです。
　いろいろな方法があるかと思いますが、私はVSCodeを使用しています。VSCodeはマイクロソフトが開発した大変便利なテキストエディタです。このテキストエディタに必要な情報を書いていきます。
https://code.visualstudio.com/
　このページからダウンロードできます。私はMacを使用していますが、Windowsでも問題なく使用できると思います。
　ダウンロードが終わったら、VSCodeを使用するにあたって便利なツールをとりこんでいきます。この便利なツールのことを拡張機能といいます。
　拡張機能はVSCode上で取得することができます。私が取得したものは、
・Japanese Language Pack For Visual Studio Code
　日本語表記にしてくれます。
・HTML Snippets
　HTMLタグ、CSSの入力を補完してくれます（めっちゃ便利）。
・Ruby
　Rubyの構文をチェックして間違ったところがあれば修正してくれます。
　今のところ私はRubyの学習中なので必須です。他の方はご自身の学習されている言語でどうぞ。
・zenkaku
　全角スペースを知らせてくれます。意外と全角でコードミスになることが多いので、これもあると便利です。
・Code Spell Checker
　コード全般のスペルチェックをしてくれます。
　また、VSCodeの設定ですが、
VSCodeのサイドバーから歯車のマーク→設定のところにいき、オートセーブの設定で「onFocusChange」にしておくことをおすすめします。文字通りオートセーブです。

　次にターミナルの設定です。
　ターミナルとは、PCに命令をすることができるアプリケーションです。Macではデフォルトでついています。
　Windowsでもある・・・と思う。このターミナルに様々なコマンドを入力することでPCを動かすわけですね！
　さて、ここでこんなことを思った人もいるはず。「え？PCの操作ならすぐできるじゃん。マウスでポチッとな」ってね。
　ぼくもそう思っていました。でも、違うんです！
　僕たちが普段何気なく操作している画面は、GUI（グラフィカルユーザーインターフェース）といって直感的に操作できる上に使い慣れていますよね。でも、直感的に操作できるだけに、コンピュータの製作者としては間違って消してしまうと大変なデータや、あまりにもデータの量を可視化してしまうと逆に見にくくなってしまうということから、表示するデータを制限しているんです！そこでPCのもっている力をフル活用しちゃうぞって出てくるのがCLIです。
　CLI（コマンドラインインターフェース）では一見とっつきにくい印象を受けるのですが、慣れてしまえばコマンド一つでほとんどの操作ができるので、コンピュータを扱う上では大変重宝します。
　で、ターミナルの話に戻るのですが、ターミナルの設定はPCごとに違うので、さらっといかせてもらいます。ぼくはMacで環境構築したので、Windowsでは勝手が違うかもしれません。適宜ググってください。

１　Command Line Tools （アプリケーション開発に必要なソフトウェアをダウンロードするのに必要）をインストール
２　Homebrew （ソフトウェア管理ツールの導入）をインストール
３　Rubyのインストール（ここは言語に合わせてください）
４　MySQLの導入（データを管理するツール）
５　Railsのインストール（これはRuby関係のツールなのでRuby以外を扱う人はなしで大丈夫です）
６　Node.jsをインストール（これもRuby関連）
７　yarnをインストール（プログラム同士の関係性を管理するツール）
それぞれバージョンの更新やターミナル上ですぐ開けるようにする設定がありますが、お使いのPCに合わせてググりましょう。
　こんな感じですかね。
　書いてて思ったのですが、かなりフワッとした内容で、その割には長々と書いてしまいました・・・
　次回からいよいよHTMLとCSSに入っていきます。では、今日はこのへんで！
Node.js: タイマーの使い方

こちらのページを参考にしました。
[Node.jsでsetTimeoutを使ったタイマー](https://qiita.com/rjegg/items/63a9ce3bd2b133efb7e3)

ライブラリーのインストール

```bash
sudo npm install -g date-utils
```

```js:timer_test.js
#! /usr/local/bin/node
// ---------------------------------------------------------------
//	timer_test.js
//
//					Oct/3/2022
// ---------------------------------------------------------------
'use strict'
require('date-utils')

var count = 0
function counter () {
    var dt = new Date()
    var formatted = dt.toFormat("HH24:MI:SS")
    console.log(count++, "只今の時刻：",formatted)
    const timeoutId = setTimeout(counter, 2000)

	if (count == 5)
		{
		clearTimeout(timeoutId)
		console.error ("*** 終了 ***")
		}
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
counter()
// ---------------------------------------------------------------
```

実行スクリプト

```bash:start.sh
export NODE_PATH=/usr/local/lib/node_modules
./timer_test.js
```

実行結果

```text
$ ./start.sh 
*** 開始 ***
0 只今の時刻： 20:00:15
1 只今の時刻： 20:00:17
2 只今の時刻： 20:00:19
3 只今の時刻： 20:00:21
4 只今の時刻： 20:00:23
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ node --version
v19.6.0
```
Vbaで色々

開発タブ表示させる

ファイル→オプション→execlオプション→
リボンのユーザー→設定　　　開発✔️

vba起動させる

visual basic釦クリック
挿入→標準モジュール

general
sub macro1
   msgbox. "hellow vba!"
end sub

実行　▶︎

カレント行はここに置く

コメントは'

二行に渡る時は、" _"

保存は*.xlsmで保存
AWS WAF がある時のログ調査切り分けメモ


サイトの動作テスト中にエラーが出てしまい、アプリ側なのか、サーバー側なのか、WAF側なのか、エラーの切り分けを行う際のメモです。

# 切り分けステップ

## 1. 構成を確認する

現在の環境を確認する

- CloudFront? ALB? EC?
- AWS WAF は CloudFront、ELB どちらに紐づいているか？


## 2. Google Chrome などのデベロッパーツールでエラーの再現を取得

- Chrome のデベロッパーツールで Network タブを開きながら、エラーを再現
- エラーが発生した際の HAR ファイルの保存
- エラーが発生した際のレスポンスヘッダーを確認。エラーが、CloudFront なのか、ELB なのか、EC2 (Nginx や Apache) なのかを確認
- エラーが発生した時刻を確認
- エラーが発生している URI パスを確認

## 3. AWS WAF 管理画面から、WAF でブロックしていないか確認

テストアクセスから数分待ってから行う

- AWS WAF の管理画面にログイン
- Web ACL に入る (利用リージョンを確認)
- Overview タブの中の「Sampled request」を見つける
- 「Find sampled requests」よりエラーが発生した URI パスをドメイン抜きで入れる
- 絞り込み結果からアクセスの日時を確認し対象のリクエストを見つける
- BLOCK, COUNT, ALLOW なのかを確認
- BLOCK の場合
	- Managed Rule の場合、対象ルールの絞り込みができるのであれば、COUNT 設定を追加し、再度、STEP 2 のエラーを再現に戻って、リクエストがブロックされないかを確認
- COUNT & ALLOW の場合
	- 実は他のルールが BLOCK していないか STEP 2 に戻り、Chrome のヘッダーレスポンスを確認して再度 WAF がブロックしていないかも確認する
	- それでも WAF は通過しているのであれば、次の原因調査に向かう。


## 4. ELB のアクセスログを確認

ELB のアクセスログをとっているのであれば、S3 バケットから該当の日時を確認して、どのようなエラーかを確認。

- アクセスログに `waf, forwaded` が記録されているかを確認。forwarded とは WAF を通過したということ。

ELB でアクセスが止まっている場合は、ターゲットグループやALBのルールの問題なので、それらを見直す。

- ターゲットグループのヘルスチェックが失敗していないか
- ALB ルールがきちんと意図したターゲットグループに飛んでいないか


## 5. EC2 や Lambda などのエラーを確認

- EC2, Lambda 内の Apache or Nginx ログを確認し、アクセスがきちんと届いているかを確認。
- 届いている場合はアプリ側の問題
- 届いていなかったら、前面の部分でトラフィックをブロックしているかもなので、STEP2 エラーの再現を取得からやり直し

以上
Docker環境(Debian)でShell実行時に「Syntax error: "(" unexpected」が出る場合の対処法

# はじめに

Docker上でshellを動かした際、記述に問題がないのにSyntax errorが発生しました。
調べてみたところ解決法がわかったので備忘録として残します。

### 環境
python:3.8-buster(Debian 10)

### エラー内容
```
Syntax error: "(" unexpected.
```

## 対処法(1)

https://www.nemotos.net/?p=3419

私はこちらの手順で無事解決しました。
原因としては`/bin/sh`へのシンボリックリンクが`dash`だったことでした。

### 対処法(2)

こちらはChatGPTに聞いてわかった方法で、
`/bin/sh`へのシンボリックリンクを`/bin/bash`に変更します。

```bash
ln -sf /bin/bash /bin/sh
```

変更が出来たか以下のコマンドをご確認ください。

```bash
ls -l /bin/sh
```

以上です。

# 最後に
誰かのお役に立てれば幸いです。
初心者エンジニアによる備忘録　自己紹介編

Hello World!
　初めてブログを書くので若干戸惑いもありますが、自分自身の備忘録のためにあれやこれやと書き残しておこうと思います。
　まず自己紹介から。
　私は過去１０年間中学校の数学の教師をしていました。もともとは中学校の吹奏楽の顧問の先生に憧れて、「おれもアツい気持ちを生徒に伝えられるような教師になりたい！」と思ったのがスタートです。パワハラ上司に鍛えられながら日々の業務をこなし、それなりに力はつけていったつもりです。しかし独身時代は楽しくてやりがいのある職業でも、結婚し、家族が増えると気持ちだけでは成り立ちません。ワークライフバランスがとれなくなってきました。
　「ここまでは授業の準備をしたい！」「明日までにクラスの掲示物をつくりたい！」などやりたいことはたくさんあるのですが、家庭を放置するわけにはいけません。しかし次第に家庭内に様々な無理が重なり、ついに妻の体調が崩れてしまいました。
　妻の体調を崩してしまうほどに家庭をないがしろにしてしまった自分自身、深く反省すると共に、これからの時間の使い方を真剣に考えました。
　その結果私は家族のみんなが毎日笑ってすごせるよう、自由な働き方を求めて転職を決意しました。
　もちろんIT業界でそんなに簡単に自由な働き方ができるとは思っていません。しかし少しずつでもIT業界でキャリアを積み、最終的には実現したいと考えています。
　このブログでは自分が日々学習していることを備忘録的に活用していこうと思います。元々は自分自身のためのものですが、他の方々の参考になれば幸いです。
プログラミングと格ゲー

- 最適なプログラミング対座禅の比率はいかほどか。これをPZ比率と呼ぶことにする。
- プログラミングに関しては自分は短刀をどうにかやりくりして使いまわしているような感じがする。出来るプログラマであれば大槍や大剣を何本か持っていそうなイメージだが。
- 僕は格闘ゲームもスマブラでも1体のキャラを使い続ける。モンスターハンターではライトボウガンを使い続けた。スターバックスに行くと必ず抹茶のティーラテを頼む。1個のものが好きなのかもしれない。プログラミングでもそれは同じだ。出来るなら1個のものを極めたい。
- 日本語版のStackoverflowの質問に答えようとしている。回答しても自分のスキルなんかまるで上がらないような質問だってある。だけどなんというか問題解決スキルのような根本スキル的なものが伸ばせないだろうかと思ってやっている。
- 「目の前の問題にクイズあるいはゲームのように挑戦する」「カフェで音楽や人の話し声に紛れながらただひたすらゆっくりする」「親しい人たちと笑いながら話す」。そのようなことが好きだ。
- カフェで何もせずにゆっくりする。人生の真髄だ。けれどPCを持ち込んでおり少々は何かをしてしまう。まあ完璧じゃなくても良いや。
- Qiitaの質問枠やTeratailでは質問の総量が少なすぎるのでStackOverflowの回答者にチャレンジしてみても良いかも知れない。英語の勉強にもなるし。たとえ間違った答えをしても誰かが低評価をつけてくれるだろう。
- あまりにも同じスターバックスに居すぎてスターバックスと同化してしまうんじゃないかと思う。
- 日本人のメンタルのトータル1割ぐらいはLINEの新着状態に左右されているんじゃないだろうか。そのぐらいLINEは日本人の意識ハックに成功していると思う。それが幸福なことなのかどうかはさておき。
- SNSは寂しさを紛らわしてくれると同時に寂しさを増幅する。お酒は苦痛を紛らわしてくれると同時に苦痛を増幅する。つまりみんなご存知のとおりSNSはアルコールである。
- 瞑想をしても寂しさは消せない。人間関係に瞑想は弱い。たとえば無人島に送り込まれてひとりぼっちになったら瞑想なんてしても物の役にも立たないだろう。
- 日常のほとんどの時間において安らぎの感覚はない。いつでも何らかの緊張や不安があるものだ。やすらぎたい。誰かと手をつなぎながら横にいる時間が唯一安らげる時間かも知れない。あとはサウナや岩盤浴にいる時。
- 座禅をしていると安らぎのようなものが生まれる時もある。日々の不安が軽くなる。いつもあたたかい安らぎに包まれていたい。心にATフィールドがほしい。
- 無私そして無為。それが座禅の本質だ。でもあとひとつ何かないだろうか？
- 座禅をすることでプログラミングの腕まで上達しないだろうか。メンタルが安定して結果的に開発がうまく進むということはあると思う。
- 情報は人を殺すことも出来る。確か戦国時代に本城が落ちたと思い込んで自決した侍たちがいたんじゃないだろうか。情報は事実とベッタリと張り付いている部分があり、そのインパクトはなかなか意識でのコントロールさえ難しい。気を確かに持て。
- 1日でも何かを気に病んでいると次の日にはどっと疲れているような気がする。特に理由が思い当たらないのに妙に疲れていると思った時はこれが原因かもしれない。
- スターバックスで学生っぽい男性二人組が店に入ってきた。そしてもう何も注文せずに30分は話し込んでいる。謎に1リットルのコーヒー牛乳をテーブルに置いてたまにストローで飲んでいる。あと30分何も注文していなかったらちょっと話しかけてみようか。今はモバイルオーダーもあるからとりあえず席に座ってから注文するパターンもあるのだがどうやらただ座っているだけのような気がする。休日に何もせずゆっくりしていると色々なものが目に入ってきてしまう。そう思っていたらついに店員さんが話しかけて二人は財布を取り出してレジに向かった。あわよくば無銭で居続けるつもりだったんだろうか。それとも学生のノリでしばらくはしゃいでいただけなのか。謎だ。
- 言語は国を問わずにどの場所でも自然的に生まれた。プログラミング言語は多分そうではない。不自然的だ。
- スターバックスの向こうの席にスターバックスののマークが描かれた洋書を置いている人がいる。スターバックス研究に来ているんだろうか？思わず書名をGoogleで調べた。
- スターバックスでは周りをよく見ると誰も彼もが何かをしている。PCで作業をしていたり勉強をしていたりスマホを操作していたりする。何もせずにゆっくりしている人が誰もいない。向こうの太った男なんかはスマホを操作しながらフラペチーノを飲みそしてワッフルをかじっている。ちょっと不気味にさえ思えた。そういう自分だって何もしていないように見えて今は「ゆっくりする」「周りを見る」という行為をしているわけだけれど。
- 前にGUで買ったシャツはSサイズなのにブカブカとしている。あとから知ったがオーバーサイズシャツというらしい。なにそれ。色違いを2着同時に買って片方は着ていない。だがGUに返品に行ったらにおいがついているせいで返品できないという話だった。GUに対する僕の信頼度は少し下がった。オーバーサイズシャツってなんだよ。



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
【Ubuntu 22.04】AWS CLI を インストールしようとしたら少しだけ詰まった

## Ubuntu 22.04 でのインストール

Ubuntu 22.04 で aws-cli をインストールしようとしたら、
ほんの少しだけ詰まったので、解決方法を共有します。

同じような問題で困っている人がいれば、参考にしてみてください。

### 問題 : snapが悪さをして、aws コマンドが実行できない

インストール後、一般ユーザで`aws`コマンドを実行しようとすると、↓のようなエラーが。

```
$ aws --version
/snap/aws-cli/161/usr/bin/python3: can't open file '/snap/aws-cli/161/bin/aws': [Errno 2] No such file or directory
```

どうやらsnapのbinのほうが優先して参照されてしまうらしい。

同様の事象でみな困っている様子
https://github.com/aws/aws-cli/issues/5142

### 解決策 : snap でアンインストールする

インストールした覚えはないが、アンインストールすることで解決しそう。

```
$ sudo snap remove aws-cli
```

### ターミナルからログアウトしてから、コマンド確認する

アンインストール後いったんターミナルから離れないと、キャッシュが効いていてエラーが出る。
(`bash: /snap/bin/aws: No such file or directory`)
これはいったんログアウトすることで解決する。
- 参考 : https://forum.snapcraft.io/t/snap-bin-npm-no-such-file-or-directory-after-snap-remove-node-and-installing-node-via-apt/11981

```
$ aws --version
bash: /snap/bin/aws: No such file or directory

// Ctrl + D
$ logout

// 再ログイン後
$ aws --version
aws-cli/2.8.0 Python/3.9.11 Linux/5.15.0-48-generic exe/x86_64.ubuntu.22 prompt/off
```

## 終わりに

snapでaws cliをインストールすることでも解決できそうな気はしたが、
公式の手順でインストールするほうが安心だしつねに最新版を追えるので、snapつかうのはやめておきました。

しかもsnapのほうは更新が止まっているみたい。(↑のissueのページで`@sturfee-petrl`さんが言及している)

パッケージマネージャは便利だけど、思わぬ罠もありますね。
z-indexで親要素の下に子要素を持ってく方法

## コードから

```inde.html
<div class="background"> 
    <div class="parent">
        <div class="children"></div>
    <div>
</div>
```

```style.scss
.background {
    //背景色がある場合はこれらを指定しないと、下に潜り込んでしまう。
    position: relative;
    z-index: 0;
}
.parent {
    //位置決め
    position: relative
}
.background {
    position: absolute;
    z-index: -1;
}
```
調べたら色々な方法があるけれど、絶対位置で実装する場合はこの方法が一番楽（？）かな。
これで子が背景と親の真ん中に入り込んでいい感じ。
なんでz-index0よりもz-index-1が上に行くんだろう、不思議だね。

## 感想
記事とかあんまり書いたことないので、分かりにくい所、補足した方がいい所とかありましたら、教えてください。

## 参考 　
[CSSのz-indexで親要素より下に子要素を配置する](https://shu-sait.com/z-index-koyouso-shita/)
雀魂 同卓者のプレイヤー名を伏せる

:::note warn
**スクリプトの利用は、自己責任でお願いします。**
:::


同卓者のプレイヤー名を伏せるスクリプトです。開発者ツールで実行できます。


```JavaScript
// 同卓者のプレイヤー名をそれぞれ上家、対面、下家に書き換えます。
// ただし、友人戦の同卓者と、認証マークの付いたプレイヤーは除きます。
// 対局前や牌譜閲覧前に実行する必要があります。
view.DesktopMgr.prototype._initRoom ??= view.DesktopMgr.prototype.initRoom;
view.DesktopMgr.prototype.initRoom = function(config, players, target_id, mode) {
    const names = ["自家", "下家", "対面", "上家"];
    const jicha = players.find(player => player.account_id === target_id) || players[0];
    for (const player of players) {
        if (
            mode === view.EMJMode.live_broadcast
            || config.meta.room_id
            || player.verified
            || player.account_id === GameMgr.Inst.account_id
            || !player.account_id
        ) continue;
        player.nickname = names[(player.seat - jicha.seat + 4) % 4];
        player.verified = 0;
    }
    this._initRoom(...arguments);
};

// プロフィールと牌譜一覧のプレイヤー名を即時非表示にします。
uiscript.UI_OtherPlayerInfo.Inst.name.visible = false;
for (const item of uiscript.UI_PaiPu.Inst.scrollview._items) {
    for (let i = 0; i < 4; i++) {
        item.container.getChildByName("p" + i).getChildByName("name").visible = false;
    }
}
```

ゲームを再起動するか、次のコードを実行すると、元の状態に戻ります。

```JavaScript
// プレイヤー名を書き換えないようにします。
// 対局前や牌譜閲覧前に実行する必要があります。
view.DesktopMgr.prototype.initRoom = view.DesktopMgr.prototype._initRoom;

// プロフィールと牌譜一覧のプレイヤー名を即時再表示します。
uiscript.UI_OtherPlayerInfo.Inst.name.visible = true;
for (const item of uiscript.UI_PaiPu.Inst.scrollview._items) {
    for (let i = 0; i < 4; i++) {
        item.container.getChildByName("p" + i).getChildByName("name").visible = true;
    }
}
```
MVCモデルについて

# 本記事の目的
MVCモデルの適切な使いかたについてまとめ、「拡張性が高く、使い回しの効くコードを作成をする」ためにはどのようにモデルを設定すべきか考える。
## 3層アーキテクチャ
Modelは3層アーキテクチャにおけるドメイン層、データ層を担い、ViewとControllerは3層アーキテクチャにおけるプレゼンテーション層を担う。
## View
3層アーキテクチャにおけるプレゼンテーション層を担う。
### ユーザの操作に伴うシグナルの発火
ボタンが押される、テキストボックスに文字が入力されるなどユーザの操作を把握する必要がある場合に設定する。

### 表示の変化
カラーピッカーや異常値が入力された際のエラー表示などの事前に設定された情報のみで管理可能な処理を設定する。

### コールバック
クリック時に行われる操作をclickCallback()にまとめる
senderを用いてシグナルを発火したオブジェクトを辿ることで、少ないコード量で別々の処理を行わせることができる。

### UIライブラリへの依存
ユーザー側の要求によってWeb、スマートフォン向け、Windows向け、Unix向けのように変化し、言語もPython、Go、Javaのように変化する
UI表示はこの要求による影響を最も受けることから汎用的に使いまわすことは難しい。

### 入力と出力
入力はユーザの操作、出力は表示の変化
ユーザーの操作はControllerモデルに送信される。
その後Controllerモデルからの出力を受取り、そのまま出力される。

### まとめ
ユーザが操作するUIであり、その入力に基づいた表示を行う。
汎用性を高くする需要は低く、寧ろユーザーごとに適切な実装をすることが求められる。
入力はControllerモデルに送信し、Controllerモデルの出力をもとに表示を変更する。

## Controller
3層アーキテクチャにおけるプレゼンテーション層を担う。
### Viewで受けた入力をもとに必要な処理を持つModelを設定する
処理の順番、入力以外に必要な情報の要求などを行う。
処理も記述するが、Viewの表示のために必要な処理のみを記述し、Viewが不必要になった際にControllerも削除可能な状態にする。

### 入力と出力
入力はユーザーの操作によって得られたデータ、出力はViewの求めるデータ形式に沿ったデータ
ユーザの操作によって得られたデータをもとに多様なModelを用いて処理する。
その後Modelによって処理されたデータをViewの求める形に変更し渡される。

### まとめ
Viewの求める内容の処理の要求とそのために必要な情報の要求を行う。
Viewの内容の変化、Modelの内容の変化に対応しやすいことが大きな魅力。
入力内容をModelを用いて処理し、Viewの求める形にして出力する。

## Model
3層アーキテクチャにおけるドメイン層、データ層を担う

### ビジネスロジックや抽象化された処理を設定する。
ファイルの作成や出力、データ操作、データ通信などを行う。
一つの入力に対して複数の出力内容に変化させることができるように実装することで拡張性を上げることができる

### 入力と出力
Controllerから送られるデータをもとに実際の処理を行い、処理の結果を元のControllerへ渡す
入力と出力はControllerの内容によって多彩に変化する。

### まとめ
最も汎用性を高くなるように実装し、使い回しを効かせる必要がある。

## 全体のまとめ
MVCモデルにおけるViewとControllerが3層アーキテクチャにおけるプレゼンテーション層であり、Model層が3層アーキテクチャにおけるドメイン層、データ層を担うことからMとVCに分けて考察を行った。
大規模な開発ではMVCを分ける必要があるが、小規模な開発の場合はViewとControllerはまとめて実装しても良いが、Modelは分けて実装したほうが効率が良いように感じた。
Laravelで"The Mix manifest does not exist"が出た時の対処法

## 開発環境
Laravel 8.0
PHP 8.1.4

## エラー発生状況
1.新規アプリ作成 & アプリ起動できること確認
```terminal:terminal
 composer create-project "laravel/laravel=8.*" アプリ名
 php artisan serve
```
2.bladeファイルでcssを指定するため以下を記載
```php:resources/views/welcome.blade.php
 <link rel="stylesheet" href="{{ url(mix('css/app.css')) }}">
```
4."The Mix manifest does not exist"が発生

## 対処法
以下実行後、アプリ再読み込みでエラーが消えることを確認
```terminal:terminal
npm install
npm run dev 
```

## 参考記事
https://stackoverflow.com/questions/43815086/laravel-mix-generates-relative-paths

https://qiita.com/minato-naka/items/bfc3bbd9a388084e6f17

### 追記 
2022/10/04
公式ドキュメントにLaravel Mixを使う場合はinstallとrunしましょうと記載がありました。
https://laravel.com/docs/8.x/mix#installing-laravel-mix
Bigquery 日付に時間を加算して別の日付を得る

# クエリ

```sql
SELECT DATE((DATETIME_ADD(('2022-10-03 00:00:00'), INTERVAL 100 HOUR)))
```

# 結果

2022-10-07 が得られる


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
CloudFunctionsで"Your client does not have permission to get URL /** from this server"に遭遇した時の解決策

<h2>初めに</h2>
今回はCloudFunctions実行時に403に遭遇したので解決策を記述します。<br/>
エラー内容は以下の通りです。

```
"Your client does not have permission to get URL /** from this server"
```
<h2>解決策</h2>
<h4>結論：権限を追加することで解決します。</h4>
<h3>1. 「権限」ボタンをクリック</h3>
CloudFunctionsのコンソール画面にある対象の関数のチェックボックスを選択し、<br/>
以下の画像の「権限」ボタンをクリック。

![スクリーンショット 2022-10-03 18.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854023/5e891cd6-4c3b-3ae2-68b3-7331806c1371.png)

<h3>2. 権限を付与</h3>

![スクリーンショット 2022-10-03 18.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854023/77e16d6b-c058-0f24-2334-df5eab7a3108.png)

上部画像の「プリンシパルを追加」ボタンをクリック。
その後以下の画像に遷移します。

<h4>1. 新しいプリンシパルに「allUsers」を入力<br/>
2. ロールに「Cloud Functions 起動元」を選択</h4>

![スクリーンショット 2022-10-03 18.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854023/7267b138-48a3-0499-ceb5-419ee3e94d99.png)

その後「保存」ボタンをクリック。

<h2>最後に</h2>
2020年1月15日以降、Cloud Functionsの関数に関して、未認証の場合は呼び出しできない用になったそうです。
今後CloudFunctionsを使用する場合は覚えておきましょう。