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

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

# A - flip
https://atcoder.jp/contests/abc289/tasks/abc289_a
```ruby:a-289.rb
puts gets.chomp.tr("01", "10")
```
## 解説
（他の方の提出結果を参考にしました）

trメソッドを使い、"0"を"1"に"1"を"0"に置換しています。

メモ
・[String#tr](https://docs.ruby-lang.org/ja/latest/method/String/i/tr.html)：`str.tr(pattern, replace)`の形で使い、patternに書いた文字列がreplaceに書いた文字列に置換される。ただ、文字列自身というわけではなく、本質は文字の置換。今回の問題の場合は、"01"->"10"としてるが、これは"0"->"1"、"1"->"0"を意味している。

# B - レ
https://atcoder.jp/contests/abc289/tasks/abc289_b
```ruby:b-289.rb
n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
hash = {}
a.each{ |i| hash[i] = true}

ans = []
l = 1
while l <= n
    r = l
    while hash[r]
        r += 1
    end
    r.downto(l).each{ |i| ans << i}
    l = r + 1
end
puts ans.join(" ")
```
## 解説
まず、レ点がある部分を連想配列hashにもたせます。そして、lを開始位置としてそこからレ点をもたない部分までrをインクリメントします。次に、rからlまでのindexに対応する数字をansに格納していきます。この操作を繰り返し行なっていき、最後にansを出力することで実装できます。

# C - Coverage
https://atcoder.jp/contests/abc289/tasks/abc289_c
```ruby:c-289.rb
n, m = gets.split.map(&:to_i)
a = []
m.times do
    gets
    a << gets.split.map(&:to_i)
end

ans = 0
[0, 1].repeated_permutation(m).each do|arr|
    check = Array.new(n, false)
    i = 0
    while i < m
        if arr[i] == 1
            a[i].each do|j|
                check[j - 1] = true
            end
        end
        i += 1
    end
    ans += 1 if check.all?(true)
end
puts ans
```
<追記>
コメントでいただいた別解になります。すごくコンパクトですね！
こちらでは、combinationメソッドを使って条件を満たすものがいくつあるかを数え上げています。
```ruby:別解
n, m = gets.split.map(&:to_i)
as = Array.new(m) { gets; gets.split.map(&:to_i) }

puts (1..m).sum {|i|
  as.combination(i).count {|arys|
    (1..n).all? { |j| arys.any? { _1.include?(j) } }
  }
}
```
## 解説
<方針>
この問題のように「選ぶ」「選ばない」といった２択を扱うような問題は、bit全探索という手法を使って解きます。Rubyでは、[Array#repeated_permutation](https://docs.ruby-lang.org/ja/latest/method/Array/i/repeated_permutation.html)を用いることで簡単に実装することができます。

<実装方法>
前述したように、bit全探索を行なっていき、問題文の条件を満たすならansをインクリメントします。なお、ここでは0を「選ばない」、1を「選ぶ」として考えています。

# D - Step Up Robot
https://atcoder.jp/contests/abc289/tasks/abc289_d
```ruby:d-289.rb
gets
a = gets.split.map(&:to_i).sort
gets
b = gets.split.map(&:to_i)
x = gets.to_i

dp = Array.new(x + 1, false)
dp[0] = true
b.each{ |i| dp[i] = -1}

x.times do|i|
    next if !dp[i] || dp[i] == -1
    a.each do|factor|
        break if i + factor > x
        dp[i + factor] = true if dp[i + factor] != -1
    end
end
puts dp[x] ? "Yes" : "No"
```
## 解説
（公式解説を参考にしました）

<方針>
DPを使って解いていきます。dp[i]をi段目に登れるならtrue、登れないならfalseとします。また、モチがある段は-1とします。

<実装方法>
順に、その段に登れるかを判定していき、最終的にx段目に登れればYes、登れなければNoを出力します。

# 終わりに
個人的には、B問題が工夫が必要で苦戦しました。また、D問題でDPを使うことを思いつくことができませんでした...悔しい。
次回は、AtCoder ABC288を解いていきたいと思います。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
Argument list too longの対策まとめ

# 前提
私は業務で２D画像の機械学習を触っています。学習データは時として数万枚になり、通常のlinuxコマンドでは表題のようなメッセージが出てくることがあります。
# 解決策
よく使う操作を一覧にしておく。
- 現在いるディレクトリに存在する全てのファイルに対してchmodする。
```shell
find . -type f -exec chmod 777 {} \;
```
- 現在いるディレクトリに存在する全てのjpgファイルを再帰的にrmする。
```shell
find . -name "*.jpg" -type f -print | xargs rm
```
- 現在いるディレクトリに存在する全てのjpgファイルをcpする。
```shell
find . -name "*.png" -exec cp {} path/dir/to \;
```
- 現在いるディレクトリ直下に存在する全てのpngファイルをカウントする。
```shell
find . -maxdepth 1 -name "*.png" | wc -l
```
-現在いるディレクトリ直下に存在する全てのテキストファイルの特定文字列を特定文字列に書き換える
```shell
grep -l 'mae' *
find . -type f | xargs sed -i 's/mae/ato/g'
```
Salesforce認定アソシエイト試験の公式練習問題解説してみた-14

こんにちは
本橋孝昭です。

Salesforce認定アソシエイト試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回は
認定資格試験の準備: Salesforce 認定アソシエイト＞
レポートとダッシュボードについて確認する

の問題2問目を解説します

今回の内容は動画でも公開しています

https://www.youtube.com/watch?v=ipnLtmQtSYI

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


問題はこちらです

https://trailhead.salesforce.com/ja/content/learn/modules/cert-prep-salesforce-certified-associate/review-reports-dashboards

![レポート共有.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f98ce0e3-de35-bd7f-8eb9-6e779c140796.png)

正解はCです

レポートフォルダーにユーザの設定をすることで、そのレポートフォルダにあるレポートの共有を行います

レポートフォルダの詳細はこちらをご確認ください

Lightning Experience でのレポートフォルダまたはダッシュボードフォルダの共有
https://help.salesforce.com/s/articleView?id=sf.rd_folders_share_enhanced.htm&type=5



## 他の認定アソシエイトの勉強方法について

他の勉強方法についてはこちらをご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b
apkファイルに付与された証明書情報の確認方法

## はじめに
業務として証明書のエンティティについて確認する機会があり、方法を調べたので備忘録的に記事にしておきます。

## keytoolについて
JDKに含まれるユーティリティです。
暗号化鍵、証明書チェーン、キーストア等を管理します。
今回はこちらを使用して、証明書について確認しました。
以下、手順を記載していきます。

:::note 
Android Studioを使用する方法もあるようです。
（というか、調べると真っ先にこちらがヒットします）
今回は業務上、Andoroid Studioを使用できなかったため、参考になりそうなリンクだけ記載しておきます。
https://developer.android.com/studio/publish/app-signing?hl=ja
:::

#### 1.JDKのダウンロードとインストール
Oracleの[ダウンロードページ](https://www.oracle.com/java/technologies/downloads/)から、任意のJava Runtime Environmentをダウンロードします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/afac883e-aef6-aa60-f71d-728e8bbde0da.png)

::: note warn
ダウンロード時、Oracleのアカウントログインを求められます。
所持していない場合は作成してください。
:::

ダウンロードが完了したら、インストーラを実行しインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/c6233e88-07d1-66c5-29fd-e9afc0dd02cd.png)

#### 2.keytoolの実行
コマンドプロンプトを開き、JREのインストール先（bin内）に移動します。
keytoolコマンドのうち、証明書を確認するオプションは`-printcert`です。
また、ファイルを指定する際に`-file`を使ってしまうと、apkファイルの読み込み時にエラーが出てしまいます。
`-jarfile`を使いましょう。

```
※コマンド例
keytool -printcert -jarfile apkファイルパス
```

証明書の内容が出力されます。

## 参考文献
https://knkomko.hatenablog.com/entry/2019/11/14/015738

https://moewe-net.com/java/jdk-keytool

https://www.ugs.kochi-tech.ac.jp/mendori/internal/docs/ja/technotes/tools/windows/keytool.html

https://blog.logicky.com/2016/12/22/windows10%e3%81%a7java%e3%81%aekeytool%e3%82%92%e4%bd%bf%e3%81%86/
LangChainのChatModelsとMemoryを使ってチャット上で会話を記憶させる

## Chat Models
LangChainのChatModelsは、会話型のAIチャットボットを開発するためのモジュールで、前提条件やコンテキストに基づいて応答することができるなど、会話の流れを管理するための機能を提供するよう設計されています。

## AIと会話してみる
```chat-memory-sample.py
import json
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.schema import messages_to_dict
from langchain.prompts.chat import (
    ChatPromptTemplate,
    MessagesPlaceholder, 
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

# ChatOpenAIクラスのインスタンスを作成、temperatureは0.7を指定
chat = ChatOpenAI(temperature=0.7)

# 会話の履歴を保持するためのオブジェクト
memory = ConversationBufferMemory(return_messages=True)

# テンプレートを定義
template = """
以下は、人間とAIのフレンドリーな会話です。
AIはその文脈から具体的な内容をたくさん教えてくれます。
AIは質問の答えを知らない場合、正直に「知らない」と答えます。
"""

# テンプレートを用いてプロンプトを作成
prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(template),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])

# AIとの会話を管理
conversation = ConversationChain(llm=chat, memory=memory, prompt=prompt)

# ユーザからの入力を受け取り、変数commandに代入
command = input("You: ")

while True: 
  response = conversation.predict(input=command)
  print(f"AI: {response}")
  command = input("You: ")
  if command == "exit":
    break

# memoryオブジェクトから会話の履歴を取得して、変数historyに代入
history = memory.chat_memory

# 会話履歴をJSON形式の文字列に変換、整形して変数messagesに代入
messages = json.dumps(messages_to_dict(history.messages), indent=2, ensure_ascii=False)

# 会話履歴を表示
print(f"memory: {messages}")
```

### 動画
会話の内容を保持してチャットのやり取りが成立している事がわかりますね。
![sample_out (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/557d3eb7-6de8-cc90-f006-eeb6d0d2a61a.gif)

## おわりに
[前回](https://qiita.com/hedgehog051/items/3b02a78ad7660307f076)LangChainのLLMsモデルを試した際にはこちらでScript内で会話が成立するように予め記述してましたが、ChatModelsではリアルタイムで会話が可能で、更に内容も保持されている事が確認できました。LLMｓ同様にAgentを使うことでGoogle検索と連携させることも可能なのでより最新情報を用いた会話も可能です。

## 参照

https://python.langchain.com/en/latest/index.html

https://python.langchain.com/en/latest/modules/models/chat.html
[GA4] 時間別アクセス数のレポートの設定方法 （アクセス数に応じた施策の実施タイミングの指標に）

サービスを運用しているとアクセス数に応じた施策がありますよね。

例えば、
* アクセス数が多いときに告知を出したい！
* アクセス数が少ないときにメンテナンスしたい！

そんなときに、便利な時間別アクセス数のレポートを設定する方法です。

## 以前のGAではデフォルトであったけど、、
:::note warn
ホームに「時間帯別ユーザー数」という便利なものがありました
![CleanShot 2023-04-05 at 12.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/ba3d780d-1e57-4421-be2a-1ed73172d879.png)
:::
GA4では無くなってしまいました。


## GA4での設定手順

1. 探索をひらく
1. ディメンションに「時間」を追加する
1. 値に「表示回数」を追加する
1. 行「時間」、値「表示回数」、表示する行数「25（以上であればOK）」を設定する
1. 右側に表示されたテーブルの「表示回数」列をクリックしてアクセス数の降順（アクセス数が少ない順）にならべかえる

### 行と列の設定
![CleanShot 2023-04-05 at 11.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/e4cd8c4e-cd9d-841b-aa00-a8384a5b6f79.png)

### アクセスが少ない時間順にならびかえたとき
![CleanShot 2023-04-05 at 11.53.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/a4f3e45f-7045-15d1-e16c-68b7fcfe2621.png)

:::note info
時間別にならびかえたとき
![CleanShot 2023-04-05 at 12.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/956416d1-19c8-a524-9aaf-3e5e4de09cc1.png)
こうなってしまうのが少し残念 :thinking: 
:::


以上の設定で、「どの時間帯にアクセスが集中しているか（少ないか）」がわかるようになりました！ :thumbsup:
4月にDatabricksワークフローに導入される新たなアップデート

[Exciting new updates coming to Workflows in April \- The Databricks Blog](https://www.databricks.com/blog/2023/04/04/exciting-new-updates-coming-workflows-april.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# ファイル到着トリガー、連続ジョブ、SQLファイル、タスクを編集するために改善されたユーザーインタフェース

より多くのタスクを適切なタイミングでオーケストレートする機能を追加し、自動化ジョブを作成・起動する方法をシンプルにする[ワークフロー](https://www.databricks.com/jp/product/workflows)の素晴らしいいくつかの新機能のリリースを発表できることを嬉しく思っています。あなたが経験豊富なデータエンジニアであろうが、SQLクエリーの自動化に取り組み始めたのであろうが、これらの新機能は、皆様のワークフローをシンプルにし、生産性をブーストし、皆様のゴールをより効率的に達成する支援をすることを目的としています。この記事では、最近のリリースの大部分を網羅し、レイクハウスを加速するこれらの新機能の使い方を説明します。

# ファイル到着トリガー

スケジュール処理に加えて、多くのお客様は特定のイベントが生じた際にワークフローを起動したいと考えています。このため、我々は「ファイル到着トリガー」というパワフルな新機能を導入します。この機能を用いることで、クラウドストレージにファイルが到着した際にジョブを起動するように設定することができます。これらの新たなトリガーを用いることで、ワークフローはファイルが到着した際に、データを取り込み、機械学習推論や任意のタイプの分析を即座に実行することができます。この機能の活用をシンプルにするために、クラウドストレージへのアクセスを管理する[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)の外部ロケーションを活用できます。

ファイル到着トリガーは[Azure](https://learn.microsoft.com/ja-jp/azure/databricks/workflows/jobs/file-arrival-triggers)と[AWS](https://docs.databricks.com/workflows/jobs/file-arrival-triggers.html)でパブリックプレビューとなっています。
![](https://cms.databricks.com/sites/default/files/inline-images/db-565-blog-img-1.png)

# 連続ジョブ

連続ジョブを用いることで、Apache Spark™構造化ストリーミングジョブのように、24/7で実行される高信頼のワークロードをオーケストレートすることができます。この新機能を用いることで、ワークフローがスケジュールとリトライを管理するので、最大同時実行数を設定したり、特殊なcronスケジュールを選択する必要がなくなります。Databricksにおいては、ワークフローを簡単に使えるようにすることにフォーカスしているので、連続ジョブの設定は非常に簡単なものとなっています。必要なのはTriggersメニューでボタンをクリックするだけです。

[連続ジョブ](https://docs.databricks.com/workflows/jobs/jobs.html#run-a-continuous-job)はパブリックプレビューです。

# SQLファイル

Databricksワークフローでオーケストレートできるタスクタイプを拡張することで、今ではDatabricks SQLウェアハウスでファイルに定義されたSQLクエリーを含む外部ファイルをオーケストレートすることができます。すでに皆様は、事前定義された[Databricks SQLのクエリー](https://qiita.com/taka_yayoi/items/e0c37a7a380122724b3f)、アラートの実行、ダッシュボードの更新をスケジューリングしているかもしれません。新たなSQLファイルタスクを用いることで、Gitリポジトリに **.sql** ファイルを格納できるようになります。ジョブが実行される都度、特定ブランチから最新バージョンのファイルが取得されます。この新機能によって、ノートブックやSQLクエリーを一緒に共同バージョン管理できるようになります。これらのアーティファクトに対してGitを活用することで、チームメンバー間のコラボレーションを改善し、エラーのリスクを削減します。

SQLファイルは正式提供(GA)となっています。
![](https://cms.databricks.com/sites/default/files/inline-images/db-565-blog-img-2.png)

# ユーザーインタフェースの改善

最後になりますが、ジョブの作成、編集のためのDatabricksワークフローユーザインタフェースも改善しました。皆様の生活を可能な限りシンプルにするという目的のもと、全体的なジョブの構成や設定を見失うことなしにタスクを変更することができます。この新たなインタフェースは、ジョブ作成と編集プロセスを円滑にし、複雑なワークフローの作成と管理を容易にします。
![](https://cms.databricks.com/sites/default/files/inline-images/db-565-blog-img-3.png)

# サマリー

Databricksではワークフロー製品の改善に取り組み続けていきます。本記事では、いつジョブを実行すべきかを定義する複数の方法と、バージョン管理されたSQLクエリーのオーケストレーションの新たな手段、ワークフローの作成、編集をシンプルにする新たなユーザーインタフェースをご紹介しました。

皆様がレイクハウスから更なる価値を引き出すために、これらの機能が皆様のお役に立つのを楽しみにしています。どれが一番エキサイティングでしたか？すぐにワークフローをお試しください！


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
ABC 296 備忘録

## 概要
 今回はABC296（2023年4月1日21:00 ~ 22:40）の参加記録について自分の実装と感想について記していこうと思う。

## A問題
https://atcoder.jp/contests/abc296/tasks/abc296_a
### ポイント
- 文字列をリストとしてインプット
- リストの中身を見ていき、前の文字と一致しているかどうかを判断させる
- 連続してしまっていたら、その時点で "No" と返して`sys.exit`する
### 自分の実装
```Python:ABC_296_A.py
import sys

N = int(input())

S = list(input())

last = ""
now = ""

for i in S:
    if now == "":
        now = i
    else:
        now = i
        if last == now:
            print("No")
            sys.exit()
    last = i
print("Yes")
```
## B問題
https://atcoder.jp/contests/abc296/tasks/abc296_b
### ポイント
- 入力を2次元のリストとして格納
- "*" のグリットのところを `for` 文でサーチ
- グリットの位置を `ASCII` 文字変換によりアルファベットに変換
- 列は左で行は下からカウントしていることに注意
### 自分の実装
```Python:ABC_296_B.py
S = list(list(input()) for i in range(8))

for i in range(8):
    for j in range(8):
        if S[i][j] == "*":
            print(chr(j+97)+str(8-i))
```
## C問題
https://atcoder.jp/contests/abc296/tasks/abc296_c
### ポイント
- リスト型で全ての要素比較をすると $O(N^2)$ で `TLE` する
- ハッシュテーブルを用いて、それぞれの要素について差が `X` となるような数字を格納
- 元のリストの要素にハッシュテーブル内の要素と一致するものがあるかどうかを検索
### 自分の実装
```Python:ABC_296_C.py
# 入力を受け取る
N, X = map(int, input().split())
A = list(map(int, input().split()))

# ハッシュテーブルを初期化する
hash_table = {}

# ハッシュテーブルに要素を格納する
for i in range(N):
    hash_table[A[i]+X] = i

# 数列 A の要素を順番に見ていき、ハッシュテーブルに要素が存在するか調べる
for i in range(N):
    if A[i] in hash_table:
        # 条件を満たす組が存在するため、Yes を出力して終了する
        print("Yes")
        exit()

# 条件を満たす組が存在しないため、No を出力する
print("No")

```

## 感想
　今回もD問題で詰まってしまった。他の方の記事を参考にしながら後日再度挑戦したい。
開発においてChatGPTを有効活用する




### Game開発への活用編

ChatGPTをゲーム開発にどのように活用するかのアイディアをいくつか提示します。

    - コンセプトアート生成:
    - シナリオ生成:
    - コードスニペット生成:
    - イベントやクエストアイディア生成:
    - プレイテストフィードバックの分析:



------


#### コンセプトアート生成

ChatGPTを使用して、キャラクターや背景のコンセプトアートのアイディアを提案します。これにより、アーティストが迅速にインスピレーションを得られ、制作時間を短縮できます。具体的な手順は以下の通りです。

    - DALL-Eを使用して、キャラクターや背景のイメージを生成するためのテキスト入力を用意します
    - そのテキスト入力をChatGPTに入力し、AIが生成した文章をもとにDALL-Eにイメージを生成させます
    - DALL-Eが生成したイメージをアーティストに提供し、それを参考にコンセプトアートを作成します
    - アーティストが必要に応じて、ChatGPTとDALL-Eを使用して追加のアイディアやイメージを生成し、コンセプトアートをブラッシュアップします。



------

#### シナリオ生成:

ChatGPTを用いて、ゲームのシナリオやキャラクターのバックストーリーを生成します。
シナリオライターがアイディアをすばやく練り、物語の全体像を構築できるようになります。


-----

#### コードスニペット生成:

    - 一般的なゲームプログラミングのタスクに対するコードスニペットを生成します。
    - 開発者がより効率的にコーディングでき、バグの発生を減らすことができます。



------


#### イベントやクエストアイディア生成:

ChatGPTを使用して、ゲーム内の新しいイベントやクエストのアイディアを提案します。これにより、デザイナーがより多くの選択肢を持ち、ゲームのリプレイ性や魅力を向上させることができます。具体的な手順は以下の通り


    - ゲームの背景設定、ジャンル、既存のイベントやクエストの情報を入力して、AIにゲームのコンテキストを理解させます。
    - イベントやクエストアイディアの生成をリクエストします。例えば、「新しいクエストのアイディアを提案してください」と入力します。
    - AIが提案したアイディアを評価し、適切なものを選択します。必要に応じて、さらに詳細な情報や修正をリクエストして、アイディアを完成させます。
    - 選択したアイディアをゲーム開発チームに提供し、実際のイベントやクエストの制作に取り組んでもらいます。



------

#### プレイテストフィードバックの分析:
ChatGPTを利用して、プレイテスターからのフィードバックを分析し、改善点を特定します。これにより、チームは迅速に問題を解決し、ゲームの品質を向上させることができます。

##### プレイテスターからのフィードバックの手順

    - プレイテスターからのフィードバックをまとめて、ChatGPTに入力します。
    - ChatGPTを用いて、フィードバックに対する具体的な問題点や改善点を特定し、分析します。
    - 分析結果を開発チームに報告し、問題の解決や改善策の実施に取り組んでもらいます。
    必要に応じて、追加の情報やフィードバックを収集して、開発チームに提供します。


------


##### シナリオ1: プレイヤーの難易度に関するフィードバック
プレイテスターから「ゲームの難易度が高すぎる」というフィードバックが寄せられた場合、ChatGPTを利用して具体的な問題点を特定します。例えば、「どのステージやエリアで難易度が高いと感じたか？」や、「難易度に関して具体的にどの部分が問題だと思うか？」などの情報を収集し、開発チームに提供します。

------

##### シナリオ2: ゲーム内のバグや技術的問題
プレイテスターがゲーム内でバグや技術的な問題を報告した場合、ChatGPTを用いて問題の詳細を収集し、開発チームに報告します。これにより、開発チームは迅速にバグを修正し、ゲームの安定性を向上させることができます。

------

##### シナリオ3: ゲームのストーリーやキャラクターに関するフィードバック
プレイテスターからゲームのストーリーやキャラクターに関するフィードバックが寄せられた場合、ChatGPTを利用して具体的な意見や提案を収集します。例えば、「どのキャラクターが魅力的だと感じたか？」や、「ストーリーのどの部分が改善されると良いと思うか？」などの情報を収集し、開発チームに提供します。



------

##### シナリオ4: プレイヤーのエンゲージメントと満足度
プレイテスターからゲームのエンゲージメントや満足度に関するフィードバックが寄せられた場合、ChatGPTを利用して具体的な要因を特定します。例えば、「ゲームのどの要素がプレイヤーを引き付けたか？」や、「どの部分がプレイヤーの満足度を高めると感じたか？」などの情報を収集し、開発チームに提供します。

------

##### シナリオ5: ゲームバランスに関するフィードバック
プレイテスターがゲームバランスに関する問題を指摘した場合、ChatGPTを用いて問題の詳細を収集し、開発チームに報告します。これにより、開発チームは迅速にバランス調整を行い、ゲームの遊び心を向上させることができます。




------


### Gameコンテンツへの活用編　


    - NPCの対話生成 
    - ダイナミックなストーリーライン生成
    - ゲーム内のヒント提供
    - ゲーム内のチュートリアルや説明文生成
    - プレイヤーのフィードバック収集と分析

-----

#### NPCの対話生成 
ChatGPTを使用して、ゲーム内のNPCがプレイヤーと自然な対話を行えるようにします。これにより、没入感が向上し、プレイヤーの興味を引くストーリーが展開されます。

-----

####  ダイナミックなストーリーライン生成
ChatGPTを活用して、プレイヤーの選択や行動に応じて変化するストーリーラインを生成します。これにより、リプレイ性が高まり、ゲームの魅力が向上します。

-----

#### ゲーム内のヒント提供
プレイヤーが詰まった場合や、特定のクエストやパズルを解決するために助けが必要な場合に、ChatGPTを利用して適切なヒントを提供します。

-----

#### ゲーム内のチュートリアルや説明文生成
ChatGPTを用いて、ゲームのチュートリアルや各種説明文を生成し、プレイヤーがゲームの操作やシステムを理解しやすくします。

-----

#### プレイヤーのフィードバック収集と分析
ChatGPTを利用して、プレイヤーからのフィードバックを収集し、分析することで、ゲームの改善点や新たなアイデアを見つけ出します。
hardhatで開発する上で知っておいた方がいいライブラリ

# 概要
hardhatで開発する上で事前に目を通した方がいい内容をまとめてみました。
もしよければ参考にしてみてください


##  hardhat-ethers
コントラクトをデプロイする際に使用します。

デプロイ例
``` js
const MyContractFactory = await hre.ethers.getContractFactory("MyContract");
const myContract = await MyContract.deploy();
const portal = await myContract.deployed()
```

公式ドキュメント: https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-ethers#hardhat-ethers

## nomiclabs/hardhat-waffle
コントラクトのテストをする際に使用するパッケージです。
公式ドキュメント: https://getwaffle.io/

## OpenZeppelin
solidityで安全なスマートコントラクトの実装を提供するライブラリです。
開発者は独自のスマートコントラクトを構築する際に、既存の検証済みのコンポーネントを使用できます。ERC20、ERC721、アクセス制御など、多くの既存の機能があります。

有名なものだと、ownable あたりが有名だと思います。
下記コードは、オーナーのみしか実行できないようにする機能を実装したものです。

例
```
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyContract is Ownable {
    uint256 private _data;

    // オーナーのみが実行可能な関数
    function setData(uint256 newData) public onlyOwner {
        _data = newData;
    }
    // 誰でも実行可能
    function getData() public view returns (uint256) {
        return _data;
    }
}
```

公式ドキュメント: https://docs.openzeppelin.com/

参考になるコードや、パッケージは追加で知ったらこの記事に追加予定です。
未踏ジュニア振り返り・提案書

22年度未踏ジュニアを修了してから５か月が経ちましたが、23年度に応募する方も多いと思いますので振り返りと提案書を公開しようと思います！

私が期間内に開発したのは「Sanitas」、健康やダイエットに関する意識や努力をポイントに変換して友達と共有することで、モチベーションの向上を図るヘルスケアアプリです。
Swiftで開発していました〜。

webサイト : [sanitas.cc](https://sanitas.cc/)

#### 採択まで・提案書

未踏ジュニアの存在自体を知ったのが応募締め切りの10日前ほどで、提案書は一週間ほどで作成しました。
少しずつ作成していたデザインのプロトタイプを完成させて提案書に入れました。開発する上で細かいプロトタイプがあるとすごくやりやすかったです。

[提案書](https://drive.google.com/file/d/1Ko1GsG6SNBiHw061olL7VBoUhsBhFkja/view?usp=sharing)を貼っておくので参考にしていただけると嬉しいです。

プログラミングに関してはほぼ初心者だったのですが、「好きだし楽しいなのでできます！」というスタンスでいきました。
提案内容にフィードバックをいただく感じの面接を終え、石丸さんに採択していただきました。

#### 6・7月　ブースト会議

ブースト会議では、未踏ジュニアの関係者の方々にプロジェクトの質問やフィードバックをいただき、その後半年間の目標の設定だったり計画を立てました。

はじめの方の開発は技術力が低いので何をするのにも時間がかかってしまいあまり進捗がなかったりもしました！
また、メンターさんに論文の探し方や読み方などを教えていただき、ポイントのスコアリングアルゴリズムの作成を進めました。

#### 8月　中間合宿

TestFlightを飛ばして中間合宿に臨みましたがクラッシュして誰も使えず、すごく悔しかったです。
合宿でOBの方に綺麗なコードの書き方等を教えていただきそれを元に今までのコードをかなりの量書き直しました。毎日開発に没頭する夏休みは技術的に成長できてすごく楽しかったです。
夏休みでほとんどのメイン機能の実装を終えてU22プロコンとアプリ甲子園に臨みました。


#### 9月・10月

8月末から未踏ジュニアの関係者の方々や友達などを対象にユーザーテストを始め、フィードバックをもとに改善してリリースしました🎉

主にメンターの石丸さんと西尾さん・同期のクリエイターさんにフィードバックを大量にいただけたので、それを元に大分改善できたと思います。
ユーザーテストは未踏ジュニアで一番やりたかったことだったので、早くに始められてよかったと思っています。

また同時進行でアプリ甲子園の資料提出やプレゼンテーションの練習をしていましたがとにかくスケジュールが鬼でした。ソースコード提出まで時間はないのにアップデートしたいところは大量にあり、さらに学校もあるので全然寝れなかったです。

そして10月30日のアプリ甲子園決勝大会プレゼンテーションに向け、メンターの石丸さんや未踏ジュニア代表の鵜飼さんに何度も構成やスライドのフィードバックをいただきたくさん練習して当日に臨みました。
プレゼンテーションでは新機能の追加で2次審査からの成長(?)と未踏ジュニアでやっていたユーザーテストの結果をアピールしました。

練習した分めちゃめちゃ緊張しましたが、結果は優勝(総務大臣賞)・Cygames賞・DeNA 賞、本当にたくさんの方に助言をいただき、私一人では絶対に達成できなかったことだと思っています。

#### 11/3 成果報告会

アプリ甲子園が終わり、成果報告会までの3日間で準備をしました。
成果報告会の発表準備は、先に作成したアプリ甲子園の資料をもとに作ったのである程度まとまったものができたと思います。
早めに開発を終えていたこととスライドができていたことから焦りはあまりなかったのでよかったです。

しかし、、質疑応答の準備を全くしておらず緊張も相まってグダグダになってしまいました…言いたいことはたくさんあったのですがなかなか言葉にならずにすごく悔しかったです。
想定質問の準備をしておけばよかったです。

### 振り返り

これまで部活も習い事も続かないし努力もしてこなかったのですが、今回一つの好きなことに没頭して努力できて、一番楽しくてあっという間の半年間だったと思います。もう半年間やりたかった…
とにかく目標があるのと人の目があるというのは、一人だといつまでもだらだら進めてしまう私にとってはよかったです。

最後まで親身に相談に乗っていただきサポートしてくださったメンターさんの石丸さんには感謝してもしきれないです。
また、同期のクリエイターやメンターさん・OBOGなど関係者の皆様ありがとうございました。

締切まで時間がないですが、未踏ジュニアはいいことしかないので作りたいものがある人はぜひ応募してほしいです。

長くなりましたが読んでいただきありがとうございました。
NodeJsで画像ファイルのダウンロードと保存(axios編)


# はじめに

前回の

https://qiita.com/SECUAL_masa/items/a90d44715cacbe7d472e

(↑)では、

> ※今時そんなコード？？？って驚かないで。色々理由があるのだ。

なこともあってrequestを利用した場合の話だった。
今回は axios を利用した際に同じ現象が発生したのでその対応方法をまとめる。

# 対応方法

前回の記事(request)ではoptionsに"encoding: null"を追加したが、今回は以下のように対応することで改善できた。

```JavaScript:サンプルソース
var options = {
    uri: "http://local_nginx_server_ip/globalipcam_resize_snap",
    responseType: "arraybuffer"
};
```

# おわりに

この程度の内容だったら前回の記事のコメント辺りに書いたのでよかったのかもしれないが、記事にしたい理由がそこにはあるのだ。
redirect_toとrenderの違い

# 目次
[redirect_toについて](redirect_toについて)
[renderについて](renderについて)
[まとめ](まとめ)
[最後に](最後に)

# redirect_toについて
処理の流れ
1. redirect_toがルーティングにURLを送る
1. ルーティングに送られてきたURLとHTTPメソッドを照らし合わせて、どのコントローラのどのアクションを実行するかを決める
1. アクションを実行する
1. ビューを表示する

「**ブラウザにURLを打ち込む代わりにredirect_toで画面が遷移できる**」という感じ！

# renderについて
処理の流れ
1. renderで定義したビューファイルを表示する。

renderは直接ビューファイルを表示させている。
そのため画面の遷移はなく、**表示されているHTMLが入れ替わるのみ！**

# まとめ
- redirect_toはアクションを実行する
- renderはアクションを実行しない
- ビューは自身が呼び出されたアクション内からインスタンス変数を参照する
- renderを使う際、ビューの表示に必要なインスタンス変数を用意しなくてはならない
- エラーメッセージを扱う際はrenderを使う

# 最後に
今回はよく出てくるredirect_toとrenderについて、簡単にではありますがまとめました。
図などなくイメージしづらいかもしれませんが、2つの違いについて悩んでる方の一助になれば幸いです。
Pythonによるログローテーションの実装

# 目次
1. 概要
2. ログローテーションとは？
3. 実行環境
4. 実装方法
4-1. ライブラリの説明
4-2. 実装（サンプルコード紹介）
5. 注意点
6. まとめ
7. 参考資料

# 1. 概要

本記事では、Python によるログローテーションの実装について説明します。
cron と logrotate を使用したサーバー上でのログローテーションを見かけますが、今回は Python のみを使用したログローテーションの実装になります。
Python のみでログローテーションを実装するメリットは実装が簡単なことです。
しかし logger の初期化をする必要があり、コード量が増えてしまうというデメリットも存在します。また既存コードが膨大な場合、少なからず改修が必要になってくるかと思います。
今回はログローテーションで必要な部分のみを記載しているため、各自でカスタマイズして使用していただければと思います。

※初心者向けの記事となっているため、中上級者には当たりまえかと思いますがスルーでお願いします😭

# 2. ログローテーションとは？

ログローテーションの定義を載せます。

> **ログローテーション**
とは、システムが残す時系列の記録データ（**[ログ](https://e-words.jp/w/%E3%83%AD%E3%82%B0.html)**）が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。また、そのような機能。
> 

※ [https://e-words.jp/w/ログローテーション.html](https://e-words.jp/w/%E3%83%AD%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html) より引用

システムを構築する際、デバッグのためにログを見ることが多いかと思います。またそのログは、 `debug.log` などといったファイル名で保存することがおおいのではないでしょうか。

ログファイルを残しておくとこのようなデメリットが発生します。

- １つのファイルに書き続けるとファイル容量が大きくなり、小さいインスタンスではメモリが足りずフリーズする。
- 複数ファイルに書き込むと容量が大きくなってしまいストレージが圧迫する。（どんだけログ出しているんだって感じですが…）

正直、短期間のみ必要な情報であれば7日間のみ保存するとかでもいいですよね。

ただこちらのログローテーションを自力で実装すると工数が掛かるのは間違いなくわかると思います。そこで今回はPythonの標準ライブラリである `logging` を使ってログローテーションを実装していきたいと思います。こちらを使えばすぐに実装できます。

# 3. 実行環境

- Windows 11
- Python 3.10

# 4. 実装方法

## 4-1. ライブラリの説明

Python の 標準ライブラリである、 `logging` ライブラリを使用します。

こちらは元々インストールされている機能ですので、 `pip` 等でのインストールは必要ありません。
ログローテーションでは `logging` の `TimedRotatingFileHandler` または `RotatingFileHandler` を使用します。

- TimedRotatingFileHandler：時間、日にち、曜日等でローテーション設定ができる。
- RotatingFileHandler：ファイルサイズでローテーション設定ができる。

## 4-2. 実装（サンプルコード紹介）

```python
import logging
from logging.handlers import TimedRotatingFileHandler

def setup_logger(name, logfile="./test.log"):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    handler = TimedRotatingFileHandler(logfile, when='midnight', interval=1, backupCount=7, atTime=datetime.time(0,0,0))
    handler.setLevel(logging.DEBUG)
    handler_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

    handler.setFormatter(handler_formatter)
    logger.addHandler(handler)
    return logger

if __name__ == "__main__":
    logger = setup_logger(__name__)
		logger.info(text)

```

# 5. 注意点

Python以外のコードでは使えないので別途書き換えか、サーバー上でローテーションする必要が出てきます。AWS Lambda等のログも今回は適用できません。LambdaはCloudWatchを使いましょう。

# 6. まとめ

今回は Python によるログローテーションの実装方法について書いていきました。実際の業務で使用することもできますし、普段使いでもコンソール上で出力したくないものを外部に出力できる方法として良いのではないでしょうか。

# 7. 参考資料

logging.handlers --- ロギングハンドラ — Python 3.10.4 ドキュメント
[https://docs.python.org/ja/3/library/logging.handlers.html](https://docs.python.org/ja/3/library/logging.handlers.html)

Pythonのロギングを覚えた
[https://qiita.com/shotakaha/items/0fa2db1dc8253c83e2bb](https://qiita.com/shotakaha/items/0fa2db1dc8253c83e2bb)
How to indent bullet points in slack message with markup (without wysiwyg editor)

To put 4 spaces make indent the bullet points

e.g.
```
* Foo
    * Foo-1
    * Foo-2
* Bar
    * Bar-1
    * Bar-2
```

Result:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68978/d292eb01-d67f-d448-3f8a-51e13215c898.png)
Salesforceのデータ連携について

### SalesforceでDataloaderを利用して組織間データ連携するときの問題点を簡単に書いておく。

 * 問題点１：主従関係・参照関係
 * 問題点２：レコードタイプ

***

### 問題点１：主従関係・参照関係
#### 原因：
SalesforceではIDは組織毎に自動採番されるためIDが変わってしまう。　
　親：ID
　子：ID、親ID
#### 対策：
連携先組織の主従側オブジェクトに各自外部IDを作成し元のIDを格納する。その後、Dataloaderで取り込み時に
　子：親ID＝親の外部IDに紐づけし、新しい親のIDを設定する。

***

### 問題点２：レコードタイプ
#### 原因：
SalesforceではレコードタイプはIDで管理されているため組織毎にIDが異なる。
#### 対策：
レコードタイプIDは連携しない、連携前に
1. 連携先組織に同じ名称のレコードタイプを作成する。
2. エクスポートしたCSVファイルにレコードタイプ名称を手動で追加する。
3. 連携先オブジェクトにトリガーを実装し、レコードタイプ名称からレコードタイプIDを取得して設定する。
Python3の辞書の要素を取り出す

**Python3**で辞書の要素を取り出すプログラムを実装しました。


```python3 
# 新規作成 2023/4/5
#　辞書の要素の

menus={"pork":"豚肉","beaf":"牛肉","chicken":"鶏肉"}

number = 0

while True:
    try:
        input_num = int(input(f"番号を0から{len(menus)}の間で入力してください "))
        if input_num < 0 or input_num >= len(menus):
            raise ValueError
        else:
            number = input_num
            break
    except:
        print("数字の入力が間違っています")    


# print(list(menus.items())[number])
# 
key,value = list(menus.items())[number]
print(f"{key}の意味は{value}です")
```
robocopyの/mirと/Eの動き

/mirは、dstにあってsrcに無いファイルは消える
/Eは、dstにあってsrcに無いファイルも残る

では、コピー対象を絞った時、対象外のファイルはどうなるか、下記で実験した。


```
orgDir
  |-a.txt
  |-b.txt
  |-dirA
     |-c.txt
     |-d.exe
     |-e.pdf
```
のようなディレクトリにたいして

```
robocopy orgDir editDir *.txt /mir
robocopy orgDir dstDir1 /mir
robocopy orgDir dstDir2 /mir
```
を実行。editDirで
- a.txtを編集
- b.txtを削除

を行い、さらに
```
robocopy editDir dstDir1 *.txt /mir
robocopy editDir dstDir2 *.txt /E
```
を実行。

この結果、dstDir1とdstDir2は


```
dstDir1
  |-a.txt
  |-dirA
     |-c.txt
     |-d.exe
     |-e.pdf
```


```
dstDir2
  |-a.txt
  |-b.txt
  |-dirA
     |-c.txt
     |-d.exe
     |-e.pdf
```

- a.txtの変更は、どちらにも
- dstDir1では、b.txtは消えている
- dstDir2では、b.txtは消えていない(/Eだから)
- **いずれも、「.txt」以外には作用していない**
IBM i駆け出し日記：システム値を変えてみる(おすすめ初期設定値)

# システム値って何？
システム値とはIBM iのシステム全体の挙動を決定する設定値のことです。

例えば、システム値**QMAXSIGN**が3と設定されている場合、3回まで間違ったパスワードを入れても大丈夫ですが、4回連続で間違えるとそのユーザープロファイルは使えなくなります。

システム値に関しての詳しい記事はこちら：
https://www.i-cafe.info/column/serials/ibmionko_1


初期構築時のおすすめ設定値に今回は変更していきます。
使用環境はIBM i7.4です。

# システム値を変更する
## システム値の表示
5250画面で以下のコマンドを入力します
```
WRKSYSVAL
```
するとこんな感じの画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/e49d1959-5a91-6f0c-09b4-57a1e5fda503.png)
Position toのところで検索がかけられます　例)QLMTDE*でQLMTDEVSSNが見つかる

以下のシステム値を変更します、変更したいシステム値のOption欄に2を入力し、Enterキーで入力します。
![スクリーンショット 2023-04-04 21.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/bde513b4-83bb-279d-02d3-a6ad29adabcc.png)

入力したらF3キーで抜けます。
![スクリーンショット 2023-04-04 21.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/723e2623-b23b-6165-8d61-1abe09581add.png)

変更するシステム値は以下のとおりです。
|システム値|変更前→変更後|意味|
|:---|:-------|:---|
|QLMTDEVSSN|1→0|1つのユーザーIDで複数のセッションにログインを許可（1は1ID/1セッションしかログインできない|
|QLMTSECOFR|1→0|すべての端末で*SECOFRアクセスをデフォルト許可（1は*SECOFRクラスのユーザーIDのアクセス権を個々の*DEVDに追加しないとログインできない）
|QMAXSGNACN|3→2|QMAXSIGN回数だけログイン失敗するとそのユーザーIDを*DISABLED(無効化)する
|QMAXSIGN|3→25 (or *NOMAX)|ログイン再試行回数を増やす、この場合は25回までIDとパスワードを間違えられる
|QAUTOVRT|0 →*NOMAX (or 十分大きい値)|5250の*DEVDを自動作成する個数を指定。0だとACS等からTELNET接続してもDEVD作らないので手動作成が必要
|QCTLSBSD|QSYS/QBASE → QSYS/QCTL|制御サブシステムをQCTLに変更
|QASTLVL|*BASIC → *INTERMED|ログイン後の5250ヘルプ画面のレベルを中間に
|QALWOBJRST|空値→ *ALL|PTFやライセンスプログラムの復元時にエラーが出ないようにする

# システム値の変更ができない場合
システム値の変更をしようとしても変更できないと怒られてしまう時があります。
そんな時はメッセージにカーソルを合わせF1を押してみます。すると以下のようなメッセージが。
![スクリーンショット 2023-03-13 17.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/e68b6977-5895-ec52-1d84-42277498dfe1.png)
※エラーメッセージが出た時はカーソルをメッセージのところに持っていき、F1キーを押すとメッセージが表示されるのでぜひみましょう！！！

セキュリティ値関連の問題のようです。DSTメニューで権限変えてみます。

## DST画面で権限を変更する
まずDST画面を起動するために5250コンソールを開いたまま、クラウドコンソール上で「IBM iの操作」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/4dd721c1-63da-bafe-8860-363ae75240ed.png)

下記操作で(21) 専用サービスツールのアクティブ化を選択し、アクションの実行を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/23d6e3de-1a3e-4462-cdfb-e2c8b709267a.png)

しばらくすると5250コンソール画面が下記のようなDSTパスワード入力画面が出ます。
初期値はQSECOFRなのでこれを変更していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/ed2d005f-32a1-4b06-6d1c-aa8c30c4b3f4.png)

ログインすると下記画面が出ます、13を選びます。
![スクリーンショット 2023-03-13 17.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/c29d867f-4fb1-cf85-e02d-366e10c3fafb.png)

一番上を１に変えると、変更できるようになります。
![スクリーンショット 2023-03-13 18.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/2f752841-0678-905b-d079-e3189634767f.png)

変更したら1でDSTを抜け、再度WRKSYSVALでシステム値を変更します。
HTMLカードのメリット・デメリットについて

# HTMLカードとは
HTMLカードは、Webページの中でコンテンツを分割して表示するために使用されるレイアウト要素です。カードには様々な種類があり、画像、テキスト、ボタン、リストなどの複数の要素を含めることができます。以下にHTMLカードのメリットとデメリットについて例を交えて簡単に解説します。

# 【メリット】

1. 視覚的な魅力: HTMLカードは、Webページのデザインにおいて非常に役立ちます。カードを使用することで、コンテンツを視覚的に分割し、読みやすくすることができます。また、カードに画像やアイコンを追加することで、ページの魅力を高めることができます。
例: フードデリバリーサイトのメニュー一覧ページにおいて、各メニューアイテムをカードに分割することで、見やすく、注目度を高めることができます。

1. レスポンシブデザインに適している: HTMLカードは、レスポンシブデザインに適しているため、様々なデバイスに対応することができます。レスポンシブデザインは、ウェブサイトをスマートフォン、タブレット、パソコンなどの様々なデバイスで表示する際に、最適なレイアウトを提供するデザイン手法です。
例: オンラインショップの商品一覧ページにおいて、商品をカードに分割することで、スマートフォンやタブレットなどの小さなデバイスでも、商品を見やすく表示することができます。

1. コンテンツの構造化: HTMLカードは、コンテンツを構造化するために使用されます。カードには、タイトル、サブタイトル、本文、画像、ボタン、リンクなどの要素を含めることができます。これらの要素を使用することで、コンテンツの意味を明確にし、検索エンジンにとっても理解しやすい構造にすることができます。
例: ニュースサイトの記事ページにおいて、記事のタイトルや本文、画像、引用などをカードに分割することで、コンテンツを分かりやすく表示することができます。

# 【デメリット】

1. カードの数が多くなりやすい: HTMLカードは1つのページに複数のカードを使用することができますが、多くのカードを使用すると、ページの読み込み時間が長くなり、パフォーマンスに影響を与える可能性があります。また、多くのカードが表示される場合、ユーザーにとって情報のオーバーロードになる可能性があります。
例: ニュースサイトのトップページにおいて、多くの記事をカードに分割して表示すると、ページが読み込みにくくなり、ユーザーにとって情報のオーバーロードになる可能性があります。

2. カードのレイアウトの統一性が難しい: カードは、デザインの自由度が高いため、多くの異なるスタイルを持つカードを表示することができます。しかし、多くの異なるスタイルを持つカードを表示すると、カードのレイアウトの統一性が難しくなり、ユーザーにとって混乱を招く可能性があります。
例: オンラインショップの商品一覧ページにおいて、多くの異なるスタイルを持つカードを表示すると、ユーザーにとって商品の比較が難しくなり、混乱を招く可能性があります。

1. アクセシビリティに配慮する必要がある: HTMLカードは、情報の階層化や視覚的な表現などを含むため、アクセシビリティに配慮する必要があります。特に、カード内のテキストや画像に対するアクセシビリティの問題に注意する必要があります。
例: オンラインショップの商品一覧ページにおいて、カード内の商品画像に適切なalt属性を付けることで、視覚障害者のユーザーにも商品情報を提供することができます。

以上が、HTMLカードのメリットとデメリットについての例解説です。HTMLカードは、Webページのデザインや情報の構造化に役立ちますが、過剰使用やレイアウトの統一性、アクセシビリティの問題にも注意する必要があります。

# HTMLカードのデメリットを回避するための一例

1. パフォーマンスの問題を回避するためには、ページの読み込み時間を短くするために、カードを適度に使用することが重要です。また、遅延読み込みやページングなどのテクニックを使用して、カードの表示数を制限することができます。
例: ニュースサイトのトップページにおいて、遅延読み込みを使用して、最初に表示されるカードの数を制限することができます。また、ページングを使用して、ユーザーが追加の記事を表示することができるようにします。

1. レイアウトの統一性を確保するためには、カードのデザインに一定のルールを設けることが重要です。カードのスタイルやフォーマットに関するガイドラインを策定し、開発者がこれに従うようにすることができます。
例: オンラインショップの商品一覧ページにおいて、カードのスタイルやフォーマットに関するガイドラインを策定し、開発者がこれに従うようにすることができます。また、CSSのクラスやIDを使用して、スタイルを一元管理することができます。

1. アクセシビリティの問題を回避するためには、WCAG（Web Content Accessibility Guidelines）に基づいて、カード内のテキストや画像に対するアクセシビリティの問題をチェックすることが重要です。適切なalt属性を付けたり、テキストの読み上げ機能を実装したりすることができます。
例: オンラインショップの商品一覧ページにおいて、カード内の商品画像に適切なalt属性を付けることで、視覚障害者のユーザーにも商品情報を提供することができます。また、テキストの読み上げ機能を実装することで、視覚障害者のユーザーにも商品情報を提供することができます。
【Vagrant】vagrant upするとエラーが発生する

## 概要
`vagrant up`をしたら以下のエラーが発生しました。

```
Vagrant failed to initialize at a very early stage:

The plugins failed to initialize correctly. This may be due to manual
modifications made within the Vagrant home directory. Vagrant can
attempt to automatically correct this issue by running:

  vagrant plugin repair

If Vagrant was recently updated, this error may be due to incompatible
versions of dependencies. To fix this problem please remove and re-install
all plugins. Vagrant can attempt to do this automatically by running:

  vagrant plugin expunge --reinstall

Or you may want to try updating the installed plugins to their latest
versions:

  vagrant plugin update

Error message given during initialization: Unable to resolve dependency: user requested 'vagrant-vbguest (= 0.30.0)'
```

`vagrant`をアップデートしたのが原因っぽい。。。

## 解決方法
エラー内容をみるとプラグインの初期化が上手くいかないよと書かれています。
エラーにある、2番目のコマンドを実行してみました。

```
> vagrant plugin expunge --reinstall
```

```
This command permanently deletes all currently installed user plugins. It
should only be used when a repair command is unable to properly fix the
system.

Continue? [N]: N

Vagrant expunge has been declined. Skipping removal of plugins.

Vagrant will now attempt to reinstall user plugins that were removed.
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching micromachine-3.0.0.gem
Fetching vagrant-vbguest-0.31.0.gem
Installed the plugin 'vagrant-vbguest (0.31.0)'!
```

上手くいったみたい！

再度、vagrant upを実行すると問題なく通りました！！


## おわりに
開発中のバージョンアップは悪手ですね、、、、
【VSCode】デバッグこけた記録

# エラー
何にもしてないのにデバッグできなくなりました！
……と言いつつ、心当たりはあるけど、まあそれは置いといて。

デバッグ実行したら下記のようなエラーがでました。
``` 
(base) C:\_project\01.hogePy>conda activate base
(base) C:\_project\01.hogePy> cmd /C "C:\__APP\Anaconda3\python.exe c:\Users\hoge\.vscode\extensions\ms-python.python-2023.6.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher 64668 -- c:\_project\01.hogePy\hogehoge.py "
Traceback (most recent call last):
  File "c:\Users\hoge\.vscode\extensions\ms-python.python-2023.6.0\pythonFiles\lib\python\debugpy\_vendored\pydevd\pydevd_file_utils.py", line 876, in get_abs_path_real_path_and_base_from_file
    return NORM_PATHS_AND_BASE_CONTAINER[filename]
KeyError: '\\\\tc000000.xxx.zzz\\xxx_import\\xxx_import.py'
:
(以下略)
```

なぜか昨日覗きに行ったリモートのファイルのパスを見に行ってパスが見つからないよ～と言っています。
net useしてないので当然ですが、そもそもそいつを見に行けとは言っていない案件。

念のためにコマンドプロンプトで実行してみましたがそちらは正常に動くので、VSCode側でなにかが起こったんだなと。

# 解決
案の定再インストールしても治らなかったのですが……。

おそらくキャッシュ的なものが残っていて、それを見に行っているのだろうなーと調べたところ「launch.json」とやらが怪しいことがわかりました。
が、.vscode直下にあると言われても見当たらない。
ワークスペースつくったことないからネ。

こちらの[サイト](https://amateur-engineer-blog.com/vscode-launchjson/)をぼけーと眺めて、「launch.jsonファイルを作成します」をクリックしました。


と、フォルダ選択の画面が出て、エクスプローラにファイル一覧がずらずら並び、その状態でデバッグ実行すると無事指定ファイルがデバッグされました！
ブレークポイント全部消えたのは再インストールしたからかフォルダで開きなおしたからかわからないですが。
……結局開きなおしても「launch.jsonファイルを作成します」の表示が消えてないので、別のところに情報持っているんだろうなあと。

そもそもワークスペース作るほどの大規模開発していないから起きた事例かも。
ほぼほぼ役に立たない記録ではありますが、備忘録のために残します。


ちなみに心当たりというのは、OneDriveの同期を一部フォルダ解除したことにより、事実上パソコン上から大量のファイルが消えたというものです。
無限にログファイル同期されて容量圧迫されているのが嫌だったので……。
ZIPファイルの解凍で躓いたときの備忘録

# はじめに
いわゆる画像ファイルとかをZIPに固めてデータをFTPに設置する。
といったことはあるあるかと思いますが、その流れの中で過去躓いたこととか再度、直面したこともあったので備忘録
誰かの役に立ったらなと思います

## まずは、コマンドのおさらい

```
# 通常ZIPファイル
zip [オプション] アーカイブ ファイル名
# 通常ZIPファイル解凍したい
unzip ファイル名.zip

# ちょっと圧縮率高める
gzip [オプション] [ファイル名] 
# 解凍
gzip -d file.gz

などなど
```

### 参考
https://webkaru.net/linux/compress-uncompress-command-list/

## 容量が大きくて回答できない問題
7GBまでは解凍できたが、10GB超えたファイルを解凍したかったが上手くいかなかった。
悩んだ末、たどり着いたのは、7-zip

```
# 解凍コマンド
7za e sample.zip
```


### 参考
https://vasteelab.com/2020/08/21/unzip%E3%81%A7%E3%81%AF%E8%A7%A3%E5%87%8D%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%82%82%E3%81%82%E3%82%8B-linux/

https://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5

https://so-zou.jp/software/tool/file/7-zip/#7-zip-file-manager

## データ設置いただく際の注意点
たまにあること
データを受領したが、ZIPファイルの中身が画像データのときに、binaryモードでデータを送付してもらわないと、上手く開けないこともありますので、要注意！
20円マイコン RISC-V CH32V003とは

20円マイコンとして最近話題のCH32V003を取り上げてみます。
# CH32V003とは？
WCH社の32ビットRISC-Vマイコンになります。
__周波数：48MHz
SRAM：2KB 
Flash：16KB__ 
以下のパッケージがあります。
- SOP8　6x5㎜
- SOP16　6x10㎜
- QFN20　3x3㎜
- TSSOP20　6.4x6.5㎜
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0f555e25-bb5f-cddd-cf88-c693894b1e47.png)
__引用：CH32V003DS0.PDF__

QFN20は3x3㎜のパッケージと小さく、使い勝手が非常に良いです。
Attiny1616やSTM8などに近いイメージですね。
CH32V003はクリスタルを使用せずに使用可能です。
Aliexpressにおいて50個で約1000円、つまり1個当たり20円で売られています。
2023年4月現在、ATTINY10が50円、PIC10F222が45円（秋月電子通商）、Attiny1616は148円（Digikey）と
価格からも、性能からもCH32V003はコストパフォーマンスの良いマイコンだといえます。
開発環境としてMounRiver Studioが推奨されているようです。
Arduinoについてもサポートされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6fe18812-ec33-3b93-b317-dd0c579b47f8.png)
# 開発ボードとデバッガー
Evaluation Boardとデバッガー、サンプルとしてCH32V003マイコンが5個したものがAliexpressで1000円弱で購入可能です。（送料込みで1300円程度）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8b9913ee-fd98-346c-bce9-f2643600cf4b.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0db9fc31-6900-eb52-d750-cf752b3020d2.jpeg)
# クリスタルレス
CH32V003はクリスタルを使用せずに動作可能です。
Attiny1616とほぼ同等の環境で使用可能となります。
# テストボードを作る
今回、検証の為にテストボードを作ってみました。
CH32V003は外付けのクリスタルが不要であることが確認できました。
また、TSSOP20は手ハンダで実装も楽ですね。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8c9abf94-334a-308a-1559-6c02599a4e64.jpeg)
私は、データシートを読む事だけでなく、Evaluation BoardやReferenceなどを基に一度テストボードを作り、独自のボードに落とし込むことをお勧めしています。
# 開発環境
MounRiver Studioのほか、Arduinoでも開発が可能です。
（RUST等でも可能なようです）
#### 20円マイコン RISC-V CH32V003 をMounRiver Studioで使ってみよう

https://qiita.com/usashirou/items/658394f66705001d950a

#### CH32V003をArduinoで使おう（CH32V203も）

https://qiita.com/usashirou/items/a52cc331817c294a98dc
# デバッガー
デバッガーは __WCH-LinkE__ を使用する必要があります。
 __WCH-LinkE__ とマイコン間は __PD1__ と __SWDIO__ を接続することでダウンロード可能です。
また、 __WCH-LinkE__ にはUARTも搭載しており、WCH-Link1本ある事で開発が可能なのが特徴です。
 __WCH-LinkE__ は600円程度で購入可能なようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fe6c4787-2fde-8c9e-0034-cd4756352610.png)

:::note alert
㊟当初WCH-Linkと記載しておりましたが __WCH-LinkE__ でないと書き込みができませんご注意ください。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/946a533e-889e-1b30-8b4b-97573c67b5aa.png)

# 資料
https://github.com/openwch/ch32v003
# 中国製RISC-Vマイコン　CH32V307V-EVT-R1 の開発環境構築とサンプルプログラムの実行
https://hakura03.hatenablog.com/entry/2022/05/11/222638
JavaScript 文字列の中に特定の文字列が存在するかを判定する includes()

# 概要

- 文字列の中に特定の文字列が存在するかを判定する方法を簡単にまとめる。

# 方法

1. `includes()`を使って下記のように判定する。

    ```javascript
    let str = "hoge fuga piyo";

    console.log(str.includes('hoge'));
    ```

1. 上記を実行して`includes()`の引数で指定した文字列が変数strの中に格納された文字列に存在していた場合trueを返す。存在していなかった場合falseを返す。
プログラムを調べるとよく出てくる「オブジェクト」とは？

私はJSを勉強した後に.Netのプログラマになったので、どの言語にもオブジェクト(JS)みたいな概念があると思っていました。
ですので、JSのオブジェクトみたいなのが、.netにはない？　
（※.netにも似ているデータ構造は用意されています！）
そもそもオブジェクトってなに？と初期はなったのでまとめています。
結論から言うと、以下3つの単語をまとめましたが、それぞれすべて違う意味で使われます。
1.オブジェクト
2.オブジェクト型
3.JSのオブジェクト

## 1.オブジェクト

特にオブジェクト指向の言語で使われる用語で、誤解を恐れず書くと、クラス、インスタンスのことです。
何かしらを作り上げる工程をプログラム。そのプログラムが動いて出来上がったデータのことをオブジェクトといいます。
ネット上でも結構曖昧に使われているので深堀するとわけわからなくなります。
とにかく、「プログラムされて出来上がった結果物」という理解をしておけば大体意味が通ります。

## 2.オブジェクト型

データ型の1種。
オブジェクト型は全型(String等の変数定数で使う型からクラス型まで。とにかく全て。)なんでも入ります。
型の種類はクラス型(参照型)。
基本的に、オブジェクト型はオブジェクト型のままで使用せず、そのオブジェクトを違う型に変更、または勝手に変更されて初めて使用されます。
**重要なのは、オブジェクト型を宣言して使用するのは推奨されません。**
```VB:オブジェクト.vb
'これは推奨されない
Dim object as Object
```
何故なら、以下２点です。
1.処理が遅くなる　2.エラーに気づくのが遅くなる

※ただ自分の職場ではたまに宣言して使っているのを見ます。

## 3.JSのオブジェクト

JSのオブジェクト型の一種で、格納するデータ型を統一する必要のない便利な連想配列です。関数も入ります。
ここからはVB,C#との比較になりますが、
この二つの言語にも、データ型を気にせず格納できるタプルや匿名型が用意されています。
（匿名型はスコープ内でしか使用できませんが..)
Rails – APIモードだがBasic認証を使いたい 

`ActionController::HttpAuthentication::Basic::ControllerMethods` をincludeすれば良いようだ

```rb
class ApplicationController < ActionController::API
  include ActionController::HttpAuthentication::Basic::ControllerMethods

  before_action :basic_auth

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end
```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
Googleデータアナリティクス：データ アナリティクスを 活用する企業の実例

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9ecfac9e-53bb-7cf3-3a30-dbc832717f52.png" width="800">

# データ アナリティクスを 活用する企業の実例

### 実例1: コカ・コーラ

データがコカ・コーラのマーケティング戦略の アプローチを変えています。 コカ・コーラは消費者のフィードバックから 収集したデータを利用し、 さまざまな興味を持つ幅広いオーディエンスに 直接語りかける広告を制作しています。 いったいどうやっているのでしょう？ 

映画館などで、 コカ・コーラのハイテクな自動販売機を 見かけたことがあるかもしれません。 自分好みのフレーバーを作れる、 とても楽しいものです。 この自動販売機には 人工知能とデータ分析ツールが 組み込まれています。 これにより、コカ・コーラは人々が思いつく さまざまなフレーバーの組み合わせを すべて把握できていて、これを新製品の インスピレーション源としています。 

### 実例2: ある市営動物園・水族館

ある市営動物園・水族館では、 地域の気候データを基に 毎日の来場者数を予測したりしています。 この市営動物園・水族館は、 雨の日には来場者数が 大きく落ち込むことに気づきましたが、 雨が降る日を正確に 予測する術がありませんでした。 このため、スタッフの配置が 大きな問題となっていました。 スタッフが多すぎる日もあれば、 来場者数の急増に 対応できない日もありました。 

これに対処するため、データ アナリストが この動物園における数年間の天候記録の データを使用して、今後の天候による パターンを正確に予測しました。 こうして、動物園はいつ、何人のスタッフが 必要かを簡単に把握できるようになりました。 スタッフの必要人数を以前よりも 正確に予測し管理できるようになったため、 来場者によりよい体験を提供し、 動物の世話にも多くの人材を充てることが できるようになりました。 

### 実例3: ヘルスケア業界

ヘルスケア業界でも 同様のことが起きています。 データ アナリストが 来院者数のデータを調査し、 病院や医院がピーク時間を予測して、 これに備えられるようにしました。 地域の市立病院がよい例です。 たとえば、待ち時間が長いという 苦情が出ているとします。 ときには 1 時間以上待つこともあり、 必要な治療を なかなか受けられない患者さんもいます。 

ここで、データ アナリストは病院の 1 日 あたりの来院者数のデータを使って、 病院がいつ何人の医師が必要かを 情報に基づいて決定できるよう 手助けします。 これにより、待ち時間を短縮して 患者さんの体験を改善し、 医療従事者の時間ももっと有効に 活用することができるようになります。

# ビジネスにおけるデータの力

これまでに見てきた データ アナリティクスを 活用する企業の実例と そのオペレーションを 思い出してみましょう。 すべての例に共通するテーマに お気づきの方もいるかもしれませんね。 

***<font color="MediumVioletRed">どの企業も調査すべき論点と、 答えるべき疑問、 解決すべき課題を抱えていました。</font>***

これらのことは混同されがちです。 データ アナリティクスにおいて これらを整理する方法を紹介しましょう。 

- 論点とは、 調査すべきトピックまたは対象です。 
- 疑問とは、 情報を発見する目的で問われるものです。 
- 課題とは、解決すべき障害または 複雑な事態です。 

#### 動物園の例

市営動物園・水族館はスタッフの配置に ついて課題を抱えていました。 最適なスタッフ配置戦略を考えるうえで データが役立ちました。 こうした疑問や課題は、 データ アナリストとして解決を助ける あらゆる事業タスクの基礎となります。 


動物園の例では、天候が予測できないため、動物園は 必要なスタッフ人数の予測に 苦労していました。 おそらく事業タスクは、 
- ***過去 10 年間の天候データを分析し、 予測可能なパターンを特定する***

というようなものになるでしょう。 そこからデータ アナリストは このタスクを解決し、 動物園の目標を実現するために 必要なデータを収集、分析、共有する 最適な方法を計画することができます。 その後、動物園はデータを使い、 毎日のスタッフ配置について、 情報を踏まえた 意思決定を行えるようになります。 

:::note info
データ主導の意思決定とは、 データ分析を通じて発見された 事実から ビジネス戦略を導き出すことです。 意思決定の最もシンプルな考え方は 複数の結論、良い悪い、 または両方の組み合わせから どれかを選択することです。 
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1e4ae4a1-c3da-6c3d-10f0-a8363acc2cc5.png" width="600">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/938b8ec8-226f-19e6-55f9-9125a747d373.png" width="600">


動物園の例では、 情報を踏まえて 課題解決に向けた意思決定を行うために 必要なデータを動物園は持っていました。 けれども、 もし彼らがデータなしにこの決定を行うとしたら？ 気象情報を調べ、スタッフのスケジュールを 組むために、 動物園が観察と記憶のみに頼ったとしたら、 結果は目に見えています。 彼らはいつまでたっても 課題を解決できないでしょう。 データ アナリティクスは、 動物園が課題に対する最良の 解決策を見つけるために 必要な情報を提供しました。 これがデータの力です。 観察や直観は 便利な意思決定の方法です。 ただし、**<font color="MediumVioletRed">観察と直観だけに基づいた 意思決定には限界があります</font>** 。 これでは状況の一部を見ているだけです。 

データはものごとの 全体像をつかむ助けとなります。 データを利用すれば、 課題とその原因について全体像を把握できます。 これにより、これまでは 考えもしなかった 斬新な解決策を見つけられるのです。 データ アナリティクスは 企業が優れた意思決定を行うのに役立ちます。 すべては事業タスクと 答えを得ようとする 疑問の問いかけから始まります。
【CakePHP3】データベース接続【新人がyoutube動画でPHP学習part2】

# １．はじめに

今回はMVCモデルの概要を確認、CakePHPとデータベースの接続を行います。
教材はチャンスラボ株式会社の公式YouTubeチャンネル。
https://www.youtube.com/@asterisk_cl_lab/videos

第４回～第５回の動画を参考にします。

【＃４　controllerとViewで画面表示しよう！】
https://www.youtube.com/watch?v=ANFACTySK20

【＃５　データベースを作成してCakePHPを接続しよう！】
https://www.youtube.com/watch?v=AxnQ1K3yDME

なお、この動画を視聴する前にPHPの基本的な文法を学習しておきました。

# ２．目次
１．はじめに
２．目次
３．controllerとViewで画面表示しよう！
４．データベースを作成してCakePHPを接続しよう！
５．終わりに


# ３．【第４回　controllerとViewで画面表示しよう！】
**０：３５～**
まずMVCモデルについての説明です。IT未経験の僕には馴染みのない言葉でした。
第６回以降の動画では「ControllerからModelへデータを渡すとき～～」のような説明が頻出します。
名称や役割が思い出せないときはこの説明に戻ってきましょう。

![スクリーンショット 2023-04-04 142041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/37e0267c-047a-56e1-2b3d-4d09ff8f0ed0.png)

**３：２０～**
「Hello CakePHP」という文字を画面に表示させます。
「文字を表示するだけなのでcontrollerとViewのみで作っていく」という説明が最初はスッと理解できませんでした。
ブラウザに文字を表示するだけなら、Modelの機能であるデータ操作は行わずに済むということですね。

**３：３６～**
テキストエディタや統合開発環境は好きなもので良いとのことだったので、既にインストールしていたVScodeを使用しました。

**７：３３～**
HelloCakePHPController.phpのソースコードを解説しています。

![スクリーンショット 2023-04-04 142244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/eeece872-7a76-66ac-fe6b-0642be99a8ea.png)

「６行目まではおまじない」とのこと。
気になったので調べてみたところ、継承されたAppControllerの参照元を示していると思われます。
機会があれば説明してくれるとのことなので、期待して動画を進めましょう。

**８：２８～**
今回の動画で触れているCakePHPの規約（cookbook）を調べてみましたが、日本語表示しても難解ですし、そもそも対象の規約がどこに書いてあるか見当がつかない、、、
動画を進めてCakePHPに慣れてきたら再度読んでみようと思います。

**９：２２～**
setメソッドはCakePHPのメソッドであり、Viewにデータを渡すためのControllerの機能のようです。
基本的なメソッドのようなので押さえておきたいですね。

他にもPOST、GET、クロスサイトスクリプティングなども、なんとなく分かる程度の理解度だったので調べ直しました。



# ４．【第５回　データベースを作成してCakePHPを接続しよう！】
**４：３０～**
app.phpというのはCakePHPプロジェクトの設定ファイルのようですね。
動画内で触れられている箇所以外はデフォルトで大丈夫なようです。

**６：４０～**
ModelのEntityとTableについて説明がされていますが、９：３０～のまとめを見たほうが分かりやすいです。
リレーション、バリデーションなどの単語は調べ直しました。
![スクリーンショット 2023-04-05 090127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/735dc697-5bca-0088-cc0f-07710a033401.png)


# ５．終わりに
第１回～第３回の動画を視聴して環境構築をした後、PHPの基本構文の学習をしていました。某eラーニングサービスのPHP入門編を一通り済ませたのですが、予定よりだいぶ時間が掛かってしまいました。。。この動画に出てくるソースコードの雰囲気は掴めるようになったものの、まだ理解できない部分が多いです。
「学習を一周して戻ってみると分かるようになる」とよく聞きますので、今はとにかく先に進んでいこうと思います。
Enrich Change Events with Extra Fields


 + [Error: The selected field type, X18_Character_ID__c, isn't supported for event enrichment.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgjPq)

ロングテキストは対処外だと思うけど、納得していませんね。


Note

+ Only the TextArea field type is supported and not TextArea (Long), TextArea (Rich), or TextArea (Encrypted).
+ Compound fields, such as Name, Address, and Geolocation fields are supported for enriched fields. You can specify an entire compound field for enrichment but not the individual constituent fields. All non-empty constituent fields are returned as part of the compound field in the enriched change event. For example, you can enrich an event with the Lead Name field. The enriched change event contains the non-empty constituent fields as part of the Name field, including FirstName, MiddleName, LastName, and Suffix.
+ For a relationship field, you can select only the field as an enriched field. You can’t traverse the fields on the related object. The enriched change event contains the ID of the related record. For example, to enrich a contact change event with the ID of the related account, select the Account relationship field as the name of the enriched field for ContactChangeEvent, and not Account.Name. For custom relationship fields, specify the relationship field name with the __c suffix, such as RelField__c.
+ You can add up to 10 enriched fields in each channel member. A compound field counts as one field. This allocation is per channel member. For example, if you have a channel with two channel members, the channel can be enriched with 20 fields total, 10 for each channel member.


https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_enrich_intro.htm


数式フィールドも対象外なのはそうだろう。

Formula fields aren't supported for all change events, so that's why they're also not supported for formula fields. Here is the limitation for change data capture in https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_general_considerations.htm:

"No Formula Field Support
Formula fields aren’t supported in Change Data Capture. They aren’t included in change events that are delivered to CometD or Pub/Sub API clients. Formula fields are included in change events in Apex triggers, but they have a value of null regardless of whether they were changed. For information on which fields are included and excluded in a change event, see Change Event Fields."


For event enrichment, the list of field types supported can be found on this page:
https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_enrich_intro.htm