OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでAtCoder ABC256(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC256のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - 2^N
https://atcoder.jp/contests/abc256/tasks/abc256_a
```ruby:a-256.rb
puts 2 ** gets.to_i
```

# B - Batters
https://atcoder.jp/contests/abc256/tasks/abc256_b
```ruby:b-256.rb
# 修正前
n = gets.to_i
a = gets.split.map(&:to_i)
ans = 0
array = Array.new(4, 0)
n.times do |i|
  array[0] = 1
  4.downto(0) do |j|
    if array[j] == 1
      if j + a[i] >= 4
        ans += 1
        array[j] = 0
      else
        array[j], array[j + a[i]] = 0, 1
      end
    end
  end
end
puts ans
```
```ruby:b-256.rb
n = gets.to_i
a = gets.split.map(&:to_i)[-3..]

array = []
a.each do |hit|
  array.concat ([1] + [0] * (hit - 1))
end
puts n - array[-3..].sum
```
## 解説
問題文の通りに条件分岐を行うことで実装することができます。

# C - Filling 3x3 array
https://atcoder.jp/contests/abc256/tasks/abc256_c
```diff_ruby:c-256.rb
h1, h2, h3, w1, w2, w3 = gets.split.map(&:to_i)
ans = 0
- for a in 1..28
+ for a in 1..(h1 - 2)
-   for b in 1..28
+   for b in 1..(h1 - a - 1)
      c = h1 - a - b
-     for d in 1..28
+     for d in 1..(h2 - 2)
-       for e in 1..28
+       for e in 1..(h2 - d - 1)
        f = h2 - d - e

        i = w3 - c - f
        g = w1 - a - d
        h = w2 - b - e
        next if i != h3 - g - h

-       ans += 1 if [c, f, i, g, h].min > 0
+       ans += 1 if [i, g, h].min > 0
      end
    end
  end
end
puts ans
```
## 解説
3×3のマスに入る数字を[[a, b, c][d, e, f][g, h, i]]とします。そして、行・列それぞれの場合において和が一致していれば`ans`の値をインクリメントします。

# D - Union of Interval
https://atcoder.jp/contests/abc256/tasks/abc256_d
```diff_ruby:d-256.rb
n = gets.to_i
array = Array.new(n){ gets.split.map(&:to_i) }.sort

log_status = [array[0]]
array.each_with_index do |(left, right), index|
  next if index == 0
  pre_left, pre_right = log_status[-1]
- if pre_left <= left && left <= pre_right
+ if left <= pre_right
    log_status[-1][1] = right if pre_right < right
  else
    log_status << [left, right]
  end
end

log_status.each do |answer|
  puts answer.join(" ")
end
```
```ruby:別解
n = gets.to_i
array = Array.new(n){ gets.split.map(&:to_i) }.sort

right = 0
array.chunk_while do |(_, pre_right), (left, _)|
  right = [right, pre_right].max
  left <= right
end.each do |section|
  puts "#{section[0][0]} #{section.sort_by{ |i, j| -j }[0][-1]}"
end
```
## 解説
（公式解説を参考にしました）

与えられた配列を左側が昇順（同じ場合は右側も昇順）になるようにソートしておきます。そして、`log_status`配列を用意しておき、次の区間の左側が前の区間内にあり、かつ次の区間の右側が前の区間の右側よりも大きければ右側の値を更新します。それ以外はそのまま`log_status`配列に記録します。最後に、空白区切りで`log_status`配列の要素を出力すればOKです。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
React/Next.js勉強メモ


### フロントエンド開発の変遷
* JavaScriptが開発されたのは1995年
    * 同時期に開発されたJScriptとは非互換な部分が多かったため、ECMAによる標準化策定が始まった。
        * 有効な活用方法があまりない・過度なアニメーションなどがブラウザに負荷をかけてしまう...などの理由からセキュリティ上問題もあるという認識が広まり、ブラウザの「JavaScript無効設定」を推奨するような声も強まった。
* 常識を覆した「Google Maps」
    * 非同期でHTTP通信するAjaxの登場
    * JavaScript再注目
* jQueryの登場
    * Webアプリケーションの発展＋ユーザーの使用端末の多様化に伴いフロントエンド開発の際に対応しなければいけない項目が増えていく。
    * ブラウザ間の違いをある程度吸収してコードを書くことができるjQueryが台頭する
* jQueryの衰退
    * 一生を風靡したjQueryもWebアプリケーションが大きく複雑になるにつれて、対応が追いつかなくなる（jQueryを使うとDOMの操作が複雑になるなど）
    * そもそもブラウザ間の差が小さくなり、jQueryを使う必要性が薄れる
* SPAの登場
    * SPAでは初回アクセス時にHTML全体を読み込んで、それ以降は動的にページを生成していく
    * サーバーサイドも、ビューの生成まで行う従来の形式からAPI化が進む
    * JavaScriptの読み込みとレンダリングが発生するため、場合によっては初期表示が重くなるという課題も
* SSR/SSGの需要増加
    * レンダリングをサーバーサイドで行うことで表示が高速化
    * 事前にファイルを静的ファイルとして生成することで処理を高速化

<br>

### Next.jsのレンダリング手法について
#### SSG - Static Site Generation（静的サイト生成）
ビルド時にAPIなどからデータを取得して、ページを描画して静的ファイルとして生成する方法。
初期描画時には静的ファイルを渡し、それ以降はReactと同様に都度APIなどからデータを取得して描画する。

メリット・・・クライアントに静的ファイルを渡すだけなので初期描画が高速。
デメリット・・・初期描画に使用するデータはビルド時に取得したものであるため、古いデータが表示される可能性あり。

#### CSR - Client Side Rendering
ビルド時にデータの取得は行わず、初期表示の際に非同期でデータを取得して描画する方法。
ReactなどのSPAで使われている手法。

メリット・・・データの取得はビルド時ではなくて、初期描画時に行うため最新のデータを表示することができる。
HTMLやCSSの生成はブラウザ側でJavaScriptを使って行われる。
デメリット・・・初期描画時に時間がかかる。


#### SSR - Server Side Rendering
サーバーサイドでHTMLやCSSの生成を行う方法。
アクセスごとにサーバーでデータを取得して描画するため、常に最新のデータを元にして初期描画を行うことができる。

メリット・・・常に最新のデータを表示することができる上に、ブラウザ側でJavaScriptを実行する必要がないため描画もCSRに比べると高速。
デメリット・・・サーバーで処理を行なっているため、他の手法よりも低レイテンシーに陥る可能性がある。

#### ISR - Incremental Static Regeneration（インクリメンタル静的再生成）
ビルド時に生成された静的ファイルを再生成できる方法。
事前に生成したページに有効期限を設定することができて、有効期限が切れていた場合は再生成して渡すことができる。
GitHubでYowza, that’s a lot of files.とエラーが出た時の解決方法

## はじめに
GitHub リポジトリにドラッグ＆ドロップでファイルをアップロードしようとしたところ、以下のようなエラーが出てしまいました。
**「Yowza, that’s a lot of files. Try uploading fewer than 100 at a time.」**
![GitHub.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153171/bfec00d8-0879-a449-f801-67b04cd8aef3.png)

## エラーの意味
エラーの内容は「ファイルがたくさんあるね。一度にあげるのは100未満にしてね」って感じです。

## 解決方法：コマンドラインでアップロードする
手順は以下のサイトを参考にさせていただきました。


**手順1　アップロードしたいフォルダ内に移動**
```:command
$ cd フォルダのパス
```
　
**手順2　ローカルリポジトリの作成**
```:command
$ git init
```
　
**手順3　フォルダ内のファイルをステージング**
「git add .」と入力することで、対象フォルダ内の全てのファイルを、ステージング状態（アップロードの対象）にできます。
```:command
$ git add .git add .
```
　
**手順4　コミット**
```:command
$ git commit -m "コメント/メモ"
```
　
**手順5　ブランチを「main」に設定**
```:command
$ git branch -M main
```
　
**手順6　リモートリポジトリとの関連付け**
```:command
$ git remote add origin <リポジトリ URL>
```
リポジトリ URLにはGitHubリポジトリのURLを入れてください。<>は不要です。
　
**手順7　アップロード（プッシュ）**
```:command
$ git push origin main
```
　
これでGitHubにアップロードできました。
![result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153171/84296f87-af54-7622-5472-e97cda0c2579.png)


## 参考サイト
・[パソコン内のフォルダをgithubへアップロードする方法｜図解付](https://itc.tokyo/best-environment/upload-to-github/)
rex0220 計算式プラグイン テーブル内小計２

kintone のテーブルで、小計に値引き・仕切を計算してみます。
計算式プラグイン、項目検証プラグイン、項目書式プラグインを使います。
※[rex0220 計算式プラグイン テーブル内小計](https://qiita.com/rex0220/items/63808fc1b0d3ff9cd561)に値引き・仕切行を追加

# テーブル内小計

小計行の次行に「値引き」行・「仕切」行を追加します。


- 詳細画面
![2023-05-23_20h48_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f0fd87db-0eee-3b14-0481-bb45625547ae.png)
- 編集画面
![2023-05-23_20h57_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d466115f-3184-3e34-c990-bbd19bc5e945.png)

# 計算式プラグインの設定

```.js
// No
ROWNO(テーブル)+1
// 商品
LET(CNO,ROWNO(テーブル),
  SWITCH(分類,
    "小計",LET(PNO,NVL(LASTIF(AND(ROWNO(テーブル)<CNO,分類="小計"),ROWNO(テーブル)),-1),
      FIRSTIF(AND(ROWNO(テーブル)<CNO,ROWNO(テーブル)>PNO,分類="概要"),商品)),
    "値引き",IF(SUBTABLE(分類,CNO-1)="小計",SUBTABLE(商品,CNO-1)),
    "仕切",IF(SUBTABLE(分類,CNO-1)="値引き",SUBTABLE(商品,CNO-1)),
    商品)
)
// 数量
SWITCH(分類,
  "明細",数量,
  "値引き",1,
  ""
)
// 単価
IF(IN(分類,"明細","値引き"),単価,"")
// 金額
LET(CNO,ROWNO(テーブル),
  SWITCH(分類,
    "明細",数量*単価,
    "小計",LET(PNO,NVL(LASTIF(AND(ROWNO(テーブル)<CNO,分類="小計"),ROWNO(テーブル)),-1),
      SUMIF(AND(ROWNO(テーブル)<CNO,ROWNO(テーブル)>PNO,分類="明細"),金額)),
    "値引き",数量*単価,
    "仕切",IF(SUBTABLE(分類,CNO-2)="小計",SUBTABLE(金額,CNO-2))+IF(SUBTABLE(分類,CNO-1)="値引き",SUBTABLE(金額,CNO-1)),
    "")
)
```

![2023-05-23_21h04_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/03e6cc48-ef55-a771-319e-a9e32292e9f5.png)


# 項目検証プラグインの設定

```.js
// 商品の入力不可
IN(分類,"小計","値引き","仕切")
// 数量の入力不可
分類!="明細"
// 単価の入力不可
IN(分類,"概要","小計","仕切")
```

![2023-05-23_21h03_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d383fe02-246b-84d1-0824-63d6ef4b699d.png)

# 項目書式プラグインの設定

```.js
// テーブル行の条件
IN(分類,"小計","値引き","仕切")
```

![2023-05-23_21h05_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fa9fb69f-87ae-52ec-868d-e58ca91e5ba8.png)
Setup memo for "a custom domain with API Gateway" 🚪

こんにちは。Enabling team の山本です。

2023年5月3回目は、「[API Gateway でカスタム ドメインを使用する](https://cloud.google.com/api-gateway/docs/using-custom-domains?hl=ja)※」方法についてです。

※2023年5月23日時点では、*Preview* です。

**一回、手順通りにやったつもりで撃沈したため、備忘録として書きます。**

先日、とある会議で『API Gateway の URL って、ドメインに登録されてないですよね 😤！』と指摘を受けました。

確かに、、、

開発者にAPI Gateway を設定するよう伝えましたが、ドメインまでは気が回りませんでした。ごめんなさい。

と言うことで、今回は、誰も拾わないタスクを回収します。

## TL;DR
- backend service は、自分で作成しましょう。

## Installation
```bash
echo $SERVERLESS_NEG_NAME
echo $REGION_ID
echo $GATEWAY_ID
echo $BACKEND_SERVICE_NAME
echo $URL_MAP_NAME
echo $SSL_CERTIFICATE_NAME
echo $DOMAIN
echo $TARGET_HTTP_PROXY_NAME
echo $HTTPS_FORWARDING_RULE_NAME
```

```bash
gcloud beta compute network-endpoint-groups create $SERVERLESS_NEG_NAME \
  --region=$REGION_ID \
  --network-endpoint-type=serverless \
  --serverless-deployment-platform=apigateway.googleapis.com \
  --serverless-deployment-resource=$GATEWAY_ID
```

- GUI では、API Gateway の設定を確認できないようです。
![hoge-dev.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/50658b45-32f7-eaa5-a69c-9c861a98ff38.jpeg)

- `describe` すると API Gateway の NEG を確認できます。
```bash
yamamoto_daisuke@cloudshell:~ (hoge-368105)$ gcloud beta compute network-endpoint-groups describe $SERVERLESS_NEG_NAME --region=$REGION_ID
creationTimestamp: '2023-05-23T03:46:41.636-07:00'
id: '1666822574193583990'
kind: compute#networkEndpointGroup
name: api-gateway-serverless-neg-hoge-dev
networkEndpointType: SERVERLESS
region: https://www.googleapis.com/compute/beta/projects/hoge-368105/regions/asia-northeast1
selfLink: https://www.googleapis.com/compute/beta/projects/hoge-368105/regions/asia-northeast1/networkEndpointGroups/api-gateway-serverless-neg-hoge-dev
serverlessDeployment:
  platform: apigateway.googleapis.com
  resource: hoge-gateway-dev
size: 0
yamamoto_daisuke@cloudshell:~ (hoge-368105)$
```

- `backend service` が最初に必要です。手順には、記載されていません。
- Option の指定は必要ありません。
```bash
gcloud compute backend-services create $BACKEND_SERVICE_NAME \
  --global
```

```bash
gcloud compute backend-services add-backend $BACKEND_SERVICE_NAME \
  --global \
  --network-endpoint-group=$SERVERLESS_NEG_NAME \
  --network-endpoint-group-region=$REGION_ID
```

```bash
gcloud compute url-maps create $URL_MAP_NAME \
  --default-service $BACKEND_SERVICE_NAME
```

```bash
gcloud compute ssl-certificates create $SSL_CERTIFICATE_NAME \
  --domains $DOMAIN
```

```bash
gcloud compute target-https-proxies create $TARGET_HTTP_PROXY_NAME \
  --ssl-certificates=$SSL_CERTIFICATE_NAME \
  --url-map=$URL_MAP_NAME
```

```bash
gcloud compute forwarding-rules create $HTTPS_FORWARDING_RULE_NAME \
  --target-https-proxy=$TARGET_HTTP_PROXY_NAME \
  --global \
  --ports=443
```

## Summary
API Gateway でカスタム ドメインを設定しました。
基本的には、Google の Docs に従えば、問題なく使えると思います。
ドメイン系は、「Provisioning」の待ち時間があり、成功か失敗か分かりにくいため、避けがちです。

最近、加齢とともに脳機能の衰えを感じ始めました。
聞くところによると、手書きで文章を書いたり、小さな目標を持つと前頭前野が活性化されるそうです。
日々、その日の目標と達成するタスクを残して行きます。
責任ある親として、健康に生きるために。
Proxmoxでネスト仮想化した時のベンチマーク

Proxmoxは公式には単体で3%以下のパフォーマンスオーバーヘッドを謳っていますが、ネスト仮想化した場合にベンチマークがどのくらい変わるかテストしてみます。
# 結論
・ストレージはランダムアクセスで顕著に低下。
・CPUは10%低下。

:::note info
ベアメタルProxmox：4コア8スレッドCPU（Intel）、16GBメモリ、256GB NVMe
ネストProxmox：8コア仮想CPU、12GB仮想メモリ、128GB 仮想ディスク(LVM-Thin Raw、メモリキャッシュなし）
ゲストWindows Server：8コア、8GB、64GB、virtioドライバ導入ずみ
:::
まずはベアメタルVMでの計測です。
# ストレージ：ベアメタル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/a28459c5-f0d5-6438-14e9-038545d85adb.png)
# CPU：ベアメタル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/6b87e605-2beb-4c04-256d-81bd99224518.png)
つづいてネストProxmox上のVMでの結果。
# ストレージ：ネスト
ちょっとややこしいですが下のノードのPVE-Nestedがクラスター参加したのが上のノードnested1となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/130729a3-8484-71e3-3712-fe0510640322.png)
ランダムアクセスが有意に低下しています。
# CPU：ネスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7daf9b1e-d93b-28ce-8baf-2067891eb47e.png)
# まとめ
・ストレージはブロックサイズやメモリキャッシュの調整などが必要そう。
・CPUの10%低下は妥当な印象。Hyper-Vのオーバーヘッドに比べればはるかに実用的。
# 参考：ネスト仮想化の設定
デフォルトで有効でした。最近のPVEだとそうなんですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d0f2161f-862e-9770-ff36-eda3c3eab9a6.png)

CPUが既定のKVMのままだとこんなエラーになりますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/921087c3-17ad-c90a-cb08-b35274c1e2da.png)

Hostにすることで動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c46033ac-6f1e-96b5-607a-ee2ed593dde7.png)

# 参考にさせていただいたサイト：
https://izuminmin.com/network/proxmox-nest/
電気通信事業者 - 外部送信規律 対応まとめ(総務省ヒアリングメモ付き) - 2023年5月23日更新

個人で届出電気通信事業やっている人向けの記事

# 前提
2022年6月17日に改正電気通信事業法が公布され、2023年6月16日に施行される予定です。
外部送信規律観点では、タグや情報収集モジュールを使って、利用者に関する情報を外部に送信する場合に、利用者が容易に知り得るようにする規律を設けられています。[1]

対象事業者であるにもかかわらず当該措置をとらなかった場合には、業務の改善命令（改正法第29条第２項第４号）、報告及び検査（改正法第166条第１項）、法令等違反行為を行った者の氏名等の公表（改正法第167条の２）を行われる可能性があります。[2]


[1]https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_syohi/gaibusoushin_kiritsu.html#h01
[2]https://www.ikedasomeya.com/insight/9657


# 概要
次の3点を利用者が容易に知り得る状態に置く必要がある。[1]
1. 送信されることとなる利用者に関する情報の内容
2. 1の情報を取り扱うこととなる者の氏名又は名称
3. 1の情報の利用目的

![スクリーンショット 2023-05-23 20.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65312/ae63c1eb-1d79-0ef4-059a-529c38ea57c3.png)

[1]https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_syohi/gaibusoushin_kiritsu.html#h01


# まとめ: 外部送信規律対応 は プラポリを2段に変更すればok!
プライバシーポリシーを変更すれば対応できます。
2023年5月18日の総務省の資料[1]でパブリックコメントしている事業者NTTドコモ, KDDI, ソフトバンクのサービスの対応状況を調べた結果「au ナビウォーク」が対応済みでした。

その対応内容は次の整理です。つまり「送信情報の概要（プライバシーポリシー概要）[2]」を追加すれば問題ないです。

```
# au ナビウォーク
設定 -> 「送信情報の概要（プライバシーポリシー概要）」 -> プラポリ


# 一般的なアプリ
設定 -> プラポリ

```

LINEの事例
https://terms.line.me/line_rules_extmod?lang=ja


[1]https://www.soumu.go.jp/main_content/000880995.pdf
[2]https://www.kddi.com/app-policy/android/app-policy-abst-Naviwalk_GooglePlay-1.1.html


# 総務省に裏どりヒアリングしてみた

問合せ先は「[自分に関する情報が第三者に送信される場合、 自身で確認できるようになります。](https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_syohi/gaibusoushin_kiritsu.html#h01)」のページ下部


### 前提
電気通信事業者です。
外部送信規律で質問です。
[自分に関する情報が第三者に送信される場合、 自身で確認できるようになります。](https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_syohi/gaibusoushin_kiritsu.html#h01)の案内を読んだ上で質問します。
利用者が容易に知り得る状態に置くために通知又は公表を検討しています。


#### うちは外部送信規律の対象か？
■ 問合せ内容
外部送信規律に関するフロｰチャｰトを見ました。前提の通りです。私のサービスは外部送信規律の対象ですか？

■ 回答
対象となります

■ 資料 外部送信規律に関するフロｰチャｰト
![スクリーンショット 2023-05-23 20.05.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65312/1cfee63e-c01d-1cfe-1368-698aa8240b91.png)
 

       
#### 第三者のサーバについて解釈範囲について
■ サマリー
GCP(メインサービス提供)とGoogleAnalytics(分析)はそれぞれ分けてに記載が必要。これは「電気通信事業法 第二十二条の二の二十九」の「情報送信指令通信ごとに」によって規定されている。

■ 問合せ内容1
サービス提供のため運営するサーバは、Google のGCPを使ってサービス提供している。これは第三者サーバではない、対象外、通知に記載不要といった認識で良いか

■ 回答1
認識は間違っている。記載が必要

■ 問合せ内容2
分析のためにユーザ行動情報をGoogleAnalyticsに送信している。これは「第三者のサーバ」といった認識で良いか

■ 回答2
認識の通りである。記載が必要

■ 問合せ内容3
1と2を一括で記載してよいか

■ 回答3
タグごとに記載する必要がある

■ 問合せ内容4
タグごとに記載と紐づく法令を教えてほしい

■ 回答4
電気通信事業法施行規則第22条の2の29である。これは6月16日に施行される

■ 資料
[電気通信事業法施行規則第22条の2の29](https://elaws.e-gov.go.jp/document?lawid=360M50001000025_20230616_505M60000008002)
            
```
（利用者に通知し、又は利用者が容易に知り得る状態に置くべき事項）
第二十二条の二の二十九　法第二十七条の十二本文の総務省令で定める事項は、情報送信指令通信ごとに、次に掲げる事項とする。
一　当該情報送信指令通信が起動させる情報送信機能により送信されることとなる利用者に関する情報の内容
二　前号に規定する情報の送信先となる電気通信設備を用いて当該情報を取り扱うこととなる者の氏名又は名称
三　第一号に規定する情報の利用目的
```
            
#### AppとWeb対応について
■ 問合せ内容1
アプリとWebで同じサービスを展開しています。
通知はWebからもアプリからも容易に知り得る状態に置く必要があるといった解釈で間違いないか。

■ 回答1
間違いないアプリとWeb両者対応が必要である。









# さいごに
改正電気通信事業法の理念は素晴らしいと思います。
総務省の外部送信規律のご担当者様は電話応対中ですと、何度掛けても電話つながりませんでした。
本当にお疲れ様です☕☕☕
ROS 2でLIO-SAMを動かす

# 概要

ROS 2 Humble環境でサンプルのrosbagデータを使ってLIO-SAMを動かしてみた

https://github.com/TixiaoShan/LIO-SAM/tree/ros2


# インストール


### ROS2の依存パッケージのインストール

```bash
sudo apt install ros-humble-perception-pcl \
  	   ros-humble-pcl-msgs \
  	   ros-humble-vision-opencv \
  	   ros-humble-xacro
```

### gtsamのインストール

```bash
sudo add-apt-repository ppa:borglab/gtsam-release-4.1
sudo apt install libgtsam-dev libgtsam-unstable-dev
```

### LIO-SAMのインストール

```bash
mkdir -p ~/slam_ws/src
cd ~/slam_ws/src
git clone https://github.com/TixiaoShan/LIO-SAM.git -b ros2
cd ..
colcon build --symlink-install --packages-select lio_sam 
```

# サンプルのrosbag のダウンロード

master ブランチのSample datasetsから適当なサンプルのrosbagデータをダウンロードする


https://drive.google.com/drive/folders/1gJHwfdHCRdjP7vuT556pv8atqrCJPbUq


##  サンプルのrosbagファイルをROS2用のrosbag に変換

以下の記事を参考にrosbagsをインストールして使用する

https://qiita.com/porizou1/items/a8004ed1f238ea0242d9


```bash
rosbags-convert walking_dataset.bag
```

# 実行

/src/LIO-SAM/config/param.yamlの入力トピックを以下のように書き換える（walking_datasetの場合）

```yaml:param.yaml
    # Topics
    pointCloudTopic: "/points_raw"                   # Point cloud data
    imuTopic: "/imu_correct"                        # IMU data
    odomTopic: "odometry/imu"                    # IMU pre-preintegration odometry, same frequency as IMU
    gpsTopic: "odometry/gpsz"                    # GPS odometry topic from navsat, see module_navsat.launch file
```

LIO-SAMの実行


```bash
ros2 launch lio_sam run.launch.py
```

ダウンロードして変換したrosbagの実行

```bash
ros2 bag play walking_dataset
```



なんかうまくいかない

![rviz_screenshot_2023_05_23-20_10_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/5c5dae87-ae22-fd52-0b7c-7780b4912bbf.png)

rqt_graph


![rosgraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/093cec64-99ce-8d4c-da50-32c37ea9b9c3.png)

# 参考


https://memoteki.net/archives/3532


https://beike.hatenablog.jp/entry/LIO-SAM/VTC
Poetry備忘録

[参考](https://zenn.dev/shotakaha/scraps/9416c30cd7745a)

```shell
# Poetry install
$ curl -sSL https://install.python-poetry.org | python3 -

# Set the virtual env path to under the project directory
$ poetry config virtualenvs.in-project true --local

# Check the setup
$ poetry config --list

# Add pyproject.toml to an existing project
$ poetry init

# Add packages to Poetry
$ poetry add <Package name>
$ poetry add --group <Group name> <Package name>

# Install packages described in poetry.lock
$ poetry install

# Sanity check of pyproject.toml
$ poetry check

# Check the environment of poetry
$ poetry env info

# Build the package in PyPI
$ poetry build
$ poetry publish (-r <Repository name>)
```
【AdminLTE3】ウィンドウ幅の変更によりサイドバーが勝手に開閉する機能をオフにする

## 問題
AdminLTE3にて、ウィンドウ幅を992pxをまたぐように変更すると、サイドバーが勝手に開閉する。
広げると開き、狭めると閉じる。
私は勝手に開閉してほしくなかったので、どうにかして解決法を探った。

## 解決法
AdminLTE-3.x.x/dist/js/adminlte.jsの2042行目くらいからの条件分岐を変更する。(minのほうをscriptとして読み込んでる場合は注意してね)
その後、**キャッシュクリアしてスーパーリロードする。**

条件文を`true`と`false`にしちゃう。コメントしている部分が元々の条件文である。
```javascript:adminlte.js
// ↓これが2042行目
if ( true /* 修正前: $__default["default"](window).width() <= this._options.autoCollapseSize */ ) {
    if (!$bodySelector.hasClass(CLASS_NAME_OPEN$3)) {
        this.collapse();
    }
} else if ( false /* 修正前: resize === true */ ) {
    if ($bodySelector.hasClass(CLASS_NAME_OPEN$3)) {
        $bodySelector.removeClass(CLASS_NAME_OPEN$3);
    } else if ($bodySelector.hasClass(CLASS_NAME_CLOSED)) {
        this.expand();
    }
}
```


## 解説
もうちょっと広い範囲でコードを見るとこんな感じ。
```javascript:adminlte.js
_proto.autoCollapse = function autoCollapse(resize) {
    if (resize === void 0) {
        resize = false;
    }

    if (!this._options.autoCollapseSize) {
        return;
    }

    var $bodySelector = $__default["default"](SELECTOR_BODY);

    if ( true /*$__default["default"](window).width() <= this._options.autoCollapseSize*/ ) {
        if (!$bodySelector.hasClass(CLASS_NAME_OPEN$3)) {
            this.collapse();
        }
    } else if ( false /*resize === true*/ ) {
        if ($bodySelector.hasClass(CLASS_NAME_OPEN$3)) {
            $bodySelector.removeClass(CLASS_NAME_OPEN$3);
        } else if ($bodySelector.hasClass(CLASS_NAME_CLOSED)) {
            this.expand();
        }
    }
};
```
ここはサイドバーの自動開閉動作(開閉ボタン以外での開閉)を定義しているっぽい。
引数の`resize`は、ウィンドウ幅変更をして呼び出される際に`true`となる。

このコードのもうちょい上の方で定義される定数`autoCollapseSize`をいじることで、自動開閉するウィンドウ幅を変更できる。
上の方にそれが定義されてないならreturnするって書いてあるやんと思うが、それに従うと別の不具合が生じる。
具体的には、ウィンドウ幅が`autoCollapseSize`以下の場合で**サイドバーを閉じる際、サイドバー外をクリックする方法が動作しなくなる。**その処理はどうやら条件文をtrueに変更したif内で行われているっぽい。
windowsでgit bashから使えるコマンド一覧

実際には `/usr/bin`で確認できるものがgit bashから打てるコマンド一覧だそうです
基本的なbashのコマンドは一通り打てるのが便利でいいですね


個人的によく使うものをピックアップしてみます
lessなんかが使えるのは普通にありがたいですね

```
awk　cat　chmod　cmp　cp　diff　mv　echo　expr pwd
rm　sed　scp　sftp　sh　tail　kill　less　ls vi vim
```

コマンドプロントの方が便利になる時もあるんだろうか
AWS LambdaでSeleniumを動かすときに"Unable to import module 'lambda_function': urllib3 v2.0 only supports OpenSSL 1.1.1+, …

# 問題

・[AWS Lambda PythonでSeleniumを使える環境を構築する | DevelopersIO](https://dev.classmethod.jp/articles/aws-lambda-python-selenium-make-env/)
こちらの記事に従い、サンプルコードを実行したところ以下のエラーが出た。

~~~
Response
{
  "errorMessage": "Unable to import module 'lambda_function': urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with OpenSSL 1.0.2k-fips  26 Jan 2017. See: https://github.com/urllib3/urllib3/issues/2168",
  "errorType": "Runtime.ImportModuleError",
  "stackTrace": []
}
~~~

どうやらurllib3のバージョン2以降がOpenSSLのバージョンに適合しないらしい。
調べたところOpenSSLのバージョンはLambda的に出来ないらしいので、２通りの解決法を提示する。

# 解決１
python3.6環境で
~~~
pip install selenium -t python/lib/python3.7/site-packages
~~~
を実行し、作成された「python」フォルダをzip化してLambda Layerにアップロードする。

こうすればurllib3が1.26.15でインストールされるので解決ではあるが、できたらPython3.7でやりたくはある。
CloudShellでやるのがめんどかったのでローカルで作成してアップしたところ正常に動作した。
手元にPython3.6がある人におすすめ

# 解決２
CloudShell上で
~~~
pip3 install selenium==3.141.0 -t ./python/lib/python3.7/site-packages --use-feature=2020-resolver
~~~
した後に、
~~~
pip3 install urllib3==1.26.15 -t ./python/lib/python3.7/site-packages --use-feature=2020-resolver --upgrade
~~~
でurllib3のバージョンを1.26.15にし、「python」フォルダをzip化してLambda Layerにアップロードする。

こっちのほうがCloudShell上で完結するのでスマート



いずれの方法もLambda Layerをアップデートして、関数のレイヤー設定でバージョン設定を更新しないと反映されないので注意。
KotlinでFuelを使った時にデータが格納できなかった時の備忘録

Android開発の練習として、qiitaの記事を見るようなクライアントアプリを作る時に、Fuelを使ってデータの取得を試みたが、値が上手く格納できなかった

使っていたライブラリ（Fuel関係のみ）
```build.gradle(app)
dependencies {
    implementation "com.github.kittinunf.fuel:fuel:2.3.1"
    implementation "com.github.kittinunf.fuel:fuel-android:2.3.1"
    implementation "com.github.kittinunf.fuel:fuel-json:2.3.1"
}
```

試しに普通にAPIを呼ぶ関数を作成し、onStart()でAPIコールしてみる
(testList変数がプロパティとして存在する想定)
```
Fuel.get(url).responseJson { request, response, result ->
    when (result) {
        is Result.Failure -> {
             
        }
        is Result.Success -> {
            var list = JSONArray(result.get().array())
            for (i in 0 until list.length()) {
                testList.add()
            }
        }
    }
}
```


testListのsizeが0のまま処理が進んでしまう

非同期処理のため、APIのレスポンスを待たずに次の処理に移ってしまうため
fuel-coroutinesを使ってAPIコールするように変更した

```build.gradle(app)
dependencies {
    implementation "com.github.kittinunf.fuel:fuel:2.3.1"
    implementation "com.github.kittinunf.fuel:fuel-android:2.3.1"
    implementation "com.github.kittinunf.fuel:fuel-json:2.3.1"
    implementation "com.github.kittinunf.fuel:fuel-coroutines:2.3.1" //追加
}
```

```
runBlocking {
    val (_, _, result) = url.httpGet().awaitStringResponseResult()
    result.fold(
        { data ->
            var list = JSONArray(data)
            for (i in 0 until list.length()) {
                testList.add()
            }
        },
        { error -> Log.e(TAG, "An error of type ${error.exception} happened: ${error.message}") }
    )
}
```
これでtestListに値が入ってから処理が進む


違和感が凄いもののこの使い方はあってるのだろうか・・・・・
【PythonAnywhere・Django】デプロイ時、仮想環境でpip3 installしたモジュールがなぜかないことになっていてデプロイできない問題

## 問題
* Djangoアプリ内で、pip installが必要なモジュールをimportしている。
* **PythonAnywhereのWeb→「Start a console in this virtualenv」から `pip3 install 〇〇` をしたはずなのに**、デプロイすると「モジュール見つからん！」って言われる。

## 原因
デプロイ時に勝手に仮想環境をいじられて(？)しまうっぽい。

## 解決法
requirements.txtを使用する。

## 補足
ネットで調べてみると、「仮想環境下で`pip3 install`する」「requirements.txtを書く」の**どちらでも良いように書いているが、私の環境では後者しかうまくいかなかった。**
requirements.txtを使用すれば、デプロイ時に仮想環境にインストールしてくれる。こっちのほうがパッケージ追加のときに便利なのでこっちを使おう。
TAURI + SolidJSで開発してみる Part1

# はじめに
  昨年,Tauriに関する記事を書いた。あの頃は文化祭へ向けた作品を作っている中で,ちらっと見かけたTauriのリリース。お試し感覚で使ってみたが,個人的な評価はかなり高かった。いずれ使うことになるだろうと思っていたが,実際に使ってみようと感じる場面があったので,試してみることにした。
  この記事は,こちらの記事の延長として執筆しています。前回の記事の内容がなくても読める構成ですが,興味のある方は
[こちらの記事](https://qiita.com/Mksk/items/2fe4e8086aecda4ae5a4)も読んでいただけると幸いです。

# Tauriに移行しようと思ったきっかけ
  以前執筆した記事でも触れられているブラウザゲー。文化祭という一大イベントの後も開発を続けてきたが,デスクトップ版へ移植しようと思い立った。早速,Electronでの制作に取り掛かろうとしたわけだが,いくつかの問題が発生した。

#### モバイル版の存在
皆さん御存知の通り,ElectronはPC向けでありモバイルプラットフォームには対応していない。あわよくばモバイルも...と考えていたため,今回はElectronを見送ることにした。勿論Tauriも記事執筆時点でモバイル対応はしていないが,正式リリース時より,モバイル対応は公言されており,気長に開発している間に実装されるだろうという期待も込めてTauriを選択する理由の一つとした。

#### パフォーマンス
以前の記事からもわかるように,Tauriのパフォーマンスは素晴らしいものである。かなりの少数派であろうが,Web技術でデスクトップアプリを制作する,特にゲーム分野では有利に働くのではないだろうか。また,バックエンドにはRustという強力な言語が備わっている点も評価できる。

# 早速試す
Rust,Visual Studio(とC++によるデスクトップ開発)のインストールは終わっているものと想定させていただく。また,今回はCargoとnpm,yarnなどのパッケージマネージャーが利用可能だが,npmを利用する。

`npm i -D @tauri-apps/cli`
`npm i create-tauri-app`
で必要なパッケージをインストールしておく。
`npx create-tauri-app`
で以前の記事とは異なり,create-tauri-appを利用して手早く環境構築を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/673eba41-6b0f-3e92-2363-39eca8419400.png)
まず最初に,プロジェクト名を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/8091f801-32c1-547c-2e84-61f5a34fc88e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/3aef971e-75ae-5a97-f3a1-0e1b6170c3f7.png)
次に,フロント用の言語とパッケージマネージャーを選択する。上下矢印で変更できる。Rustを選択した場合はCargoを利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/41949b6f-4526-7b7c-8342-75b44d8efebc.png)
次に,UIテンプレートを選択する。今回はSolidを利用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/499c4d6f-e0d8-1ed4-b870-9efb3e9173b3.png)
最後に,TypescriptかJavascriptかを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/205ef60a-88ac-2e50-66f7-e4e02ea9fd4d.png)
このようなメッセージが表示されていれば,正常にプロジェクトが作成されている。
******
サクッとパッケージのインストールを済ませ,
念願の初回起動。
`npm run tauri dev`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/73e8bff4-8b9c-2af2-3db9-e67667fd163c.png)
そうするとビルドが始まるので,お茶でも飲んで待つことにする。(2~3分程)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/78114287-588e-181b-e67c-c177cfc89431.png)
中々いい感じのテンプレートが立ち上がった。勿論F12やCtrl+Shift+Iで開発者ツールを立ち上げられる。WindowsならEdgeの開発者ツールが起動するはずである。

## 軽く触ってみる
プロジェクトの構造はいたってシンプル。
`src`配下のファイルはフロント部分,`src-tauri`配下はtauri関連やメインプロセス(main.rs)が置かれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999574/f491953e-7718-7fea-914d-e8d35db1aa2f.png)
Dev環境が起動中であれば,ホットリロードも有効なのでとてもありがたい。

# さいごに
  昨年の復習がてら軽くTauriを使ってみたが,簡単にプロジェクト作成もでき,思っていたより敷居が低いのかなと感じた。本当の難所はメインプロセスにカスタムコマンドやその他処理を追加するところだろうが,そこは追って学習していこうと思う。
  TauriがElectronの代替となるかはどうか,今のところ定かではないだろう。しかし,これから益々とこのTauriが発展していくことを願って別れとさせていただく。是非とも良い開発ライフを送っていただけたらと思う。最後までお読みいただきありがとうございました。
paiza.ioでelixir その228

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
クローラーを実装せよ。

# 方針
pure elixirでやる。
与えられたurlを取得してlinkを取得して、htmlを取得して、titleを表示する。

# サンプルコード

```
:inets.start
:ssl.start

url = "https://qiita.com"
url = String.to_charlist(url)
{:ok, {_status, _headers, body}} = :httpc.request(url)
html = IO.iodata_to_binary(body)
Regex.named_captures(~r/<title>(?<title>.*?)<\/title>/, html)
|> IO.inspect
link = Regex.scan(~r/a href="https:\/\/qiita.com(\/.+?)" /, html)
Enum.map(link, fn [x, y] ->
    url = "https://qiita.com" <> y
    IO.inspect url
    url = String.to_charlist(url)
    {:ok, {_status, _headers, body}} = :httpc.request(url)
    html = IO.iodata_to_binary(body)
    Regex.named_captures(~r/title(?<title>.*?)\/title/, html)
    |> IO.inspect
end)

```

# 実行結果

```
%{"title" => "Qiita"}
"https://qiita.com/taruhachi/items/56085228fe17537cc0d8"
%{
  "title" => ">株式会社ゆめみサーバサイドコーディング試験模試(2023年度版)の回答例とフィードバック例 - Qiita<"
}
"https://qiita.com/taruhachi/items/56085228fe17537cc0d8"
```

# 成果物

https://paiza.io/projects/hbazoSr7qDKYhQHDZ6baEg?language=elixir


以上。
【PythonAnywhere】Webアプリ内からのウェブアクセス(スクレイピングetc)で403が返ってくる問題について

## 問題
Webアプリ内でスクレイピング等をしたとき、Webアプリでは500が返ってくる。
エラーログを見ると、スクレイピングの段階で403が返ってきている。

## 原因
PythonAnywhereの無料ユーザは、運営(？)がホワイトリストに追加したサイトにしかウェブアクセスできない。

## 解決法
課金する。
プランはどれでもOKっぽい。その後、Web→Reloadする。

## 補足
課金後の画面に「無制限のウェブアクセスのために課金した？そしたら、古い状態だとまだできないから、コンソールを立て直したりWebアプリをリロードしたりしてね！」と書いてある。

## 参考
https://www.pythonanywhere.com/forums/topic/14657/
Renpyのsmooth transformが半透明のまま止まってしまう

ノベルゲームエンジンRenpyでは、transformを定義して立ち絵に変化を加えることができます。
以下のsmooth transformは、立ち絵を滑らかに表示するtransformです 

```
# show および hide 時に実行される transform を定義する
transform smooth:
    on show:
        alpha 0.0
        linear 0.5 alpha 1.0
	#0.5秒で立ち絵の透明度を、0.0から1.0に変化させる
    on hide:
        alpha 1.0
        linear 0.5 alpha 0.0
 
label start:
    scene bg washington
    "「ここがワシントンD.C.か……」"
 
    # eileen vhappy を smooth トランスフォームを使って表示する
    show eileen vhappy at center, smooth
 
    e "「こんにちは！」"
 
    # 立ち絵をフェードつきで切り替えるために、show ステートメントを使用する
    show eileen happy at center, smooth
    e "「さようなら！」"
 
    # イメージにはすでにトランスフォームが設定されているので、hide 時に指定する必要はない
    hide eileen
 
    "……"
    "「え、何？」"
```

引用元(原文にコメントを付けた)

http://www.windproject.sakura.ne.jp/renpy/wiki/index.php?title=%E7%AB%8B%E3%81%A1%E7%B5%B5%E3%82%92%E3%81%AA%E3%82%81%E3%82%89%E3%81%8B%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B


# バグの事象
スキップすると、立ち絵が完全に表示されず、半透明のままになってしまう事象が発生しました。
# 原因
立ち絵の表情を変えると、on showのtransformがキャンセルされてしまうことが分かりました。
```
# show および hide 時に実行される transform を定義する
transform smooth:
    on show:
        alpha 0.0
        linear 0.5 alpha 1.0
    on hide:
        alpha 1.0
        linear 0.5 alpha 0.0
    on replace:
        linear 0.5 alpha 1.0
```
表情を置き換えた際に実行される、on replaceにも記述することで解決しました。
swift ui listの中にボタン二つ配置したいとかetc


例えばRowとか作るときlistに持っていかれたので全体をボタンにする必要がある

こんな感じ

    struct somerow: View {
        
        var body: some View {
            //全体をボタンにしないとリストに持っていかれる
            Button(action: {
                print("body")
                
            }) {
                
                VStack(alignment: .leading, spacing : 0) {
                    HStack(spacing : 0){
                        
                        Text()
                                            
                        Button(action: {
                            
                            
                        }, label: {
                            
                            Text("ボタン1")
                            
                        })
                        
                        HStack(spacing: 0){
                            
                            Text("ほにゃらら")
                            
                        }
                        
                        Button(action: {
                            
                            
                        }, label: {
                            Text("ボタン２")
                        })
                        
                        
                    }
                }
            }
        }
    }
    
    
呼び出し部分

    List {
        ForEach(somelist){ s in

            somerow()

        }
    }

こんな感じにすればListにタップ処理持っていかれなくなります
Falcorのインストール方法


こんにちは！今日はJavaScriptライブラリの一つ、Falcorのインストール方法についてわかりやすく説明します。

Falcorについては以下の記事をご参照ください。

https://qiita.com/omo_taku/items/ea9108572ca16d49e237

## **1. Node.jsとnpmのインストール**

まず、Node.jsとそのパッケージマネージャnpmがあなたのシステムにインストールされていることを確認してください。Node.jsはJavaScriptの実行環境で、npmはそのパッケージマネージャです。

公式の[Node.jsウェブサイト](https://nodejs.org)からダウンロードしてインストールできます。Node.jsをインストールすると、npmも同時にインストールされます。

Node.jsとnpmが正しくインストールされていることを確認するには、ターミナル（またはコマンドプロンプト）で以下のコマンドを実行します。

```bash
node -v
npm -v
```

これらのコマンドはそれぞれ、Node.jsとnpmのバージョンを表示します。

## **2. Falcorのインストール**

Falcorのインストールは非常に簡単で、ターミナルで一行のコマンドを実行するだけです。以下のコマンドを実行してください。

```bash
npm install falcor --save
```

このコマンドは、Falcorをあなたのプロジェクトの`node_modules`ディレクトリにダウンロードし、その依存関係をプロジェクトの`package.json`ファイルに追加します。

インストールが完了したら、以下のようにFalcorをプロジェクトにインポートできます。

```javascript
var falcor = require('falcor');
```

以上で、Falcorのインストールは完了です！

この手順を踏むことで、あなたのJavaScriptプロジェクトにFalcorを追加することができます。
What's New from CircleCI - 2023/05/23

CircleCIに関する最近1週間(2023/05/16~23)くらいの情報をまとめてみました。

気のつく限りの情報は拾ってみたつもりですが、見落としなどありましたら、Twitterで [@CircleCIJapan](https://twitter.com/CircleCIJapan) をメンションしてタレ込んでいただけると幸いです。
少しでもお役に立てていましたら、いいね(❤️)クリックいただけると嬉しいです！

[＜ What's New from CircleCI - 2023/05/16](https://qiita.com/CircleCIJapan/items/8804eee423c844b687a9) | 今週 | [What's New from CircleCI - 2023/05/30＞](https://qiita.com/CircleCIJapan/items/f05e02bea1a34acdd747)

# ユーザーブログ・スライド
- CircleCI活用ブログ
    - [AWS Lambda の 250MB 制限をなんとか回避した話 (Java 編)](https://tech.asoview.co.jp/entry/2023/05/19/161000) by アソビュー 村松さん
    - [可視化とDevOpsDays Tokyo 2023登壇を通して、自動テストの苦労と楽しさを共有した話](https://tech-blog.tabelog.com/entry/devops-days-tokyo2023-four-keys-metrics-for-test-automation) by 食べログ 渋谷さん

# Changelog (更新履歴)
- クラウド版の更新履歴: https://circleci.com/ja/changelog/
    - 05/04 [2023年 5 月 Android イメージの更新](https://circleci.com/ja/changelog/#2023年-5-月-android-イメージの更新)
    - 05/03 [UI の更新: setup_remote_docker を使用するジョブも表示](https://circleci.com/ja/changelog/#ui-の更新-setup-remote-docker-を使用するジョブも表示)
    - 05/01 ["Re-run failed tests only (失敗したテストのみを再実行)" オプション (プレビュー)](https://circleci.com/ja/changelog/#re-run-failed-tests-only-失敗したテストのみを再実行-オプション-プレビュー)
- サーバー版の更新履歴: https://circleci.com/ja/server/changelog/
- セルフホストランナーの更新履歴: https://circleci.com/ja/changelog/self-hosted-runner/
- プロダクト ロードマップ(今後の提供予定機能): https://circleci.com/ja/product-roadmap/

# CircleCI Discuss (CircleCIからのお知らせ＆コミュニティ掲示板)
- 日本語アナウンス: https://discuss.circleci.com/tag/ja-%E6%97%A5%E6%9C%AC%E8%AA%9E

# CircleCI 公式ブログ
- [日本語ブログ](https://circleci.com/ja/blog/)
- [英語ブログ](https://circleci.com/blog/)
    - [Setting up continuous integration with CircleCI and GitLab](https://circleci.com/blog/setting-up-continuous-integration-with-gitlab/)
    
# YouTube (動画コンテンツ)
- [CircleCI チャンネル (日本語)](https://youtube.com/playlist?list=PL9GgS3TcDh8x71MTG2uvZ-ljhIkuveSHZ)
- [CircleCI Channel (English)](https://www.youtube.com/c/CircleCI-Videos)
    - [Why platform engineers choose CircleCI](https://youtu.be/FToH8ZwX1QQ)

# CircleCI Knowledge Base
- [How to Add Deprecated Debian Stretch Repositories](https://support.circleci.com/hc/en-us/articles/15543700539419-How-to-Add-Deprecated-Debian-Stretch-Repositories)
- [How to set the device when creating a new avd with the Android orb](https://support.circleci.com/hc/en-us/articles/15550052428187-How-to-set-the-device-when-creating-a-new-avd-with-the-Android-orb)
- [How to view and delete GitLab Webhook Deliveries](https://support.circleci.com/hc/en-us/articles/15420016405019-How-to-view-and-delete-GitLab-Webhook-Deliveries)
---
それでは今週も Happy Building⌨!
【初心者】React,Next.jsの門をたたくために利用した教材の共有【JavaScript~Next.js】

## はじめに

業務ではバックエンドでPHP(Laravel)を利用して開発しています。

技術のキャッチアップのため、自分でアプリを開発してみたりしますが、バックエンドオンリーの技術スタックでは開発していて面白さが感じられませんでした。

自分の技術の幅を広げるためにも無理のない範囲で、フロントエンドの技術を学んでみようと思い、簡単なものならなんとなく読める、触れるくらいのレベルになってきたので、その学習のステップを共有します。

## 概要

- 自分の技術の幅を広げるために行ったフロントエンドのキャッチアップ方法を紹介
- レベル感のあった教材選びが大切
- 自分が使った教材の紹介

## 学んだ技術について

- Javascript
- TypeScript
- React.js
- Next.js
- Figma

**学習に躓いたポイント**

最近頻繁に耳にするNext.jsが触れるようになりたいと思い、Reactに触ったこともないような状態でいきなりNext.jsの学習をスタートさせてしまったことです。

書籍や動画を見ても何をしているのかさっぱり分からず、ただコードを模写するだけになってしまいました。

自分のレベルに合わせて5〜6割くらいは理解が及ぶところからステップアップして学んでいくのが私には合っているようでした。

## 学習方法
上で一旦躓いて、レベル感を見直して再度やり直したものになります。
各言語やフレームワークごとに記載します。

### JavaScript・React
Udemy講座で学習をスタートさせました。
モダンJavaScriptの基礎から始める挫折しないためのReact入門
https://www.udemy.com/course/modern_javascipt_react_beginner/
プレーンなJavaScriptから説明してくれて、その流れのままReactまで行けるので基礎の把握にちょうどいい教材だったと思います。

### Next.js

書籍で学習しました。

最初に「**TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発**」という書籍でTypeScriptと一緒に学んでしまおうと考えましたが、TypeScriptと Next.jsに加えて周辺知識となるJestやStorybookにつまづき挫折しました。

レベルを下げました。
書籍の「**作って学ぶ Next.js/React Webサイト構築 (Compass Web Development)**」
こちらでJavaScriptで動かすNext.jsを学びました。持ち合わせのJavaScriptとReactの知識に上乗せするイメージでNextjsの雰囲気をつかむのに適した教材だったと思います。

### TypeScript

すでに2回ほどつまずいているので入念に準備しています。

書籍でハンズオン形式でTypescriptを学べる、次の書籍を活用しました。

**TypeScriptハンズオン**

その後、Udemyで復習をかねた学習を行いました。

[【世界で7万人が受講】Understanding TypeScript 日本語版 | Udemy](https://www.udemy.com/course/understanding-typescript-jp/)

全部で１６時間ほどある長尺の講座ですが、評価も高いですし、基礎から学べます。また、実際にハンズオンでアプリを作ったり、バックエンドとの連携も解説されています。私はもともと、バックエンドの勉強を楽しむのが目的でフロントエンドを始めているのでかなり適した記事だったと思います。

### Figma

どうせなら簡単なデザインくらいできるようになってしまいたいという気持ちになった時期があり以下で学習しました。

[初心者から始めるアプリデザイン＜UI/UXデザインをFigmaで学ぼう！＞Webデザインにも応用可能 | Udemy](https://www.udemy.com/course/figma-app-design/)

デザインの知識は全くありませんが、Figmaの操作自体はそれほど難しくないので動画で気楽に学べていい教材だったと思います。基本操作とオートレイアウト程度を覚えておくと便利かなと感じます。

私の場合はAWS AmplifyからReactコードを自動生成できるという記事をみて俄然興味がわくようになりました。どんなもんか試した記事も書いているのでよろしければご覧ください。

[AWS Amplifyを利用してReactコードを自動生成してみる - Qiita](https://qiita.com/ryosuke-horie/items/6acae5a0097e79e4c91e)

## 学習用のアプリの開発

上記の書籍やUdemy講座でだいたいの基礎の学習が終わったため、学習用にアプリを開発してみました。

**家計簿アプリ**

クソアプリすぎるので画像だけで失礼します。

![rapture_20230523074149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781232/0fb7b4ff-aa46-2e73-922a-4bae0cc0b6b7.jpeg)

こちらはReact.js, TypeScriptを利用しています。書籍TypeScriptハンズオンでFirebase Realtime databaseが紹介されていたので利用しています。

**技術ブログ**

[ry-tech blog (rytech-blog.vercel.app)](https://rytech-blog.vercel.app/)

これは「**作って学ぶ Next.js/React Webサイト構築**」を参考にして作成しています。もともとはJavaScriptで書いていましたが、TypeScriptを導入したり、Qiita APIを利用して自分の投稿した記事を載せたりなど一部オリジナルにしています。

## 最後に

フロントエンドを学び始めたことでバックエンドオンリーの時期よりも開発が楽しくなりました。

知識が浅いので対応できなくなって挫折することがありますが、自分のレベルにあった教材を見極めるのがコツなのかもしれません。特にUdemyは初心者むけの講座がそろっているので便利ですね。

UdemyとChatGPTを活用した学習のTipsを紹介した記事も書いているのでぜひご覧ください。

[【ChatGPTとUdemyで効率的に学ぶ方法】AWSとLaravelを例に紹介 - Qiita](https://qiita.com/ryosuke-horie/items/d05beb5ba33ba787e781)
【Xcode エラー】「Cannot find 'Calender' in scope」【クソしょうもないエラー】

とあるUdemyのSwiftの講座を模写し終えた後にビルドしたら
以下の画像のようにエラーが起きた。

![スクリーンショット 2023-05-23 18.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/38210253-e32b-2425-c61d-8f4e5a7c5290.png)

![スクリーンショット 2023-05-23 18.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/dddf7be4-f81f-9892-b653-097b9e1de8c3.png)

１枚目の画像を見てもらえたら分かるように
「FSCalendar」はちゃんとimportしているのになぜエラーが起きるのか？

ライブラリのバージョン？と最初は思っていた。

疑問を抱きながらも
エラーメッセージ「Cannot find 'Calender' in scope」をググってみた。

そしたら以下の参考記事のコメントで

##### 「You probably made a typo Calender -> Calendar」

といったコメントがあったので綴りミスの可能性を考えて
もう一度自分の書いたコードを見直したら

##### しっかりと「Calendar」ではなく「Calender」と書いていました。。笑

海外の人も同じようにミスっているので
よくあることかもですがクソしょうもないエラーでした。。。

### 《参考記事》'Cannot find Calender in Scope'
https://www.reddit.com/r/SwiftUI/comments/l7vv9p/cannot_find_calender_in_scope/
<firebase auth>idp経由(OAuth)で認証したアカウントの更新時の挙動

■ updateEmail
https://firebase.google.com/docs/auth/web/account-linking?hl=ja

上書きされる。idpはそのまま。
ただ、idpと関係ない任意のemailでも更新されるため、注意が必要

■ reauthenticate
https://cloud.google.com/identity-platform/docs/web/reauth?hl=ja

新規ユーザーが追加される。旧ユーザーは存在したまま

■ link
https://firebase.google.com/docs/auth/web/account-linking?hl=ja

ユーザーの中(providerData)に入れ子で追加される。
どちらのアカウントでも認証は通る。
rootのアカウント(auth.currentUser)は変わらない。
xxx@google.com に yyy@google.comを紐づけることも可能
[Tricentis Tosca]Wait Onを使って処理が完了するまで待機する

みなさま、お疲れ様です。
Tricentis Toscaを利用する機会が増えてきました。
回帰テスト実施する際に
「この画面が出て来るまで止めたい」と言う機会がありましたので
その時に試したことは紹介します。

## X秒待機
良く利用していたのが
![スクリーンショット 0005-05-23 17.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/eb6dd5ac-15ce-df67-7d81-feee0824cd75.png)
このように使う事により
次のテストを実施するまでに5秒待機します。

とある日
先輩から
「このやり方ってたまたま5秒で上手く言ってるけど
データが増えたりして対象のデータが表示するまでに5秒以上掛かった場合はテストコケるよね」（ニッコリ
、、、
わかりました

## Action Mode WaitOnを実装
### 概要
ActionMode WaitOn
Valueフィールドで指定された値またはプロパティを提供するまで、TestCase の実行を一時停止します。

### 実装![スクリーンショット 0005-05-23 17.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/e657e5e8-db46-9d8a-e6a1-8ff34b9d8f40.png)
上記のように設定します。
それでは実行して見ましょう。
![スクリーンショット 0005-05-23 17.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/6b907981-559c-6dfc-1503-aa59e0cc05d6.png)
一覧画面が表示されるまで待機
![スクリーンショット 0005-05-23 17.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/14c12268-5875-6ed4-7bf4-8011af9210f1.png)
詳細画面が表示されるまで待機

上記のように設定した情報が表示されるまで次のテストが実施されることが確認できました。

## 問題
![スクリーンショット 0005-05-23 17.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/c6c6ce8f-5cc3-b3c0-cdf7-9268eac1862f.png)
Tricentisが途中で止まる問題が発生しました。
![スクリーンショット 0005-05-23 17.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/2168d806-01b9-21e6-1ef2-fc8e58f70113.png)
どうも、Wait Onに定義している情報が表示されるまでに時間が掛かり過ぎているようです。

解決策としては
１）Project＞Setting
２）TBox＞Synchronization
![スクリーンショット 0005-05-23 17.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/59801472-cacb-2fb6-5046-336d126edef6.png)
上記のように設定します。
デフォルトでは10秒が設定されているようなので一旦30秒を設定します。
![スクリーンショット 0005-05-23 17.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/6b907981-559c-6dfc-1503-aa59e0cc05d6.png)
一覧画面が表示されるまで待機
![スクリーンショット 0005-05-23 17.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/14c12268-5875-6ed4-7bf4-8011af9210f1.png)
詳細画面が表示されるまで待機
![スクリーンショット 0005-05-23 17.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/2fac9ec0-25fb-f319-40af-85820fd6735c.png)
Tricentisのテスト結果で問題ないことを確認しました。

## 参考記事
◆Timing
https://documentation.tricentis.com/tosca/1410/en/content/standard_subset/automation_tools/timing.htm
◆ActionMode WaitOn
https://documentation.tricentis.com/tosca/1320/en/content/tosca_commander/table_waiton.htm
【Paiza問題集】標準出力メニュー/n*nの2次元配列の表示

# Paiza問題集

## 標準出力メニュー/n*nの2次元配列の表示

### Step01 2*2の出力
```Python
"""
2*2の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step1
"""

# 数値の出力
print('{} {}'.format(0, 8))
print('{} {}'.format(1, 3))
```

別解1
```Python
# 数字の出力
print(0, 8)
print(1, 3)
```
別解2
```Python
# 数値の出力
print('0 8')
print('1 3')
```

### Step02 3*3の出力
```Python
"""
3*3の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step2
"""

# 数字を受け取る
numbers = input().split(' ')

# 3*3の表示する
for i in range(len(numbers)):
    # 数字の表示
    print(numbers[i], end='')
    # iの余りが2の時、改行する
    if i % 3 == 2:
        print()
    # それ以外はスペースでつなげる
    else:
        print(' ', end='')
```

別解
```Python
# 数字を受け取る
numbers = input().split()
# 数字列の表示
for i in range(0, len(numbers), 3):
    print(*numbers[i: i+3])
```
上記の例では
```Python
print(*numbers[i: i+3])
```
でnumbersをスライスで指定し表示させている


### Step03 九九表の出力
```Python
"""
九九表の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step3
"""

# 九九表の表示
for i in range(1, 10):

    for j in range(1, 10):
        if j == 9:
            print(i * j)
        else:
            print(i * j, end=' ')
```

別解
```Python
#九九表の表示
for i in range(1, 10):
    print(*[i*j for j in range(1, 10)])
```

内包表記を用いることで短く書くことができる
```Python
print(*[i*j for j in range(1, 10)])
```
は、jがrange(1, 10)の間i*jを行い
その結果を引数としてprint()に渡している


### Final問題 【n*nの2次元配列の表示】N*Nの九九表の表示
```Python
"""
【n*nの2次元配列の表示】N*Nの九九表の表示
"""

# 数字を受け取る
number = int(input())

# 受け取った数字*数字の表を表示する
for i in range(1, number + 1):

    for j in range(1, number + 1):
        if j == number:
            print(i * j)
        else:
            print(i * j, end=' ')
```

別解
```Python
# 数字を受け取る
number = int(input())

# 数字の表を出力する
for i in range(1, number+1):
    print(*[i*j for j in range(1, number+1)])
```
Bardに自分のブログを書かせてみた。

Googleが発表したBardで自分の記事を書かせてみた。
![スクリーンショット 2023-05-23 18.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580819/527087e6-6606-24c8-5086-8c3420bcf153.png)
ChatGPTとか、色々使い分けしながら適材適所で使いやすいものを選択していく必要がありそうですね。
楽しい世の中になってきました、
[備忘録] jsで任意のulにliを追加する方法

```html index.html
<ul id=list>
 <!-- ここにJSでリストアイテムを追加したい！　-->
</ul>
```


```js script.js
// 親要素を指定する
var list = document.getElementById('list');

// 追加する要素を作成
var li = document.createElement('li');
li.innerHTML = 'list_item';

// 末尾に追加
list.appendChild(li);
```

## ボタンを押した時に〜〜〜みたいな挙動

```html index.html
<button id=btn> ここ！マダガスカル！　</button>
<ul id=list>
 <!-- ここにJSでリストアイテムを追加したい！　-->
</ul>
```

```js script.js
const add_btn = document.getElementById('btn');
var ul = document.getElementById('list');

add_btn.addEventLister('click', function(){
    var li = document.createElement('li');
    li.innerHTML = 'マダガスカル！！！'
    list.appendChild(li);
}};
```
Eclipse上で表示する、JSPファイルコンソールのフォント変更方法【備忘録】

デフォルトのJSPコンソールのフォントが見辛かったため変更しようとしたところ、
変更する場所がいくらググっても出てこず、四苦八苦したため備忘録として残すことにしました。

<h3>環境</h3>
Pleiades 2022<br>
Eclipse ver2022-12(4.26.0)

<h3>方法</h3>
1.ウィンドウ -> 設定 -> 外観 -> 色とフォントを開く<br>

![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535171/1945d17b-8e55-97dd-64eb-45851566335b.png)


2.構造化テキスト・エディター -> 構造化テキスト・エディターの~　を開き、編集をクリック<br>
![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535171/339b8ae0-b900-7127-18e4-7f0930353a8a.png)



3.好みのフォントと文字サイズに変更し、OK -> 適用を行う






完全に個人用メモみたいなものですが、どこかの誰かの参考になれば幸いです。
Ghế Massage Sankito

Ghế massage Sankito mang lại lợi ích sức khỏe đáng kể cho người dùng với giá cả rất đa dạng giúp cho mọi người dễ tiếp cận hơn với sản phẩm này. Bên cạnh đó, ghế massage Sankito là sự đầu tư đáng giá cho sức khỏe và cuộc sống hiện đại. Với công nghệ đột phá, các dòng sản phẩm đa dạng và lợi ích to lớn.
Tên DN : Sankito
Gmail : sankito.com@gmaill.com
Địa chỉ : Lầu 3, số 6 Phan Chu Trinh, P.Tân Thành, Q.Tân Phú, TP.Hồ Chí Minh.
Website : https://sankito.com/ghe-massage
Mạng xã hội của tôi :
https://www.linkedin.com/in/ghe-massage-sankito/
https://www.pinterest.com/GheMassageSankito/
https://twitter.com/GheMassage1
https://www.twitch.tv/ghemassagesankito
https://t.me/s/ghemassagesankito
Webアプリをdocker化する方法

# Dockerによるコンテナ作成手順
webアプリをdocker化する方法について、Dockerfileを用いる場合とdocker composeで行う場合それぞれ記載します。

:::note warn
Docker Desktopを既にインストール済みで起動している場合を想定しています。
まだDocker Desktopをインストールしていない場合はインストールしてから拝読ください。
:::


# Dockerfileを用いる場合

[getting-started リポジトリ](https://github.com/docker/getting-started/tree/master "getting-started リポジトリ") からアプリをダウンロードしてください。
次に下記コマンドでDockerfileを作成してください。
```:作業ディレクトリにDockerfileを作成
$ cd getting-started
$ touch Dockerfile
```
Dockerfileを下記のように編集します。

## Dockerfile
```dockerfile:Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
```

## Dockerfileからコンテナを立ち上げる
まず、docker buildコマンドを使ってコンテナイメージを構築します。
```
docker build -t getting-started .
```

下記コマンドでホストとコンテナのポートをそれぞれ3000に指定してコンテナを立ち上げます。
ウェブブラウザで http://localhost:3000 にアクセスするとダウンロードしたアプリが表示されます。
```
$ docker run -dp 3000:3000 getting-started
```

# Docker Composeを用いる場合
まずRailsアプリを用意し、Railsアプリが配置されているディレクトリにcdコマンド等で移動してください。

Docker Composeは、複数のコンテナを用いるアプリケーションでDockerイメージのビルドやコンテナの起動、停止の操作をより簡単に行えるようにするツールです。
Docker Desktopをインストールしている場合すでに存在しています。

## Dockerfileを作成
　まずは下記のようにRailsアプリの直下のディレクトリ（Gemfile等と同じ階層）にDockerfileを作成します。
```dockerfile:Dockerfile
# Docker Hubからイメージを取得
FROM ruby:3.0.2

# ワーキングディレクトリを指定
WORKDIR /Myapp

# aptを更新し、必要なパッケージをインストールする
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# ホストのGemfileとGemfile.lockをコンテナの/Myappにコピー
COPY Gemfile /Myapp
COPY Gemfile.lock /Myapp

# Gemをインストール
RUN gem install bundler -v 2.3.0
RUN gem update --system

# ホストのpackage.jsonとyarn.lockをコンテナ内にコピーする
COPY package.json yarn.lock /src/

# yarnをインストール
RUN yarn install
RUN bundle install
```

```:Dockerfileと同じ作業ディレクトリでdocker-compose.ymlを作成
$ touch docker-compose.yml
```


``` docker-compose:docker-compose
version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    # ホストのポートとコンテナのポートを紐づけ
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## Gemfileを編集
Gemfileに以下のコードを記載することでrailsでPostgreSQLを使うことが可能になります。
``` Gemfile:Gemfile
gem 'pg', '~> 0.18.4'
```

## config/database.ymlを編集
データベースとWebアプリを接続するため、database.ymlを下記のように編集します。
``` yml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: postgres
  port: 5432
  pool: 5
```

## コンテナを作成して起動
下記コマンドでコンテナを作成し、http://localhost:3000 にアクセスすることでRailsのページが表示されます。
```
docker compose up -d
```

## 参考
https://docs.docker.jp/get-started/02_our_app.html

https://docs.docker.jp/compose/rails.html
'v-slot' directive doesn't support any modifierで足踏み

既にこの内容は他の方が取り上げられていますが、このエラーで数時間足踏みしてしまったので、自分の備忘録も兼ねて残しておきます。

## 実現したかった内容
Firebaseから取得したデータを表形式で表示し、表の各項目をテキストボックスとすることによって、データ編集が可能な画面を作ろうとしていました。

## 環境
- Windows 11
- Vue.js 2.7.14
- Vuetify 2.5.5

## 最初に書いたコード
```vuejs:vue
<v-data-table
    :headers="headers"
    :items="dataList">
    <template v-slot:item.dataNo="{ item }">
        <v-text-field v-model="item.dataNo" />
    </template>

    （省略）

</v-data-table>
```
他の記事を参考にしながら最初に実装したのがこちらになりますが、`v-slot`の記述部分にエラーが出て実行できませんでした。
```:エラー文
Expected '#item' instead of 'v-slot:item'.
'v-slot' directive doesn't support any modifier.
```
その後、ネットの記事を見漁って他の記述方法などを試して、上記とは違うエラーが出て混乱し、また別の書き方を探す...というループに嵌ってしまいました。

結局以下のようにESLintを無効にするよう記述することで一応は解決し、ようやくエラーが消えて安堵していました。
```vuejs:vue
<!-- eslint-disable-next-line -->
<template v-slot:item.dataNo="{ item }">
    <v-text-field v-model="item.dataNo" />
</template>
```
しかし、後になってエラーの内容を見てみると、ESLintは別の書き方を推奨しているということだったので調べてみました。

## 推奨の書き方
こういった書き方がESLint的には望ましいようです。
```vuejs:vue
<template #[`item.dataNo`]="{ item }">
    <v-text-field v-model="item.dataNo" />
</template>
```

(参考にしたstackoverflow)
https://stackoverflow.com/questions/61344980/v-slot-directive-doesnt-support-any-modifier