OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPT に Salesforce Lightning Web Components (LWC) プログラミングを実施させるための初期プロンプト v0.1

ChatGPT に Salesforce Lightning Web Components (LWC) プログラミングを実施させるための初期プロンプトを探す旅をしています。これは v0.1 です。
とりあえず初期バージョンの初期プロンプト（キャラ設定）を以下に貼り付けておきます。

# ChatGPT に Salesforce Lightning Web Components (LWC) プログラミングさせるための `初期プロンプト`

```
Introducing Lightning Web Components.
Now you can build Lightning components using two programming models:
Lightning Web Components, and the original model, Aura Components.
Lightning web components are custom HTML elements built using HTML and
modern JavaScript. Lightning web components and Aura components can
coexist and interoperate on a page. To admins and end users, they both
appear as Lightning components.

Lightning Web Components is available in Enterprise, Performance,
Unlimited, and Developer editions.

Lightning Web Components uses core Web Components standards and provides
only what’s necessary to perform well in browsers supported by
Salesforce. Because it’s built on code that runs natively in browsers,
Lightning Web Components is lightweight and delivers exceptional
performance. Most of the code you write is standard JavaScript and HTML.

Salesforce is committed to developing open web standards and is a member
of the World Wide Web Consortium (W3C).

Salesforce developers are contributing members of the Ecma International
Technical Committee 39 (TC39), which is the committee that evolves
JavaScript.

Base Lightning components are available as Aura components and as
Lightning web components. The Component Reference includes
documentation, specifications, and examples for both. See Base
Components: Aura Vs Lightning Web Components for differences between
them.

For more information regarding the Lightning Web Components programming
can be found at the following URL:

https://developer.salesforce.com/docs/component-library/documentation/en/lwc

- Use 57.0 as apiVersion.
- LWC の JavaScript に記述する `catch((error)` の箇所では、`showToast` メソッドを呼び出して、エラー内容を画面にトースト表示してください。
- LWC の `@wire` は使用しないでください。

If you understand, reply OK simply.
```

# バージョン

- [GitHub 上に履歴付きで全てのリソース](https://github.com/igapyon/chatgpt-prompts/blob/devel/programming/salesforce/lwc.md)
Terraform でリソース内の個々の引数単位で条件分岐を適用する

Terraformでは、リソースの作成自体の制御にはcountを使用しますが、リソース内の個々の引数を定義するかどうかの制御にはcountでは対応できません。
この記事では、dynamicブロックでこれを実装する方法を解説します。

# リソースの作成自体の制御


以下のように、countを使ってリソース作成有無を制御できます。

```
resource "example_resource" "example" {
  count = <条件> ? 1 : 0
  ...
}
```

# リソース内の引数に対する定義の制御

一方、リソース内の個々の引数の定義有無の制御は、dynamicブロックで実現できます。

例として、ibmcloud kubernetes serviceにおいて、特定のゾーンを使用するかどうかをフラグ（enable_zone1, enable_zone2）で制御する場合、以下のような定義になります。

```
resource "ibm_container_vpc_cluster" "cluster" {
  name                            = var.cluster_name
  vpc_id                          = var.vpc_id
  flavor                          = var.flavor
  worker_count                    = var.worker_count
  resource_group_id               = var.resource_group_id
  dynamic "zones" {
   for_each =  var.enable_zone1 ? [1] : []
   content {
     subnet_id = var.subnet1_id
     name      = var.subnet1_zone
   }
  }
  dynamic "zones" {
   for_each =  var.enable_zone2 ? [1] : []
   content {
     subnet_id = var.subnet2_id
     name      = var.subnet2_zone
   }
  }
}
```

この例では、enable_zone1およびenable_zone2がtrueの場合にのみ、対応するゾーンの引数を定義しています。
このように、dynamicブロックを活用することで、リソース内の引数を柔軟に制御することが可能です。
【Git】ローカル→リモートへpushしたい（既にリモートリポジトリがある場合）

基礎的な内容ですが久々にやるとなんだっけ？となってしまったため

# どんな時に読む記事？

- 既にgitのリモートリポジトリが存在する状態から`git push`までやりたいとき

- `git clone`　と　`git init`〜`git remote add`の違いについて知りたいとき

# `git clone`

`git clone`は既存のリモートリポジトリを文字通りクローン（コピー）してくるコマンドです。

ex)以下二つが存在するとき

- `local-dir`というローカル環境のディレクトリ
- `remote-repo`というリモートリポジトリ

local-dir上で実行した場合

```
~/local-dir $ git clone <remote-repoのURL>
~/local-dir $ ls
remote-repo
```

こんな感じで`local-dir`配下に`remote-repo`がまるっと入ってきます。
この状態の`remote-repo`は既にリモートリポジトリとの接続設定が済んでおり、`git add`等をしたときにデータが保存されるなどgitの操作の要となる`.git`ディレクトリも含まれています。

https://qiita.com/tatane616/items/dbad66179754be57d2e2

つまりこの場合は、以下のような状態になります。

```
local-dir
 　├　　既存のファイルやディレクトリ（あれば）
　　　└ 🆕remote-repo　　🤝 remote-repoリポジトリ（リモートリポジトリ）
　　　　　　　　└　　諸々リモートにあったファイルやディレクトリ
```

# `git init` 〜 `git remote add`

まず`git init`は既存のディレクトリをgitの管理下におくためのコマンドです。
＝ローカルリポジトリ作成のためのコマンド

実行すると前述した`.git`ディレクトリをカレントディレクトリ内に置いてくれます。

```
~/local-dir $ git init
Initialized empty Git repository in /User/hoge/local-dir/.git/
~/local-dir[master] $ ls -a        
.			.git      //.gitは隠しファイル
..			
```

次に`git remote add`は既存のリモートリポジトリとローカルリポジトリを紐づけてくれるコマンドです。

```
~/local-dir[master] $ git remote add <remote-repoのURL>
~/local-dir[master] $　　git remote -v  // 正しく設定されていればこんな感じで表示される↓
origin	git@(中略).git (fetch)
origin	git@(中略).git (push)
```

こうすることで、先ほどinitして管理下に置かれた`local-dir`ディレクトリからリモートリポジトリに`git push`や`git pull`ができる状態になります。

つまりこの場合は、以下のような状態になります。

```
local-dir　　🤝 remote-repoリポジトリ（リモートリポジトリ）
　└　　既に作成していたファイルやディレクトリ（あれば）
```


# まとめ：こんな時はこれを使う！

### `git clone`

- ローカルにまだディレクトリやpush予定のファイルなどを作っていない
- リモートリポジトリまるまる持ってきたい

### `git init` ~ `git remote add`

- 既にローカルにディレクトリやファイルが作成済み
- ローカルのディレクトリをリモートに紐付けたいだけ


# 参考文献

https://hokaccha.hatenablog.com/entry/20110802/1312278626

https://www.sukerou.com/2019/12/git-tipsgit.html
logback-accessのfilterはJaninoではなくIAccessEventを使用

https://stackoverflow.com/questions/44710219/my-evaluatorfilter-doesnt-work-in-spring-boot-logback-access-xml にあるとおり、logback-access.xmlでは```JaninoEventEvaluator```ではなく```AccessEvent```でfilterのexpressionを記述の必要がある。なので起動時にこんな感じのエラーメッセージが出る。

```java
20:46:19,031 |-ERROR in ch.qos.logback.access.boolex.JaninoEventEvaluator@7779f32e - Could not start evaluator with expression [return formattedMessage.contains("/hoge");] org.codehaus.commons.compiler.CompileException: Line 1, Column 25: Unknown variable or type "formattedMessage"
	at org.codehaus.commons.compiler.CompileException: Line 1, Column 25: Unknown variable or type "formattedMessage"
```


```groovy
plugins {
  id 'java'
  id 'org.springframework.boot' version '3.0.5'
  id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.codehaus.janino:janino'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  implementation 'ch.qos.logback:logback-access'
}

tasks.named('test') {
  useJUnitPlatform()
}
```

```java
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import ch.qos.logback.access.tomcat.LogbackValve;

@Configuration
public class LogbackAccessConfig {

  @Bean
  public WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> webServerFactoryCustomizer() {
    return (factory) -> {
      LogbackValve v = new LogbackValve();
      // v.setFilename(new ClassPathResource("logback-access.xml").getPath());
      factory.addEngineValves(v);
    };
  }
}
```

<code>src/main/resources/conf/logback-access.xml</code>のサンプルは以下のとおり。URLに```/hoge```を含む場合はアクセスログを出力しない。eventの出力は```ch.qos.logback.access.spi.AccessEvent```になる。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      <evaluator>
        <expression>
        System.out.println(event);
        return (event.getRequestURL().contains("/hoge"));</expression>
      </evaluator>
      <OnMatch>DENY</OnMatch>
    </filter>
    <encoder>
      <Pattern>combined</Pattern>
      <Pattern>[ACCESS] %h %l %u %r %t{yyyy-MM-dd HH:mm:ss.SSS} %s %b %D ms</Pattern>
    </encoder>
  </appender>

  <appender-ref ref="STDOUT" />
</configuration>
```
RubyでAtCoder ABC282(A, B, C)を解いてみた

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

# A - Generalized ABC
https://atcoder.jp/contests/abc282/tasks/abc282_a
```ruby:a-282.rb
k = gets.to_i
print *("A"..(64 + k).chr)
```
## 解説
chrメソッドを使って簡単に実装することができます。

# B - Let's Get a Perfect Score
https://atcoder.jp/contests/abc282/tasks/abc282_b
```ruby:b-282.rb
n, m = gets.split.map(&:to_i)
arr = Array.new(n){ gets.chomp }

ans = 0
for i in 0..n - 2
  for j in i + 1..n - 1
    check = true
    m.times do|k|
      if arr[i][k] == 'x' && arr[j][k] == 'x'
        check = false
        break
      end
    end
    ans += 1 if check
  end
end
puts ans
```
<追記>
コメントでいただいた別解になります。
```ruby:別解
n, m = gets.split.map(&:to_i)
ss = Array.new(n) { gets.chomp }

ss.map! { |s| s.each_char.map { _1 == "o" ? true : false } }
puts ss.combination(2).count {|a, b|
  a.zip(b).all? { _1 | _2 }
}
```
## 解説
三重ループにして問題文の通り愚直に実装すればOKです。

# C - String Delimiter
https://atcoder.jp/contests/abc282/tasks/abc282_c
```ruby:c-282.rb
n = gets.to_i
s = gets.chomp
flag = false

n.times do |i|
  if s[i] == '"'
    flag = !flag
    next
  end
  s[i] = '.' if s[i] == ',' && !flag
end
puts s
```
<追記>
コメントでいただいた別解になります。
フリップフロップを使って簡単に範囲指定ができるみたいです！すごい
```ruby:別解１
n = gets.to_i
s = gets.chomp

n.times do |i|
  next if (s[i] == '"')...(s[i] == '"')
  s[i] = "." if s[i] == ","
end
puts s
```
正規表現を使っています。
>>[^"]+ のほうにマッチする部分文字列が見出されたとき，その部分文字列が ( ) によってキャプチャーされます。
キャプチャーされた文字列は，$1 で参照できます。
一方，".*?" のほうにマッチする部分文字列が見出されたとき，$1 は nil を返します。

とのことです。
```diff_ruby:別解２
n = gets.to_i
s = gets.chomp

- puts s.gsub(/([^"]+)|".*?"/){ |i| i.include?('"') ? i : i.gsub(/,/, ".") }
+ puts s.gsub(/([^"]+)|".*?"/){ |i| $1 ? i.tr(",", ".") : i }
```
## 解説
flagを使って括られている範囲を調べています。そして、括られていない部分で`,`があれば`.`に変えることで実装することができます。

メモ
↓　なぜ、別解２のような正規表現の書き方ができるのか？

https://qiita.com/scivola/items/10830d32a8bb38094be5#fn-fsl
>>・".*?"："から次の"まで
・[＾"]+："以外の文字の連なり

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
# 参考
https://qiita.com/agotoh/items/87960d256e427d5673a9
AWS Lambda で API Gateway 経由して Python で POST データを受け取る

Lambda 側でも POST データを受け取れます。
application/x-www-form-urlencoded で送信されたPOSTデータを受信してみます。

```lambda_function.py
import json
import urllib.parse

def lambda_handler(event, context):
    # TODO implement

    # イベントとコンテキストの内容を出力
    print( "event:" , event )
    print( "context:", context )

    # QueryString をパースする
    strBody = event.get('body')
    param = urllib.parse.parse_qs(strBody)

    # パラメータを取得する
    strParam1 = param['param1']
    strParam2 = param['param2']

    # パラメータの内容を出力する
    print( "strParam1:", strParam1 );
    print( "strParam2:", strParam2 );

    return {
        'statusCode': 200,
        'body': json.dumps('ok')
    }
```

event.body に格納された文字列を urllib で parse する必要があります。

```run.sh
#!/bin/sh

TARGET='https://xxxx.execute-api.ap-northeast-1.amazonaws.com/default/lambda-test-04'

API_KEY="XXXX"

PARAM1="param1=aaa"
PARAM2="param2=bbb"


curl -o - "${TARGET}" -d ${PARAM1} -d ${PARAM2} --header "x-api-key:${API_KEY}"
```

実行結果として CloudWatch にパラメータが出力されます。

```
strParam1: ['aaa']
strParam2: ['bbb']
```

パースした結果は配列として格納されているようです。同じパラメータ名の変数がPOSTされた場合には配列で取れるようです。


では、multipart/form-data でファイルをPOSTすることができるかを確認しているのですが、ネットを検索するとできるようなことも書いてあるのですが、うまく設定できず未確認の状態です。

ただ、こちらでアップロードした方法は下記の方法で REST API にバイナリファイルを直接送りつけるということはできるようです。

下記の例は、lambda にPOSTした画像ファイル（test.jpg）をS3のtokyo20230412バケットに格納するサンプルです。
```lambda_function.py
# -*- coding: utf-8 -*-

import json
import urllib.parse
import boto3
import base64

def lambda_handler(event, context):
    # TODO implement

    # イベントとコンテキストの内容を出力
    print( "event:" , event )
    print( "context:", context )

    # パラメータを取得
    param = json.loads( event['body'] )

    file_data = param['file']
    data = base64.b64decode( file_data.encode( 'utf8' ) )

    client = boto3.client('s3')
    client.put_object(Body=data,Bucket='tokyo20230412',Key='test.jpg')

    return {
        'statusCode': 200,
        'body': json.dumps('ok')
    }
```

上記のlambdaにPOSTをするPythonコードが下記のものになります。
このコードをローカルで実行するとAWS上のLambdaを経由してS3に画像ファイルが格納されます。
```test.py
import json
import requests
import base64

image = "header.jpg"
data = open(image, 'rb').read()
encoded_data = base64.b64encode(data).decode('utf-8')

url = 'https://xxxx.execute-api.ap-northeast-1.amazonaws.com/default/lambda-test-05'

payload = {'file': encoded_data}
headers = {'x-api-key': 'XXXX'}

response = requests.post(url, data=json.dumps(payload), headers=headers)

print( response )
```

view を掌るブラウザ側からは JavaScript を使ってPOSTをすることになると思うので、multipart/form-data を使用できなくても、入力項目とファイルを個別のLambdaにPOSTすればよいだけなのですが、PHPで記述した既存のWebアプリケーションをServer less に移行する場合は改修が必要となるポイントとなります。
ファイルコピーツール

# VBScript で以下の機能を実現しました

- 手動で三つのフォルダを指定することができます。
- １つ目のファイルをベースとして二つ目のフォルダを検索し、二つ目フォルダに同階層同名のファイルがある場合、三つ目のフォルダにコピーします。
- コピー先のフォルダが存在しない場合、新規作成します。

## 詳細

以下の VBScript コードを使用して、フォルダ間でファイルをコピーできます：


```vb
Option Explicit

Dim Folder1, Folder2, Folder3
Folder1 = InputBox("フォルダ1のパスを入力してください。", "フォルダ1のパス") ' ユーザーにフォルダ1のパスを入力させる
Folder2 = InputBox("フォルダ2のパスを入力してください。", "フォルダ2のパス") ' ユーザーにフォルダ2のパスを入力させる
Folder3 = InputBox("フォルダ3のパスを入力してください。", "フォルダ3のパス") ' ユーザーにフォルダ3のパスを入力させる

Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

If Not objFSO.FolderExists(Folder1) Then
    MsgBox "フォルダ1が存在しません"
    WScript.Quit
End If

If Not objFSO.FolderExists(Folder2) Then
    MsgBox "フォルダ2が存在しません"
    WScript.Quit
End If

If Not objFSO.FolderExists(Folder3) Then
    objFSO.CreateFolder(Folder3)
End If

ProcessFolder objFSO.GetFolder(Folder1)

MsgBox "操作が完了しました"
Set objFSO = Nothing

Sub ProcessFolder(ByVal objFolder)
    Dim objFile, objSubFolder, targetFile, targetFolder

    For Each objFile In objFolder.Files
        targetFile = Replace(objFile.Path, Folder1, Folder2)
        targetFolder = Replace(objFile.ParentFolder.Path, Folder1, Folder3)

        If objFSO.FileExists(targetFile) Then
            If Not objFSO.FolderExists(targetFolder) Then
                objFSO.CreateFolder(targetFolder)
            End If
            objFSO.CopyFile targetFile, targetFolder & "\" & objFile.Name, True
        End If
    Next

    For Each objSubFolder In objFolder.SubFolders
        targetFolder = Replace(objSubFolder.Path, Folder1, Folder3)
        If Not objFSO.FolderExists(targetFolder) Then
            objFSO.CreateFolder(targetFolder)
        End If
        ProcessFolder objSubFolder
    Next
End Sub

```vb
Pythonでマージソートを実装してみた

# 概要
Pythonでマージソートを実装してみました。以下のページを参考にしました。
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort6.html

# ソースコード
上記のC言語のfor文をwhileに書き換えましたが、アルゴリズムは新規ではありません。

```merge_sort.py
import random

data = {}
data2 = {}
temp = {}
NUM = 10
i = 0
while i < NUM:
    data[i] = random.random()
    i = i + 1

#show
def show_data():
    print("==>> show data")
    i = 0
    while i < NUM:
        print ( str(i) + ":" + str(data[i]) )
        i = i + 1

def show_data2():
    print("==>> show data2")
    i = 0
    while i < NUM:
        print ( str(i) + ":" + str(data2[i]) )
        i = i + 1

#copy
def copy_data_to_data2():
    print("==>> copy data to data2")
    i = 0
    while i < NUM:
        data2[i] = data[i]
        i = i + 1

#merge_sort
def merge_sort(array, left, right):
    print("==>> merge sort")
    mid = 0
    i = 0
    j = 0
    k = 0
    if left >= right:
        return

    mid = int((left + right) / 2)
    merge_sort(array, left, mid)
    merge_sort(array, mid + 1, right)

    i = left
    while i <= mid:
        temp[i] = array[i]
        i = i + 1

    i = mid + 1
    j = right
    while i <= right:
        temp[i] = array[j]
        i = i + 1
        j = j - 1

    i = left
    j = right

    k = left
    while k <= right:
        if temp[i] <= temp[j]:
            array[k] = temp[i]
            i = i + 1
        else:
            array[k] = temp[j]
            j = j - 1
        k = k + 1
            
copy_data_to_data2()
show_data2()
merge_sort(data2, 0, NUM-1)
show_data2()
```

# 実行結果

実行できました。アルゴリズムは正常に動いているようです。

```
$ python3 merge_sort.py 
==>> copy data to data2
==>> show data2
0:0.29081339539145956
1:0.5427579427841487
2:0.7331297206563734
3:0.3809205017667163
4:0.9338518052340457
5:0.6284414307985343
6:0.7340759201674373
7:0.9766655155239733
8:0.4522226565719808
9:0.8563382594665773
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> merge sort
==>> show data2
0:0.29081339539145956
1:0.3809205017667163
2:0.4522226565719808
3:0.5427579427841487
4:0.6284414307985343
5:0.7331297206563734
6:0.7340759201674373
7:0.8563382594665773
8:0.9338518052340457
9:0.9766655155239733
```

何かの役に立てばと。
大量に送付されてくる書類。勝手に仕分けして！

## 書類判定されている様子
https://twitter.com/MitsuhiroM82423/status/1647864459598364674

https://twitter.com/MitsuhiroM82423/status/1647865329891287041

みなさん、こんにちは。
紙、印鑑、手作業に埋もれて業務をしているX世代の会社員です。
私は、毎日、毎日いろいろなところから、様々な書類が届きます。
デジタル化しているとはいえ、みなさんの中にも**大量の書類**に埋もれている方もいると思います。
その中から、優先的に処理を行わなければいけない**書類を仕分ける**ことは、必須であります。

## 課題
私の担当業務は、ある一定期間の商品仕入れ金額に応じて、購入代金の一部を返金していただくという割り戻し契約に基づき、毎月契約先に返金金額を報告していただく「割り戻し金計算確認書」を提出していだいています。
この「割り戻し計算確認書」には、「確定」という報告と「途中経過」という報告と2種類あります。
こんな書類で、ここの部分で判別。
![20230413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/41a3d72a-1ef2-27fc-10ab-b33acbf34902.png)

仕分け自体は簡単ですが、1,000枚／週。「確定」：「途中経過」2：8の割合で一緒に届きます。
PDFで届いていますので、出力してから仕分けしています。
「確定」の報告の場合は、次に請求書作成、送付という作業があり、契約先に関わることであり、優先的に行う必要があります。契約先は、振込手続きに時間もかかるため、「請求書を早くほしい」という要望も多いです。これに少しでも早く対応することが課題であります。

## 使用するもの

・LINE Developers
・Teachable Machine
・Node-RED

## 作り方

Teachable Machineにサンプル画像をアップロードして**学習**させます。
![2023-04-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/8d5506d5-a725-b005-3984-50b6a486237b.png)

**学習後**です。
![2023-04-13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/5bbdf57e-ecf8-2030-34d4-ae34dfc18f98.png)

**Node-REDの全体図**です。
![2023-04-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/0f5c609c-8430-9618-35d1-bfa43dafdcdf.png)

### Node-REDの設定
ノードの順に設定内容をご紹介します。

①　webhookの設定
![2023-04-13 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/1344e892-ffb5-716a-65ab-d57dfc991667.png)
②　templateの設定
プロパティの<font color="blue">messageIdの「I」は、大文字</font>です。
![2023-04-13 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/fd9d686e-a472-cef3-6c51-acac988a2759.png)
③　http requestの設定
URLは、以下を入力。（<font color="blue">注：messageIdの「I」は、大文字です。</font>）
https://api-data.line.me/v2/bot/message/{{{messageId}}}/content
「**認証を使用**」にチェックを入れ、種別を「**Bearer認証**」に切り替え、
LINE Developersの**チャネルアクセストークン**を貼り付けてください。
出力形式を「**バイナリバッファ**」に切り替えます。
![2023-04-13 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/760b86b9-e9f6-160e-a29f-e48f21bc4daf.png)
④　teachable machineの設定
Urlは、先ほど作成した**teachable machineのURL**を貼り付けてください。
![2023-04-13 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/c54ce68c-a604-7442-1165-4eb565968625.png)
⑤　templateの設定
![2023-04-13 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/d4a5468c-7f72-f644-7b97-87fd36f6d838.png)
⑥　switchの設定
![2023-04-13 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/f90140a8-d7ae-4aac-1a91-582a6ae563bf.png)
⑦　Replyの設定
LINE Developersの**チャネルアクセストークン**を貼り付け、ReplyMessageを入力してください。
![2023-04-13 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288463/8bd27875-e998-0ed2-e4a7-61757d2905f0.png)

## 今後の取り組み
本当は、判定したファイルを各フォルダに保存したかったのですが、今回はここまで。
作業効率化には、仕分け済みのフォルダを確認すれば、すぐに作業にとりかかるのがベスト。
なので、次の製作は、判定後のフォルダ保存です。
おたのしみに～

## 同僚からのアドバイス
判定したファイルをフォルダに保存できず考え込んでいた私。
判定後に画像データが行方不明でファイルがないのです。
そこで同僚が一言。
「画像データがあるうちに、一旦、仮フォルダに保存して、判定後に移動させたらさせたらどうですか？」
なるほど！挑戦してみます。ありがとう。
Laravel9でjetstreamを使う際のNo publishable resources for tagを解決したい

# 経緯
公式ドキュメントどうりにJetstreamのLivewireを使用したいと思った時に4時間は溶かしてしまったので今後の誰かのためになればと思い記事にしました。

何に困っていたかと言うと、vendorフォルダ内にあるjetstreamに関するviewsファイル群がpublicizeできないことによってjetstreamの機能が使えないことです。


### 前提条件
- OS : mac
- 環境 : xampp
- composer : v2.5.1
- Laravel : v9.52.5


# 結論
### Laravel v9(latest)でJetstreamを使用するなら、Jetstreamのバージョンを下げた指定でダウンロードしましょう


## 詳細

公式ではcreate-projectから丁寧に下記のようなコマンドまで入力入力内容が表記されています。
その問題となっている下記のコードを手順通りに入力すると、
```shell:terminal
php artisan vendor:publish --tag=jetstream-views
```
↓↓↓↓↓↓↓↓↓↓
```text:terminal
[INFO]  No publishable resources for tag [jetstream-views].  
```
と、うまくパブリッシュなリソースフォルダにjetstreamに関するviewsファイル群を移行できなかったとエラーの戻り値が表示されます。

<下記がそのまま進めて行った際のエラー画面>
![スクリーンショット 2023-04-13 18.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/e120b17e-3c7a-384a-90de-a2a207461367.png)

`Unable to locate a class or view for component [jet-dialog-modal].`
と言うエラーで調べてもうまくヒットしませんでした。

---

:::note info 
OKパターン
:::

以下はOKパターンです。
Laravelのバージョンは9とします

#### PROJECT_NAME : jetstream-app
#### DB_NAME : livewire_app_db

```shell: terminal
# プロジェクト作成 versionは9で指定
composer create-project "laravel/laravel=9.*" jetstream-app

# プロジェクトへ移動
cd jetstream-app

# versionは2.9.0で指定
composer require laravel/jetstream:"2.9.0"

# Livewireをインストール
php artisan jetstream:install livewire
```

ここまでできればあとはnpmの設定のみです
```sh: terminal
npm install
npm run build
```


```sh
# 今回はローカルでxamppを使用しています
# http://localhost/phpmyadmin/ からDBを作成します
# その後、.envのDB_DATABASEの項目を変更します
DB_DATABASE=laravel
# ↓
DB_DATABASE=livewire_app_db

# 公式だとすぐ下記コマンドを入力するような表記ですが、DBを先に作成しましょう
php artisan migrate
```

ここで最後にうまくいかなかったコマンドです
```
php artisan vendor:publish --tag=jetstream-views
```
結果は

![スクリーンショット 2023-04-13 19.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/f6d326a4-b5af-9e69-2caf-5c1789608a1e.png)

無事vendorフォルダ内のフォルダ1式がコピーできていました。
めでたしめでたし。


```
npm run build
```
も忘れず実行しておきましょう


### 備忘録記事


https://tanden.dev/%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86composer%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%8C%87%E5%AE%9A%E3%81%AE%E5%82%99%E5%BF%98%E9%8C%B2/


下記からインストールできるjetstreamのバージョンが確認できます。

https://packagist.org/packages/laravel/jetstream#v2.9.0


```sh: バージョン確認コマンド (terminal)
# Laravel flameworkのバージョン確認方法
php artisan --version

# インストールしたパッケージのバージョン確認方法
composer show laravel/jetstream

# このコマンドで確認したら、コンフリクトverの表記あったので入力して確認してみましょう
composer show --all laravel/framework
```
Create Dual-Protocol Volume on Azure NetApp Files

Azure NetApp Files とのクラウドストレージサービスとしてSMBとNFSのプロトコルをサポートし、デュアルプロトコルもご利用は可能です。

早速作成してみましょう！
■操作の流れ：
1、Azure NetApp Filesアカウントの作成
↓
2、Azure NetApp Filesアカウントの「AD参加」に必須項目を入力
↓
3、Dualプロトコルボリュームの作成
↓
4、DualプロトコルボリュームをLinux仮想マシンへマウント
↓
5、DualプロトコルボリュームをWindows仮想マシンへマウント
↓
6、Windows仮想マシン側にユーザーの[uid][gid][obejectclass]等を設定
↓
7、Linux側から設定したユーザーへ切り替え、通常の操作が可能
↓
8、Windows仮想マシン側からLinux側作成したものが確認可能

■具体的な手順：
1、Azure NetApp Filesアカウントの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/3b2ec727-6296-4c42-6a91-8aff1dab0a31.png)
必要な項目を入力し、直ぐにアカウントが出来上がります。

2、Azure NetApp Filesアカウントの「AD参加」に必須項目を入力

3、Azure NetApp Filesアカウントのメニューバーから「ボリューム」をクリックし、ボリューム作成画面に必要な項目を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/c184aaa5-b102-f1d5-72a8-81879c711981.png)

プロトコルタイプの箇所には「Dual-Protocol」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/e3b5702b-f8be-d3e6-08a8-6c9cdab88a40.png)

4、作成したボリュームのメニューバー①「マウントに関する指示」の中で図②で表示されたコマンドをコピペして、Linux仮想マシンへマウント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/322b029c-fab9-e2f4-ba99-535da69c4781.png)

5、Windows仮想マシン側は図の③で表示されたマウントパスを「Map Network Drice」としてマウント

6、Linuxユーザー側でマウントしてからWindows仮想マシン側にてLinuxユーザーの[uid][gid][obejectclass]等を設定(LDAPユーザーはLDAPサーバー上で特定のPOSIX属性を持つ必要の為)
「スタート」-->「Windows管理ツール」-->「Active Directory Users and Computes」-->ドメインの配下「Users」を右クリックし、該当ユーザーを右クリックし、下記のように設定を行い
    ※もし「Attribute Editor」は表示されない場合、「Active Directory Users and Computes」の「view」から「Advanced Features」に選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/abc700be-f2a6-f8fb-66ae-8e3c307ca3f2.png)

補足情報：もし不定期なユーザーまたは一時的なアクセスだけをしたい場合、Azure NetApp FilesアカウントのAD参加のところ、「Allow local NFS users with LDAP」のチェックにも入れる、ただこのオプションを有効にすると、LDAPサーバーからのユーザーの認証と参照動作が停止になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/14610429-7bc4-9305-7da9-f68e9fc0cf40.png)

7、Linux側から設定したユーザーへ切り替え、通常作業が可能です。
　　※間違い入力等一緒に見せてる形でお許しを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/93385a04-31dd-bde1-809b-261170734d7d.png)

8、Dual-testというフォルダを作成してみました。
　 Windows仮想マシン側で作成されたフォルダはNFS側でも確認可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/2cf46ba1-cd98-38ee-21fa-5b168fac0ba5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230994/39283ff4-c400-d57f-e4c2-77b9779f3c99.png)


もしDual-Protocolが気になる方は是非お試しください！
【Python自分用メモ】ダックタイピングとは

## はじめに
ダックタイピングについて本で読んだ内容を記録に残します。

## ダックタイピングとは
「あるオブジェクトが必要なデータ属性やメソッドを備えていれば、どのクラスのオブジェクトであるかは問わない」という考え方。
Pythonはダックタイピングを採用しており、引数がどのクラスのオブジェクトかは問わない。

```Python:duck.py
def add(x, y):
    print(x, '+', y, '=', x+y)

add(1, 2)
# 1+2=3
add('Hello', 'Python')
# Hello+Python=HelloPython
```
関数addに渡す引数のオブジェクトが+演算子に対応していれば、オブジェクトのクラスは問わない。
→整数も文字列も引数にして関数を呼び出すことができる

## 名前の由来
ダックタイピングという名前は、「もしもアヒルのように歩き、アヒルのように鳴くならば、それはアヒルに違いない」という考え方（＝ダックテストと呼ばれる）に由来している。

## 参考書籍
『Python[完全]入門』　松浦健一郎, 司ゆき 著
t検定の結果がNaNの対処法

## 概要
ライブラリ等で、検定を行った際の出力結果がNaNやnanと表示される時の対処法について説明します

例えば、以下のコードのようなウェルチのt検定(平均値の差の検定)を実行したとします

```Python
# 検定したい列
column = "column1" 

# グループ1とグループ2の標本データ
group1 = df1[column]
group2 = df2[column]

# ウェルチの検定を行う 等分散でない(equal_var = False), 
t, p = ttest_ind(group1, group2, equal_var=False)

# t値とp値を表示する
print("t値: ", t)
print("p値: ", p)
```

### 出力結果
```Python
t値:  nan
p値:  nan
```
すると、出力結果がnanと表示され、どうやらおかしいです
t値やp値は数値で表されるべき値です
今回はこれの対処法を解説します

## 対処法

この原因は、入力値の中にnanが含まれていることです
これが最も起こりやすく多い原因です

その場合は、先ほどのコードをこのように書き換えます
```Python
 `変更前`
# グループ1とグループ2の標本データ
group1 = df1[column]
group2 = df2[column]

`変更後`
# グループ1とグループ2の標本データ
group1 = df1[column].dropna()
group2 = df2[column].dropna()
```

こうすることによって、事前にnanの含まれる部分が除外され、出力結果が正しくなります

## 結論

- nanが入っていると検定はできない
    - 対処法
        - 入力データからnanを取り除く（データフレームなら`.dropna()`をつける）

## 余談
`ttest_ind`には`nan_policy`というパラメータがあり、nanがあった場合の対応を指定できる
- nan_policy = 'propagate'(デフォルト)
    - nanを返す
- nan_policy = 'raise'
    - エラーを返す
- nan_policy = 'omit'
    - nanを無視して計算する
    - しかし、一部使えない検定があるため注意が必要

余談は以下のサイトを参考にしました

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html
Visual Studio 2022 17.5 の新機能「テキスト スペル チェッカー」

# 前置き

Qiita のタイムラインから拝見した以下の記事を読んで、Visual Studio の方にも同じような拡張機能があると良いなと思い、探して見ると…
[【全人類へ】お前らはスペルミスが多すぎるッッ！！絶対に入れて欲しい拡張機能！【VisualStudioCode】](https://qiita.com/f0lst/items/400b01e430d06f0be690)
（サンタさんとトナカイのやり取り形式が微笑ましいですね）

なんと、公式で対応していました。
[テキスト スペル チェック (プレビュー) の詳細](https://learn.microsoft.com/ja-jp/visualstudio/ide/text-spell-checker?view=vs-2022)
2023/02/21 にリリースされた  Visual Studio 2022 バージョン 17.5 で対応されています。

# 使ってみた

さっそく 17.5 系にバージョンアップしました。

> スペル チェック機能のオンとオフを切り替えるには、メイン ツール バーの [テキストスペル チェッカーを切り替える] ボタンを使用するか、
> メニュー バーから [編集]>[詳細]>[テキスト スペル チェッカーを切り替える] コマンドを選択します。

とのことですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/8fa4df81-d329-f947-5bdb-9e6d01a54bc6.png)

このボタンですね。青枠付きが ON の状態です。

では、.cs クラスのファイルでわざとスペルミスした変数を書いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/eba44abb-cb52-dbc5-5cb9-d353816e3024.png)

メッセージが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/f9cb5e94-18ce-c6f9-6a67-f697ac188439.png)

エラー一覧にも表示されます。
あーっと、引数で使われている略称の`args`も注意されてしまいますね。
`args`にカーソルを置くとメニューに「考えられる修正内容を表示する」が表示されるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/480b5568-cc0c-c1eb-85cf-b9571cb8ed64.png)

修正の提案内容が表示出来たり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/90c9456c-5c13-2492-4f93-c31bea83b098.png)

「無視する」を選択すると、スペルミスと認識されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/3635f61e-6c6e-ab70-062a-953dff0281f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/e5daf2d4-3693-9a29-8dd9-769132125452.png)

`.edtiroconfig`に設定を追記することでスペルチェックの機能をカスタマイズ出来ます。
`spelling_error_severity = error` とすればスペルミスをエラーにすることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/54b5ded5-caa7-b607-3218-f638c2ac0d67.png)

※ スペルチェックの除外対象とする単語を登録する機能もあるようなのですが、↓以下の動作が自分の環境だと確認出来なかったので、また調査したら結果を追記したいと思います

> これにより、独自の除外辞書を作成して、スペルが正しいと思われる単語を指定できます。除外辞書は、ソース管理にチェックインできるシンプルなテキスト ファイルで、ファイルの各行には、正しいスペルの単語と見なされる単語が 1 つずつ含まれています。この例では、ソリューション内の任意のファイルに対してスペル チェッカーが初めて実行されるときに、Visual Studio は .sln ファイルと同じディレクトリ (C# プロジェクトの場合) またはルート ディレクトリ ( C++ ディレクトリの場合)。ファイルが存在しない場合は、スペル チェッカーによって作成されます。次に、単語を無視することを選択するたびに、この除外.dic ファイルに追加されます。Visual Studio は、この exclude.dic ファイルに含まれるすべての単語を正しいスペルの単語と見なします。
【2023年】基礎ゼロでPythonを学ぶ | 初心者によくあるPythonエラー

初心者のPythonistaにとって学習中にコードを実行するのは多かれ少なかれエラーが発生することがあります。最初は大変そうに見えたかもしれませんが、コード量が蓄積されるにつれて、実行時のエラーが発生したときに問題の原題を迅速に特定することができます。次はよくある7つのエラーを整理して、書いたコードがあまりこれらのエラーが発生しないようになったら、Pythonのパワーは階段を上っていきます。

### 1. 変数または関数名のスペルミス
**エラーヒント：“ NameError: name ‘fooba’ is not defined ”**

エラーは次のコードで発生します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/1.code_.png)

### 2.演算子++または-は存在しない
**エラーヒント：“ SyntaxError: invalid syntax ”**

C++、Java、PHPなどの他の言語に慣れている場合は、++、または-演算子を使用してみたいかもしれません。Pythonにはこのような演算子はありません。

エラーは次のコードで発生します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/2.code_.png)

### 3.存在しない辞書キー値を使用する
**エラーヒント：“KeyError：‘spam’”**

エラーは次のコードで発生します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/3.code_.png)

### 4.メソッドの最初のパラメータにselfパラメータを追加し忘れました
**エラーヒント：“ TypeError: myMethod() takes no arguments (1 given) ”**

エラーは次のコードで発生します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/4.code_.png)

### 5.リストが空かどうかを確認する
リストに基づいていくつかの操作を行う前に、リストが空かどうかを判断する必要があります。 初心者は通常、 len メソッドを使用してリストの長さが0であるかどうかを判断します。より良い方法は、リスト自体を直接使用して、リストが空かどうかを判断できます。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/5.code_.png)

### 6.複数のリストに一つのインデックスを使用する
2つのリストの値を加算したいと仮定すると、通常、インデックス0からリストの最後までループし、ループごとにリスト項目を加算して新しいリストを構成します。

pythonは、より良い方法zip()を提供し、2つのリストオブジェクトをペアで表示されるtuple要素リストに再結合します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/6.code_.png)

### 7.不要なインデックス
テキストリストがあり、添字インデックスと一緒に出力したい場合は、反復ごとに 1 ずつ増加する個別の数値変数を定義できます。

より高速な方法は、enumerate() メソッドを直接使用することです。これは、各反復で要素の添字インデックスと要素自体を返します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2023/02/7.code_.png)
【Python】to_datetimeでValueErrorエラーが出た時の解決方法

データフレームの日付列を文字型から日付型へ変更するところで躓いたため、対策を書きました！

## 変更したいデータ
下の表のように存在しない日付や年度のみが混ざっている列をYYYY-MM-DDの形に変更していきます。
|id|日付        |
|:---------|:---------:|
|0         |2022/2/20    |
|1         |2022/*     |
|2         |2022/15/6  |
|3         |2022/5/6  |
|4         |2022/16/10 |
|5         |2022/22/25 |
|6         |2022/15/6  |

## このままto_datetimeをやってみる
なにも加工していないデータを型変更するとValueエラーが発生します。
```python
 import pandas as pd

# test用のデータフレーム
df= pd.DataFrame(data={
    'id': [0,1,2,3,4,5,6],
    '日付':["2022/2/20","2022/*","2022/15/6","2022/5/6", "2022/16/10", "2022/22/25", "2022/15/6"]
})

# 変換
df['日付'] = pd.to_datetime(df['日付'], format='%Y-%m-%d')

```
```terminal
ValueError: time data "2022/15/6" at position 1 doesn't match format specified
```

存在しない日付があるとエラーが出てしまいす。
下の表の日付達が犯人！

|id|日付        |
|:---------|:---------:|
|1         |2022/*     |
|2         |2022/15/6  |
|4         |2022/16/10 |
|5         |2022/22/25 |
|6         |2022/15/6  |

## errorsを設定して解決
to_datetimeにerrors='coerce'を追加してあげるだけ！
これで存在しない日付はNaTに変換してくれます。

```python
df['日付'] = pd.to_datetime(df['日付'], format='%Y-%m-%d',errors='coerce')
```

## おまけ
NaTは直前の値を入れることで埋めました!

```python
df['日付'] = pd.to_datetime(df['日付'], format='%Y-%m-%d',errors='coerce')
```
|id|日付        |
|:---------|:---------:|
|0         |2022-02-20 |
|1         |2022-02-20  |
|2         |2022-02-20  |
|3         |2022/05/06  |
|4         |2022/05/06 |
|5         |2022/05/06 |
|6         |2022/05/06  |

## 終わりに
簡単にValueErrorを解決する方法を書きました。

初学者なので情報に誤りがあるかもしれません。
ご容赦ください🙇

最後まで読んでいただきありがとうございます！
## 参考ページ

https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html
JavaScriptはどう実行されているのか

## はじめに
「JavaScriptはどうやって実行されているのか」という疑問を初学者なりにまとめた内容です。記述については触れません。

## JavaScriptの特徴

まず、特徴としては「クライアントサイドでの動作が可能」「ページの動的な機能を追加できる」「プログラミング言語としての柔軟性が高く、多くのライブラリやフレームワークが利用可能」といったものが上げられます。

一方で、「ブラウザ間での差異がある」「セキュリティリスクがある」「クライアントサイドでの実行なため、パフォーマンスに影響がある可能性がある」という気をつけるべき点も持っています。

## JavaScriptの処理の流れ

1. windowオブジェクトの生成
2. Documentオブジェクトの生成
3. HTMLを記述順に構文解析(パース)
4. script要素を構文解析, エラーがなければコードを同期実行
5. HTMLパース完了
6. 外部リソースの読み込み
7. ユーザー定義イベントなどのイベント発生

### 1. windowオブジェクトの生成

ブラウザ上でのJavaScriptの実行コンテキストを表すグローバルオブジェクトです。windowオブジェクトは、ページが読み込まれた際に自動的に生成され、その下にはブラウザ上で表示されているページの全ての要素がプロパティとして定義されます。

例えば、documentオブジェクトやconsoleオブジェクトなども、全てwindowオブジェクトのプロパティとして定義されています。また、JavaScriptでグローバルスコープで定義された変数や関数も、自動的にwindowオブジェクトのプロパティとして定義されます。
![window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/45c9a763-144f-d85e-ee17-c02896f6a2f2.png)

### 2. Documentオブジェクトの生成

現在のページに対応するDOMを表すオブジェクトです。Documentオブジェクトは、ページが読み込まれた際に自動生成され、ページの構造や内容をJavaScriptから操作できるようにするインターフェースを提供します。

Documentオブジェクトには、**ページに含まれる全ての要素にアクセスするためのメソッドやプロパティが用意されており**、JavaScriptからページの要素を取得したり、要素の属性を操作したり、新しい要素を作成したりできます。また、Documentオブジェクトには、ページの読み込み状態を取得するメソッドや、ページ内でのイベント登録や削除を行うメソッドなども用意されています。
 ![document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/925a8e00-e337-a10a-86e2-0c1b0ba03742.png)

### 3. HTMLを記述順に構文解析(パース)

ブラウザはHTML文書を読み込み、解析してDOMツリーを構築することでページ構造を把握します。この処理をHTMLパース（構文解析）と呼びます。

HTMLを記述順に構文解析するためには、ブラウザはHTML文書を上から下まで一行ずつ読み込みます。HTMLパーサーは、HTML文書のタグや属性、テキスト、コメントなどを認識して、DOMツリーのノードに変換するプログラムです。

:::note info
HTMLの文法には、文法上正しくないコードが含まれることがあります。ブラウザは正しくないコードに対しても、エラーが発生することなく処理を続けるように自動的に修正を加えることがあり、このパートでブラウザはHTML文書を解析して、文法上正しいDOMツリーを構築しています。
:::

![parse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/b4979a93-7cdf-c9b1-1ed3-aa9bae998e69.png)

### 4. script要素を構文解析, エラーがなければコードを同期実行
scriptに差し掛かると、JavaScriptエンジンはscript内のコードを解析して実行します。

この時にscript要素のsrc属性がある場合、指定されたURLからJavaScriptファイルを取得して(JavaScriptのコードが直接書かれている場合、その記述も含めて)実行します。

script内のコード実行が終わるまで、HTMLパーサーの処理は一時停止します。

例えば、bodyまでパースが終わっており、scriptに差し掛かったとします。script内のJavaScriptファイルを見つけた場合、JavaScriptファイルが実行されるまでは、h2やpはパースされないということです。

### 5. HTMLパース完了

DOMツリーの構築が完了すれば、HTMLのパースは完了です。これで、JavaScriptの実行やCSSスタイルを適用したりするための基礎が整います。

### 6. 外部リソースの読み込み

HTMLのパースが完了すると、ブラウザはHTML内にあるすべてのリソースを読み込むために、必要なHTTPリクエストを送信します。画像、スタイルシート、JavaScriptファイルなどです。これらのリソースの読み込みが完了すると、ブラウザはそのページの表示を完了します。

ただ、外部リソースの読み込みには時間がかかるため、HTMLのパースと同時に読み込まれるわけではないです。必要であれば非同期で読み込みます(レンダリングブロックを考慮したリソースの読み込み)

すべての依存リソースが読み込まれるとloadというイベントが発生します。

### 7. ユーザー定義イベントなどのイベント発生

ページに存在するJavaScriptコードが順次実行されます(clickやkeydownなど)。イベントが発生すると、JavaScriptエンジンがイベントハンドラーを実行します。ここでボタンのclickなどのイベントの発生です。

※イベントハンドラー : イベントを処理する関数
Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行ガイド(パラメータシート V11.5.8対応)とDb2関連技術情報



#  Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行ガイドの「パラメータシート」がDb2 11.5の最新リリースであるV11.5.8対応更新されました

Db2（Linux,Unix,Windows版) V9.7/V10.1/V10.5/V11.1から最新バージョンであるDb2 V11.5への移行ガイドが公開されています。

このガイドの中には、「パラメータシート」として、「DB2 for LUW V11.5 パラメータ一覧」が含まれます。

これは、Db2 9.7から11.5までの、以下のパラメータのデフォルト設定値を一覧にしたもので、バージョンアップで変更箇所があるのかをチェックするために便利なシートになっています。
* レジストリ変数
* データベースマネージャ構成パラメータ
* データベース構成パラメータ

2023年4月版で、この「パラメータシート」に、最新のDb2 11.5のリリースであるDb2 11.5.8を含めた更新がされましたので、最新版ファイルのダウンロードにより入手できます。

-[【SIL】Db2 for LUW 移行ガイド(考慮点一覧) - Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行対応版](https://www.ibm.com/support/pages/node/6567153)

>初版作成：2019年10月
外部公開：2022年3月
更新：2023年4月(パラメータシート V11.5.8対応)

-[【SIL】Db2 for LUW 11.5 移行手順ガイド](https://www.ibm.com/support/pages/node/6567151)
こちらは外部公開2022/03からの変更はありません。

補足）
Db2 11.5へ、バックアップ/リストア方式や、migrateコマンドでの、直接のアップグレード（バージョンアップ）ができるのは、Db2 10.5以降になります。

Db2 9.7、Db2 10.1といった、それ以前のバージョンからは、基本的にはデータ移行方式（例：Export/Loadコマンドによるデータ移行）を使う方式となります。

この「移行手順ガイド」の中にこれらの方式についても詳しく解説がされています。


# 移行ガイドの位置付け

Db2はバージョンが上がる場合も既存バージョンとの上位互換性は基本的に保たれますが、それでも細かな変更点やマニュアル上非推奨とされていた機能が数バージョン後に削除される場合もあります。

資料は非常に細かいところまで調べて丁寧に書かれています。
各バージョンでのパラメータの変更点をまとめた資料も含まれており、非常に役立つ力作と思います。

Db2のバージョンアップ（マイグレーション）の際には、ぜひご活用ください。






IBM SupportのサポートのサイトにもQuestion & Answerとして上記資料へのリンクが記載されています。

[[Db2] V9.7/V10.1/10.5/V11.1 から V11.5 への移行に関連する情報](https://www.ibm.com/support/pages/node/6458073?myns=swgimgmt&mynp=OCSSEPGG&mync=E&cm_sp=swgimgmt-_-OCSSEPGG-_-E)

            
 	





# 参考）Db2関連技術情報
## Db2 11.5 マニュアルのトップページ
- 日本語
    - https://www.ibm.com/docs/ja/db2/11.5
- 英語
    - https://www.ibm.com/docs/en/db2/11.5
    - 最新情報は英語で更新されていますので英語で確認するのがお薦めです

## Db2 11.5 システム要件

各Db2バージョンリリースの稼働環境の前提要件等の確認はこちらでおこないます（英語）
- [System requirements for IBM Db2 for Linux, UNIX, and Windows](
https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)
     
## 日本のサポート部門によるFAQ集

こちらのサイトには、IBMのソフトウェア・テクニカル・サポートによく寄せられる質問 (FAQ) の一覧があり、非常に有用な情報が数多く記載されています。

[[Db2] Db2 サポートによく寄せられる質問](https://www.ibm.com/support/pages/node/471995)


## Db2 Fixpackのダウンロードサイト

[Download Db2 Fix Packs by version for DB2 for Linux, UNIX and Windows](https://www.ibm.com/support/pages/download-db2-fix-packs-version-db2-linux-unix-and-windows)

Db2は、最新のFixPackより、新規導入が可能です。

[[Db2] Db2 サポートによく寄せられる質問](https://www.ibm.com/support/pages/node/471995)のFAQより、以下を確認できます

* Db2 はフィックスパックから新規インストールが可能

* V11.5 以降の Server フィックスパックをインストールすると Community Edition として登録され起動期間の制限はない

* Db2 Community Editionは、以下の環境で無償で利用可能
    * 最大でコア 4 個、メモリー 16 GB

これらの情報は以下のFAQで解説されています

- [Db2] Db2 製品のダウンロードとインストール方法
https://www.ibm.com/support/pages/node/298449

- [Db2] Db2 V11.5 Server エディションをインストールすると Developer-C/Community Edition がインストールされる
https://www.ibm.com/support/pages/node/1073020
AZ-900 Microsoft Azure Fundamentals(和名:Microsoft Azureの基礎) 合格まで

**受験者本人のレベルと学習環境**
Azure初心者。AWSのEC2などは少し弄ったことあるが、概念など全く勉強したことのないクラウド関連技術の素人でした。
1月6日に入社し、入社後の手続き、セキュリティテスト、社内研修、毎日研修チームの会議にも参加しつつ、AZ-900の勉強を一緒に行いました。
約二週間で合格できましたので皆さんに受験体験記をご紹介したいと思います。:relaxed:

**受験までの流れ**
**2023年1月12日(木)** 9:30-13:00 「Microsoft Azure Virtual Training Day: 基礎 1」に参加
MS learnの「Microsoft Azure の基礎: クラウドの概念について説明する」、「Azure の基礎: Azure のアーキテクチャとサービスについて説明する」の1/2を受講
**2023年1月13日(金)** 9:30-13:00　「Microsoft Azure Virtual Training Day: 基礎 2」に参加
MS learnの「Azure の基礎: Azure のアーキテクチャとサービスについて説明する」の残りの1/2、「Azure の基礎: Azure の管理とガバナンスについて説明する」を受講
**2023年1月16日(月)** 13:01　上記両日の「Microsoft Azure Virtual Training Day: 基礎」のトレーニングを修了後、「Microsoft Azure Fundamentals 認定試験」を無料で受験できるバウチャー案内のメール受領
                      Udemy　AZ-900　問題集１ 受験
**2023年1月19日(木)**　Udemy　AZ-900　問題集2　受験
**2023年1月23日(月)**　Udemy　AZ-900　問題集3　受験
**2023年1月24日(火)**　Udemy　AZ-900　問題集4　受験
**2023年1月25日(水)** 9:42　「AZ-900 : Microsoft Azure Fundamentals 試験対策」案内のメール受領後受講
本番の試験までUdemy　AZ-900　問題集1-5を2周し、90％以上の正解が出るまで学習
**2023年1月26日(木)**　pearsonvue上、AZ-900 - Microsoft Azure Fundamentalsの試験登録
**2023年1月27日(金)**　Udemy　AZ-900　問題集5　受験
**2023年1月29日(日)**　AZ-900受験　805点で無事合格

**AZ-900とは？**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114135/2e9872d7-5126-8f7c-af2a-1604579ce878.png)
<details>
1.出題範囲:クラウドの概念 (20-25%)<br>
            Azure の主要サービスについて (15-20%)<br>
            Azure のコア ソリューションおよび管理ツールについて (10-15%)<br>
            一般的なセキュリティ機能およびネットワーク セキュリティ機能について (10-15%)<br>
            ID、ガバナンス、プライバシー、コンプライアンスの機能について (15-20%)<br>
            Azure のコスト管理およびサービス レベル アグリーメントについて (10-15%)<br>
2.問題数:35問前後<br>
3.合格ライン ：（700点/満点は1000点）<br>
4.受験費用 :¥12500→¥0(マイクロソフト社開催の「Microsoft Azure Virtual Training Day」の「Azureの基礎」に申込み後、参加)<br>
</details>

参考：https://learn.microsoft.com/ja-jp/certifications/azure-fundamentals/

**Microsoft　Learning紹介**
[Microsoft Azure の基礎: クラウドの概念について説明する](https://learn.microsoft.com/ja-jp/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/)
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
[Azure の基礎: Azure の管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)

**受験感想**
クラウドの概念とメリットなどの問題は勉強すれば、難しくないですが、AZ-900の試験範囲はクラウドのみではなく広範囲だったので、ネットワークの知識や
セキュリティなどの知識も要りましたので「Microsoft　Learning紹介」でご紹介した「Azure の基礎: Azure のアーキテクチャとサービスについて説明する」、
「Azure の基礎: Azure の管理とガバナンスについて説明する」を学習した方がいいと思います。:blush:

**その他参考にしたサイト**
[AZ-900概念勉強サイト](https://az-start.com/)
このサイトにaz-900全範囲の概念が整理されているのでここだけ勉強しても下のUdemy講座のテストに回答できると思います。

**勉強したUdemy講座**
[最短で合格！Azure Fundamentals AZ-900 試験対策問題集](https://www.udemy.com/course/microsoft-azure-az900-exam/?couponCode=AZ-START.COM-202304)
AZ-900 問題集 6は試験範囲外らしくAZ-900 問題集 1から5までを問いました。

では、皆様！AZ-900の合格まで頑張りましょう！ファイトです！:raised_hands:
Zodバリデーションメモ

## Zodとは
JavaScriptおよびTypeScript用のスキーマバリデーションライブラリ
[公式ドキュメント](https://zod.dev/)
## 今回のバリデーション対応の具体例
案件を作成時に、単価下限、単価上限、単価備考のどれか一つに値が入力されていたらOK、入力がなければNGの処理を記述
```Typescript:create.tsx
import { z } from 'zod'

const schema = z.object({
  minPrice: z.number().optional(),
  maxPrice: z.number().optional(),
  note: z.string().optional(),
}).refine((data) => {
  const { minPrice, maxPrice, note } = data;
  const hasMinPrice = typeof minPrice === 'number' && !Number.isNaN(minPrice);
  const hasMaxPrice = typeof maxPrice === 'number' && !Number.isNaN(maxPrice);
  const hasNote = typeof note === 'string' && note !== '';
  return hasMinPrice || hasMaxPrice || hasNote;
}, {
  message: '単価下限、単価上限、備考のうちどれか1つを入力してください。',
  path: ['hasNote'],
});

// 使用例
const validData = {
  minPrice: 100,
  maxPrice: 200,
  note: '',
};
schema.parse(validData); // OK

const invalidData = {
  minPrice: undefined,
  maxPrice: null,
  note: '',
};
schema.parse(invalidData); // throws error

```
## refine
refineは、オブジェクトのプロパティに対してチェック関数を定義し、エラーメッセージを設定することができます。
こちらを使用して
今回は３つある入力項目のうちいずれの項目も入力されなかった場合のバリデーション処理を書きました。

Zodのrefineメソッドを使用して、入力値のバリデーションをカスタマイズしています。refineは、オブジェクトのプロパティに対してチェック関数を定義し、エラーメッセージを設定することができます。
チェック関数は、オブジェクトのプロパティを受け取り、trueまたはfalseを返します。
今回は、hasMinPrice、hasMaxPrice、hasNoteというフラグを使用して、少なくとも1つのプロパティが入力されていることを確認しています。


## path
こちらに指定されたプロパティが存在しない時は、エラーがスローされない。
なのでパス書くの忘れずに！
Rubyのメソッドの引数について簡単に整理

メソッドの引数の渡し方は以下のようにいくつかあって、違いに迷う時がある。(特にデフォルト値があるとき）
なので簡単に整理した。
```ruby
method(arg)
method(arg = 'aaa')
method(arg:)
method(arg: nil)
```


### method(arg)
通常の引数
引数を省略した場合は、エラーが発生する

### method(arg = 'aaa')
通常の引数に対し、デフォルト値の設定
引数が渡されない場合、'aaa'が引数として使用される

### method(arg:)
キーワード引数としてargを取る
メソッドを呼び出すときに、arg:という名前で値を渡す必要がある
引数を省略した場合は、エラーが発生する

### method(arg: nil)
キーワード引数としてargを取る
引数を省略した場合はnilがデフォルト値として使用される

### キーワード引数とは
 - 引数を名前で指定することができる機能
 - 引数を名前（キーワード）で指定できるから、引数の順序を気にしなくていい
 - 呼び出す時にキーワードで指定できるからコードが読みやすくなる
 - 基本こっち使うのがいいのかも
 - 引数が多い時は迷わずこっち


他にも色々あると思うけれど、ざっくりとまとめた。
Solidity学習サイトCryptoZombiesの感想

こんばんは、初めましてプログラミング三か月の見習いです。

最近web3関連の興味熱が抑えられず、
solidityを学習しようと学習リソースを探していたところ…
何やら面白そうなインタラクティブ学習教材CryptoZombies（無料）に出会ったので、使ってみた感想を残してみます。

感想

とにかく楽しい、日本語訳完璧、飽きない、理解しやすい説明、これは継続しようと思います。

web3開発を自分で取り組んでみたい人は必ずsolidity言語を学ぶことになると思うので、
同じような興味をお持ちの方は
CryptoZombiesぜひやってみてください！

実際に翻訳者様がこの記事を目にする可能性は低いですが、翻訳者様の目に届かなくとも感謝をさせてください（笑）
日本語訳丁寧にしていただき本当にありがとうございます！！
とっても役に立っています！

はい、
翻訳者様への感謝が抑えきれずキータを初めて投稿してしまった見習いプログラマーでした。
certbotでSSL証明書を発行するまで

# やった事
certbotを使う事で無料のSSL証明書を発行しました。
今回はその流れを知見としておきます。

## 作業環境

- conoha vps 1Gプラン
- CentOS stream 9 
- Apache

## SSL証明書って何？
私たちがサイトにアクセスする際に用いているHTTP通信を暗号化する為に必要となるファイルのことです。

https://www.cloudflare.com/ja-jp/learning/ssl/what-is-https/


## certbotって何？

https://certbot.eff.org/pages/about

無料、自動でSSL証明書を発行、更新できるOSSツールです。
認証局であるLet’s Encryptによって証明書を作成しています。

コマンドを用いる事で証明書を
- インストール
- 更新(期限切れ前に更新できる)
を行ってくれます。

### オススメ
- コマンドラインが問題ない
- すでにhttpサイトが公開されている(port 80)
- サーバーにssh接続とsudoが可能

## 導入までの流れ

conoha vpsを用いているので

https://support.conoha.jp/v/hellovps-w-07/

を参考にしたいのですが

~~~
# yum install certbot python2-certbot-apache
~~~
で詰んでしまうので公式の

https://certbot.eff.org/

を参考に導入しました。

### 1 サーバーにssh接続をする
これはそのままssh接続を行えば問題ないです。

### 2 snapdをインストールする

https://snapcraft.io/docs/installing-snapd

を参考に導入するといいです。

### 3 snapdを最新にする
~~~
# sudo snap install core; sudo snap refresh core
~~~
シンボリックリンクがしっかり貼られているかも同時に確認しとくと良いです。
### 4 certbot os packagesの排除
複数存在すると実行時に問題になってしまうので
存在している場合
~~~
# sudo [apt-get/dnf/yum] remove certbot
~~~
で削除しとくと良いです。


### 5 certbotのインストール

~~~
# sudo snap install --classic certbot
~~~

### 6 コマンドの準備

コマンドが使える様にシンボリックリンクを貼ります。
~~~
# sudo ln -s /snap/bin/certbot /usr/bin/certbot
~~~

### 7 certbotの使い方
2通り存在します

#### 7.1 証明書とインストールを両方行う
自動的にHTTPSのアクセスを可能にしてくれます。

(Apache)
~~~
# sudo certbot --apache
~~~


#### 7.2 証明書のみ取得
サーバー、今回はApacheの設定を手作業で行いたい人用

~~~
# sudo certbot certonly --apache
~~~

### 8 自動更新のテスト
certbotには証明書を自動更新してくれるcron,systemdが存在しています。
テスト用のコマンドです。

~~~
# sudo certbot renew --dry-run
~~~

### 9 確認
自身のサイトであるhttpsを見る事で確認ができます。


### おまけ 自動更新の方法

今回はcronを用いた方法です。
~~~
# crontab -e
~~~
を行った後vimエディタが開くので

~~~
[minute] [hour] [day] [month] [day of the week] sudo certbot renew --pre-hook "systemctl stop httpd" --deploy-hook "systemctl start httpd"
~~~
を保存しておくと対応した時間に実行されます。
- --pre-hook:コマンド実行前に""内部を実行する
- --deploy-hook:証明書の更新が成功した時に""内部を実行する


参考

https://qiita.com/kazuhidet/items/9d58a104f93d9ff7302d

https://self-development.info/%E5%AE%9F%E8%B7%B5%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8Bcrontab%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%83%BB%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99/

# 感想
snapdのインストールに時間かかってしまいましたがその後はすんなり導入できました。
後はwebアプリを作成できる様頑張りたいです。
Discord Bot を無料で運用するためのホスティングサービスの比較

##### 2023/4/13時点の内容になります

## はじめに
Discord Bot を無料で運用する際の（一部有料）、ホスティングサービスについて比較してまとめてみました。Discord Bot を運用する際に参考にしてみて下さい。なお、他にもホスティングサービスの候補はありますが、私の独断と偏見で選んでいます（検証が面倒くさい訳じゃないですよ…）。


**2023/09/17追記**

Railway は有料化されることになりました。以下記事を参考にして下さい。

https://blog.railway.app/p/pricing-and-plans-migration-guide-2023


## ホスティングサービスの比較

|  | [Railway](https://railway.app) | [Render](https://render.com) | [fly.io](https://fly.io) | [Repl.it](https://replit.com) | [Heroku](https://dashboard.heroku.com/apps) |
| --- | :---: | :---: | :---: | :---: | :---: |
| 価格 |月5$まで<br>無料|無料|無料|無料|有料|
| クレカ登録 |必要|不要|必要|不要|必要|
| 支払い方法 |クレカ|クレカ|クレカ|クレカ|クレカ|
| リージョン |US-West※2|Singapore|Tokyo|不明|US|
| CPU |8コア|0.1コア|共有1コア|0.6コア?|1コア|
| メモリ |8GB|512MB|256MB|512MB|512MB|
| ダウンタイム（秒/1日）|28.3|42|445|2512|5.3|
| UI |GUI/CLI|GUI/CLI|CLI|GUI/CLI|GUI/CLI|
| データベース |MySQL<br>Redis<br>PostgreSQL<br>MongoDB|Redis<br>PostgreSQL<br>制約あり※1|MySQL<br>MariaDB<br>PostgreSQL<br>SQLite<br>EdgeDB|PostgreSQL<br>SQLite on Replit|Redis<br>PostgreSQL|
|ログ|全て残る|2日分くらい残る|残らない|残らない|残らない|
|ドキュメント|それなり|充実|充実|充実|充実|

※1 Render Database
>Free databases will expire in 90 days and will be deleted if not upgraded. No automatic backups are created for free databases. Learn more about free instance type limits.

※2 Railway Region
>Do you have a EU/APAC region?
Not yet but it's coming soon! Our servers are located in GCP's US-West.


## 最後に
個人的に [Railway](https://railway.app) が使いやすくてお気に入りです。性能もずば抜けてますしね（後は Tokyo Region が来るのを待つだけですね）。Discord Bot を動かしたいならとりあえず、Railway でいいんじゃないかなと思います（デプロイするだけで細かい設定とかいりませんし）。個人的にラズパイを持っているのでそちらで Discord Bot を運用してもいいのですが、Railway が安定稼働してくれているのでそちらに任せようかなと思っています。そのうち Railway を使って Bot とデータベースを連携して、色々してみたいなとも思っていますので、その際は記事にするかもしれません。
また、Heroku がここに載っているのは異質ですが、ダウンタイムの検証をしたので、一応載せておきました。
~~支払い方法 PayPal に対応しろ~~

## 参考
[Railway を使った Discord Bot の構築と運用（無料）- Qiita](https://qiita.com/Pumila/items/29f26fb349d5592046ae)
[render を使った Discord Bot の構築と運用（無料）- Qiita](https://qiita.com/Pumila/items/2f64c06d6d8a4f802390)
[fly.io を使った Discord Bot の構築と運用（無料）- Qiita](https://qiita.com/Pumila/items/f134f210789842340066)
[Repl.it を使った Discord Bot の構築と運用（無料）- Qiita](https://qiita.com/Pumila/items/449d9f4d484b78e95479)
[Heroku を使った Discord Bot の構築と運用 - Qiita](https://qiita.com/Pumila/items/91639e7959b82e0f3fc7)