OmniAICreator/Qiita-1.07M huggingface dataset:
「AssertionError: Torch not compiled with CUDA enabled」とpytorchがGPUを認識しない時

# Pytorchでcudaが使えない時どうするか？

　Pytorchをconda環境で使っているときに、
```
AssertionError: Torch not compiled with CUDA enabled
```

エラーに出会うことがあります。
そんな時は、
```
conda install -c pytorch pytorch
```
とすると解決します。

# 詳細な原因
　詳細な原因と解決策は以下の通りです。

## エラーの詳細

**エラー文**

```
>>> import torch
>>> torch.cuda.current_device()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/hogehoge/yes/envs/gpu_test/lib/python3.7/site-packages/torch/cuda/__init__.py", line 479, in current_device
    _lazy_init()
  File "/home/hogehoge/yes/envs/gpu_test/lib/python3.7/site-packages/torch/cuda/__init__.py", line 208, in _lazy_init
    raise AssertionError("Torch not compiled with CUDA enabled")
AssertionError: Torch not compiled with CUDA enabled
```

## 原因
　エラーの原因はPytorchはcudaサポートがあるバージョンとないバージョンがあるためにGPUが認識しないと言うのが原因らしいです。

## 解決策
　解決策は、以下のコマンドを、好きなconda環境で　打つことらしいです。
なんで解決するかは知りません。

```
 conda install -c pytorch pytorch
```

# 参考

[AssertionError: Torch not compiled with CUDA enabled #30664](https://github-com.translate.goog/pytorch/pytorch/issues/30664?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=op,sc#issuecomment-570088903)
IBM Cloud Classic の Windows VSI をオーダーする時セキュリティーグループ「allow_all」だけをアタッチするとパスワードが表示されない


ちょっとハマったのでメモです。

# Windows VSI のパスワードが表示されない

IBM Cloud Classic の Windows VSI に セキュリティーグループ「allow_all」をアタッチしてオーダーしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/7b327724-b8c5-12d6-7987-6b2cb2a9385b.png)

活動状態にはなったのですが、パスワードが表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/59b4addf-d6b9-55ef-bedf-6ac6e3bfe4b4.png)

# Linux ならセキュリティーグループ「allow_all」だけをアタッチしてもパスワードが表示される

Linux の場合は「allow_all」だけをアタッチしてもパスワードが表示されます。
それで何が悪いかわからずハマって悩みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/267a1927-7605-cb58-b558-643f8c300f6f.png)

# Linux と Windows でパスワードの通知方法が違うみたい

どうも Windows の場合は内部でパスワードを設定して、それをプライベートネットワークを利用した外部向け通信で IBM Cloud インフラに通知するようです。

# セキュリティーグループを設定しないか「allow_outbound」もつければ OK

外部向けの通信を許可してやればいいようです。

1つ目はの回避方法は、セキュリティーグループを設定しないことです。
すべての通信が許可されます。

2つ目はの回避方法は「allow_outbound」も設定し、外部向け通信も許可することです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/0b0029a1-5993-d018-3a77-ff6f17b54c1b.png)

この方法でもパスワードが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/bb517fc4-e237-0426-ab96-ad83feebfb5b.png)

# 何をやってるか分からないときに制約をかけない

どんな方法で IBM Cloud がプロビジョニングを行っているか利用者からは不明です。
それにもかかわらず、中途半端な制約をかけたのがいけませんでした。
理解していないことはやるべきでない例でした。
インターネットに接続していないVPC上のVSIからIBM CloudのAPIを呼び出す

インターネットに接続していないVPC上のVSIからIBM CloudのAPIを呼び出してみる。
環境はCentOS 7。

(1)
https://cloud.ibm.com/iam/apikeys
でAPI keyを作成し、VSIのコマンドプロンプト上で変数にセット。

```
# APIKEY=xxxxxxxxxxxxyyyyyyyyyyzzzzzzzzzz-aaaaaaaa
```

(2)
上記のAPI keyを使ってIAM tokenを取得し、セット。

```
# curl -sk -X POST --header "Content-Type: application/x-www-form-urlencoded" --header "Accept: application/json" --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" --data-urlencode "apikey=$APIKEY" "https://private.iam.cloud.ibm.com/identity/token"
```

出力内の、access_tokenの値（下記画像で水色に反転させている部分）をコピーして、変数iam_tokenにセット。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/d0afed66-8edf-3136-8695-c248bb64a67e.png)

```
# iam_token=eyJraWQiOiIyMDIyMDUxNjA4MjUiLCJhbGciOiJSUzI1NiJ9.eyJpYW1faWQiOiJJQk1pZC0yNzAwMDY2VjZKIiwiaWQiOiJJQk1pZC0yNzAwMDY2VjZKIiwicmVhbG1pZC
（後略）
```

iam_tokenに値が入った事を確認。

```
# echo $iam_token
eyJraWQiOiIyMDIyMDUxNjA4MjUiLCJhbGciOiJSUzI1NiJ9.eyJpYW1faWQiOiJJQk1pZC0yNzAwMDY2VjZKIiwiaWQiOiJJQk1pZC0yNzAwMDY2VjZKIiwicmVhbG1pZC
（後略）
```

(3)
iam_tokenを使うことでVPCエンドポイントに対してコマンドを実行可能。
https://cloud.ibm.com/docs/vpc?topic=vpc-service-endpoints-for-vpc&locale=en

例えば、インスタンス一覧を表示するコマンド。
https://cloud.ibm.com/apidocs/vpc/latest#list-instances

```
# curl -X GET "https://jp-tok.private.iaas.cloud.ibm.com/v1/instances?version=2022-05-31&generation=2" -H "Authorization: Bearer $iam_token"
```

# jqコマンドを入れておけると便利

もし一時的にFloating IPやPublic Gateway経由でインターネットに繋ぐことが可能であれば、jqコマンドをインストールしておくと、iam_tokenをセットする際に便利である。
```
# yum -y install epel-release
# yum -y install jq
```

jqのインストールが終わったら、インターネットから切り離してOK。

jqを使うと、上記の手順2のところで、下記のようにiam_tokenをセットでき、一手間省ける。

```
# iam_token=`curl -sk -X POST --header "Content-Type: application/x-www-form-urlencoded" --header "Accept: application/json" --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" --data-urlencode "apikey=$APIKEY" "https://private.iam.cloud.ibm.com/identity/token" | jq -r '.access_token' `
```

# 下記を参考にしました。
https://qiita.com/testnin2/items/3a4ca8a1a2b79b713c48
https://qiita.com/testnin2/items/2c89c13ad90640f0df91

以上
プロジェクトが git-flow に従っているかどうか監視する GitHub Actions を作った

# はじめに
以前にこのような記事を投稿しました。

[cherry-pick 運用の地獄から這い上がった話をしよう](https://zenn.dev/noraworld/articles/cherry-pick-operation)

一言でまとめれば、会社のプロジェクトでは cherry-pick を使って運用していてとてもつらかったのでがんばって廃止した、という内容です。

そして、今後、二度とこの悪夢のような運用をしないようにするために、プロジェクトが git-flow に準拠しているかどうかを検証する [git-flow observer](https://github.com/noraworld/git-flow-observer) という GitHub Actions を作ったので紹介します。



# 導入方法
以下のような YAML をプロジェクトに追加するだけです。廃止場所は `.github/workflows/git-flow-observer.yml` とします。

```yaml
# .github/workflows/git-flow-observer.yml

name: "git-flow observer"

on: pull_request

jobs:
  git-flow-observer:
    if: github.head_ref != 'main' || github.base_ref != 'develop'
    runs-on: ubuntu-latest
    steps:
      - name: "Observe"
        uses: noraworld/git-flow-observer@v0.1.0
        with:
          head: "develop"
          base: "main"
```

`"main"` と書かれている部分は必要に応じて `"master"` に置き換えてください。



# 仕組み

* 以下のような PR をマージしたあと、`main` ブランチに追加されたコミットを `develop` ブランチにマージバックせずに新しい PR を作成した場合に失敗します
    * `main` ブランチにのみ存在するコミットがマージコミットのみの状態で、`develop` ブランチにマージする PR
    * 追加コミットのあるリリースブランチを `main` ブランチにマージする PR
    * ホットフィックスブランチを `main` ブランチにマージする PR
    * cherry-pick されたコミットがある PR
* `main` ブランチから `develop` ブランチにマージする PR を作成した場合はスキップされます (マージバック PR)

失敗した場合は git-flow に準拠していないことがわかります。



# おわりに
もともと、しっかりと git-flow に基づき運用されているプロジェクトであればこれは必要ないかもしれませんが、ぼくが所属しているプロジェクトのように適当な運用になりがちなプロジェクトではこのような仕組みで厳密にチェックするとハッピーになれるかもしれません。
バッファオーバーフローで任意の関数を実行してみた

バッファオーバーフローによる任意コードの実行を試したことが無かったので、簡単な例で試してみました。

# バッファオーバーフローの実行
下記コードを基に、バッファオーバーフローによって`exploitFunc`を実行する方法について考察します。[（コードの参考元）](https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=83242&item_no=1&attribute_id=1&file_no=1&page_id=13&block_id=8)
```bof.c
#include <stdio.h>

// 攻撃コード
void exploitFunc(){
  printf("exploit!\n");
}

// バッファオーバーフローを起こす関数
void vulFunc(){
  void** vul_var = (void **) &vul_var;
}

// メイン関数
int main(void){
  vulFunc();
  return 0;
}
```

## スタックの状態
上記コードをコンパイルします。
```bash
$ gcc -O0 -g bfo.c
```
その後、GDBを用いて`vulFunc()`内で`vul_var`を宣言した時点での各種情報を収集します。
なお、`vul_var`は自身のアドレスを値として格納しているので、`vul_var[]`は自身のアドレスを起点とする`void *`型の配列と見なせます。
これにより、スタックの読み書きを簡便に実現できます。

```bash
Breakpoint 2, vulFunc () at bfo.c:9
9       }
-- スタックの確認 --
(gdb) p vul_var[0]
$1 = (void *) 0x7fffffffde70
(gdb) p vul_var[1]
$2 = (void *) 0x237c98ebd73e7b00
(gdb) p vul_var[2]
$3 = (void *) 0x7fffffffde90
(gdb) p vul_var[3]
$4 = (void *) 0x5555555551cc <main+18>
(gdb) p vul_var[4]
$5 = (void *) 0x0

-- レジスタの確認 --
(gdb) info register
（中略）
rbp            0x7fffffffde80      0x7fffffffde80
rsp            0x7fffffffde70      0x7fffffffde70
（中略）
```
以上の出力から、`vul_var`を宣言した時点でのスタックは下図の状態であると推測できました。
![BOF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471917/661c1cf4-2854-bc1e-eb41-a869e79640ad.png)

## 攻撃コードの実行
vul_var[3]に戻りアドレスが格納されていると推測できたので、バッファオーバーフローで戻りアドレスを攻撃コード`exploitFunc()`のアドレスに書き換え、実行を試みます。
```bof.c
#include <stdio.h>

// 攻撃コード
void exploitFunc(){
  printf("exploit!\n");
}

// バッファオーバーフローを起こす関数
void vulFunc(){
  void** vul_var = (void **) &vul_var;
  vul_var[3] = exploitFunc;  // 追加した式
}

// メイン関数
int main(void){
  vulFunc();
  return 0;
}
```

上記コードをコンパイルし、実行します。
```bash
$ gcc -g -O0 bof.c
$ ./a.out
exploit!
Segmentation fault (core dumped)
```
Segmentation faultが起きたものの、`exploitFunc()`が実行されているのを確認できました。

なお、`vul_var[1]`に相当するアドレスには、[カナリア](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c905.html#:~:text=%E3%82%AB%E3%83%8A%E3%83%AA%E3%82%A2%E3%81%AF%E3%80%81%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0%E9%A0%98%E5%9F%9F,%E7%A0%B4%E5%A3%8A%E3%81%8C%E6%A4%9C%E5%87%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)が格納されていると推測されます。
> カナリアは、ローカル変数領域のあふれによるスタック破壊を検知するためのものである。（中略）、関数からのリターン直前にカナリアの値が書き変わっていないかがチェックされ、スタック破壊が検出される。

実際に`vul_var[1]`の値を0に書き換えて実行したところ、以下のように実行がabortされました。
```
$ ./a.out 
*** stack smashing detected ***: terminated
Aborted (core dumped)
```

# 感想
今回は非常に簡単な例でしたが、バッファオーバーフローはサービス妨害攻撃(DoS)の手段となるだけではなく、様々な攻撃の足掛かりとなり得るのを実感できました。
CASB とは

## 勉強前イメージ

セキュリティのチーム的な？

## 調査

### CASB とは

Cloud Access Security Broker の略で、キャスビーと読みます。
組織のクラウドサービスを利用する際のセキュリティを一括で管理する役割を果たすものを総称してCASBと呼びます。
気軽にクラウドサービスを使えるようになった反面、管理されていないサービスを利用する [シャドーIT](https://qiita.com/miyuki_samitani/items/e731054526ca7e845c29) が増え、
クラウドサービス上の機密情報の保護や不適切な利用による情報漏洩防止の目的で使用されています。
クラウドサービスと利用者の間にCASBを設置して、認証やアクセス制御・マルウェア対策などセキュリティポリシーを適用します。

### CASBの方式

- API方式

APIを利用してクラウドサービス上のデータなどに不適切なものがないかどうか確認します。
APIが利用できるものに限定されてしまいます。

- proxy方式

経路上でクラウドサービスへのアクセス検査をして、事前に決めていたポリシーに従って制御を行います。
クラウドサービスのオーナーによらず対応が可能です。

- ログ分析方式

既存のゲートウェイ機器のログを分析してクラウドサービスの利用状況を可視化します。

## 勉強後イメージ

シャドーITを一括管理・・・って感じ？
基本OKしてないクラウドサービスはだめっていうのができるのね

## 参考

- [意外と知らない？ITトレンド用語](https://www.ntt.com/bizon/glossary/e-c/casb.html)
- [CASBとは？種類や主要機能、導入する際のポイントを解説](https://www.nri-secure.co.jp/blog/cstar2018_casb)
デカルト「自分の認識疑わないヤツおる？」

# 目次（3分で読めます）

1．[それはアルゴリズムの問題文を読んでいた時のこと。](#それはアルゴリズムの問題文を読んでいた時のこと)
2．[デカルトが聞いて呆れるぜ](#デカルトが聞いて呆れるぜ)

## それはアルゴリズムの問題文を読んでいた時のこと。

問題文「カードの束について、上から一番目のカードを下から一番目に、上から二番目なら下から二番目に並び替えてください。」
<br></br>
一般自然人なら間違いなく、配列を反転する関数が存在するか<b><font color="Red">疑問に思い</font></b>、そしてググるはずだ。
### しかし、<b>「法学部卒・自称論理自信ニキ」であるワイは違った。
<br></br>
論理自信ワイ「あっ、配列を反転する方法閃いちゃったわ（ﾆﾁｬｱ）」
<br></br> 
ぼくがかんがえたさいきょうの配列反転アルゴリズム
![1655051258989.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/50da40de-b29b-6970-f321-f7c127cdc101.jpeg)
反転させたキーをそれぞれのvalueに結び付ければ完成である。


### あまりに一瞬で思いついたが故に、「もしかしてボク、またやっちゃいました？？」とまで思っていたのだ。

<br>
そして満足気に解き終わった後、ふと配列を反転させる関数があるか調べてみると

### _array_reverse()_
<br>
草。以上です。

# デカルトが聞いて呆れるぜ

ワタクシは哲学なんて全然かじりもしていないけど、この出来事でデカルトの<b>あらゆることを疑いまくる姿勢を思い出した。

彼はあらゆる物事を疑い、そして最後にたどり着いた結論は「疑っている自分の存在は疑えない」というヤツ。
相当クレイジーだ。

1600年代前半に生きたデカルトでさえ疑いまくってたのに、2022年を生きるワイは疑いすらしなかった。
愚の骨頂である。

ましてや東洋哲学では紀元前600年ぐらいに既にヤージュニャヴァルキヤが物事を疑いまくってたようで。
<br></br>
### とりあえず、自分の考えを疑う癖を付けとこ
<br></br>
そうデカルトは教えてくれた。ありがとうデカルト。いっぱいちゅき。
<br></br>
エンジニアには<b>会議ではなく懐疑をすることが必要</b>ってわけだな（激寒）
戻り値がvoidなメソッドで、式形式メンバー＋三項演算子を使う

できるのかな？と思って興味本位でなんやかんややってみたのでメモです。

次のようなメソッドがあるとします。
```csharp
void DoSomething()
{
    // 何らかの処理
}

void DoSomethingIfNeeded(bool isNeeded)
{
    if (isNeeded)
        DoSomething();
}
```
この時、`DoSomethingIfNeeded` をシンプルに式形式メンバーで書きたいと思いました。イメージとしてはこんな感じ。
```csharp
void DoSomethingIfNeeded(bool ifNeeded)
    => isNeeded ? DoSomething()
                        : null;
```
上記コードはコンパイルが通りません。`void` なのに `null` を返しているからです。

だったら処理のない `DoNothing` 的なメソッドを実行させれば良いのでは？と思い、次のように書いてみました。
```csharp
void DoNothing()
{
    return;
}

void DoSomethingIfNeeded(bool isNeeded)
{
    isNeeded ? DoSomething()
                  : DoNothing();
}
```
しかしこれもコンパイルエラーになります。

> CS0201: 代入、呼び出し、インクリメント、デクリメント、新しいオブジェクトの式のみがステートメントとして使用できます

なるほど…。それなら三項演算子には、どのメソッドを呼び出すかの判定だけをしてもらえばいいのでは？

ということで下記のように書いてみました。
```csharp
void DoSomethingIfNeeded(bool isNeeded)
    => ( isNeeded ? DoSomething : DoNothing )();
```
これなら、やっていることは `DoSomething` か `DoNothing` かだから通るでしょう、という魂胆です。しかしこれも通りません。

> CS0149: メソッド名が必要です

そうですか…。

いやいやおかしいでしょ、実行すべきメソッドを決定しているのに、メソッド名が必要なのは変では？と思い調べてみたところ、以下の記事にたどり着きました。

https://qiita.com/vranometria/items/cfe6f282d7973ae7f52b

キャスト…。どちらも `Action` であることは明らかだと思うのだけど、明示的なキャストが必要なのか…。何故…。

キャストを入れてみます。
```csharp
void DoSomethingIfNeeded(bool isNeeded)
    => ( isNeeded ? (Action)DoSomething : DoNothing )();
```
これでコンパイルが通りました。

あとは、何もしない処理にわざわざ `DoNothing` という名前を付ける必要もないので匿名化します。
```csharp
void DoSomethingIfNeeded(bool isNeeded)
    => ( isNeeded ? (Action)DoSomething : () => { } )();
```
これで一応、当初の目的は達成できました。`DoSomething` に簡単な処理を入れて実行してみます。
```csharp
void DoSomething()
{
    Console.WriteLine("hoge");
    Console.WriteLine("fuga");
}

void DoSomethingIfNeeded(bool isNeeded)
    => ( isNeeded ? (Action)DoSomething : () => { } )();

DoSomethingIfNeeded(true);
Console.WriteLine("piyo");

// hoge
// fuga
// piyo

DoSomethingIfNeeded(false);
Console.WriteLine("piyo")

// piyo
```
できました。キャストが必要な理由は勉強が必要。

## 参考
https://qiita.com/vranometria/items/cfe6f282d7973ae7f52b

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members

## その他
ブログとCrieitでも記事を公開しているので、よければご覧ください。

ブログ：BOYISH KINGDOM

https://boyi.sh

Crieit：apashoni

https://crieit.net/users/apashoni
ホームページ制作

Webサイトの制作が目的ではなく、みなさまの問題や課題の解決を目的としてお仕事をさせて頂いております。少しでもWebサイトに関わるお悩みをお持ちの方、ご相談のみでも丁寧にご対応させて頂きます。

https://shogo-adachi.com/
物書きなのにGoogle日本語入力なんて使ってるんですか？SKKを使おうSKKを! Part 1.

# はじめに

前回 [vimでもプレビューしながら日本語記事(マークダウン)が書きたい!](https://jp.magicode.io/RandomScientist/articles/487a68a7200b4e9cb75bd1f9f7309965)

色々書きますけど、結局[ここ](http://coexe.web.fc2.com/skkfep.html)見てください[ここ](http://coexe.web.fc2.com/skkfep.html)!

みなさん、日本語を入力するときにどうやってやってます？まさか  
```
「ことしからかいがいにすみはじめました」
```
って打って、
```
「今年から貝が胃に棲みました」
```

[なんて打ってる事](https://web.archive.org/web/20051125002008/http://www.kanken.or.jp/henkan/happyou.html)なんてないでしょうね？まさかね。。。

でも、実際にタイピングをしていて、あれ？ってなるような変換にであってしまた人は多くいるのではないでしょうか。

これは何故なのかというと、ことえり、google IMEを始めとした日本語入力システムがユーザーに視点で受動的なIME(以下受動的iME)だからです。
天下のグーグル様の作ったアルゴリズムがサジェストする変換候補を与えられるまま、離乳食を食べはじめた赤ちゃんのように、
口を開けて~~涎を誑しながら~~、リターンキーを押しながら変換しているからです。

で、ちょっと難しかったり変則的な熟語がでてくると「辞書」を知らない赤ん坊のように「ママー助けて」といいながらひらがなでググってで出て来た単語をコピペするか、
例えば「鳥兎」と打ちたいけれども、変換してもでてこないので
```
tori[space][return]usagi[space][return]
```
なんてやって、結局googleiMEは「鳥兎」の読みが「うと」だと覚えずじまいで、次い鳥兎と打つ時も同じように3文字(```uto[return][space]```)をうつために8回も余分なキーストロークをしないといけなくなります。

こんな事が許されていいのか!？

それでいいのか人類!もっと能動的に変換しようぜ!

プログラマーならキーストロークの回数にこだわれよ!なんでこんな~~欠陥~~使い辛いIME使ってるんだよ!なんで世の中に受動的IMEしかないと思ってるんだ!日本語が打ち辛くなるじゃらUSキーボードは使わない？甘ったれるな!!!(何様だこいつ)!

能動的IMEなら存在しているんだ! [SKK](http://coexe.web.fc2.com/skkfep.html) という能動的IMEが! [SKK](http://coexe.web.fc2.com/skkfep.html) を使おう!!!そして受動的日本語入力の呪縛から開放されよう!

続きはこちらで
https://jp.magicode.io/RandomScientist/articles/fee543eb38a6488992713ca5c538c1ee
JavaエンジニアによるJavaScript入門2(四則演算、if、for)

## 四則演算
#### Javascript
``` javascript
const test1 = 1;
let test2 = 2;
test2 += 3;
const calculation = test1 + test2;
console.log(calculation);
```
【コンソール出力結果】

``` text
６
```

#### Java
``` java
int test1 = 1;
int test2 = 2;
test2 += 3;
int calculation = test1 + test2;
System.out.println(calculation);
```
【コンソール出力結果】

``` text
6
```

## if
#### Javascript
条件の書き方
JavaScriptの **「イコール」** のルール
**基本的には「===」を使用する**

|使用| 記号 | 違い | 
|:-:|:-:|:-:|
|▲|== |  値が一致 |  
|○|  === | 値が一致　&&　型が一致   | 

###### ifと「==」「===」の使い方
``` javascript
const height = 90;
const strHeight = '90';

if (height == 90) {
  console.log('1つ目の身長は' + height + 'cm');
}

if (strHeight === 90) {
  //型が異なるので出力されない
  console.log('2つ目の身長は' + height + 'cm');
}
```
【コンソール出力結果】

``` text
1つ目の身長は90cm
```
***
JavaScriptの **「not イコール」** のルール
**基本的には「!==」を使用する**

|使用| 記号 | 違い | 
|:-:|:-:|:-:|
|▲|!= |  値が一致 |  
|○|  !== | 値が一致　&&　型が一致   | 
###### 「!=」「!==」の使い方

``` javascript
const height_2 = 91;
const strHeight_2 = '91';

if (height_2 === 90) {
  console.log('身長は90cm');
} else if (height_2 != 90) {
  console.log('身長は' + height_2 + 'cm');
}

if (strHeight_2 !== 91) {
  //型が異なる値での比較で、notイコールの式が「真」となるため下記処理は実行される
  console.log('身長は' + height_2 + 'cm');
}
```
【コンソール出力結果】

``` text
身長は91cm
身長は91cm
```

#### Java
``` java
int num = 1;
int num2 = 1;
if (num == num2) {
	System.out.println("numとnum2は同じ");
}

String str = "a";
String str2 = "a";
if (str.equals(str2) ) {
	System.out.println("strとstr2は同じ");
}
```
【コンソール出力結果】

``` text
numとnum2は同じ
strとstr2は同じ
```


## for
#### Javascript
繰り返し処理の書き方
##### 配列の値全て繰り返す書き方

| 使える書き方か | 書き方 | ES | 説明 | 
|:-:|:-:|:-:|:-:|
| ▲ |  for in |  ES5 |　問題あり。あまり使用しない　| 
|  ○ |  for of |  ES6 |　よく使用する。javaでいう拡張for文| 


``` javascript
const scores = [10, 20, 30];
//if(one of them) という書き方をする
for (const score of scores) {
  console.log(score);
}
```
【コンソール出力結果】

``` text
10
20
30
```

#### Java
``` java
int[] numArray = {10, 20, 30};
for(int i:numArray) {
	System.out.println(i);
}
```
【コンソール出力結果】

``` text
10
20
30
```
Polygon Mumbai Testnetに接続できない時

2022/12/13追記
https://mumbai.polygonscan.com/ のネットワーク追加ボタン調べると
![Screen Shot 2022-12-13 at 3.36.24 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63543/ee17bcff-acbb-77f7-106f-fee412d91f8d.png)

`https://matic-mumbai.chainstacklabs.com` に変更されたもよう？

----

探しても見つかりにくい情報だったのでメモ

RPC URLが
`https://rpc-mumbai.maticvigil.com/`
になっているならば
`https://rpc-mumbai.matic.today`
を試してみるとうまくいくかもしれない

参照: https://ethereum.stackexchange.com/questions/102302/unable-to-connect-to-polygon-mumbai-test-network-using-truffle

公式ページには前者がMetamask設定の説明に書いてあって、ネットワークの詳細ページには後者が書いてある。
https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask/
https://docs.polygon.technology/docs/develop/network-details/network/
ロリポップ！に置いたPythonのCGIでLINE Messaging APIのWebhookを受ける

## 何故こんなことをしたのか？
個人的な諸事情で素早くデモンストレーション用のLINE Botを作りたかったのですが、Lineのメッセージデータを送るWebhookを手軽に設置したかったので、Pythonが動くというロリポップ！を試験的に使ってみました。

LINE公式のPython用サンプルがFlaskを使うものだったのですが、それよりももっと手軽にやりたかったので古のCGIでやっています。時間に余裕があったり、ちゃんとやりたい方はぜひ公式のサンプルを参考にしてください。
https://github.com/line/line-bot-sdk-python

## 手順
### 前準備
アカウント開設系のお話なのですでに準備できている方は飛ばしてしまって大丈夫です🙆🏻‍♂️

1. Line Developersのアカウントを開設
    - Lineのアカウントを持っていれば、すぐに開設できます。
        - https://developers.line.biz/ja/
2. Line Developers内でプロバイダーを作成→チャンネルを作成
    - チャンネルはMessaging APIを選択して作成
3. ロリポップ！でアカウント開設
    - おそらくプランはどれでも大丈夫なはずですが、僕はハイスピードプランです。


## コード
最初に実際にロリポップ！で動くコードから。
<font color="LightGray">（テキストエディタetc.で下記のコードをコピーし`line_webhook.py`という名前で保存してください。）</font>
```line_webhook.py
#!/usr/local/bin/python3.7
import json, os, sys, cgi

if os.environ['REQUEST_METHOD'] == 'POST':
  length, _ = cgi.parse_header(os.environ['CONTENT_LENGTH'])
  data = sys.stdin.buffer.read(int(length))

  json_str = data.decode("utf-8")
  json_data = json.loads(json_str)

  print ("Content-type: application/json\n")
  print ("{}")
```

### 以下コードの補足

最初にロリポップ！のパスを、そのまま設定しています。
https://lolipop.jp/manual/hp/cgi/
```py
#!/usr/local/bin/python3.7
```

<br>

下記では受け取ったデータをJSON形式にしています。
<font color="LightGray">（`json_data`がJSON形式になったもの。）</font>
```py
  json_str = data.decode("utf-8")
  json_data = json.loads(json_str)
```

<br>

こちらは正常に処理できたということで空のオブジェクトをWebhook側に返しています。
```py
  print ("Content-type: application/json\n")
  print ("{}")
```

## サーバー（ロリポップ！）でやること
レンタルサーバーの領域に入り、先ほどの`line_webhook.py`を置き、属性（パーミッション）を755にしてください。
<font color="LightGray">（ロリポップ！FTPとかで入って`line_webhook.py`を適当なところにアップロードするだけで構いません。）</font>

## LINE Developersの設定
作ったチャンネルを開き、「Messaging API設定」のタブの中の「Webhook設定」→「Webhook URL」に先ほどの`line_webhook.py`を置いたURLを設定してください。
![スクリーンショット 2022-06-13 17.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620149/fc7401c0-a015-57ab-9ffb-cb9cb61fac64.png)
↑のような画面になると思いますので「検証」ボタンを押していただければ、Webhookを叩いている処理になります。
↓こんな画面が表示されれば成功です。🙌🏻
![スクリーンショット 2022-06-13 17.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620149/47f6883f-82c8-ec5b-c90d-e37fb002ecb3.png)

## 受け取ったデータ
検証ボタンを押した際`line_webhook.py`の`json_data`は、こんなデータを受け取っています。
```json
{"destination":"xxxxxxxxxx","events":[]}
```
この`destination`と`events`については↓の公式を参照してください。
https://developers.line.biz/ja/reference/messaging-api/#request-body

また、この時点で通常のメッセージetc.も受け取れる状態になっています。LINE Developersのチャンネル内の「Webhook設定」の上の方にあるボット情報のQRコードをLINEアプリで読み取って、友だち追加し、LINEからメッセージを送ると、その内容のJSONが`line_webhook.py`が受け取り`json_data`から取り出せます。

ちなみに、この`json_data`を受け取り、内容に応じてMessaging APIからメッセージを送ってあげればLINEのボットになります。

## 参考
WebhookをPythonのCGIで受けるところは下記を参考にさせていただきました。 🙇🏻‍♂️

https://qiita.com/ekzemplaro/items/66f846cc9fcd640a9b8c
【Unity】Meshを一時的に書き換えるコンポーネント

これが必要となる場面はそんなに多くはないとは思いますが、元のモデルデータには手を加えず、一時的にメッシュを変更したいことがあったので作りました。

# 実現方法
`Awake()` でメッシュをコピーして編集してセットし直し、 `Destroy()` で削除するようにしました。
この方法だと当然プレイ中にのみ編集結果を確認できるということになります。
その分、コンポーネントを外せば元通りになるし、保存データも増えないので気軽に試せるのが良いです。


# サンプル
## 処理内容
複数個の頂点が同じ座標に存在する場合はそれらの法線の平均を算出し、各頂点の法線を平均のものに設定し直すということを行いました。

## ソースコード
```cs:Meshの法線を共通する頂点の平均の法線に書き替えるコンポーネント
#nullable enable
using System.Linq;
using UnityEngine;

/// <summary>
/// Meshの法線を共通する頂点の平均の法線に書き替えるコンポーネント
/// </summary>
public class AveragingNormalLines : MonoBehaviour
{
    private Mesh? modifiedMesh;

    private void Awake()
    {
        this.AverageNormals(this.GetComponent<MeshFilter>());
    }

    private void OnDestroy()
    {
        UnityEngine.Object.Destroy(this.modifiedMesh);
    }

    private void AverageNormals(MeshFilter meshFilter)
    {
        var baseMesh = meshFilter.mesh;

        var normals = baseMesh.normals;
        baseMesh.vertices
            .Select((x, idx) => (Pos: x, Index: idx, Normal: baseMesh.normals[idx]))
            .GroupBy(x => x.Pos)
            .ToList()
            .ForEach(x =>
            {
                var avg = x.Aggregate(Vector3.zero, (sum, next) => sum + next.Normal).normalized;
                x.ToList().ForEach(y => normals[y.Index] = avg);
            });

        this.modifiedMesh = new Mesh();
        this.modifiedMesh.SetVertices(baseMesh.vertices);
        this.modifiedMesh.SetNormals(normals);
        this.modifiedMesh.SetUVs(0, baseMesh.uv);
        this.modifiedMesh.SetIndices(baseMesh.GetIndices(0), MeshTopology.Triangles, 0);
        meshFilter.mesh = this.modifiedMesh;
    }
}
```

## 実行結果
Cubeに上記コンポーネントを付与しました。

プレイしていないときはただのCubeです。
![通常時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/5289a6d1-907e-eabc-15ed-4665a1b98841.png)

プレイ開始すると、法線が書き換わったメッシュが再設定され、ライティングが変化しました。
角丸四角のような法線になるので、辺や頂点付近は隣に置いたSphereに近いライティングとなりました。
![プレイ中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/0295e4c2-cf24-6664-c2e6-3e40f9a9f3f0.png)

プレイ中にメッシュのインスペクタを開くと、そこでも変化を見ることができます。
コピーして何も編集していない場合　→　法線を書き換えた場合
![Cubeのメッシュ変更前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/808956e8-e035-c64e-7002-9f791e89d145.png) ![Cubeの法線を平均化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/fc289382-9ceb-7181-3f2e-47c9f2485359.png)
[javascript,cssアニメーション]魔法陣からテキストが出てくるアニメーション

テキストを入力するだけでメッセージ動画が作れるサービス[Teloppy](https://teloppy.com "Teloppy")を運営しております！
その中で用いたアニメーションのコードを一部紹介したいと思います！
![2dbaa8af327a73c6344a5852b0b133f5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707318/a504d6cf-0df1-57e8-0077-675b3d7bf9fa.gif)
[Teloppyでの動作](https://teloppy.com/telops/us8d9rd2/?message=U2FsdGVkX18wKSb%2BL0GRHgceDC3qI4EJSl0kaF05a24%3D)


まずは、コードの完成形です。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ZErmJRg" data-user="teloppy_com" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/teloppy_com/pen/ZErmJRg">
  Untitled</a> by Teloppy テロッピー | 自分だけのメッセージ動画を作ろう (<a href="https://codepen.io/teloppy_com">@teloppy_com</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



元々こんな感じの魔法陣を
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707318/b2c97aa9-9113-65ae-eedb-a34904bc633d.png" width="200"/>
```css
transform:rotateX(80deg); 
```
でX軸に80度傾けてます。
```css
@keyframes rotate{
    0%{
        transform:rotateX(80deg) rotateZ(0); 
    }
    100%{
        transform:rotateX(80deg) rotateZ(360deg); 
    }
} 
```
そしてこんな感じのアニメーションをつけると、魔法陣が傾いた状態でクルクル回るようになります。
魔法陣が出てくる際に
```css
width:0;
```
から
```css
width:80%;
```
でtaransitionさせることで魔法陣が現れるアニメーションになります。

そして魔法陣のアニメーションが終わったら文字の装飾を
```css
  text-shadow: 0 0 10px #FFE8FF,0 0 15px #FFE8FF,0 0 20px     #FFE8FF,0 0 25px #FFE8FF,0 0 30px #FFE8FF,0 0 35px #FFE8FF,0 0 10px #FFE8FF,0 0 15px #FFE8FF,0 0 20px #FFE8FF,0 0 25px #FFE8FF,0 0 30px #FFE8FF,0 0 35px #FFE8FF;
  top:100px;
  opacity:0;
```
から
```css
text-shadow: 0 0 10px #f5aaf5,0 0 15px #f5aaf5;
opacity: 1;
top:50px;
```
にtransitionでアニメーションさせて終わりです。

text-shadowは文字が神々しく出てくる感じを演出するためのものですが、同時に魔法陣側にもfilter:drop-shadowを一瞬つけてやるといい感じになります。あと、背景に煙をいれてやると雰囲気が上がります（どちらも今回は割愛しましたが、Teloppyの方ではいれてます）


jsの流れで言うと

```js
  const $circle =document.querySelector('.circle img');
  const $catch = document.querySelector('.catch');
  await timer(500);
  $circle.classList.add('is-visible');
  await timer(2000);
   $catch.classList.add('is-visible');
```

読み込み -> 0.5秒待つ　-> 魔法陣出現 -> 2秒待つ -> テキスト出現
になります。ここらへんはアニメーション系のライブラリ使った方が楽かもしれませんね。



Teloppyではこんな感じのアニメーションを多く作ってます。[twitter](https://twitter.com/teloppy_com)のフォローもお願いします:sunny:
WebAPI、マッシュアップとは

# WebAPI
プログラムが直接サービスを利用するために窓口（送受信できるところ）のこと。
この場合クライアントがWebサーバーとなる。それがWebAPIにデータを送信することでデータを受け取ったWebサーバーがその情報をWebブラウザに表示させる。
XMLのような構造化されたデータが返信されるためプログラムにとって受信したデータを処理しやすくなります。

## プログラム同士のデータのやり取り
さまざまな手法があります。
XML-RPC、SOAP、RESTがある。
```XML-RPC```を送信することで処理の実行を要求する```プロトコル```受信するデータ形式もXMLが使われる。

```SOAP```はXML-RPCの機能を拡張したもの

```REST```はプロトコルではなく```設計思想```、シンプルな設計でXMLに限らずJSONのような軽量なデータも利用できることから、SOAPに変わり現代の主流となっています。

# マッシュアップ
複数のWebサービスを使い、組み合わせて新たなサービスを生み出すこと

## 各社のサービスの強みを利用する
サービスの情報は各社が長年積み上げてきたものなので一から作り上げるのは時間がかかる。
なので
それらのWebAPI公開されたことで簡単にアクセスし、利用できるようになりました。

## マッシュアップの注意点
各社のWebAPIの公開が
使用が```変更```になった場合はサービスを```修正```する必要性がある。
```終了```すればそれを利用しているサービスは```継続ができなくなる```。
【Linux】基本コマンド一覧

# 初めに

コンソールでよく使うコマンドについて自分用の忘備録として記事にしておきます。

# コマンド

## cat

ファイルの内容を単純に出力する。

```console
cat file1 file2 ...
```

## ls

ディレクトリの内容を一覧表示する。

```console
ls -l
```

## cp

file1 を file2 へコピーする。

dir という名前のディレクトリへファイルをコピーする。

```console
cp file2 file2(dir)
```

## mv

ファイルを別のディレクトリに移動させる。

ファイルの名前の変更する。

```console
mv file1 file2(dir)
```

## touch

ファイルを作成する。

既に存在する場合は、そのファイルの更新タイムスタンプを更新する。

```console
touch file
```

## rm

ファイルを削除する。

```console
rm file
```

## echo

引数をそのまま標準出力に表示する。

```console
$ echo Hello again.
Hello again.
```

## cd

シェルのカレント・ワーキング・ディレクトリを変更する。
dir を省略するとホームディレクトリに戻ります。

```console
cd dir
```

## mkdir

新たなディレクトリ dir を作成する。

```console
mkdir dir
```

## rmdir

ディレクトリ dir を削除する。

```console
rmdir dir
```
04.10.Cross Tabulation

Cross Tabulation(クロス集計)は主としてカテゴリデータを集計する方法
データの中から複数項目を選んで集計を行う手法

・pd.crosstab(X["A"], X["B"])と書いた場合、Aが縦列、Bが横列となる
・margins=Trueを書くと、総計値のカラムが作成される
pd.crosstab(df[“A”], df[“B”], margins=True)
pd.crosstab(train["marital"], train["y"], margins=True)

```python
#例①
pd.crosstab(df["customer_ENG"], df["Suppliers"], margins=True)

#例②複数アイテムでのクロス集計
pd.crosstab([df["customer_ENG"], df["Suppliers"]], [df["Claim_MFG"], df["Claim_DMG"]], margins=True)
[GoLand] Postfix Completion

# Postix Completion

コードを自動的に補完する機能
funcの後ろに、 . (dot)と対応なキーワードを入力すれば

キーワードと補完されるコードを確認する場所
Preferences > Editor > General > Postix Completion

![Postix Completion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078128/354bb450-87a0-188b-3907-9a39be2396b6.png)

## rr

func　の　Return Value は error のみの場合が適切かと

```go:Before
json.Unmarshal(value, &result).rr
```

```go:After
if err := json.Unmarshal(nil, nil); err != nil {
	return err
}
```

## varCheckError or vce

```go:Before
json.Marshal(value).vce
```

```go:After
marshal, err := json.Marshal(value)
if err != nil {
	return err
}
```

https://www.jetbrains.com/go/guide/tips/handle-go-errors-with-postfix-completion/
Unity iOS ビルド xcworkspace ファイルがない

# 結論

ターミナルから以下を実行すると xcworkspace ファイルが現れる。

```
どこでもいいので実行
$ brew install cocoapods

Unity でビルドしたフォルダ内で実行。時間かかるが我慢して待つ
$ pod install
```

# 経緯

広告を実装しようと、UnityMediationSDK をインストール。その後 xcode のビルドで以下のエラー

`'UnityMediationSdk/UnityMediationSdk.h' file not found`
![スクリーンショット 2022-06-13 15.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36144/1c2336a0-0dd4-a95b-4720-8d6e088de5e3.png)

- Mediation に使うファイルが見つけきれないみたい
- ライブラリは cocoapods で管理するようになっているみたい
- cocoapods を参照するには、 xcworkspace ファイルからいけるはず
- そのファイルがなかったので、上記の手順を実行すると、現れました。
- xcworkspace をダブルクリックして xcode を起動して実機ビルドで動作成功

# 環境

- macOS Monterey 12.4
- Unity Editor 2020.3.26f1
- iPhone 8 15.5
- cocoapods 1.11.3
- Madiation 0.5.0-preview.4


# 雑感

Unity ビルド時にそこまでやってほしいんだけど、途中手動でターミナルから、 cocoapods のコマンド叩かないといけないのにはちょっと違和感。どこか設定が抜けてるのだろうか。

あと UnityMediationSDK を package manager から install した際に gem でも cocapods インストールされてたっぽいけど、 brew で入れたものと競合しないか心配ではある。たぶん gem の方は unity editor 側で使われてそう。

gem の方は消してもいいかもしれない。
https://qiita.com/noprops/items/f997a438fabb64c15f10
Viteで作成したReactプロジェクトをVS Codeでデバッグする

# はじめに

ViteでReactのプロジェクトを作成してVS Codeでデバッグの設定をしようとしてモヤモヤしたのでメモと残しておきます。
結論だけ知りたい方は「はじめに試したこと」は読み飛ばしてください。

# はじめに試したこと

まずは、自分がいつもやっている方法で設定していきます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/d49a803f-2073-cdc9-8491-5691032932c4.png">

実行とデバッグのアイコンを選択し上記画面のcreate a lunch.json fileをクリックします。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/7f197c80-5bb6-cfe9-12a7-7e5726eb66be.png">

環境の選択が表示されるので、Chromeを選びます。

```json:lunch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-chrome",
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:3000",
            "webRoot": "${workspaceFolder}",
            "preLaunchTask": "npm: dev",
        }
    ]
}
```
デバッグプロセスを起動するために、作成されたファイルに、**preLaunchTask**の設定を追加します。
また、**url**のポートを3000に変更します。（正しく表示されない場合は、デフォルトポートが異なっている場合があるので、ターミナル表示されるurlを確認します。）

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/4858cdeb-59bb-6428-7245-085dc16c2200.png">

次に、メニューの「terminal」->「Configure Tasks」を選択して、「npm: dev」を選びます。

```json:tasks.json
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "npm",
			"script": "dev",
			"problemMatcher": [],
			"label": "npm: dev",
			"detail": "vite",
            "isBackground": true,
		}
	]
}
```
作成されたファイルに、**isBackground**の設定を追加します。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/12da7948-102d-bc07-6052-e21d5a615721.png">

次に、もう一度実行とデバッグのアイコンを選択して、Launch Chromeをクリックします。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/7678845e-7cc5-4d2c-78ae-e86c34876d9e.png">

ダイアログが表示される（されないこともある？）ので、「Debug Anyway」で実行します。「Remember my choice for this task」をチェックすると次回から表示されません。
Problem matcherについて調べて色々設定してみたのですが、どうやったらこのダイアログが出なくなるのか対処方法はわかりませんでした。
この方法でもデバッグは可能です。

# 別の方法

ちょっと気持ち悪いので、別の方法を試してみました。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/79914387-b1d2-49dd-c232-d3943599f82d.png">

package.jsonファイルを開き、「▷ Debug」をクリックします。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613072/d30eceec-7401-e572-4b35-c74ac53bb9e2.png">

「dev vite」をクリックします。

```bash
Debugger attached.
Port 3000 is in use, trying another one...

  vite v2.9.9 dev server running at:

  > Local: http://localhost:3001/
  > Network: use `--host` to expose

  ready in 436ms.

```

Terminalにローカルサーバのurlが表示されるので、Macの場合は、commandキーを押しながらクリックすると、ReactアプリがChromeで起動します。
デバッグを停止、デバッグプロセスの切断をしてもデバッグプロセスは停止しません、TerminalでCtrl+cキーを押してプロセスを終了します。

# まとめ

デバッグ開始に3ステップ、デバッグ停止に3ステップかかってしまいます。
できれば、はじめに試した方法で1ステップにしたかったのですが、わかりませんでした。
実際は、Hotリロードがあるので、そこまで気にならないのかもしれません。
「こうやったらうまくできるよ」とかうまくいかない理由をご存知の方は、コメントを残してもらえるとうれしいです。
JLCPCBでのインピーダンスコントロールのやり方

**概要**
JLCPCBでインピーダンスコントロールが必要な基板を作成する際の備忘録

USBの配線を引く際にガイドラインを調べたのでメモしておく

**内容**
中国の基板メーカーであるJLCPCBではインピーダンスコントロールが必要な基板に対してガイドラインを出している。

内容は以下のURLから確認が出来る。

https://cart.jlcpcb.com/impedance

層厚など色々と細かい事が書いてあるが、要するに
「４層、６層基板用にインピーダンスカリキュレータを用意したから、インピーダンスコントロールが必要ならこれで計算して線幅と線間スペースを出してね」
って事

以下のURLがJLCPCBのインピーダンスカリキュレータ
https://cart.jlcpcb.com/impedanceCalculation

とりあえず特性インピーダンス50Ωで計算してみた
![stackup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/bf76c514-cae4-2282-4d5d-3d983e87e95f.jpeg)

Trace width : 線幅(単位はmilなので注意)
Layers　：　何層基板か
Inner layer/outer layer　：　引く線は外層と内層のどっちなのか
Impedance type　：　シングルエンドもしくは差動信号
Trace Space　：　線間の距離(差動信号のみ。これも単位はmilなので注意)

右上に↓のようにインピーダンスが２種類表示されている。

 Type 1：
Recommend impedance: 50.38ohm
Order selection:JLC7628 View stackup

Type 2：
Recommend impedance: 35.05ohm
Order selection:JLC2313 View stackup

これは基板の部材が「JLC7628」「JLC2313」の２パターン用意されていて、
４層基板の場合はこのどっちを使うか選んでねって事っぽい
ちなみに６層基板はこの記事を書いている時点(2022.06.13)では「JLC2313」のみとなっている。
ガイドラインによると６層だけは一時的に「JLC7628」の供給を止めてるらしい。

一応、デザインルールに引っかかる線幅と線間スペースは設定できない様になっているっぽいが、
ちゃんとJLCPCBのデザインルールに引っかからない様チェックしながらやった方が良さげ
JLCPCBのデザインルールは以下のURLで確認が出来る。
https://jlcpcb.com/capabilities/Capabilities
【COBOL】COBOLでSEARCH文 COBOLの配列検索

研修時代、難しすぎてわからなかったけど今は一日で理解できた

# 入力
```javascript
ccc
```

# コード
```javascript
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
  WORKING-STORAGE SECTION.
     01 TEST-TXT PIC X(42).
     01 INP PIC X(3).
     01 BLKTBL.
       03 PIC X(6) VALUE "aaa".
       03 PIC X(6) VALUE "bbb".
       03 PIC X(6) VALUE "ccc".
       03 PIC X(6) VALUE "ddd".
       03 PIC X(6) VALUE "eee".
     01 BLKTBL-R REDEFINES BLKTBL.
       03 BLK-REC OCCURS 5 INDEXED BY IDX.
         05 VAL PIC X(03).
    PROCEDURE DIVISION.
        ACCEPT INP.
        SET IDX TO 1.
        SEARCH BLK-REC
          AT END
            DISPLAY "入力した値は存在しません"
        WHEN VAL(IDX) = INP
            STRING
               "入力した【" DELIMITED BY SIZE
                   VAL(IDX) DELIMITED BY SIZE
             "】はありました。" DELIMITED BY SIZE
              INTO TEST-TXT
            DISPLAY TEST-TXT
        END-SEARCH.
END PROGRAM MAIN.
```

# 結果
```
入力した【 ccc】はありました。

入力した値は存在しません
```





参考
http://source.ojaru.jp/COBOL/COBOL_SEARCH.html
Vue3: ディレクティブに対して動きを追加するときに使える修飾子の備忘録


修飾子（Modifier）: ディレクティブに対して追加で何らかの振る舞いをする
```
@click.prevent // .preventの部分が修飾子
```
modifierをmethod内で使用して、ディレクティブにつけた時と同じような動きを得ることができる。

```vue:修飾子をmethod内で使う場合
<script setup>
  const onSubmit = (e: any) => {
    e.preventDefault();
    console.log('送信した');
}
</script>

<template>
  <button @click="onSubmit"> 送信 </button>
</template>
```

```vue:修飾子をディレクティブに対して使う場合
<script setup>
const onSubmit = () => {
  console.log('送信した');
}
</script>

<template>
  <button @click.prevent="onSubmit"> 送信 </button>
</template>
```

修飾子例
```
@click.prevent  //リロードが走らない
v-model.trim    //前後の空白が削除された状態になる。
v-model.lazy    //バインドのタイミング（プロパティへの反映）を遅らせる。変更イベントの後に同期させることができる。
v-model.number    //入力値を数値型に変換してから代入する

```
AlibabaCloud（中国サイト）でVMwareのESXIノードとvCenterを購入する

AlibabaCloud（中国サイト）で前はマーケットプレイス経由での購入という形になっていましたが、コンパネ上で
VMwareが購入できるようになっていたので紹介します。

# 1.コンソールパネル
ECSの欄に「NEW」とVMware服务という項目が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263462/f0e54c2c-420f-2690-acbf-41f2df0a4229.png)

# 2.VMware服务
クリックするとVMware服务（サービス）が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263462/794ae463-2299-7a57-5cb7-b1a25fd98a47.png)

# 3.購入
選択できるリージョンは上海のみで、スペックも以下の1種類だけでした。。
vs182o.16xlarge  32Core 768G 16TB
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263462/39c5df43-5577-c636-8fad-324b10a011da.png)

ESXIノードは最低3台からで、追加できるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263462/f0f7c0b3-75ba-a114-b820-e9a5d395730d.png)

vCenterのアカウントのパスワードを入力する欄があり、セットになっているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263462/1ecc11ac-ba0e-9368-0277-cdc0cc0aa61f.png)

サポートへ問い合わせたところ、今後はスペックも複数のラインナップが出来る予定ですが
現時点では1種類のみとのこと。高すぎます。

# 4.終わりに
値段は高額ですが、コンソールからVMware環境を購入できるのはいいですね。
今後のプラン拡充に期待します。
M5Stackの SIM7080G-CAT-M-NB-IOT-UNITでEmail送信（２）

前回初期設定とネットワーク接続の確認までを記載しました。ここからはEmailの送信です。
メールはAボタンを押したときに送信するようにします。
なお、SIM7080Gそのものは技適取得済ですが、アンテナが認証取得していないのではないかとの話があるので自己責任でお願いします。

Niftyのメールサーバを使用していますので、
SMTPサーバー：smtp.nifty.com
ポート：587
ユーザID：abc123456@nifty.com
パスワード：Password
送信先のメールアドレス：sendto@gmail.com
メールタイトル：Test
メール本文：This is a new Email
としておきます。
![mail1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/2a06f17e-3e34-c8be-c5f0-04ea36974973.jpeg)
AT+EMAILCID=0：Email Bearer Profile indentifierの設定です。ここでは0とします。
AT+SMTPSRV="smtp.nifty.com",587：SMTPサーバーとポートの設定です。
AT+SMTPAUTH=1,"abc123456@nifty.com","Password"：SMTPサーバーにログインするためのユーザIDとパスワードです。
AT+SMTPFROM="abc123456@nifty.com","sendusername"：送信元のメールアドレスとユーザ名です。
AT+SMTPRCPT=0,0,"sendto@gmail.com","sendusename"：TOで送信するメールアドレスとユーザ名です。
AT+SMTPRCPT=1,0,"abc123456@nifty.com","sendusername"：CCで送信するメールアドレスとユーザ名です。AT+SMTPRCPT=2,0,"abc123456@nifty.com","sendusername"とするとBCCで送れます。
![mail2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/c9a501ea-4cb5-5817-4c4e-4311477fe8cf.jpeg)
AT+SMTPSUB="Test"：メールのタイトルです。
AT+SMTPBODY=19：メール本文として送るバイト数です。今回「This is a new Email」としましたので19バイトになります。このコマンドを送信するとDOWNLOADというレスポンスを返してくるので、ATコマンドを付けずにメール本文をそのままUARTに1行分送信します。
AT+SMTPSEND：メールを送信します。送信に成功するとOK、失敗するとエラーコードを返してきます。
![pressB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/b28b0feb-31db-37aa-106c-f909db2c5d1c.jpeg)
Ｂボタンを押したときの処理です。必要に応じて変更してください。
AT+CNACT?：APPネットワークの状態を確認します。
AT+CGNAPN：APNを確認します。
AT+CGNATT?：PSサービスの確認です。

今回のプログラミングでとりあえずテストメールが送信できることは確認できましたが、メールサーバとの接続は何分かするとセッションが切れるようなので、使用するたびにセッションを確立するように変更した方がよさそうです。また、関数に設定しておくともう少しきれいにコーディングできますね。
GitHubのIssue追加から対応するブランチを自動生成してプルリク合わせて自動クローズしたい

## はじめに
私のチームでは、GitHubのIssueに課題を登録し、対応するブランチを切って課題を対応してプルリクエストでマージしていくという一連のサイクルでタスクの進捗や管理を行っているですが、Issueの登録からの処理は毎度同じことを行っているため自動化できないか調べてやってみました。

参考：ちょっと前にGithubから[Creating a branch to work on an issue](https://docs.github.com/en/enterprise-cloud@latest/issues/tracking-your-work-with-issues/creating-a-branch-for-an-issue)でIssueより、対応するブランチの作成がボタン一つでできるようになる機能が出てますが、ブランチの命名ルールを決めて自動でやってほしいなという思いがあり他の方法も調べました。

## 今回調べたもの

GitHubActionsに[**create-issue-branch**](https://github.com/robvanderleek/create-issue-branch)という自分がやって欲しかったことを実現してくれるアクションが公開されていましたので利用してみました。

## 動作

**create-issue-branch**ではGitHubの**Projects**や**Label**なども組み合わせていろいろできるみたいですが、今回は、Issueの登録時に特定の命名ルールでブランチを自動作成し、作成したブランチをプルリクエストのマージ時にクローズさせる機能を利用してみました。

以下は、ブランチの命名ルールは issue-[Issueの番号] というものを設定してみた結果です。

Issueを追加すると自動で issue-47 というブランチを生成してくれました。
([IssueのAssigneesに自動で作成者が入るGitHubActions](https://github.com/technote-space/assign-author)も併用してます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/98eb6654-5bbe-17e9-2768-f9469901a22f.png)

issue-47 ブランチの変更をプルリクエストでマージすると自動でIssueもクローズされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/c48e6a96-166b-985a-2ced-263ff0a1e215.png)

## 作成したymlファイル

**create-issue-branch**が提供してくれるデフォルトのymlそのままですが、
issueの登録・issueへのコメントの投稿・プルリクエストのクローズに反応して動作します。
```createIssueBranch.yml
on:
  issues:
    types: [ assigned ]
  issue_comment:
    types: [ created ]
  pull_request:
    types: [ closed ]
name: CreateIssueBranch
jobs:
  create_issue_branch_job:
    runs-on: ubuntu-latest
    steps:
      - name: Create Issue Branch
        uses: robvanderleek/create-issue-branch@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

.github/workflowsフォルダと並列な箇所に以下の設定ファイルも準備します。
[create-issue-branchのReadme](https://github.com/robvanderleek/create-issue-branch/blob/main/README.md)にもいろいろ書いてありますが、今回自分が利用した機能については説明等もあわせてコメントしてあります。

```issue-branch.yml
# Issue作成時に自動的に作成されるブランチの名称ルールを設定する

# 組み込みの指定は以下です。”branchName: tiny”のように利用できます。　
# tiny => iその後に発行番号が続きます。例：i15
# short => 単語のissue後に発行番号が続きます。例： issue-15
# full =>「issue」という単語の後に「issuenumber」の後に「issuetitle」を続けます。例：issue-15-Fix_nasty_bug

# 独自のルールを設定する場合に利用できるプレースホルダー名は以下を参照ください。
# https://github.com/robvanderleek/create-issue-branch/blob/main/tests/test-fixtures/issues.assigned.json
# '${issue.number}-${issue.title}' => Issueの番号-Issueのタイトル。例： ”37-ImprovePerformanceForReviewGrid”　となる

branchName: 'issue-${issue.number}'

# プルリクエストのマージ後にIssueを自動的に閉じる機能の有効無効
# 自動的に閉じるには"issue-XX"あるいは"iXX"（XXはIssue番号）のようなブランチ名が設定されている必要がある。

autoCloseIssue: true

# trueの場合、Issue作成後、コメントを作成しないと自動ブランチ作成が行われない
# falseの場合、Assigneesが入れば自動でブランチが作成される。(IssuesAssignAuthor.ymlと組み合わせることでアサインも自動化可能)

silent: false
```

## さいごに

ブランチの命名ルールであったり、Issueのクローズは別途行いたいのであれば、設定のautoCloseIssueをfalseにするなど、プロジェクトのやり方に合わせて、カスタマイズが可能な点がGoodだと思います。
自分のチームでは**Projects**や**Label**をまだ積極的に活用できていないので試せない機能もありましたが、ゆくゆくはいろいろ試して自動化していきたいですね。
[2022年]Amazon ゲームプログラミング書籍売れ筋ランキング[参考書]

Amazonで人気のゲームプログラミングに関する書籍を紹介します。
プログラミングやIT系の勉強するときはKindleや電子書籍で勉強するのがおすすめです。
***
[今日からはじめる Blender 3入門講座[Amazon]](https://amzn.to/3zxpBJd)
![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/c529d1f2-a31a-a2c8-7f1c-dbf2f51e57ff.jpeg)
- Chapter1 Blenderの基本を学ぼう
- Chapter2 モデリングをしてみよう
- Chapter3 マテリアルを設定しよう
- Chapter4 アニメーション(動き)を付けよう
- Chapter5 レンダリングしてみよう
- Chapter6 実践編 キャラクターをつくろう
***
[Unityではじめる ROS・人工知能 ロボットプログラミング実践入門[Amazon]](https://amzn.to/39gtlEa)
![aa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/05230183-1253-ba62-71a4-5eec9fc77dcb.jpeg)
- 第1章 ROSとUnity
- 第2章 はじめてのROSアプリケーション
- 第3章 ROS1のデータ通信
- 第4章 ROS2のデータ通信
- 第5章 ROS-Unity間のデータ通信
- 第6章 URDFによるロボットモデルの作成
- 第7章 移動ロボットの操作
- 第8章 ロボットアームの操作
- 第9章 リアルロボットの操作
- 第10章 人工知能によるロボットの操作
- 付録 ローカルマシンのPython環境の構築
***
[小一時間でゲームをつくる[Amazon]](https://amzn.to/3O7IDdc)
![aaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/61123cc4-fe96-c1d4-fdfb-36a19c2e27ff.jpeg)
- 第1章 王道RPGの戦闘シーンを作成する
- 第2章 ライフゲームを作成する
- 第3章 リバーシを作成する
- 第4章 落ち物パズルゲームを作成する
- 第5章 ドットイートゲームを作成する
- 第6章 擬似3Dダンジョンゲームを作成する
- 第7章 戦国シミュレーションゲームを作成する
- Appendix 1 戦国シミュレーションゲームを三国志に改造する
- Appendix  王道RPG 完全版
***
[Unityの寺子屋[Amazon]](https://amzn.to/3NHPOch)
![aaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/1eb87b81-b44d-62b2-2bc6-2263c9971726.jpeg)

- Chapter 1 Unityの基本を身に付けよう
- Chapter 2 放置ゲームをつくろう
- Chapter 3 放置ゲームに演出を加えよう
- Chapter 4 クッキークリッカーに改造しよう
- Chapter 5 サイドビューアクションをつくろう
- Chapter 6 サイドビューアクションを仕上げる
- Chapter 7 アプリ販売の寺子屋
***
[独学プログラマー Python言語の基本から仕事のやり方まで[Amazon]](https://amzn.to/3zxevDV)
![aaaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/333b560b-b2aa-29c0-4a0f-f3ea9bd20498.jpeg)
- 第1部（Part1）
  - 第1章　イントロダクション
  - 第2章　さあ、はじめよう！
  - 第3章　プログラミング入門
  - 第4章　関数
  - 第5章　コンテナ
  - 第6章　文字列操作
  - 第7章　ループ
  - 第8章　モジュール
  - 第9章　ファイル
  - 第10章　知識を1つにまとめる
  - 第11章　ハマったときの助け
- 第2部（Part2）
  - 第12章　プログラミングパラダイム
  - 第13章　オブジェクト指向プログラミングの４大要素
  - 第14章　もっとオブジェクト指向プログラミング
  - 第15章　知識を1つにまとめる
- 第3部（Part3）
  - 第16章　Bash
  - 第17章　正規表現
  - 第18章　パッケージ管理
  - 第19章　バージョン管理
  - 第20章　知識を1つにまとめる
- 第4部（Part4）
  - 第21章　データ構造
  - 第22章　アルゴリズム
- 第5部（Part5）　
  - 第23章　プログラミングのベストプラクティス
  - 第24章　プログラマーとしての最初の仕事
  - 第25章　チームで働く
  - 第26章　さらに学ぼう
  - 第27章　次のステップ
- 第6部（Part6）
  - 補章　より良いコードにするために
  - 補章　継続して学ぶために
***

>他の記事
・[[2022年]Amazon ゲームプログラミング書籍売れ筋ランキング[参考書]](https://qiita.com/metimeti/items/9ec618763d2a6f268d55)
・[[2022年]初心者向けおすすめCC++プログラミング書籍(参考書)](https://qiita.com/metimeti/items/68c67de6700724b06237)
・[[2022年]おすすめ機械学習書籍(参考書)](https://qiita.com/metimeti/items/ad39b4a63e73e841ebb7)
・[[2022年]オライリーおすすめ書籍1(参考書)](https://qiita.com/metimeti/items/8ac3bfbdbde550e07d77)
・[[2022年]オライリー書籍ランキング1(O'Reilly)](https://qiita.com/metimeti/items/a349a5b7b521414c9e5a)
オリジナルアプリ作成で分からないこと

オリジナルアプリ作成で分からないことが生じています。
# その１：現象
スクレイピング元サイトからデータを取ってきて、連想配列で表示したとき、スペースで分かれているとスペース区切りになり、名前の姓名が別々になってしまう。
（例：村田　一成→[0]=>"村田", [1]=>"一成"）
スクレイピング元サイトはヤフースポーツの該当プロ野球チームの選手データ。

# その２：対策
調べると、array_mergeで結合できるみたいだが、配列がたくさんあり、その部分だけ結合する方法が分からない。
foreach内でifを使いその部分だけ結合できるようにするか。でも、どうやって？？

#結局
結局、対策が分からず止まっています。
単なる連想配列なら出来るんですが。

参考にgithubを載せます。
https://github.com/kazunarigit/baystarsapp
Databricksノートブック間でセルをコピーアンドペーストできるようになりました

意外に便利かと思います。複数のセルも一度にコピーアンドペーストすることができます。

例えば、以下のノートブックの**COVID**セクション配下のセルをコピーします。
![Screen Shot 2022-06-13 at 15.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7e7dbc46-6cfd-7977-b19e-79610318f2f6.png)

セクションタイトルの左上の`[-]`をクリックして、セルを折りたたみます。
![Screen Shot 2022-06-13 at 15.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/67d7b5f2-c5fc-cf33-0f31-d9a8e871b2ee.png)

4つのセルが折り畳まれた形で選択されている状態になります。この時点で`Command+C`(Mac)あるいは`Ctrl+C`(Windows)を押します。セルがコピーされます。

貼り付けたいノートブックを開きます。こちらのノートブックは空のセルが一つあるだけの状態です。
![Screen Shot 2022-06-13 at 15.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a115aaf9-9cd8-7ed6-09f3-d45c040502c8.png)

空白のセルを選択している状態で、`Command+V`(Mac)あるいは`Ctrl+V`(Windows)を押します。これでコピーしたセルが全て貼り付けられます。
![Screen Shot 2022-06-13 at 15.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/63ca547b-b175-4833-05f3-b8dcd575086e.png)

詳細は[マニュアル](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%82%BB%E3%83%AB%E3%81%AE%E5%88%87%E3%82%8A%E5%8F%96%E3%82%8A%E3%82%B3%E3%83%94%E3%83%BC%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91)を参照ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
gitでrevertした後に、revertしたコミットを再度マージはできない


## なぜか
- 履歴上にすでにコミットが含まれているので

## どうすればいいか
- revertコミットをrevertする

```
git revert <revert commit>
```


## 参考
https://zenn.dev/yoichi/articles/git-merge-again
flutter コマンド操作 VScodeショートカットキー

# 初めに
慣れるまで、見返しそうな部分をまとめております。
# ◎ターミナル操作
## ターミナルからflutterプロジェクト作成
```
$ flutter create [プロジェクト名]
```

## Flutterプロジェクトを起動
```
cd [プロジェクトのpas]
flutter run
```

## Flutterプロジェクトを停止
ターミナル上で　 **"commnad"+"C”**

# ◎VScode
# VScode ショートカット

|操作 |ショートカット|
|---|---|
|デバック実行|F5キー(fnキーを押すと出てくる)|
|ホットリロード  |Command + S|
|クイックウィジェット(Wrapしたい時等)  |Command + .|
|stl|StatelessWidget 雛形作成|


## VScode　プロジェクト作成
ターミナルを利用せず、VScodeから直接、プロジェクトを作成する方法。
### 1:コマンドパレットを開く
VSxcodeを立ち上げた最初の画面で、
shift ＋ Command + P でコマンドパレットを開く
### 2:コマンドパレットに入力していく
[1]
```
Flutter: New Project
```
[2]
```
Application
```
[3]
プロジェクトの作成場所を決める。
[4]
プロジェクト名を入力して完了。

## VScode上でコンソールを起動
コマンドパレッドで、``Create New Terminal``
# 終わりに
学習進めるごとに、覚えたものを追記していく予定です。

[Twitter]
https://mobile.twitter.com/tatsuki_kt
Ajax(エイジャックス)、Webプログラミングとは

# 同期通信
クライアントとサーバーが```交互```に処理を行なってい、同調して通信を行うこと。
## 同調　
・調子が同じであること。同じ調子。
・他に調子を合わせること。他人の意見・主張などに賛同すること
出典 https://dictionary.goo.ne.jp/word/%E5%90%8C%E8%AA%BF/

Webブラウザがリクエストを送りWebサーバーが受け取ってレスポンスを返していた。
全体のページを更新するために```レスポンスの時間、サーバーの負担```もかかる。

# Ajax(エイジャクス、Asynchronous JavaScript + XML)
クライアントサイド・スクリプトととして動くJavaScriptが直接webサーバーと通信をする。
データのやり取りはXMLが用いられる。DOMを使ってXMLやHTMLを操作する。
更新に```必要なデータのみ```をやり取りする。なので```サーバーへの負担が抑えられる```。

Javascriptが通信を行うため、javascriptの機能を使った非同期通信を可能になります。
JavaScriptがレスポンスに左右されない箇所のHTMLを更新したり、ユーザーからの入力を受け付けることができる。
```レスポンス待ち時間を有効活用```できる。

# 思ったこと
レスポンスの時間が短くなったり、有効活用できるのはいいことだな。
Javascriptが通信に使われると非同期通信が可能になるのか。
Ajaxを使ってみたいな。

# Webプログラミング
Webアプリケーションを開発することをWebプログラミングという。
プログラミングの対象は```サーバーサイド・スクリプト```,```クライアントサイド・スクリプト```の２種類となる。
最近ではフレームワークの整備でWebプログラミングの難易度が下がってきている。
しかし
スクリプト言語の種類や利用される技術、設計思想がそれぞれ違うため豊富な知識が必要とされる。

# サーバーサイドのプログラミング
サーバーサイド・スクリプトにとって必要なこと
・リクエストを```素早く処理```すること
・```効率的な手順```で処理を行うこと
・サーバーのメモリを```無駄遣いしない```こと
・DBMS、問い合わせ言語の```SQLの知識```
・個人情報を取り扱うため```セキュリティの意識```

# クライアントサイドのプログラミング
Webアプリケーションにおけるクライアントは、主にWebブラウザとなる。
WebブラウザにはInternet Explore,Firefox,Google Chromeなどがある。
それらには違いが存在し、対応しなければならない。
そうしなければ```どれかで動かなくなる```。

Ajaxのような複雑な処理を行うものが増えてきおり、プログラミングの規模は大きくなっている。

出典　Web技術の基本（SB Creative)
dockerコンテナを立ち上げたときに発生する`kernel BUG at include/linux/fs.h:3104!`の対応

# TL;DR
kernelバージョンを`linux-image-5.13.0-1031-gcp`に上げる

# 環境
GCPのVMインスタンスにSSH接続しています。
```
$ cat /etc/issue
Ubuntu 20.04.2 LTS \n \l

$ uname -r
5.13.0-1030-gcp
```

# 起こったこと
- いつものようにGCPのVMインスタンスにSSH接続し、`docker-compose up` を実行
- コンテナが立ち上がる前にSSH接続が切断されてしまう
- VMインスタンスのシリアルポートの出力を確認すると、`kernel BUG at include/linux/fs.h:3104!` とのこと

# 調べたこと
少し調べたら、こちらのツイートが出てきました。
カーネルのバージョンアップが原因だったようです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">OCIの他に、AWS, Azure, GCP でも問題かもしれないらしい5.13系最新Kernelのpanicの件、書きました。 / <br><br>Ubuntu 20.04.4 LTSでのKernel panic「kernel BUG at include/linux/fs.h:3104!」の暫定回避方法 - RemoteRoom <a href="https://t.co/5jhUuLCZoB">https://t.co/5jhUuLCZoB</a></p>&mdash; Masahiko OHKUBO (@mah_jp) <a href="https://twitter.com/mah_jp/status/1534569561164742658?ref_src=twsrc%5Etfw">June 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 解決方法
`apt-cache` コマンドで、インストール可能なカーネルのバージョンを調べる
```
$ apt-cache search linux-image-5
(省略)
```

`linux-image-5.13.0-1030-gcp` 以上のバージョンをインストール（今回は`5.13.0-1031-gcp`）
```
$ sudo apt install linux-image-5.13.0-1031-gcp
```

再起動し、カーネルのバージョンを確認
```
$ uname -r
5.13.0-1031-gcp
```

dockerのコンテナが起動できたらOK！