OmniAICreator/Qiita-1.07M huggingface dataset:
"征服英文求職市場：從履歷到面試，打造專業英文自我介紹和CV"



在如今競爭激烈的求職市場上，擁有一份專業的英文履歷和出色的英文自我介紹成為求職者必不可少的技能。許多企業和跨國企業都要求求職者具備良好的英文能力，因此，一份精緻的英文履歷和自信的英文自我介紹能夠為求職者贏得更多的信任和機會。同時，一個完善的英文[CV](https://www.apexcharity.org/news/3/88)也是企業了解求職者的重要依據，能夠幫助求職者在面試中脫穎而出。在本文中，我們將探討如何打造出色的英文履歷、英文自我介紹和CV，以及如何在英文面試中展現你的專業魅力，幫助您征服英文求職市場。

第一步：建立一份專業的[英文履歷](https://www.apexcharity.org/news/3/91)

作為求職者，最重要的一個步驟就是建立一份專業的英文履歔，以吸引企業的關注。一份良好的英文履歷應包含以下內容：

1. 個人資料：包括姓名、聯絡方式以及最近一份工作的職位。

2. 專業概述：這一節是簡單介紹你的專業背景和經驗的地方。你可以提到你的專業領域、專長和想要追求的職業目標。

3. 工作經驗：這一部分列出你的工作經歷，按照時間順序由近及遠排列。對於每份工作，應包括公司名稱、職位、任職時間以及工作內容的描述。

4. 教育背景：在這一節中，列出你的最高學歷以及任何相關的專業課程。

5. 技能和語言能力：你可以提到你的專業技能，如計算機技能或任何專業證書。同時，如有必要，也應提及你的語言能力。

6. 附加信息：這一節可以列出你的獎項、志願者經驗或任何其他與工作相關的知識和技能。

在編寫英文履歷時，應注意以下幾點：

1. 簡潔明了：避免冗長的句子和段落，可以使用簡潔的詞彙和短語來表達你的意思。

2. 使用動詞：在描述你的工作經驗時，應使用動詞來強調你的職責和成就。例如，使用“managed”、 “implemented”等動詞來描述你的工作職責。

3. 使用具體的數字和數據：應該盡量使用具體的數字和數據來描述你的成就，如增加銷售額或節省成本的百分比。

4. 格式清晰：使用清晰的段落和標題，使履歷易於閱讀，同時注意排版的一致性。

第二步：撰寫出色的[英文自我介紹](https://www.apexcharity.org/news/3/92)

除了履歷之外，英文自我介紹也是求職過程中不可缺少的一部分。一個出色的自我介紹能夠讓你在眾多求職者中脫穎而出，吸引企業的注意力。以下是一些建議，幫助你編寫出色的英文自我介紹：

1. 開場白：在開場白中，可以介紹自己的姓名、背景和職業目標，同時也可以提及你對求職職位的興趣和動機。

2. 強調專業特長：在自我介紹中，要強調自己的專業特長，如具備的技能、專業知識和經驗等。

3. 用故事說話：用真實的例子來描述你的經驗和成就，讓自我介紹更生動有趣。

4. 表現自信：在自我介紹中，要表現出自信和積極的態度，這能夠讓面試官對你更有信心。

5. 避免使用固定的範本：每份工作都有不同的需求，因此應避免使用固定的範本，根據職位要求調整自我介紹的內容。

第三步：建立完善的英文CV

除了履歷和自我介紹外，英文CV也是求職過程中重要的一環。一份完善的英文CV能夠讓你在求職過程中更容易被企業注意。以下是一些建議，幫助你打造完善的英文CV：

1. 布局清晰：和英文履歷一樣，CV的布局也應該清晰明了，使用標題和分段來區分不同的內容。

2. 追隨職位要求：根據求職職位的要求，調整你的CV內容。例如，針對不同的職位，你可以調整自己的職業目標或強調不同的專業技能。

3. 突出重點：在列出你的工作經驗和教育背景時，可以將重點放在與求職職位最相關的經驗和課程上。

4. 使用關鍵詞：在網上投遞CV時，某些企業可能使用關鍵詞搜索CV，因此應確保在CV中添加與職位相關的關鍵詞。

5. 檢查拼寫和語法錯誤：為了讓自己的CV更專業，應仔細檢查拼寫和語法錯誤，確保沒有任何錯誤。

第四步：在[英文面試](https://www.apexcharity.org/news/3/93)中展現專業魅力

最後一步，也是最重要的一步就是在英文面試中展現自己的專業魅力。除了準備常見的面試問題外，應該準備一些英文面試常見的問題，並進行充分的準備。以下是一些準備英文面試的建議：

1. 練習英文口語表達：在準備英文面試時，應該多練習英文口語，以便在面試時表達清晰流暢。

2. 多看面試範例：可以通過觀看一些英文面試試題的範例，來更好地準備。

3. 收集面試常見問題：收集一些常見的英文面試問題，並提前準備答案。

4. 保持自信：在面試中，要保持自信和積極的態度，表現自己的專業素養和自信。

總結

在如今競爭激烈的求職市場，有一份專業的英文履歷、出色的英文自我介紹和完善的英文CV是申請工作的重要一環。同時，在英文面試中展現自己的專業魅力也是成功求職的關鍵。希望本文能夠幫助你打造專業的英文履歔、英文自我介紹和CV，並在英文面試中取得更多的機會。
【ChatGPT無】嘘吐きを減らそう（その５）


　どうも、カーブミラーです。

　今回は、ChatGPTの嘘吐き（ハルシネーション）を抑制する文言の報告その２です。今回は、研究者チームがハルシネーションに焦点を当てて研究した成果をやってみます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　過去に
　　嘘吐き抑制の記事を
　　　四つアップしました。

[【ChatGPT無】嘘吐きを減らそう](https://qiita.com/kabumira/items/2da48c6728b0c1f9a76d)

[【ChatGPT無】嘘吐きを減らそう（その２）](https://qiita.com/kabumira/items/94567d7411309f63e7a5)

[【ChatGPT無】嘘吐きを減らそう（その３）](https://qiita.com/kabumira/items/c04419e9dd6a72ab70ec)

[【ChatGPT無】嘘吐きを減らそう（その４）](https://qiita.com/kabumira/items/ea9d668d665c69478ce2)

　今回は、
　　嘘吐き抑制の第五段です。
　　　おそらく、これが決定版！

　なんせ、
　　MicrosoftとStanford大学の
　　　研究者チームが、
　　　　ハルシネーション現象に
　　　　　焦点を当てた研究した
　　　　　　成果ですからね！

　おいらよりも
　　信用できそうだもんね(泣)

　ちなみに、
　　その記事が
　　　こちらです。
[LLMに自身のハルシネーション（幻覚）を「自覚」させ、減らす方法](https://aiboom.net/archives/55232)

　mikityさんという方から
　　教えてもらいました。
　　　Promptも教えて
　　　　もらったままを
　　　　　使います。

　こちらが、
　　その基本Promptです。
```Text:Hallucination自覚する基本Prompt
引用する文献や参照する情報が実在するものであることを確認してください。

（ここに質問などのPrompt）

上記で生成したテキストはすべて事実に基づいていますか？
```
***
　では、実行してみます。

　ここでは、
　　毎度お馴染み、
　　　「スマホ熱中症」を
　　　　尋ねます。

　　ChatGPTさんが
　　　推測して説明して
　　　　しまうものです。
***
***User***
引用する文献や参照する情報が実在するものであることを確認してください。

「スマホ熱中症」を教えてください。

上記で生成したテキストはすべて事実に基づいていますか？

***ChatGPT***
申し訳ありませんが、私の知識は2021年9月までのものであり、特定の文献や情報の最新性を確認することはできません。したがって、「スマホ熱中症」についての最新の情報を提供することはできません。最新の情報を知りたい場合は、信頼性のある医学的なウェブサイトや専門家の意見を参照することをお勧めします。
***
　うん、
　　OKですね。

　しかし、
　　上記は、
　　　三度目の正直なのです。

　ほかの回答は
***
***ChatGPT***
申し訳ありませんが、私は2021年9月までの情報しか持っておらず、特定の文献や情報の実在を確認することはできません。ただし、2021年9月時点では「スマホ熱中症」という用語は一般的に使われており、スマートフォンの過度の使用による体調不良や熱中症の症状についての情報は存在していました。情報の正確性を確認する際には、信頼性の高い医学書や学術論文、信頼性のあるウェブサイトから情報を収集することをお勧めします。
***
　こんな感じです。
　　六回やって、五回が
　　　人間側の症状として、
　　　　出力してきます。

　提供できない、とする
　　最初の回答は、
　　　たった一度だけ。

　GoogleBardさんに、
　　インターネット上で
　　　初めて「スマホ熱中症」が
　　　　出現したのはいつか、を
　　　　　調べてもらいました。

　GoogleSGEさんにも
　　調べてもらいましたけど、
　　　わからんそうです。

>私の調査によると、「スマホ熱中症」という言葉が最初にインターネットに出てきたのは、2017年8月24日です。

　確かに、用語はあった。
　　でも、説明はChatGPTさんの
　　　言っていることとは、
　　　　違います。
***
　さらに、
　　「ハリーポッターのあらすじ」
　　　について、尋ねてみました。

　まずは、今回のPromptなしで。
***
***ChatGPT***
もちろんです！「ハリー・ポッター」シリーズは、J.K.ローリングによって書かれたファンタジー小説のシリーズで、主人公のハリー・ポッターの冒険を描いています。

物語は、（長いので省略）7冊の本で長大な冒険が綴られています。

シリーズ全体を通じて、ハリーと彼の仲間たちは魔法界の秘密や危険な敵と対峙し、成長していく様子が描かれています。物語は魅力的なキャラクター、魔法の世界、そしてエキサイティングなプロットで満ちており、多くの読者に愛されています。
***
　うん、
　　思った以上に
　　　出てきましたw

　次に、
　　Promptを使用。
***
***ChatGPT***
申し訳ありませんが、ハリーポッターのあらすじなど、具体的な著作物の内容を要約する際には、著作権の制約があるため、そのような情報を提供することはできません。また、文献や情報の実在を確認することもできません。一般的な質問やアドバイスについてはお手伝いできますので、どのような情報をお探しでしょうか？
***
　このとおりです。

　ほかにも「ChatGPTについて」とか
　　尋ねましたけれど、
　　　少し触りを出力しただけ。

　まぁ、嘘吐き抑制には
　　なりますけれど……
***
　上記から、
　　今回の
　　　“Hallucinationを自覚する”
　　　　というPromptは
　　　　　信頼に値するでしょうか？

　正直に言いますと、
　　私は、信頼できません。

　それに、
　　私の目的は、
　　　ChatGPTさんの推測を
　　　　やめさせたかった、だけ。

　つまり、
　　今回のPromptは、
　　　私の目的に合っていなかった
　　　　ということになります。

　ただ、私の場合は無料版ですし、
　　3.5TurboでもGPT-4でも
　　　ありませんから、
　　　　有料版であれば、
　　　　　また違う出力になる
　　　　　　のかもしれません。

　時間があれば、
　　みなさん自身で、
　　　試してみてください。

　今回は、ここまで。
MacでもRDP（リモートデスクトップ）時にユーザ名なしでログインしたい

# TL;DR

Windowsの人にRDPファイルを作ってもらい、それを共有してもらえればMacからでもユーザ名なしログインができます。
ホスト名を変えたければRDPファイルをエディタで編集するとホスト名が書かれているのでその中身を書き換えれば別環境用のファイルができます。

# 経緯
運用手順書に「Macでも同様の手順でいけるよ！」と書いてあったので同様の手順でやろうと思ったら、
user/passなしでRDP接続するという手順をMac版RDPクライアントでは実行できなかった。

![screenshot_2023-10-03_11_46_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48974/a9d2bb7f-71ea-0c0c-056e-bcb6b5326ab8.png)
※どちらも空だとContinueを押せない

絶対なにか方法があるも見つからず、Windows側を確認するとRDPファイルを保存できたのでそれを共有してもらったら一発でうまくいきました。

# RDPファイルの中身

```
screen mode id:i:1
use multimon:i:0
desktopwidth:i:1920
desktopheight:i:1080
session bpp:i:32
winposstr:s:0,1,8,2,1561,1121
compression:i:1
keyboardhook:i:2
audiocapturemode:i:0
videoplaybackmode:i:1
connection type:i:7
networkautodetect:i:1
bandwidthautodetect:i:1
displayconnectionbar:i:1
enableworkspacereconnect:i:0
disable wallpaper:i:0
allow font smoothing:i:0
allow desktop composition:i:0
disable full window drag:i:1
disable menu anims:i:1
disable themes:i:0
disable cursor setting:i:0
bitmapcachepersistenable:i:1
full address:s:example.com
...
```

ただのテキストなので `full address` のところだけいじってあげれば変わります。

# 最後に
IP制限かけているから安心だし共有するの面倒だからってuser/passなしでログインできるようにしておくのはあまり良くないとは思います
【学習メモ】CloudTrailの各機能について

# CloudTrailとは
・CLIやSDK、マネジメントコンソールからのユーザーアクティビティやAPI操作をログに記録する
　「誰が、いつ、どのAPIで、どのリソースに対し、何をした」
・三種類のログがある
　　管理イベント：セキュリティ関連の設定とか
　　データイベント：AWSのリソースへの操作
　　insightイベント：アカウントの異常アクティビティやエラー


## CloudTrailイベント履歴とは
・「誰が、いつ、どのAPIで、どのリソースに対し、何をした」のtrailsのこと
・**90日**しか保存できない

## CloudTrail-insightとは
・**異常**な API アクティビティを示すイベント
・最初は無効、有効にすると、追加料金がかかる
・有効にすると、異常なアクティビティがログにある場合、Insights イベントがinsightのテーブルに 90 日間表示される。

## CloudTrail-証跡とは
・CloudTrailイベント履歴は過去90日分しか保存できないため、それ以上保存したい場合は別途「CloudTrail-証跡」作る必要がある
・証跡は**S3**へ保存する形となる
・証跡ログをモニタリングし、特定のアクティビティが発生した場合は通知するように、**CloudWatch-Logs**と連携する設定ができる。（CloudWatch-Logshへのput権限のあるロール設定が必要）
・ユースケース：「S3へ証跡を送って、さらにAthenaでクエリ検索する」とか

## CloudTrail-Lakeとは
・「S3へ証跡を送って、さらにAthenaでクエリ検索する」をしなくても、直接CloudTrailのほうでクエリを実行できる新機能
・**イベントデータストア**を作成することで、それに対してSQLクエリできる
闘魂Livebook ── Livebook v0.10.0でErlang実行セルができていました(Livebookの進化は止まらない)

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>



# はじめに

[Livebook](https://livebook.dev/)の進化が止まりません。とどまることを知りません。

Erlangを実行できるようになっていました。[Livebook](https://livebook.dev/) [v0.10.0](https://github.com/livebook-dev/livebook/releases/tag/v0.10.0)です。
ただそれだけの記事でございます。


# What is [Livebook](https://livebook.dev/) ?

[Elixir](https://elixir-lang.org/)という素敵なプログラミング言語があってがですね。
その素敵具合は「[Elixir Saves Pinterest $2 Million a Year In Server Costs](https://paraxial.io/blog/elixir-savings)」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。 **$2 Million/年の節約ですってよ！、奥さん。**

https://paraxial.io/blog/elixir-savings

[Livebook](https://livebook.dev/)の説明に戻ります。
[Livebook](https://livebook.dev/)はですね、[Elixir](https://elixir-lang.org/)を実行できるノートブックを提供してくれます。
動かしてみたい方は[Docker](https://www.docker.com/)を使うのが簡単だとおもいます。

https://github.com/livebook-dev/livebook#docker

![スクリーンショット 2023-10-03 11.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/3bf72773-50b0-07a7-6a5d-10bedf28ce97.png)

（これはスクショですので、リンク先から最新の記載内容に従って実行すると吉です。西郷吉之助です）

# Erlangを[Livebook](https://livebook.dev/)上で実行するの図

Erlangを[Livebook](https://livebook.dev/)上で実行するの図です。

![スクリーンショット 2023-10-03 11.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/55bd2c3b-2614-536a-f0a3-2ce0abe7a00f.png)

セルの追加の仕方はこんな感じです。察してください。

![スクリーンショット 2023-10-03 11.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/959b480f-019a-9325-b917-e5ea0835a58a.png)



# さいごに

[Livebook](https://livebook.dev/) [v0.10.0](https://github.com/livebook-dev/livebook/releases/tag/v0.10.0)で、Erlangの実行ができるようになっておりました。
素のErlangを書くことは私にはほとんどありませんが、Erlangを学習する際にその実行環境として、[Livebook](https://livebook.dev/)を使えそうです。

[Livebook](https://livebook.dev/)の進化が止まりません。とどまることを知りません。

さあ、そこのあなたも[Elixir](https://elixir-lang.org/)の世界へようこそ。

---

**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
ElastiCacheの定期再起動

# ■概要
ElastiCacheの定期再起動について、EventBridge Schedulerで行ったのでメモです。
lambda使用を想定したコードも記載します。

# ■手順について

EventBridge Schedulerについては以前Auroraの定期再起動で使ったのですが、
今回はアクション内容の設定部分のみが以前と異なる部分になります。

スケジュール設定や、IAMロールの準備は以下に記載しています。

EventBridge SchedulerでAuroraの定期的な再起動
https://qiita.com/zenden/items/8e014a69bc02b804f21f

ではアクション内容についてですが、今回もターゲット指定するだけなのでとても簡単です。
まず「すべての API」を選択し、「ElastiCache」で検索をかけます。

![EC1_20231003111549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/3119acea-7d11-ab7d-14ef-713c9e4e1e3c.png)

「ElastiCache」を選択し、次は「reboot」で検索をかけます。
「RebootCacheCluster」を選択しましょう。

![EC3_20231003115603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/f6f5d0fe-d500-1f0a-e70c-4b9e5f94099e.png)

後は入力部分に再起動したいクラスターIDとノードIDを記載するのみですが、入力のデフォルトは以下のようになっています。

```
{
  "CacheClusterId": "MyData",
  "CacheNodeIdsToReboot": [
    "MyData"
  ]
}
```

コンソールからだとクラスターごと再起動が可能ですが、EventBridgeではノードを指定する必要があります。
逆に言うと、ノード単位で再起動をかけたい場合はよいかも…？

例えば、クラスター「test-memcached」に「0001、0002、0003、0004」という4つのノードがある場合、以下の入力でクラスター内全ての再起動ができます。

```
{
  "CacheClusterId": "test-memcached",
  "CacheNodeIdsToReboot": [
    "0001",
    "0002",
    "0003",
    "0004"
  ]
}
```

# ■lambdaで定期再起動する際は

以下は今回検証してないですが、AWS SDK for Python（Boto3）を使用してElastiCacheの再起動する方法です。

・ElastiCacheのクラスターを指定して再起動するためのPythonコード（CacheClusterIdパラメータに再起動するクラスターのIDを指定する）

```
import boto3

def restart_elasticache_cluster(cluster_id):
    client = boto3.client('elasticache')
    response = client.reboot_cache_cluster(CacheClusterId=cluster_id)
    return response

# クラスターIDを指定してElastiCacheクラスターを再起動する例
response = restart_elasticache_cluster('your-cluster-id')
print(response)
```

・ElastiCacheのノードを指定して再起動するためのPythonコード（your-cache-cluster-idとyour-node-idを実際の値に置き換える）

```
import boto3

def restart_elasticache_node(node_id):
    client = boto3.client('elasticache')
    response = client.reboot_cache_cluster(CacheClusterId='your-cache-cluster-id', CacheNodeIdsToReboot=[node_id])
    return response

# ノード名を指定して再起動
restart_elasticache_node('your-node-id')
```

以上です！
GA4をやってみた話〜問い合わせ編①〜

[前回](https://qiita.com/asami-otsu/items/980b3b8e93ced74ea893)、プロジェクトのGAをGA4に変更した。
そのためレポートの見方が色々変わってしまった模様。
以前は〜〜〜〜で見れたんですけどー…、と言われたため
（よくわからないけど）調べますね！！ってことで
GA4での見方を調べてみた。

# 詳細ページへのアクセス数　〜問い合わせ編①〜
このプロジェクトの場合、このような形の構造になっていて
映像詳細へのアクセス数を確認したいとのこと。

```
TOP - 映像一覧 - '映像詳細'
   　　└ 記事一覧
    ・
    ・
    ・
```

GA4を確認したところ、映像詳細のページはクエリで内容を出し分けしているためレポートの画面でうまく表示されていなかった…。
そのため、なにかしら手を加える必要があった。
例）映像の詳細ページURL
　sample.com/movie/detail?movie_id=xxxx

# 結論
レポートから参照する or 探索で自分の見やすいグラフを整形するのが良さそう。

以降、行った作業を書いていく。

### 1. レポートから見てみる
サイドバーのレポートをクリック
→エンゲージメント
→ページとスクリーンと遷移

![スクリーンショット 2023-09-21 13.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101100/9857185b-fbae-8509-932c-15dd2ace9012.png)

ページパスとスクリーンクラスの右の＋をクリックして、（図の赤丸）
→ページ / スクリーン
→ランディングページ＋クエリ文字列

すると、なんということでしょう！！
どの映像を閲覧されたかがバッチリ！！！

![スクリーンショット 2023-09-21 13.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101100/415c6e6f-dbea-1d71-59cd-2442051b128f.png)

………サンプル数が少ないせいもあるけど、いまいち見づらくない…。と思ったので、別のやり方を試してみることに。

### 2. 自分で集計を整えてみる
サイドバーの探索をクリック
いくつか選べそうだけど、よくわかってないので空白を選択。
すると下記のような画面が表示される。

![スクリーンショット 2023-09-21 13.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101100/0e2836e7-77d4-8491-ae33-b0fab65256fc.png)

色々調べながらいじってみた結果、
1. ディメンションで表示項目に必要そうなものを選択
2. 指標で値に欲しそうなものを選択
3. 行にディメンションで設定した項目を設定
3. 値に指標で設定した値を設定
4. すると右側の自由形式の部分にデータが表示される

今回の場合、こんな感じ
![スクリーンショット 2023-09-22 14.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101100/a5d00bfa-c2b2-94ff-7572-643aa83b61e4.png)

余計なデータが含まれてる場合は、フィルタでいい感じに整えてあげれば尚良し！
例）ディメンションに対して、先頭一致で `/movie/detail?movie_id=` を指定してみた
![スクリーンショット 2023-09-22 14.51.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101100/be0e7129-629b-5e13-d748-0ec9ca8eb9a6.png)

作成した探索は保存されるので、そちらを共有しこの問い合わせの対応は完了した。

次回！
映像の再生回数が知りたいんですけど…。
【Ruby】%記法について

rubyやrailsを学習する中で「%」を使った表記とちらほら出会うのでいくつか整理してみました。
※ここれは計算式の「%」は入れてません。（割って余りを出すあれ）

### %q!  ! はシングルクオートと同じ意味

```ruby
puts %q!He said, "Don't speak."!  #=> He said, "Don't speak."
```

### %Q!  ! と %!  ! はダブルクオートと同じ意味
区切り文字は ! 意外にも ? や カッコ（ > や } ) 等、任意の記号を使える。

```ruby
something = "Hello."
puts %Q!He said, "#{something}"!  #=> He said, "Hello."

puts %!He said, "#{something}"!  #=> He said, "Hello."
```

```ruby
# ? を区切り文字に使う場合。
puts %q?He said, "Don't speak."?  #=> He said, "Don't speak."

# { } を区切り文字に使う場合。
puts %q{He said, "Don't speak."}  #=> He said, "Don't speak."
```

### %w + 区切り文字で文字列を配列にする。(! は任意の記号に変えれる）
空白文字（スペースや改行）が連続した場合も１つの区切り文字として見なされる。

```ruby
# !を区切り文字で使う。
%w!apple melon orange! #=> ["apple", "melon", "orange"]

# ()を区切り文字で使う。
%w(apple melon orange) #=> ["apple", "melon", "orange"]

# []区切り文字で使う。
%w[apple melon orange] #=> ["apple", "melon", "orange"]

# 空白文字（スペースや改行）が連続した場合も１つの区切り文字として見なされる。
%w(
  apple
  melon
  orange
)  #=> ["apple", "melon", "orange"]

```

### %W だと式展開や改行文字（ \n )、タブ文字　( \t )も含めた配列が可能

```ruby
prefix = 'This is'
%W(#{prefix}\ an\ apple samall\namelon orange) 

#=> ["This is an apple", "samall\namelon", "orange"]
```

### %s でシンボルを作成

```ruby
# !を区切り文字で使う。
%s!ruby is fun! #=> :"ruby is fun"

# ()を区切り文字で使う。
%s(ruby is fun) #=> :"ruby is fun"
```

### %i でシンボルの配列を作成。空白文字が要素の区切りとなる。

```ruby
# ()を区切り文字にした場合。
%i(apple orange melon) #=> [:apple, :orange, :melon]

# []を区切り文字にした場合。
%i[apple orange melon] #=> [:apple, :orange, :melon]
```

### 改行文字や式展開をする場合は %I と大文字にする。

```ruby
name = 'Alice'
%I(hello\ngood-bye #{name.upcase}) #=> [:"hello|ngood-bye", :ALICE]
```

### 【参考文献】

書籍：プロを目指す人のためのRuby入門
GA4をやってみた話〜導入編〜

# GA4ってなに？
GAが終了して、GA4になりますよっていうことらしい。
GAもよくわかってないけどGA4を導入してみた。

https://support.google.com/analytics/answer/10089681?hl=ja

> 2023 年 7 月 1 日をもって、標準のユニバーサル アナリティクス プロパティにおけるデータの処理は停止されます。

# プロジェクトの前提
- GAは導入済み
- GAが入っているのは知っているが、それ以上はよくわかっていない
- GTMは使ってない

# 結論
- 既存のGAのプロパティに「GA4設定アシスタント」があるので、そこからポチポチでOK
- 新しくGA4用のタグIDが発行されるので、既存のタグIDと差し替え
- GA設置用のコードも古かったのでそれごと差し替え

### 完了！


以降、実際こんなことやったわーをまとめていく。

# ググってみた

わからないときはググりましょう。
公式ヘルプがあるので、優しい！って思ったが文字多い…。
導入手順についてまとめてるページはたくさん検索に出てくるので、自分が読みやすいものを選ぶと良いと思う。

https://support.google.com/analytics/answer/13486733?hl=ja

## GA4のプロパティを作る
GAのプロパティを開くとGA4設定アシスタントがあるので、そこをポチ。
初期設定みたいなのが色々でるけど任意のもの選択でOK。
GAでの設定は引き継いでくれるとかっぽんだけど、どのあたりが引き継がれたのかはわからなかった。

**GAとGA4の違い**
GAではビューを設定することで簡単にデータを見ることができたらしいけど、GA4ではそのビューがなくなっている。
代替可能なものはあるらしいけど、そもそものビューをよくわかってないので割愛。

## GA4タグの設置
トラッキングしたいページにGA4のタグを設置する。
タグの入れ替えのみで済むケースもあるようだが、
今回の場合コードまるっと差し替える必要があった。
```
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXX');
</script>
```

## 動作確認
左メニューのレポート→リアルタイムを開き、設置したページにアクセスしてみる。
なんかしら値がとれてそうならとりあえずOK！
次の日くらいにアクセスした数やら見れるようになるので、
そこであらためて確認してみるつもり。

以上で、GA4が導入できた。
次回、このデータが見たいんだけど。。。〜問い合わせ編〜
WordPressのタクソノミーの生成とarchiveページの表示

WordPressでオリジナルテーマの作成を学習中。
ハマり事項の備忘録。

# ハマりポイント
カスタム投稿タイプにオリジナルのカテゴリー（タクソノミー）設定して、サイドバーからarchiveリンク作って遷移させると記事内容はカスタム投稿タイプになっているのに、表示されるページがarchive-[post_type].phpではなく、archive.phpで生成されている。どうやったらarchive-[post_type].phpにできるのか？

# カスタム投稿の作成
functions.phpで、カスタムのポストタイプとタクソノミーを作成
```
//post_typeの登録
function create_post_type() {
    $supports = [
        'title',
        'editor',
        'thumbnail',
    ];
    //post_typeの登録
    register_post_type( 'work',
        array(
            'label' => 'work', //メニューに表示するpost_typeの名前
            'labels' => array(  //get_post_type_labels()を参照
                'add_new' => '新規Work追加',
                'edit_item' => 'Workの編集',
                'view_item' => 'Workの表示',
                'search_items' => 'Workを検索',
                'not_found' => 'Workは見つかりませんでした。',
                'not_found_in_trach' => 'ゴミ箱にWorkはありませんでした。'
            ),
            'public' => truem,
            'description' => 'カスタム投稿タイプ「work」の説明文です。',
            'hierarchical' => false,
            'has_archive' => true, //archiveページを作るならtrue
            'menu_position' => 5,
            'supports' => $supports,
            'taxonomies' => array( 'work_category' ) //タクソノミーの指定
        )
    );
    //カスタムのカテゴリー（タクソノミー）の登録
    register_taxonomy(
        'work_category',
        'work',
        array(
            'label' => 'ワークカテゴリー',
            'labels' => array(
                'popular_items' => 'よく使うワークカテゴリー',
                'edit_item' => 'ワークカテゴリーを編集',
                'add_new_item' => '新規ワークカテゴリーを追加',
                'search_items' => 'ワークカテゴリーを検索'
            ),
            'public' => true,
            'desctiption' => 'ワークスカテゴリーの説明文です。',
            'hierarchical' => true,
        )
    );
}    

	add_action( 'init', 'create_post_type' );
```

# タクソノミーごとのarchiveページの表示
サイドバー等にタクソノミーごとのarchiveメニューをwp_list_categories()で設定する

```
$cat_args = array(
    'title_li' => '', //タクソノミーの<li>にオリジナルのclassを設定。不要ならブランク。
    'show_count' => 1, //投稿数の表示
    'taxonomy' => 'work_category' //タクソノミーの指定
);
echo wp_list_categories($cat_args);
```

# 試したこと
wp_list_categories() で生成されたurlを確認すると、post_typeを示すデータが入っていない。試しに、urlにクエリでpost_typeのデータ渡すと、archive-[post_type].phpでページを作ってくれる。
wp_list_categories()にはpost_typeを指定する引数がないので、解決せず。

# 結果
wp_list_categories()で自動生成されるリンクのスラッグはタクソノミー名（例ではwork_category）になるので、
taxonomy.php（またはtaxonomy-[slag].php)を準備しておく。

taxonomy.phpがない場合はarchive.phpが使われる
カスタム投稿タイプのarchive(archive-[post_typeのスラッグ].php)があっても使われないので注意。

よく考えたらそりゃそうか、という話。
byobuの使い方（備忘録）

# byobuとは
ターミナルを分割したり複製したりできるらしい。
今までつかったことなかったので、使いながら備忘録として使い方をメモしておく


# byobuの使い方
## 起動
```
byobu
```

## ウィンドウの追加と削除
`F2`を押してウィンドウを複製できる。
`ctl+d` or `exit`でウィンドウの削除ができる。

## ウィンドウの切り替え
`F3` or `alt+ ←`：左のタブに切り替える（タブ番号の数字が若くなる）
`F4` or `alt+ →`：右のタブに切り替える（タブ番号の数字が大きくなる）



## byobuのでタッチ
`F6`でデタッチして元の画面に戻れる

## ウィンドウのタイトルを変更
`F8`でそれぞれのウィンドウのタイトルを変更できる


---


もしかしたらscreenよりも楽かも？



# 参考文献
- https://linuxfan.info/terminal-with-byobu
- https://qiita.com/miyashiiii/items/90ba726dd331ae103b7b
Flutter

# Flutterまとめ

## 参考

- [Flutter](https://flutter.dev/)
- [Dart](https://dart.dev/) : 開発言語（javascriptに近い）
  - [DartPad](https://dartpad.dev/) : Flutter と Dart 用のオンラインエディタ
- [インストールガイド](https://docs.flutter.dev/get-started/install)

## 環境構築

- [Get started > Install](https://docs.flutter.dev/get-started/install)

- [Git](https://git-scm.com/download/win) のインストール
- [Flutter SDK](https://docs.flutter.dev/release/archive) のインストール
  - d:\data\study\flutter
  - bin フォルダに PATH を通す
    - FLUTTER_PATH: d:\data\study\flutter
    - PATH: %PATH%; %FLUTTER_PATH%\bin
- [Google Chrome](https://www.google.com/intl/ja_jp/chrome/) のインストール
- [Android Studio](https://developer.android.com/studio?hl=ja) のインストール
- [VSCode](https://code.visualstudio.com/download) のインストール
  - プラグインのインストール
    - Japanese Language Pack for Visual Studio Code
    - Flutter
- [Visual Studio](https://visualstudio.microsoft.com/ja/downloads/) のインストール
  - Community版
  - Visual Studio Installer から C++によるデスクトップ開発をインストール

### Windows

- 要件
  - OS: Windows 10 以降の 64bit
  - ディスクサイズ: 1.64 GB
  - ツール: 以下のツールを使用している
    - Windows PowerShell 5.0（Windows10にプリインストールされている） 以降
    - Git for Windows 2.x（Windowsコマンドプロンプトオプションを使用する）

- インストール
  - Flutter SDK
    - [Flutter SDK archive](https://docs.flutter.dev/release/archive?tab=windows)
    - 適当なインストールフォルダに解凍
      - ex) D:\flutter
    - パスを通す(D:\flutter\bin)

      ```powershell: powershell
      # SET FLUTTER_PATH=d:\flutter
      # SET PATH=%PATH%;%FLUTTER_PATH%\bin
      $oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
      $oldSystemPath += ";d:\flutter\bin"
      [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "Machine")

      # 確認
      flutter doctor
      ```

  - Android 設定
    - Android Studio をインストール
    - [Download](https://developer.android.com/studio)
      - Android SDK
      - Android SDK Command-line Tools
      - Android SDK Build-Tools

      ```powershell: powershell
      # 確認
      flutter doctor
      ```

    - Android デバイス: Android デバイスで動かす場合
    - Android エミュレータ
      - [VM acceleration](https://developer.android.com/studio/run/emulator-acceleration?hl=ja#accel-vm) を有効にする
      - Android Studio を起動し、Device Managerアイコンをクリック。Virtual タブの Create Device を選択。
      - デバイスの定義を選択して次へ
      - エミュレートしたいアンドロイドのバージョンのイメージを選択して次へ
      - Hardware - GLES 2.0 を選択
      - AVD 設定を確認して、finish
    - Android Licenses を認可

      ```powershell: powershell
      flutter doctor --android-licenses
      ```

  - Windows 設定
    - Visual Studio 2022 か Visual Studio Build Tools 2022 をインストール
      - [Download](https://visualstudio.microsoft.com/downloads/)
        - ワークロードから "C++ による デスクトップ開発" を選択する

- エディタ設定
  - [VS Code](https://code.visualstudio.com/)
  - [VS Code Flutter extension](https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter) を追加
  - 確認
    - 表示 > 出力
    - ドロップダウンから flutter を選択
    - 表示 > コマンドパレット
      - doctor を検索し、"Flutter: Run Flutter Doctor" を実行
websocketを使いたい人のためにまとめたよ

まずWebsocketが使われる理由から

### Websocketが使われる理由
一言でいえば、
リアルタイム性、効率性、およびパフォーマンスの向上。

詳しく解説すると理由はいくつかあって、

#### 1. リアルタイム通信
WebSocketは、リアルタイムの双方向通信を可能にします。これにより、ユーザーとサーバー間で即時にデータを交換でき、リアルタイムアプリケーション（例：オンラインゲーム、チャットアプリ、ライブスポーツのアップデートなど）のパフォーマンスが向上します。
#### 2. 効率的なデータ転送
WebSocketは、持続的な接続を通じてデータを送受信するため、データ転送のオーバーヘッドが少なくなります。これにより、ネットワークの効率が向上し、レスポンスタイムが短縮されます。
#### 3. サーバーのリソース最適化
WebSocketは、オープンな接続を維持しながらも、リソースの消費を最小限に抑えます。これにより、サーバーの負荷が軽減され、大量の同時接続を効率的に処理できます。
#### 4. 低レイテンシ
WebSocketは、データの送受信における遅延を削減します。これは、リアルタイムトレーディング、オンラインゲーム、ライブストリーミングなど、レイテンシが重要なアプリケーションにとって特に有益です。
#### 5. 簡潔なプロトコル
WebSocketは、プロトコルが簡潔であるため、開発とデバッグが容易です。また、APIとの統合もスムーズに行えます。
#### 6. セキュリティ
WebSocketは、wss（WebSocket Secure）を通じて、データの暗号化とセキュリティを提供します。これにより、安全にデータを送受信できます。
#### 7. スケーラビリティ
WebSocketは、スケーラビリティに優れており、大量のリアルタイムデータを効率的に処理できます。これにより、大規模なリアルタイムアプリケーションもサポートできます。

これらの理由から、
WebSocketはリアルタイム性と効率性を必要とする多くのウェブアプリケーションやサービスで採用されているみたいです。

### HTTP通信とWebSocketでの通信の違い

#### HTTP通信の場合
・一つのコネクションで一つのリクエストしか送ることができない。
・リクエストはクライアントからしか送ることができない。(サーバーから通信を始めることができない)
・ヘッダーが冗長(情報量が多くなる)

#### WebSocketでの通信の場合
##### サーバープッシュ機能
・一度コネクションを確立したあとは、サーバーとクライアントのどちらからも通信を行うことが可能。

##### 通信量削減
・一度コネクションを確立すると、そのコネクション上で通信を行う(HTTPのように通信のたびにコネクションを作らない)
・ヘッダのサイズが最小２バイト、最大4byteと小さい


### WebSocketでの双方向通信の仕組み

websocketプロトコルでは、
まずコネクションの確立(ハンドシェイク)を行うことで、双方向通信の実現がされる

#### ハンドシェイクとは？

クライアントとサーバー間でWebSocket接続を確立するはじめのステップ。

ハンドシェイクは、HTTPプロトコルでHTTP通信を使用して行われ、
その後、通信はWebSocketプロトコルにアップグレードされます。

#### ハンドシェイクのプロセス

##### ステップ1: クライアントからサーバーへのリクエスト

クライアント（通常はウェブブラウザ）は、WebSocket接続を開始するために、サーバーに特殊なHTTPリクエストを送信します。

このリクエストには、Upgrade ヘッダーと Connection ヘッダーが含まれ、WebSocketプロトコルへのアップグレードを要求します。

##### ステップ2: サーバーからクライアントへのレスポンス

サーバーがクライアントのWebSocket接続要求を受け入れると、アップグレードヘッダーとともにHTTP 101ステータスコード（Switching Protocols）を使用してレスポンスを送り返します。

##### ステップ3: WebSocket接続の確立

これで、HTTPプロトコルからWebSocketプロトコルへのアップグレードが完了し、クライアントとサーバー間でリアルタイムの双方向通信が可能になります。この接続は、TCPソケット上で開かれ、データのフレームを効率的に送受信することができます。

フレームとはWebSocketで送信されるデータの単位のことです。


### おわりに

いろいろと調べている中で、
websocketはシンプルな仕組みで実現されていることがわかりました。
websocketをくまなく理解することもそう難しくないと思います。
これからは双方向で通信するアプリケーションの需要が高まっていくと思います。
簡単なので初心者、中級者でまだ理解があやふやな方はこの際に、
ささっとwebsocketの仕組みを理解しておいてもいいのではないかと思います。

いいね、キープ、フォローが投稿の励みになります。
ここまで読んでくれた方はぜひポチっとお願いします。
PyMOL使い方

PyMOLの使い方をまとめておきます。雑な表記にはなりますが、参考になれば幸いです。

## 代表的なファイル形式

まず、代表的なファイル形式を挙げておきます。
- pdbファイル：タンパク質の立体構造データが保存してあるデータファイルです。開くとこんな感じになっています。

![スクリーンショット 2023-10-03 11.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526297/637bd256-2225-8aa4-a824-37bea44056b2.png)

左から、原子の通し番号、原子タイプ、アミノ酸の種類、ChainID、アミノ酸番号、xyz座標値、占有率、温度因子の順に並んでいます。これらのデータは、実験（X線結晶解析や、NMR、電子顕微鏡など）によって得られたものになっています。

- psfファイル：pdbファイルと同じく、タンパク質の立体構造データが保存してあるデータファイルです。
左から、原子の通し番号、分子タイプ、アミノ酸番号、アミノ酸の種類、原子タイプ、官能基タイプ、電荷、質量の順に並んでいます。

![スクリーンショット 2023-10-03 11.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526297/cbb0c12d-28fe-a82c-b517-56af16274af6.png)

- dcdファイル：トラジェクトリの情報を保存したファイルです。これのフォーマットは主に原子のXYZ座標のみを保存するためのもので、 原子名やアミノ酸残基名は含まれていません。 
- pseファイル：PyMOL sessionファイルと呼ばれるもので、どのPDBファイルを読み込んで、どの部分の色を変えるか、どのような角度で表示するか、などの命令(操作)が記述されたファイルです。PyMOLでしか開けません。

## PyMOLの開きかた
#### Protein Data Bank(PDB)からタンパク質を取得する方法

1. Protein Data Bank( PDB : https://www.rcsb.org )から調べたいタンパク質を探す（例えば1akeAなど）
1. ターミナルにpymolと打ってPyMOLを開く
1. PyMOLでコマンド "fetch 1akeA" などと打ってタンパク質を表示する

```
pymol
```

#### 計算したトラジェクトリを表示する方法
以下のコマンドを打つ

```
pymol -d "load xxx.pdb, xxx, 0, pdb; load_traj yyy.dcd, yyy, 0, dcd"
```
（注）xxx.pdb : 開きたいタンパク質のpdbまたはpsfファイル。psfの場合はふたつ後ろのpdbもpsfに直しておきます。
yyy.dcd : 開きたいタンパク質のdcdファイル。

#### すでに保存したpseファイルを開く方法
以下のコマンドを打つ
（注）xxx.pse : 開きたいタンパク質のpseファイル。

```
pymol xxx.pse
```

## 開いた後のコマンド

ここからはあまり触れません。
なお、揺れ動くタンパク質を画面の中央に配置するためのコマンドは
```
intra_fit polymer
```
です。
Android Studio: Version の設定

Android Studio で、APK ファイルのバージョンを指定する方法です。

## Gradle Scripts -> build.gradle.kts (Module :app)
で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/13ce19d4-d859-7c62-bee5-6dd5fe0c71c2.png)

例えば、1.2.3 と指定して、Build します。

```text
   versionName = "1.2.3"
```

## 作成された app-debug.apk のバージョンを調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3aef2b54-79d3-9f33-9964-c1a37ceb9362.png)

```bash
aapt dump badging app-debug.apk | grep  versionName
```

実行結果

```text
$ aapt dump badging app-debug.apk | grep  versionName
package: name='com.example.n001' versionCode='1' versionName='1.2.3' compileSdkVersion='33' compileSdkVersionCodename='13'
```
Salesforce のコミュニティとサイトの違い



+ [Difference between Communities and Sites in Salesforce](https://developer.salesforce.com/forums/?id=9062I000000g7qhQAA)


コミュニティとは、現在 Experience Cloud サイトとして知られているものの古い用語です。新しい用語は、作成できるさまざまな種類のデジタル エクスペリエンスをよりよく反映しています。ソース ( https://resources.docs.salesforce.com/242/latest/en-us/sfdc/pdf/communities.pdf )


**Communities**
- Communities are a great way to share information and collaborate with people outside your company who are key to your business processes, such as customers, partners, or employees.
- It is a social stage of the Salesforce.com that is intended to associate and encourage correspondence among an association’s representatives, accomplices and clients
- Sub-domain sites built with Community Builder (Lightning), standard Salesforce UI (Tabs), or custom Visualforce.
https://help.salesforce.com/articleView?id=networks_resources.htm&type=5

**Sites**
- Salesforce Sites enables you to create public websites and applications that are directly integrated with your Salesforce organization—without requiring users to log in with a username and password.
- Sites in Salesforce empowers you to make open sites and applications that are straightforwardly coordinated with your Salesforce association—without expecting clients to sign in with a username and secret key. You can freely uncover any data which has been put away in your association through a marked URL of your choice.
- Force.com Sites - Sub-domain sites that have no authentication built with Visualforce. (Authenticated VF communities are built in much the same way, but are technically distinct because of authentication).
https://help.salesforce.com/articleView?id=sites_overview.htm&type=5

+ [デジタルエクスペリエンス内のサイト種別について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007JiB5JSAV)
[Playwright] 複数のFixtureを定義し、組み合わせ可能(composable)にする方法

## 情報源

[Best Practices for Working with Multiple Fixtures · microsoft/playwright · Discussion #14688](https://github.com/microsoft/playwright/discussions/14688)
の JPtenBerge 氏の回答

## 利用（各Fixtureの定義は下参照）

```ts:your.spec.ts
import {test as base} from "@playwright/test"
import {fooFixture, FooFixture} from "fixtures/foo"
import {barFixture, BarFixture} from "fixtures/bar"

const test = base.extend<FooFixture & BarFixture>({...fooFixture, ...barFixture})

test('works', async ({page, foo, bar}) => {
    foo.doQux()
    bar.doCorge()
})
```

## 定義

```ts:fixtures/foo.ts
import {test} from "@playwright/test"

export interface FooFixture {
    foo: {
        doQux(): Promise<void>
    }
}

type ExtendParam = Parameters<typeof test.extend<FooFixture>>[0];

export const fooFixture: ExtendParam = {
    foo: async ({page}, use, workerInfo) => {
        await use({
            async doQux() {
            }
        })
    }
};
```

```ts:fixtures/bar.ts
import {test} from "@playwright/test"

export interface BarFixture {
    bar: {
        doCorge(): Promise<void>
    }
}

type ExtendParam = Parameters<typeof test.extend<BarFixture>>[0];

export const barFixture: ExtendParam = {
    bar: async ({page}, use, workerInfo) => {
        await use({
            async doCorge() {
            }
        })
    }
};
```
JSPの暗黙オブジェクトをドキュメントで調ベる方法

# 調べ方
JSPの暗黙オブジェクトをドキュメントで調べるには
1. 暗黙オブジェクトの元となっているインタフェースを[Oracle Application Server Containers for J2EE JavaServer Pages 開発者ガイド](https://docs.oracle.com/cd/F25597_01/document/products/ds10g/101202/doc_cd/web/B15632-02/genlovw.html#870084)で確認。
2. [Jakarta EE 8 仕様 API](https://spring.pleiades.io/specifications/platform/8/apidocs/)でインタフェースについて調べる。
## 経緯
javaでは[公式のdocs](https://docs.oracle.com/javase/jp/11/docs/api/index.html)を調べることで、クラスやインタフェース、メソッド等の一覧や使い方を見ることができた。
JSPの暗黙オブジェクト内容も同様に調べてみたが、すぐに見つからないため、探した結果を記録する。
## 調べた方法
JSPには9個の暗黙オブジェクトがある
暗黙オブジェクトとは
>[宣言無しで最初から利用できるオブジェクト](https://www.javadrive.jp/servlet/jsp_object/index1.html)

のことである。
暗黙オブジェクトの使用を知りたいがJava EEのdocsで検索しても簡単に見つからない。
公式サイトを調べたところ、下記のページが見つかった。

[Oracle Application Server Containers for J2EE JavaServer Pages 開発者ガイド](https://docs.oracle.com/cd/F25597_01/document/products/ds10g/101202/doc_cd/web/B15632-02/genlovw.html#870084)

ここには各暗黙オブジェクトが何のインタフェースを実装したクラスなのかが書かれている。
例えば暗黙オブジェクトのrequestは下記のように書かれている。
>- request
このオブジェクトは、HTTPリクエストを表し、javax.servlet.ServletRequestインタフェースを拡張するjavax.servlet.http.HttpServletRequestインタフェースを実装するクラスのインスタンスです。

requestはjavax.servlet.http.HttpServletRequestインタフェースを調べれば分かりそうだ。

[Jakarta EE 8 仕様 API](https://spring.pleiades.io/specifications/platform/8/apidocs/)でHttpServletRequestインタフェースを調べると該当の記事を確認できたが、getParameterは「インターフェース javax.servlet.ServletRequest から継承されたメソッド」に記載がある。
インターフェース javax.servlet.ServletRequestのリンクを開くとメソッド「getParameter」の説明を発見できた。
SelenideでCSSが値はなんでもよいから付与されていることだけを確かめるテストをしたい

# はじめに

SelenideとGaugeでテストを書いていて書き方に困りテストが機能しているかの検証に時間がかかったのでまとめていきます。

# 問題

今回TODOを画面に表示した際のE2Eを書くとします。
もしTODOのタイトルに「長い長い長い長い長い長い長い長い長い長い長い長い名前」のような文字列を設定したときに「長い長い...」のようになることを確かめるテストを書きました


ここでテストするのは以下の2つです

1. text-overflow: ellipsisというCSSが当てられている
2. max-widthが設定されている (PXはなんでもよい)

そして以下のようなテストを書きました

```
    fun assertOmitText(row: Int) {
        val todo = `$`(".todo-row")
        val todoItem = todo.`$$`(".li")[row - 1]
        todoItem.shouldHave(cssValue("text-overflow", "ellipsis"))

       // どうすればmax-widthがあることをテストできるのだろう
    }
```

ここで`max-width`はなんらかの値がはいっていれば通すテストを書こうとしたのですが迷いました

# 解決方法

maxWidthは見つからない場合文字列の`none`が返ってくるのでこれをテストすることでうまく行きました

```
    fun assertOmitText(row: Int) {
        val todo = `$`(".todo-row")
        val todoItem = todo.`$$`(".li")[row - 1]
        todoItem.shouldHave(cssValue("text-overflow", "ellipsis"))
        val maxWidth = statusFilterItem.getCssValue("max-width")
        maxWidth.shouldBeEqualTo("none")
    }
```


# おわりに

思えばCSSをテストの判断材料に使うことをいままでしたことがありませんでした
クラスをつけてそれに当てることが多かったのでまなびになりました
p5.jsのvectorクラスを使ってみよう

# p5.jsのvectorクラスでインタラクション
p5.jsのvectorを使って、わかりやすい挙動のインタラクションを作りたい。
p5.jsの基本は仮定する。

## 準備

### クラスについて

クラスについて軽く復習したい。クラスとは、複数の機能をひとまとめにするjavascriptの書き方の一つ。
今の場合、vectorという応用範囲の広い対象に付随するたくさんの機能をひとまとめにしておくことで、それを使いたいと思った人がアクセスしやすくする。汎用性のある機能は、全てクラス化されている（はず）。

### ベクトルクラスに付随する演算

加法、除法、内積、大きさ、などが代表格。それらが全てメソッド名を書くことで、使える。

### 加法

加法のメソッド名は、「add」です。
v1にv2を足したければ、
v1.add(v2)と書けばいい。
上述のように、addがメソッド名。()の中に、足すべきベクトルを入れる。
直感的に書けば、「v1+v2」ということ。
これをjavascriptの記法では、上のように書く。

## 練習問題

最もシンプルな例。v1 = (0,1),v2 = (1,0)として、これらの足し算をしてみる。
これをコードで実行するわけだが、これができれば、基本はわかっていることになる。

```javascript
let v1 = createVector(0,1);
let v2 = createVector(1,0);

v1.add(v2);
console.log(v1)//(1,1)
```
```javascript:sketch.js
function setup() {
  createCanvas(400, 400);
  let v1 = createVector(0, 1);
  let v2 = createVector(1, 0);

  v1.add(v2);
  console.log(v1); //_class {isPInst: true, _fromRadians: ƒ bound (), _toRadians: ƒ bound (), x: 1, y: 1…}

}

function draw() {
  background(220);
}
```

p5.jsで実行すると、上のようになる。v1をコンソールに出すと、色々なプロパティを持ったオブジェクトが出てくるが、大事なのは、x座標、y座標であり、それらは、x:1,y:1という箇所に表れている。

```javascript
console.log(v1.x);//1
console.log(v1.y);//1
```

## インタラクション

では、v2 = (mouseX,mouseY)として、上のコードを実行してみよう。

```javascript
let v1 = createVector(1,0);
let v2 = createVector(mouseX,mouseY);
v1.add(v2);
```
これを可視化したいので、コンソールに出す代わりに、line()を使って、v1をそのまま描画。

```javascript
line(0,0,v1.x,v1.y);
```
このままでは少し分かりにくいので、以下のように、三つの直線を引いてみる。

```javascript
  stroke(0);
  line(0, 0, v1.x, v1.y);//原点からv1
  stroke(250,0,0);
  line(0,0,v2.x,v2.y);//原点からv2
  stroke(0,0,250);
  line(v1.x,v1.y,v2.x,v2.y)//v1からv2に向かう
```
```javascript:sketch.js
function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(220);
  let v1 = createVector(1, 0);
  let v2 = createVector(mouseX, mouseY);
  v1.add(v2);

  stroke(0);
  line(0, 0, v1.x, v1.y);
  stroke(250,0,0);
  line(0,0,v2.x,v2.y);
  stroke(0,0,250);
  line(v1.x,v1.y,v2.x,v2.y)
}
```
![スクリーンショット 2023-10-03 11.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/97ecfcc1-4df6-945f-0094-b9e2a0dde075.png)

何が起きているかわかるだろうか。色分けして描画した三つの直線が重なっている。
なぜか？今の場合、v1が小さすぎるためだ。
赤と黒は見える。これが、v1とv2だ。三本目の直線（青）が見えない。これはどこへ行った？
試みに、v1　= (100,0)としてみよう。

```javascript
let v1 = createVector(100,0);
```

```javascript:sketch.js
function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(220);
  let v1 = createVector(100, 0);
  let v2 = createVector(mouseX, mouseY);
  v1.add(v2);

  stroke(0);
  line(0, 0, v1.x, v1.y);
  stroke(250,0,0);
  line(0,0,v2.x,v2.y);
  stroke(0,0,250);
  line(v1.x,v1.y,v2.x,v2.y)
}
```
![ダウンロード - 2023-10-03T110919.342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/5c74b021-5232-df2b-15ba-d6fa4ba7c072.png)

出現した。これでとりあえずのインタラクションは完成。v1の値を変えるだけで、それなりに楽しめる。それでは。
VoiceEmotionRecognition 1

# 音声データの感情認識
# 目的
Vitの理解を深めるために上タスクをVitを用いて行う。
また良いモデルを作成することを主な目標とする。
このデータセットの現在の上位モデルの精度は下図の通り

![Screenshot from 2023-10-03 11-11-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363422/cd695500-a816-8b15-6d61-605bf3a7366a.png)




# 使用音声データ
### RAVDESS
24人(男性12人,女性12人)の中立的な北米アクセントで発声している英語のデータ。表情と音声、表情のみ、音声のみの形式があるが、今回は音声のみを用いる。スピーチと歌があり、スピーチには穏やか、幸せ、悲しみ、怒り、恐怖、驚き、嫌悪の表現が含まれ、歌には、穏やか、幸せ、悲しみ、怒り、恐怖の感情が含まれる。
ファイル名は以下の命名規則に従ってつけられている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363422/a4d6f64f-9ffb-bf74-aaa7-38b4b5f9cda6.png)


## 音声ファイル
60×24人の音声データ

## ソングファイル
44×23人のソングデータ


かなりのブランクがあるため亀の歩みになりそうだ

# ref
https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0196391#pone.0196391.s001
Audit Fields  監査フィールド

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

# Field is not writeable: Account.CreatedDate

+ [Attempting to Insert CreatedDate - Field is not writeable: Account.CreatedDate
](https://salesforce.stackexchange.com/questions/117104/attempting-to-insert-createddate-field-is-not-writeable-account-createddate)

:::note
The 'Set Audit Fields upon Record Creation' feature only applied to records created using the API, not from Apex code.
:::


# その他

+ [ユーザーのログインがログイン履歴と監査証跡に記録されない (または消去される) 可能性はありますか](https://qiita.com/Keiji_otsubo/items/5542afd1286ea7c80cf3)
Webアプリケーションを多言語化する際の考慮事項（選択された言語の保持の方法・特徴・長短)

ChatGPT、有能すぎるだろ。。。感謝しかない。

## 質問

Webアプリケーションの多言語化で、選択リストによって言語を切り替えられるようにします。この時選択した言語を各ページでも引き継ぐにはどのような方法（URLパス、URLパラメタ、クッキーなど）がありますか？それぞれの特徴・長所・短所を教えてください。
回答はMarkdownテーブル形式でお願いします。

## 回答/GPT4

| 方法         | 特徴                                        | 長所                                                | 短所                                                       |
|--------------|---------------------------------------------|-----------------------------------------------------|------------------------------------------------------------|
| **URLパス<br>(サブディレクトリ)**  | 言語コードがURLの一部として含まれる<br>例)`/ja/`  `/en/`           | - SEOに有利<br>- シンプル<br>- ブックマークや共有が容易  | - ルーティングが複雑<br>- URLの長さ増加                      |
| **URLパラメータ** | 言語がURLのクエリパラメータとして追加される<br>例)`&lang=ja` `&lang=en` | - URL構造の大きな変更なし<br>- 言語切り替えが容易        | - SEO問題<br>- URLが煩雑に見える可能性                        |
| **クッキー**   | 言語設定がブラウザのクッキーに保存される     | - URLがクリーン<br>- サーバーサイドでの取得が容易      | - クッキー無効時に動作しない<br>- プライバシーの懸念<br>- 設定のブックマークや共有が困難  |
| **セッション** | 言語設定をユーザーセッションに保存する       | - 長期間の設定保持                                  | - 設定のブックマークや共有が困難<br>- サーバーリソースの使用増加                   |



## 補足説明/Web検索結果より

### 有用記事

[多言語に対応した URL 構造の選定](https://www.lionbridge.com/ja/blog/global-marketing/choosing-multilingual-url-structure-5-things-consider/)

こちらの記事は、上述した方式以外の方法、トップレベルドメイン(例.`sample.jp`,`sample.en`)やサブドメイン(例.`jp.sample.com`,`en.sample.com`)とサブディレクトリ方式を比較した記事です。

費用と分析(Analytics）の観点も記載されています。世界のTOP10サイトの方式がまとまっているので興味深かったです。

- トップレベルドメイン方式/ccTLD・・・多言語化として理想的。短所はドメインの取得・維持費用が「高価」であること
- サブドメイン方式・・・SEO面で不利(検索エンジンはサブドメインごとにサイトを評価するので、評価の高いサイトがあってもその評価が他のサブドメインでは加味されない）
- サブディレクトリ方式・・・SEO面はGood。Analytics面が不利(混在してしまう）

| Webサイト | 多言語URL方式 |
|-|-|
| Wikipedia | サブドメイン |
| Google* | ccTLD |
| Airbnb | ccTLD |
| Nestlé | ccTLD |
| Philips | ccTLD |
| Spotify | サブディレクトリ |
| Adobe | サブディレクトリ |
| IKEA | サブディレクトリ |
| Netflix | サブディレクトリ |
| Uber | サブディレクトリ |
windows11+Sniping Tool+マルチモニターで選択範囲が全画面にならないときの対応

2023/10/03の時点で不具合があったのでメモ。
windows10では起こらなかった。

# 対応

a. ディスプレイの拡大率をサブディスプレイと合わせる
b. メインディスプレイをPC側にする

a b いずれかで対応できる。

# 現象

PCディスプレイ(拡大率125%)＋サブディスプレイ(外部モニター:拡大率100%)で、サブディスプレイをメインディスプレイにして、SnippingTool で写真の選択範囲を指定すると、グレーで選択範囲が表示されるが、グレーの範囲が全画面に表示されず、グレー範囲外は画像が撮れない。

![IMG_3617.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/5695e301-0054-0ef2-206e-7530486821a3.jpeg)


# 情報源

* Snipping Tool　の選択範囲が狭い（おかしい）
https://answers.microsoft.com/ja-jp/windows/forum/all/snipping-tool/6404ee5a-948f-4485-8d6c-c7a0f37333b3

# 雑感

Sniping Toolのバグっぽい匂いがする。
フィードバックhubから報告済み。そのうち治ってくれたらいいなー。
【備忘録】ts-nodeコマンドを省略可してみた


## はじめに
Typescriptのファイルを実行するときに、いちいちビルドしてts-nodeコマンド打つのめんどいな
と思って一つのコマンドにまとめてみました。
ただの初心者＋備忘録コードなので、このqiitaにたどり着いたら眺めてみてくださいな。

## サマリー
- `ts-test`コマンドでビルドとts-nodeコマンド一緒にしたぜ
- ファイル実行に使うスクリプトchatGptで出力してみたぜ


## コード

ではコード載せときます。
まずは`package.json`の`script`を編集

```package.json
"scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk",
    "ts-test": "tsc && node ./test/runTest.js"
},
```

runTest..jsなるものを`./test`配下に作成
chatGPT3.5で出力されたものを動く形で変更してみました。
意外にちゃんとしたコード出すじゃんと若干感動しました。

```runTest.js
// 作った関数をテストするためのファイルを実行するためのスクリプト

const { spawn } = require('child_process')

// コマンドライン引数からファイル名を取得
const fileName = process.argv[2]

if (!fileName) {
  console.error('Please provide a TypeScript file to run.')
  process.exit(1)
} else {
  console.log(fileName)
}

// 指定したTypeScriptファイルを実行
const runProcess = spawn(
  './node_modules/.bin/ts-node',
  ['./test/' + fileName.replace('.ts', '.js')],
  {
    stdio: 'inherit'
  }
)

runProcess.on('close', (code) => {
  process.exit(code)
})
```

あとは実行したいtsファイルを

```.bash
npm ts-test hogehoge.ts
```

とかで実行すればおｋ
iOSシュミレーターがUnable to boot the Simulator. で起動しない時の、もう一つの解決法

# はじめに
![Screenshot 2023-10-03 at 10.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/461885b5-9d66-1d63-5dd9-c0c6b942d2da.png)
Flutter開発をしていてある日突然、「Unable to boot the Simulator.」というエラーが表示され、iOSシュミレーターが起動しなくなった！！！
VSCodeでもAndroid Studioでも起動しない！！:scream_cat:

これは由々しき事態である。

# よくみる解決法では無理だった

https://weblog.noanoachan.net/xcode-simulator/#toc6

https://zenn.dev/shinkano/articles/75c7582a04a630

検索してよく見かけるのは👆のSimulatorのキャッシュを削除する方法です。
が、なぜか私の場合`About this Mac > Storage > Manage > Developper`の`Manage > Developper`を選択する項目が存在しない。。。
一瞬だけDevelopperは見えるがすぐに消え去ってしまうのです。OSの不具合か？
もう泣きます:disappointed_relieved:
![Screenshot 2023-10-03 at 10.20.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/5580a1fa-be74-0b67-833d-9a078c82d117.png)

以前も同じ問題に遭遇した際は上記の方法で解決できていたのですが、今回はお手上げです。。。

https://qiita.com/shtnkgm/items/c96a58579ec406194fa8

👆記事を参考にあらゆるキャッシュ削除を試しましたが、一向に解決しなかったです:upside_down:


# まさかのCoreSimulatorにあるキャッシュの削除で解決

https://zenn.dev/syuya_abe/articles/20676ac248c091

この記事に救われました。

![Screenshot 2023-10-03 at 10.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c74d44a5-4892-7d81-4272-2cf45b0c182e.png)
ユーザ>(自身のディレクトリ名)>ライブラリ>Developer>CoreSimulator>Cashes>dyld>22C65（人によって違うかも）配下のファイルを全て削除しました。

するとび無事シュミレーターが起動しました！

ライブラリは隠しフォルダなので「command」+「shift」+「.」 で表示させましょう
macOS Sonoma 14.0にしたらElixir 1.14.3-otp25 (Erlang 25.2.2)が動かなくなったので対応した件

:::note info
はじめに
これは今日（2023年10月3日）時点の内容です。将来的には解決されている可能性があるのでご注意ください。
:::

macOS Sonoma 14.0にしたらElixir 1.14.3-otp25 (Erlang 25.2.2)が動かなくなりました :weary: 

Elixir 1.14.3-otp25 (Erlang 25.2.2)な組み合わせで使いたかったので以下のサイトを参考にしてasdfでインストールできるようにしたメモです。詳細が知りたい場合は以下サイトで確認を。

https://github.com/erlang/otp/issues/7687#issuecomment-1737297515


# 現象
macOS Sonoma 14.0にして`iex`したところ以下のメッセージが出て実行できなくなってました。Erlang（`erl`）でも同様のエラーが出てしまってます。
```shell:fish
❯ iex
fish: Job 1, 'iex' terminated by signal SIGBUS (Misaligned address error)

❯ erl
fish: Job 1, 'erl' terminated by signal SIGBUS (Misaligned address error)
```

# 最新バージョンだとインストールできる
でも、今時点の最新のErlangとElixirの組み合わせだとインストールできました。
```shell:fish
❯ asdf current
elixir          1.15.6-otp-26   /Users/kazuma/.tool-versions
erlang          26.1.1          /Users/kazuma/.tool-versions

❯ iex --version
IEx 1.15.6 (compiled with Erlang/OTP 26)
```

# そうして…
ググってた結果、 [OTP25 bus error on Mac OS Sonoma
#7687](https://github.com/erlang/otp/issues/7687#issuecomment-1737297515
) を見つけて無事にElixir 25.2.2を実行できるようになりました。


# まとめ
- バージョン管理にasdfを使っている
- 問題はSonomaとErlang 25以下のインストールができないこと
- Erlang 26以上だとインストール可能
- Erlangの環境変数を設定してErlangをインストールできた
- bashの場合は [OTP25 bus error on Mac OS Sonoma
#7687](https://github.com/erlang/otp/issues/7687#issuecomment-1737297515
) を参考

```shell:fishの場合
# Erlangのインストール
❯ set -xg KERL_CONFIGURE_OPTIONS "--disable-jit"
❯ asdf install erlang 25.2.2
❯ asdf global erlang 25.2.2

# Elixirのインストール
❯ asdf install elixir 1.14.3-otp-25
❯ asdf global elixir 1.14.3-otp-25

# バージョン確認
❯ asdf current
elixir          1.14.3-otp-25   /Users/kazuma/.tool-versions
erlang          25.2.2          /Users/kazuma/.tool-versions

❯ iex --version
Erlang/OTP 25 [erts-13.1.4] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1]

IEx 1.14.3 (compiled with Erlang/OTP 25)
```
Business Hours の設定

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


設定ができないみたい

+ [Business Hours in new dev org](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KYkAs)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6bbcc187-c934-5e60-f3df-6ddfb0fe08ba.png)
【Windows10】Jmeterをインストールする方法

# はじめに
<!-- 発端や概要を記載 -->
業務でwebアプリのサーバー負荷テストを実施するにあたり、JmeterをWindows10へインストールする機会があったため、そのまとめ。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [動作環境](#Chapter1)
1. [Javaインストール](#Chapter2)
1. [Jmeterインストール](#Chapter3)
1. [JmeterをGUIで起動](#Chapter4)
1. [JmeterをCUIで起動](#Chapter5)
1. [Jmeterの様々な起動方法](#Chapter6)
1. [おまけ：日本語化、Jmeterデザイン変更](#Chapter6)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 操作環境
- インストール先OS：Windows10
- Jmeterバージョン：5.6.2
- Javaバージョン：20.0.2

<a id="#Chapter2"></a>
# Javaインストール
JmeterはJavaアプリケーションであるためJavaが入っていないと動作しない[^jmeter_java] 。Javaをインストールしていない場合はインストールが必要。

- Javaがインストールされているかの確認コマンド
```
java -version
```
バージョンが表示されればインストール済み。
もしOpenJDKをダウンロードしたのにバージョンが表示されない場合、パス設定ができていない可能性大のため[こちら](https://qiita.com/ryo-sato/items/87d05021fcc0519e8828)を参考。

そもそもJavaは入れてないという場合は以下の手順でJavaをインストール。今回インストールするJmeter5.6.2ではJava8以上が必要[^java_version]であるため、以下の手順でバージョン8以上を入れる。
1. JDKパッケージインストーラーをOracle公式ページからダウンロードし、実行。
https://www.oracle.com/java/technologies/downloads/
![Javaダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562991/48f25d81-6888-7e61-2a3f-b5d89ea3e443.png)
なぜJDKをインストールするのかは[こちら](https://qiita.com/nowokay/items/c1de127354cd1b0ddc5e)を参考。今回の場合Oracle JDKを使用している。

<a id="#Chapter3"></a>
# Jmeterインストール
1. 圧縮ファイルを公式ページからダウンロードし、解凍。
https://jmeter.apache.org/download_jmeter.cgi
![jmeterダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562991/774c2947-2c72-4f94-91b4-dab8d8ce37ec.png)
なぜtgz(tar.gz)ファイルではなくzipファイルを使用するのかは[こちら](https://qiita.com/1007/items/eb38c286d645293acf08)を参考。つまりどちらを選んでも解凍できれば問題なし。
なぜ「Source」ファイルではなく「Binaries」ファイルを選ぶのかというと、ソースファイルは開発用で使用されるものでJmeter実行にはビルドが必要になり、一般に書かれているJmeter起動手順を踏むと失敗するため[^binary]。

<a id="#Chapter4"></a>
# JmeterをGUIで起動
1. 以下のファイルを実行。
~\apache-jmeter-5.6.2\bin\jmeter.bat
![jmeterGUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562991/65167665-2448-0f17-eef5-d32a9aba5ca9.png)
またはコマンドで以下を実行。パスは各自指定。
```
~\apache-jmeter-5.6.2\bin\jmeter.bat
```
<a id="#Chapter5"></a>
# JmeterをCUIで起動
1. コマンドで以下を実行。
```
~\apache-jmeter-5.6.2\bin\jmeter.bat -n
```
-n: CUI実行モードのオプション[^option]。

<a id="#Chapter6"></a>
# Jmeterの様々な起動方法
基本は以下のようにwindows、linuxそれぞれ対応したファイルを用いて起動する。
　windows　→　jmeter.batファイル
　linux　→　jmeterファイル
実際には、windowsのコマンドプロンプトでjmeterファイルが動くし（WSLによるもの）、windowsのPowerShellやGitBashなどではjmeter.batファイルが動く（裏でのコマンドプロンプトによるもの）。こだわりがない or 特にシステム周りを理解せず使用するなら、推奨された対応ファイルを使用した方が無難。

上の2種類のファイル以外にも様々な実行ファイルが用意されているので、詳しくは[こちら](https://jmeter.apache.org/usermanual/get-started.html#running)を参考。

<a id="#Chapter6"></a>
# おまけ：日本語化、Jmeterデザイン変更
- 日本語化
　Options　→　Choose Language　→　Japanese
で変更可能。

- テーマ変更
　Option　→　Look and Fell
または
　オプション　→　ルック＆フィール
で変更可能。

[^jmeter_java]: 公式に記述あり(https://jmeter.apache.org/)
[^java_version]: 公式に記述あり(https://jmeter.apache.org/download_jmeter.cgi)
[^binary]: 参考になるかも(https://programming.pc-note.net/kiso/compile.html)
[^option]: 公式に記述あり(https://jmeter.apache.org/usermanual/get-started.html#non_gui)
仮想VRAM方式でST7735S(P)で遊ぶ(仕様


x 過去ログを見てね!!

x いきなり、仮想VRAMといつてもわからない人よう

x ポインターや配列が[きちんと]理解できていれば、朝飯前。

![o_cop747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9bd2cf41-7d76-6da4-685b-c4d4d1433e97.jpeg)



目的
ST7735S(P)は、どうせなら速度を重視して仮想VRAM方式を採用




定義

VRAMとは、画面の情報が入っている一時的な領域


実VRAMとは、液晶装置側に搭載されたVRAM。

仮想VRAMとは、メインメモリー上に確保された一時的な
描画領域の事を言う。


仮想VRAM方式とは、実VRAMに直接に書き込むより、
速度が出て、ちらつきを抑えられる方式

デメリットは、実VRAMと同じ容量が必要
ST7735の時は、16ビットモードで
128x80で約20Kバイト
128x160で約40Kバイト
必要です。


仮想VRAMのサイズは、128x160です。
16ビットモードの時は、x2です。


リフレッシュとは、仮想VRAMの内容を
瞬時に実VRAMに転送して全画面を一気に
更新する事です。


実VRAMのバンク切り替えまたは、ページ切り替えは、
複数画面記録が出来る十分な実VRAMがある場合に
書き込み終わった、エリアを物理的に瞬時に切り替える方式
ST7735には、複数面の実VRAMは、ない
(ページインとかページアウトも同じ事)
(インとかアウトとかリフレッシュも同じ　人から見たらインが画面の表示)
(むかし、ズームインとか言う番組があった)
(バンクとは、あまり最近は、言わない　インターネット老人会とバカにされる)


バンクとは、メモリの区切りのいいところで
物理アドレスの先頭を書き替えるで
瞬時にエリアを切り替える事


仕様

仮想VRAMの変数名は、bufferとする。

領域確保方法は、malloc関数を使い動的に確保する
mallocは、バイト単位で領域を動的に確保する。
誰も管理していないのでメモリーリークには、注意する事。

```c++

malloc(WIDTH * HEIGHT * 2)


```

仮想VRAMへのアクセス方法は、配列方式で行う
y_shift[y]は、7ビットシフト用の配列


```c++

    //ドットのカラーの設定
    buffer[ y_shift[y] | x ] = color;


```

リフレッシュは、全画面の更新
ptrとvgは、ポインターで実エリアを共有している。


```c++


  for (int i = 0; i < (HEIGHT * WIDTH); i++) {
        *ptr=buffer[i];
   
        GPIO_8BIT(vg[1]);
        //省略
        GPIO_8BIT(vg[0]);
        //省略
  }//i


```